加载驱动程序

一个KMD都需要创建设备和符号链接,它们分别为kernel和win32提供了名字,这样kernel和win32就可以正确地使用KMD
相关例程 IoCreateDevice IoDeleteDevice IoCreateSymbolicLink IoDeleteSymbolicLink 查阅DDK文档


/*

driver.c

*/

#include <ntddk.h>



#define FILE_DEVICE_HELLO 0x00008010



/*函数声明*/

VOID DriverUnload(PDRIVER_OBJECT DriverObject);

/*DriverEntry例程*/

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)

{

    UNICODE_STRING  DeviceNameUnicodeString;

    UNICODE_STRING  DeviceLinkUnicodeString;

    NTSTATUS        ntStatus;

    PDEVICE_OBJECT  DeviceObject = NULL;





    RtlInitUnicodeString (&DeviceNameUnicodeString, L"\\Device\\dload");    

    

    /*创建设备*/

    ntStatus = IoCreateDevice (DriverObject,

                                0,

                                &DeviceNameUnicodeString,

                                FILE_DEVICE_HELLO,

                                0,

                                TRUE,

                                &DeviceObject);



    if (NT_SUCCESS(ntStatus))

    {

        /*卸载例程*/

        DriverObject->DriverUnload                         = DriverUnload;



        /*创建符号链接*/

        RtlInitUnicodeString (&DeviceLinkUnicodeString, L"\\DosDevices\\dload");

        ntStatus = IoCreateSymbolicLink (&DeviceLinkUnicodeString,&DeviceNameUnicodeString);



        if (!NT_SUCCESS(ntStatus))

        {

            DbgPrint ("ERROR: IoCreateSymbolicLink failed");

            IoDeleteDevice (DeviceObject);

        }

    }

    else

    {

        DbgPrint ("ERROR: IoCreateDevice failed");

    }



    DbgPrint("dload");



    return ntStatus;



}

/*DriverUnload*/

VOID DriverUnload(PDRIVER_OBJECT DriverObject)

{

    UNICODE_STRING DeviceLinkUnicodeString;

    NTSTATUS ntStatus;





    RtlInitUnicodeString (&DeviceLinkUnicodeString, L"\\DosDevices\\dload");

    

    ntStatus = IoDeleteSymbolicLink (&DeviceLinkUnicodeString);



    if (NT_SUCCESS(ntStatus))

    {

        IoDeleteDevice (DriverObject->DeviceObject);

    }

    else

    {

        DbgPrint ("ERROR: IoDeleteSymbolicLink");

    }



}




 
   
#include <windows.h> #include <Winsvc.h> #include <stdio.h> int main() { SC_HANDLE hSrvMgr; /*服务管理器句柄*/ SC_HANDLE hSrvDrv;/*KMD服务名柄*/ SERVICE_STATUS SvrSta; char szDir[256]; DWORD dwSize; GetCurrentDirectory( dwSize, szDir );/*取当前目录 */ strcat(szDir,"\\dload.sys"); LPCTSTR lpszBinaryPathName=TEXT(szDir); puts("任意键开始"); getchar(); hSrvMgr=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); //打开服务控制管理器 if(hSrvMgr) { puts("打开服务管理器:成功!"); } else { puts("打开服务管理器:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); hSrvDrv= CreateService( hSrvMgr, TEXT("dload"), //SYSTEM\CurrentControlSet\Services 驱动程序的在注册表中的名字 TEXT("dload"), // 注册表驱动程序的 DisplayName 值 SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序 SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值 SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值 lpszBinaryPathName, // 注册表驱动程序的 ImagePath 值 NULL, NULL, NULL, NULL, NULL); if(hSrvDrv) { puts("服务创建:成功!"); } else { puts("服务创建:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if(StartService( hSrvDrv, NULL, NULL )) { puts("服务启动:成功,KMD加载成功"); } else { puts("服务启动:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if( ControlService(hSrvDrv, SERVICE_CONTROL_STOP , &SvrSta ) ) { puts("服务停止:成功,KMD不工作"); } else { puts("服务停止:失败,需要重启再次加载,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if( DeleteService( hSrvDrv ) ) { puts("服务卸载:成功"); } else { puts("服务卸载:失败,任意键退出"); getchar(); exit(1); } CloseServiceHandle( hSrvDrv ); CloseServiceHandle( hSrvMgr ); puts("任意键退出"); getchar(); return 0; }

你可能感兴趣的:(加载)