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

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

?? diskio.c

?? WinCE下的ATADISK驅動
?? C
?? 第 1 頁 / 共 4 頁
字號:
    (TEXT("ATADISK:ATAInitController writing to ATA_REG_DRV_CTRL\r\n")));

        ATA_WRITE_UCHAR(pDisk->d_Flags, (UCHAR*)pDisk->d_pATARegAlt + ATA_REG_DRV_CTRL,
                         ATA_CTRL_ENABLE_INTR);
        if (ATAWaitForDisk(
                pDisk,
                WAIT_TIME_LONG,
                WAIT_TYPE_READY) != CERR_SUCCESS) {
            ret = FALSE;
        }
    } except (GetExceptionCode() == STATUS_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        DEBUGMSG(ZONE_IO|ZONE_ERROR, (TEXT("ATADISK:ATAInitController - exception!\r\n")));
        ret = FALSE;
    }
DEBUGMSG(ZONE_INIT, (TEXT("ATADISK:ATAInitController done\r\n")));
    return ret;
}   // ATAInitController

//
// Function to open the driver key specified by the active key
//
// The caller is responsible for closing the returned HKEY
//
HKEY
OpenDriverKey(
    LPTSTR ActiveKey
    )
{
    TCHAR DevKey[256];
    HKEY hDevKey;
    HKEY hActive;
    DWORD ValType;
    DWORD ValLen;
    DWORD status;

    //
    // Get the device key from active device registry key
    //
    status = RegOpenKeyEx(
                HKEY_LOCAL_MACHINE,
                ActiveKey,
                0,
                0,
                &hActive);
    if (status) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("ATADISK:OpenDriverKey RegOpenKeyEx(HLM\\%s) returned %d!!!\r\n"),
                  ActiveKey, status));
        return NULL;
    }

    hDevKey = NULL;

    ValLen = sizeof(DevKey);
    status = RegQueryValueEx(
                hActive,
                DEVLOAD_DEVKEY_VALNAME,
                NULL,
                &ValType,
                (PUCHAR)DevKey,
                &ValLen);
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("ATADISK:OpenDriverKey - RegQueryValueEx(%s) returned %d\r\n"),
                  DEVLOAD_DEVKEY_VALNAME, status));
        goto odk_fail;
    }

    //
    // Get the geometry values from the device key
    //
    status = RegOpenKeyEx(
                HKEY_LOCAL_MACHINE,
                DevKey,
                0,
                0,
                &hDevKey);
    if (status) {
        hDevKey = NULL;
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("ATADISK:OpenDriverKey RegOpenKeyEx(HLM\\%s) returned %d!!!\r\n"),
                  DevKey, status));
    }

odk_fail:
    RegCloseKey(hActive);
    return hDevKey;
}   // OpenDriverKey

//
// Function to retrieve the folder name value from the driver key. The folder name is
// used by FATFS to name this disk volume.
//
BOOL
GetFolderName(
    PDISK pDisk,
    LPWSTR FolderName,
    DWORD cBytes,
    DWORD * pcBytes
    )
{
    HKEY DriverKey;
    DWORD ValType;
    DWORD status;
    TCHAR szName[MAX_PATH];
    DWORD dwSize;

    DriverKey = OpenDriverKey(pDisk->d_ActivePath);
    if (DriverKey) {
        dwSize = sizeof(szName);
        status = RegQueryValueEx(
                    DriverKey,
                    TEXT("Folder"),
                    NULL,
                    &ValType,
                    (LPBYTE)szName,
                    &dwSize);
        if ((status != ERROR_SUCCESS) || (dwSize > cBytes)){
            DEBUGMSG(ZONE_INIT|ZONE_ERROR,
                (TEXT("ATADISK:GetFolderName - RegQueryValueEx(Folder) returned %d\r\n"),
                      status));
            *pcBytes = 0;
        } else {
            DEBUGMSG(ZONE_INIT|ZONE_ERROR,
                (TEXT("ATADISK:GetFolderName - FolderName = %s, length = %d\r\n"),
                 FolderName, *pcBytes));
           *pcBytes = (wcslen(szName)+1)*sizeof(WCHAR);
           wcscpy( (LPWSTR)FolderName, szName);
        }
        RegCloseKey(DriverKey);
        if (status || (*pcBytes == 0)) {
            SetLastError( ERROR_NOT_FOUND);
            return FALSE;
        }
        return TRUE;
    }
    return FALSE;
}   // GetFolderName

//
// Function to get the C:H:S values for the disk specified by the ActiveKey.
//
// NOTE: Only one such set of values will be allowed per system since the active
// key is dynamic. The CHS values must be stored in the device key.
//
// NOTE2: C:H:S => Cylinders:Heads:Sectors per track
//
BOOL
GetGeometry(
    HKEY hDevKey,
    WORD * Cylinders,
    WORD * Heads,
    WORD * Sectors
    )
{
    DWORD ValType;
    DWORD ValLen;
    DWORD status;
    DWORD dwtmp;

    ValLen = sizeof(dwtmp);
    status = RegQueryValueEx(
                hDevKey,
                TEXT("Cylinders"),
                NULL,
                &ValType,
                (PUCHAR)&dwtmp,
                &ValLen);
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("ATADISK:GetGeometry - RegQueryValueEx(Cylinders) returned %d\r\n"),
                  status));
        return FALSE;
    }
    *Cylinders = (WORD)dwtmp;

    ValLen = sizeof(dwtmp);
    status = RegQueryValueEx(
                hDevKey,
                TEXT("Heads"),
                NULL,
                &ValType,
                (PUCHAR)&dwtmp,
                &ValLen);
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("ATADISK:GetGeometry - RegQueryValueEx(Heads) returned %d\r\n"),
                  status));
        return FALSE;
    }
    *Heads = (WORD)dwtmp;

    ValLen = sizeof(dwtmp);
    status = RegQueryValueEx(
                hDevKey,
                TEXT("Sectors"),
                NULL,
                &ValType,
                (PUCHAR)&dwtmp,
                &ValLen);
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("ATADISK:GetGeometry - RegQueryValueEx(Sectors) returned %d\r\n"),
                  status));
        return FALSE;
    }
    *Sectors = (WORD)dwtmp;
    return TRUE;
}   // GetGeometry

static BOOL
ParseATAIdString(
    CHAR *str, int len, DWORD *pdwOffset, CHAR **ppDest, DWORD *pcBytesLeft
    )
{
    UCHAR *p;
    DWORD cCopied;
    CHAR *pDest;
    
    // check validity (spec says ASCII, I assumed printable)
    for (p = str; p < &str[len]; ++p)
        if (*p < 0x20 || *p > 0x7F) {
            *pdwOffset = 0;
            return FALSE;
        }

    // find the last non-pad character
    for (p = &str[len]; p > str && p[-1] == ' '; --p)
        ;
    cCopied = p - str;

    // special case - empty string implies not present
    if (cCopied == 0) {
        *pdwOffset = 0;
        return TRUE;
    }
    ++cCopied; // this is a byte count so add a terminating null

    // always increment *ppDest because it counts the bytes that we want,
    // not just the bytes that we've actually written.
    pDest = *ppDest;
    *ppDest += cCopied;

    // if there has already been an error, then we needn't continue further
    if (GetLastError() != ERROR_SUCCESS)
        return TRUE;

    // make sure there's enough space to copy into
    if (cCopied > *pcBytesLeft) {
        SetLastError(ERROR_INSUFFICIENT_BUFFER);
        cCopied = *pcBytesLeft;
    }
    __try {
        if (cCopied) {
            memcpy(pDest, str, cCopied-1);
            pDest[cCopied-1] = '\0';
        }
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        SetLastError(ERROR_INVALID_PARAMETER);
    };

    *pcBytesLeft -= cCopied;
    return TRUE;
}

BOOL
GetStorageID(
    PDISK pDisk,
    PSTORAGE_IDENTIFICATION psid,
    DWORD cBytes,
    DWORD * pcBytes
    )
{
    IDENTIFY_DATA sAtaId;
    PCHAR pDstOffset;
    DWORD cRemaining;

    memset( &sAtaId, 0, sizeof(IDENTIFY_DATA));
    
    if (cBytes < sizeof(*psid)) {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    } else
        // initialize the error status in case there are no errors
        SetLastError(ERROR_SUCCESS);

    __try {
        psid->dwSize = sizeof(*psid);
        psid->dwFlags = 0;  // can be or of {MANUFACTUREID,SERIALNUM}_INVALID
        psid->dwManufactureIDOffset = psid->dwSerialNumOffset = 0;
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }
    if (ATAIssueIdentify(pDisk, &sAtaId) == FALSE) {
        // leave the error code alone
        return FALSE;
    }

    cRemaining = cBytes - sizeof(*psid);
    pDstOffset = (PCHAR)(psid + 1);

// This macro is only used here; I think it's clearer than the expansion.
#define PARSESTRING(nSrcField,nOffField,nFlagPfx)                                  \
    if (1) {                                                                       \
        psid->nOffField = pDstOffset - (PCHAR)psid;                                \
        if (ParseATAIdString((PCHAR)sAtaId.nSrcField, sizeof(sAtaId.nSrcField),    \
                             &psid->nOffField, &pDstOffset, &cRemaining) == FALSE) \
            psid->dwFlags |= nFlagPfx ## _INVALID;                                 \
    } else

    PARSESTRING(ModelNumber, dwManufactureIDOffset, MANUFACTUREID);
    PARSESTRING(SerialNumber, dwSerialNumOffset, SERIALNUM);
    psid->dwSize = pDstOffset - (PCHAR)psid;    // required size

    *pcBytes = min(psid->dwSize, cBytes);       // bytes written

    return (GetLastError() == ERROR_SUCCESS);
}

//
// Function to check if the advertised LBA mode capability needs to be ignored.
//
// NOTE: Only one such set of value can be allowed per system since the active
// key is dynamic. The CHSMode value must be stored in the device key.
//
// NOTE2: C:H:S => Cylinders:Heads:Sectors per track
//        LBA => Logical Block Address
//
BOOL
UseCHSMode(
    HKEY hDevKey
    )
{
    DWORD ValType;
    DWORD ValLen;
    DWORD status;
    DWORD dwtmp;

    ValLen = sizeof(dwtmp);
    status = RegQueryValueEx(
                hDevKey,
                TEXT("CHSMode"),
                NULL,
                &ValType,
                (PUCHAR)&dwtmp,
                &ValLen);
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("ATADISK:UseCHSMode - RegQueryValueEx(CHSMode) returned %d\r\n"),
                  status));
        return FALSE;
    }

    return dwtmp == 1 ? TRUE : FALSE;
}   // UseCHSMode

//
// InitDisk
//
DWORD InitDisk(
    PDISK pDisk,
    LPTSTR ActiveKey
    )
{
    IDENTIFY_DATA Id;
    HKEY DriverKey;

    memset( &Id, 0, sizeof(IDENTIFY_DATA));


    if (ATAInitController(pDisk) == FALSE) {
        return 1;
    }
    if (ATAIssueIdentify(pDisk, &Id) == FALSE) {
        return 2;
    }

    DriverKey = OpenDriverKey(ActiveKey);

    //
    // If the identify data block is not reliable, then get the values
    // from the registry.
    //
    if (DriverKey && ((Id.TranslationFieldsValid & 1) == 0)) {
        DEBUGMSG(ZONE_INIT,
            (TEXT("ATADISK:InitDisk - Getting C:H:S from registry\r\n")));
        GetGeometry(
            DriverKey,
            &(Id.NumberOfCylinders),
            &(Id.NumberOfHeads),
            &(Id.SectorsPerTrack));
        DEBUGMSG(ZONE_INIT,
            (TEXT("ATADISK:InitDisk - C:H:S = %d:%d:%d\r\n"),
            Id.NumberOfCylinders, Id.NumberOfHeads, Id.SectorsPerTrack));
    }

    pDisk->d_fLBAMode       = TRUE;
    pDisk->d_DiskInfo.di_total_sectors = Id.TotalUserAddressableSectors;
    pDisk->d_DiskInfo.di_bytes_per_sect = BYTES_PER_SECTOR; // Start with 512, then go with SetInfo changes
    pDisk->d_DiskInfo.di_cylinders = Id.NumberOfCylinders;
    pDisk->d_DiskInfo.di_heads = Id.NumberOfHeads;
    pDisk->d_DiskInfo.di_sectors = Id.SectorsPerTrack;
    pDisk->d_DiskInfo.di_flags = DISK_INFO_FLAG_MBR;

    if (DriverKey) {
        if (UseCHSMode(DriverKey)) {
            pDisk->d_fLBAMode = FALSE;
        }
        RegCloseKey(DriverKey);
    }
    return 0;
}   // Initdisk

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
5858s免费视频成人| 一区二区成人在线观看| 69堂亚洲精品首页| 欧美性生活大片视频| 欧洲精品在线观看| 97精品视频在线观看自产线路二| 粉嫩一区二区三区性色av| 国产精品一区二区果冻传媒| 国产一区二区不卡在线| 国产suv精品一区二区6| 波多野结衣一区二区三区 | 亚洲国产综合在线| 亚洲成人先锋电影| 日韩avvvv在线播放| 亚洲欧美在线视频观看| 亚洲一区二区三区中文字幕| 亚洲成人自拍一区| 精品一区二区三区免费视频| 国产成人综合网| 在线中文字幕一区二区| 欧美男男青年gay1069videost | 久久在线观看免费| 国产精品久久久久一区 | 国产曰批免费观看久久久| 高清在线观看日韩| 欧美无乱码久久久免费午夜一区 | 日韩影视精彩在线| 国产在线视频一区二区| av一区二区三区| 日韩一区二区视频在线观看| 国产亚洲人成网站| 亚洲电影在线免费观看| 国模套图日韩精品一区二区| 色综合网色综合| 2021久久国产精品不只是精品| 国产精品成人在线观看| 日韩av一级片| 91麻豆123| 国产欧美日韩麻豆91| 亚洲成av人片在线观看| 高清成人免费视频| 欧美一区2区视频在线观看| 日韩毛片一二三区| 国产精品538一区二区在线| 欧美日韩中文国产| 亚洲精品你懂的| 成人性生交大片| 久久久www免费人成精品| 亚洲综合网站在线观看| 成人av影视在线观看| 精品久久久三级丝袜| 亚洲一线二线三线久久久| 岛国一区二区在线观看| 精品剧情在线观看| 午夜精品视频在线观看| 色婷婷精品大视频在线蜜桃视频| 久久久久久99久久久精品网站| 日韩精品一级中文字幕精品视频免费观看| 成人午夜免费电影| 中文字幕欧美区| 国产福利精品导航| 久久蜜桃香蕉精品一区二区三区| 日韩国产精品久久久| 欧美日韩国产另类一区| 亚洲综合免费观看高清完整版| 91麻豆高清视频| 亚洲视频香蕉人妖| 色综合久久久网| 亚洲欧美色一区| 色一情一伦一子一伦一区| 专区另类欧美日韩| 在线观看日韩国产| 亚洲一区二区3| 欧美日韩mp4| 日本亚洲免费观看| 精品国产免费久久| 国产成人av资源| 国产精品色哟哟网站| 91在线丨porny丨国产| 亚洲乱码国产乱码精品精可以看 | 亚洲精品在线网站| 国产九色精品成人porny| 国产日韩精品一区| 成人午夜视频在线观看| 一区二区三区在线不卡| 欧美人xxxx| 国产一区二区三区免费观看| 久久久精品国产免费观看同学| 粉嫩av一区二区三区| 亚洲欧美激情在线| 日本韩国精品在线| 蜜臀av在线播放一区二区三区| 精品卡一卡二卡三卡四在线| 成人丝袜18视频在线观看| 亚洲欧美电影院| 欧美一区二区三区男人的天堂| 日本欧美在线观看| 国产精品三级av| 欧美日韩一区二区三区免费看| 奇米888四色在线精品| 久久精品亚洲麻豆av一区二区| 成人app网站| 日韩av在线播放中文字幕| 日韩精品影音先锋| 99久久免费国产| 日本一区中文字幕| 亚洲视频中文字幕| 精品国产网站在线观看| www.欧美.com| 麻豆91免费看| 亚洲一区中文日韩| 国产欧美一区二区精品婷婷| 欧美日韩色一区| 成人黄色国产精品网站大全在线免费观看 | 亚洲欧美激情在线| 日韩精品中文字幕在线一区| 成人黄色综合网站| 看国产成人h片视频| 亚洲色图视频网| 久久久蜜桃精品| 欧美二区三区91| 色视频成人在线观看免| 国产成人亚洲综合色影视| 亚洲超丰满肉感bbw| 亚洲视频在线一区二区| www激情久久| 日韩欧美高清一区| 欧美日韩一级大片网址| 91香蕉视频黄| 国产成人免费视频| 国产乱码精品一区二区三区忘忧草 | 肉色丝袜一区二区| 亚洲精品免费在线播放| 国产区在线观看成人精品| 日韩欧美在线网站| 在线播放/欧美激情| 欧美性色综合网| 一本色道a无线码一区v| 成人黄色小视频| 成人免费电影视频| 国产盗摄一区二区三区| 国产一区二三区好的| 国产原创一区二区| 国产一区二区三区精品欧美日韩一区二区三区 | 国内精品国产三级国产a久久| 天天影视涩香欲综合网 | 国产精品综合网| 国产在线一区观看| 国产一区不卡视频| 国产一区二区在线免费观看| 美女在线视频一区| 狠狠色狠狠色合久久伊人| 精品无码三级在线观看视频 | 久久色在线观看| 久久久久高清精品| 日本一区二区三区高清不卡 | 欧美在线高清视频| 欧美区在线观看| 欧美mv日韩mv亚洲| 国产亚洲一本大道中文在线| 国产精品美女久久久久久久久久久| 欧美极品少妇xxxxⅹ高跟鞋| 国产精品美女久久久久av爽李琼| 中文字幕日韩欧美一区二区三区| 最近日韩中文字幕| 亚洲成人在线观看视频| 免费看日韩精品| 国产乱人伦偷精品视频免下载| 不卡一区二区中文字幕| 色琪琪一区二区三区亚洲区| 在线播放视频一区| 久久久久国产精品人| 亚洲色图.com| 日日欢夜夜爽一区| 国产高清不卡一区二区| 一本到高清视频免费精品| 91 com成人网| 国产免费观看久久| 亚洲一区二区欧美日韩| 青青草原综合久久大伊人精品 | 日韩专区一卡二卡| 国产成人综合亚洲91猫咪| 日本道色综合久久| 欧美一级专区免费大片| 欧美激情一区二区三区不卡| 天天综合天天做天天综合| 国产成人精品aa毛片| 欧美日韩中文国产| 国产精品三级视频| 日韩黄色免费电影| 成人av资源在线观看| 欧美丰满少妇xxxbbb| 国产精品灌醉下药二区| 免费av网站大全久久| 91在线码无精品| 久久精品人人做人人综合| 亚洲地区一二三色| 成人看片黄a免费看在线| 91精品国产91久久久久久一区二区| 综合激情成人伊人|