驅動項目模板代碼

來源:互聯網
上載者:User

驅動項目模板代碼

   和上次的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-

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.