亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? promise.cpp

?? 這是運(yùn)行在windows ce 4.2 版本下的關(guān)于硬盤(pán)加載的驅(qū)動(dòng)程序
?? CPP
字號(hào):
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//

//
//
#include "atamain.h"
#include "atapipci.h"
#include "promise.h"
#include <giisr.h>
#include <ceddk.h>

void CPromise::DumpAllRegs(DWORD dwZone)
{
    DEBUGMSG( dwZone, (L"The status is %02x\r\n", GetAltStatus()));
    DEBUGMSG( dwZone, (L"The reason is %02x\r\n", GetReason()));
    DEBUGMSG( dwZone, (L"The error is  %02x\r\n", GetError()));
    DEBUGMSG( dwZone, (L"The system control register is %08x\r\n", ReadSystemCtrlReg()));
    DEBUGMSG( dwZone, (L"The UDMA register is %02x\r\n", ReadUDMAReg()));
    DEBUGMSG( dwZone, (L"The Mode control register is %02X\r\n", ReadModeCtrlReg()));
    DEBUGMSG( dwZone, (L"The subsystem register is %02X\r\n", ReadSubSystemReg()));
}

DWORD InterruptThread(LPVOID lParam)
{
    CPort *pPort = (CPort *)lParam;
    HANDLE hEvent;
    BOOL bStatus;
    if (pPort->m_pDisk[0]) {
        hEvent = ((CPromise *)(pPort->m_pDisk[0]))->m_hEvent;
    } else {
        hEvent = ((CPromise *)(pPort->m_pDisk[1]))->m_hEvent;
    }
    while(TRUE) {
        WaitForSingleObject( pPort->m_hIRQEvent, INFINITE);
        bStatus = ATA_READ_BYTE((LPBYTE)(pPort->m_dwRegBase+ATA_REG_STATUS));
        if (pPort->m_pDisk[0]) {
            ((CPromise *)pPort->m_pDisk[0])->m_bStatus = bStatus;
        }
        if (pPort->m_pDisk[1]) {
            ((CPromise *)pPort->m_pDisk[1])->m_bStatus = bStatus;
        }
        SetEvent( hEvent);
        InterruptDone(pPort->m_dwSysIntr);
    }    
    return 0;
}

BOOL CPromise::WaitForInterrupt(DWORD dwTimeOut) 
{
    BOOL fRet = TRUE;
    DWORD dwRet;
    dwRet = WaitForSingleObject( m_hEvent, dwTimeOut);
    if (dwRet == WAIT_TIMEOUT) {
        fRet = FALSE;
    } else
    if (dwRet != WAIT_OBJECT_0) {
        if (!WaitForDisc( WAIT_TYPE_DRQ,  dwTimeOut, 10)) {
            fRet = FALSE;
        }   
    }
    
    if (m_bStatus & ATA_STATUS_ERROR) {
        m_bStatus = GetError();
        fRet = FALSE;
    }    

    return fRet;
}

BOOL CPromise::Init(HKEY hActiveKey)
{
    BOOL bRet = CPCIDisk::Init(hActiveKey);
    if (!IsAtapiDevice()) {
       WriteAtapiTransferReg(0);
       SetTransferMode(0x20);
    }  
    GetBaseStatus();
    if (!AtaGetRegistryValue(m_hDevKey, L"DMADelay0",&m_dwDelay)) {
        m_dwDelay = 0;
    }   
    return bRet;
}

//--------------------------------------------------------------------------
BOOL CPromise::ConfigPort()
{
    extern CPort      *g_PortTable;
    BOOL bRet = TRUE;
    CPort *pPort = &g_PortTable[m_dwDeviceId>>1];
    if (pPort->m_hIRQEvent) {
        bRet = CPCIDisk::ConfigPort();
        if (pPort->m_pDisk[0]) {
            m_hEvent = ((CPromise *)(pPort->m_pDisk[0]))->m_hEvent;
        }   
        pPort->m_pDisk[1] = (HANDLE)this;
    } else {
        bRet = CPCIDisk::ConfigPort();
        // Install ISR handler
        if (bRet) {
            m_hEvent = CreateEvent( NULL, FALSE, FALSE, NULL);
            pPort->m_pDisk[0] = (HANDLE)this;
            TCHAR *szISRDll;
            TCHAR *szISRHandler;
            if (AtaGetRegistryString(m_hDevKey, L"IsrDll", &szISRDll) &&  AtaGetRegistryString(m_hDevKey, L"IsrHandler", &szISRHandler)) {
                m_hIsr = LoadIntChainHandler(szISRDll, szISRHandler, (BYTE)m_pPort->m_dwIrq);
                DEBUGMSG( ZONE_INIT, (L"PROMISE: ConfigPort - Loaded ISR Handler\r\n"));
                if (!m_hIsr) {
                    DEBUGMSG(ZONE_ERROR, (L"PROMISE: Couldn't install ISR handler\r\n"));
                    bRet = FALSE;
                } else {
                    GIISR_INFO Info;
                
                    // Set up ISR handler
                    Info.SysIntr = m_pPort->m_dwSysIntr;
                    Info.CheckPort = TRUE;
                    Info.PortIsIO = TRUE;
                    Info.UseMaskReg = FALSE;
                    Info.PortAddr = pPort->m_dwBMRStatic+PROMISE_SYSTEM_CTRL;
                    Info.PortSize = sizeof(DWORD);
                    Info.Mask = 0x400;
                    if (!KernelLibIoControl(m_hIsr, IOCTL_GIISR_INFO, &Info, sizeof(Info), NULL, 0, NULL)) {
                        DEBUGMSG(ZONE_ERROR, (L"PROMISE: KernelLibIoControl call failed.\r\n"));
                        bRet = FALSE;
                    } else {
                        DEBUGMSG( ZONE_INIT, (L"PROMISE: ConfigPort - Installed ISR Handler\r\n"));
                    }   
                }
            }  
            DWORD dwThreadId;
            HANDLE hThread;
            DWORD dwThreadPri;
            hThread = ::CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)InterruptThread, pPort, 0, &dwThreadId);
            if (AtaGetRegistryValue (m_hDevKey, L"IstPriority256", &dwThreadPri))
                ::CeSetThreadPriority (hThread, dwThreadPri);
            CloseHandle(hThread);
        }    
    }
    return bRet;
}   

#if 0
//--------------------------------------------------------------------------
BOOL CPromise::SetupDMA( PSG_BUF pSgBuf, DWORD dwSgCount, BOOL fRead)
{
    BOOL bRet =  CPCIDisk::SetupDMA( pSgBuf, dwSgCount, fRead);
    return bRet;
}
//--------------------------------------------------------------------------
BOOL CPromise::BeginDMA(BOOL fRead)
{
    BOOL bRet = CPCIDisk::BeginDMA(fRead);
    return bRet;
}
//--------------------------------------------------------------------------
BOOL CPromise::EndDMA()
{
    BOOL bRet = CPCIDisk::EndDMA();
    return bRet;
}
//--------------------------------------------------------------------------
BOOL CPromise::AbortDMA()
{
    BOOL bRet = CPCIDisk::AbortDMA();
    return bRet;
}
//--------------------------------------------------------------------------
BOOL CPromise::CompleteDMA(PSG_BUF pSgBuf, DWORD dwSgCount, BOOL fRead)
{
    BOOL bRet = CPCIDisk::CompleteDMA(pSgBuf, dwSgCount, fRead);
    return bRet;
}
#endif

DWORD CPromise::ReadCdRomDMA(DWORD dwLBAAddr, DWORD dwTransferLength, WORD wSectorSize, DWORD dwSgCount, SGX_BUF *pSgBuf)
{
    ATAPI_COMMAND_PACKET    CmdPkt;
    DWORD                   dwError=ERROR_SUCCESS;
    DWORD               dwSectorsToTransfer;
    SG_BUF              CurBuffer[MAX_SG_BUF];
    DWORD                   dwValue = 0;
    WORD                    wCount;

    if (m_fInterruptSupported)
        GetBaseStatus();
//      WaitForInterrupt(0);

    WaitForDisc(WAIT_TYPE_NOT_BUSY, 50);
    WaitForDisc(WAIT_TYPE_NOT_DRQ, 50);
    if (ERROR_SUCCESS != WaitForDisc( WAIT_TYPE_NOT_BUSY, 1000)) {
        DumpAllRegs(1);
    }
    if (ERROR_SUCCESS != WaitForDisc( WAIT_TYPE_NOT_DRQ, 1000)) {
        DumpAllRegs(1);
    }
    
    DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:ReadCdRomDMA Address=%ld TransferLen=%02X SectorSize=%ld SgCount=%02X\r\n"), dwLBAAddr, dwTransferLength, wSectorSize, dwSgCount));

    DWORD dwStartBufferNum = 0, dwEndBufferNum = 0, dwEndBufferOffset = 0;
    DWORD dwNumSectors = dwTransferLength;
    DWORD dwStartSector = dwLBAAddr;

    // Process the SG buffers in blocks of MAX_CD_SECT_PER_COMMAND.  Each DMA request will have a new SG_BUF array 
    // which will be a subset of the original request, and may start/stop in the middle of the original buffer.
    while (dwNumSectors) {

        dwSectorsToTransfer = (dwNumSectors > MAX_CD_SECT_PER_COMMAND) ? MAX_CD_SECT_PER_COMMAND : dwNumSectors;
    
        DWORD dwBufferLeft = dwSectorsToTransfer * wSectorSize;
        DWORD dwNumSg = 0;

        while (dwBufferLeft) {
            DWORD dwCurBufferLen = pSgBuf[dwEndBufferNum].sb_len - dwEndBufferOffset;

            if (dwBufferLeft < dwCurBufferLen) {
                // The buffer left for this block is less than the current SG buffer length
                CurBuffer[dwEndBufferNum - dwStartBufferNum].sb_buf = pSgBuf[dwEndBufferNum].sb_buf + dwEndBufferOffset;
                CurBuffer[dwEndBufferNum - dwStartBufferNum].sb_len = dwBufferLeft;
                dwEndBufferOffset += dwBufferLeft;
                dwBufferLeft = 0;
            } else {
                // The buffer left for this block is greater than or equal to the current SG buffer length.  Move on to the next SG buffer.
                CurBuffer[dwEndBufferNum - dwStartBufferNum].sb_buf = pSgBuf[dwEndBufferNum].sb_buf + dwEndBufferOffset;
                CurBuffer[dwEndBufferNum - dwStartBufferNum].sb_len = dwCurBufferLen;
                dwEndBufferOffset = 0;
                dwEndBufferNum++;
                dwBufferLeft -= dwCurBufferLen;
            }    
            dwNumSg++;
        }
     
        if (!SetupDMA(CurBuffer, dwNumSg, TRUE)) {
            dwError = ERROR_READ_FAULT;
            goto ExitFailure;
        }    


        SetupCdRomRead( wSectorSize == CDROM_RAW_SECTOR_SIZE ? TRUE : FALSE, dwStartSector, dwSectorsToTransfer, &CmdPkt);

        wCount = (SHORT)((dwSectorsToTransfer * wSectorSize) >> 1);

        if (AtapiSendCommand(&CmdPkt, wCount, IsDMASupported())) {
            if (m_dwDelay) {
                StallExecution(m_dwDelay);
            }   
            if (ERROR_SUCCESS != WaitForDisc( WAIT_TYPE_READY, 5000, 100)) {
                DEBUGMSG( ZONE_IO, (L"WaitforDisc before WriteTransferReg failed\r\n"));
                WriteAtapiTransferReg(0);
                dwError = ERROR_GEN_FAILURE;
                goto ExitFailure;
            }   
            if (GetAltStatus() & ATA_STATUS_ERROR) {
                dwError = ERROR_GEN_FAILURE;
                goto ExitFailure;
            }   
            WriteAtapiTransferReg(0);
            dwValue = ReadAtapiTransferReg();
            WriteAtapiTransferReg((1 << 24) | wCount);
            if (ERROR_SUCCESS != WaitForDisc( WAIT_TYPE_READY, 5000, 100)) {
                DEBUGMSG( ZONE_IO, (L"WaitforDisc before DMAStart failed\r\n"));
                WriteAtapiTransferReg(0);
                dwError = ERROR_READ_FAULT;
                goto ExitFailure;
            }   
            BeginDMA(TRUE);
            if (m_fInterruptSupported) {
                if (!WaitForInterrupt(DISK_IO_TIME_OUT)) {  
                    DEBUGMSG( ZONE_IO, (TEXT("ATAPI:ReadCdRom- WaitforInterrupt failed (DevId %x) \r\n"),m_dwDeviceId));
                    WriteAtapiTransferReg(0);
                    dwError = ERROR_READ_FAULT;
                    goto ExitFailure;
                }
                WaitForDisc(WAIT_TYPE_NOT_BUSY, 5000, 100);
            }    
            WriteAtapiTransferReg(0);
            if (EndDMA()) {
                WaitOnBusy(FALSE);
                CompleteDMA( (PSG_BUF)pSgBuf, dwSgCount, TRUE);
            } else {
                dwError = ERROR_READ_FAULT;
                goto ExitFailure;
            }    
        }


        dwStartSector += dwSectorsToTransfer;
        dwStartBufferNum = dwEndBufferNum;
        dwNumSectors -= dwSectorsToTransfer;        
    }    


ExitFailure:
    if (dwError != ERROR_SUCCESS) {
        AbortDMA();
    }    
    return dwError;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91亚洲永久精品| 色综合久久久久久久久久久| 中文字幕在线观看一区二区| 在线播放欧美女士性生活| 国产成人午夜99999| 午夜伦欧美伦电影理论片| 国产日韩精品久久久| 欧美高清一级片在线| 成人一区二区视频| 美女在线视频一区| 一区二区三区四区蜜桃| 久久久高清一区二区三区| 欧美日韩一区二区欧美激情| 成a人片国产精品| 激情综合网天天干| 丝袜美腿亚洲综合| 亚洲精品成人少妇| 国产精品乱子久久久久| 久久在线观看免费| 日韩一区二区三区电影| 欧美性大战久久久久久久蜜臀| 国产成人一区在线| 激情文学综合丁香| 日韩福利电影在线观看| 麻豆视频观看网址久久| 亚洲成人福利片| 夜夜揉揉日日人人青青一国产精品| 国产欧美综合在线观看第十页| 日韩欧美国产综合一区| 欧美日韩激情一区二区| 在线视频国内自拍亚洲视频| 97aⅴ精品视频一二三区| 粉嫩嫩av羞羞动漫久久久| 黄色成人免费在线| 国内外成人在线| 久久精品国产亚洲aⅴ| 日韩av高清在线观看| 午夜伊人狠狠久久| 水蜜桃久久夜色精品一区的特点| 亚洲激情图片小说视频| 亚洲精品一二三区| 一区二区欧美在线观看| 亚洲综合偷拍欧美一区色| 亚洲免费高清视频在线| 一区二区国产盗摄色噜噜| 亚洲精品自拍动漫在线| 亚洲精品欧美在线| 亚洲午夜免费福利视频| 午夜精品免费在线观看| 天堂久久一区二区三区| 蜜桃av一区二区三区| 美美哒免费高清在线观看视频一区二区| 五月天亚洲婷婷| 老汉av免费一区二区三区| 九一九一国产精品| 国产a精品视频| 99久久精品国产一区| 在线观看av一区| 7777女厕盗摄久久久| 欧美成人午夜电影| 国产欧美日韩激情| 一区二区视频在线看| 午夜亚洲福利老司机| 九九**精品视频免费播放| 国产很黄免费观看久久| 99re成人精品视频| 欧美日韩一区 二区 三区 久久精品| 欧美精选午夜久久久乱码6080| 日韩一级二级三级| 国产三级欧美三级| 亚洲自拍都市欧美小说| 蜜臀精品久久久久久蜜臀| 国产精品自拍av| 精品福利av导航| 亚洲欧洲日韩综合一区二区| 亚洲一区二区在线播放相泽 | 亚洲美女在线一区| 无吗不卡中文字幕| 国产成人免费9x9x人网站视频| 色呦呦日韩精品| 日韩三级.com| 亚洲视频香蕉人妖| 免费的成人av| 91麻豆国产香蕉久久精品| 欧美另类久久久品| 欧美国产欧美综合| 亚洲成年人影院| 成人永久免费视频| 91精品国产91久久久久久一区二区| 久久精品视频一区| 亚洲午夜电影在线观看| 国产91丝袜在线18| 7799精品视频| 亚洲色图制服诱惑| 国产在线观看一区二区| 欧美丝袜丝nylons| 国产精品乱子久久久久| 蜜桃av噜噜一区二区三区小说| 91视频.com| 久久久久久久久免费| 视频一区视频二区中文| av资源网一区| 精品处破学生在线二十三| 亚洲福利一区二区三区| 成人国产精品免费观看视频| 日韩欧美中文字幕制服| 亚洲一区二区三区美女| 成人免费不卡视频| 精品99999| 日韩av二区在线播放| 91福利在线免费观看| 中文字幕欧美日韩一区| 激情久久五月天| 欧美久久一二区| 亚洲最大成人综合| av中文字幕一区| 久久久www成人免费毛片麻豆 | 懂色av噜噜一区二区三区av| 日韩视频国产视频| 天天影视网天天综合色在线播放| 91丨国产丨九色丨pron| 欧美激情在线看| 国产精品一区2区| 欧美变态tickle挠乳网站| 秋霞电影网一区二区| 欧美日韩1区2区| 亚洲国产成人高清精品| 在线日韩一区二区| 亚洲美女淫视频| 在线看不卡av| 一区二区三区在线观看网站| 色综合中文字幕国产 | 99久久久国产精品免费蜜臀| 26uuu国产一区二区三区| 免费一区二区视频| 日韩一区二区三区视频在线观看| 天堂成人免费av电影一区| 欧美精品久久99久久在免费线| 亚洲成人中文在线| 欧美午夜片在线观看| 亚洲国产精品人人做人人爽| 精品视频在线看| 丝袜脚交一区二区| 91麻豆精品国产91久久久久久| 日韩电影在线看| 欧美xxxx在线观看| 国产一区二区精品久久91| 国产色综合一区| 99re热视频精品| 性做久久久久久免费观看 | 成人午夜在线视频| 中文字幕在线观看不卡视频| 97久久超碰精品国产| 亚洲精品免费看| 欧美人狂配大交3d怪物一区| 日产欧产美韩系列久久99| 欧美变态tickle挠乳网站| 欧美日韩在线三级| 午夜在线电影亚洲一区| 日韩免费视频一区| 国产精品综合久久| 亚洲日本在线视频观看| 欧美日韩亚洲国产综合| 麻豆精品一二三| 国产精品无遮挡| 欧美图区在线视频| 麻豆一区二区三区| 中文字幕中文乱码欧美一区二区 | 国产精品 欧美精品| 国产精品国产三级国产普通话蜜臀| 一本在线高清不卡dvd| 丝袜诱惑亚洲看片| 日本一区二区动态图| 欧美性猛交一区二区三区精品| 久久精品国产亚洲aⅴ| 国产精品久久久久久户外露出 | 亚洲精品免费在线观看| 欧美猛男超大videosgay| 国产一区二区三区电影在线观看| 国产精品理论在线观看| 在线观看91精品国产麻豆| 国产成人精品免费| 亚洲成人免费看| 国产拍揄自揄精品视频麻豆| 欧美中文字幕一区| 国产精品99久久不卡二区| 一区二区三区.www| 久久综合网色—综合色88| 在线一区二区三区四区五区| 免费在线观看不卡| 亚洲免费av高清| 精品女同一区二区| 91首页免费视频| 国产一区二区在线观看免费| 亚洲国产成人精品视频| 国产精品久久久久久久午夜片| 日韩一本二本av| 欧美性色黄大片| heyzo一本久久综合| 久久99精品视频|