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

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

?? power.cpp

?? 基于USB接口的GPS驅動程序
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// Power request handler usbgps driver
// Copyright (C) 1999 by Walter Oney
// All rights reserved

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

NTSTATUS DefaultPowerHandler(PDEVICE_EXTENSION pdx, IN PIRP Irp);

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
	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 {
	PDEVICE_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
	DEVICE_POWER_STATE oldpower;	// previous device power state
	UCHAR MinorFunction;			// minor function to use in requested power IRP
	} POWCONTEXT, *PPOWCONTEXT;

NTSTATUS HandlePowerEvent(PPOWCONTEXT ctx, enum POWEVENT event);

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

#pragma PAGEDCODE

NTSTATUS DispatchPower(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
	{							// DispatchPower
	PAGED_CODE();
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
	if (!NT_SUCCESS(status))
		return CompleteRequest(Irp, status, 0);

	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

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

	else
		{						// handle other power request
			status = DefaultPowerHandler(pdx, Irp);
		}						// handle other power request

	IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
	return status;
	}							// DispatchPower

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

NTSTATUS DefaultPowerHandler(PDEVICE_EXTENSION pdx, IN PIRP Irp)
	{							// DefaultPowerHandler
	PoStartNextPowerIrp(Irp);	// must be done while we own the IRP
	IoSkipCurrentIrpStackLocation(Irp);
	return PoCallDriver(pdx->LowerDeviceObject, Irp);
	}							// DefaultPowerHandler

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

VOID SendAsyncNotification(PVOID context)
	{							// SendAsyncNotification
	HandlePowerEvent((PPOWCONTEXT) context, AsyncNotify);
	}							// SendAsyncNotification

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

struct SDSP_CONTEXT {
	PKEVENT pev;				// event to signal when request complete
	NTSTATUS status;			// ending status
	};

#pragma LOCKEDCODE

VOID SendDeviceSetPowerComplete(PDEVICE_OBJECT junk, UCHAR fcn, POWER_STATE state, SDSP_CONTEXT* context, PIO_STATUS_BLOCK pstatus)
	{							// SendDeviceSetPowerComplete
	context->status = pstatus->Status;
	KeSetEvent(context->pev, EVENT_INCREMENT, FALSE);
	}							// SendDeviceSetPowerComplete

NTSTATUS SendDeviceSetPower(PDEVICE_EXTENSION pdx, DEVICE_POWER_STATE devpower, BOOLEAN wait /* = FALSE */)
	{							// SendDeviceSetPower
	POWER_STATE state;
	state.DeviceState = devpower;
	NTSTATUS status;

	if (wait)
		{						// synchronous operation
		KEVENT event;
		KeInitializeEvent(&event, NotificationEvent, FALSE);
		SDSP_CONTEXT context = {&event};
		status = PoRequestPowerIrp(pdx->Pdo, IRP_MN_SET_POWER, state,
			(PREQUEST_POWER_COMPLETE) SendDeviceSetPowerComplete, &context, NULL);
		if (status == STATUS_PENDING)
			{
			KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
			status = context.status;
			}
		}						// synchronous operation
	else
		status = PoRequestPowerIrp(pdx->Pdo, IRP_MN_SET_POWER, state, NULL, NULL, NULL);
	
	return status;
	}							// SendDeviceSetPower

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

NTSTATUS MainCompletionRoutine(PDEVICE_OBJECT junk, PIRP Irp, PPOWCONTEXT ctx);
VOID PoCompletionRoutine(PDEVICE_OBJECT junk, UCHAR fcn, POWER_STATE state, PPOWCONTEXT ctx, PIO_STATUS_BLOCK pstatus);
NTSTATUS SafePoCallDriver(PDEVICE_OBJECT DeviceObject, PIRP Irp);

NTSTATUS HandlePowerEvent(PPOWCONTEXT ctx, enum POWEVENT event)
	{							// HandlePowerEvent
	NTSTATUS status = -1;		// an invalid value
	ASSERT(ctx);
	ASSERT((ULONG) event < NUMPOWEVENTS);

	PIRP Irp = ctx->irp;
	PIO_STACK_LOCATION stack = Irp ? IoGetCurrentIrpStackLocation(Irp) : NULL;

	PDEVICE_EXTENSION pdx = ctx->pdx;

	enum POWACTION {
		InvalidAction,			// code for invalid state/event combinations
		TriageNewIrp,			// decide what to do with new IRP
		QueueStallComplete,		// device queue has been stalled
		ForwardMainIrp,			// begin system or device IRP for more power
		SysPowerUpComplete,		// system power-up IRP completed
		SysPowerDownComplete,	// system power-down IRP completed
		SelectDState,			// choose D-state corresponding to main IRP's S-state
		SendDeviceIrp,			// send device IRP
		CompleteMainIrp,		// complete the main IRP
		DestroyContext,			// terminate FSM
		SubPowerUpComplete,		// nested power-up IRP finished or failed
		SubPowerDownComplete,	// nested power-down IRP finished or failed
		DevPowerUpComplete,		// device power-up IRP has completed
		SaveContext,			// save context in preparation for powering down
		ContextSaveComplete,	// device context has been saved
		ContextRestoreComplete,	// device context has been restored
		DevQueryUpComplete,		// device query for power-up complete
		DevQueryDown,			// see if device can power down
		DevQueryDownComplete,	// device query for power-down complete
		};

	static enum POWACTION actiontable[NUMPOWSTATES][NUMPOWEVENTS] = {
/*							NewIrp				MainIrpComplete				AsyncNotify	*/
/* InitialState */			{TriageNewIrp,		InvalidAction,				InvalidAction},
/* SysPowerUpPending */		{InvalidAction,		SysPowerUpComplete,			InvalidAction},
/* SubPowerUpPending */		{InvalidAction,		InvalidAction,				SubPowerUpComplete},
/* SubPowerDownPending */	{InvalidAction,		InvalidAction,				SubPowerDownComplete},
/* SysPowerDownPending */	{InvalidAction,		SysPowerDownComplete,		InvalidAction},
/* DevPowerUpPending */		{InvalidAction,		DevPowerUpComplete,			InvalidAction},
/* DevPowerDownPending */	{InvalidAction,		CompleteMainIrp,			InvalidAction},
/* ContextSavePending */	{InvalidAction,		InvalidAction,				ContextSaveComplete},
/* ContextRestorePending */	{InvalidAction,		InvalidAction,				ContextRestoreComplete},
/* DevQueryUpPending */		{InvalidAction,		DevQueryUpComplete,			InvalidAction},
/* DevQueryDownPending */	{InvalidAction,		DevQueryDownComplete,		InvalidAction},
/* QueueStallPending */		{InvalidAction,		InvalidAction,				QueueStallComplete},
/* FinalState */			{InvalidAction,		InvalidAction,				InvalidAction},
		};

	// Determine the first action to take based on the current state of the FSM and the event that occurred.
	// Note that this isn't as complicated as the use of 2-D array might suggest: all states except
	// the initial state lead to a single action for the one-and-only event that's possible to get in
	// that state.

	enum POWACTION action = actiontable[ctx->state][event];

	// Structurally, the following code is a switch on "action" imbedded within an
	// infinite loop. A case that does a "break" from the switch executes a "break"
	// from the loop, whereupon we return whatever value is left in "status". A case
	// that does a "continue" from the switch repeats the loop -- this is how actions
	// can be strung together during one call to this routine. I coded it this way to
	// avoid return statements in the middle that make it harder to prove that the
	// routine behaves in a predictable way. Note that any "break" should be preceded
	// by a change to the state recorded in the context structure and to the initially
	// invalid valid of "status". There are ASSERTs at the end to check this.

	// Concerning the required change to "ctx->state": there are many cases where we
	// call PoRequestPowerIrp or PoCallDriver, whereupon the context structure gets
	// released before those routines return. We use a SETSTATE macro so we don't
	// have to dereference a possibly invalid "ctx" pointer at the end of the loop. Any
	// action that calls a routine that might result in completing the current IRP
	// should also take care not to touch "ctx" afterwards. (These are always cases that
	// "break" from the switch, so you can just verify that the break always immediately
	// follows the PoXxx call.)

	// Concerning the required change to "status": only TriageNewIrp
	// will arrange to return STATUS_PENDING. Many of the other initial actions are entered
	// from a standard I/O completion routine and will need to return STATUS_MORE_PROCESSING_REQUIRED
	// to hold off final completion. Any action for MainIrpComplete that goes out through
	// CompleteMainIrp will end up returning ctx->status, which gets set in MainCompletionRoutine
	// to whatever's in the IRP -- this allows the IRP to complete normally. Any action off of
	// AsyncNotify should be changing "status" explicitly (and they do -- I checked).

#if DBG
	enum POWSTATE originalstate = ctx->state;
	enum POWSTATE nextstate = originalstate;
	#define SETSTATE(s) ctx->state = nextstate = s
#else
	#define SETSTATE(s) ctx->state = s
#endif

	while (TRUE)
		{						// handle this event
		switch (action)
			{					// perform next action

		///////////////////////////////////////////////////////////////////////
		// TriageNewIrp is the first action for a newly receive query or set IRP

		case TriageNewIrp:
			{					// TriageNewIrp
			ASSERT(stack->MajorFunction == IRP_MJ_POWER);
			ASSERT(stack->MinorFunction == IRP_MN_QUERY_POWER || stack->MinorFunction == IRP_MN_SET_POWER);
			ASSERT(ctx->state == InitialState);

			// We want the power dispatch routine to return STATUS_PENDING unless

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美福利视频一区| 日韩视频一区二区在线观看| 蜜桃视频一区二区三区在线观看| 亚洲综合图片区| 一区二区三区**美女毛片| 亚洲免费三区一区二区| 一区二区三区日韩在线观看| 亚洲狼人国产精品| 午夜精品久久久久久久久久| 日日骚欧美日韩| 日产欧产美韩系列久久99| 热久久免费视频| 蜜桃精品视频在线| 国产一区在线观看麻豆| 国产成人精品一区二区三区网站观看| 国产成人午夜精品影院观看视频 | 亚洲国产综合色| 五月激情丁香一区二区三区| 日韩国产一二三区| 国产精品资源网| 91麻豆高清视频| 在线91免费看| 国产精品欧美一区喷水| 伊人开心综合网| 狠狠狠色丁香婷婷综合久久五月| 丁香婷婷综合激情五月色| 91在线免费视频观看| 91精品国产全国免费观看| 精品成人在线观看| 亚洲六月丁香色婷婷综合久久| 亚洲小说欧美激情另类| 国产在线精品国自产拍免费| 91首页免费视频| 日韩欧美精品在线视频| 亚洲色图另类专区| 26uuu成人网一区二区三区| 国产精品免费看片| 免费在线成人网| 色婷婷狠狠综合| 久久精品一级爱片| 亚洲成人激情综合网| 成人网页在线观看| 日韩欧美国产一区在线观看| 伊人色综合久久天天| 国产精品自拍av| 日韩精品在线一区二区| 亚洲激情成人在线| 成人h动漫精品一区二区| 在线播放中文一区| 夜夜亚洲天天久久| 国产成人免费在线| 日韩一区二区三区电影在线观看 | 色八戒一区二区三区| 欧美videossexotv100| 亚洲午夜精品17c| 成人99免费视频| 久久精品一区二区三区不卡| 青青草国产成人99久久| 欧美在线啊v一区| 亚洲丝袜精品丝袜在线| 国产91丝袜在线播放| 久久色中文字幕| 老司机午夜精品| 欧美一区二区精美| 日韩精品午夜视频| 欧美精品一二三| 亚洲成av人影院| 91福利国产成人精品照片| 亚洲欧洲99久久| 99精品久久只有精品| 国产精品久久久久影院色老大 | 99综合影院在线| 国产亚洲欧美在线| 国产白丝网站精品污在线入口| 久久久亚洲高清| 成人午夜视频网站| 一区在线中文字幕| 91在线视频免费观看| 伊人色综合久久天天人手人婷| 91免费视频大全| 亚洲激情第一区| 欧美剧在线免费观看网站| 日韩av电影天堂| 久久亚洲欧美国产精品乐播 | 日韩在线卡一卡二| 欧美一区二区三区视频在线 | 亚洲欧洲精品一区二区三区| 成人高清av在线| 亚洲女与黑人做爰| 欧美日韩综合一区| 欧美aⅴ一区二区三区视频| 欧美一区二区在线看| 裸体健美xxxx欧美裸体表演| 337p日本欧洲亚洲大胆色噜噜| 国产精品亚洲一区二区三区妖精 | 国产欧美一区二区三区在线看蜜臀 | 国产剧情av麻豆香蕉精品| 国产午夜亚洲精品不卡| 99国产精品国产精品毛片| 亚洲最新视频在线观看| 欧美一级免费大片| 国产高清一区日本| 亚洲综合偷拍欧美一区色| 欧美电影精品一区二区| 成人免费高清在线观看| 亚洲va国产天堂va久久en| 日韩欧美国产综合一区| 99久久婷婷国产综合精品电影| 亚洲一级二级三级在线免费观看| 欧美一区二区二区| 国产成人夜色高潮福利影视| 亚洲一区二区三区影院| 精品久久久久香蕉网| 色诱亚洲精品久久久久久| 男女性色大片免费观看一区二区 | 亚洲成人tv网| 亚洲精品一区二区三区蜜桃下载| 色综合色综合色综合 | 国产精品日韩成人| 欧美三级一区二区| 成人小视频在线观看| 日韩中文字幕亚洲一区二区va在线 | 在线成人小视频| 成人动漫视频在线| 美女视频一区在线观看| 国产精品国产三级国产普通话蜜臀| 在线成人av网站| 在线一区二区三区四区| www.亚洲激情.com| 国产另类ts人妖一区二区| 日日欢夜夜爽一区| 亚洲一区二区三区不卡国产欧美| 久久久一区二区三区| 欧美成人vr18sexvr| 7777女厕盗摄久久久| 色综合一区二区| 91在线无精精品入口| 大胆亚洲人体视频| 国产米奇在线777精品观看| 免费成人你懂的| 亚洲国产中文字幕在线视频综合| 中文字幕一区二区三区av| 国产欧美日韩另类视频免费观看| 欧美精品一区二区三区在线播放| 91精品国产欧美一区二区| 欧美日韩国产综合一区二区| 色狠狠一区二区| 日本高清不卡aⅴ免费网站| 99久久免费精品| aaa欧美色吧激情视频| av不卡一区二区三区| 成人精品免费看| 99精品黄色片免费大全| 99久久国产综合色|国产精品| 成人小视频免费在线观看| 成人精品视频网站| 99久久婷婷国产| 欧美这里有精品| 欧美群妇大交群的观看方式| 欧美精品久久久久久久久老牛影院| 欧美日韩中文字幕精品| 欧美精品久久久久久久多人混战| 欧美日韩一区三区| 5858s免费视频成人| 日韩美女天天操| 亚洲国产精品高清| 亚洲精品乱码久久久久久| 亚洲综合免费观看高清完整版在线| 亚洲18女电影在线观看| 麻豆国产精品一区二区三区| 国产精品一区三区| 99国产精品国产精品久久| 欧美在线视频全部完| 5月丁香婷婷综合| 日本一区二区三区在线不卡 | 制服丝袜中文字幕亚洲| 精品国产一区二区在线观看| 国产精品全国免费观看高清 | 国产在线播放一区| 成人91在线观看| 欧美老肥妇做.爰bbww视频| 精品人在线二区三区| 亚洲色图欧美偷拍| 精品中文字幕一区二区| 色综合色综合色综合| 欧美sm极限捆绑bd| 亚洲欧美乱综合| 激情综合网激情| 欧美性极品少妇| 久久久www成人免费无遮挡大片| 国产精品的网站| 蜜桃av一区二区| 91视频观看视频| 欧美大尺度电影在线| 国产精品水嫩水嫩| 日本欧洲一区二区| 欧洲另类一二三四区| 中文字幕国产一区| 精品一区二区在线播放| 色噜噜偷拍精品综合在线|