1. 程式人生 > >初學驅動開發-windows驅動-helloWorld

初學驅動開發-windows驅動-helloWorld

 
#ifdef __cplusplus
extern "C"
{
#endif
#include 
#ifdef __cplusplus
}
#endif 

#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")

#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")

#define arraysize(p) (sizeof(p)/sizeof((p)[0]))

typedef struct _DEVICE_EXTENSION {
	PDEVICE_OBJECT pDevice;
	UNICODE_STRING ustrDeviceName;	//裝置名稱
	UNICODE_STRING ustrSymLinkName;	//符號連結名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

/************************************************************************
* 函式名稱:LoadDevice
* 功能描述:載入裝置物件,如果存在則使用現有裝置物件,如果不存在則建立新的裝置物件 
*************************************************************************/
#pragma INITCODE
NTSTATUS LoadDevice (
		IN PDRIVER_OBJECT	pDriverObject,
		IN PCWSTR          SourceString)
{
	NTSTATUS status;
	PDEVICE_OBJECT pDevObj;
	PDEVICE_EXTENSION pDevExt; 
	UNICODE_STRING devName;
	//裝置名稱
	RtlInitUnicodeString(&devName,SourceString);
	
	//建立裝置
	status = IoCreateDevice( pDriverObject,
						sizeof(DEVICE_EXTENSION),
						&(UNICODE_STRING)devName,
						FILE_DEVICE_UNKNOWN,
						0, TRUE,
						&pDevObj );
	if (!NT_SUCCESS(status))
    {
		RtlFreeUnicodeString( &devName );
		return status;
	}
	
	RtlZeroMemory(pDevObj->DeviceExtension, sizeof(DEVICE_EXTENSION));
	pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
	pDevObj->Flags |= DO_BUFFERED_IO; 
	pDevExt->pDevice = pDevObj;
	pDevExt->ustrDeviceName = devName;
	//建立符號連結
	UNICODE_STRING symLinkName;
	RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
	pDevExt->ustrSymLinkName = symLinkName;
	status = IoCreateSymbolicLink( &symLinkName,&devName );
	if (!NT_SUCCESS(status)) 
	{
		IoDeleteDevice( pDevObj );
		RtlFreeUnicodeString( &devName );
		RtlFreeUnicodeString( &symLinkName );
		return status;
	} 
	return STATUS_SUCCESS;
}

/************************************************************************
* 函式名稱:UnloadDevice 
* 功能描述:解除安裝驅動裝置 
*************************************************************************/
#pragma PAGEDCODE
VOID UnloadDevice (IN PDRIVER_OBJECT pDriverObject) 
{
	PDEVICE_OBJECT	pNextObj;
	KdPrint(("Enter DriverUnload\n"));
	pNextObj = pDriverObject->DeviceObject;
	while (pNextObj != NULL) 
	{
		PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
			pNextObj->DeviceExtension;

		//刪除符號連結
		UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
		IoDeleteSymbolicLink(&pLinkName);
		pNextObj = pNextObj->NextDevice;
		IoDeleteDevice( pDevExt->pDevice );
	}
} 
/************************************************************************
* 函式名稱:DriverEntry
* 功能描述:驅動程式入口函式 
*************************************************************************/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
			IN PDRIVER_OBJECT pDriverObject,
			IN PUNICODE_STRING pRegistryPath	) 
{
	NTSTATUS status;
	KdPrint(("Enter DriverEntry\n"));
	
	KdPrint(("Hello World Driver\n"));
	KdPrint(("pRegistryPath:%ws\n", pRegistryPath->Buffer)); //資訊
	//建立驅動裝置物件
	status = LoadDevice(pDriverObject, L"\\Device\\HelloWordDDKDevice");

	//解除安裝驅動裝置物件
	pDriverObject->DriverUnload = UnloadDevice; 
	

	KdPrint(("DriverEntry end\n"));
	return status;
}