2016-11-24 2 views
0

프로그램 드라이버를 시작했습니다. 나는 많은 기사를 빨간색으로 만들고 작동하는 테스트 드라이버를 개발했습니다. 처음에는 Hello World Driver입니다. 콘솔에서 드라이버를 설치하고 시작한 다음 중지하고 제거하십시오. 모두 잘 작동합니다. 다시 설치하고 다시 시작하려면 "StartService"함수에서 Error no 2를 반환합니다. Throught Debug-Message 두 번째로 DriverEntry 함수가 호출되지 않음을 알 수 있습니다. 하지만 PC를 수리하면 드라이버를 설치하고 시작할 수 있습니다. Unfurtunaly이 문제에 대한 기사를 찾을 수 없습니다. 2를 반환하는 다른 문제, 즉 드라이버를 찾을 수 없습니다. 하지만이 모든 것이 효과적입니다. 강령 드라이버의드라이버를 두 번째로 시작할 수 없습니다.

SC_HANDLE hSCManager; 
SC_HANDLE hService; 
SERVICE_STATUS ss; 

hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); 

printf("Load Driver\n"); 

if(hSCManager) 
{ 
    printf("Create Service\n"); 
    getchar(); 

    hService = CreateService(hSCManager, TEXT("Example"), TEXT("Example Driver"), SERVICE_START | DELETE | SERVICE_STOP, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, TEXT("C:\\Windows\\System32\\drivers\\MyFirstDriver.sys"), NULL, NULL, NULL, NULL, NULL); 
    //hService = CreateService(hSCManager, TEXT("Example"), TEXT("Example Driver"), SERVICE_START | DELETE | SERVICE_STOP, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, TEXT("C:\\driver\\temp2\MyFirstDriver.sys"), NULL, NULL, NULL, NULL, NULL); 

    if(!hService) 
    { 
     printf("OpenService Service\n"); 
     getchar(); 
     hService = OpenService(hSCManager, TEXT("Example"), SERVICE_START | DELETE | SERVICE_STOP); 
    } 

    if(hService) 
    { 
     printf("Start Service\n"); 
     getchar(); 
     if (StartService(hService, 0, NULL)) 
     { 
      printf("Start war erfolgreich\n"); 
     } 
     else 
     { 
      printf("Fehler beim starten\n"); 
      printf("StartService failed (%d)\n", GetLastError()); 

     } 

     Sleep(5000); 
     printf("Press Enter to close service\n"); 
     getchar(); 
     printf("beendet\n"); 
     getchar(); 
     ControlService(hService, SERVICE_CONTROL_STOP, &ss); 



     if (DeleteService(hService)) { 
      printf("Delete war erfolgreich\n"); 
     } 
     else 
     { 
      printf("Fehler beim Delete\n"); 
      printf("Delete failed (%d)\n", GetLastError()); 
      //Error nr 6 
     } 

     if (CloseServiceHandle(hService)) { 
      printf("Close war erfolgreich\n"); 
     } 
     else 
     { 
      printf("Fehler beim Close\n"); 
      printf("Close failed (%d)\n", GetLastError()); 

     } 
    } 
    printf("Press Enter to close service\n"); 
     getchar(); 
    CloseServiceHandle(hSCManager); 
} 
return 0; 

:

내가 가진 드라이버를 설치

#include "stdafx.h" 
#include "functions.h" 

void MyFirstDriverUnload(IN PDRIVER_OBJECT DriverObject); 
NTSTATUS MyFirstDriverCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); 
NTSTATUS MyFirstDriverClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); 
NTSTATUS MyFirstDriverDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); 
NTSTATUS MyFirstDriverAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject); 
NTSTATUS MyFirstDriverPnP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); 
NTSTATUS MyFirstDriverRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); 
NTSTATUS MyFirstDriverUnsupportedFunc(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); 


typedef struct _deviceExtension 
{ 
PDEVICE_OBJECT DeviceObject; 
PDEVICE_OBJECT TargetDeviceObject; 
PDEVICE_OBJECT PhysicalDeviceObject; 
UNICODE_STRING DeviceInterface; 
} MyFirstDriver_DEVICE_EXTENSION, *PMyFirstDriver_DEVICE_EXTENSION; 

// {282b517a-9a95-4fdc-8167-aec5f8463df3} 
static const GUID GUID_MyFirstDriverInterface = {0x282B517A, 0x9a95, 0x4fdc, {0x81, 0x67, 0xae, 0xc5, 0xf8, 0x46, 0x3d, 0xf3 } }; 

#ifdef __cplusplus 
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath); 
#endif 

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) 
{ 

DbgPrint("DriverEntry01 Called \r\n"); 
NTSTATUS NtStatus = STATUS_SUCCESS; 
    INT uiIndex = 0; 
DbgPrint("DriverEntry02 Called \r\n"); 
    PDEVICE_OBJECT pDeviceObject = NULL; 
DbgPrint("DriverEntry03 Called \r\n"); 
    UNICODE_STRING usDriverName, usDosDeviceName; 

DbgPrint("DriverEntry3 Called \r\n"); 
DbgPrint("DriverEntry4 Called \r\n"); 
DbgPrint("DriverEntry5 Called \r\n"); 
    DbgPrint("DriverEntry6 Called \r\n"); 

    RtlInitUnicodeString(&usDriverName, L"\\Device\\Example"); 
DbgPrint("DriverEntry7 Called \r\n"); 
    RtlInitUnicodeString(&usDosDeviceName, L"\\DosDevices\\Example"); 
DbgPrint("DriverEntry8 Called \r\n"); 

    NtStatus = IoCreateDevice(DriverObject, 0, &usDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject); 
DbgPrint("DriverEntry9 Called \r\n"); 
if(NtStatus == STATUS_SUCCESS) 
    { 
    DbgPrint("DriverEntry10 Called \r\n"); 

    for(uiIndex = 0; uiIndex < IRP_MJ_MAXIMUM_FUNCTION; uiIndex++) 
     DriverObject->MajorFunction[uiIndex] = MyFirstDriverUnsupportedFunc; 

     DriverObject->MajorFunction[IRP_MJ_CLOSE]    = MyFirstDriverClose; 
     DriverObject->MajorFunction[IRP_MJ_CREATE]   = MyFirstDriverCreate; 
     DriverObject->MajorFunction[IRP_MJ_PNP] = MyFirstDriverPnP; 
     DriverObject->MajorFunction[IRP_MJ_READ]    = MyFirstDriverRead; 

     DriverObject->DriverUnload = MyFirstDriverUnload; 


     DriverObject->Flags &= (~DO_DEVICE_INITIALIZING); 


     IoCreateSymbolicLink(&usDosDeviceName, &usDriverName); 
    } 


    return NtStatus; 


} 



void MyFirstDriverUnload(IN PDRIVER_OBJECT DriverObject) 
{ 
DbgPrint("Goodbye from MyFirstDriver!\n"); 
} 


NTSTATUS MyFirstDriverUnsupportedFunc(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
    NTSTATUS NtStatus = STATUS_SUCCESS; 
    DbgPrint("MyFirstDriverUnsupportedFunc \r\n"); 

    return NtStatus; 
} 

NTSTATUS MyFirstDriverRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
    NTSTATUS NtStatus = STATUS_SUCCESS; 


    DbgPrint("Example Read Called \r\n"); 

    return NtStatus; 
} 

NTSTATUS MyFirstDriverClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
NTSTATUS NtStatus = STATUS_SUCCESS; 
    DbgPrint("Drive Close \r\n"); 

    return NtStatus; 
} 

NTSTATUS MyFirstDriverCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
Irp->IoStatus.Status = STATUS_SUCCESS; 
    Irp->IoStatus.Information = 0; 
IoCompleteRequest(Irp, IO_NO_INCREMENT); 
return STATUS_SUCCESS; 
} 

NTSTATUS MyFirstDriverDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 

PMyFirstDriver_DEVICE_EXTENSION deviceExtension = NULL; 

IoSkipCurrentIrpStackLocation(Irp); 
deviceExtension = (PMyFirstDriver_DEVICE_EXTENSION) DeviceObject->DeviceExtension; 
return IoCallDriver(deviceExtension->TargetDeviceObject, Irp); 

} 

NTSTATUS MyFirstDriverAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject) 
{ 
PDEVICE_OBJECT DeviceObject = NULL; 
PMyFirstDriver_DEVICE_EXTENSION pExtension = NULL; 
NTSTATUS status; 

status = IoCreateDevice(DriverObject, 
         sizeof(MyFirstDriver_DEVICE_EXTENSION), 
         NULL, 
         FILE_DEVICE_UNKNOWN, 
         0, 
         0, 
         &DeviceObject); 

if (!NT_SUCCESS(status)) 
    return status; 

pExtension = (PMyFirstDriver_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 

pExtension->DeviceObject = DeviceObject; 
pExtension->PhysicalDeviceObject = PhysicalDeviceObject; 
pExtension->TargetDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject); 

status = IoRegisterDeviceInterface(PhysicalDeviceObject, &GUID_MyFirstDriverInterface, NULL, &pExtension->DeviceInterface); 
ASSERT(NT_SUCCESS(status)); 

DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; 
return STATUS_SUCCESS; 
} 


NTSTATUS MyFirstDriverIrpCompletion(
        IN PDEVICE_OBJECT DeviceObject, 
        IN PIRP Irp, 
        IN PVOID Context 
       ) 
{ 
PKEVENT Event = (PKEVENT) Context; 

UNREFERENCED_PARAMETER(DeviceObject); 
UNREFERENCED_PARAMETER(Irp); 

KeSetEvent(Event, IO_NO_INCREMENT, FALSE); 

return(STATUS_MORE_PROCESSING_REQUIRED); 
} 

NTSTATUS MyFirstDriverForwardIrpSynchronous(
          IN PDEVICE_OBJECT DeviceObject, 
          IN PIRP Irp 
         ) 
{ 
PMyFirstDriver_DEVICE_EXTENSION deviceExtension; 
KEVENT event; 
NTSTATUS status; 

KeInitializeEvent(&event, NotificationEvent, FALSE); 
deviceExtension = (PMyFirstDriver_DEVICE_EXTENSION) DeviceObject->DeviceExtension; 

IoCopyCurrentIrpStackLocationToNext(Irp); 

IoSetCompletionRoutine(Irp, MyFirstDriverIrpCompletion, &event, TRUE, TRUE, TRUE); 

status = IoCallDriver(deviceExtension->TargetDeviceObject, Irp); 

if (status == STATUS_PENDING) { 
    KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); 
    status = Irp->IoStatus.Status; 
} 
return status; 
} 

NTSTATUS MyFirstDriverPnP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp); 
PMyFirstDriver_DEVICE_EXTENSION pExt = ((PMyFirstDriver_DEVICE_EXTENSION)DeviceObject->DeviceExtension); 
NTSTATUS status; 

ASSERT(pExt); 

switch (irpSp->MinorFunction) 
{ 
case IRP_MN_START_DEVICE: 
    IoSetDeviceInterfaceState(&pExt->DeviceInterface, TRUE); 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
    return STATUS_SUCCESS; 

case IRP_MN_QUERY_REMOVE_DEVICE: 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
    return STATUS_SUCCESS; 

case IRP_MN_REMOVE_DEVICE: 
    IoSetDeviceInterfaceState(&pExt->DeviceInterface, FALSE); 
    status = MyFirstDriverForwardIrpSynchronous(DeviceObject, Irp); 
    IoDetachDevice(pExt->TargetDeviceObject); 
    IoDeleteDevice(pExt->DeviceObject); 
    RtlFreeUnicodeString(&pExt->DeviceInterface); 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
    return STATUS_SUCCESS; 

case IRP_MN_QUERY_PNP_DEVICE_STATE: 
    status = MyFirstDriverForwardIrpSynchronous(DeviceObject, Irp); 
    Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
    return status; 
} 
return MyFirstDriverDefaultHandler(DeviceObject, Irp); 
} 

편집

: 내가 만들고 시작 SC SC와 같은 시도했다. 두 번째로는 파일을 찾을 수 없다는 추가 정보와 함께 오류 2를 제공합니다. 하지만, 내가 말했듯이, 그는 파일과로드를 처음으로 발견 할 수 있습니다. 두 번째 시간.

답변

1

드라이버에 엄청난 오류가있어 언로드 할 수 없습니다. 장치 "\\Device\\Example"DriverEntry에 만들지 만 장치를 삭제하지 않으려면 장치를 보류 해제하지 말고 MyFirstDriverUnload을 삭제하십시오. 당신은 또한 WDM 드라이버가 될거야,하지만 난 당신의 장치 ID에 대한 WDM으로 귀하의 드라이버를 등록하지 않았으며 귀하의 MyFirstDriverAddDevice 절대 전화하지 마십시오. WDM 드라이버 (자체 장치를 장치 스택에 연결 한 후)는 시작/중지로 스택을 중지/파괴 한 후에 만 ​​언로드 할 수 있습니다. 다른 하나의 오류

DriverObject->Flags &= (~DO_DEVICE_INITIALIZING);

. IRP 처리에 대해서는 이미 말하지 않았습니다. 그러나 다시 - 을 MyFirstDriverUnload에 전화하지 않았기 때문에이 구체적인 경우 드라이버가 언로드되지 않았습니다.

+0

조언 주셔서 감사. 내가 썼을 때, 나는 발전하기 시작했다. 그래서 나는 이것을 점검 할 것이다. 고마워요! – michi101200

+0

DriverUnload에서 IoDeleteDevice (pDeviceObject)를 호출하고이 'DriverObject-> Flags & = (~ DO_DEVICE_INITIALIZING);을 수정하십시오. how 최소 – RbMm

+0

도움이되었습니다 !!!!! – michi101200

0

두 번째로 드라이버를 시작할 때 문제가 아닌 것으로 생각됩니다. 그러나 나는 확실하지 않습니다 : ControlService(hService, SERVICE_CONTROL_STOP, &ss);의 반환 값을 확인하지 마십시오. 내 가설은 the driver can't stop입니다. 드라이버를 다시 시작하기 전에 반환 값을 확인하여 드라이버가 중지되었는지 확인하십시오.

+0

감사합니다. ControlService는 true를 반환하며, 이번에는 커널 디버그가 "Goodbye driver"와 드라이버의 디버그 메시지를 보여줍니다. 그런 다음 제거하기 전에 서비스가 중지 될 때까지 기다렸습니다. 하지만 도움이되지 않았다 – michi101200

관련 문제