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

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

?? pnp.cpp

?? DDK下虛擬串口驅動源代碼.首先安裝DDK2003,然后安裝VC6++,對DDK的相關庫進行編譯
?? CPP
字號:
#include "vcp4usb.h"

// globale Data
LIST_ENTRY gDevList;
KMUTEX gDevListMutex;

//#pragma code_seg("PAGE")	// start PAGE section
//
NTSTATUS Vcp4usbAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{
    NTSTATUS               status;
    PDEVICE_OBJECT         fdo;
    HANDLE                 hReg;
    PLIST_ENTRY            pListEntry;
    ULONG                  instanceNo;
    UNICODE_STRING         ntDeviceName;
    UNICODE_STRING         instanceStr;
    WCHAR                  instanceNumberBuffer[10];
    WCHAR *                pRegName;
    
    DPrint(DBG_PNP, ("AddDevice\n"));
    
    // get registry key (&hReg)
    status = IoOpenDeviceRegistryKey(pdo, PLUGPLAY_REGKEY_DEVICE, STANDARD_RIGHTS_READ, &hReg);
    if (!NT_SUCCESS(status))
        return status;
    
    // determine instance number
    instanceNo = 0;
    
    pListEntry = gDevList.Flink;
    while (pListEntry != &gDevList)
    {
        if (instanceNo < ((PVCP4USB_DEVICE_EXTENSION)pListEntry)->instanceNo)
            break;
        instanceNo = ((PVCP4USB_DEVICE_EXTENSION)pListEntry)->instanceNo + 1;
        pListEntry = pListEntry->Flink;
    }
    
    // build device name
    RtlZeroMemory(&ntDeviceName, sizeof(UNICODE_STRING));
    ntDeviceName.MaximumLength = 128*sizeof(WCHAR);
    ntDeviceName.Buffer        = (PWSTR)ExAllocatePool(NonPagedPool, (128+1)*sizeof(WCHAR));
    if (ntDeviceName.Buffer == NULL)
    {
        DPrint(DBG_PNP, ("ntDeviceName.Buffer == NULL\n"));
        ZwClose(hReg);
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    RtlZeroMemory(ntDeviceName.Buffer, (128+1)*sizeof(WCHAR));
    RtlAppendUnicodeToString(&ntDeviceName, VCP4USB_DEVICE_NAME);
    
    RtlInitUnicodeString(&instanceStr, NULL);
    instanceStr.MaximumLength = sizeof(instanceNumberBuffer);
    instanceStr.Buffer        = instanceNumberBuffer;
    RtlIntegerToUnicodeString(instanceNo, 10, &instanceStr);
    
    RtlAppendUnicodeStringToString(&ntDeviceName, &instanceStr);
    
    // Create our Functional Device Object in fdo
    status = IoCreateDevice(DriverObject,
        sizeof(VCP4USB_DEVICE_EXTENSION),
        &ntDeviceName,
        FILE_DEVICE_SERIAL_PORT,
        0,
        TRUE, // exclusive
        &fdo);
    if( !NT_SUCCESS(status))
    {
        DPrint(DBG_PNP, ("IoCreateDevice faild.\n"));
        ZwClose(hReg);
        ExFreePool(ntDeviceName.Buffer);
        return status;
    }
    
    // Remember fdo in our device extension
    PVCP4USB_DEVICE_EXTENSION dx = (PVCP4USB_DEVICE_EXTENSION)fdo->DeviceExtension;
    dx->instanceNo = instanceNo;
    dx->fdo = fdo;
    InsertHeadList(pListEntry, &dx->listEntry); // ??
    
    // init
    dx->pThreadObj = NULL;
    KeInitializeEvent(&dx->eventThreadExit, NotificationEvent, FALSE);
    KeInitializeEvent(&dx->eventThreadExiting, NotificationEvent, FALSE);
    
    dx->bIsConnected = FALSE;
    dx->bReadPending = FALSE;
    dx->bWritePending = FALSE;
    
    dx->pTxBuf = NULL;
    dx->curLenTx = 0;
    dx->pRxBuf = NULL;
    dx->curLenRx = 0;
	dx->needLenRx = 0;
    
    KeInitializeEvent(&dx->eventWriteStart, NotificationEvent, FALSE);
    KeInitializeEvent(&dx->eventReadEnd, NotificationEvent, FALSE);
    KeInitializeEvent(&dx->eventReadStart, NotificationEvent, FALSE);
    
    KeInitializeSpinLock(&dx->spinLock);
    dx->irpReadPending = NULL;
    dx->irpWritePending = NULL;
    
    dx->eventMask = 0;
    dx->historyEvents = 0;
    RtlZeroMemory(&dx->curTimeouts, sizeof(SERIAL_TIMEOUTS));
    RtlZeroMemory(&dx->curHandflow, sizeof(SERIAL_HANDFLOW));
    dx->pWaitCtrlIrp = NULL;
    
    InitTimer(&dx->readIntervalTimer, DpcReadIntervalTimeout, dx);
    InitTimer(&dx->readTotalTimer, DpcReadTotalTimeout, dx);
    InitTimer(&dx->writeTotalTimer, DpcWriteTotalTimeout, dx);
    
    dx->NextStackDevice = NULL;
    
    RtlCopyMemory(&dx->ntDeviceName, &ntDeviceName, sizeof(UNICODE_STRING));
    DPrint(DBG_PNP, ("Device name:%ws\n", ntDeviceName.Buffer));
    
    // Create Win32 App device name
    pRegName = (WCHAR*)ExAllocatePool(NonPagedPool, (128+1)*sizeof(WCHAR));
    if (pRegName == NULL)
    {
        DPrint(DBG_PNP, ("pRegName == NULL\n"));
        ZwClose(hReg);
        ExFreePool(ntDeviceName.Buffer);
        IoDeleteDevice(fdo);
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    status = GetRegistryKeyValue(hReg, L"PortName", pRegName, 128*sizeof(WCHAR));
    if (!NT_SUCCESS(status))
    {
        DPrint(DBG_PNP, ("GetRegistryKeyValue return:%d.\n", status));
        ZwClose(hReg);
        ExFreePool(ntDeviceName.Buffer);
        ExFreePool(pRegName);
        IoDeleteDevice(fdo);
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    
    RtlZeroMemory(&dx->dosDeviceName, sizeof(UNICODE_STRING));
    dx->dosDeviceName.MaximumLength = 128*sizeof(WCHAR);
    dx->dosDeviceName.Buffer        = (PWSTR)ExAllocatePool(NonPagedPool, (128+1)*sizeof(WCHAR));
    if (dx->dosDeviceName.Buffer == NULL)
    {
        DPrint(DBG_PNP, ("dx->dosDeviceName.Buffer == NULL\n"));
        ZwClose(hReg);
        ExFreePool(ntDeviceName.Buffer);
        ExFreePool(pRegName);
        IoDeleteDevice(fdo);
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    
    RtlAppendUnicodeToString(&dx->dosDeviceName, L"\\DosDevices\\");
    RtlAppendUnicodeToString(&dx->dosDeviceName, pRegName);//dosDeviceName == \\DosDevices\\COM3
    
    status = IoCreateSymbolicLink(&dx->dosDeviceName, &ntDeviceName);
    if( !NT_SUCCESS(status))
    {
        DPrint(DBG_PNP, ("IoCreateSymbolicLink faild.\n"));
        ZwClose(hReg);
        ExFreePool(ntDeviceName.Buffer);
        ExFreePool(dx->dosDeviceName.Buffer);
        IoDeleteDevice(fdo);
        return status;
    }
    DPrint(DBG_PNP, ("Create dos device name:%ws\n", dx->dosDeviceName.Buffer));
    
    //register port in DeviceMap
    status = RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP, 
        SERIAL_DEVICE_MAP, ntDeviceName.Buffer, REG_SZ,
        pRegName, (wcslen(pRegName) + 1) * sizeof(WCHAR));
    if( !NT_SUCCESS(status))
    {
        DPrint(DBG_PNP, ("RtlWriteRegistryValue faild.\n"));
    }
    
    // cleanup
    ZwClose(hReg);
    ExFreePool(pRegName);
    
    // Attach to the driver stack below us
    dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, pdo);
    if (dx->NextStackDevice == NULL)
    {
        DPrint(DBG_PNP, ("IoAttachDeviceToDeviceStack faild.\n"));
        ExFreePool(ntDeviceName.Buffer);
        IoDeleteDevice(fdo);
        return STATUS_NO_SUCH_DEVICE;
    }
    
    // Set fdo flags appropriately
    fdo->Flags |= DO_BUFFERED_IO;// | DO_POWER_PAGABLE;
    
    // finished
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;
    
    return STATUS_SUCCESS;
}

//
NTSTATUS Vcp4usbPnp(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
    DPrint(DBG_PNP, ("Pnp\n"));
    PVCP4USB_DEVICE_EXTENSION dx=(PVCP4USB_DEVICE_EXTENSION)fdo->DeviceExtension;
    
    // Remember minor function
    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    ULONG MinorFunction = IrpStack->MinorFunction;
    
    // Just pass to lower driver
    IoSkipCurrentIrpStackLocation(Irp);
    NTSTATUS status = IoCallDriver( dx->NextStackDevice, Irp);
    
    // Device removed
    switch (MinorFunction)
    {
    case IRP_MN_REMOVE_DEVICE:
        //unregister port in DeviceMap
        RtlDeleteRegistryValue(RTL_REGISTRY_DEVICEMAP,
            SERIAL_DEVICE_MAP, dx->ntDeviceName.Buffer);
        
        // free device name buffer
        ExFreePool(dx->ntDeviceName.Buffer);
        
        IoDeleteSymbolicLink(&dx->dosDeviceName);
        ExFreePool(dx->dosDeviceName.Buffer);
        
        RemoveEntryList(&dx->listEntry);
        
        // disable device interface
        
        // unattach from stack
        if (dx->NextStackDevice)
            IoDetachDevice(dx->NextStackDevice);
        
        // delete our fdo
        IoDeleteDevice(fdo);
        
        RemoveEntryList(&dx->listEntry);
        InitializeListHead(&gDevList);
        break;
        
    default:
        break;
    } // end switch (MinorFunction)
    
    return status;
}

//
NTSTATUS Vcp4usbPower(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
    DPrint(DBG_POWER, ("Power\n"));
    PVCP4USB_DEVICE_EXTENSION dx = (PVCP4USB_DEVICE_EXTENSION)fdo->DeviceExtension;
    
    // Just pass to lower driver
    PoStartNextPowerIrp( Irp);
    IoSkipCurrentIrpStackLocation(Irp);
    return PoCallDriver( dx->NextStackDevice, Irp);
}

NTSTATUS GetRegistryKeyValue(IN HANDLE regHandle, IN PWCHAR keyName, IN PVOID data, IN ULONG dataLength)
{
    UNICODE_STRING                  keyNameString;
    ULONG                           length;
    PKEY_VALUE_PARTIAL_INFORMATION  pInfo;
    NTSTATUS                        status = STATUS_INSUFFICIENT_RESOURCES;
    
    RtlInitUnicodeString(&keyNameString, keyName);
    
    length = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + dataLength;
    pInfo  = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(NonPagedPool, length); 
    
    if (pInfo != NULL)
    {
        status = ZwQueryValueKey(regHandle, &keyNameString, KeyValuePartialInformation, pInfo, length, &length);
        if (NT_SUCCESS(status))
        {
            if (dataLength >= pInfo->DataLength)
                RtlCopyMemory(data, &pInfo->Data, pInfo->DataLength);
            else
                status = STATUS_BUFFER_TOO_SMALL;
        }
        ExFreePool(pInfo);
    }
    
    return status;
}

//#pragma code_seg()	// end PAGE section

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线影视一区二区三区| 亚洲日本韩国一区| 国产日产欧美精品一区二区三区| 久久综合久色欧美综合狠狠| 国产精品无遮挡| 亚洲手机成人高清视频| 久久se这里有精品| 欧美中文字幕一区二区三区 | 久久99精品国产麻豆不卡| 97超碰欧美中文字幕| 欧美v日韩v国产v| 日韩综合小视频| 欧美中文字幕久久| 中文字幕一区二区三中文字幕| 九色综合狠狠综合久久| 欧美精品高清视频| 一区二区三区不卡视频| 91香蕉视频污在线| 中文字幕国产精品一区二区| 国产精品一区二区在线看| 欧洲亚洲国产日韩| 一区二区三区四区亚洲| 91免费版pro下载短视频| 国产精品卡一卡二| 国产91精品久久久久久久网曝门| 精品国产一区二区三区忘忧草| 性做久久久久久免费观看| 91在线国产观看| 中文字幕的久久| 成人精品一区二区三区四区| 国产女人18水真多18精品一级做 | 久久久综合视频| 亚洲一区欧美一区| 色狠狠综合天天综合综合| 中文字幕亚洲成人| 91小视频免费看| 樱桃国产成人精品视频| 91美女福利视频| 一个色综合av| 欧美日韩国产经典色站一区二区三区 | 国产伦精一区二区三区| 欧美肥大bbwbbw高潮| 午夜精品久久久久久久| 在线观看国产一区二区| 1000部国产精品成人观看| 国产精品一区二区久久精品爱涩 | 91网站黄www| 日本一区二区不卡视频| 色综合久久综合| 亚洲午夜免费福利视频| 欧美日韩国产片| 日韩国产一二三区| 欧美精品日韩精品| 日韩电影在线观看一区| www国产亚洲精品久久麻豆| 国产99久久久国产精品免费看| 欧美成人a∨高清免费观看| 日本成人中文字幕| 91精品欧美福利在线观看| 午夜不卡av在线| 欧美精品国产精品| 日本不卡视频在线| 日韩一级片网址| 高清不卡一区二区| 亚洲国产中文字幕| 久久精品一级爱片| 一本久久a久久精品亚洲| 五月婷婷综合网| 欧美一区二区人人喊爽| 国产一区二区久久| 国产精品第五页| 欧美日韩国产三级| 国产成人激情av| 天堂一区二区在线免费观看| 国产清纯白嫩初高生在线观看91 | 青青草国产精品亚洲专区无| 日韩视频一区二区| 懂色一区二区三区免费观看| 亚洲欧洲国产日韩| 欧美一卡在线观看| 精品亚洲国产成人av制服丝袜| 国产日本一区二区| 在线视频一区二区三| 国产在线不卡一卡二卡三卡四卡| 中文字幕亚洲精品在线观看| 日韩免费福利电影在线观看| 99久久精品情趣| 久久精品国产第一区二区三区| 日本一区二区不卡视频| 日韩精品专区在线影院重磅| 在线中文字幕不卡| 国内精品久久久久影院薰衣草| 成人一区二区三区视频在线观看| 日韩激情一二三区| ...中文天堂在线一区| 欧美精品日韩一区| 成人激情av网| 久久国产福利国产秒拍| 亚洲小说欧美激情另类| 亚洲国产精品二十页| 日韩免费观看高清完整版在线观看| 欧洲国内综合视频| 91在线视频播放| 97se亚洲国产综合自在线观| 国产91清纯白嫩初高中在线观看 | 亚洲最大的成人av| 亚洲欧美一区二区在线观看| 久久女同精品一区二区| 欧美成人精品高清在线播放| 色噜噜久久综合| 国产精品99久久久久久久vr| 精久久久久久久久久久| 免费人成在线不卡| 蜜桃91丨九色丨蝌蚪91桃色| 午夜成人免费电影| 亚洲国产综合人成综合网站| 亚洲午夜视频在线观看| 一区二区三区欧美视频| 亚洲综合一区在线| 亚洲成人资源在线| 日本视频一区二区三区| 蜜臀av亚洲一区中文字幕| 极品少妇一区二区三区精品视频| 麻豆91精品视频| 国产一区二区不卡| 国产不卡在线视频| 成人精品鲁一区一区二区| thepron国产精品| 欧美怡红院视频| 欧美日韩一区视频| 在线欧美日韩精品| 在线精品视频一区二区三四| 99精品热视频| 在线免费不卡电影| 欧美午夜理伦三级在线观看| 在线免费不卡视频| 欧美午夜免费电影| 日韩精品一区在线| 欧美性xxxxxxxx| 蜜臀va亚洲va欧美va天堂| 久久精品国产免费| 麻豆精品国产传媒mv男同 | 国产精品正在播放| 日韩在线卡一卡二| 成人福利视频在线| 成人伦理片在线| ...中文天堂在线一区| 久久久五月婷婷| 久久亚洲影视婷婷| 久久丝袜美腿综合| 日本一区二区三级电影在线观看| 久久久久久一二三区| 国产午夜精品一区二区| 久久日韩粉嫩一区二区三区| 国产日韩欧美精品在线| 久久久精品2019中文字幕之3| 久久免费国产精品| 国产精品毛片久久久久久久| 国产精品免费视频一区| 亚洲三级在线免费| 国产精品高清亚洲| 亚洲蜜臀av乱码久久精品| 天天色综合成人网| 成人夜色视频网站在线观看| 色婷婷香蕉在线一区二区| 91久久国产综合久久| 欧美一区二区三区四区久久 | 大尺度一区二区| 欧美日韩激情在线| 日韩视频永久免费| 国产精品三级视频| 亚洲视频免费在线| 日韩电影免费一区| 91美女福利视频| 欧美激情一区二区三区在线| 日韩高清在线观看| 国产精品一品二品| 精品动漫一区二区三区在线观看| 一区二区三区久久久| gogo大胆日本视频一区| 日韩欧美一二区| 污片在线观看一区二区| 色猫猫国产区一区二在线视频| 欧美国产禁国产网站cc| 国产毛片一区二区| 欧美精品高清视频| 亚洲成a人v欧美综合天堂| 91麻豆精品秘密| 最近日韩中文字幕| 成人妖精视频yjsp地址| 久久久久国产精品厨房| 精品午夜久久福利影院| 日韩一级高清毛片| 蜜臀久久99精品久久久久久9 | 99麻豆久久久国产精品免费| 久久久99久久| 国产精品18久久久久久vr| 久久青草欧美一区二区三区| 九九九久久久精品| 日韩欧美中文一区|