驅動項目模板代碼
和上次的Win32項目模板代碼作用一樣,用來快速開發小的驅動工具,儲存在此,方便引用。
//////////////////////////////////////////////////////////////////////////
// Project:
// Author: 0xQo
// Date:
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 標頭檔包含
//////////////////////////////////////////////////////////////////////////
#include <ntddk.h>
//////////////////////////////////////////////////////////////////////////
//宏定義
//////////////////////////////////////////////////////////////////////////
//SSDT Table
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
//SSDT Hook 功能的三個宏定義
//ZwXXXX mov eax,(NtNums)
#define HOOK_INDEX(Zw2Nt) *(PULONG)((PUCHAR)Zw2Nt+1)
#define HOOK(ZwIndex,NewFunc,NtFunc) NtFunc = (PVOID)InterlockedExchange((PLONG)&NewSystemCall[HOOK_INDEX(ZwIndex)],(LONG)NewFunc)
#define UNHOOK(ZwIndex,NtFunc) InterlockedExchange((PLONG)&NewSystemCall[HOOK_INDEX(ZwIndex)],(LONG)NtFunc)
//////////////////////////////////////////////////////////////////////////
//全域變數聲明
//////////////////////////////////////////////////////////////////////////
//全域裝置對象指標
PDRIVER_OBJECT pGlobalDvrObj;
//裝置名稱、符號連結名字串
UNICODE_STRING device_name = RTL_CONSTANT_STRING(L"\\Device\\XXXXX");
UNICODE_STRING symb_link = RTL_CONSTANT_STRING(L"\\DosDevices\\XXXXX");
//////////////////////////////////////////////////////////////////////////
//函式宣告
//////////////////////////////////////////////////////////////////////////
//驅動卸載函數
VOID OnUnload(PDRIVER_OBJECT DriverObject);
//Io控制函數
NTSTATUS DeviceControl(PDEVICE_OBJECT pDeviceObject,PIRP pIrp);
//開啟或者關閉裝置
NTSTATUS CreateClose(PDEVICE_OBJECT DeviceObject,PIRP irp);
//////////////////////////////////////////////////////////////////////////
// 驅動進入點函數
//////////////////////////////////////////////////////////////////////////
NTSTATUS DriverEntry(__in PDRIVER_OBJECT pDriverObject,
__in PUNICODE_STRING pRegistryPath)
{
NTSTATUS status;
PDEVICE_OBJECT device;
//產生裝置對象
status = IoCreateDevice(pDriverObject,
NULL,
&device_name,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&device);
if (!NT_SUCCESS(status))
{
return status;
}
//產生符號連結
status = IoCreateSymbolicLink(&symb_link,&device_name);
if (!NT_SUCCESS(status))
{
IoDeleteDevice(device);
return status;
}
//設定派遣函數
// 驅動卸載函數
pDriverObject->DriverUnload = OnUnload;
//開啟、關閉裝置函數
pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateClose;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CreateClose;
// IOCTL分發函數
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControl;
return status;
}
//////////////////////////////////////////////////////////////////////////
//驅動卸載函數
//////////////////////////////////////////////////////////////////////////
VOID OnUnload(PDRIVER_OBJECT DriverObject)
{
PDEVICE_OBJECT pdoNextDeviceObj = pGlobalDvrObj->DeviceObject;
IoDeleteSymbolicLink(&symb_link);
// 刪除所有驅動裝置控制代碼
while(pdoNextDeviceObj)
{
PDEVICE_OBJECT pdoThisDeviceObj = pdoNextDeviceObj;
pdoNextDeviceObj = pdoThisDeviceObj->NextDevice;
IoDeleteDevice(pdoThisDeviceObj);
}
}
//////////////////////////////////////////////////////////////////////////
//開啟或者關閉裝置
//////////////////////////////////////////////////////////////////////////
NTSTATUS CreateClose(PDEVICE_OBJECT DeviceObject,PIRP irp)
{
return STATUS_NOT_SUPPORTED;
}
//////////////////////////////////////////////////////////////////////////
//IOCONTROL 分發函數
//////////////////////////////////////////////////////////////////////////
NTSTATUS DeviceControl(PDEVICE_OBJECT pDeviceObject,PIRP pIrp)
{
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(pIrp);
ULONG Code = IrpSp->Parameters.DeviceIoControl.IoControlCode;
ULONG InputLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
ULONG OutputLength = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
PVOID pIoBuff = pIrp->AssociatedIrp.SystemBuffer;
switch(Code)
{
default:
break;
}
pIrp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return pIrp->IoStatus.Status;
}
-EOF-