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

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

?? readwrite.cpp

?? 一本在講述USB驅動程式的書 及其范例原碼
?? CPP
字號:
// Read/Write request processors for feature driver
// Copyright (C) 1999 by Walter Oney
// All rights reserved

#include "stddcls.h"
#include "driver.h"

#if DBG
	#define MSGUSBSTRING(d,s,i) { \
		UNICODE_STRING sd; \
		if (i && NT_SUCCESS(GetStringDescriptor(d,i,&sd))) { \
			DbgPrint(s, sd.Buffer); \
			RtlFreeUnicodeString(&sd); \
		}}
#else
	#define MSGUSBSTRING(d,i,s)
#endif

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchCreate
	PAGED_CODE();
	KdPrint((DRIVERNAME " - IRP_MJ_CREATE\n"));
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);

	NTSTATUS status = STATUS_SUCCESS;
	InterlockedIncrement(&pdx->handles);
	return CompleteRequest(Irp, status, 0);
	}							// DispatchCreate

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchClose
	PAGED_CODE();
	KdPrint((DRIVERNAME " - IRP_MJ_CLOSE\n"));
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	InterlockedDecrement(&pdx->handles);
	return CompleteRequest(Irp, STATUS_SUCCESS, 0);
	}							// DispatchClose

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS GetStringDescriptor(PDEVICE_OBJECT fdo, UCHAR istring, PUNICODE_STRING s)
	{							// GetStringDescriptor
	NTSTATUS status;
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	URB urb;

	UCHAR data[256];			// maximum-length buffer

	// If this is the first time here, read string descriptor zero and arbitrarily select
	// the first language identifer as the one to use in subsequent get-descriptor calls.

	if (!pdx->langid)
		{						// determine default language id
		UsbBuildGetDescriptorRequest(&urb, sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), USB_STRING_DESCRIPTOR_TYPE,
			0, 0, data, NULL, sizeof(data), NULL);
		status = SendAwaitUrb(fdo, &urb);
		if (!NT_SUCCESS(status))
			return status;
		pdx->langid = *(LANGID*)(data + 2);
		}						// determine default language id

	// Fetch the designated string descriptor.

	UsbBuildGetDescriptorRequest(&urb, sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), USB_STRING_DESCRIPTOR_TYPE,
		istring, pdx->langid, data, NULL, sizeof(data), NULL);
	status = SendAwaitUrb(fdo, &urb);
	if (!NT_SUCCESS(status))
		return status;

	ULONG nchars = (data[0] - sizeof(WCHAR)) / sizeof(WCHAR);
	if (nchars > 127)
		nchars = 127;
	PWSTR p = (PWSTR) ExAllocatePool(PagedPool, (nchars + 1) * sizeof(WCHAR));
	if (!p)
		return STATUS_INSUFFICIENT_RESOURCES;

	memcpy(p, data + 2, nchars * sizeof(WCHAR));
	p[nchars] = 0;

	s->Length = (USHORT) (sizeof(WCHAR) * nchars);
	s->MaximumLength = (USHORT) ((sizeof(WCHAR) * nchars) + sizeof(WCHAR));
	s->Buffer = p;

	return STATUS_SUCCESS;
	}							// GetStringDescriptor

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS SendAwaitUrb(PDEVICE_OBJECT fdo, PURB urb)
	{							// SendAwaitUrb
	PAGED_CODE();
	ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	KEVENT event;
	KeInitializeEvent(&event, NotificationEvent, FALSE);

	IO_STATUS_BLOCK iostatus;
	PIRP Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
		pdx->LowerDeviceObject, NULL, 0, NULL, 0, TRUE, &event, &iostatus);

	if (!Irp)
		{
		KdPrint((DRIVERNAME " - Unable to allocate IRP for sending URB\n"));
		return STATUS_INSUFFICIENT_RESOURCES;
		}

	PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);
	stack->Parameters.Others.Argument1 = (PVOID) urb;
	NTSTATUS status = IoCallDriver(pdx->LowerDeviceObject, Irp);
	if (status == STATUS_PENDING)
		{
		KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
		status = iostatus.Status;
		}
	return status;
	}							// SendAwaitUrb

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS StartDevice(PDEVICE_OBJECT fdo, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PARTIAL_RESOURCE_LIST translated)
	{							// StartDevice
	PAGED_CODE();
	NTSTATUS status;
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	URB urb;					// URB for use in this subroutine

	// Read our device descriptor. The only real purpose to this would be to find out how many
	// configurations there are so we can read their descriptors. In this simplest of examples,
	// there's only one configuration.

	UsbBuildGetDescriptorRequest(&urb, sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), USB_DEVICE_DESCRIPTOR_TYPE,
		0, 0, &pdx->dd, NULL, sizeof(pdx->dd), NULL);
	status = SendAwaitUrb(fdo, &urb);
	if (!NT_SUCCESS(status))
		{
		KdPrint((DRIVERNAME " - Error %X trying to read device descriptor\n", status));
		return status;
		}

	MSGUSBSTRING(fdo, DRIVERNAME " - Configuring device from %ws\n", pdx->dd.iManufacturer);
	MSGUSBSTRING(fdo, DRIVERNAME " - Product is %ws\n", pdx->dd.iProduct);
	MSGUSBSTRING(fdo, DRIVERNAME " - Serial number is %ws\n", pdx->dd.iSerialNumber);

	// Read the descriptor of the first configuration. This requires two steps. The first step
	// reads the fixed-size configuration descriptor alone. The second step reads the
	// configuration descriptor plus all imbedded interface and endpoint descriptors.

	USB_CONFIGURATION_DESCRIPTOR tcd;
	UsbBuildGetDescriptorRequest(&urb, sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE,
		0, 0, &tcd, NULL, sizeof(tcd), NULL);
	status = SendAwaitUrb(fdo, &urb);
	if (!NT_SUCCESS(status))
		{
		KdPrint((DRIVERNAME " - Error %X trying to read configuration descriptor 1\n", status));
		return status;
		}

	ULONG size = tcd.wTotalLength;
	PUSB_CONFIGURATION_DESCRIPTOR pcd = (PUSB_CONFIGURATION_DESCRIPTOR) ExAllocatePool(NonPagedPool, size);
	if (!pcd)
		{
		KdPrint((DRIVERNAME " - Unable to allocate %X bytes for configuration descriptor\n", size));
		return STATUS_INSUFFICIENT_RESOURCES;
		}

	__try
		{
		UsbBuildGetDescriptorRequest(&urb, sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE,
			0, 0, pcd, NULL, size, NULL);
		status = SendAwaitUrb(fdo, &urb);
		if (!NT_SUCCESS(status))
			{
			KdPrint((DRIVERNAME " - Error %X trying to read configuration descriptor 1\n", status));
			return status;
			}
                                   
		MSGUSBSTRING(fdo, DRIVERNAME " - Selecting configuration named %ws\n", pcd->iConfiguration);

		// Locate the descriptor for the one and only interface we expect to find

		PUSB_INTERFACE_DESCRIPTOR pid = USBD_ParseConfigurationDescriptorEx(pcd, pcd,
			-1, -1, -1, -1, -1);
		ASSERT(pid);
                                   
		MSGUSBSTRING(fdo, DRIVERNAME " - Selecting interface named %ws\n", pid->iInterface);

		// Create a URB to use in selecting a configuration.

		USBD_INTERFACE_LIST_ENTRY interfaces[2] = {
			{pid, NULL},
			{NULL, NULL},		// fence to terminate the array
			};

		PURB selurb = USBD_CreateConfigurationRequestEx(pcd, interfaces);
		if (!selurb)
			{
			KdPrint((DRIVERNAME " - Unable to create configuration request\n"));
			return STATUS_INSUFFICIENT_RESOURCES;
			}

		__try
			{

			// Verify that the interface describes exactly the endpoints we expect

			if (pid->bNumEndpoints != 0)
				{
				KdPrint((DRIVERNAME " - %d is the wrong number of endpoints\n", pid->bNumEndpoints));
				return STATUS_DEVICE_CONFIGURATION_ERROR;
				}

			PUSBD_INTERFACE_INFORMATION pii = interfaces[0].Interface;
			ASSERT(pii->NumberOfPipes == pid->bNumEndpoints);

			// Submit the set-configuration request

			status = SendAwaitUrb(fdo, selurb);
			if (!NT_SUCCESS(status))
				{
				KdPrint((DRIVERNAME " - Error %X trying to select configuration\n", status));
				return status;
				}

			// Save the configuration and pipe handles

			pdx->hconfig = selurb->UrbSelectConfiguration.ConfigurationHandle;

			// Transfer ownership of the configuration descriptor to the device extension
			
			pdx->pcd = pcd;
			pcd = NULL;
			}
		__finally
			{
			ExFreePool(selurb);
			}

		}
	__finally
		{
		if (pcd)
			ExFreePool(pcd);
		}

	return STATUS_SUCCESS;
	}							// StartDevice

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

VOID StopDevice(IN PDEVICE_OBJECT fdo, BOOLEAN oktouch /* = FALSE */)
	{							// StopDevice
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	// If it's okay to touch our hardware (i.e., we're processing an IRP_MN_STOP_DEVICE),
	// deconfigure the device.
	
	if (oktouch)
		{						// deconfigure device
		URB urb;
		UsbBuildSelectConfigurationRequest(&urb, sizeof(_URB_SELECT_CONFIGURATION), NULL);
		NTSTATUS status = SendAwaitUrb(fdo, &urb);
		if (!NT_SUCCESS(status))
			KdPrint((DRIVERNAME " - Error %X trying to deconfigure device\n", status));
		}						// deconfigure device

	if (pdx->pcd)
		ExFreePool(pdx->pcd);
	pdx->pcd = NULL;
	}							// StopDevice

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品久久久久久久99蜜桃| www.久久久久久久久| 一区二区成人在线| 亚洲人成影院在线观看| 亚洲欧美另类久久久精品 | 91超碰这里只有精品国产| 欧美三级韩国三级日本三斤| 欧美私模裸体表演在线观看| 欧美性一级生活| 欧美三级电影一区| 3751色影院一区二区三区| 3d动漫精品啪啪1区2区免费| 精品国产一区二区三区四区四| 欧美成人性战久久| 国产精品天天看| 亚洲免费看黄网站| 午夜不卡av在线| 国产一区二区三区电影在线观看 | 中文字幕不卡三区| 一区二区三区在线不卡| 亚洲一区二区三区激情| 日韩av一级电影| 国产69精品久久久久毛片| 91在线免费看| 欧美一二三四在线| 中日韩av电影| 亚洲 欧美综合在线网络| 国产一区二区美女诱惑| 色婷婷av一区二区三区gif| 7777精品伊人久久久大香线蕉经典版下载 | 免费在线成人网| 成人一区二区三区中文字幕| 欧美日韩一卡二卡三卡| 久久久久久黄色| 亚洲国产精品综合小说图片区| 黄页视频在线91| 色综合欧美在线| 久久久久久久久久久99999| 一区二区三区四区不卡视频| 狠狠色丁香婷婷综合| 色狠狠桃花综合| 国产网红主播福利一区二区| 天天综合日日夜夜精品| 成人v精品蜜桃久久一区| 日韩一区二区免费视频| 一区二区三区在线看| 国产综合久久久久影院| 欧美日韩国产系列| 亚洲欧美激情视频在线观看一区二区三区| 天天色综合成人网| 91丨九色丨蝌蚪富婆spa| 精品国产a毛片| 香蕉加勒比综合久久| 91麻豆文化传媒在线观看| 久久色.com| 看国产成人h片视频| 欧美群妇大交群中文字幕| 综合色天天鬼久久鬼色| 国产成人av电影在线| 2014亚洲片线观看视频免费| 天堂一区二区在线| 欧美三级电影在线观看| 亚洲综合丝袜美腿| 91福利在线播放| 亚洲天堂a在线| 99久久久久久| 国产精品国产三级国产aⅴ原创 | 色综合久久中文综合久久牛| 日本一区二区三区久久久久久久久不| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美视频精品在线| 一区二区视频在线| 在线观看视频91| 夜夜精品视频一区二区| 91福利在线免费观看| 亚洲永久免费av| 欧美三级日韩三级| 日韩福利视频网| 91精品国产色综合久久不卡电影 | 国产美女主播视频一区| 日韩精品一区二区三区视频播放| 爽好多水快深点欧美视频| 5月丁香婷婷综合| 久久丁香综合五月国产三级网站| 日韩欧美专区在线| 国模一区二区三区白浆| 久久久久久电影| 色综合色狠狠综合色| 亚洲成人一区在线| 欧美一区中文字幕| 国产一区二区精品在线观看| 久久精品视频网| 99精品久久只有精品| 亚洲第一福利视频在线| 欧美一级欧美一级在线播放| 国内精品在线播放| 国产精品美女久久久久久| 91美女福利视频| 日本成人中文字幕在线视频| 久久久九九九九| 欧美在线免费播放| 男男视频亚洲欧美| 久久丝袜美腿综合| 欧美日韩综合在线免费观看| 久久99精品国产麻豆婷婷洗澡| www国产成人| 欧美中文字幕亚洲一区二区va在线| 日产精品久久久久久久性色| 久久人人爽人人爽| 欧美在线一区二区三区| 久久99国产精品免费| 亚洲欧美日韩一区二区| 精品乱码亚洲一区二区不卡| 91视频.com| 国产精品一区二区x88av| 亚洲一区在线观看网站| 国产日韩欧美精品综合| 欧美午夜电影在线播放| 国产成+人+日韩+欧美+亚洲| 香蕉乱码成人久久天堂爱免费| 欧美激情艳妇裸体舞| 欧美精品丝袜中出| 99精品久久99久久久久| 久久成人久久鬼色| 五月天欧美精品| 亚洲欧美日韩久久精品| 国产无人区一区二区三区| 欧美一区二区久久| 日本高清不卡aⅴ免费网站| 粉嫩嫩av羞羞动漫久久久 | 久久久久久免费网| 欧美精品在线一区二区| 一本色道**综合亚洲精品蜜桃冫| 韩国av一区二区三区四区| 午夜影视日本亚洲欧洲精品| 亚洲同性同志一二三专区| 国产欧美久久久精品影院| 91麻豆精品国产自产在线 | 91行情网站电视在线观看高清版| 久久99久久精品| 日韩av电影天堂| 天堂资源在线中文精品| 亚洲狼人国产精品| 亚洲欧美偷拍卡通变态| 亚洲视频一二三| 亚洲三级在线看| 日韩毛片在线免费观看| 亚洲视频香蕉人妖| 亚洲婷婷国产精品电影人久久| 国产精品欧美一区二区三区| 国产午夜亚洲精品午夜鲁丝片| 欧美一区二区成人| 日韩亚洲欧美一区二区三区| 日韩美女视频一区二区在线观看| 欧美精品免费视频| 欧美成人高清电影在线| 精品电影一区二区三区| 精品不卡在线视频| 国产欧美日韩视频一区二区| 欧美国产精品劲爆| 综合久久久久综合| 一区二区三区日韩欧美| 亚洲成a人v欧美综合天堂下载| 丝袜美腿一区二区三区| 美女爽到高潮91| 激情欧美日韩一区二区| 国产一区二区三区综合| 丁香天五香天堂综合| 91麻豆蜜桃一区二区三区| 在线观看欧美日本| 日韩一区二区麻豆国产| 久久九九影视网| 一区二区高清在线| 蜜臀av一区二区| 成人爽a毛片一区二区免费| aaa欧美日韩| 69堂成人精品免费视频| 国产亚洲精品福利| 一区二区三区四区蜜桃| 天堂va蜜桃一区二区三区漫画版 | 国产精品护士白丝一区av| 亚洲综合激情网| 麻豆精品视频在线观看视频| 成人福利视频在线| 精品视频在线免费观看| 精品成人在线观看| 一区二区三区欧美| 国产一区二区在线视频| 91日韩一区二区三区| 日韩一区二区三区四区| 国产精品久久久久桃色tv| 天天做天天摸天天爽国产一区| 国内精品久久久久影院色| 在线观看免费亚洲| 久久精品在线免费观看| 日本午夜精品视频在线观看| 91原创在线视频| 国产调教视频一区| 麻豆精品在线视频| 欧美视频一区二区三区四区|