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

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

?? device.c

?? wince下的源代碼集合打包
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* File:    device.c * * Purpose: WinCE device manager * * Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved. *///// This module contains these functions://  FS_RegisterDevice//  RegisterDeviceEx//  DoFreeFSD//  DoFreeDevice//  WaitForFSDs//  NotifyFSDs//  IsValidDevice//  FS_DeregisterDevice//  FS_ActivateDevice//  FindActiveByHandle//  FS_DeactivateDevice//  GetFSD//  FormatDeviceName//  LoadFSDThread//  FS_LoadFSD//  FS_LoadFSDEx//  FS_CeResyncFilesys//  FS_PowerAllDevices//  FS_GetDeviceByIndex//  FS_CreateDeviceHandle//  FS_DevCloseFileHandle//  FS_DevReadFile//  FS_DevWriteFile//  FS_DevSetFilePointer//  FS_DevDeviceIoControl//  FS_DevGetFileSize//  FS_DevGetFileInformation//  FS_DevFlushFileBuffers//  FS_DevGetFileTime//  FS_DevSetFileTime//  FS_DevSetEndOfFile//  FS_DevProcNotify//  FS_CloseAllDeviceHandles//  WinMain//#include <device.h>#include <devload.h>#include <devloadp.h>#include <cardserv.h>#include <console.h>#ifdef TARGET_NT#include <devemul.h>#include "proxy.h"#endif#ifdef INSTRUM_DEV#include <instrumd.h>#else#define ENTER_INSTRUM#define EXIT_INSTRUM_INIT#define EXIT_INSTRUM_DEINIT#define EXIT_INSTRUM_POWERDOWN#define EXIT_INSTRUM_POWERUP#define EXIT_INSTRUM_OPEN#define EXIT_INSTRUM_CLOSE#define EXIT_INSTRUM_READ#define EXIT_INSTRUM_WRITE#define EXIT_INSTRUM_SEEK#define EXIT_INSTRUM_IOCONTROL#endif // INSTRUM_DEV/* Device driver implementation *///      @doc    EXTERNAL OSDEVICE KERNEL//      @module device.c - device driver support | Device driver support functions.//      @topic WinCE Device Drivers | There are two types of device drivers.  The//      first type are specialized drivers.  These are keyboard, mouse/touch screen,//      and display drivers.  These drivers have specialized interfaces.  The other//      type of driver is the stream based device driver model.  Drivers following the//      stream based model will need to export several functions and be initialized//      before they can be used.  They can be accessed through standard file APIs such//      as OpenFile.  The driver dll must export a set of entrypoints of the form//      ttt_api, where ttt is the device id passed in lpszType to RegisterDevice, and//      api is a required or optional API.  The APIs required are: Init, Deinit, Open,//      Close, Read, Write, Seek, and IOCtl.//  Drivers which need interrupts can use kernel exported interrupt support //  routines. To understand the interrupt model and functions please look at//  <l Interrupt Support.Kernel Interrupt Support>//      @xref <f RegisterDevice> <f DeregisterDevice> //         <l Interrupt Support.Kernel Interrupt Support>//	notes on handling of unloading of dlls while threads are in those dlls://	1> routines which take the device critical section before calling into a dll do not need to//		adjust the reference count since the deregister call takes the critical section//	2> routines which do not take the device critical section do the following://		a> check if the device is still valid [ if (fsodev->lpDev) ]//		b> if so, increment the reference count, so dodec = 1, make call, decrement the reference count,//			set dodec = 0//		c> we assume we will not fault in the interlockedDecrement, since once we've succeeded in the//			increment, we know we won't fault on the decrement since nobody will be LocalFree'ing the device//		d> if we fault inside the actual function call, we'll do the decrement due to the dodec flag// 	3> We signal an event when we put someone on the DyingDevs list.  We can just poll from that point onwards//		since (1) it's a rare case and (2) it's cheaper than always doing a SetEvent if you decrement the//		reference count to 0.CRITICAL_SECTION g_devcs;LIST_ENTRY g_DevChain;LIST_ENTRY g_DyingDevs;fsopendev_t *g_lpOpenDevs;fsopendev_t *g_lpDyingOpens;HANDLE g_hDevApiHandle, g_hDevFileApiHandle, g_hCleanEvt, g_hCleanDoneEvt;fsd_t *g_lpFSDChain;//// Devload.c and pcmcia.c //typedef DWORD (*SYSTEMPOWER)(DWORD);extern SYSTEMPOWER pfnSystemPower;extern void DevloadInit(void);extern void DevloadPostInit(void);extern BOOL I_DeactivateDevice(HANDLE hDevice, LPWSTR ActivePath);extern HANDLE StartOneDriver(LPTSTR RegPath, LPTSTR PnpId,                  DWORD LoadOrder, DWORD ClientInfo, CARD_SOCKET_HANDLE hSock);#ifndef TARGET_NTconst PFNVOID FDevApiMethods[] = {	(PFNVOID)FS_DevProcNotify,	(PFNVOID)0,	(PFNVOID)FS_RegisterDevice,	(PFNVOID)FS_DeregisterDevice,	(PFNVOID)FS_CloseAllDeviceHandles,	(PFNVOID)FS_CreateDeviceHandle,	(PFNVOID)FS_LoadFSD,	(PFNVOID)FS_ActivateDevice,	(PFNVOID)FS_DeactivateDevice,	(PFNVOID)FS_LoadFSDEx,	(PFNVOID)FS_GetDeviceByIndex,	(PFNVOID)FS_CeResyncFilesys,};#define NUM_FDEV_APIS (sizeof(FDevApiMethods)/sizeof(FDevApiMethods[0]))const DWORD FDevApiSigs[NUM_FDEV_APIS] = {	FNSIG3(DW, DW, DW),                     // ProcNotify	FNSIG0(),	FNSIG4(PTR, DW, PTR, DW),       // RegisterDevice	FNSIG1(DW),                                     // DeregisterDevice	FNSIG0(),                                       // CloseAllDeviceHandles	FNSIG4(PTR, DW, DW, DW),            // CreateDeviceHandle	FNSIG2(PTR, PTR),            // LoadFSD	FNSIG2(PTR, DW),       // ActivateDevice	FNSIG1(DW),            // DeactivateDevice	FNSIG3(PTR, PTR, DW),	//LoadFSDEx	FNSIG2(DW, PTR),		// GetDeviceByIndex	FNSIG1(DW),	// CeResyncFilesys};const PFNVOID DevFileApiMethods[] = {    (PFNVOID)FS_DevCloseFileHandle,    (PFNVOID)0,    (PFNVOID)FS_DevReadFile,    (PFNVOID)FS_DevWriteFile,    (PFNVOID)FS_DevGetFileSize,    (PFNVOID)FS_DevSetFilePointer,    (PFNVOID)FS_DevGetFileInformationByHandle,	(PFNVOID)FS_DevFlushFileBuffers,	(PFNVOID)FS_DevGetFileTime,	(PFNVOID)FS_DevSetFileTime,	(PFNVOID)FS_DevSetEndOfFile,	(PFNVOID)FS_DevDeviceIoControl,};#define NUM_FAPIS (sizeof(DevFileApiMethods)/sizeof(DevFileApiMethods[0]))const DWORD DevFileApiSigs[NUM_FAPIS] = {    FNSIG1(DW),                                 // CloseFileHandle    FNSIG0(),    FNSIG5(DW,PTR,DW,PTR,PTR),  // ReadFile    FNSIG5(DW,PTR,DW,PTR,PTR),  // WriteFile    FNSIG2(DW,PTR),                             // GetFileSize    FNSIG4(DW,DW,PTR,DW),               // SetFilePointer    FNSIG2(DW,PTR),                             // GetFileInformationByHandle	FNSIG1(DW),                                     // FlushFileBuffers	FNSIG4(DW,PTR,PTR,PTR),         // GetFileTime	FNSIG4(DW,PTR,PTR,PTR),         // SetFileTime	FNSIG1(DW),                                     // SetEndOfFile,	FNSIG8(DW, DW, PTR, DW, PTR, DW, PTR, PTR), // DeviceIoControl};#endif // TARGET_NTPFNVOID FS_GetProcAddr(LPCWSTR type, LPCWSTR lpszName, HINSTANCE hInst) {	WCHAR fullname[32];	memcpy(fullname,type,3*sizeof(WCHAR));	fullname[3] = L'_';	wcscpy(&fullname[4],lpszName);	return (PFNVOID)GetProcAddress(hInst,fullname);}//      @func   HANDLE | RegisterDevice | Register a new device//  @parm       LPCWSTR | lpszType | device id (SER, PAR, AUD, etc) - must be 3 characters long//  @parm       DWORD | dwIndex | index between 0 and 9, ie: COM2 would be 2//  @parm       LPCWSTR | lpszLib | dll containing driver code//  @parm       DWORD | dwInfo | instance information//      @rdesc  Returns a handle to a device, or 0 for failure.  This handle should//                      only be passed to DeregisterDevice.//      @comm   For stream based devices, the drivers will be .dll or .drv files.//                      Each driver is initialized by//                      a call to the RegisterDevice API (performed by the server process).//                      The lpszLib parameter is what will be to open the device.  The//                      lpszType is a three character string which is used to identify the //                      function entry points in the DLL, so that multiple devices can exist//                      in one DLL.  The lpszLib is the name of the DLL which contains the//                      entry points.  Finally, dwInfo is passed in to the init routine.  So,//                      if there were two serial ports on a device, and comm.dll was the DLL//                      implementing the serial driver, it would be likely that there would be//                      the following init calls:<nl>//                      <tab>h1 = RegisterDevice(L"COM", 1, L"comm.dll",0x3f8);<nl>//                      <tab>h2 = RegisterDevice(L"COM", 2, L"comm.dll",0x378);<nl>//                      Most likely, the server process will read this information out of a//                      table or registry in order to initialize all devices at startup time.//      @xref <f DeregisterDevice> <l Overview.WinCE Device Drivers>//HANDLEFS_RegisterDevice(    LPCWSTR lpszType,    DWORD   dwIndex,    LPCWSTR lpszLib,    DWORD   dwInfo    ){    return RegisterDeviceEx(                lpszType,                dwIndex,                lpszLib,                dwInfo,                MAX_LOAD_ORDER+1                );}HANDLERegisterDeviceEx(    LPCWSTR lpszType,    DWORD dwIndex,    LPCWSTR lpszLib,    DWORD dwInfo,    DWORD dwLoadOrder    ){	HANDLE hDev = 0;	fsdev_t *lpdev = 0, *lpTrav;	DWORD retval = 0;	DEBUGMSG(ZONE_DYING, (TEXT("DEVICE: About to wait on CleanDoneEvt.\r\n")));	// Need to wait for any filesystem devices to finish getting deregistered 	// before we go ahead and register them again. This gets around problems	// with storage card naming. 	retval = WaitForSingleObject(g_hCleanDoneEvt, 5000);	DEBUGMSG(ZONE_DYING, (TEXT("DEVICE: Got CleanDoneEvt.\r\n")));		ASSERT(retval != WAIT_TIMEOUT);		retval = ERROR_SUCCESS;	// Initialize for success	if (dwIndex > 9) {		retval = ERROR_INVALID_PARAMETER;		goto errret;	}	if (!(lpdev = LocalAlloc(LPTR,sizeof(fsdev_t)))) {		retval = ERROR_OUTOFMEMORY;		goto errret;	}		__try {        memset(lpdev, 0, sizeof(fsdev_t));        memcpy(lpdev->type,lpszType,sizeof(lpdev->type));		lpdev->index = dwIndex;		if (!(lpdev->hLib = LoadDriver(lpszLib))) {			retval = ERROR_FILE_NOT_FOUND;		} else {			if (!(lpdev->fnInit = (pInitFn)FS_GetProcAddr(lpdev->type,L"Init",lpdev->hLib)) ||				!(lpdev->fnDeinit = (pDeinitFn)FS_GetProcAddr(lpdev->type,L"Deinit",lpdev->hLib)) ||				!(lpdev->fnOpen = (pOpenFn)FS_GetProcAddr(lpdev->type,L"Open",lpdev->hLib)) ||				!(lpdev->fnClose = (pCloseFn)FS_GetProcAddr(lpdev->type,L"Close",lpdev->hLib)) ||				!(lpdev->fnRead = (pReadFn)FS_GetProcAddr(lpdev->type,L"Read",lpdev->hLib)) ||				!(lpdev->fnWrite = (pWriteFn)FS_GetProcAddr(lpdev->type,L"Write",lpdev->hLib)) ||				!(lpdev->fnSeek = (pSeekFn)FS_GetProcAddr(lpdev->type,L"Seek",lpdev->hLib)) ||				!(lpdev->fnControl = (pControlFn)FS_GetProcAddr(lpdev->type,L"IOControl",lpdev->hLib))) {				retval = ERROR_INVALID_FUNCTION;			} else {				// Got all the required functions.  Now let's get the optional ones				lpdev->fnPowerup = (pPowerupFn)FS_GetProcAddr(lpdev->type,L"PowerUp",lpdev->hLib);				lpdev->fnPowerdn = (pPowerupFn)FS_GetProcAddr(lpdev->type,L"PowerDown",lpdev->hLib);			}		}	} __except (EXCEPTION_EXECUTE_HANDLER) {		retval = ERROR_INVALID_PARAMETER;	}	if (retval) {		goto errret;	}	// Now enter the critical section to look for it in the device list	EnterCriticalSection (&g_devcs);	__try {		//        // check for uniqueness        //        for (lpTrav = (fsdev_t *)g_DevChain.Flink;             lpTrav != (fsdev_t *)&g_DevChain;             lpTrav = (fsdev_t *)(lpTrav->list.Flink)) {            if (!memcmp(lpTrav->type,lpdev->type,sizeof(lpdev->type)) &&               (lpTrav->index == lpdev->index)) {                retval = ERROR_DEVICE_IN_USE;				break;            }		}	} __except (EXCEPTION_EXECUTE_HANDLER) {		retval = ERROR_INVALID_PARAMETER;	}	LeaveCriticalSection(&g_devcs);	if (retval) {		goto errret;	}		__try {		ENTER_INSTRUM {			lpdev->dwData = lpdev->fnInit(dwInfo);		} EXIT_INSTRUM_INIT;		if (!(lpdev->dwData)) {			retval = ERROR_OPEN_FAILED;		} else {			// Sucess			lpdev->PwrOn = TRUE;			lpdev->dwLoadOrder = dwLoadOrder;		}	} __except (EXCEPTION_EXECUTE_HANDLER) {		retval = ERROR_INVALID_PARAMETER;	}	if (retval) {		goto errret;	}	EnterCriticalSection(&g_devcs);	__try {        //        // Insert according to LoadOrder        //        for (lpTrav = (fsdev_t *)g_DevChain.Flink;             lpTrav != (fsdev_t *)&g_DevChain;             lpTrav = (fsdev_t *)(lpTrav->list.Flink)) {            if (lpTrav->dwLoadOrder >= dwLoadOrder) {                InsertHeadList((PLIST_ENTRY)lpTrav, (PLIST_ENTRY)lpdev);				break;            }        }		if (lpTrav == (fsdev_t *)&g_DevChain) {			// insert at the end			InsertTailList(&g_DevChain, (PLIST_ENTRY)lpdev);		}        hDev = (HANDLE)lpdev;	} __except (EXCEPTION_EXECUTE_HANDLER) {		retval = ERROR_INVALID_PARAMETER;	}	LeaveCriticalSection(&g_devcs);errret:	#ifdef DEBUG    if (ZONE_ACTIVE) {        if (hDev != NULL) {            DEBUGMSG(ZONE_ACTIVE, (TEXT("DEVICE: Name   Load Order\r\n")));            //            // Display the list of devices in ascending load order.            //			EnterCriticalSection(&g_devcs);            for (lpTrav = (fsdev_t *)g_DevChain.Flink;                 lpTrav != (fsdev_t *)&g_DevChain;                 lpTrav = (fsdev_t *)(lpTrav->list.Flink)) {                DEBUGMSG(ZONE_ACTIVE, (TEXT("DEVICE: %c%c%c%d:  %d\r\n"),                         lpTrav->type[0], lpTrav->type[1], lpTrav->type[2],                         lpTrav->index, lpTrav->dwLoadOrder));            }			LeaveCriticalSection(&g_devcs);        }    }#endif	// If we failed then let's clean up the module and data	if (retval) {		SetLastError (retval);		if (lpdev) {			if (lpdev->hLib) {				FreeLibrary(lpdev->hLib);			}			LocalFree (lpdev);		}	}	return hDev;}void DoFreeFSD(pfsd_t pfsd){    pfsd_t pfsd1;    if (pfsd->cFSDDevices <= 0) {        FreeLibrary(pfsd->hFSDLib);        if (pfsd == g_lpFSDChain) {            g_lpFSDChain = pfsd->next;            LocalFree(pfsd);            return;        } else {            pfsd1 = g_lpFSDChain;            while (pfsd1) {                if (pfsd1->next == pfsd) {                    pfsd1->next = pfsd->next;                    LocalFree(pfsd);                    return;                }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费一区二区三区视频| 蜜桃av一区二区三区| 一区二区三区在线高清| 五月综合激情网| 国产伦精品一区二区三区视频青涩 | 午夜亚洲福利老司机| 麻豆国产精品一区二区三区| 97se狠狠狠综合亚洲狠狠| 日韩一区二区麻豆国产| 自拍偷自拍亚洲精品播放| 免费成人美女在线观看.| 99久久99精品久久久久久| 精品三级在线观看| 亚洲国产精品久久不卡毛片| 成人在线视频首页| 日韩欧美一区电影| 亚洲国产另类av| 99久久久精品| 亚洲电影中文字幕在线观看| 99久久精品免费精品国产| 国产亚洲va综合人人澡精品| 久久精品国产精品青草| 欧美精品一卡两卡| 91国在线观看| 国产精品91一区二区| 精品视频在线免费观看| 国产精品人成在线观看免费| 国产在线播放一区二区三区| 欧美蜜桃一区二区三区| 一二三区精品视频| 色呦呦日韩精品| 亚洲欧美一区二区视频| av网站一区二区三区| 国产欧美一区二区精品性| 国产一区二区三区四区五区美女| 91精品国产综合久久蜜臀| 日韩国产欧美一区二区三区| 欧美欧美欧美欧美| 天天操天天色综合| 欧美一级片免费看| 免费观看在线综合| 精品奇米国产一区二区三区| 九色|91porny| 国产亚洲1区2区3区| 成人精品一区二区三区中文字幕| 国产精品国产三级国产aⅴ入口| 成人福利在线看| 亚洲人成人一区二区在线观看| 99riav一区二区三区| 亚洲伊人伊色伊影伊综合网| 欧美日韩亚洲另类| 日韩成人一级大片| 精品国产百合女同互慰| 国产高清不卡一区二区| 亚洲视频免费观看| 欧美日韩亚洲综合一区二区三区| 蜜臀av性久久久久av蜜臀妖精 | 国产精品亚洲一区二区三区在线| 久久久久国产精品人| 成人午夜伦理影院| 亚洲一区二区三区小说| 日韩西西人体444www| 豆国产96在线|亚洲| 亚洲日本欧美天堂| 欧美一区二区久久久| 粉嫩久久99精品久久久久久夜| 亚洲精品国产a久久久久久| 欧美肥胖老妇做爰| 丰满放荡岳乱妇91ww| 亚洲国产aⅴ成人精品无吗| 精品国产伦一区二区三区免费| 成人久久久精品乱码一区二区三区| 亚洲综合视频在线观看| 久久综合视频网| 色呦呦国产精品| 极品销魂美女一区二区三区| 亚洲人成人一区二区在线观看| 制服丝袜国产精品| 成人av动漫网站| 另类欧美日韩国产在线| 亚洲色图视频网| 久久蜜臀中文字幕| 欧美日韩精品一区二区三区蜜桃| 国产精品一二三在| 爽好久久久欧美精品| 中文字幕中文在线不卡住| 日韩欧美视频在线| 欧美综合色免费| 成人动漫在线一区| 国产精品一区在线| 日本一不卡视频| 亚洲一区在线看| 亚洲视频一区在线| 欧美激情一区二区三区| 日韩欧美国产不卡| 欧美另类一区二区三区| 一本一道波多野结衣一区二区| 国产乱子伦一区二区三区国色天香| 夜夜嗨av一区二区三区中文字幕| 久久精品欧美一区二区三区麻豆| 欧美日韩综合一区| 一本在线高清不卡dvd| 成人久久视频在线观看| 国产成人av资源| 国内精品写真在线观看 | 日韩vs国产vs欧美| 本田岬高潮一区二区三区| 日本不卡的三区四区五区| 亚洲青青青在线视频| 亚洲国产高清aⅴ视频| 精品国产91亚洲一区二区三区婷婷 | 一本到不卡精品视频在线观看| 国产黄色成人av| 九色综合狠狠综合久久| 蜜臀va亚洲va欧美va天堂| 日韩在线一二三区| 午夜亚洲国产au精品一区二区| 一区二区三区资源| 一区二区三区日韩精品视频| 亚洲色图视频免费播放| 亚洲女子a中天字幕| 免费在线欧美视频| 丝袜美腿一区二区三区| 奇米影视在线99精品| 日韩有码一区二区三区| 日本vs亚洲vs韩国一区三区| 日韩av在线发布| 蜜乳av一区二区三区| 精品一区二区精品| 国产成+人+日韩+欧美+亚洲| 成人性生交大片免费看中文 | 国产在线日韩欧美| 国产成人在线看| 99re8在线精品视频免费播放| 91论坛在线播放| 欧美在线观看视频一区二区| 欧美日韩亚洲综合在线| 日韩西西人体444www| 久久女同性恋中文字幕| 《视频一区视频二区| 亚洲一区二区三区四区的| 日韩高清在线电影| 国产伦精一区二区三区| 色香蕉久久蜜桃| 制服丝袜一区二区三区| 国产午夜精品福利| 亚洲一区二区三区视频在线| 男人的j进女人的j一区| 丁香六月久久综合狠狠色| 色播五月激情综合网| 日韩一区二区免费电影| 日韩一区有码在线| 麻豆久久久久久久| 国产精品一级片| 蜜桃av一区二区在线观看 | 亚洲影院在线观看| 另类欧美日韩国产在线| 高清免费成人av| 欧美日韩国产精选| 久久精品亚洲麻豆av一区二区 | 91丨九色丨国产丨porny| 欧美日韩亚洲国产综合| 国产亚洲一区字幕| 国产色综合久久| 日韩欧美国产综合一区 | 久久精品视频一区| 亚洲影视在线观看| 国产精品小仙女| 欧美剧在线免费观看网站 | 精品毛片乱码1区2区3区| 日韩一区二区电影| 亚洲同性gay激情无套| 伦理电影国产精品| 97精品超碰一区二区三区| 欧美一区二区三区四区久久| 亚洲欧洲精品成人久久奇米网| 日本美女一区二区三区| 91麻豆免费看| 久久久高清一区二区三区| 午夜av电影一区| 91麻豆精品在线观看| 亚洲国产经典视频| 极品瑜伽女神91| 91精品中文字幕一区二区三区 | 欧美刺激午夜性久久久久久久| 亚洲欧美另类图片小说| 国产成人av电影在线| 欧美xxxxxxxx| 男男gaygay亚洲| 欧美乱妇20p| 亚洲成人手机在线| 色狠狠色噜噜噜综合网| 国产精品久久久久影院老司| 国产成人免费在线观看| 久久综合久久鬼色中文字| 蓝色福利精品导航| 欧美不卡一二三| 久久 天天综合| 精品国产欧美一区二区| 日本成人在线不卡视频|