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

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

?? driverentry.cpp

?? 學習了2個月時間 走了不少彎路 現奉上搜集到的驅動開發入門筆記 共勉!
?? CPP
字號:
// Main program for pktdma driver
// Copyright (C) 1999 by Walter Oney
// All rights reserved

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

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);
VOID DriverUnload(IN PDRIVER_OBJECT fdo);

BOOLEAN win98 = FALSE;

UNICODE_STRING servkey;

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

#pragma INITCODE

extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath)
	{							// DriverEntry
	KdPrint((DRIVERNAME " - Entering DriverEntry: DriverObject %8.8lX\n", DriverObject));

	// Insist that OS support at least the WDM level of the DDK we use

	if (!IoIsWdmVersionAvailable(1, 0))
		{
		KdPrint((DRIVERNAME " - Expected version of WDM (%d.%2.2d) not available\n", 1, 0));
		return STATUS_UNSUCCESSFUL;
		}

	// See if we're running under Win98 or NT:

	win98 = IsWin98();

#if DBG
	if (win98)
		KdPrint((DRIVERNAME " - Running under Windows 98\n"));
	else
		KdPrint((DRIVERNAME " - Running under NT\n"));
#endif

	// Save the name of the service key

	servkey.Buffer = (PWSTR) ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR));
	if (!servkey.Buffer)
		{
		KdPrint((DRIVERNAME " - Unable to allocate %d bytes for copy of service key name\n", RegistryPath->Length + sizeof(WCHAR)));
		return STATUS_INSUFFICIENT_RESOURCES;
		}
	servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR);
	RtlCopyUnicodeString(&servkey, RegistryPath);

	// Initialize function pointers

	DriverObject->DriverUnload = DriverUnload;
	DriverObject->DriverExtension->AddDevice = AddDevice;

	DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
	DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
	DriverObject->MajorFunction[IRP_MJ_READ] = DispatchReadWrite;
	DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchReadWrite;
	DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchCleanup;
	DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
	DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
	
	return STATUS_SUCCESS;
	}							// DriverEntry

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

#pragma PAGEDCODE

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
	{							// DriverUnload
	PAGED_CODE();
	KdPrint((DRIVERNAME " - Entering DriverUnload: DriverObject %8.8lX\n", DriverObject));
	RtlFreeUnicodeString(&servkey);
	}							// DriverUnload

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

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
	{							// AddDevice
	PAGED_CODE();
	KdPrint((DRIVERNAME " - Entering AddDevice: DriverObject %8.8lX, pdo %8.8lX\n", DriverObject, pdo));

	NTSTATUS status;

	// Create a functional device object to represent the hardware we're managing.

	PDEVICE_OBJECT fdo;

	ULONG dxsize = (sizeof(DEVICE_EXTENSION) + 7) & ~7;
	ULONG xsize = dxsize + GetSizeofGenericExtension();
	
	UNICODE_STRING devname;
	RtlInitUnicodeString(&devname, L"\\DosDevices\\PKTDMA");

	status = IoCreateDevice(DriverObject, xsize, &devname,
		FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &fdo);
	if (!NT_SUCCESS(status))
		{						// can't create device object
		KdPrint((DRIVERNAME " - IoCreateDevice failed - %X\n", status));
		return status;
		}						// can't create device object
	
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	// From this point forward, any error will have side effects that need to
	// be cleaned up. Using a try-finally block allows us to modify the program
	// easily without losing track of the side effects.

	__try
		{						// finish initialization
		pdx->DeviceObject = fdo;
		pdx->Pdo = pdo;

		// Make a copy of the device name

		pdx->devname.Buffer = (PWCHAR) ExAllocatePool(NonPagedPool, devname.MaximumLength);
		if (!pdx->devname.Buffer)
			{					// can't allocate buffer
			status = STATUS_INSUFFICIENT_RESOURCES;
			KdPrint((DRIVERNAME " - Unable to allocate %d bytes for copy of name\n", devname.MaximumLength));
			__leave;
			}					// can't allocate buffer
		pdx->devname.MaximumLength = devname.MaximumLength;
		RtlCopyUnicodeString(&pdx->devname, &devname);

		// Declare the buffering method we'll use for read/write requests

		fdo->Flags |= DO_DIRECT_IO;

		// Initialize DPC object

		IoInitializeDpcRequest(fdo, DpcForIsr);

		// The S5933 requires DMA buffers be aligned on a 4-byte boundary

		if (fdo->AlignmentRequirement < 3)
			fdo->AlignmentRequirement = 3;

		// Link our device object into the stack leading to the PDO
		
		pdx->LowerDeviceObject = IoAttachDeviceToDeviceStack(fdo, pdo);
		if (!pdx->LowerDeviceObject)
			{					// can't attach								 
			KdPrint((DRIVERNAME " - IoAttachDeviceToDeviceStack failed\n"));
			status = STATUS_DEVICE_REMOVED;
			__leave;
			}					// can't attach

		// Initialize to use the GENERIC.SYS library

		pdx->pgx = (PGENERIC_EXTENSION) ((PUCHAR) pdx + dxsize);

		GENERIC_INIT_STRUCT gis = {sizeof(GENERIC_INIT_STRUCT)};
		gis.DeviceObject = fdo;
		gis.Pdo = pdo;
		gis.Ldo = pdx->LowerDeviceObject;
		gis.RemoveLock = &pdx->RemoveLock;
		gis.DeviceQueue = &pdx->dqReadWrite;
		gis.StartIo = StartIo;
		gis.StartDevice = StartDevice;
		gis.StopDevice = StopDevice;
		gis.RemoveDevice = RemoveDevice;
		RtlInitUnicodeString(&gis.DebugName, LDRIVERNAME);

		status = InitializeGenericExtension(pdx->pgx, &gis);
		if (!NT_SUCCESS(status))
			{
			KdPrint((DRIVERNAME " - InitializeGenericExtension failed - %X\n", status));
			__leave;
			}

		// Clear the "initializing" flag so that we can get IRPs

		fdo->Flags &= ~DO_DEVICE_INITIALIZING;
		}						// finish initialization
	__finally
		{						// cleanup side effects
		if (!NT_SUCCESS(status))
			{					// need to cleanup
			if (pdx->devname.Buffer)
				RtlFreeUnicodeString(&pdx->devname);
			if (pdx->LowerDeviceObject)
				IoDetachDevice(pdx->LowerDeviceObject);
			IoDeleteDevice(fdo);
			}					// need to cleanup
		}						// cleanup side effects

	return status;
	}							// AddDevice

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

#pragma LOCKEDCODE

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

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

#pragma PAGEDCODE

NTSTATUS DispatchPnp(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchPnp
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	return GenericDispatchPnp(pdx->pgx, Irp);
	}							// DispatchPnp

NTSTATUS DispatchPower(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchPower
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	return GenericDispatchPower(pdx->pgx, Irp);
	}							// DispatchPower

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

#pragma PAGEDCODE

VOID RemoveDevice(IN PDEVICE_OBJECT fdo)
	{							// RemoveDevice
	PAGED_CODE();
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	NTSTATUS status;

	RtlFreeUnicodeString(&pdx->devname);

	if (pdx->LowerDeviceObject)
		IoDetachDevice(pdx->LowerDeviceObject);

	IoDeleteDevice(fdo);
	}							// RemoveDevice

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

#if DBG && defined(_X86_)
#pragma LOCKEDCODE

extern "C" void __declspec(naked) __cdecl _chkesp()
	{
	_asm je okay
	ASSERT(!DRIVERNAME " - Stack pointer mismatch!");
okay:
	_asm ret
	}

#endif // DBG

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲美女淫视频| 亚洲电影一区二区| 51精品秘密在线观看| 国产+成+人+亚洲欧洲自线| 亚洲一区二区三区三| 国产精品久久久久精k8| 日韩欧美中文字幕制服| 91碰在线视频| 成人黄色电影在线| 精品在线你懂的| 五月婷婷色综合| 有坂深雪av一区二区精品| 国产无一区二区| 日韩午夜中文字幕| 精品视频全国免费看| 94色蜜桃网一区二区三区| 国产精品69久久久久水密桃| 视频在线在亚洲| 午夜视频一区在线观看| 亚洲色图都市小说| 国产精品久久久久三级| 久久综合五月天婷婷伊人| 日韩视频免费直播| 欧美二区三区的天堂| 色菇凉天天综合网| 99久久99久久综合| 成人午夜电影久久影院| 国产老肥熟一区二区三区| 老司机午夜精品| 免费成人av在线| 日本色综合中文字幕| 亚洲成a天堂v人片| 首页亚洲欧美制服丝腿| 日韩激情一区二区| 日本欧美一区二区三区乱码 | 一区二区三区在线免费| 国产精品网曝门| 国产精品女主播av| 国产精品激情偷乱一区二区∴| 国产视频在线观看一区二区三区| 久久婷婷色综合| 亚洲国产电影在线观看| 中文久久乱码一区二区| 中文字幕一区二区三区在线观看 | 美腿丝袜在线亚洲一区| 男女男精品视频| 久久精品国产亚洲a| 国产麻豆精品在线观看| 国产激情91久久精品导航| 国产99精品国产| 99久久精品国产精品久久| 日本韩国一区二区| 欧美日韩三级在线| 日韩欧美国产麻豆| 国产亚洲成aⅴ人片在线观看| 欧美国产一区二区| 亚洲精品欧美激情| 石原莉奈一区二区三区在线观看 | 91免费国产在线| 欧洲精品在线观看| 日韩女优av电影| 亚洲国产精品精华液2区45| 亚洲美女在线一区| 麻豆精品国产91久久久久久| 国产乱子伦视频一区二区三区| 成人综合婷婷国产精品久久免费| 99久免费精品视频在线观看| 日本高清视频一区二区| 7777精品伊人久久久大香线蕉经典版下载 | 色综合久久九月婷婷色综合| 欧美揉bbbbb揉bbbbb| 欧美mv日韩mv国产网站| 国产精品国产三级国产aⅴ原创| 亚洲精品免费在线播放| 日本不卡一区二区| 成人深夜在线观看| 欧美精品 日韩| 国产精品高潮久久久久无| 午夜久久福利影院| 国产91精品精华液一区二区三区 | 日韩一区二区三区高清免费看看| 久久久久久99精品| 一区二区成人在线| 国产毛片精品视频| 欧美日韩精品一二三区| 久久久久久久网| 亚洲午夜久久久久久久久电影院 | 91麻豆123| 精品国产91乱码一区二区三区 | 韩国av一区二区三区四区| 91一区二区三区在线观看| 日韩美女视频在线| 亚洲一区在线观看免费 | 日韩一级视频免费观看在线| 亚洲国产电影在线观看| 久久国产精品99精品国产| 日本国产一区二区| 国产欧美一区二区三区在线看蜜臀 | 男人操女人的视频在线观看欧美| 99久久精品国产毛片| www一区二区| 天堂影院一区二区| 91麻豆高清视频| 国产农村妇女毛片精品久久麻豆| 午夜私人影院久久久久| 成人免费三级在线| 久久综合色婷婷| 日韩国产一区二| 91成人在线精品| 国产精品传媒视频| 国产+成+人+亚洲欧洲自线| 日韩精品一区二区三区蜜臀 | 欧美日本韩国一区二区三区视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 久久国内精品视频| 欧美精品一卡二卡| 亚洲一区在线视频观看| 91免费版在线| 中文字幕一区二区三| 国产精品一区二区无线| 日韩免费性生活视频播放| 日韩精品一级二级| 欧美猛男gaygay网站| 一区二区三区免费| 在线亚洲人成电影网站色www| 国产精品情趣视频| 国产99久久久国产精品免费看| 久久综合久久久久88| 久久99精品国产麻豆婷婷洗澡| 日韩欧美电影一区| 麻豆国产91在线播放| 日韩视频一区二区三区在线播放 | 亚洲一区二区免费视频| 在线视频一区二区免费| 日韩美女精品在线| 99精品视频在线观看| 亚洲欧美中日韩| 91网站最新地址| 亚洲欧美自拍偷拍色图| 91影视在线播放| 亚洲一区二区三区爽爽爽爽爽 | 国产伦精品一区二区三区免费迷| 日韩欧美国产一区二区在线播放 | 亚洲制服欧美中文字幕中文字幕| 一本到一区二区三区| 一区二区久久久| 欧美视频你懂的| 视频一区二区国产| 精品人在线二区三区| 国产一区在线视频| 国产精品伦理一区二区| 99麻豆久久久国产精品免费优播| 亚洲毛片av在线| 欧美日韩一级二级三级| 视频一区二区中文字幕| 精品国产一区二区三区久久影院 | 高清国产一区二区三区| 中文字幕一区在线| 欧美三级乱人伦电影| 日韩一区精品字幕| 久久综合久久综合久久| 成人av资源下载| 亚洲成人精品一区二区| 日韩三级av在线播放| 不卡一区在线观看| 亚洲午夜在线观看视频在线| 精品理论电影在线观看| 99精品桃花视频在线观看| 视频在线在亚洲| 亚洲国产精品成人综合| 欧美日韩在线电影| 国内精品久久久久影院一蜜桃| 1区2区3区国产精品| 91精品国产综合久久福利| 国产成a人亚洲精品| 亚洲最大成人综合| 欧美精品一区二区在线观看| 日本久久精品电影| 国产一区亚洲一区| 亚洲一区二区视频在线观看| www精品美女久久久tv| 色综合天天在线| 激情欧美一区二区| 依依成人综合视频| 久久这里只精品最新地址| 色婷婷av一区二区三区软件| 国产在线精品一区二区夜色| 亚洲激情欧美激情| 久久精品人人做人人爽97| 欧美乱熟臀69xxxxxx| 成人黄色免费短视频| 美女爽到高潮91| 亚洲精品成人悠悠色影视| 26uuu另类欧美亚洲曰本| 欧美猛男男办公室激情| 99精品国产一区二区三区不卡| 久久成人av少妇免费| 亚洲高清三级视频| 亚洲视频在线观看一区| 久久青草国产手机看片福利盒子|