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

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

?? power.cpp

?? WDM驅動程序的范例程序
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
// Power request handler for Generic driver
// Copyright (C) 1999 by Walter Oney
// All rights reserved

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

NTSTATUS DefaultPowerHandler(PGENERIC_EXTENSION pdx, PIRP Irp);
NTSTATUS WaitWakeCompletionRoutine(PDEVICE_OBJECT junk, PIRP Irp, PGENERIC_EXTENSION pdx);
VOID WaitWakeCallback(PDEVICE_OBJECT junk, UCHAR MinorFunction, POWER_STATE state,
	PGENERIC_EXTENSION pdx, PIO_STATUS_BLOCK pstatus);

enum POWSTATE {
	InitialState = 0,				// initial state of FSM
	SysPowerUpPending,				// system power-up IRP forwarded
	SubPowerUpPending,				// waiting for nested device power up to finish
	SubPowerDownPending,			// waiting from device to power down before forwarding system power-down IRP
	SysPowerDownPending,			// waiting for system power-down IRP to finish
	DevPowerUpPending,				// waiting for device power-up IRP
	DevPowerDownPending,			// waiting for device power-down IRP
	ContextSavePending,				// context save is underway
	ContextRestorePending,			// context restore is underway
	DevQueryUpPending,				// device query for power-up pending
	DevQueryDownPending,			// device query for power-down pending
	QueueStallPending,				// waiting for device to be idle
	SaveSeqPending,					// waiting to get sequence numbers after context save
	RestoreSeqPending,				// waiting to get sequence numbers before context restore
	PassiveCompletePending,			// waiting for PASSIVE_LEVEL callback to complete IRP
	FinalState,						// final state of FSM
	NUMPOWSTATES,
	};

enum POWEVENT {
	NewIrp = 0,						// new query/set IRP
	MainIrpComplete,				// the main IRP has finished
	AsyncNotify,					// some other event has occurred
	NUMPOWEVENTS,
	};

typedef struct _POWCONTEXT {
	LONG id;						// unique sequence number for this IRP
	LONG eventcount;				// number of events generated for this IRP
	PGENERIC_EXTENSION pdx;			// our own device extension
	PIRP irp;						// the IRP we're processing
	enum POWSTATE state;			// current state of FSM
	NTSTATUS status;				// completion status for main IRP
	DEVICE_POWER_STATE devstate;	// device power state to use
	POWER_SEQUENCE sequence;		// sequence numbers retrieved by ditto
	DEVICE_POWER_STATE oldpower;	// previous device power state
	UCHAR MinorFunction;			// minor function to use in requested power IRP
	BOOLEAN UnstallQueue;			// unstall queue when main IRP finishes
	} POWCONTEXT, *PPOWCONTEXT;

NTSTATUS HandlePowerEvent(PPOWCONTEXT ctx, enum POWEVENT event);

static LONG ctxcount = 0;			// counter for POWCONTEXT structures

// #define VERBOSETRACE				// for debugging HandlePowerEvent

#if DBG

	#ifdef VERBOSETRACE
		#define POWTRACE(x) DbgPrint x
	#else
		#define POWTRACE(x)
	#endif

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

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

	static char* devstate[] = {
		"PowerDeviceUnspecified",
		"PowerDeviceD0",
		"PowerDeviceD1",
		"PowerDeviceD2",
		"PowerDeviceD3",
		"PowerDeviceMaximum",
		};

#else
	#define POWTRACE(x)
#endif // DBG
									  
///////////////////////////////////////////////////////////////////////////////

GENERICAPI NTSTATUS GENERIC_EXPORT GenericDispatchPower(PGENERIC_EXTENSION pdx, PIRP Irp)
	{							// DispatchPower
	NTSTATUS status = STATUS_SUCCESS;
	if (pdx->RemoveLock)
		{
		status = IoAcquireRemoveLock(pdx->RemoveLock, Irp);
		if (!NT_SUCCESS(status))
			{
			PoStartNextPowerIrp(Irp);
			return CompleteRequest(Irp, status);
			}
		}

	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	ASSERT(stack->MajorFunction == IRP_MJ_POWER);

	ULONG fcn = stack->MinorFunction;

	if (fcn == IRP_MN_SET_POWER || fcn == IRP_MN_QUERY_POWER)
		{						// handle set/query

#if DBG
		if (stack->Parameters.Power.Type == SystemPowerState)
			KdPrint(("%s - POWER Request (%s), S-state = %s\n", pdx->DebugName, fcnname[fcn], sysstate[stack->Parameters.Power.State.SystemState]));
		else
			KdPrint(("%s - POWER Request (%s), D-state = %s\n", pdx->DebugName, fcnname[fcn], devstate[stack->Parameters.Power.State.DeviceState]));
#endif // DBG

		// Create a context structure and launch the finite state machine that will process
		// this IRP asynchronously. The initial call to HandlePowerEvent should return
		// STATUS_PENDING. The FSM will eventually complete the IRP.

		PPOWCONTEXT ctx = (PPOWCONTEXT) ExAllocatePool(NonPagedPool, sizeof(POWCONTEXT));
		if (!ctx)
			{
			KdPrint(("%s - Can't allocate power context structure\n", pdx->DebugName));
			PoStartNextPowerIrp(Irp);
			status = CompleteRequest(Irp, STATUS_INSUFFICIENT_RESOURCES);
			}
		else
			{				// process this IRP
			RtlZeroMemory(ctx, sizeof(POWCONTEXT));
			ctx->pdx = pdx;
			ctx->irp = Irp;
			ctx->id = InterlockedIncrement(&ctxcount);
			status = HandlePowerEvent(ctx, NewIrp);
			}				// process this IRP
		}						// handle set/query

	else
		{						// handle other power request
	#if DBG
		if (fcn < arraysize(fcnname))
			KdPrint(("%s - POWER Request (%s)\n", pdx->DebugName, fcnname[fcn]));
		else
			KdPrint(("%s - POWER Request ?? (0x%X)\n", fcn));
	#endif

		// Install a completion routine for a WAIT_WAKE so we're sure to nullify our
		// cached pointer before the IRP disappears.

		if (fcn == IRP_MN_WAIT_WAKE)
			{					// wait-wake IRP
			PoStartNextPowerIrp(Irp);
			IoCopyCurrentIrpStackLocationToNext(Irp);
			IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) WaitWakeCompletionRoutine, pdx, TRUE, TRUE, TRUE);
			status = PoCallDriver(pdx->LowerDeviceObject, Irp);
			}					// wait-wake IRP

		// Simply forward any other power IRP. At the present time, the only
		// kind it could be is IRP_MN_POWER_SEQUENCE, which probably no-one
		// actually uses.

		else
			status = DefaultPowerHandler(pdx, Irp);
		}						// handle other power request
	
	if (pdx->RemoveLock)
		IoReleaseRemoveLock(pdx->RemoveLock, Irp);

	return status;
	}							// DispatchPower

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

GENERICAPI NTSTATUS GENERIC_EXPORT GenericHandlePowerIoctl(PGENERIC_EXTENSION pdx, PIRP Irp)
	{							// GenericHandlePowerIoctl
	ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
	ULONG info = 0;
	NTSTATUS status = STATUS_SUCCESS;

	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	if (stack->MajorFunction != IRP_MJ_DEVICE_CONTROL)
		return STATUS_INVALID_DEVICE_REQUEST;

	ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
	ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
	ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;

	switch (code)
		{						// process request

	case IOCTL_GET_POWERINFO:				// code == 0xFF0
		{						// IOCTL_GET_POWERINFO
		if (cbout < sizeof(POWERINFO))
			{
			status = STATUS_INVALID_PARAMETER;
			break;
			}
		
		PPOWERINFO pip = (PPOWERINFO) Irp->AssociatedIrp.SystemBuffer;

		// Get timeout constants from the registry

		status = GetPowerInfoFromRegistry(pdx, pip);
		if (!NT_SUCCESS(status))
			{					// initialize parameters
			pip->ulConservation = 0;
			pip->ulPerformance = 0;
			status = STATUS_SUCCESS;
			}					// initialize parameters

		// Determine current device state

		pip->bCanIdle = (pdx->Flags & GENERIC_IDLE_DETECT) != 0;
		pip->bCanWake = pdx->devcaps.SystemWake != PowerSystemUnspecified && pdx->devcaps.DeviceWake != PowerDeviceUnspecified;
		pip->bWakeup = pdx->WakeupEnabled;
		pip->bIdle = pdx->devpower > PowerDeviceD0;
		
		info = sizeof(POWERINFO);
		break;
		}						// IOCTL_GET_POWERINFO

	case IOCTL_SET_POWERINFO:				// code == 0xFF1
		{						// IOCTL_SET_POWERINFO
		if (cbin < sizeof(POWERINFO))
			{
			status = STATUS_INVALID_PARAMETER;
			break;
			}

		// If we're currently idle, restore power. This is in case we've just been told to
		// never idle in the power mode the machine is currently in (which we can't easily
		// determine).

		GenericWakeupFromIdle(pdx, TRUE);

		PPOWERINFO pip = (PPOWERINFO) Irp->AssociatedIrp.SystemBuffer;
		status = WritePowerInfoToRegistry(pdx, (PPOWERINFO) Irp->AssociatedIrp.SystemBuffer);
		if (NT_SUCCESS(status))
			status = ImplementPowerPolicy(pdx, (PPOWERINFO) Irp->AssociatedIrp.SystemBuffer);
		break;
		}						// IOCTL_SET_POWERINFO

	case IOCTL_IDLENOW:						// code == 0xFF2
		{						// IOCTL_IDLENOW
		status = GenericIdleDevice(pdx, PowerDeviceD3);
		break;
		}						// IOCTL_IDLENOW

	default:
		status = STATUS_INVALID_DEVICE_REQUEST;
		break;

		}						// process request

	Irp->IoStatus.Information = info;
	Irp->IoStatus.Status = status;
	return status;
	}							// GenericHandlePowerIoctl

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

GENERICAPI NTSTATUS GENERIC_EXPORT GenericIdleDevice(PGENERIC_EXTENSION pdx, DEVICE_POWER_STATE state, BOOLEAN wait /* = FALSE */)
	{							// GenericIdleDevice
	if (pdx->state != WORKING && pdx->state != STOPPED)
		return STATUS_SUCCESS;
	NTSTATUS status = SendDeviceSetPower(pdx, state, wait);
	if (status == STATUS_PENDING)
		status = STATUS_SUCCESS;
	return status;
	}							// GenericIdleDevice

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

GENERICAPI VOID GENERIC_EXPORT GenericMarkDeviceBusy(PGENERIC_EXTENSION pdx)
	{							// GenericMarkDeviceBusy
	if (pdx->idlecount)
		PoSetDeviceBusy(pdx->idlecount);
	}							// GenericMarkDeviceBusy

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

GENERICAPI VOID GENERIC_EXPORT GenericRegisterForIdleDetection(PGENERIC_EXTENSION pdx, ULONG ConservationTimeout,
	ULONG PerformanceTimeout, DEVICE_POWER_STATE state)
	{							// GenericRegisterForIdleDetection
	ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);	// required by PoRegisterDeviceForIdleDetection
	pdx->cto = ConservationTimeout;
	pdx->pto = PerformanceTimeout;
	pdx->idlestate = state;
	pdx->idlecount = PoRegisterDeviceForIdleDetection(pdx->Pdo, ConservationTimeout, PerformanceTimeout, state);
	}							// GenericRegisterForIdleDetection

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

GENERICAPI VOID GENERIC_EXPORT GenericSaveRestoreComplete(PVOID context)
	{							// GenericSaveRestoreComplete
	HandlePowerEvent((PPOWCONTEXT) context, AsyncNotify);
	}							// GenericSaveRestoreComplete

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

GENERICAPI NTSTATUS GENERIC_EXPORT GenericWakeupControl(PGENERIC_EXTENSION pdx, enum WAKEFUNCTION wf)
	{							// GenericWakeupControl

	NTSTATUS status = STATUS_SUCCESS;

	switch (wf)
		{						// perform requested function

	case EnableWakeup:
		pdx->WakeupEnabled = TRUE;
		goto manage;

	case DisableWakeup:
		pdx->WakeupEnabled = FALSE;
		goto manage;

	case ManageWaitWake:
	manage:
		{						// ManageWaitWake
		if (pdx->WakeupEnabled)
			{					// wakeup is enabled

			// We're often called at StartDevice time before a capabilities query has happened.
			// Beginning in v. 2.01, we therefore attempt to get the capabilities now if we can.

			GenericGetDeviceCapabilities(pdx);	// do capabilities query if necessary and if at PASSIVE_LEVEL

			// If capabilities don't provide for wakeup, don't do anything. Also,
			// we mustn't issue a WAIT_WAKE if the device is not in D0.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品盗摄一区二区三区| 国产不卡免费视频| 国产老肥熟一区二区三区| 99久久免费精品| 日韩三级视频中文字幕| 国产精品国产自产拍高清av| 免费人成黄页网站在线一区二区| 不卡的av电影| 精品久久久久久久一区二区蜜臀| 午夜久久久久久电影| 91丨九色丨蝌蚪丨老版| 国产婷婷色一区二区三区在线| 日日摸夜夜添夜夜添精品视频 | 99精品视频在线观看| 亚洲一区二区三区在线| 亚洲成人自拍偷拍| 99久久婷婷国产精品综合| 久久精品欧美日韩精品| 免费成人av资源网| 欧美日韩国产a| 亚洲v日本v欧美v久久精品| 97久久精品人人做人人爽50路| 国产亚洲精品7777| 国产伦精品一区二区三区在线观看| 欧美日韩国产精品自在自线| 一区二区三区四区激情| 色噜噜狠狠色综合欧洲selulu| 国产精品久久久久久久久久免费看| 麻豆精品视频在线观看免费| 欧美精品久久天天躁| 日日夜夜精品视频天天综合网| 欧美日韩亚洲不卡| 亚洲一区二区不卡免费| 欧美日韩亚洲综合| 日韩二区三区在线观看| 欧美一区永久视频免费观看| 日韩精品国产欧美| 日韩一区二区免费在线电影| 毛片基地黄久久久久久天堂| 日韩欧美成人激情| 国产精品一级片| 日本一区二区免费在线观看视频| 国产91精品在线观看| 国产精品久久久久久久午夜片| 99国产欧美另类久久久精品| 亚洲精品午夜久久久| 欧美日韩一区二区在线观看视频 | 欧美一级夜夜爽| 日日嗨av一区二区三区四区| 4438x亚洲最大成人网| 奇米精品一区二区三区在线观看 | 色综合久久久久网| 亚洲一区二区三区视频在线| 在线观看区一区二| 久久国产免费看| 国产精品天干天干在观线| 91玉足脚交白嫩脚丫在线播放| 亚洲综合丝袜美腿| 日韩女优电影在线观看| 丁香激情综合国产| 视频一区视频二区中文字幕| 精品久久久久久久久久久久包黑料 | 欧美怡红院视频| 日韩一区精品视频| 中文字幕高清不卡| 欧美日韩三级一区| 国产精品一二三四区| 亚洲女同一区二区| 欧美变态凌虐bdsm| 色综合久久天天综合网| 麻豆精品一区二区综合av| 国产精品久久久久久户外露出 | 在线看日本不卡| 精品一区二区三区在线观看| 国产精品家庭影院| 日韩丝袜情趣美女图片| 99精品欧美一区| 狠狠色综合色综合网络| 亚洲综合一区二区三区| 国产日韩欧美高清| 欧美一区二区私人影院日本| aaa欧美日韩| 久久精品国产一区二区三区免费看 | 精品盗摄一区二区三区| 91丨porny丨最新| 国内外精品视频| 亚洲va在线va天堂| 亚洲色图在线视频| 国产视频一区在线播放| 日韩一级免费一区| 欧美日韩一级片网站| 99视频精品免费视频| 国产成人免费视频网站| 蜜臀久久久99精品久久久久久| 亚洲欧美日韩国产另类专区| 欧美高清在线一区| 久久奇米777| 精品国产一区二区三区久久久蜜月| 欧美性高清videossexo| 91久久精品一区二区| 99精品桃花视频在线观看| 国产成人亚洲综合a∨婷婷图片 | 日韩国产欧美在线播放| 亚洲色图都市小说| 中文字幕在线视频一区| 国产欧美综合在线观看第十页| 精品久久国产字幕高潮| 日韩一级片在线播放| 欧美一区二区三区日韩视频| 欧美日本国产一区| 精品视频123区在线观看| 欧美午夜片在线看| 欧美无乱码久久久免费午夜一区 | 成人午夜精品在线| 国产成人午夜电影网| 国产精品一二一区| 懂色av一区二区三区蜜臀| 国产一区二区伦理| 国产中文一区二区三区| 国产精品亚洲午夜一区二区三区| 国产一区二区三区电影在线观看| 国产福利精品导航| www.色综合.com| 色综合久久中文字幕| 欧美日韩高清在线| 精品少妇一区二区三区在线播放 | 99久久久精品| 在线观看亚洲精品视频| 欧美天堂一区二区三区| 欧美在线免费播放| 欧美挠脚心视频网站| 91精品国产一区二区三区香蕉| 日韩欧美一区二区久久婷婷| 久久综合一区二区| 日韩伦理av电影| 亚洲第一福利视频在线| 精品在线你懂的| 风间由美性色一区二区三区| 91在线一区二区三区| 欧美日韩二区三区| 久久色在线观看| 一区二区三区在线视频免费| 免费在线观看一区二区三区| 国产麻豆欧美日韩一区| 一本一道综合狠狠老| 日韩美女视频一区二区在线观看| 精品成人a区在线观看| 最新不卡av在线| 免费成人性网站| 91在线高清观看| 日韩视频一区二区三区| 18欧美亚洲精品| 午夜成人在线视频| zzijzzij亚洲日本少妇熟睡| 欧美日韩免费一区二区三区 | 国产精品白丝jk黑袜喷水| 欧亚洲嫩模精品一区三区| 精品久久久久一区二区国产| 亚洲另类在线制服丝袜| 精品一区二区在线视频| 欧美专区日韩专区| 久久精品夜夜夜夜久久| 洋洋成人永久网站入口| 国产一区二区剧情av在线| 欧美日韩综合在线免费观看| 久久久www成人免费毛片麻豆 | 精品视频123区在线观看| 久久久美女毛片| 舔着乳尖日韩一区| 91在线国产福利| 日韩中文字幕1| 97久久精品人人做人人爽| 久久久午夜精品| 日本不卡一区二区| 色欧美片视频在线观看在线视频| 日韩免费观看2025年上映的电影| 亚洲精品久久7777| 成人一区二区视频| 精品国产一区二区亚洲人成毛片| 亚洲一区二区三区中文字幕| 成人免费视频视频| 久久综合九色综合欧美亚洲| 五月天欧美精品| 欧美性视频一区二区三区| 亚洲人快播电影网| 成人高清免费观看| 久久先锋资源网| 精品在线一区二区| 欧美不卡激情三级在线观看| 视频一区二区三区中文字幕| 91久久精品一区二区三| 亚洲女性喷水在线观看一区| caoporn国产精品| 国产精品国产三级国产aⅴ中文 | 亚洲精品中文字幕乱码三区| 高清不卡一区二区| 亚洲国产精品v| 成人免费视频网站在线观看| 国产精品热久久久久夜色精品三区 | 成人av网在线|