亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产欧美精品一区aⅴ影院 | 成人午夜免费av| 91女厕偷拍女厕偷拍高清| 欧美一区永久视频免费观看| 中文在线资源观看网站视频免费不卡 | 欧美一区二区三区啪啪| 国产精品大尺度| 国产一区福利在线| 在线不卡免费欧美| 亚洲欧美激情一区二区| 欧洲精品视频在线观看| 久久精品亚洲麻豆av一区二区| 亚洲成人动漫一区| 91在线免费看| 国产欧美一区二区三区沐欲| 麻豆精品一区二区三区| 欧美理论电影在线| 亚洲一区二区三区在线看| 成人黄色av电影| 国产欧美一区二区在线| 国产真实乱对白精彩久久| 欧美一二三四区在线| 图片区小说区国产精品视频| 日本高清不卡视频| 亚洲精品中文在线| 色999日韩国产欧美一区二区| 久久久久国产一区二区三区四区| 美国精品在线观看| 欧美一区二区三区播放老司机| 天天av天天翘天天综合网色鬼国产| 色乱码一区二区三区88| 亚洲黄色av一区| 欧美日韩三级一区| 午夜精品久久久久久久99水蜜桃 | 久久久久久久综合色一本| 精品一二线国产| 精品国产伦一区二区三区观看体验 | 亚洲bdsm女犯bdsm网站| 欧美日韩一区精品| 天堂久久一区二区三区| 欧美一区二区三区的| 美女久久久精品| 久久麻豆一区二区| 懂色一区二区三区免费观看| 《视频一区视频二区| 色爱区综合激月婷婷| 天堂va蜜桃一区二区三区漫画版| 欧美日韩国产成人在线免费| 日本欧洲一区二区| 欧美成人高清电影在线| 国产99久久久国产精品免费看 | 久久伊99综合婷婷久久伊| 丁香天五香天堂综合| 成人免费在线视频观看| 欧美日韩国产a| 另类调教123区| 国产精品色在线观看| 色天使色偷偷av一区二区| 日韩综合在线视频| 久久久噜噜噜久噜久久综合| 91香蕉视频mp4| 日韩国产精品久久久| 久久免费偷拍视频| 欧美三级一区二区| 国产伦精品一区二区三区在线观看| 国产精品女人毛片| 欧美精品久久99| 在线观看视频一区二区| 韩国成人福利片在线播放| 中文字幕一区二区三区蜜月| 欧美高清一级片在线| 国产成人在线观看| 午夜亚洲福利老司机| 久久毛片高清国产| 777奇米四色成人影色区| 国产91丝袜在线播放九色| 亚洲成人自拍网| 欧美国产一区二区| 日韩小视频在线观看专区| 99精品国产一区二区三区不卡 | 亚洲香蕉伊在人在线观| 亚洲精品一区二区在线观看| 91黄色免费看| 国产aⅴ综合色| 激情六月婷婷久久| 亚洲不卡av一区二区三区| 国产精品免费av| 精品卡一卡二卡三卡四在线| 欧美羞羞免费网站| 成人黄页毛片网站| 国内精品国产成人国产三级粉色 | 正在播放一区二区| 91美女片黄在线观看| 从欧美一区二区三区| 久久国产福利国产秒拍| 日韩影院精彩在线| 亚洲尤物视频在线| 日韩理论片一区二区| 中文字幕乱码日本亚洲一区二区 | 亚洲精品成a人| 国产三级一区二区| 欧美精品一区二区三区在线播放| 欧美浪妇xxxx高跟鞋交| 欧美在线不卡视频| 91丨九色丨尤物| 99久久精品国产一区二区三区 | 欧美三级午夜理伦三级中视频| youjizz国产精品| 成人免费视频免费观看| 国产剧情在线观看一区二区| 精品一区二区免费在线观看| 麻豆成人久久精品二区三区小说| 日韩激情一二三区| 热久久一区二区| 日韩电影免费在线观看网站| 视频一区欧美日韩| 日韩国产精品久久久| 蜜桃久久av一区| 免费在线观看日韩欧美| 男女男精品视频| 韩国三级在线一区| 国产高清精品网站| 白白色 亚洲乱淫| 91福利在线播放| 欧美日韩在线播放三区四区| 欧美日韩的一区二区| 日韩一区二区在线看片| 欧美电视剧免费观看| 久久精品视频网| 国产精品久久久久久久久久免费看| 国产精品护士白丝一区av| 激情久久五月天| 丁香啪啪综合成人亚洲小说| 色婷婷亚洲综合| 91精品国产综合久久国产大片 | 国产在线播精品第三| 国产福利精品导航| 91丨porny丨首页| 在线成人av网站| 国产欧美综合色| 亚洲第一福利视频在线| 裸体健美xxxx欧美裸体表演| 国产成人自拍网| 欧美网站大全在线观看| 日韩美女在线视频| 中文字幕综合网| 日韩va亚洲va欧美va久久| 丁香六月久久综合狠狠色| 欧美三级韩国三级日本一级| 欧美成人精品1314www| 亚洲欧洲精品一区二区三区| 日韩制服丝袜av| 福利视频网站一区二区三区| 欧美日韩三级一区二区| 国产精品网站一区| 日韩影院在线观看| 99精品视频中文字幕| 日韩欧美卡一卡二| 亚洲日本丝袜连裤袜办公室| 久久99九九99精品| 欧美日韩一区中文字幕| 国产精品午夜在线观看| 日日夜夜精品视频免费| 成人精品国产福利| 日韩一区二区三区在线| 亚洲欧美偷拍另类a∨色屁股| 久久99国产精品久久| 日本韩国欧美国产| 欧美激情一区二区三区在线| 日本伊人精品一区二区三区观看方式| 成人综合激情网| 精品精品国产高清一毛片一天堂| 亚洲国产精品久久一线不卡| 国产成人精品影视| 日韩三级在线免费观看| 亚洲午夜电影在线观看| 成人免费看黄yyy456| 精品国产成人系列| 免费成人在线视频观看| 欧美色精品天天在线观看视频| 国产精品成人免费精品自在线观看| 另类小说综合欧美亚洲| 欧美一区二区网站| 亚洲国产wwwccc36天堂| 99久久久国产精品| 日本一区二区三区四区在线视频| 国内精品伊人久久久久av影院| 欧美人妖巨大在线| 亚洲高清久久久| 欧美在线一区二区三区| 日韩理论片网站| 一本久道久久综合中文字幕| 中文字幕国产一区二区| 国产麻豆午夜三级精品| 久久综合色天天久久综合图片| 蜜乳av一区二区| 欧美xingq一区二区| 精品一区二区三区免费视频| 欧美成人福利视频| 国产美女视频一区|