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

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

?? rw.c

?? usb to rs232 虛擬RS232串口驅動程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*++

Copyright (c) 2005-2006  E0 Technology,Inc.

Module Name:

	rw.c

Abstract:

	Virtual Com Port Driver for USB to RS232 Converter of E0 Technology,Inc.

Environment:

	Kernel mode

Notes:

Revision History:

    2006/3/1 : 	created.
--*/


#include "usb2com.h"

NTSTATUS
ReadIntUrbComplete(
    	IN PDEVICE_OBJECT DeviceObject,
    	IN PIRP Irp,
    	IN PVOID Context
    	);
NTSTATUS
StopReadIntUrb(
	IN PDEVICE_EXTENSION deviceExtension
	);
NTSTATUS
StartReadIntUrb(
	IN PDEVICE_OBJECT DeviceObject,
	IN PUSBD_PIPE_INFORMATION PipeInfo
	);
void
IrpCancelRoutine(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp);
PIRP
DequeueReadIrp(
	PDEVICE_EXTENSION deviceExtension
	);
	
NTSTATUS QueueOrCompleteReadIrp(
	PDEVICE_EXTENSION deviceExtension,
	PIRP Irp);

NTSTATUS
WriteIntUrbComplete(
    	IN PDEVICE_OBJECT DeviceObject,
    	IN PIRP Irp,
    	IN PVOID Context
    	);
    
PIRP 
DequeueWriteIrp(
	IN PDEVICE_EXTENSION deviceExtension
	);

NTSTATUS
QueueOrStartWriteIrp(
	IN PDEVICE_EXTENSION deviceExtension,
	IN PIRP Irp);

VOID 
WriteIrpCancelRoutine(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp);

NTSTATUS
StopWriteIntUrb(
	IN PDEVICE_EXTENSION deviceExtension
	);
	
NTSTATUS
StartWriteIntUrb(
	PDEVICE_OBJECT	DeviceObject
	);
	
NTSTATUS
PrepareWriteIntUrb(
	IN PDEVICE_OBJECT DeviceObject,
	IN PUSBD_PIPE_INFORMATION PipeInfo
	);

NTSTATUS
USB2COM_Read(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++

Routine Description:

	This is the IRP_MJ_READ routine set in our dispatch table;
	ReadFile() calls from user mode ultimately land here

Arguments:

    DeviceObject - pointer to the device object for this instance of the 82930
                    device.

    IRP - pointer to the IRP_MJ_READ

Return Value:

    NT status code

--*/
{

    //NTSTATUS ntStatus = USB2COM_StagedReadWrite(DeviceObject,
      //                            Irp,
        //                          TRUE);	// false to write, true to read
	NTSTATUS ntStatus = QueueOrCompleteReadIrp(DeviceObject->DeviceExtension,Irp);
    return ntStatus;                                  

}

NTSTATUS
USB2COM_Write(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++

Routine Description:
	This is the IRP_MJ_WRITE routine set in our dispatch table;
	WriteFile() calls from user mode ultimately land here

Arguments:

    DeviceObject - pointer to the device object for this instance of the 82930
                    device.

    IRP - pointer to the IRP_MJ_WRITE

Return Value:

    NT status code

--*/
{

    //NTSTATUS ntStatus = USB2COM_StagedReadWrite(DeviceObject,
      //                            Irp,
        //                          FALSE);	// false to write, true to read
    NTSTATUS ntStatus = QueueOrStartWriteIrp(
    				DeviceObject->DeviceExtension,
    				Irp);
    return ntStatus;                                  
}


PUSB2COM_PIPEINFO USB2COM_PipeWithName( 
    IN PDEVICE_OBJECT DeviceObject,
    IN PUNICODE_STRING FileName
   )
/*++

Routine Description:

    Given a PUSBD_PIPE_INFORMATION, return our device extension pipe info struct
      that has this hanndle, else NULL

--*/
{
    PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension; 
    PUSB2COM_PIPEINFO pipeInfo = NULL;
    ULONG i, nameLen, ix, uval , umultiplier;

	nameLen = FileName->Length/2;

    if (nameLen != 0) {

		USB2COM_KdPrint( DBGLVL_DEFAULT,("USB2COM_PipeWithName FileName = %ws\n", FileName->Buffer ));

		// Get pipe# to open
		ix = nameLen -1;  // index last char of pipe name

		// if last char isn't digit, decrement till it is
		while( ( (FileName->Buffer[ ix ] < (WCHAR) '0') ||
				(FileName->Buffer[ ix ] > (WCHAR) '9') ) && ix )
				ix--;  

		if (  ix  )  {  //  filename better have had at least one ascii digit!    

			//
			// A name was specified, convert it to a pipe id.
			// Parse the ansi ascii decimal 0-based pipe number 
			//
			uval = 0;
			umultiplier = 1;
			// we're traversing least-to-most significant digits
			while( ( (FileName->Buffer[ ix ] >= (WCHAR) '0') &&
				(FileName->Buffer[ ix ] <= (WCHAR) '9') ) && ix ) {

				uval +=  (umultiplier *
					     (ULONG) (FileName->Buffer[ ix ] - (WCHAR) '0'));
				ix--;
				umultiplier *= 10; 
            }
		}
        pipeInfo = &deviceExtension->PipeInfo[ uval ];
    }

    USB2COM_KdPrint ( DBGLVL_HIGH, ("Exit USB2COM_PipeWithName() pipeInfo = 0x%x, ix = %d\n", pipeInfo, uval ));

    return pipeInfo;
}

NTSTATUS
USB2COM_Close(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++

Routine Description:

    This is the dispatch table routine for IRP_MJ_CLOSE.
    It handles user mode CloseHandle() calls for a pipe
    It closes the File Object for the pipe handle it represents.

Arguments:

    DeviceObject - pointer to our FDO (Functional Device Object )


Return Value:

    NT status code

--*/
{
    NTSTATUS ntStatus;
	NTSTATUS actStat;
    PFILE_OBJECT fileObject;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_EXTENSION deviceExtension;
    PUSBD_PIPE_INFORMATION pipeHandle = NULL;
    PUSB2COM_PIPEINFO pipeInfo = NULL;
    NTSTATUS waitStatus;

    USB2COM_KdPrint( DBGLVL_DEFAULT,("entering USB2COM_Close\n"));

    
    USB2COM_IncrementIoCount(DeviceObject);

    deviceExtension = DeviceObject->DeviceExtension;
    irpStack = IoGetCurrentIrpStackLocation (Irp);
    deviceExtension->PipeInfo[0].fPipeOpened = FALSE;  
    deviceExtension->OpenPipeCount--;
    StopReadIntUrb(deviceExtension);
    deviceExtension->PipeInfo[1].fPipeOpened = FALSE;  
    StopWriteIntUrb(deviceExtension);
    deviceExtension->OpenPipeCount--;
    fileObject = irpStack->FileObject;
    if(fileObject == NULL)
    	goto done;
    if (fileObject->FsContext) {
        // closing pipe handle
        pipeHandle =  fileObject->FsContext;

        pipeInfo = USB2COM_PipeWithName( DeviceObject, &fileObject->FileName );

        if ( NULL == pipeInfo )
            goto done;

		if ( pipeInfo->fPipeOpened ) { // set if opened
			// may have been aborted
			USB2COM_KdPrint( DBGLVL_DEFAULT,("closing pipe %x\n", pipeHandle));
			deviceExtension->OpenPipeCount--;
			pipeInfo->fPipeOpened = FALSE;
		}
		else {
			// pipe was already closed; this can only be if we got a sudden REMOVE_DEVICE
			USB2COM_ASSERT(  deviceExtension->DeviceRemoved );
			USB2COM_KdPrint( DBGLVL_DEFAULT,("Pipe %x was already closed \n", pipeHandle));

		}
    }

done:
	USB2COM_DecrementIoCount(DeviceObject);
	waitStatus = KeWaitForSingleObject(
                    &deviceExtension->NoPendingIoEvent,
                    Suspended,
                    KernelMode,
                    FALSE,
                    NULL);
    DbgPrint("waitStatus %x\n",waitStatus);
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;

    ntStatus = Irp->IoStatus.Status;


    IoCompleteRequest (Irp,
                       IO_NO_INCREMENT
                       );
                       
	// try to power down device if this is the last pipe
	actStat = USB2COM_SelfSuspendOrActivate( DeviceObject, TRUE );

    USB2COM_KdPrint( DBGLVL_DEFAULT,("exit USB2COM_Close OpenPipeCount = decimal %d, status %x\n",deviceExtension->OpenPipeCount, ntStatus));

    return ntStatus;
}


NTSTATUS
USB2COM_Create(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++

Routine Description:

    This is the dispatch table routine for IRP_MJ_CREATE.
    It's the entry point for CreateFile() calls
    user mode apps may open "<name genned fron GUID>.\yy"
    where yy is the internal pipe id

Arguments:

    DeviceObject - pointer to our FDO ( Functional Device Object )


Return Value:

    NT status code

--*/
{
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PFILE_OBJECT fileObject;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_EXTENSION deviceExtension;
    ULONG i, ix;
	NTSTATUS actStat;
    PUSBD_INTERFACE_INFORMATION interface;
	PUSBD_PIPE_INFORMATION PipeInfo;
    PUSB2COM_PIPEINFO ourPipeInfo = NULL;
    	KIRQL Irql;



    deviceExtension = DeviceObject->DeviceExtension;
    interface = deviceExtension->UsbInterface;

    USB2COM_KdPrint( DBGLVL_DEFAULT,("entering USB2COM_Create\n"));

	//DbgBreakPoint();
    USB2COM_IncrementIoCount(DeviceObject);

    // Can't accept a new io request if:
    //  1) device is removed, 
    //  2) has never been started, 
    //  3) is stopped,
    //  4) has a remove request pending,
    //  5) has a stop device pending
    if ( !USB2COM_CanAcceptIoRequests( DeviceObject ) ) {
        ntStatus = STATUS_DELETE_PENDING;

		USB2COM_KdPrint( DBGLVL_DEFAULT,("ABORTING USB2COM_Create\n"));
        goto done;
    }
    	KeAcquireSpinLock(&deviceExtension->InputBufferLock, &Irql);
    	ResetCircularBuffer(&deviceExtension->InputBuffer);
	KeReleaseSpinLock(&deviceExtension->InputBufferLock, Irql);

	StartReadIntUrb(
		DeviceObject,
		&interface->Pipes[0]
		);
	deviceExtension->PipeInfo[0].fPipeOpened = TRUE;  

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色噜噜狠狠一区二区三区果冻| 国产成人av电影在线| 亚洲人成亚洲人成在线观看图片| 久久综合色8888| 久久综合久久综合亚洲| 精品国产一区久久| 久久影视一区二区| 久久亚洲二区三区| 久久综合成人精品亚洲另类欧美| 欧美tk丨vk视频| 日韩一级二级三级精品视频| 欧美一区日本一区韩国一区| 欧美一区永久视频免费观看| 精品欧美乱码久久久久久| 日韩一区二区不卡| 久久久国产精品麻豆| 中文一区一区三区高中清不卡| 亚洲国产精华液网站w| **性色生活片久久毛片| 亚洲宅男天堂在线观看无病毒| 亚洲成av人片在线观看无码| 图片区小说区国产精品视频| 麻豆精品精品国产自在97香蕉| 国产成人一区二区精品非洲| 成人免费视频免费观看| 在线亚洲人成电影网站色www| 欧美日韩一区中文字幕| 精品久久久久一区二区国产| 国产清纯白嫩初高生在线观看91 | 久久99久久精品欧美| 国内精品伊人久久久久av影院| 国产大陆a不卡| 色吧成人激情小说| 精品国产人成亚洲区| 日韩久久一区二区| 免费视频最近日韩| 91丨porny丨首页| 日韩一区二区免费视频| 亚洲欧美日本韩国| 国产伦精品一区二区三区免费迷 | 亚洲精品久久嫩草网站秘色| 免费观看在线色综合| 波波电影院一区二区三区| 3d动漫精品啪啪1区2区免费 | 亚洲成va人在线观看| 国产精品一区二区果冻传媒| 91高清在线观看| 久久奇米777| 日日夜夜一区二区| 色琪琪一区二区三区亚洲区| 精品国产乱码久久久久久闺蜜| 一区二区三区美女视频| 粉嫩av一区二区三区在线播放 | 国产精品综合av一区二区国产馆| 色偷偷成人一区二区三区91 | 亚洲国产裸拍裸体视频在线观看乱了| 久草中文综合在线| 欧美精品99久久久**| 亚洲精品欧美专区| 成人性色生活片免费看爆迷你毛片| 制服.丝袜.亚洲.中文.综合| 亚洲免费在线看| 成人在线视频首页| 久久久影院官网| 久久国产三级精品| 91精品国产综合久久香蕉麻豆| 亚洲精品少妇30p| 95精品视频在线| 国产精品久久久久久久浪潮网站| 国产剧情一区在线| 久久蜜桃一区二区| 国产大陆精品国产| 国产目拍亚洲精品99久久精品| 久久99精品国产| 久久综合久久综合九色| 六月丁香综合在线视频| 欧美一区二区三区在| 男女男精品视频网| 日韩午夜激情电影| 国产综合一区二区| 亚洲国产精品精华液ab| 成人av资源在线观看| 亚洲婷婷综合久久一本伊一区| 成人夜色视频网站在线观看| 国产精品午夜电影| 色综合视频在线观看| 亚洲国产日日夜夜| 岛国一区二区三区| 精品少妇一区二区三区日产乱码| 国产一区999| 菠萝蜜视频在线观看一区| 国产精品色眯眯| 91免费视频大全| 亚洲午夜羞羞片| 欧美一区二区成人6969| 久久精品久久精品| 亚洲国产精品精华液2区45| 99re热视频精品| 亚洲成人激情av| 久久综合久久鬼色| 色婷婷一区二区三区四区| 亚洲成精国产精品女| 久久女同性恋中文字幕| 不卡在线观看av| 午夜精品久久久久久久久久久| 欧美精品一区男女天堂| 成年人国产精品| 日韩极品在线观看| 久久精品在线免费观看| 91黄视频在线| 激情文学综合插| 一区二区三区不卡视频| 亚洲精品一区在线观看| 色呦呦国产精品| 九色综合狠狠综合久久| 亚洲乱码国产乱码精品精98午夜| 日韩三级精品电影久久久| 成人av电影在线| 免费成人结看片| 一区二区三区免费在线观看| 久久久亚洲高清| 欧美精品第1页| 91亚洲精品久久久蜜桃网站| 久久国产精品第一页| 亚洲资源在线观看| 国产精品初高中害羞小美女文| 日韩一区二区三区四区五区六区| 成人免费观看视频| 激情六月婷婷综合| 五月激情丁香一区二区三区| 中文字幕欧美一| 久久久午夜精品理论片中文字幕| 欧美日韩国产免费一区二区| 99久久综合国产精品| 国产精品一级在线| 欧美a一区二区| 污片在线观看一区二区| 一区二区成人在线视频| 亚洲同性gay激情无套| 国产女主播在线一区二区| 欧美变态凌虐bdsm| 91精品婷婷国产综合久久性色| 色婷婷综合久久久| 色哟哟在线观看一区二区三区| 成人av小说网| 成人黄色av电影| 成+人+亚洲+综合天堂| 成人一级黄色片| av成人老司机| 91同城在线观看| 91视频91自| 欧美婷婷六月丁香综合色| 日本高清免费不卡视频| 色久优优欧美色久优优| 色哟哟国产精品| 欧美私模裸体表演在线观看| 色狠狠综合天天综合综合| 91福利国产精品| 欧美性生活久久| 欧美日韩一区二区欧美激情| 欧美日韩一级视频| 欧美日韩美女一区二区| 777午夜精品视频在线播放| 91精品国产欧美一区二区成人| 91麻豆精品国产91久久久更新时间 | 一个色在线综合| 亚洲成人7777| 精品无码三级在线观看视频 | 2020日本不卡一区二区视频| 精品少妇一区二区| 国产喂奶挤奶一区二区三区| 国产精品不卡在线| 亚洲已满18点击进入久久| 五月天婷婷综合| 国产精品一区一区三区| 91最新地址在线播放| 欧美日韩精品免费观看视频| 日韩欧美中文字幕公布| 久久精品视频一区二区| 亚洲欧洲制服丝袜| 另类小说图片综合网| 成人一级黄色片| 制服丝袜中文字幕亚洲| 久久综合久久综合久久| 亚洲欧美另类久久久精品2019| 日韩精品欧美成人高清一区二区| 蜜臀av性久久久久蜜臀aⅴ| 成人午夜av在线| 欧美日韩另类一区| 亚洲国产经典视频| 午夜婷婷国产麻豆精品| 成人免费电影视频| 欧美乱妇15p| 亚洲欧洲av另类| 久久97超碰国产精品超碰| 日本韩国欧美在线| 久久久久久久综合狠狠综合| 一区二区三区在线视频免费| 极品销魂美女一区二区三区| 欧美无砖专区一中文字|