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

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

?? driverentry.cpp

?? WDM驅動程序的范例程序
?? CPP
字號:
// Main program for Generic driver
// Copyright (C) 1999 by Walter Oney
// All rights reserved

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

#include <initguid.h>
DEFINE_GUID(GUID_AUTOLAUNCH_NOTIFY, 0xba4ec740, 0xda8b, 0x11d2, 0x81, 0xb5, 0x0, 0xc0, 0x4f, 0xa3, 0x30, 0xa6);
#include "GenericPower.h"

NTSTATUS OnRequestComplete(PDEVICE_OBJECT junk, PIRP Irp, PKEVENT pev);

BOOLEAN win98 = FALSE;

///////////////////////////////////////////////////////////////////////////////
// DriverEntry is not used in a kernel-mode DLL such as this one. It's only here
// to satisfy the build script

#pragma PAGEDCODE

extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,
	PUNICODE_STRING RegistryPath)
	{							// DriverEntry
	return STATUS_SUCCESS;		// never entered, actually
	}							// DriverEntry

///////////////////////////////////////////////////////////////////////////////
// DllInitialize is called when this module is first loaded. This function
// was added in version 1.7, part of SP-9. Note that RegistryPath just names
// a bogus service key that doesn't necessarily exist -- HKLM\...\Services\Generic.

#ifndef WIN98SAFE				// see comment in driver.h

#pragma PAGEDCODE

extern "C" NTSTATUS DllInitialize(PUNICODE_STRING RegistryPath)
	{							// DllInitialize
	KdPrint(("GENERIC - DllInitialize\n"));

	// Determine addresses of version-dependent routines

	#define GETADDRESS(n) \
		RtlInitUnicodeString(&name, L#n); \
		p##n = (t##n) MmGetSystemRoutineAddress(&name); 

	UNICODE_STRING name;

	return STATUS_SUCCESS;
	}							// DllInitialize

///////////////////////////////////////////////////////////////////////////////
// DllUnload is called when all references to this module disappear. This
// function was added in version 1.7, part of SP-9

#pragma PAGEDCODE

extern "C" NTSTATUS DllUnload()
	{							// DllUnload
	KdPrint(("GENERIC - DllUnload\n"));
	return STATUS_SUCCESS;
	}							// DllUnload

#endif // WIN98SAFE

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

#pragma PAGEDCODE	

GENERICAPI VOID GENERIC_EXPORT CleanupGenericExtension(PGENERIC_EXTENSION pdx)
	{							// CleanupGenericExtension
	if (pdx->queues)
		ExFreePool(pdx->queues);
	pdx->queues = NULL;
	pdx->nqueues = 0;
	}							// CleanupGenericExtension

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

#pragma LOCKEDCODE

NTSTATUS CompleteRequest(PIRP Irp, NTSTATUS status, ULONG_PTR info)
	{							// CompleteRequest
	Irp->IoStatus.Status = status;
	Irp->IoStatus.Information = info;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	return status;
	}							// CompleteRequest

// Overloaded variant that doesn't change IoStatus.Information -- use
// this for most PnP requests.

NTSTATUS CompleteRequest(PIRP Irp, NTSTATUS status)
	{							// CompleteRequest
	Irp->IoStatus.Status = status;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	return status;
	}							// CompleteRequest

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

#pragma PAGEDCODE

NTSTATUS ForwardAndWait(PGENERIC_EXTENSION pdx, PIRP Irp)
	{							// ForwardAndWait
	PAGED_CODE();
	
	KEVENT event;
	KeInitializeEvent(&event, NotificationEvent, FALSE);

	IoCopyCurrentIrpStackLocationToNext(Irp);
	IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) OnRequestComplete,
		(PVOID) &event, TRUE, TRUE, TRUE);

	IoCallDriver(pdx->LowerDeviceObject, Irp);
	KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
	return Irp->IoStatus.Status;
	}							// ForwardAndWait

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

#pragma LOCKEDCODE

GENERICAPI ULONG GENERIC_EXPORT GenericGetVersion()
	{							// GenericGetVersion
	return (VERMAJOR << 16) | VERMINOR;
	}							// GenericGetVersion

///////////////////////////////////////////////////////////////////////////////
// Portable implementation of MmGetSystemAddressForMdlSafe...

#pragma LOCKEDCODE

GENERICAPI PVOID GENERIC_EXPORT GenericGetSystemAddressForMdl(PMDL mdl)
	{							// GenericGetSystemAddressForMdl
	if (!mdl)
		return NULL;

	CSHORT oldfail = mdl->MdlFlags & MDL_MAPPING_CAN_FAIL;
	mdl->MdlFlags |= MDL_MAPPING_CAN_FAIL;

	PVOID address = MmMapLockedPages(mdl, KernelMode);

	if (!oldfail)
		mdl->MdlFlags &= ~MDL_MAPPING_CAN_FAIL;

	return address;
	}							// GenericGetSystemAddressForMdl

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

#pragma PAGEDCODE

GENERICAPI ULONG GENERIC_EXPORT GetSizeofGenericExtension()
	{							// GetSizeofGenericExtension
	PAGED_CODE();
	ULONG size = (sizeof(GENERIC_EXTENSION) + 7) & ~7;
	return size;
	}							// GetSizeofGenericExtension

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

#pragma PAGEDCODE

GENERICAPI NTSTATUS GENERIC_EXPORT InitializeGenericExtension(PGENERIC_EXTENSION pdx, PGENERIC_INIT_STRUCT isp)
	{							// InitializeGenericExtension
	if (isp->Size < FIELD_OFFSET(GENERIC_INIT_STRUCT, Flags)
		|| !isp->DeviceObject
		|| !isp->Ldo
		|| !isp->Pdo
		|| !isp->StartDevice
		|| !isp->StopDevice
		|| !isp->RemoveDevice
		|| isp->DeviceQueue && !isp->StartIo)

		return STATUS_INVALID_PARAMETER;

	RtlZeroMemory(pdx, sizeof(GENERIC_EXTENSION));

	pdx->DeviceObject = isp->DeviceObject;
	pdx->LowerDeviceObject = isp->Ldo;
	pdx->Pdo = isp->Pdo;
	pdx->StartDevice = isp->StartDevice;
	pdx->StopDevice = isp->StopDevice;
	pdx->RemoveDevice = isp->RemoveDevice;

	if (isp->Size >= FIELD_OFFSET(GENERIC_INIT_STRUCT, OkayToRemove) + sizeof(PQUERYFUNCTION))
		{						// set OkayToStop & OkayToRemove pointers
		pdx->OkayToStop = isp->OkayToStop;
		pdx->OkayToRemove = isp->OkayToRemove;
		}						// set OkayToStop & OkayToRemove pointers

	if ((pdx->RemoveLock = isp->RemoveLock))
		IoInitializeRemoveLock(pdx->RemoveLock, 0, 0, 0);

	pdx->state = STOPPED;
	
	pdx->devpower = PowerDeviceD0;
	pdx->syspower = PowerSystemWorking;
	POWER_STATE state;
	state.DeviceState = PowerDeviceD0;
	PoSetPowerState(pdx->DeviceObject, DevicePowerState, state);

	// In version 1.3, I added support for multiple IRP queues

	if (isp->Size >= FIELD_OFFSET(GENERIC_INIT_STRUCT, NumberOfQueues) + sizeof(ULONG)
		&& isp->NumberOfQueues)
		{						// multiple queues
		if (isp->DeviceQueue || isp->StartIo)
			return STATUS_INVALID_PARAMETER;	// can't mix new and old ways of identifying queues
		if (isp->Size < FIELD_OFFSET(GENERIC_INIT_STRUCT, Queues) + isp->NumberOfQueues * 2 * sizeof(PVOID))
			return STATUS_INVALID_PARAMETER;	// init structure not big enough
		for (ULONG i = 0; i < isp->NumberOfQueues; ++i)
			if (!isp->Queues[i].DeviceQueue || !isp->Queues[i].StartIo)
				return STATUS_INVALID_PARAMETER;	// none of the entries can be NULL

		pdx->nqueues = isp->NumberOfQueues;
		pdx->queues = (PDEVQUEUE*) ExAllocatePool(NonPagedPool, isp->NumberOfQueues * sizeof(PDEVQUEUE));
		if (!pdx->queues)
			return STATUS_INSUFFICIENT_RESOURCES;

		for (i = 0; i < isp->NumberOfQueues; ++i)
			{					// for each queue
			pdx->queues[i] = isp->Queues[i].DeviceQueue;
			InitializeQueue(pdx->queues[i], isp->Queues[i].StartIo);
			}					// for each queue
		}						// multiple queues

	else if (isp->DeviceQueue)
		{						// single queue
		pdx->nqueues = 1;
		pdx->queues = (PDEVQUEUE*) ExAllocatePool(NonPagedPool, sizeof(PDEVQUEUE));
		if (!pdx->queues)
			return STATUS_INSUFFICIENT_RESOURCES;
		pdx->queues[0] = isp->DeviceQueue;
		InitializeQueue(pdx->queues[0], isp->StartIo);
		}						// single queue

	// In version 1.9, I added support for FlushPendingIo.
	// In version 1.10, GetDevicePowerState

	if (isp->Size >= FIELD_OFFSET(GENERIC_INIT_STRUCT, Queues))
		{						// additional reserved fields
		pdx->FlushPendingIo = isp->FlushPendingIo;
		pdx->GetDevicePowerState = isp->GetDevicePowerState;
		}						// additional reserved fields

	// Capture the mini-driver name for messages. This needs to be in ANSI because
	// unicode conversions at or above DISPATCH_LEVEL are not allowed. In retrospect, I
	// should have made the field in the INIT struct be in ANSI to start with...

	if (!isp->DebugName.Length)
		strcpy(pdx->DebugName, "GENERIC");
	else
		{						// convert debug name
		ANSI_STRING asname = {0, sizeof(pdx->DebugName) - 1, pdx->DebugName};
		RtlUnicodeStringToAnsiString(&asname, &isp->DebugName, FALSE);
		pdx->DebugName[asname.Length] = 0;
		}						// convert debug name

	if (isp->Size >= FIELD_OFFSET(GENERIC_INIT_STRUCT, Flags) + sizeof(ULONG))
		pdx->Flags = isp->Flags & GENERIC_CLIENT_FLAGS;

	if (isp->Size >= FIELD_OFFSET(GENERIC_INIT_STRUCT, RestoreDeviceContext) + sizeof(PCONTEXTFUNCTION))
		{						// get power helper functions
		pdx->QueryPower = isp->QueryPower;
		pdx->SaveDeviceContext = isp->SaveDeviceContext;
		pdx->RestoreDeviceContext = isp->RestoreDeviceContext;
		}						// get power helper functions

	if (isp->Size >= FIELD_OFFSET(GENERIC_INIT_STRUCT, PerfBoundary) + sizeof(DEVICE_POWER_STATE))
		pdx->PerfBoundary = isp->PerfBoundary;
	else
		pdx->PerfBoundary = PowerDeviceUnspecified;

	if (pdx->PerfBoundary == PowerDeviceUnspecified)
		pdx->PerfBoundary = PowerDeviceMaximum; // inhibit POWER_SEQUENCE optimization

	// Initialize variables related to asynchrounous IOCTL management. In version 2.0, this
	// is now always done rather than depending on a flag in the init struct.

	InitializeListHead(&pdx->PendingIoctlList);
	pdx->IoctlAbortStatus = 0;
	KeInitializeSpinLock(&pdx->IoctlListLock);

	// Initialize to manage registered device interfaces

	KeInitializeEvent(&pdx->iflock, SynchronizationEvent, TRUE);
	InitializeListHead(&pdx->iflist);

	// Indicate we handle power IRPs at PASSIVE_LEVEL

	pdx->DeviceObject->Flags |= DO_POWER_PAGABLE;

	KdPrint(("GENERIC - Initializing GENERIC.SYS version %d.%2.2d.%3.3d for %s\n", VERMAJOR, VERMINOR, BUILD, pdx->DebugName));

	// If device honors paging-path notifications, initialize a synchronization
	// event in the signalled state to act as a simple mutex (SP-7)

	if (pdx->Flags & GENERIC_USAGE_PAGING)
		KeInitializeEvent(&pdx->evPagingPath, SynchronizationEvent, TRUE);

	// If requested to do so, register an AutoLaunch interface

	if (pdx->Flags & GENERIC_AUTOLAUNCH)
		GenericRegisterInterface(pdx, &GUID_AUTOLAUNCH_NOTIFY);

	// Register a power management interface

	GenericRegisterInterface(pdx, &GUID_GENERIC_POWER);

#ifdef _X86_
	win98 = IsWin98();
#endif

	return STATUS_SUCCESS;
	}							// InitializeGenericExtension

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

#pragma LOCKEDCODE

NTSTATUS OnRequestComplete(PDEVICE_OBJECT junk, PIRP Irp, PKEVENT pev)
	{							// OnRequestComplete
	KeSetEvent(pev, 0, FALSE);
	return STATUS_MORE_PROCESSING_REQUIRED;
	}							// OnRequestComplete

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

#pragma PAGEDCODE

GENERICAPI BOOLEAN GENERIC_EXPORT IsWin98()
	{							// IsWin98
#ifdef _X86_
	return !IoIsWdmVersionAvailable(1, 0x10);
#else
	return FALSE;
#endif // _X86_
	}							// IsWin98


#pragma LOCKEDCODE				// force inline functions into locked code

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品少妇一区二区三区视频免付费| 免费看欧美女人艹b| 国产日韩欧美麻豆| 亚洲视频一区二区在线观看| 午夜欧美一区二区三区在线播放| 香蕉成人伊视频在线观看| 免费成人小视频| 欧美mv和日韩mv国产网站| 久草在线在线精品观看| 色欧美片视频在线观看在线视频| 欧美日韩一区久久| 久久精品欧美日韩精品 | 亚洲va天堂va国产va久| 欧美伦理电影网| 日本一区二区动态图| 男女性色大片免费观看一区二区 | 国产999精品久久| 色哟哟在线观看一区二区三区| 综合久久久久久久| 欧美日韩国产bt| 亚洲精品中文在线观看| 国产一区高清在线| 欧美日韩精品高清| 久久99精品一区二区三区三区| 精品成人在线观看| 奇米色一区二区三区四区| 337p日本欧洲亚洲大胆精品| 日本伊人午夜精品| 欧美日韩国产高清一区二区| 国产在线精品一区二区不卡了 | 欧美一级精品大片| 亚洲国产精品一区二区久久| 97久久精品人人爽人人爽蜜臀| 欧美变态口味重另类| 高清国产一区二区| 午夜精品免费在线观看| 亚洲国产高清不卡| 欧美丰满一区二区免费视频 | 裸体健美xxxx欧美裸体表演| 成人精品一区二区三区中文字幕| 久久久久久久久久久黄色| 久久精品国产精品青草| 成人免费一区二区三区在线观看| 丰满白嫩尤物一区二区| 亚洲大片在线观看| 中文字幕在线不卡| 欧美va在线播放| 欧美性受xxxx| 五月婷婷另类国产| 亚洲国产精品精华液2区45| 欧美日韩久久一区| voyeur盗摄精品| 亚洲精品第一国产综合野| 精品粉嫩aⅴ一区二区三区四区| 色婷婷精品大在线视频| 国产成人在线影院| 亚洲美女少妇撒尿| 欧美精品一二三四| 一本色道亚洲精品aⅴ| 国产精品99久久久久久久女警| 中文字幕巨乱亚洲| 亚洲精品一线二线三线| 欧美一级日韩免费不卡| 久草热8精品视频在线观看| 五月综合激情日本mⅴ| 亚洲精品乱码久久久久久日本蜜臀| 久久久久国产精品麻豆ai换脸 | 热久久国产精品| 亚洲福中文字幕伊人影院| 亚洲美女免费在线| 国产精品电影一区二区三区| 一本到不卡精品视频在线观看| 国产精品亚洲一区二区三区妖精| 美女脱光内衣内裤视频久久网站| 亚洲成在线观看| 亚洲自拍偷拍麻豆| 久久久综合精品| 精品少妇一区二区三区日产乱码| 91麻豆精品国产91久久久资源速度| 国产在线播放一区三区四| 欧美aaaaaa午夜精品| 老司机精品视频导航| 蜜臀av在线播放一区二区三区| 亚洲妇熟xx妇色黄| 日韩成人免费电影| 另类调教123区| 国产在线乱码一区二区三区| 亚洲一区中文在线| 夜夜嗨av一区二区三区网页| 久久亚洲一区二区三区明星换脸| 欧美大肚乱孕交hd孕妇| 色系网站成人免费| 欧洲一区二区三区在线| 国产91清纯白嫩初高中在线观看 | 风间由美一区二区三区在线观看 | 中文字幕不卡在线| 中文字幕一区二区三区在线观看| 国产精品久久久久永久免费观看| 综合自拍亚洲综合图不卡区| 亚洲一区影音先锋| 青青草成人在线观看| 国产综合久久久久久鬼色| 国产成人精品一区二| av在线一区二区三区| 在线观看免费亚洲| 91精品国产综合久久久久久| 精品日本一线二线三线不卡| 久久综合狠狠综合| 国产精品国产三级国产有无不卡 | 亚洲h动漫在线| 久久国产精品露脸对白| 成人精品电影在线观看| 国产一区二区调教| 92国产精品观看| 欧美系列在线观看| 欧美videossexotv100| 亚洲欧美一区二区在线观看| 亚洲高清在线精品| 国产精品18久久久久| 99国产精品久| 日韩一级黄色片| 综合电影一区二区三区| 日韩精品一二三区| 日本不卡的三区四区五区| 国产成人亚洲综合a∨猫咪| 欧亚一区二区三区| 26uuuu精品一区二区| 一区二区三区视频在线看| 精品一区二区综合| 91国偷自产一区二区使用方法| 一本一本大道香蕉久在线精品| 日韩午夜在线观看| 亚洲男同性视频| 国产一区 二区| 欧美网站一区二区| 国产精品色哟哟网站| 亚洲视频一二三| 激情六月婷婷久久| 色婷婷亚洲精品| 国产性色一区二区| 毛片一区二区三区| 欧美三级电影在线看| 中文字幕成人av| 激情综合网激情| 欧美精品久久久久久久久老牛影院| 中文天堂在线一区| 国产精品一区久久久久| 欧美一区二区免费视频| 一区二区日韩电影| 99精品一区二区| 国产拍欧美日韩视频二区| 蜜臀av性久久久久蜜臀aⅴ流畅| 色视频欧美一区二区三区| 国产精品国产三级国产普通话99| 麻豆成人免费电影| 91精品啪在线观看国产60岁| 一级特黄大欧美久久久| 99re热这里只有精品视频| 国产亚洲一区二区在线观看| 美美哒免费高清在线观看视频一区二区 | 国产一区二区三区四区五区入口| 欧美图区在线视频| 亚洲久草在线视频| 99综合影院在线| 国产婷婷色一区二区三区四区| 麻豆精品视频在线观看免费| 欧美日本在线播放| 亚洲成人三级小说| 欧美少妇一区二区| 亚洲一区二区欧美激情| 欧洲在线/亚洲| 亚洲午夜激情网页| 欧美日韩国产高清一区二区三区| 亚洲一二三四在线| 欧美三级日韩三级国产三级| 亚洲国产三级在线| 欧美精品一二三| 日韩av一区二| 欧美一级久久久久久久大片| 久久99久久精品| 亚洲精品一区在线观看| 国产精品一级黄| 国产精品乱人伦中文| 91蜜桃在线免费视频| 欧美浪妇xxxx高跟鞋交| 婷婷久久综合九色国产成人| 欧美电影一区二区| 久久精品国产99国产| 久久青草欧美一区二区三区| 成人永久看片免费视频天堂| 国产精品久久久久久久久动漫| 不卡视频在线看| 亚洲午夜精品在线| 欧美成va人片在线观看| 成人h精品动漫一区二区三区| 亚洲三级小视频| 欧美顶级少妇做爰| 国产精品系列在线播放| 亚洲欧美日本在线| 欧美男人的天堂一二区|