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

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

?? driverentry.cpp

?? 一本在講述USB驅(qū)動(dòng)程式的書(shū) 及其范例原碼
?? CPP
字號(hào):
// Main program for notify driver
// Copyright (C) 2001 by Walter Oney
// All rights reserved

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

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);

struct INIT_STRUCT : public _GENERIC_INIT_STRUCT {
//	QSIO morequeues[1];			// additional devqueue/sio pointers
	};

BOOLEAN win98 = FALSE;

UNICODE_STRING servkey;

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

#pragma PAGEDCODE

extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath)
	{							// DriverEntry
	KdPrint((DRIVERNAME " - Entering DriverEntry: DriverObject %8.8lX\n", DriverObject));

	// Insist that OS support at least the WDM level of the DDK we use

	if (!IoIsWdmVersionAvailable(1, 0))
		{
		KdPrint((DRIVERNAME " - Expected version of WDM (%d.%2.2d) not available\n", 1, 0));
		return STATUS_UNSUCCESSFUL;
		}

	// We require GENERIC.SYS 1.3 or later. If a version earlier than 1.3 is installed,
	// GenericGetVersion won't be exported, and this driver won't load in the first place.
	// Too bad I didn't think of including this function at the beginning!

	if (GenericGetVersion() < 0x00010003)
		{
		KdPrint((DRIVERNAME " - Required version (1.3) of GENERIC.SYS not installed\n"));
		return STATUS_UNSUCCESSFUL;
		}

	// See if we're running under Win98 or NT:

	win98 = IsWin98();

#if DBG
	if (win98)
		KdPrint((DRIVERNAME " - Running under Windows 98\n"));
	else
		KdPrint((DRIVERNAME " - Running under NT\n"));
#endif

	// Save the name of the service key

	servkey.Buffer = (PWSTR) ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR));
	if (!servkey.Buffer)
		{
		KdPrint((DRIVERNAME " - Unable to allocate %d bytes for copy of service key name\n", RegistryPath->Length + sizeof(WCHAR)));
		return STATUS_INSUFFICIENT_RESOURCES;
		}
	servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR);
	RtlCopyUnicodeString(&servkey, RegistryPath);
	servkey.Buffer[RegistryPath->Length / 2] = 0;	// add a null terminator

	// Initialize function pointers

	DriverObject->DriverUnload = DriverUnload;
	DriverObject->DriverExtension->AddDevice = AddDevice;

	DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
	DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
	DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = DispatchWmi;
	DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchControl;
	DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
	DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
	
	return STATUS_SUCCESS;
	}							// DriverEntry

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

#pragma PAGEDCODE

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
	{							// DriverUnload
	PAGED_CODE();
	KdPrint((DRIVERNAME " - Entering DriverUnload: DriverObject %8.8lX\n", DriverObject));
	RtlFreeUnicodeString(&servkey);
	}							// DriverUnload

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

#pragma PAGEDCODE

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
	{							// AddDevice
	PAGED_CODE();
	KdPrint((DRIVERNAME " - Entering AddDevice: DriverObject %8.8lX, pdo %8.8lX\n", DriverObject, pdo));

	NTSTATUS status;

	// Create a function device object to represent the hardware we're managing.

	PDEVICE_OBJECT fdo;

	ULONG dxsize = (sizeof(DEVICE_EXTENSION) + 7) & ~7;
	ULONG xsize = dxsize + GetSizeofGenericExtension();
	
	UNICODE_STRING devname;
	RtlInitUnicodeString(&devname, L"\\DosDevices\\NOTIFY");

	status = IoCreateDevice(DriverObject, xsize, &devname,
		FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &fdo);
	if (!NT_SUCCESS(status))
		{						// can't create device object
		KdPrint((DRIVERNAME " - IoCreateDevice failed - %X\n", status));
		return status;
		}						// can't create device object
	
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	BOOLEAN ginit = FALSE;

	// From this point forward, any error will have side effects that need to
	// be cleaned up. Using a do-once block allows us to modify the program
	// easily without losing track of the side effects.

	do
		{						// finish initialization
		pdx->DeviceObject = fdo;
		pdx->Pdo = pdo;

		// Make a copy of the device name

		pdx->devname.Buffer = (PWCHAR) ExAllocatePool(NonPagedPool, devname.MaximumLength);
		if (!pdx->devname.Buffer)
			{					// can't allocate buffer
			status = STATUS_INSUFFICIENT_RESOURCES;
			KdPrint((DRIVERNAME " - Unable to allocate %d bytes for copy of name\n", devname.MaximumLength));
			break;
			}					// can't allocate buffer
		pdx->devname.MaximumLength = devname.MaximumLength;
		RtlCopyUnicodeString(&pdx->devname, &devname);

		// Link our device object into the stack leading to the PDO
		
		pdx->LowerDeviceObject = IoAttachDeviceToDeviceStack(fdo, pdo);
		if (!pdx->LowerDeviceObject)
			{						// can't attach device
			KdPrint((DRIVERNAME " - IoAttachDeviceToDeviceStack failed\n"));
			status = STATUS_DEVICE_REMOVED;
			break;
			}						// can't attach device

		// Set power management flags in the device object

		fdo->Flags |= DO_POWER_PAGABLE;

		// Initialize to use the GENERIC.SYS library

		pdx->pgx = (PGENERIC_EXTENSION) ((PUCHAR) pdx + dxsize);

		INIT_STRUCT gis;
		RtlZeroMemory(&gis, sizeof(gis));
		gis.Size = sizeof(gis);
		gis.DeviceObject = fdo;
		gis.Pdo = pdo;
		gis.Ldo = pdx->LowerDeviceObject;
		gis.RemoveLock = &pdx->RemoveLock;
		gis.StartDevice = StartDevice;
		gis.StopDevice = StopDevice;
		gis.RemoveDevice = RemoveDevice;
		RtlInitUnicodeString(&gis.DebugName, LDRIVERNAME);
		gis.Flags |= GENERIC_PENDING_IOCTLS;

		status = InitializeGenericExtension(pdx->pgx, &gis);
		if (!NT_SUCCESS(status))
			{
			KdPrint((DRIVERNAME " - InitializeGenericExtension failed - %X\n", status));
			break;
			}
		ginit = TRUE;

		// Clear the "initializing" flag so that we can get IRPs

		fdo->Flags &= ~DO_DEVICE_INITIALIZING;
		}						// finish initialization
	while (FALSE);

	if (!NT_SUCCESS(status))
		{					// need to cleanup
		if (ginit)
			CleanupGenericExtension(pdx->pgx);
		if (pdx->devname.Buffer)
			RtlFreeUnicodeString(&pdx->devname);
		if (pdx->LowerDeviceObject)
			IoDetachDevice(pdx->LowerDeviceObject);
		IoDeleteDevice(fdo);
		}					// need to cleanup

	return status;
	}							// AddDevice

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

#pragma LOCKEDCODE

NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info)
	{							// CompleteRequest
	Irp->IoStatus.Status = status;
	Irp->IoStatus.Information = info;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	return status;
	}							// CompleteRequest

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

#pragma PAGEDCODE

NTSTATUS DispatchPnp(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchPnp
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	return GenericDispatchPnp(pdx->pgx, Irp);
	}							// DispatchPnp

NTSTATUS DispatchPower(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchPower
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	return GenericDispatchPower(pdx->pgx, Irp);
	}							// DispatchPower

// This dispatch routine for IRP_MJ_SYSTEM_CONTROL is a dummy generated by the
// wizard because the Driver Verifier requires one. Note that this routine
// only appears here because you did *not* specify this IRP type in the wizard
// dialogs.

NTSTATUS DispatchWmi(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchWmi
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	IoSkipCurrentIrpStackLocation(Irp);
	return IoCallDriver(pdx->LowerDeviceObject, Irp);
	}							// DispatchWmi

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

#pragma PAGEDCODE

VOID RemoveDevice(IN PDEVICE_OBJECT fdo)
	{							// RemoveDevice
	PAGED_CODE();
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	NTSTATUS status;

	RtlFreeUnicodeString(&pdx->devname);

	if (pdx->LowerDeviceObject)
		IoDetachDevice(pdx->LowerDeviceObject);

	IoDeleteDevice(fdo);
	}							// RemoveDevice

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

#if DBG && defined(_X86_)
#pragma LOCKEDCODE

extern "C" void __declspec(naked) __cdecl _chkesp()
	{
	_asm je okay
	ASSERT(!DRIVERNAME " - Stack pointer mismatch!");
okay:
	_asm ret
	}

#endif // DBG

#pragma LOCKEDCODE				// force inline functions into nonpaged code

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲成人自拍| 综合网在线视频| 亚洲国产精品精华液ab| 精品久久五月天| 日韩欧美国产午夜精品| 欧美三级日本三级少妇99| 99久久久久久99| 国产激情91久久精品导航| 麻豆免费精品视频| 日韩和欧美的一区| 午夜精品影院在线观看| 一区二区三区欧美日| 亚洲精品自拍动漫在线| 亚洲欧美经典视频| 一区二区在线看| 一区二区三区四区乱视频| 中文字幕中文乱码欧美一区二区| 久久九九国产精品| 国产欧美精品一区二区色综合| 精品国产麻豆免费人成网站| 26uuu国产在线精品一区二区| 日韩一区二区三区在线视频| 欧美一区二区三区免费观看视频| 亚洲欧洲日韩女同| 在线一区二区观看| 9191久久久久久久久久久| 亚洲精选视频免费看| 一片黄亚洲嫩模| 中文一区二区在线观看| 国产精品欧美久久久久一区二区 | 在线播放国产精品二区一二区四区 | 欧美午夜精品久久久久久孕妇| 91在线免费视频观看| 欧美日本在线一区| 国产精品久久久久一区二区三区共| 日韩美女精品在线| 秋霞影院一区二区| 国产精品一区二区在线播放| 欧美自拍丝袜亚洲| 精品国产麻豆免费人成网站| 亚洲久草在线视频| 久久精品国产免费| 欧美日韩成人高清| 亚洲毛片av在线| 国产成人啪免费观看软件| 一级精品视频在线观看宜春院 | 麻豆精品视频在线观看视频| www.色精品| 国产视频一区二区三区在线观看 | 成人综合在线视频| 91精品国产高清一区二区三区| 亚洲免费观看视频| 国产精品18久久久| 精品国产露脸精彩对白| 午夜精品久久久久久久99樱桃| 91美女精品福利| 亚洲欧美色综合| 成人开心网精品视频| 精品少妇一区二区三区在线播放| 亚洲mv大片欧洲mv大片精品| 91美女片黄在线观看91美女| 亚洲国产精品传媒在线观看| 国产一区视频在线看| 欧美大片顶级少妇| 乱中年女人伦av一区二区| 日韩一区二区中文字幕| 日韩vs国产vs欧美| 欧美精品第一页| 麻豆91精品91久久久的内涵| 欧美一区二区三区在线| 六月婷婷色综合| 亚洲欧洲美洲综合色网| 欧美福利电影网| 成人午夜私人影院| 青青草一区二区三区| 国产亚洲成aⅴ人片在线观看| 美女脱光内衣内裤视频久久影院| 日韩美女一区二区三区四区| 国产精品亚洲视频| 一区二区欧美国产| 日韩免费看的电影| 99riav久久精品riav| 日韩精品成人一区二区在线| 精品对白一区国产伦| 波多野结衣中文一区| 亚洲国产精品影院| 久久久久久久av麻豆果冻| 成人av网站免费观看| 美腿丝袜亚洲综合| 一区二区视频在线看| 26uuu国产一区二区三区| 91在线观看成人| 国内精品视频一区二区三区八戒| 亚洲女爱视频在线| 久久精品视频网| 69堂亚洲精品首页| 91亚洲国产成人精品一区二区三| 美女视频网站久久| 一级中文字幕一区二区| 中文字幕不卡的av| 久久品道一品道久久精品| 欧美日韩国产一区| 一本大道久久a久久精二百| 国产又黄又大久久| 美女视频黄免费的久久 | 国产精品久久久久影院| 久久综合久久综合亚洲| 精品欧美久久久| 91精品国产入口| 欧美日韩美少妇 | 91亚洲永久精品| 成人美女视频在线观看| 国产福利一区二区| 国产一区二区三区视频在线播放| 日本欧洲一区二区| 琪琪久久久久日韩精品| 免费欧美在线视频| 麻豆91精品91久久久的内涵| 麻豆免费精品视频| 狠狠色丁香婷婷综合久久片| 激情六月婷婷久久| 国产精品一线二线三线精华| 国产不卡视频一区二区三区| 成人看片黄a免费看在线| aaa欧美色吧激情视频| 91视频一区二区| 欧美日韩一本到| 欧美成人三级电影在线| 久久久综合激的五月天| 国产精品久久久久影院| 亚洲国产日韩精品| 激情综合亚洲精品| 99精品视频一区二区| 欧美日韩不卡在线| 久久精品一二三| 亚洲另类一区二区| 日韩av在线免费观看不卡| 国产一区二区主播在线| 色综合久久中文综合久久97| 欧美一级搡bbbb搡bbbb| 国产精品久久久久永久免费观看| 亚洲一区二区三区四区中文字幕| 日本中文字幕不卡| 成人av资源网站| 91精品国产欧美一区二区18| 国产精品初高中害羞小美女文 | 免费观看成人av| av动漫一区二区| 亚洲国产精品黑人久久久| 日韩成人免费电影| jizz一区二区| 久久久精品天堂| 麻豆精品一区二区综合av| 欧美视频精品在线| 中文字幕一区二区视频| 国产成人综合网站| 日韩情涩欧美日韩视频| 亚洲成年人影院| 在线观看国产91| 亚洲人吸女人奶水| 91亚洲精品一区二区乱码| 久久久久久久精| 国产成人在线视频网站| 日韩精品一区国产麻豆| 免费观看一级欧美片| 在线欧美日韩精品| 亚洲综合免费观看高清完整版在线 | 免费看欧美美女黄的网站| 91精品国产麻豆| 久久精品国产在热久久| 日韩免费观看高清完整版| 美女视频免费一区| www激情久久| 成人午夜伦理影院| 成人欧美一区二区三区| 91麻豆精品视频| 亚洲电影视频在线| 日韩视频免费观看高清完整版| 久久66热偷产精品| 欧美经典一区二区| 日本道精品一区二区三区 | 美女一区二区在线观看| 国产日韩欧美精品在线| 不卡一区二区在线| 一片黄亚洲嫩模| 精品播放一区二区| 成人av电影在线网| 天堂在线亚洲视频| 国产欧美精品区一区二区三区| 91在线免费视频观看| 日本不卡高清视频| 国产精品久久夜| 日韩精品资源二区在线| 99久久免费精品| 老司机精品视频导航| 亚洲乱码中文字幕综合| 欧美成人女星排名| 欧美午夜电影网| 成人av动漫网站| 国产不卡在线一区|