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

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

?? power.cpp

?? 智能卡的讀寫程序
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// Power request handler Smart_Card driver
// Copyright (C) 1999, 2000 by Walter Oney
// All rights reserved

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

// TODO: all functions in this module are in the locked code segment even though the
// AddDevice function sets DO_POWER_PAGABLE. If you *know* that you'll never need a
// non-paged handler, you could move the DispatchPower and DefaultPowerHandler functions
// to PAGEDCODE. 

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
	PassiveCompletePending,			// waiting to complete main IRP at PASSIVE_LEVEL
	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
	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);

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

#pragma LOCKEDCODE

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))
			{
			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
		KdPrint((DRIVERNAME " - POWER Request (%s)", fcnname[fcn]));
		if (stack->Parameters.Power.Type == SystemPowerState)
			KdPrint((", S-state = %s\n", sysstate[stack->Parameters.Power.State.SystemState]));
		else
			KdPrint((", D-state = %s\n", 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((DRIVERNAME " - Can't allocate power context structure\n"));
			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
		KdPrint((DRIVERNAME " - POWER Request (%s)\n", fcn < arraysize(fcnname) ? fcnname[fcn] : "??"));
			status = DefaultPowerHandler(pdx, Irp);
		}						// handle other power request

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

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

#pragma LOCKEDCODE

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

///////////////////////////////////////////////////////////////////////////////
// GetLowestDevicePowerState returns the lowest device power state that is
// consistent with a given system power state and the current wakeup state of
// the device.

DEVICE_POWER_STATE GetLowestDevicePowerState(PDEVICE_EXTENSION pdx, SYSTEM_POWER_STATE sysstate)
	{							// GetLowestDevicePowerState
	DEVICE_POWER_STATE maxstate = pdx->devcaps.DeviceState[sysstate];
	DEVICE_POWER_STATE minstate = PowerDeviceD3;

	DEVICE_POWER_STATE dstate = minstate > maxstate ? minstate : maxstate;
	
	// TODO choose a different dstate here if you want to

	return dstate;
	}							// GetLowestDevicePowerState

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

#pragma LOCKEDCODE

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

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

#pragma LOCKEDCODE

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);
VOID PassivePowerComplete(PPOWCONTEXT ctx) {HandlePowerEvent(ctx, AsyncNotify);}

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

#ifdef VERBOSETRACE
	static char* powstatenames[] = {
		"InitialState",
		"SysPowerUpPending",
		"SubPowerUpPending",
		"SubPowerDownPending",
		"SysPowerDownPending",
		"DevPowerUpPending",
		"DevPowerDownPending",
		"ContextSavePending",
		"ContextRestorePending",
		"DevQueryUpPending",
		"DevQueryDownPending",
		"QueueStallPending",
		"SaveSeqPending",
		"RestoreSeqPending",
		"PassiveCompletePending",
		"FinalState",
		};

	static char* eventnames[] = {
		"NewIrp",
		"MainIrpComplete",
		"AsyncNotify",
		};

	static char* actionnames[] = {
		"InvalidAction",
		"TriageNewIrp",
		"QueueStallComplete",
		"ForwardMainIrp",
		"SysPowerUpComplete",
		"SysPowerDownComplete",
		"SelectDState",
		"SendDeviceIrp",
		"CompleteMainIrp",
		"DestroyContext",
		"SubPowerUpComplete",
		"SubPowerDownComplete",
		"DevPowerUpComplete",
		"SaveContext",
		"ContextSaveComplete",
		"ContextRestoreComplete",
		"DevQueryUpComplete",
		"DevQueryDown",
		"DevQueryDownComplete",
		"SendPowerSequence",
		"SaveSeqComplete",
		"ForwardDevDown",
		"RestoreSeqComplete",
		"RestoreContext",
		};
#endif // VERBOSETRACE

	static enum POWACTION actiontable[NUMPOWSTATES][NUMPOWEVENTS] = {
/*							NewIrp				MainIrpComplete				AsyncNotify	*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本成人在线不卡视频| 欧美日韩免费在线视频| 亚洲成va人在线观看| |精品福利一区二区三区| 国产精品久久久久久久午夜片| 精品免费国产一区二区三区四区| 欧美一区二区三区公司| 在线综合+亚洲+欧美中文字幕| 欧美另类z0zxhd电影| 884aa四虎影成人精品一区| 7777精品伊人久久久大香线蕉完整版| 色欧美片视频在线观看| 欧美在线综合视频| 8x8x8国产精品| 精品999久久久| 中文乱码免费一区二区| **欧美大码日韩| 洋洋成人永久网站入口| 午夜精品久久久久久久久久久| 首页国产丝袜综合| 国产精品综合在线视频| 一本大道综合伊人精品热热 | 精品一区二区三区免费播放| 国产一区二三区好的| 不卡视频在线观看| 欧美在线高清视频| 久久亚洲一区二区三区明星换脸| 亚洲国产精品v| 日日夜夜免费精品| 国产精品亚洲第一区在线暖暖韩国| 不卡av免费在线观看| 欧美日韩不卡一区| 国产日产欧美一区| 日韩av网站在线观看| 丁香五精品蜜臀久久久久99网站 | 国产+成+人+亚洲欧洲自线| 99这里都是精品| 欧美电视剧免费全集观看| 国产精品进线69影院| 天天综合网 天天综合色| 国产盗摄精品一区二区三区在线| 在线中文字幕一区| 久久久噜噜噜久噜久久综合| 亚洲国产成人porn| 99久久免费精品| 久久久国际精品| 日韩va欧美va亚洲va久久| 99久久精品免费看| 国产调教视频一区| 日韩国产欧美三级| 欧美色图天堂网| 欧美激情一区二区三区四区| 免费人成网站在线观看欧美高清| 91在线云播放| 国产精品蜜臀av| 黄网站免费久久| 8v天堂国产在线一区二区| 亚洲人成在线播放网站岛国| 激情av综合网| 精品久久人人做人人爽| 天天做天天摸天天爽国产一区| 97久久人人超碰| 国产免费观看久久| 国产精品99久久久久| 精品国产91洋老外米糕| 青草av.久久免费一区| 欧亚一区二区三区| 亚洲精品菠萝久久久久久久| 福利电影一区二区| 中文欧美字幕免费| 成人久久18免费网站麻豆 | 狠狠色丁香婷婷综合| 91免费版pro下载短视频| 成人国产亚洲欧美成人综合网| 欧美日韩精品综合在线| 亚洲精品一二三| 成人黄色在线看| 中文字幕国产一区| 成人毛片视频在线观看| 国产精品免费aⅴ片在线观看| 国产美女精品一区二区三区| 欧美mv日韩mv国产网站app| 免费成人在线观看视频| 日韩精品在线一区| 韩国成人福利片在线播放| 精品国产第一区二区三区观看体验 | 91精品啪在线观看国产60岁| 亚洲一区二区成人在线观看| 欧美日韩一区中文字幕| 欧美一二区视频| 亚洲国产精品精华液网站| 欧美视频完全免费看| 青椒成人免费视频| 国产日韩精品一区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 亚洲人午夜精品天堂一二香蕉| 日本乱人伦一区| 午夜精品久久一牛影视| 精品久久五月天| www.欧美.com| 午夜精品aaa| 久久精品亚洲乱码伦伦中文| 91看片淫黄大片一级在线观看| 亚洲午夜电影在线观看| 欧美不卡一区二区三区| 99精品国产91久久久久久| 亚洲国产精品嫩草影院| 毛片基地黄久久久久久天堂| 在线观看网站黄不卡| 日日夜夜精品视频天天综合网| 欧美不卡一区二区三区四区| 91在线视频网址| 捆绑紧缚一区二区三区视频| 中文字幕精品一区二区精品绿巨人 | 久久久午夜电影| 欧洲另类一二三四区| 国内成人免费视频| 怡红院av一区二区三区| 久久综合久久鬼色| 91久久久免费一区二区| 国产在线精品一区二区夜色| 一区二区在线看| 国产视频一区二区在线| 欧美放荡的少妇| av中文字幕在线不卡| 久久精品二区亚洲w码| 一区二区久久久| 久久精品在线观看| 91精品国产91久久久久久最新毛片 | 久久久久9999亚洲精品| 5566中文字幕一区二区电影| 91美女在线看| 国产精品一区二区久久不卡| 毛片基地黄久久久久久天堂| 亚洲va欧美va国产va天堂影院| 国产日产欧美一区二区视频| 日韩一区二区三区四区| 91黄色小视频| 日本道在线观看一区二区| 成人h动漫精品一区二区| 经典三级一区二区| 三级久久三级久久| 亚洲一区二区三区四区不卡| 亚洲美女偷拍久久| 国产精品久久久久久妇女6080 | 精品处破学生在线二十三| 欧美网站大全在线观看| 99视频有精品| 成人一级视频在线观看| 国产夫妻精品视频| 成人综合婷婷国产精品久久蜜臀| 国产在线视频精品一区| 久久99精品视频| 激情综合色播五月| 精彩视频一区二区| 国产精品69久久久久水密桃| 裸体一区二区三区| 麻豆91在线看| 国模娜娜一区二区三区| 国产丶欧美丶日本不卡视频| 懂色av噜噜一区二区三区av| 波多野结衣在线一区| 99re热这里只有精品免费视频| 成人av电影在线网| av在线免费不卡| 欧洲av在线精品| 91精品国产麻豆国产自产在线 | 首页国产丝袜综合| 午夜一区二区三区视频| 亚洲免费资源在线播放| 亚洲精品久久久蜜桃| 亚洲国产精品嫩草影院| 亚洲3atv精品一区二区三区| 免费观看久久久4p| 丁香啪啪综合成人亚洲小说| 色婷婷精品大在线视频| 91麻豆精品国产| 久久久国产精品麻豆| 亚洲天堂av一区| 日韩va欧美va亚洲va久久| 国产精品自拍毛片| 色婷婷激情一区二区三区| 在线观看91av| 中文字幕成人网| 亚洲成人一二三| 懂色av一区二区夜夜嗨| 欧美日韩精品一区二区三区| 精品国产免费一区二区三区四区| 国产精品久久久久一区二区三区| 亚洲国产一区二区三区青草影视| 久久福利资源站| 在线一区二区视频| 亚洲成人动漫精品| 免费高清视频精品| www.久久久久久久久| 欧美一区二区三区四区久久| 国产精品久线在线观看| 蜜臀精品久久久久久蜜臀| 91在线观看一区二区| 精品女同一区二区|