亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
色婷婷综合久久久久中文| 亚洲色欲色欲www| 7777女厕盗摄久久久| 日韩激情一二三区| 久久久www免费人成精品| 久久久久国产精品人| 久久综合色婷婷| 亚洲欧美一区二区不卡| 日韩二区三区四区| 一区二区三区欧美视频| 亚洲精品国久久99热| 综合av第一页| 欧美aaaaaa午夜精品| 久久成人av少妇免费| 成人app网站| 欧美亚洲国产一区二区三区va | 99re这里只有精品视频首页| 色综合咪咪久久| 日韩欧美成人午夜| 亚洲视频 欧洲视频| 激情综合五月婷婷| 欧美日韩在线观看一区二区| 久久久亚洲午夜电影| 一区二区三区在线视频播放| 国产激情一区二区三区四区 | 中文一区二区在线观看| 亚洲国产精品麻豆| 成人福利视频在线| 久久综合狠狠综合久久综合88| 国产精品私人自拍| 国模少妇一区二区三区| 欧美日韩国产影片| 亚洲高清视频的网址| 色一区在线观看| 中文一区在线播放| 国产精品一区二区免费不卡| 精品一区二区三区在线播放视频 | 欧美年轻男男videosbes| 中文字幕av一区二区三区高| 精品一区二区三区在线观看国产| 91精品国产91久久综合桃花 | 91丨九色porny丨蝌蚪| 国产三级久久久| 99视频一区二区| 一区二区三区产品免费精品久久75| 成人精品高清在线| 亚洲视频一区二区在线| 91成人看片片| 日本午夜精品一区二区三区电影| 欧美三级韩国三级日本三斤| 亚洲一区二区三区四区在线观看 | 在线免费观看视频一区| 一区二区三区免费网站| 在线免费观看成人短视频| 午夜精品爽啪视频| 337p日本欧洲亚洲大胆色噜噜| 麻豆一区二区三| 国产精品三级在线观看| 色婷婷综合久久久中文一区二区| 午夜久久久影院| 欧美国产1区2区| 欧美日韩黄视频| 成人av电影在线| 久久成人麻豆午夜电影| 欧美日韩视频在线观看一区二区三区| 国产清纯美女被跳蛋高潮一区二区久久w | 亚洲一区二区三区四区在线观看| 91精品国产高清一区二区三区蜜臀| 国产成人精品一区二区三区网站观看| 一区二区三区中文字幕电影| 精品国产免费久久| 欧美午夜影院一区| 91视频一区二区| 国产又粗又猛又爽又黄91精品| 亚洲人成小说网站色在线 | 午夜精品久久久久久| 国产精品入口麻豆九色| 精品国精品自拍自在线| 91国产免费观看| 91视频免费播放| 91麻豆国产自产在线观看| 成人免费高清在线观看| 国产成人福利片| 国产剧情在线观看一区二区| 乱中年女人伦av一区二区| 舔着乳尖日韩一区| 天天综合色天天综合色h| 午夜欧美一区二区三区在线播放| 亚洲免费色视频| 一区二区三区四区中文字幕| 中文字幕在线一区| 国产精品国产三级国产aⅴ原创| 国产精品免费av| 一区二区三区在线观看欧美| 亚洲国产视频一区| 日本网站在线观看一区二区三区| 午夜电影久久久| 久久精品国产**网站演员| 国产美女av一区二区三区| 免费观看一级特黄欧美大片| 国产人成一区二区三区影院| 中文字幕久久午夜不卡| 亚洲免费在线观看视频| 亚洲成人手机在线| 国产一区二区三区四区五区美女 | 精品成人佐山爱一区二区| 久久久九九九九| 亚洲自拍欧美精品| 国产精品99精品久久免费| 欧美影院一区二区三区| 欧美精品一区二区三区高清aⅴ| 亚洲国产成人自拍| 日韩电影在线观看一区| 99久久99久久精品免费看蜜桃| 欧美日韩免费电影| 国产精品久久久久久久第一福利| 午夜国产精品影院在线观看| 成人精品在线视频观看| 欧美成人欧美edvon| 亚洲成av人在线观看| 成年人网站91| 国产精品免费看片| 国产成人一区二区精品非洲| 日韩视频免费观看高清完整版 | 在线看国产日韩| 久久精品在线免费观看| 蜜桃在线一区二区三区| 欧美三片在线视频观看| 亚洲激情男女视频| 色香蕉成人二区免费| 中文字幕亚洲精品在线观看| 亚洲乱码国产乱码精品精98午夜| 欧美aaa在线| 精品国产一区二区三区av性色 | 一区二区久久久久| 久久精品72免费观看| 欧美精品欧美精品系列| 日韩精品亚洲专区| 欧美日韩精品系列| 奇米精品一区二区三区四区 | 国产日韩v精品一区二区| 黑人精品欧美一区二区蜜桃| 精品免费视频.| 成人性生交大合| 一区二区三区小说| 日韩免费视频一区二区| 国产乱码精品一区二区三| 国产精品久久国产精麻豆99网站| 国精产品一区一区三区mba桃花 | proumb性欧美在线观看| 综合网在线视频| 91精选在线观看| 99久久99久久精品免费观看| 亚洲高清久久久| 日本一区二区在线不卡| 欧美日韩一区不卡| 国产成人综合在线观看| 午夜免费久久看| 中文字幕一区在线| 2021中文字幕一区亚洲| 欧美亚洲动漫精品| 成人动漫视频在线| 黄色资源网久久资源365| 亚洲在线观看免费| 国产精品乱人伦一区二区| 日韩一区二区在线播放| 色婷婷久久久久swag精品| 国产+成+人+亚洲欧洲自线| 另类中文字幕网| 亚洲成人免费av| 亚洲国产精品视频| 日韩一级大片在线观看| 96av麻豆蜜桃一区二区| 国产成人在线免费| 国产一区二区美女诱惑| 精品一区二区三区影院在线午夜| 一区2区3区在线看| 亚洲一区免费视频| 一区二区三区成人| 五月天激情小说综合| 亚洲一区二区三区四区五区黄| 亚洲免费色视频| 亚洲超碰精品一区二区| 日韩精品电影一区亚洲| 青草av.久久免费一区| 激情文学综合插| 成人app软件下载大全免费| 91免费看`日韩一区二区| 日本精品视频一区二区| 欧美日韩免费电影| 精品久久久三级丝袜| 国产精品福利一区| 亚洲一区视频在线观看视频| 日本欧美在线观看| 成人免费av资源| 欧美三级视频在线观看| 久久精品在这里| 亚洲成人福利片| 成人丝袜高跟foot| 91精品国产综合久久香蕉麻豆|