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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? devload.c

?? wince3.0的源碼
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/* File:    devload.c
 *
 * Purpose: WinCE device manager initialization and built-in device management
 *
 * Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.
 */
#include <windows.h>
#include <types.h>
#include <winreg.h>
#include <tchar.h>
#include <device.h>
#include <devload.h>
#include <devloadp.h>
#include <cardserv.h>
#ifndef TARGET_NT
#include <dbt.h>
#include <tapi.h>
#include <tspi.h>
#include <tapicomn.h>
#include <notify.h>
#include <windev.h>
#else
#include <devemul.h>
#endif // TARGET_NT

//
// Functions:
//  DevicePostInit
//  CallTapiDeviceChange
//  AnnounceNewDevice
//  NotifyDevice
//  StartOneDriver
//  StartDriver
//  InitDevices
//  DevloadInit
//

extern VOID InitPCMCIA(VOID);       // pcmcia.c
extern void InitTAPIDevices(void);  // pcmcia.c
extern HANDLE v_hPcmciaDll;         // pcmcia.c
extern CRITICAL_SECTION g_devcs;    // device.c
extern LIST_ENTRY g_DevChain;       // device.c

int v_NextDeviceNum;            // Used to create active device list
HMODULE v_hTapiDLL;
HMODULE v_hCoreDLL;
BOOL g_bSystemInitd;

const TCHAR s_DllName_ValName[] = DEVLOAD_DLLNAME_VALNAME;
const TCHAR s_ActiveKey[] = DEVLOAD_ACTIVE_KEY;
const TCHAR s_BuiltInKey[] = DEVLOAD_BUILT_IN_KEY;
const TCHAR s_PcmciaKey[] = DEVLOAD_PCMCIA_KEY;

#ifdef DEBUG

//
// These defines must match the ZONE_* defines in devloadp.h
//
#define DBG_ERROR      1
#define DBG_WARNING    2
#define DBG_FUNCTION   4
#define DBG_INIT       8
#define DBG_BUILTIN    16
#define DBG_PCMCIA     32
#define DBG_ACTIVE     64
#define DBG_TAPI       128
#define DBG_FSD        256
#define DBG_DYING      512

DBGPARAM dpCurSettings = {
    TEXT("DEVLOAD"), {
    TEXT("Errors"),TEXT("Warnings"),TEXT("Functions"),TEXT("Initialization"),
    TEXT("Built-In Devices"),TEXT("PCMCIA Devices"),TEXT("Active Devices"),TEXT("TAPI stuff"),
    TEXT("File System Drvr"),TEXT("Dying Devs"),TEXT("Undefined"),TEXT("Undefined"),
    TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined") },
#ifdef TARGET_NT // Enable some debug prints.
	DBG_PCMCIA
#else 
    0
#endif // TARGET_NT
};
#endif  // DEBUG

//
// Function to call a newly registered device's post initialization
// device I/O control function.
//
VOID
DevicePostInit(
    LPTSTR DevName,
    DWORD  dwIoControlCode,
    DWORD  Handle,          // Handle from RegisterDevice
    HKEY   hDevKey
    )
{
    HANDLE hDev;
    BOOL ret;
    POST_INIT_BUF PBuf;

    DEBUGMSG(ZONE_ACTIVE,
        (TEXT("DEVICE!DevicePostInit calling CreateFile(%s)\r\n"), DevName));
    hDev = CreateFile(
                DevName,
                GENERIC_READ|GENERIC_WRITE,
                0,
                NULL,
                OPEN_EXISTING,
                0,
                NULL);
    if (hDev == INVALID_HANDLE_VALUE) {
        DEBUGMSG(ZONE_ACTIVE,
            (TEXT("DEVICE!DevicePostInit CreateFile(%s) failed %d\r\n"),
            DevName, GetLastError()));
        return;
    }

    DEBUGMSG(ZONE_ACTIVE,
        (TEXT("DEVICE!DevicePostInit calling DeviceIoControl(%s, %d)\r\n"),
         DevName, dwIoControlCode));
    PBuf.p_hDevice = (HANDLE)Handle;
    PBuf.p_hDeviceKey = hDevKey;
    ret = DeviceIoControl(
              hDev,
              dwIoControlCode,
              &PBuf,
              sizeof(PBuf),
              NULL,
              0,
              NULL,
              NULL);
    DEBUGMSG(ZONE_ACTIVE,
        (TEXT("DEVICE!DevicePostInit DeviceIoControl(%s, %d) "),
         DevName, dwIoControlCode));
    if (ret == TRUE) {
        DEBUGMSG(ZONE_ACTIVE, (TEXT("succeeded\r\n")));
    } else {
        DEBUGMSG(ZONE_ACTIVE, (TEXT("failed\r\n")));
    }
    CloseHandle(hDev);
}   // DevicePostInit



//
// Function to notify TAPI of a device change. A TAPI device has a key which
// contains a Tsp value listing the TAPI Service Provider.
//
// Returns TRUE if the device has a TAPI association.
//
BOOL
CallTapiDeviceChange(
    HKEY hActiveKey,
    LPCTSTR DevName,
    BOOL bDelete
    )
{
#ifndef TARGET_NT
    DWORD ValType;
    DWORD ValLen;
    DWORD status;
    HKEY DevKey;
    TCHAR DevKeyPath[REG_PATH_LEN];
    BOOL bTapiDevice;

typedef BOOL (WINAPI *PFN_TapiDeviceChange) (HKEY DevKey, LPCWSTR lpszDevName, BOOL bDelete);
	PFN_TapiDeviceChange pfnTapiDeviceChange;

    //
    // TAPI.DLL must be loaded first.
    //
    if (v_hTapiDLL == NULL) {
        DEBUGMSG(ZONE_TAPI|ZONE_ERROR,
            (TEXT("DEVICE!CallTapiDeviceChange TAPI.DLL not loaded yet.\r\n")));
        return FALSE;
    }

    //
    // It's a TAPI device if a subkey of the device key contains a TSP value.
    //
    ValLen = sizeof(DevKeyPath);
    status = RegQueryValueEx(            // Read Device Key Path
                hActiveKey,
                DEVLOAD_DEVKEY_VALNAME,
                NULL,
                &ValType,
                (LPBYTE)DevKeyPath,
                &ValLen);
    if (status) {
        DEBUGMSG(ZONE_INIT,
            (TEXT("DEVICE!CallTapiDeviceChange RegQueryValueEx(%s) failed %d\r\n"),
            DEVLOAD_DEVKEY_VALNAME, status));
            return FALSE;
    }

    status = RegOpenKeyEx(             // Open the Device Key
                HKEY_LOCAL_MACHINE,
                DevKeyPath,
                0,
                0,
                &DevKey);
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,
            (TEXT("DEVICE!CallTapiDeviceChange: RegOpenKeyEx(%s) returned %d\r\n"),
            DevKeyPath, status));
        return FALSE;
    }


	// Try to find the pointer to TapiDeviceChange
	pfnTapiDeviceChange = (PFN_TapiDeviceChange)GetProcAddress (v_hTapiDLL, TEXT("TapiDeviceChange"));
	if (pfnTapiDeviceChange == NULL) {
        DEBUGMSG(ZONE_TAPI,
            (TEXT("DEVICE!CallTapiDeviceChange can't get pointer to TapiDeviceChange.\r\n")));
        return FALSE;
	}
		
    bTapiDevice = pfnTapiDeviceChange(DevKey, DevName, bDelete);
    RegCloseKey(DevKey);
    return bTapiDevice;
#endif // TARGET_NT
}   // CallTapiDeviceChange


//
// Function to format and send a Windows broadcast message announcing the arrival
// or removal of a device in the system.
//
VOID
BroadcastDeviceChange(
    LPTSTR DevName,
    BOOL bNew
    )
{
#ifndef TARGET_NT
    PDEV_BROADCAST_PORT pBCast;
    DWORD len;
    LPTSTR str;
	typedef BOOL (WINAPI *PFN_SendNotifyMessageW)(HWND hWnd, UINT Msg,
											  WPARAM wParam,
											  LPARAM lParam);
	PFN_SendNotifyMessageW pfnSendNotifyMessageW;

	if (v_hCoreDLL == NULL) {
    	v_hCoreDLL = (HMODULE)LoadLibrary(TEXT("COREDLL.DLL"));
    	if (v_hCoreDLL == NULL) {
            DEBUGMSG(ZONE_TAPI|ZONE_ERROR,
                (TEXT("DEVICE!BroadcastDeviceChange unable to load CoreDLL.\r\n")));
    		return;
    	}
	}

	pfnSendNotifyMessageW = (PFN_SendNotifyMessageW)GetProcAddress(v_hCoreDLL, TEXT("SendNotifyMessageW"));
	if (pfnSendNotifyMessageW == NULL) {
		DEBUGMSG (ZONE_PCMCIA, (TEXT("Can't find SendNotifyMessage\r\n")));
		return;
	}
    //
    // Don't use GWE API functions if not there
    //
    if (IsAPIReady(SH_WMGR) == FALSE) {
        return;
    }

    len = sizeof(DEV_BROADCAST_HDR) + (_tcslen(DevName) + 1)*sizeof(TCHAR);

    pBCast = LocalAlloc(LPTR, len);
    if (pBCast == NULL) {
        return;
    }

        pBCast->dbcp_devicetype = DBT_DEVTYP_PORT;
    pBCast->dbcp_reserved = 0;
    str = (LPTSTR)&(pBCast->dbcp_name[0]);
    _tcscpy(str, DevName);
    pBCast->dbcp_size = len;

    DEBUGMSG(ZONE_PCMCIA,
        (TEXT("DEVICE!BroadcastDeviceChange Calling SendNotifyMessage for device %s\r\n"), DevName));

	// Call the function
    pfnSendNotifyMessageW(
        HWND_BROADCAST,
        WM_DEVICECHANGE,
        (bNew) ? DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE,
        (LPARAM)pBCast);

    LocalFree(pBCast);

#endif // TARGET_NT
}   // BroadcastDeviceChange


//
// Function to signal the app notification system of a device change
//
VOID
NotifyDevice(
    LPTSTR DevName,
    LPTSTR Op
    )
{
#ifndef TARGET_NT
    DWORD len;
    LPTSTR str;

    //
    // First check if shell functions can be called.
    //
    if (IsAPIReady(SH_WMGR) == FALSE) {
        DEBUGMSG(ZONE_PCMCIA,
            (TEXT("DEVICE!NotifyDevice IsAPIReady(SH_MGR i.e. GWES) returned FALSE, not calling CeEventHasOccurred(%s %s)\r\n"),
            Op, DevName));
        return;
    }

    len = (_tcslen(Op) + _tcslen(DevName) + 2)*sizeof(TCHAR);

    str = LocalAlloc(LPTR, len);
    if (str == NULL) {
        return;
    }

    //
    // Format the end of the command line
    //
    _tcscpy(str, Op);
    _tcscat(str, TEXT(" "));
    _tcscat(str, DevName);

    DEBUGMSG(ZONE_PCMCIA,
        (TEXT("DEVICE!NotifyDevice Calling CeEventHasOccurred(%s)\r\n"), str));
    CeEventHasOccurred(NOTIFICATION_EVENT_DEVICE_CHANGE, str);
    LocalFree(str);
#endif // TARGET_NT
}   // NotifyDevice


typedef struct _DEVICE_CHANGE_CONTEXT {
    TCHAR DevName[DEVNAME_LEN];
    BOOL bNew;
} DEVICE_CHANGE_CONTEXT, * PDEVICE_CHANGE_CONTEXT;


//
// Thread function to call CeEventHasOccurred and SendNotifyMessage for a device
// that has been recently installed or removed. Another thread is needed because
// in the context in which the device changes occur, the gwes and the filesystem
// critical sections are taken.
//
DWORD
DeviceNotifyThread(
   IN PVOID ThreadContext
   )
{
    PDEVICE_CHANGE_CONTEXT pdcc = (PDEVICE_CHANGE_CONTEXT)ThreadContext;

    BroadcastDeviceChange(pdcc->DevName, pdcc->bNew);
    NotifyDevice(pdcc->DevName, (pdcc->bNew) ? NOTIFY_DEVICE_ADD : NOTIFY_DEVICE_REMOVE);
    LocalFree(pdcc);
    return 0;
}   // DeviceNotifyThread


//
// Function to start a thread that signals a device change via the application
// notification system and via a broadcast windows message.
//
VOID
StartDeviceNotify(
    LPTSTR DevName,
    BOOL bNew
    )
{
    PDEVICE_CHANGE_CONTEXT pdcc;
    HANDLE hThd;

    pdcc = LocalAlloc(LPTR, sizeof(DEVICE_CHANGE_CONTEXT));
    if (pdcc == NULL) {
        return;
    }

    pdcc->bNew = bNew;
    memcpy(pdcc->DevName, DevName, DEVNAME_LEN*sizeof(TCHAR));

    hThd = CreateThread(NULL, 0,
                     (LPTHREAD_START_ROUTINE)&DeviceNotifyThread,
                     (LPVOID) pdcc, 0, NULL);
    if (hThd != NULL) {
        CloseHandle(hThd);
    } else {
        LocalFree(pdcc);
    }
}   // StartDeviceNotify

//
// Function to RegisterDevice a device driver and add it to the active device list
// in HLM\Drivers\Active and then signal the system that a new device is available.
//

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区视频在线播放| 日日噜噜夜夜狠狠视频欧美人| 欧美日韩亚洲不卡| 成人午夜免费电影| 韩国毛片一区二区三区| 麻豆91小视频| 久久99久久久久久久久久久| 麻豆成人综合网| 99在线精品一区二区三区| 在线观看视频一区二区| 欧美日韩一区高清| 一二三四社区欧美黄| 精品国产免费久久| 欧美视频在线播放| 亚洲欧洲精品一区二区精品久久久| 久久网站最新地址| 欧美激情综合五月色丁香小说| 奇米777欧美一区二区| 国产精品系列在线播放| 成人99免费视频| 91精品国产综合久久精品app | 久久久久88色偷偷免费| 日本亚洲最大的色成网站www| 狠狠久久亚洲欧美| 欧美久久免费观看| 色94色欧美sute亚洲13| 国产成人精品一区二| 欧美在线免费播放| 中文一区在线播放 | 成人av网站在线观看| 久久久久99精品一区| 在线免费观看日本一区| 国产丝袜美腿一区二区三区| 五月天欧美精品| 色老综合老女人久久久| 欧美极品xxx| 成人avav在线| 国产成人亚洲精品狼色在线| 亚洲综合免费观看高清在线观看| 国产成人免费在线视频| 欧美xingq一区二区| 国产一区视频网站| 欧美国产日韩在线观看| 精品欧美乱码久久久久久 | 在线不卡中文字幕| 一本久道中文字幕精品亚洲嫩| 日韩欧美国产精品一区| 美女视频第一区二区三区免费观看网站| 精品成人免费观看| 精品国产污污免费网站入口 | 91精品国产免费| 激情综合网天天干| 一区二区三区在线观看网站| 欧美午夜电影一区| 福利视频网站一区二区三区| 成人激情图片网| 欧美亚洲国产一区二区三区| 毛片不卡一区二区| caoporen国产精品视频| 自拍偷拍欧美激情| 日本道精品一区二区三区| 天天影视色香欲综合网老头| ww亚洲ww在线观看国产| 福利电影一区二区三区| 中文字幕免费在线观看视频一区| 99久久久久免费精品国产 | 日韩黄色在线观看| 久久久久久一二三区| 91福利在线看| 欧美va亚洲va| 欧美日韩日日摸| 高清av一区二区| 久久精品国产免费看久久精品| 麻豆成人久久精品二区三区红 | 中文字幕在线视频一区| 亚洲国产一区视频| 国产iv一区二区三区| 免费久久99精品国产| 亚洲女性喷水在线观看一区| 一区二区欧美国产| 成人激情校园春色| 久久久不卡网国产精品二区| 视频一区二区三区入口| ...xxx性欧美| 粉嫩绯色av一区二区在线观看 | 亚洲人成人一区二区在线观看| 久久精品99久久久| 欧美性感一区二区三区| 国产精品久久久久久久久免费丝袜 | 国产经典欧美精品| 久久久天堂av| 麻豆久久久久久久| 美女视频黄 久久| 色菇凉天天综合网| 2022国产精品视频| 国产成人综合亚洲91猫咪| 久久你懂得1024| 99re这里只有精品首页| 中文乱码免费一区二区 | 国产精品激情偷乱一区二区∴| 成人av在线资源| 色老汉av一区二区三区| 国产精品乱码人人做人人爱| 亚洲电影在线播放| 激情综合网av| 国产精品一区专区| 欧美国产成人在线| 91在线视频18| 日韩成人av影视| 成人性生交大合| 亚洲国产精品人人做人人爽| 欧美日韩久久久久久| 国产精品一二三四| 欧美精品粉嫩高潮一区二区| 奇米影视在线99精品| 欧美精品自拍偷拍动漫精品| 日本美女一区二区| 欧美狂野另类xxxxoooo| 亚洲人午夜精品天堂一二香蕉| 国模套图日韩精品一区二区| 欧美经典三级视频一区二区三区| 亚洲精品久久7777| 色婷婷精品久久二区二区蜜臀av| 91麻豆精品国产| 精品一区二区国语对白| 国产亚洲欧美日韩日本| 一区二区视频免费在线观看| 国产农村妇女毛片精品久久麻豆 | 天天综合色天天| 51精品久久久久久久蜜臀| 国产综合色视频| 国产精品毛片高清在线完整版| 欧美日韩专区在线| 国产三级久久久| 欧美日韩精品三区| 成人免费视频视频在线观看免费| 久久精品综合网| 久久99久久久久久久久久久| 欧美精选在线播放| 久久精品国产精品亚洲红杏| 在线观看网站黄不卡| 日本系列欧美系列| 欧美一区二区成人6969| 精品一区二区三区视频在线观看| 欧美日韩视频专区在线播放| 91色|porny| 婷婷久久综合九色综合绿巨人| 亚洲理论在线观看| 久久一区二区三区四区| 日韩欧美中文字幕一区| 在线观看视频欧美| 99国内精品久久| 成人性生交大片免费看视频在线| 久久国产精品区| 国产精品伦理在线| 一本一道久久a久久精品综合蜜臀| 日韩精品一区二区三区swag | 欧美一区二区成人6969| 国产亚洲综合色| 另类中文字幕网| 精品亚洲aⅴ乱码一区二区三区| 日韩无一区二区| 精品成人一区二区三区四区| 99久久777色| 日韩午夜电影在线观看| 成年人国产精品| 日韩影视精彩在线| 日韩精品午夜视频| 椎名由奈av一区二区三区| 亚洲成人tv网| 成人免费av在线| 免费精品99久久国产综合精品| 成人国产在线观看| 成人sese在线| 欧美性感一类影片在线播放| 波多野结衣的一区二区三区| 亚洲一本大道在线| 日韩欧美你懂的| 亚洲精品视频一区| 国产成人午夜视频| 欧美理论片在线| 日韩在线一区二区三区| 亚洲国产精品欧美一二99| 国产成人精品www牛牛影视| 亚洲国产精品麻豆| 成人av网站大全| 国产精品久久久久久久久快鸭 | 欧美另类z0zxhd电影| 亚洲图片激情小说| 色欧美日韩亚洲| 亚洲国产精品一区二区尤物区| 欧美成人精品高清在线播放| 日本欧美加勒比视频| 精品欧美一区二区三区精品久久| 欧美一区二区三区四区视频| 美女精品自拍一二三四| 精品少妇一区二区三区视频免付费| 欧美亚洲高清一区二区三区不卡| 日本一区二区电影| 欧美三级日韩三级国产三级|