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

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

?? dispatch.cpp

?? DDK下虛擬串口驅動源代碼.首先安裝DDK2003,然后安裝VC6++,對DDK的相關庫進行編譯
?? CPP
?? 第 1 頁 / 共 3 頁
字號:

    //UCHAR * pBuf = (UCHAR*)ExAllocatePool(NonPagedPool, (writeLen+1) * sizeof(UCHAR));
    UCHAR * pBuf = dx->pTxArray;
    RtlZeroMemory(pBuf, (TX_BUFFER_SIZE+1) * sizeof(UCHAR));
    
    if (!pBuf)
		return Vcp4usbCompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);

    KIRQL oldIrql;
    KeAcquireSpinLock(&dx->spinLock, &oldIrql);
	LARGE_INTEGER totalTimeout;
        
    IoAcquireCancelSpinLock(&Irp->CancelIrql);
    if (Irp->Cancel) // need cancel
    {
        IoReleaseCancelSpinLock(Irp->CancelIrql);
        Irp->IoStatus.Status = STATUS_CANCELLED;
        Irp->IoStatus.Information = 0;
        KeReleaseSpinLock(&dx->spinLock, oldIrql);
        DPrint(DBG_WRITE, ("write return STATUS_CANCELLED @ %d\n", KeGetCurrentIrql()));
        
        KeReleaseSpinLock(&dx->spinLock, oldIrql);
        return STATUS_CANCELLED;
    }
    IoSetCancelRoutine(Irp, CancelRoutineWrite);
    IoReleaseCancelSpinLock(Irp->CancelIrql);
    
    IoMarkIrpPending(Irp);
    Irp->IoStatus.Status = STATUS_PENDING;
    Irp->IoStatus.Information = 0;

    RtlCopyMemory(pBuf, Irp->AssociatedIrp.SystemBuffer, writeLen * sizeof(UCHAR));
    dx->irpWritePending = Irp;
    dx->curLenTx = writeLen;
    dx->pTxBuf = pBuf;
    
    // start write timer
    if (!CalculateWriteTimeout(dx, writeLen * 10, &totalTimeout))
    {
        if (totalTimeout.QuadPart != 0)
        {
            DPrint(DBG_WRITE, ("start write timer totalTimeout\n"));
            StartTimer(&dx->writeTotalTimer, totalTimeout);
        }
    }
    
    KeSetEvent(&dx->eventWriteStart, 1, FALSE);
    DPrintHex(DBG_DATALOG, ("Stage write"), dx->pTxBuf, dx->curLenTx);
    
    KeReleaseSpinLock(&dx->spinLock, oldIrql);

    DPrint(DBG_WRITE, ("Vcp4usbWrite() return STATUS_PENDING @ %d\n", KeGetCurrentIrql()));
    return STATUS_PENDING;
}

#define Free_Res() \
    do{ \
    if (hRead){ZwClose(hRead);hRead = NULL;} \
    if (hWrite){ZwClose(hWrite);hWrite = NULL;} \
    }while(0)
    //if (dx->pRxBuf){ExFreePool(dx->pRxBuf);dx->pRxBuf = NULL;}
    //if (dx->pRxBuf){dx->pRxBuf = NULL;}

#define TIMEOUT_1MS (-1i64 * 1000i64 * 10i64)
#define TOTALEVENT 3

VOID Vcp4usbThread(IN PVOID Context)
{
    PDEVICE_OBJECT              fdo;
    PVCP4USB_DEVICE_EXTENSION   dx;
    LARGE_INTEGER               timeout;
    PVOID                       aryEvent[TOTALEVENT];
    NTSTATUS                    status;
    HANDLE                      hRead = NULL, hWrite = NULL;
    BOOLEAN                     kill = FALSE, bNeedReadData = FALSE;
    
    fdo = (PDEVICE_OBJECT)Context;
    dx = (PVCP4USB_DEVICE_EXTENSION)fdo->DeviceExtension;
    timeout.QuadPart = TIMEOUT_1MS; // 1ms timeout
    
    DPrint(DBG_THREAD, ("Vcp4usbThread() start, dx=0x%x @ %d\n", dx, KeGetCurrentIrql()));
    
    KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);
    aryEvent[0] = &dx->eventThreadExiting;
    aryEvent[1] = &dx->eventWriteStart;
    aryEvent[2] = &dx->eventReadEnd;
    
    while (!kill)
    {
        // wait event
        status = KeWaitForMultipleObjects(TOTALEVENT, aryEvent, WaitAny, 
            Executive, KernelMode, FALSE, &timeout, NULL);
        //DPrint(DBG_THREAD, ("wait object return:0x%x\n", status));
        
        // clear event
        if (status == STATUS_TIMEOUT) // check connect status
        {
            //DPrint(DBG_THREAD, ("time out\n"));
        }
        else if (status == STATUS_WAIT_0) // eventThreadExiting
        {
            kill = TRUE;
            KeResetEvent((PRKEVENT)aryEvent[0]);
            break; // or continue;
        }
        else if (status == STATUS_WAIT_1) // eventWriteStart
        {
            KeResetEvent((PRKEVENT)aryEvent[1]);
        }
        else if (status == STATUS_WAIT_2) // eventReadEnd
        {
            KeResetEvent((PRKEVENT)aryEvent[2]);
        }
        //else if (status == STATUS_WAIT_3) // eventReadStart
        //{
        //    KeResetEvent((PRKEVENT)aryEvent[3]);
        //}
        else
        {
            DPrint(DBG_THREAD, ("Vcp4usbThread() not handled status=%d\n", status));
			// if (DBG) DbgBreakPoint();
        }
        
        // check usb device connect when eventWriteStart & eventReadEnd, don't change var (status)
        if ((status == STATUS_TIMEOUT) || (status == STATUS_WAIT_1) || (status == STATUS_WAIT_2))
        {
			NTSTATUS curStatus;
            BOOLEAN bCurConnect = FALSE;
            UNICODE_STRING usbDeviceName;
            curStatus = GetUsbDeviceName(&usbDeviceName, &GUID_CLASS_XXXX_BULK,
                &XXXX_SYMLINK_CMPSTR, XXXX_SYMLINK_STRLEN, 0);
            if (NT_SUCCESS(curStatus))
            {
                HANDLE hDev;
                if (NT_SUCCESS(createFile(&hDev, &usbDeviceName, L"", 0, GENERIC_READ)))
                {
                    ZwClose(hDev);
                    bCurConnect = TRUE;
                }
            }
            
            if (!dx->bIsConnected && bCurConnect)
            {
                NTSTATUS rdStatus, wtStatus;
                DPrint(DBG_THREAD, ("Vcp4usbThread() usb device connected.\n"));
                if (!hRead)
                    rdStatus = createFile(&hRead, &usbDeviceName, L"\\PIPE0", 6, GENERIC_READ);
                if (!hWrite)
                    wtStatus = createFile(&hWrite, &usbDeviceName, L"\\PIPE1", 6, GENERIC_WRITE);
                if (NT_SUCCESS(rdStatus) && NT_SUCCESS(wtStatus))
                {
                    if (!dx->pRxBuf)
                        //dx->pRxBuf = (UCHAR*)ExAllocatePool(NonPagedPool, RX_BUFFER_SIZE + 1);
                        dx->pRxBuf = dx->pRxArray;
                    if (dx->pRxBuf)
                        RtlZeroMemory(dx->pRxBuf, RX_BUFFER_SIZE + 1);
                }
                if (!NT_SUCCESS(rdStatus) || !NT_SUCCESS(wtStatus) || (!dx->pRxBuf))
                {
                    DPrint(DBG_THREAD, ("Vcp4usbThread() usb pipe can't opened.\n"));
                    Free_Res();
                }
                else
                {
                    DPrint(DBG_THREAD, ("Vcp4usbThread() dx->pRxBuf = 0x%x\n", dx->pRxBuf));
                    dx->curLenRx = 0;
                    dx->bReadPending = FALSE;
                    dx->curLenTx = 0;
                    dx->bWritePending = FALSE;
                    dx->bIsConnected = TRUE;
                }
            }
            else if (dx->bIsConnected && !bCurConnect)
            {
                dx->bIsConnected = FALSE;
                DPrint(DBG_THREAD, ("Vcp4usbThread() usb device disconnected.\n"));
                Free_Res();
            }
            
            if (NT_SUCCESS(curStatus))
            {
                if (usbDeviceName.Buffer)
                    ExFreePool(usbDeviceName.Buffer);
            }
        }
        
        // write start
        if (status == STATUS_WAIT_1)
        {
            if (dx->bIsConnected && hWrite && !dx->bWritePending && dx->pTxBuf && dx->curLenTx)
            {
                KIRQL oldIrql;
                KeAcquireSpinLock(&dx->spinLock, &oldIrql);
            
                IO_STATUS_BLOCK ioBlock;
                LARGE_INTEGER byteOffset;
                ULONG key = 0;
            
                byteOffset.QuadPart = 0;
                ioBlock.Information = 0;
                ioBlock.Status = 0;
            
                dx->bWritePending = TRUE;
            
                DPrint(DBG_WRITE, ("Vcp4usbThread() write start\n"));
                ZwWriteFile(hWrite, NULL, (PIO_APC_ROUTINE)ApcRoutineWrite, dx,
                    &ioBlock, dx->pTxBuf, dx->curLenTx, &byteOffset, NULL);//&key); // zero byte
                DPrint(DBG_WRITE, ("Vcp4usbThread() write ready\n"));
            
                KeReleaseSpinLock(&dx->spinLock, oldIrql);
            }
        } // if (status == STATUS_WAIT_1) // write start
        
		// userapp maybe wait mask
		if ((dx->pWaitCtrlIrp != NULL) && (dx->eventMask & SERIAL_EV_RXCHAR))
			bNeedReadData = TRUE;
		
		// read start
        if ((status == STATUS_WAIT_2) || (bNeedReadData == TRUE))
        {
            if ((dx->bIsConnected && hRead && !dx->bReadPending && dx->pRxBuf && (dx->curLenRx <= RX_BUFFER_SIZE)))
            {
                KIRQL oldIrql;
                KeAcquireSpinLock(&dx->spinLock, &oldIrql);
                
                IO_STATUS_BLOCK ioBlock;
                LARGE_INTEGER byteOffset;
                ULONG key = 0;
            
                byteOffset.QuadPart = 0;
                ioBlock.Information = 0;
                ioBlock.Status = 0;
                
                dx->bReadPending = TRUE;
                PUCHAR pCurBuf = dx->pRxBuf;
                ULONG needReadLen = RX_BUFFER_SIZE - dx->curLenRx;
				needReadLen = (needReadLen > 832) ? 832 : needReadLen;
				
				pCurBuf += dx->curLenRx;
                
				DPrint(DBG_READ, ("Vcp4usbThread() read start:needReadLen=%d\n", needReadLen));
                ZwReadFile(hRead, NULL, (PIO_APC_ROUTINE)ApcRoutineRead, dx,
                    &ioBlock, pCurBuf, needReadLen, &byteOffset, NULL);//&key); // zero byte
                DPrint(DBG_READ, ("Vcp4usbThread() read ready\n"));
            
                KeReleaseSpinLock(&dx->spinLock, oldIrql);
            }
        } // if (status == STATUS_WAIT_2) // read start
    } // end while (TRUE)
    
    if (dx->irpReadPending)
    {
        IoCancelIrp(dx->irpReadPending);
        dx->irpReadPending = NULL;
    }
    if (dx->irpWritePending)
    {
        IoCancelIrp(dx->irpWritePending);
        dx->irpWritePending = NULL;
    }
    
    if (dx->pThreadObj != NULL)
    {
        ObDereferenceObject(&dx->pThreadObj);
        dx->pThreadObj = NULL;
    }
    
    Free_Res();
    dx->bReadPending = FALSE;
    dx->bWritePending = FALSE;
    dx->bIsConnected = FALSE;
    
    DPrint(DBG_THREAD, ("Vcp4usbThread exit\n"));
    KeSetEvent(&dx->eventThreadExit, 0, TRUE);
    
    PsTerminateSystemThread(STATUS_SUCCESS);
}

NTSTATUS Vcp4usbCreate(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
    PVCP4USB_DEVICE_EXTENSION dx=(PVCP4USB_DEVICE_EXTENSION)fdo->DeviceExtension;
    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    NTSTATUS status = STATUS_SUCCESS;
    
    DPrint(DBG_CREATE, ("Vcp4usbCreate() @ %d\n", KeGetCurrentIrql()));
    
    Irp->IoStatus.Information = 0;
    
    // Create thread
    if (dx->pThreadObj != NULL)
    {
        status = STATUS_UNSUCCESSFUL;
    }
    else
    {
        HANDLE hThread;
        OBJECT_ATTRIBUTES oa;
        InitializeObjectAttributes(&oa, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
        status = PsCreateSystemThread(&hThread, 
            THREAD_ALL_ACCESS, &oa, NULL, NULL, Vcp4usbThread, fdo);
        if (!NT_SUCCESS(status))
        {
            DPrint(DBG_CREATE, ("CreateThread error:0x%x\n", status));
            return Vcp4usbCompleteIrp(Irp, status, Irp->IoStatus.Information);
        }
        status = ObReferenceObjectByHandle(hThread, 
            THREAD_ALL_ACCESS, NULL, KernelMode, &dx->pThreadObj, NULL);
        if (!NT_SUCCESS(status) || !dx->pThreadObj)
        {
            status = STATUS_UNSUCCESSFUL;
        }
        if (hThread)
            ZwClose(hThread);
    }
    
    DPrint(DBG_CREATE, ("Vcp4usbCreate() exit, return 0x%x\n", status));
    
    // Complete successfully
    return Vcp4usbCompleteIrp(Irp, status, Irp->IoStatus.Information);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美中文字幕精品| 不卡免费追剧大全电视剧网站| 91久久免费观看| 亚洲日本乱码在线观看| 91视视频在线观看入口直接观看www | 色狠狠av一区二区三区| 亚洲欧美另类久久久精品| 色综合久久综合中文综合网| 亚洲欧洲av一区二区三区久久| 99re这里只有精品6| 亚洲精品成人精品456| 欧美日韩在线播放一区| 日韩不卡免费视频| 久久久一区二区| www.日韩大片| 国产乱人伦偷精品视频免下载| 久久精品一区二区三区av| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 日韩欧美电影一区| 国产最新精品精品你懂的| 中文字幕一区二区三区在线观看| 一本到不卡免费一区二区| 日韩精品福利网| 久久精品男人天堂av| 色8久久精品久久久久久蜜| 日韩成人午夜精品| 国产欧美一区二区精品性色超碰| 色综合久久久久网| 青青国产91久久久久久| 国产女人18毛片水真多成人如厕 | 国产91露脸合集magnet| 亚洲欧美aⅴ...| 欧美成人bangbros| 成人sese在线| 蜜乳av一区二区三区| 最新久久zyz资源站| 91精品国产综合久久婷婷香蕉 | 午夜精彩视频在线观看不卡| 日韩亚洲欧美在线| 久久久久久综合| 欧美性猛交一区二区三区精品| 寂寞少妇一区二区三区| 夜夜嗨av一区二区三区网页| 久久久久久久精| 欧美日韩一区三区四区| 成人动漫视频在线| 老司机一区二区| 亚洲一区二区三区爽爽爽爽爽| 久久久久久免费毛片精品| 欧美日韩一区在线| 色香蕉成人二区免费| 国产久卡久卡久卡久卡视频精品| 亚洲高清在线精品| 国产精品白丝在线| 国产视频一区不卡| 精品毛片乱码1区2区3区| 欧美三级在线看| 99re视频精品| 丁香婷婷综合激情五月色| 奇米精品一区二区三区在线观看 | 91精品国产综合久久精品性色| 成人黄色网址在线观看| 国产一区91精品张津瑜| 日本道色综合久久| 国产成人精品1024| 久久精品99国产国产精| 天天亚洲美女在线视频| 一区二区三区在线观看网站| 国产精品青草久久| 中文字幕第一区第二区| www国产成人免费观看视频 深夜成人网| 欧美三级视频在线| 日本精品视频一区二区三区| 94-欧美-setu| 91在线视频免费91| 97久久精品人人做人人爽50路 | 日韩专区一卡二卡| 亚洲成a人片在线不卡一二三区| 亚洲女子a中天字幕| 亚洲日本va午夜在线影院| 中文字幕一区二区三区不卡| 国产精品久久久久久久久果冻传媒 | 美女视频黄 久久| 欧美aaa在线| 麻豆免费看一区二区三区| 日本欧美大码aⅴ在线播放| 三级欧美在线一区| 蜜桃一区二区三区四区| 久久精品国内一区二区三区| 美女视频黄 久久| 国产一区二区三区在线观看精品| 国产乱一区二区| 成人高清伦理免费影院在线观看| 99国产一区二区三精品乱码| 在线日韩av片| 91精品综合久久久久久| 欧美电影免费观看高清完整版在线观看 | 国产无人区一区二区三区| 国产欧美视频一区二区| 一区二区中文视频| 亚洲国产欧美在线人成| 免费视频一区二区| 国产精品主播直播| 97成人超碰视| 欧美日本在线一区| 337p粉嫩大胆噜噜噜噜噜91av| 国产婷婷精品av在线| 一区二区三区四区乱视频| 婷婷综合久久一区二区三区| 久久福利资源站| 成人h动漫精品一区二区| 色8久久人人97超碰香蕉987| 欧美一区午夜视频在线观看| 久久精品亚洲一区二区三区浴池| 日韩一区在线播放| 人妖欧美一区二区| 成人黄色软件下载| 欧美一区二区视频在线观看| 国产欧美一区二区精品性色超碰| 粉嫩av一区二区三区粉嫩| 一本到一区二区三区| 欧美成人精品福利| 亚洲天堂av老司机| 裸体健美xxxx欧美裸体表演| 99热这里都是精品| 日韩一区二区免费电影| 国产精品色眯眯| 日本成人超碰在线观看| 91亚洲男人天堂| 欧美成人乱码一区二区三区| 亚洲欧美偷拍卡通变态| 毛片av一区二区| 91麻豆成人久久精品二区三区| 日韩欧美一区二区三区在线| 亚洲品质自拍视频网站| 国产乱子伦一区二区三区国色天香| 91免费版在线| 国产日产精品1区| 日韩不卡一区二区三区| 色综合激情五月| 精品对白一区国产伦| 亚洲国产sm捆绑调教视频| 不卡的av网站| 久久久精品一品道一区| 日本欧美一区二区在线观看| 91一区一区三区| 日本一区二区三级电影在线观看| 日韩电影一二三区| 在线这里只有精品| 国产欧美日韩在线观看| 美女www一区二区| 欧美精品亚洲一区二区在线播放| 日韩伦理av电影| 波多野结衣中文字幕一区二区三区 | 成人亚洲精品久久久久软件| 精品国产伦一区二区三区观看体验 | 经典三级一区二区| 欧美一级一区二区| 视频一区在线视频| 色婷婷综合久久久中文字幕| 国产精品毛片a∨一区二区三区| 国产一区二区视频在线| 精品国产乱码久久久久久蜜臀| 日本免费新一区视频| 在线播放中文字幕一区| 亚洲第一精品在线| 欧美三级一区二区| 五月综合激情婷婷六月色窝| 欧美日韩在线综合| 亚洲国产精品视频| 欧美亚洲国产一区在线观看网站| 国产精品入口麻豆九色| 成人动漫视频在线| 综合久久综合久久| 99久精品国产| 亚洲激情中文1区| 在线亚洲人成电影网站色www| 亚洲欧美日韩久久精品| 色狠狠桃花综合| 香蕉加勒比综合久久| 69堂亚洲精品首页| 久久精品av麻豆的观看方式| 久久亚洲二区三区| 国产成a人亚洲精| 国产在线麻豆精品观看| wwwwww.欧美系列| 国产成人福利片| 综合久久综合久久| 日本乱人伦aⅴ精品| 手机精品视频在线观看| 日韩你懂的电影在线观看| 亚洲影视资源网| 亚洲线精品一区二区三区| 99久久99久久综合| 亚洲在线免费播放| 欧美一区二区三区四区久久| 精东粉嫩av免费一区二区三区| 中文子幕无线码一区tr| 色偷偷88欧美精品久久久| 日韩精品免费专区|