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

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

?? driverentry.cpp

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

// POWTRACE.SYS is intended as a lower filter that will show all the power-related irps flowing
// downward from a function driver. The resulting debug trace can be useful in diagnosing power
// management problems with drivers.

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

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);
NTSTATUS CapabilitiesQueryCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS DispatchAny(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);
NTSTATUS DispatchWmi(IN PDEVICE_OBJECT fido, IN PIRP Irp);
ULONG GetDeviceTypeToUse(PDEVICE_OBJECT pdo);
NTSTATUS PowerCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);
VOID PowerTrace(PDEVICE_EXTENSION pdx, char* ctl, ...);
VOID ShowCapabilities(PDEVICE_EXTENSION pdx, PDEVICE_CAPABILITIES pdc);
NTSTATUS StartDeviceCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);
NTSTATUS UsageNotificationCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);

char* sysnames[] = {
	"PowerSystemUnspecified",
	"PowerSystemWorking",
	"PowerSystemSleeping1",
	"PowerSystemSleeping2",
	"PowerSystemSleeping3",
	"PowerSystemHibernate",
	"PowerSystemShutdown",
	};

char* devnames[] = {
	"PowerDeviceUnspecified",
	"PowerDeviceD0",
	"PowerDeviceD1",
	"PowerDeviceD2",
	"PowerDeviceD3",
	};

char* powminor[] = {
	"IRP_MN_WAIT_WAKE",
	"IRP_MN_POWER_SEQUENCE",
	"IRP_MN_SET_POWER",
	"IRP_MN_QUERY_POWER",
	};

FAST_MUTEX filelock;			// lock for file I/O

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

#pragma PAGEDCODE

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

	// 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;

	ExInitializeFastMutex(&filelock);
	
	return STATUS_SUCCESS;
	}							// DriverEntry

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

#pragma PAGEDCODE

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

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

#pragma PAGEDCODE

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

	NTSTATUS status;

	// Create a filter device object

	PDEVICE_OBJECT fdo;

	status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL,
		GetDeviceTypeToUse(pdo), 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. 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;
		IoInitializeRemoveLock(&pdx->RemoveLock, 0, 0, 0);

		// 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;

		// 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 | DO_POWER_PAGABLE);

		// Get registry flag FileLogging to decide whether to log to a disk file (\SystemRoot\powtrace.log)
		// or not.

		HANDLE hkey;
		status = IoOpenDeviceRegistryKey(pdo, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &hkey);
		if (NT_SUCCESS(status))
			{					// check FileLogging flag
			UNICODE_STRING valname;
			RtlInitUnicodeString(&valname, L"FileLogging");

			ULONG junk;
			KEY_VALUE_PARTIAL_INFORMATION value;	// has room for a REG_DWORD value

			status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation,
				&value, sizeof(value), &junk);

			if (NT_SUCCESS(status) && value.DataLength == sizeof(ULONG))
				pdx->filetrace = *(PULONG) value.Data != 0;

			ZwClose(hkey);
			}					// check FileLogging flag

		status = STATUS_SUCCESS;	// don't actually care if registry query worked or not

		PowerTrace(pdx, DRIVERNAME " - Initiating trace\n");

		// 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

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

#pragma LOCKEDCODE

NTSTATUS CapabilitiesQueryCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx)
	{							// CapabilitiesQueryCompletionRoutine
	if (Irp->PendingReturned)
		IoMarkIrpPending(Irp);

	if (NT_SUCCESS(Irp->IoStatus.Status))
		ShowCapabilities(pdx, IoGetCurrentIrpStackLocation(Irp)->Parameters.DeviceCapabilities.Capabilities);

	IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
	return STATUS_SUCCESS;
	}							// CapabilitiesQueryCompletionRoutine

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

#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 LOCKEDCODE				// make no assumptions about pageability of dispatch fcns

NTSTATUS DispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp)
	{							// DispatchAny
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);

	// Pass request down without additional processing

	NTSTATUS status;
	status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
	if (!NT_SUCCESS(status))
		return CompleteRequest(Irp, status, 0);
	IoSkipCurrentIrpStackLocation(Irp);
	status = IoCallDriver(pdx->LowerDeviceObject, Irp);
	IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
	return status;
	}							// DispatchAny

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

NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fido, IN PIRP Irp)
	{							// DispatchPnp
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	ULONG fcn = stack->MinorFunction;

	NTSTATUS status;
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
	status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
	if (!NT_SUCCESS(status))
		return CompleteRequest(Irp, status, 0);

	// Handle usage notification specially in order to track power pageable
	// flag correctly

	if (fcn == IRP_MN_DEVICE_USAGE_NOTIFICATION)
		{						// usage notification
		if (!fido->AttachedDevice || (fido->AttachedDevice->Flags & DO_POWER_PAGABLE))
			fido->Flags |= DO_POWER_PAGABLE;
		IoCopyCurrentIrpStackLocationToNext(Irp);
		IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) UsageNotificationCompletionRoutine,
			(PVOID) pdx, TRUE, TRUE, TRUE);
		return IoCallDriver(pdx->LowerDeviceObject, Irp);
		}						// usage notification

	// Handle start device specially in order to correctly inherit
	// FILE_REMOVABLE_MEDIA

	if (fcn == IRP_MN_START_DEVICE)
		{						// device start
		IoCopyCurrentIrpStackLocationToNext(Irp);
		IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) StartDeviceCompletionRoutine,
			(PVOID) pdx, TRUE, TRUE, TRUE);
		return IoCallDriver(pdx->LowerDeviceObject, Irp);
		}						// device start

	// Handle remove device specially in order to cleanup device stack

	if (fcn == IRP_MN_REMOVE_DEVICE)
		{						// remove device
		IoSkipCurrentIrpStackLocation(Irp);
		status = IoCallDriver(pdx->LowerDeviceObject, Irp);
		IoReleaseRemoveLockAndWait(&pdx->RemoveLock, Irp);
		RemoveDevice(fido);
		return status;
		}						// remove device

	// Handle capabilities query specially in order to show the structure

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久影院视频免费| 国产剧情一区在线| 99综合电影在线视频| 日韩一区和二区| 免费国产亚洲视频| 欧美电影一区二区三区| 亚洲精品久久久久久国产精华液 | 国产精品久久免费看| 久久精品噜噜噜成人av农村| 91精品国产综合久久久蜜臀图片| 一级中文字幕一区二区| 色综合咪咪久久| 一区二区三区不卡视频| 欧美性色欧美a在线播放| 亚洲成在人线在线播放| 久久精品在线观看| 中文字幕一区二区三区在线观看 | 久久亚洲综合av| 经典三级在线一区| 欧美精品一区二区三区四区| 国产精品白丝av| 亚洲精品老司机| 日韩欧美123| 99热在这里有精品免费| 亚洲一二三四在线观看| 欧美色综合影院| 国产一区二区三区观看| 国产精品人妖ts系列视频| 欧美午夜精品一区| 国产精品自拍在线| 亚洲一二三区在线观看| www日韩大片| 欧美欧美欧美欧美| 成人免费va视频| 免费成人av资源网| 亚洲成人手机在线| 国产女人水真多18毛片18精品视频| 成人精品鲁一区一区二区| 日韩黄色小视频| 中文字幕一区二区三区视频| 欧美成人a∨高清免费观看| 99re在线精品| 国产精品1区2区3区在线观看| 亚洲图片欧美综合| 《视频一区视频二区| 国产蜜臀97一区二区三区| 日韩一区二区三区在线| 91黄色免费看| 色天天综合久久久久综合片| 国产九色sp调教91| 国产乱淫av一区二区三区| 蜜臀av一级做a爰片久久| 一区二区三区四区在线| 亚洲女与黑人做爰| 亚洲精品欧美激情| 亚洲欧美另类在线| 一区二区三区四区精品在线视频 | 久久99热这里只有精品| 日韩国产高清影视| 乱中年女人伦av一区二区| 午夜国产精品一区| 免费成人性网站| 国产乱国产乱300精品| 国产精品白丝av| 经典三级视频一区| 国产精品综合网| 高清久久久久久| 色综合久久中文字幕综合网 | 国产黄色精品视频| 成+人+亚洲+综合天堂| 色成人在线视频| 欧美伦理电影网| 国产日韩av一区| 夜夜爽夜夜爽精品视频| 日本成人中文字幕在线视频| 国产精品综合视频| 欧美日韩国产小视频| 日韩欧美激情在线| 亚洲图片激情小说| 蜜臀av亚洲一区中文字幕| eeuss国产一区二区三区| 欧美肥大bbwbbw高潮| 国产精品不卡在线| 91.com在线观看| 欧美精品日韩一本| 国产精品美女久久福利网站| 亚洲一二三区在线观看| 成人免费观看男女羞羞视频| 337p亚洲精品色噜噜噜| 成人免费一区二区三区在线观看| 美女网站色91| 欧美日韩在线播放三区四区| 中文字幕一区在线观看视频| 青椒成人免费视频| 欧美日韩黄视频| 亚洲综合视频在线观看| 99天天综合性| 亚洲欧美日韩人成在线播放| 国产美女精品在线| 久久亚洲二区三区| 黄网站免费久久| 精品人伦一区二区色婷婷| 激情五月婷婷综合| 久久久久国产成人精品亚洲午夜| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美日韩一级视频| 免费人成精品欧美精品| 日韩一二在线观看| 激情综合亚洲精品| 国产欧美1区2区3区| 成人动漫一区二区三区| 亚洲精品久久久蜜桃| 欧美三级电影精品| 美女国产一区二区三区| 欧美一区二区三区爱爱| 精品在线播放免费| 亚洲视频一区二区免费在线观看| 一本久久精品一区二区| 日韩精品午夜视频| 国产三级一区二区| 欧美熟乱第一页| 国产成人福利片| 天堂久久一区二区三区| 中文字幕第一页久久| 欧美午夜精品久久久久久超碰| 男女激情视频一区| 国产精品久久久久毛片软件| 欧美中文字幕不卡| 国产成a人亚洲精| 亚洲国产视频直播| 国产精品美女久久久久高潮| 7777精品伊人久久久大香线蕉超级流畅| 免费观看在线色综合| 一区二区三区国产精华| 国产偷国产偷亚洲高清人白洁| 色婷婷久久久亚洲一区二区三区 | 最新国产成人在线观看| 亚洲精品一区二区三区四区高清| 色av综合在线| 99国产麻豆精品| 国产成人免费视频| 激情五月激情综合网| 日韩av一级电影| 亚洲精品乱码久久久久| 国产精品国产馆在线真实露脸| 欧美一级电影网站| 欧美日韩一区不卡| 欧美性生交片4| 在线观看成人小视频| 在线视频一区二区三| 日本高清不卡视频| 色综合久久六月婷婷中文字幕| 丰满岳乱妇一区二区三区| 极品少妇xxxx精品少妇偷拍| 国产一区免费电影| 国产黄色91视频| kk眼镜猥琐国模调教系列一区二区 | 免费成人性网站| 精品一区二区三区久久| 狠狠色狠狠色综合| 国产老女人精品毛片久久| 亚洲男人的天堂网| 国产精品久久久久三级| 亚洲少妇中出一区| 日韩在线一区二区三区| 欧美aⅴ一区二区三区视频| 久久99国产精品久久99| 99久久99久久精品免费观看 | 欧美亚洲动漫精品| 56国语精品自产拍在线观看| 日韩女优毛片在线| 中文字幕五月欧美| 麻豆精品国产传媒mv男同| 国产91丝袜在线播放| 欧美亚洲免费在线一区| 2欧美一区二区三区在线观看视频| 国产精品视频看| 裸体一区二区三区| 欧美专区在线观看一区| 久久久久99精品一区| 男女性色大片免费观看一区二区| 成人一区二区三区视频| 日韩一区二区三区在线观看 | 亚洲欧洲韩国日本视频| 蜜臀国产一区二区三区在线播放| 成人h版在线观看| 欧美α欧美αv大片| 国产精品国产三级国产普通话蜜臀 | 中文字幕在线一区免费| 久久草av在线| 欧美日产在线观看| 亚洲激情自拍偷拍| 色综合天天性综合| 久久久久国产精品人| 国产一区欧美日韩| 樱桃国产成人精品视频| 93久久精品日日躁夜夜躁欧美| 久久理论电影网| 国产精品99久久久久久久女警| www一区二区|