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

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

?? system.c

?? WINDOWSCE4.2 ARM PXA255 SDMMC驅動程序源代碼
?? C
字號:
//
// 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:  

    system.c

Abstract:  

    WINCE driver for MultiMediaCard

Functions:

Notes:


--*/
#include <windows.h>
#include <types.h>
#include <wtypes.h>
#include <tchar.h>
#include <devload.h>
#include "diskio.h"
//#include <atapi.h>
#include <windev.h>
#include <storemgr.h>

#include "sdmmc.h"
#include "sddisk.h"


//for testing
#include <winbase.h>




//
// This module contains the necessary OS interface functions:
//  SDDiskEntry
//  CreateDiskObject
//  IsValidDisk
//  DiskFromSocket
//  GetDiskStateError
//  DSK_Init and the other device API functions
//  IsCardInserted
//  mmcinit
//

//#define TRY_FOR_8BIT 1

#ifdef DEBUG
//
// These defines must match the ZONE_* defines
//
#define DBG_ERROR      1
#define DBG_WARNING    2
#define DBG_FUNCTION   4
#define DBG_INIT       8
#define DBG_IO         32

DBGPARAM dpCurSettings = {
    TEXT("SDMMC Disk"), {
    TEXT("Errors"),TEXT("Warnings"),TEXT("Functions"),TEXT("Initialization"),
    TEXT("Undefined"),TEXT("Disk I/O"),TEXT("Undefined"),TEXT("Undefined"),
    TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),
    TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined") },
    0x1
};
#endif  // DEBUG

PDISK mmcinit(LPTSTR ActiveKey);
DWORD GetDiskStateError(DWORD DiskState);
BOOL  GetFolderName(PDISK pDisk, LPWSTR pOutBuf, DWORD nOutBufSize, DWORD * pBytesReturned);
BOOL  GetStorageID(PDISK pDisk, PSTORAGE_IDENTIFICATION pOutBuf, DWORD nOutBufSize, DWORD * pBytesReturned);
HKEY OpenDriverKey(LPTSTR ActiveKey);

extern void hw_powerup(void);
extern void hw_powerdown(void);

//
// Global Variables
//
CRITICAL_SECTION v_DiskCrit;
PDISK v_DiskList;                                       // initialized to 0 in bss
volatile PUCHAR virtime;


//
// SD.DLL entry
//
BOOL WINAPI
SDMMCDiskEntry(HINSTANCE DllInstance, DWORD Reason, LPVOID Reserved)
{
    switch(Reason) {
    case DLL_PROCESS_ATTACH:
    DEBUGREGISTER(DllInstance);
    InitializeCriticalSection(&v_DiskCrit);
    DisableThreadLibraryCalls((HMODULE) DllInstance);
//    RETAILMSG(1, (TEXT("SDMMC--DLL_PROCESS_ATTACH\r\n")));
    return TRUE;

    case DLL_PROCESS_DETACH:
    DeleteCriticalSection(&v_DiskCrit);
//    RETAILMSG(1, (TEXT("SDMMC--DLL_PROCESS_DETACH\r\n")));
    break;
    }
    return TRUE;
}   // SDMMCDiskEntry


//
// CreateDiskObject - create a DISK structure, init some fields and link it.
//
PDISK
CreateDiskObject(VOID)
{
    PDISK pDisk;

    pDisk = LocalAlloc(LPTR, sizeof(DISK));
    if (pDisk != NULL) {
    pDisk->d_OpenCount = 0;
    pDisk->d_ActivePath = NULL;
    InitializeCriticalSection(&(pDisk->d_DiskCardCrit));
    pDisk->d_DiskCardState = STATE_INITING;
    EnterCriticalSection(&v_DiskCrit);
    pDisk->d_next = v_DiskList;
    v_DiskList = pDisk;
    LeaveCriticalSection(&v_DiskCrit);
    }
    return pDisk;
}   // CreateDiskObject


//
// IsValidDisk - verify that pDisk points to something in our list
//
// Return TRUE if pDisk is valid, FALSE if not.
//
BOOL
IsValidDisk(
    PDISK pDisk
    )
{
    PDISK pd;
    bool ret = FALSE;

    EnterCriticalSection(&v_DiskCrit);
    pd = v_DiskList;
    while (pd) {
    if (pd == pDisk) {
        ret = TRUE;
        break;
    }
    pd = pd->d_next;
    }
    LeaveCriticalSection(&v_DiskCrit);
    return ret;
}   // IsValidDisk


DWORD
GetDiskStateError(
    DWORD DiskState
    )
{
#ifdef DEBUG1
    LPTSTR lpState;
    switch (DiskState) {
    case STATE_INITING:lpState = TEXT("STATE_INITING");break;
    case STATE_CLOSED:lpState = TEXT("STATE_CLOSED");break;
    case STATE_OPENED:lpState = TEXT("STATE_OPENED");break;
    case STATE_DEAD:lpState = TEXT("STATE_DEAD");break;
    case STATE_REMOVED:lpState = TEXT("STATE_REMOVED");break;
    default:lpState = TEXT("Unknown");break;
    }
    RETAILMSG(1, (TEXT("MmcDISK:GetDiskStateError: State of disk is %s=%d\r\n"), lpState, DiskState));
#endif
    
    switch (DiskState) {
    case STATE_DEAD:
    return DISK_DEAD_ERROR;

    case STATE_REMOVED:
    return DISK_REMOVED_ERROR;
    }
    return ERROR_GEN_FAILURE;
}

typedef struct _INIT_FSD_CONTEXT {
    HANDLE hDevice;
    TCHAR FSDll[256];
} INIT_FSD_CONTEXT, * PINIT_FSD_CONTEXT;

//
// File system device entrypoints (DSK_????)
//

//
// Returns context data (PDISK) for this Init instance or 0 for failure.
//
// Arguments:
//      dwContext - registry path for this device's active key
//
DWORD
DSK_Init(
    DWORD dwContext
    )
{


//    RETAILMSG(1, (TEXT("MmcDISK: DSK_Init\r\n")));

    return (DWORD)mmcinit((LPTSTR)dwContext);
}   // DSK_Init


bool
DSK_Close(
    DWORD Handle
    )
{
    bool bClose = TRUE;
    PDISK pDisk = (PDISK)Handle;

    DEBUGMSG(ZONE_IO, (TEXT("MmcDISK: DSK_Close\r\n")));

    if (!IsValidDisk(pDisk)) {
    return FALSE;
    }

    if (pDisk->d_DiskCardState == STATE_OPENED) {
    EnterCriticalSection(&(pDisk->d_DiskCardCrit));
    pDisk->d_OpenCount--;
    if (pDisk->d_OpenCount == 0) {
        pDisk->d_DiskCardState = STATE_CLOSED;
    } else {
        bClose = FALSE;
    }
    LeaveCriticalSection(&(pDisk->d_DiskCardCrit));
    }
    return TRUE;
}   // DSK_Close


//
// Device deinit - devices are expected to close down.
// The device manager does not check the return code.
//
bool
DSK_Deinit(
    DWORD dwContext     // pointer to the per disk structure
    )
{
    PDISK pDisk = (PDISK)dwContext;


    DSK_Close(dwContext);
    CloseDisk(pDisk);
    return TRUE;
}   // DSK_Deinit

//
// Returns handle value for the open instance.
//
DWORD
DSK_Open(
    DWORD dwData,
    DWORD dwAccess,
    DWORD dwShareMode
    )
{
    PDISK pDisk = (PDISK)dwData;
    DWORD rett = 0;



    if (IsValidDisk(pDisk) == FALSE) {
    DEBUGMSG(ZONE_IO, (TEXT("MmcDisk DSK_Open - Passed invalid disk handle\r\n")));
    return rett;
    }

    if ((pDisk->d_DiskCardState != STATE_CLOSED) &&
    (pDisk->d_DiskCardState != STATE_OPENED)) {
    SetLastError(GetDiskStateError(pDisk->d_DiskCardState));
    return rett;
    }

    EnterCriticalSection(&(pDisk->d_DiskCardCrit));
    if (pDisk->d_DiskCardState == STATE_CLOSED) {
    pDisk->d_DiskCardState = STATE_OPENED;
    }
    rett = (DWORD)pDisk;
    pDisk->d_OpenCount++;
    LeaveCriticalSection(&(pDisk->d_DiskCardCrit));

    return rett;
}   // DSK_Open


//
// I/O Control function - responds to info, read and write control codes.
// The read and write take a scatter/gather list in pInBuf
//
BOOL
DSK_IOControl(
    DWORD Handle,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
    PDISK pDisk = (PDISK)Handle;
    PSG_REQ pSG;


    if (IsValidDisk(pDisk) == FALSE) {
    SetLastError(ERROR_INVALID_HANDLE);
    return FALSE;
    }

    if (pDisk->d_DiskCardState != STATE_OPENED) {
    SetLastError(GetDiskStateError(pDisk->d_DiskCardState));
    return FALSE;
    }

    //
    // Check parameters
    //
    switch (dwIoControlCode) {
    case DISK_IOCTL_READ:
    case DISK_IOCTL_WRITE:
    case DISK_IOCTL_GETINFO:
    case DISK_IOCTL_SETINFO:
    case DISK_IOCTL_INITIALIZED:
    case IOCTL_DISK_READ:
    case IOCTL_DISK_WRITE:
    case IOCTL_DISK_GETINFO:
    case IOCTL_DISK_SETINFO:
    case IOCTL_DISK_INITIALIZED:
    case IOCTL_DISK_DEVICE_INFO:
    if (pInBuf == NULL) {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }
    break;

    case DISK_IOCTL_GETNAME:
    //case DISK_IOCTL_IDENTIFY:
    case IOCTL_DISK_GET_STORAGEID:  // this is a new op, so use new codes //
		if (pOutBuf == NULL) {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }
    break;
    case DISK_IOCTL_FORMAT_MEDIA:
    SetLastError(ERROR_SUCCESS);
    return TRUE;
    
    default:
    SetLastError(ERROR_INVALID_PARAMETER);
    return FALSE;
    }

    switch (dwIoControlCode) {
    case DISK_IOCTL_READ:
    case DISK_IOCTL_WRITE:
    case IOCTL_DISK_READ:
    case IOCTL_DISK_WRITE:
		pSG = (PSG_REQ)pInBuf;
    
    DoDiskIO(pDisk, dwIoControlCode, pSG);
    if (pSG->sr_status) {
        SetLastError(pSG->sr_status);
        return FALSE;
    }
    return TRUE;

    case DISK_IOCTL_GETINFO:
    SetLastError(GetDiskInfo(pDisk, (PDISK_INFO)pInBuf));
    return TRUE;

    case DISK_IOCTL_SETINFO:
    SetLastError(SetDiskInfo(pDisk, (PDISK_INFO)pInBuf));
    return TRUE;

    case DISK_IOCTL_FORMAT_MEDIA:
    SetLastError(ERROR_SUCCESS);
    return TRUE;
  
    case DISK_IOCTL_GETNAME:
    return GetFolderName(pDisk, (LPWSTR)pOutBuf, nOutBufSize, pBytesReturned);

    case IOCTL_DISK_DEVICE_INFO:
    {
        PSTORAGEDEVICEINFO psdi = (PSTORAGEDEVICEINFO)pInBuf;
        if (nInBufSize == sizeof(STORAGEDEVICEINFO)) {
            wcscpy( psdi->szProfile, L"SDMMC");
            psdi->dwDeviceClass = STORAGE_DEVICE_CLASS_BLOCK;
            psdi->dwDeviceType |= STORAGE_DEVICE_TYPE_REMOVABLE_MEDIA;
            psdi->dwDeviceType |= STORAGE_DEVICE_TYPE_UNKNOWN;
            psdi->dwDeviceFlags |= STORAGE_DEVICE_FLAG_READWRITE;
            if (pBytesReturned)
                *pBytesReturned = sizeof(STORAGEDEVICEINFO);
            return TRUE;
        } else {
            SetLastError( ERROR_INVALID_PARAMETER);
            return FALSE;
        }
    }    
    

    case IOCTL_DISK_GET_STORAGEID:
    return GetStorageID(pDisk,
                (PSTORAGE_IDENTIFICATION)pOutBuf,
                nOutBufSize,
                pBytesReturned);


    default:
    SetLastError(ERROR_INVALID_PARAMETER);
    return FALSE;
    }
}   // DSK_IOControl


DWORD DSK_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD DSK_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD DSK_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod){return 0;}
void DSK_PowerUp(void)
{
	hw_powerup();
}
void DSK_PowerDown(void) 
{
	hw_powerdown();
}


//
// Returns TRUE if the MMC card is inserted
//
bool
IsCardInserted(
    PDISK pDisk
    )
{
    INT16 logical_drive;

    logical_drive = (0xFFFF & (INT16)pDisk->d_DrvNo); 


    // Check for MMC card presenting and working
    if (is_device_changed (logical_drive))
    return FALSE;

    return TRUE;

}   // IsCardInserted


//
// mmcinit:
//
// ActivePath is the registry path to our device's active key under
// HKEY_LOCAL_MACHINE\Drivers\Active
// Allocate storage to hold a copy of this and point pDisk->d_ActivePath
// to it. This will be used in getfoldername call.
//
// Return pointer to new disk structure or NULL.
//
PDISK
mmcinit(
    LPTSTR ActiveKey
    )
{
    DWORD status;
    PDISK pDisk;
    HKEY hKey;

    pDisk = CreateDiskObject();
    if (pDisk == NULL) {
    RETAILMSG(1, (TEXT("MmcDisk LocalAlloc(PDISK) failed %d\r\n"), GetLastError()));
    return NULL;
    }
    if (pDisk->d_ActivePath = LocalAlloc(LPTR, wcslen(ActiveKey)*sizeof(WCHAR)+sizeof(WCHAR))) {
    wcscpy(pDisk->d_ActivePath, ActiveKey);
    }


	hKey = OpenDriverKey( ActiveKey);
	RegCloseKey( hKey);
    //
    // InitDisk 
    //
    status = InitDisk(pDisk);
    if (status) {
    goto ci_fail;
    }



    if (pDisk->d_DiskCardState == STATE_INITING) {
    pDisk->d_DiskCardState = STATE_CLOSED;
    return pDisk;
    }


ci_fail:
/*    pDisk->d_pDataReg = NULL;*/


    CloseDisk(pDisk);
    return NULL;
}   // mmcinit

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
6080亚洲精品一区二区| 亚洲国产精品一区二区久久恐怖片 | 国产精品丝袜一区| 日韩精品在线一区| 欧美一级搡bbbb搡bbbb| 99精品欧美一区| 日韩欧美激情在线| 91丝袜美女网| 久久国产视频网| 男男视频亚洲欧美| 亚洲第一久久影院| 日韩极品在线观看| 蜜臀av国产精品久久久久 | 国产一区日韩二区欧美三区| 理论电影国产精品| 国产精品99久| www.亚洲精品| 欧美日韩在线播放一区| 欧美一区二区视频免费观看| 在线综合视频播放| 久久一区二区视频| 中文字幕一区二区日韩精品绯色| 国产精品国产三级国产普通话99 | 香蕉加勒比综合久久| 亚洲第一搞黄网站| 黄色小说综合网站| 成人免费三级在线| 在线观看视频一区二区| 日韩欧美一区在线观看| 欧美一区二区三区系列电影| 久久青草国产手机看片福利盒子| 中文字幕人成不卡一区| 日韩成人精品在线| 97久久精品人人做人人爽| 欧美日韩精品专区| 久久久影视传媒| 亚洲精品亚洲人成人网在线播放| 免费成人你懂的| 99免费精品在线| 欧美一区日本一区韩国一区| 中文字幕日韩一区二区| 美女网站视频久久| 欧美影院精品一区| 亚洲国产高清在线| www.成人网.com| 欧美日韩情趣电影| 国产精品成人免费| 麻豆久久一区二区| 欧洲精品一区二区| 国产精品久久久久久久久图文区| 午夜欧美大尺度福利影院在线看| 国产乱码精品一区二区三区五月婷| 国产99精品国产| 欧美一级欧美三级| 一区二区久久久久| 国产一区二区三区四区在线观看| 欧美人与z0zoxxxx视频| 亚洲美女在线一区| 国产suv精品一区二区883| 日韩精品一区二区三区蜜臀| 亚洲自拍都市欧美小说| 不卡一区在线观看| 久久久久88色偷偷免费| 视频一区国产视频| 欧美视频一区二区三区在线观看| 精品欧美乱码久久久久久1区2区| 日韩va亚洲va欧美va久久| 在线观看日韩电影| 夜夜嗨av一区二区三区网页| 91在线一区二区| 亚洲激情男女视频| 欧美综合一区二区三区| 亚洲精品福利视频网站| 一本色道久久综合精品竹菊| 亚洲人亚洲人成电影网站色| 99国产精品久久久| ㊣最新国产の精品bt伙计久久| 国产不卡在线播放| 国产精品丝袜在线| 91免费观看在线| 亚洲成人免费影院| 5858s免费视频成人| 日本在线观看不卡视频| 日韩欧美一级二级三级| 久久精品国产色蜜蜜麻豆| 精品国产91久久久久久久妲己| 久久草av在线| 中国色在线观看另类| www.日韩大片| 五月激情六月综合| 精品日韩欧美在线| 99免费精品在线观看| 亚洲一区二区中文在线| 欧美一级夜夜爽| 国产精品综合二区| 亚洲美女免费视频| 26uuu欧美| 99精品国产一区二区三区不卡| 伊人夜夜躁av伊人久久| 91精品午夜视频| 成人午夜视频福利| 亚洲国产aⅴ成人精品无吗| 日韩精品一区国产麻豆| 成人精品小蝌蚪| 亚洲成人免费在线观看| 精品国产91洋老外米糕| 色噜噜狠狠一区二区三区果冻| 肉色丝袜一区二区| 国产精品久久久久精k8| 3d动漫精品啪啪一区二区竹菊| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 中文字幕一区二区在线播放| 欧美亚洲综合网| 高清在线观看日韩| 亚洲18女电影在线观看| 中文一区在线播放 | 久久国内精品自在自线400部| 国产精品人人做人人爽人人添| 欧美日韩三级一区| zzijzzij亚洲日本少妇熟睡| 免费观看成人鲁鲁鲁鲁鲁视频| 中文字幕亚洲不卡| 久久综合精品国产一区二区三区 | 国产一区二区免费视频| 亚洲综合在线五月| 国产欧美日韩在线视频| 51午夜精品国产| 在线国产亚洲欧美| 成人的网站免费观看| 国产资源精品在线观看| 石原莉奈在线亚洲二区| 亚洲精品久久久蜜桃| 国产精品免费免费| 精品国产自在久精品国产| 欧美色网一区二区| 91国在线观看| 成人av电影免费在线播放| 国产精品888| 国产精品一区在线观看乱码| 亚洲成人激情综合网| 一级做a爱片久久| 中文字幕中文字幕一区| 国产精品色婷婷| 国产精品免费丝袜| 欧美国产精品久久| 亚洲综合精品久久| 亚洲人吸女人奶水| 一区二区三区四区av| 国产精品久久久久久久久动漫| 欧美激情中文字幕| 久久精品免视看| 久久久www成人免费无遮挡大片| 欧美精品v日韩精品v韩国精品v| 欧美日韩另类一区| 欧美美女一区二区在线观看| 欧美日韩精品一区二区三区 | 国产精品视频一区二区三区不卡| 久久久久久久久久久久电影| 777午夜精品免费视频| 欧美日韩国产精品自在自线| 欧美在线看片a免费观看| 在线精品亚洲一区二区不卡| 91国模大尺度私拍在线视频| 91麻豆精品一区二区三区| 成人动漫在线一区| 91蜜桃免费观看视频| 欧美性猛片xxxx免费看久爱| 91浏览器入口在线观看| 欧美色网站导航| 欧美大胆一级视频| 亚洲国产成人自拍| 制服丝袜中文字幕亚洲| 欧美一区午夜视频在线观看| 久久久亚洲精品一区二区三区| 欧美经典一区二区| 亚洲午夜一区二区三区| 久久99久久久久| 99久久婷婷国产综合精品电影| 色综合久久久久网| 日韩三级av在线播放| 91网址在线看| 日韩情涩欧美日韩视频| 亚洲综合一区在线| 亚洲午夜久久久久久久久电影院| 九色综合狠狠综合久久| 成人av电影在线播放| 91精品国产综合久久久久久漫画| 久久久久久久久久久99999| 综合激情成人伊人| 九色porny丨国产精品| heyzo一本久久综合| 欧美一区二区在线视频| 最新国产精品久久精品| 蜜臀av性久久久久蜜臀aⅴ| 99在线视频精品| 欧美大度的电影原声| 一区二区三区欧美激情| 国产美女精品一区二区三区| 欧美日韩你懂得| 亚洲精品网站在线观看|