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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? diskio.c

?? WinCE下的ATADISK驅動
?? C
?? 第 1 頁 / 共 4 頁
字號:
//
// 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.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:  

    diskio.c

Abstract:  

    WINCE driver for PCMCIA ATA Disk cards

Functions:

Notes:


--*/
#include <windows.h>
#include <types.h>
#include <tchar.h>
#include <excpt.h>
#include <cardserv.h>
#include <cardapi.h>
#include <atapi.h>
#include <diskio.h>
#include <atadisk.h>
#include <devload.h>
#include <ceddk.h>

//
// This module contains the functions:
//  CloseDisk
//  ATAWaitForDisk
//  ATASetSector
//  ATARead
//  ATAWrite
//  DoDiskIO
//  PcmciaIntr
//  ATAIssueIdentify
//  GetDiskInfo
//  SetDiskInfo
//  ATAInitController
//  OpenDriverKey
//  GetFolderName
//  GetGeometry
//  UseCHSMode
//  InitDisk
//

//#define USE_INTERRUPT 1

#ifdef x86
#define ATA_READ_UCHAR(f,p) ((f & ATADISK_FLAG_MEMORY_MAPPED) ? READ_REGISTER_UCHAR(p) : READ_PORT_UCHAR(p))
#define ATA_READ_USHORT(f,p) ((f & ATADISK_FLAG_MEMORY_MAPPED) ? READ_REGISTER_USHORT(p) : READ_PORT_USHORT(p))
#define ATA_WRITE_UCHAR(f,p,b) ((f & ATADISK_FLAG_MEMORY_MAPPED) ? WRITE_REGISTER_UCHAR(p,b) : WRITE_PORT_UCHAR(p,b))
#define ATA_WRITE_USHORT(f,p,w) ((f & ATADISK_FLAG_MEMORY_MAPPED) ? WRITE_REGISTER_USHORT(p,w) : WRITE_PORT_USHORT(p,w))
#else
#define ATA_READ_UCHAR(f,p) READ_PORT_UCHAR(p)
#define ATA_READ_USHORT(f,p) READ_PORT_USHORT(p)
#define ATA_WRITE_UCHAR(f,p,b) WRITE_PORT_UCHAR(p,b)
#define ATA_WRITE_USHORT(f,p,w) WRITE_PORT_USHORT(p,w)
#endif

#define MIN(x,y) ((x < y) ? x : y)
#define MAX_SECT_CNT 64

BOOL IsCardInserted(CARD_SOCKET_HANDLE hSock);

//
// CloseDisk - finish and free all outstanding requests and free other resources
// associated with the specified disk
//
VOID
CloseDisk(
    PDISK pDisk
    )
{
    PDISK pd;

    DEBUGMSG(ZONE_IO, (TEXT("ATADISK:CloseDisk closing 0x%x\r\n"), pDisk));

    //
    // Remove it from the global list of disks
    //
    EnterCriticalSection(&v_DiskCrit);
    if (pDisk == v_DiskList) {
        v_DiskList = pDisk->d_next;
    } else {
        pd = v_DiskList;
        while (pd->d_next != NULL) {
            if (pd->d_next == pDisk) {
                pd->d_next = pDisk->d_next;
                break;
            }
            pd = pd->d_next;
        }
    }
    LeaveCriticalSection(&v_DiskCrit);

    DEBUGMSG(ZONE_IO, (TEXT("ATADISK:CloseDisk - freeing PCMCIA resources\r\n")));

    v_pfnCardReleaseConfiguration(pDisk->d_hPcmcia, pDisk->d_hSock);
    v_pfnCardReleaseIRQ(pDisk->d_hPcmcia, pDisk->d_hSock);
    SetEvent(pDisk->d_IRQEvent);
    pDisk->lPwrOff = -1;
    SetEvent( pDisk->hPwrEvent);
    Sleep(250);
    CloseHandle(pDisk->d_IRQEvent);
    CloseHandle(pDisk->hPwrEvent);
    v_pfnCardDeregisterClient(pDisk->d_hPcmcia);
    DeleteCriticalSection(&(pDisk->d_DiskCardCrit));
    if (pDisk->d_ActivePath) {
        LocalFree(pDisk->d_ActivePath);
    }
    LocalFree(pDisk);
    DEBUGMSG(ZONE_IO, (TEXT("ATADISK:CloseDisk done with 0x%x\r\n"), pDisk));
}    // CloseDisk


#ifdef DEBUG
LPTSTR WaitTypes[6] = {
    TEXT("WAIT_TYPE_BUSY"),
    TEXT("WAIT_TYPE_NOT_BUSY"),
    TEXT("WAIT_TYPE_READY"),
    TEXT("WAIT_TYPE_DRQ"),
    TEXT("WAIT_TYPE_DRQ_NOERR"),
    TEXT("WAIT_TYPE_RDY_NOERR")
};
#endif

#define WAIT_TYPE_BUSY      1
#define WAIT_TYPE_NOT_BUSY  2
#define WAIT_TYPE_READY     3
#define WAIT_TYPE_DRQ       4   // wait for data request
#define WAIT_TYPE_DRQ_NOERR 5   // wait for DRQ but ignore the error status bit
#define WAIT_TYPE_RDY_NOERR 6   // wait for ready, but ignore error status bit

#define WAIT_TIME_NORMAL    9000
#define WAIT_TIME_LONG      30000

//
// ATAWaitForDisk
//
DWORD
ATAWaitForDisk(
    PDISK pDisk,
    DWORD Times,
    UCHAR Type
    )
{
    UCHAR ata_status = 0;
    DWORD error = ERROR_SUCCESS;
    DWORD start = GetTickCount();

    DEBUGMSG(ZONE_IO, (TEXT("ATADISK:ATAWFD(%s)\r\n"), WaitTypes[Type-1]));

    do {
        try {
            ata_status = ATA_READ_UCHAR(pDisk->d_Flags, (UCHAR*)pDisk->d_pATARegAlt + ATA_REG_ALT_STATUS);
        } except (GetExceptionCode() == STATUS_ACCESS_VIOLATION ?
                EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
            DEBUGMSG(ZONE_IO|ZONE_ERROR, (TEXT("ATADISK:ATAWaitForDisk - exception!\r\n")));
            error = ERROR_ACCESS_DENIED;
        }
        if (error != ERROR_SUCCESS) {
            return error;
        }
//        DEBUGMSG(ZONE_IO,
//                 (TEXT("ATADISK:ATAWaitForDisk - ata_status = 0x%x\r\n"), ata_status));
        if (ata_status & ATA_STATUS_BUSY) {
           // No other status bits are valid; if this is what we want, return; else poll
           if (Type == WAIT_TYPE_BUSY) {
              DEBUGMSG(ZONE_IO, (TEXT("ATADISK:ATAWaitForDisk - ATA_STATUS_BUSY\r\n")));
              goto awfd_done;
           }
        } else if (Type == WAIT_TYPE_NOT_BUSY) {
           // We don't care about the error status of the last command here
           // because we're only waiting on the busy status (and because we
           // only do this when we're preparing to submit a new command).
           goto awfd_done;
        } else {
           if (Type == WAIT_TYPE_DRQ_NOERR) {
              // This condition is special - ignore the error bit iff DRQ is set.
              // Use this for write operations because the error bit may still be
              // set from the last operation; we have to complete a new operation
              // before the bit gets cleared (or it might be errored again in which
              // case the bit will stay set but DRQ won't be asserted).
              if (ata_status & ATA_STATUS_DATA_REQ)
                 goto awfd_done;
           }
           if (Type == WAIT_TYPE_RDY_NOERR) {
              if (ata_status & ATA_STATUS_READY)
                 goto awfd_done;
           }
           // Now we check the error condition!
           if (ata_status & ATA_STATUS_ERROR) {
              error = ATA_READ_UCHAR(pDisk->d_Flags, (UCHAR*)pDisk->d_pATAReg + ATA_REG_ERROR);
              DEBUGMSG(ZONE_IO|ZONE_ERROR, (TEXT("ATADISK:ATAWaitForDisk - op error 0x%x\r\n"), error));
              if (error & ATA_ERROR_BAD_SECT_NUM)
                 return ERROR_SECTOR_NOT_FOUND;
              if (error & (ATA_ERROR_BAD_BLOCK|ATA_ERROR_UNCORRECTABLE))
                 return ERROR_INVALID_BLOCK;
              return ERROR_DISK_OPERATION_FAILED;
           }
           switch (Type) {
             case WAIT_TYPE_READY:
               if (ata_status & ATA_STATUS_READY) {
                  DEBUGMSG(ZONE_IO,
                           (TEXT("ATADISK:ATAWaitForDisk - ATA_STATUS_READY 0x%x\r\n"),
                            ata_status));
                  goto awfd_done;
               }
               Sleep(10);  // waiting for READY can take a while
               break;
               
             case WAIT_TYPE_DRQ: 
               if (ata_status & ATA_STATUS_DATA_REQ) {
                  goto awfd_done;
               }
               break;
           }
        }

        //
        // Since Sleep(1) can be as long as a time slice (~25ms), 
        // this loop is limited by looking at the milliseconds elapsed.
        //
        if ((GetTickCount() - start) >= Times) {
            Times = 0;
        }
    } while (Times); // end of do-loop

awfd_done:
    if (Times == 0) {
        DEBUGMSG(ZONE_IO|ZONE_ERROR,
           (TEXT("ATADISK:ATAWaitForDisk - %s wait timed out\r\n"),
           WaitTypes[Type-1]));
        return ERROR_GEN_FAILURE;
    } else {
        return ERROR_SUCCESS;
    }
}   // ATAWaitForDisk


//
// ATASetSector - write a sector number to the appropriate ATA registers taking
//        into account for the mode being used (LBA or CHS).  Also write the next
//        command.
//
DWORD
ATASetSector(
    PDISK pDisk,
    DWORD sectno,
    DWORD cnt,
    DWORD cmd
    )
{
    volatile UCHAR* base;
    DWORD sectors;
    DWORD heads;

    if (ATAWaitForDisk(
            pDisk,
            WAIT_TIME_NORMAL,
            WAIT_TYPE_RDY_NOERR) != CERR_SUCCESS) {
        return ERROR_GEN_FAILURE;
    }

    base = pDisk->d_pATAReg;

    if (!cnt) {
        DEBUGMSG(1, (TEXT("ATADISK: Requesting 0 Sectors at %d\n"), sectno));
    }
    DEBUGMSG(ZONE_IO, (TEXT("ATADISK: Requesting %d sectors at %d\n"), cnt, sectno));

    
    ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base + ATA_REG_SECT_CNT, (UCHAR)cnt);
    if (pDisk->d_fLBAMode == TRUE) {
        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base + ATA_REG_SECT_NUM, (UCHAR)sectno);
        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base + ATA_REG_CYL_LOW, (UCHAR)(sectno >> 8));
        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base + ATA_REG_CYL_HIGH, (UCHAR)(sectno >> 16));
        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base + ATA_REG_DRV_HEAD,
            (UCHAR)(((UCHAR)(sectno>>24))|ATA_HEAD_LBA_MODE|ATA_HEAD_DRIVE_1));

    } else {    // translate LBA to CHS format
        sectors = pDisk->d_DiskInfo.di_sectors;
        heads = pDisk->d_DiskInfo.di_heads;

        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base+ATA_REG_SECT_NUM, (UCHAR)((sectno%sectors)+1));
        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base+ATA_REG_CYL_LOW, (UCHAR)(sectno/(sectors*heads)));
        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base+ATA_REG_CYL_HIGH,
                                      (UCHAR)((sectno/(sectors*heads)) >> 8));
        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base + ATA_REG_DRV_HEAD,
                            (UCHAR)(((sectno/sectors)%heads)|ATA_HEAD_DRIVE_1));
    }
    ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)base + ATA_REG_COMMAND, (UCHAR)cmd);
    return ERROR_SUCCESS;
}    // ATASetSector


//
// ATARead - fulfill one scatter/gather read request
//
DWORD
ATARead(
    PDISK pDisk,
    PSG_REQ pSgr
    )
{
    DWORD i;
    DWORD num_sg;
    DWORD bytes_this_int;
    DWORD bytes_this_sg;
    PSG_BUF pSg;
    volatile USHORT *pData16;
    PUCHAR pBuf;
    volatile UCHAR *pData;
    DWORD sectno;
    DWORD nextsec;
    DWORD endsect;
    DWORD error;
    WORD  nextbyte=0xFFFF;
    int tries = 0;

    union {
        WORD us;
        BYTE  uc[2];
    }unisc;

    num_sg = pSgr->sr_num_sg;
    pSg = &(pSgr->sr_sglist[0]);
    bytes_this_sg = pSg->sb_len;

    // Map address and check for security violation
    pBuf = (LPBYTE)MapCallerPtr((LPVOID)pSg->sb_buf, pSg->sb_len);
    if (pSg->sb_buf != NULL && pBuf == NULL) {
        // Security violation
        DEBUGMSG(ZONE_ERROR, (TEXT(
            "ATARead>Failed to map pointer to caller\r\n"
            )));
        return ERROR_ACCESS_DENIED;
    }

    pData = (volatile UCHAR*)pData16 = pDisk->d_pATAReg;
    sectno = pSgr->sr_start;
    endsect = sectno + pSgr->sr_num_sec;
    error = ERROR_SUCCESS;
    nextsec = 0;

    //
    // This loop reads multiple sectors into multiple scatter/gather buffers.
    // The scatter/gather buffers may be bigger or smaller or same size as a
    // sector.
    //
    while (num_sg) {
        DEBUGMSG(ZONE_IO, 
            (TEXT("ATADISK:ATARead - reading sector %d\r\n"), sectno));

#ifdef USE_INTERRUPT
        ResetEvent(pDisk->d_IRQEvent);
#endif

ata_read0:
        if (!nextsec) {
            nextsec = MIN(MAX_SECT_CNT, endsect - sectno);
            try {
                error = ATASetSector(pDisk, sectno, nextsec, ATA_CMD_READ);
            } except (GetExceptionCode() == STATUS_ACCESS_VIOLATION ?
                EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
                DEBUGMSG(ZONE_IO|ZONE_ERROR, (TEXT("ATADISK:ATARead - exception 1\r\n")));
                error = ERROR_READ_FAULT;
            }
            if (error != ERROR_SUCCESS) {
                return error;
            }
        }

#ifdef USE_INTERRUPT
        if (!(pDisk->d_Flags & ATADISK_FLAG_MEMORY_MAPPED)) {
            WaitForSingleObject(pDisk->d_IRQEvent, DISK_IO_TIME_OUT);
        }
#endif
        error = ATAWaitForDisk(pDisk, WAIT_TIME_NORMAL, WAIT_TYPE_DRQ);
        if (error != ERROR_SUCCESS) {
            tries++;
            nextsec = 0;
            Sleep(10);
            DEBUGMSG(ZONE_ERROR, (TEXT("ATAREAD: error during WaitForDisk\r\n")));
            if (tries < 6)
                goto ata_read0;
            return error;
        }
        tries = 0;
        sectno++;
        nextsec--;
        bytes_this_int = pDisk->d_DiskInfo.di_bytes_per_sect;

ar_continue_sector:
        i = (bytes_this_sg < bytes_this_int) ? bytes_this_sg : bytes_this_int;
        bytes_this_sg -= i;
        bytes_this_int -= i;

        try {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产在线播放网站| 日韩电影免费在线| 久久久久97国产精华液好用吗| 日韩欧美精品三级| 国产免费成人在线视频| 亚洲最新视频在线观看| 久久激情五月激情| 91亚洲精品乱码久久久久久蜜桃| 欧美日韩国产乱码电影| 国产亚洲欧美色| 亚洲成人免费影院| 99久久精品情趣| 欧美午夜不卡在线观看免费| 色拍拍在线精品视频8848| 韩国视频一区二区| 色欧美片视频在线观看 | 欧美精品一区二区三区很污很色的| 久久午夜国产精品| 亚洲成人免费影院| 色综合天天在线| 精品国产凹凸成av人网站| 亚洲曰韩产成在线| 99久久伊人网影院| 久久久久久一二三区| 亚洲一区二区三区四区中文字幕 | 亚洲欧洲制服丝袜| 国产老妇另类xxxxx| 日韩丝袜情趣美女图片| 一区二区在线看| 99久久久久久| 欧美国产一区二区| 国产美女精品在线| 精品日产卡一卡二卡麻豆| 国产精品久久久久久久久免费相片 | 亚洲视频图片小说| 国产成人综合亚洲网站| 精品欧美久久久| 日日嗨av一区二区三区四区| 成人短视频下载| 久久精品水蜜桃av综合天堂| 久热成人在线视频| 欧美无乱码久久久免费午夜一区| 欧美大片在线观看一区二区| 日韩国产精品久久久久久亚洲| 欧洲精品在线观看| 亚洲综合免费观看高清完整版 | 精品国产欧美一区二区| 视频一区中文字幕国产| 欧美视频你懂的| 亚洲伊人伊色伊影伊综合网| 色先锋久久av资源部| 亚洲精品乱码久久久久久黑人 | 久久婷婷综合激情| 国产福利视频一区二区三区| 国产日韩高清在线| 成人午夜伦理影院| 亚洲欧美日韩国产成人精品影院| 94色蜜桃网一区二区三区| 亚洲乱码国产乱码精品精可以看| 国产成人精品影院| 亚洲免费成人av| 欧美私人免费视频| 久久99精品久久只有精品| 精品卡一卡二卡三卡四在线| 国产一区二区三区不卡在线观看| 久久久久久日产精品| 成人免费av在线| 一级特黄大欧美久久久| 欧美日韩在线观看一区二区| 蜜臀av一区二区| 国产校园另类小说区| 国产精品69久久久久水密桃| 欧美va亚洲va国产综合| 成人夜色视频网站在线观看| 亚洲精品自拍动漫在线| 欧美精品一二三区| 国产成人在线视频网站| 一区二区三区在线观看欧美| 日韩欧美国产成人一区二区| 成人av免费在线播放| 一个色综合av| 精品理论电影在线| 日本乱码高清不卡字幕| 精品一区免费av| 亚洲少妇最新在线视频| 91精彩视频在线| 国产福利91精品一区二区三区| 亚洲色图都市小说| 欧美大白屁股肥臀xxxxxx| 成人av在线资源网站| 日韩二区在线观看| 精品99久久久久久| av在线播放成人| 九色porny丨国产精品| 亚洲精品伦理在线| 国产女人18毛片水真多成人如厕| 色综合久久综合网欧美综合网| 老司机精品视频线观看86| 一区二区三区美女| 欧美国产一区在线| 欧美哺乳videos| 欧美日韩一级二级三级| 99re热这里只有精品免费视频| 午夜精品福利久久久| 久久久久99精品一区| 7777精品伊人久久久大香线蕉经典版下载| 国产精品一区二区x88av| 日韩精品一卡二卡三卡四卡无卡| 18欧美乱大交hd1984| 欧美精品色综合| 欧美亚洲免费在线一区| gogogo免费视频观看亚洲一| 麻豆一区二区99久久久久| 午夜精品福利一区二区三区av | 成人美女视频在线观看18| 蜜桃一区二区三区在线| 亚洲 欧美综合在线网络| 亚洲欧美中日韩| 国产精品激情偷乱一区二区∴| 精品国产电影一区二区| 日韩欧美一区在线观看| 7777女厕盗摄久久久| 91在线免费播放| av不卡一区二区三区| 成人av网站在线| 不卡高清视频专区| 精品一区二区免费看| 亚洲电影视频在线| 亚洲国产另类av| 中文久久乱码一区二区| 国产婷婷色一区二区三区在线| 国产性做久久久久久| 亚洲美女在线一区| 天天av天天翘天天综合网 | 国产精品18久久久久久久网站| 国产成人综合在线| 91老师片黄在线观看| 欧美久久婷婷综合色| 久久久777精品电影网影网| 国产精品久久精品日日| 亚洲一区二区三区爽爽爽爽爽| 蜜臀av一区二区三区| jizzjizzjizz欧美| 欧美疯狂性受xxxxx喷水图片| 精品久久国产97色综合| 亚洲少妇最新在线视频| 日本成人在线视频网站| 成人夜色视频网站在线观看| 欧美日韩国产高清一区二区 | 亚洲一级片在线观看| 久久精品国产999大香线蕉| 成人av电影免费在线播放| 欧美乱妇15p| 国产精品久久久久影院色老大| 婷婷国产v国产偷v亚洲高清| 国产成人综合亚洲91猫咪| 欧美日韩成人在线| 中文字幕欧美日本乱码一线二线| 午夜精品福利视频网站| 北条麻妃国产九九精品视频| 日韩亚洲欧美高清| 亚洲三级电影网站| 国产精品一区在线观看乱码 | 国产精品视频yy9299一区| 日韩精品三区四区| 91婷婷韩国欧美一区二区| 亚洲精品在线观| 日韩精品一二三四| 色激情天天射综合网| 国产亚洲欧美激情| 久久福利视频一区二区| 欧美视频中文字幕| 日韩美女视频一区二区| 国产999精品久久| 欧美电影免费观看高清完整版在线 | 亚洲444eee在线观看| 91丨九色丨尤物| 亚洲国产精华液网站w| 精品一二线国产| 欧美一区二区福利视频| 一区二区三区四区中文字幕| 成人黄色在线视频| 国产精品欧美久久久久一区二区| 精品一区二区三区香蕉蜜桃| 欧美一三区三区四区免费在线看| 一区二区在线看| 一本大道久久a久久综合婷婷| 亚洲国产精品黑人久久久 | 久久国产综合精品| 日韩视频在线一区二区| 奇米影视在线99精品| 欧美日韩欧美一区二区| 亚洲永久精品大片| 欧美日韩一卡二卡| 婷婷综合另类小说色区| 欧美美女直播网站| 天堂成人免费av电影一区| 欧美高清性hdvideosex| 日本中文字幕一区二区视频 | 中文字幕一区二区三区四区|