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

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

?? driverentry.cpp

?? 一本在講述USB驅(qū)動程式的書 及其范例原碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// Main program for wdmstub driver
// Copyright (C) 2000 by Walter Oney
// All rights reserved

// Use this driver as a lower filter for any WDM driver that uses one or more
// of the non-WDM functions this driver supports.

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

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);
VOID DriverUnload(IN PDRIVER_OBJECT fdo);
NTSTATUS DispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp);
NTSTATUS DispatchInternalControl(IN PDEVICE_OBJECT fido, IN PIRP Irp);
NTSTATUS DispatchPower(IN PDEVICE_OBJECT fido, IN PIRP Irp);
NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fido, IN PIRP Irp);

BOOLEAN IsWin98();
BOOLEAN StubsDefined = FALSE;	// true if we defined any stubs
PDEVICE_OBJECT DummyDeviceObject = NULL;	// dummy device object
BOOLEAN CheckCloneVersions(PDRIVER_OBJECT DriverObject);

///////////////////////////////////////////////////////////////////////////////
// Declare dummy symbols to bound the pointers emitted by the compiler for
// static initialization functions.

typedef void (__cdecl *INITFUNCTION)();

#pragma data_seg(".CRT$XCA")
static INITFUNCTION BeginInitFunctions[1] = {0};

#pragma data_seg(".CRT$XCZ")
static INITFUNCTION EndInitFunctions[1] = {0};

#pragma data_seg()

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

#pragma INITCODE

extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath)
	{							// DriverEntry

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

	if (!IsWin98())
		{
		KdPrint((DRIVERNAME " - Driver should only be used in Windows 98"));
		return STATUS_UNSUCCESSFUL;
		}

	// Execute static initialization routines. This became necessary with SP-9
	// when we started using the Xp DDK compiler

	for (INITFUNCTION* p = BeginInitFunctions + 1; p < EndInitFunctions; ++p)
		(*p)();

	// Initialize function pointers

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

	for (int i = 0; i < arraysize(DriverObject->MajorFunction); ++i)
		DriverObject->MajorFunction[i] = DispatchAny;

	DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
	DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
	DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = DispatchInternalControl;

	// See if there are other instances of WDMSTUB running on this computer. These
	// might include the original WDMSTUB.VXD from the book or an OEM clone of this
	// driver.

	StubsDefined = CheckCloneVersions(DriverObject);

	// Create export definitions for the WDM functions this driver supplies

	if (StubsDefined && !DefineStubs())
		{						// error defining stubs
		ObDereferenceObject(DriverObject);
		IoDeleteDevice(DummyDeviceObject);
		return STATUS_UNSUCCESSFUL;
		}						// error defining stubs

	return STATUS_SUCCESS;
	}							// DriverEntry

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

#pragma PAGEDCODE

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
	{							// AddDevice
	PAGED_CODE();

	NTSTATUS status;

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

	PDEVICE_OBJECT fdo;
	#define xsize sizeof(DEVICE_EXTENSION)
	status = IoCreateDevice(DriverObject, xsize, NULL,
		FILE_DEVICE_UNKNOWN, 0, 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;

	// From this point forward, any error will have side effects that need to
	// be cleaned up.

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

		// Add our device object to the stack and propagate critical settings
		// from the immediately lower device object

		PDEVICE_OBJECT ldo = IoAttachDeviceToDeviceStack(fdo, pdo);
		if (!ldo)
			{						// can't attach device
			KdPrint((DRIVERNAME " - IoAttachDeviceToDeviceStack failed\n"));
			status = STATUS_DEVICE_REMOVED;
			break;;
			}						// can't attach device

		pdx->LowerDeviceObject = ldo;
		fdo->DeviceType = ldo->DeviceType;
		fdo->Characteristics = ldo->Characteristics;

		// Copy the flags related to I/O buffering from the lower device object so the I/O manager
		// will create the expected data structures for reads and writes.

		fdo->Flags |= ldo->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO);

		// Indicate that we have a pagable power handler. The reason we do this is actually fairly
		// complex, as follows. It's okay to have a pagable power handler layered above a non-paged
		// or in-rush power handler, but not the other way around. If we're an upper filter for any
		// kind of device, it's safer to leave this flag set always. If we were to clear it (for
		// example, because we notice that the guy under us is non-paged or becomes so after
		// processing a usage notification), we would have to always set it when passing down
		// usage notifications later on or risk violating the rule.

		// IF WE ARE A LOWER FILTER FOR A DEVICE THAT HAS A NON-PAGABLE POWER HANDLER, OR FOR A
		// DEVICE THAT CHANGES BETWEEN PAGED AND NON-PAGED DEPENDING ON USAGE NOTIFICATIONS, THIS
		// SIMPLISTIC CODE IS WRONG. YOU MUST FIND OUT HOW THE UPPER DRIVER WILL HANDLE THE
		// DO_POWER_PAGABLE FLAG AND DO THE RIGHT THING.

		fdo->Flags |= DO_POWER_PAGABLE;

		// 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 (pdx->LowerDeviceObject)
			IoDetachDevice(pdx->LowerDeviceObject);
		IoDeleteDevice(fdo);
		}					// need to cleanup

	return status;
	}							// AddDevice

///////////////////////////////////////////////////////////////////////////////
// CheckCloneVersions looks for the VxD version of WDMSTUB or an OEM clone of
// this same filter driver and evaluates the version number(s) of any such.
// It returns TRUE if version checking indicates that we should stub or implement
// at least one function.

#pragma PAGEDCODE

BOOLEAN CheckCloneVersions(PDRIVER_OBJECT DriverObject)
	{							// CheckCloneVersions
	BOOLEAN result = TRUE;

	// See if there is a VxD version of WDMSTUB loaded and, if so, what it's version
	// number is.

	PVMMDDB ddb = Get_DDB(0, "WDMSTUB ");
	if (ddb)
		{						// VxD version loaded
		if (ddb->DDB_Dev_Major_Version > VERMAJOR || (ddb->DDB_Dev_Major_Version == VERMAJOR && ddb->DDB_Dev_Minor_Version > VERMINOR))
			{					// defer to VxD
			KdPrint((DRIVERNAME " - Deferring to WDMSTUB.VXD version %d.%2.2d\n", ddb->DDB_Dev_Major_Version, ddb->DDB_Dev_Minor_Version));
			result = FALSE;
			}					// defer to VxD
		else
			KdPrint((DRIVERNAME " - Overriding WDMSTUB.VXD version %d.%2.2d\n", ddb->DDB_Dev_Major_Version, ddb->DDB_Dev_Minor_Version));
		}						// VxD version loaded

	// See if there is a clone of this filter driver with a higher version number

	ULONG index;				// current driver index
	ULONG avail = 0xFFFFFFFF;	// an available driver index
	WCHAR namebuf[32];
	UNICODE_STRING devname;

	KEVENT event;
	KeInitializeEvent(&event, SynchronizationEvent, FALSE);
	IO_STATUS_BLOCK iostatus;
	NTSTATUS status;

	// Look for dummy device objects WDMSTUB0 through WDMSTUB99

	for (index = 0; index < 100 && result; ++index)
		{						// for each possible driver index
		_snwprintf(namebuf, arraysize(namebuf), L"\\Device\\WDMSTUB%d", index);
		RtlInitUnicodeString(&devname, namebuf);

		PFILE_OBJECT fop;
		PDEVICE_OBJECT clone;
		status = IoGetDeviceObjectPointer(&devname, FILE_READ_DATA, &fop, &clone);

		// If there is a device object with this name, send it a get-version IOCTL

		if (NT_SUCCESS(status))
			{					// found a clone
			ULONG version;
			PIRP Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_WDMSTUB_GET_VERSION, clone, NULL, 0, &version, sizeof(version),
				TRUE, &event, &iostatus);
			if (!Irp)
				{
				KdPrint((DRIVERNAME " - Unable to allocate IRP for version query\n"));
				result = FALSE;
				}
			else
				{				// send IRP
				status = IoCallDriver(clone, Irp);
				if (status == STATUS_PENDING)
					{			// wait for IRP
					KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
					status = iostatus.Status;
					}			// wait for IRP
				if (NT_SUCCESS(status))
					{			// check version #
					if (version >= ((VERMAJOR << 16) | VERMINOR))
						{		// found higher version
						KdPrint((DRIVERNAME " - Deferring to WDMSTUB clone version %d.%2.2d\n", version >> 16, version & 0xFFFF));

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
五月激情综合网| 亚洲成人资源网| 欧美日韩一区二区三区在线| 久久草av在线| 亚洲一区二区美女| 国产女同互慰高潮91漫画| 欧美亚洲国产一卡| 国产成人超碰人人澡人人澡| 日韩激情一二三区| 自拍视频在线观看一区二区| 日韩精品一区二区三区在线| 日本韩国一区二区三区| 国产成人在线视频网站| 蜜桃视频在线观看一区| 亚洲一区二区免费视频| 国产精品看片你懂得| 欧美一区二区私人影院日本| 91网站最新网址| 国产精品一区免费在线观看| 美国欧美日韩国产在线播放| 首页国产丝袜综合| 一区二区三区四区在线| 国产精品女同一区二区三区| 久久久久久电影| 日韩欧美国产电影| 91精品国产综合久久精品app| 99免费精品视频| 成人免费视频网站在线观看| 国产激情偷乱视频一区二区三区| 另类小说色综合网站| 五月天婷婷综合| 亚洲精选视频免费看| 中文字幕一区视频| 中文字幕av一区二区三区高| 久久亚洲捆绑美女| 日韩精品专区在线影院观看 | 国产精品一区二区免费不卡| 蜜臀av性久久久久蜜臀aⅴ四虎| 午夜免费久久看| 一区二区三区四区精品在线视频| 亚洲男人天堂一区| 亚洲少妇中出一区| 亚洲欧美日韩国产综合| 亚洲色图第一区| 亚洲人成7777| 一区二区三区在线视频观看58 | 国产真实乱偷精品视频免| 日本午夜一区二区| 91久久精品网| 在线免费观看日本欧美| 在线视频中文字幕一区二区| 欧美日韩国产片| 91精品国产91久久综合桃花| 日韩欧美中文字幕制服| 26uuu另类欧美| 日本一区二区动态图| 国产精品无人区| 中文字幕制服丝袜成人av | 亚洲一卡二卡三卡四卡无卡久久 | 欧洲国内综合视频| 欧美在线观看视频一区二区三区| 欧美人动与zoxxxx乱| 欧美一级欧美一级在线播放| 久久久国产精品麻豆| 中文字幕精品—区二区四季| 亚洲美女淫视频| 在线视频中文字幕一区二区| 午夜久久久影院| 亚洲精品久久久蜜桃| 一区二区欧美在线观看| 午夜视频在线观看一区二区三区| 久久aⅴ国产欧美74aaa| 国产成人精品免费一区二区| 91国偷自产一区二区三区观看| 欧美精品黑人性xxxx| 久久亚洲免费视频| 亚洲精品成人天堂一二三| 日韩精品久久久久久| 国产一区二区三区av电影| 97精品久久久午夜一区二区三区 | 亚洲国产一区视频| 日韩高清不卡在线| 国产一区二区福利| 一本久久a久久精品亚洲| 欧美欧美欧美欧美| 久久久久久夜精品精品免费| 亚洲欧美日韩中文播放| 免费久久精品视频| 成人av午夜影院| 91精品国产一区二区三区蜜臀| 国产日产欧美一区二区视频| 亚洲成va人在线观看| 国产精品中文欧美| 欧美亚洲一区三区| 久久夜色精品一区| 亚洲国产日韩精品| 国产成人精品免费看| 欧美区视频在线观看| 中文无字幕一区二区三区| 婷婷开心激情综合| 99久久国产综合色|国产精品| 日韩一区二区三区四区| 亚洲视频一区二区在线| 国内精品国产成人| 欧美日韩国产在线观看| 最新成人av在线| 国产真实乱子伦精品视频| 欧美精品丝袜中出| 亚洲精品免费在线| 国产成人免费高清| 精品精品国产高清a毛片牛牛| 亚洲网友自拍偷拍| 99久久精品久久久久久清纯| 视频一区在线播放| 在线欧美日韩精品| 亚洲人xxxx| 成人蜜臀av电影| 国产亚洲欧美在线| 久久国产精品99久久人人澡| 欧美日本视频在线| 亚洲一区二区成人在线观看| 日韩欧美一级二级三级久久久| 99久久精品国产一区二区三区 | 国产一区二区三区在线观看精品| 欧美日韩国产天堂| 一区二区三区四区在线免费观看| av在线这里只有精品| 精品1区2区在线观看| 日本 国产 欧美色综合| 欧美乱妇15p| 亚洲gay无套男同| 91久久精品日日躁夜夜躁欧美| 日韩毛片一二三区| 99久久精品情趣| 亚洲欧美综合另类在线卡通| 91在线视频观看| 中文字幕日韩一区| 粉嫩绯色av一区二区在线观看 | 日韩电影在线看| 欧美在线观看一二区| 一区二区免费在线播放| 91啪亚洲精品| 亚洲三级久久久| 一本色道a无线码一区v| 亚洲人成网站色在线观看| 91影院在线观看| 一区二区在线观看免费| 色诱视频网站一区| 亚洲大片一区二区三区| 欧美精品在线视频| 美女视频黄a大片欧美| www一区二区| 国产一区二区三区香蕉| 国产丝袜在线精品| 成人免费视频视频在线观看免费| 成人免费一区二区三区视频| 欧美亚洲综合网| 视频在线观看一区二区三区| 欧美大尺度电影在线| 国产在线播放一区二区三区| 中文字幕不卡在线| 91久久精品日日躁夜夜躁欧美| 亚洲成人激情社区| 日韩欧美国产一二三区| 国产伦精品一区二区三区免费 | 中文子幕无线码一区tr| 成人福利视频网站| 一区二区三区日韩精品视频| 在线观看网站黄不卡| 蜜桃av一区二区在线观看| 欧美韩国日本综合| 欧美午夜片在线看| 蜜桃视频免费观看一区| 国产欧美一区二区精品婷婷| 91成人在线免费观看| 精品一区二区免费看| 日韩美女视频一区| 在线成人av影院| 丰满亚洲少妇av| 亚洲一区二区三区四区在线 | 日本v片在线高清不卡在线观看| 2017欧美狠狠色| 在线亚洲+欧美+日本专区| 国产在线播精品第三| 亚洲一区二区三区中文字幕 | 日韩一级高清毛片| 国产91丝袜在线播放| 亚洲成人第一页| 欧美一级理论片| 成人av动漫网站| 五月天激情综合| 中文字幕亚洲在| 欧美一二三四在线| 97久久久精品综合88久久| 麻豆91在线观看| 亚洲国产日日夜夜| 国产亚洲欧美一级| 欧美一区二区三区性视频| av在线一区二区三区| 国产综合色在线|