2017-12-21 35 views
0

드라이버 서비스가 시작될 때 볼륨을 연결하려고했지만 ""이 있습니다. 필터가 볼륨에 첨부 할 준비가되지 않았습니다. (FltStartFiltering가 호출되지 않았습니다.) "초기화하고 즉시 파란색 화면이 나타납니다. 나는 이미 을 FltStartFiltering이라고 불렀지 만, 왜 작동하지 않았는지 알 수 없습니다. 잘못뿐만 아니라"FltStartFiltering을 호출하지 못했습니다."DriverEntry에 볼륨을 연결하려고 시도하는 중 오류가 발생했습니다.

status = FltRegisterFilter(DriverObject, 
     &FilterRegistration, 
     &MiniSpyData.Filter); 

    if (!NT_SUCCESS(status)) { 

     leave; 
    } 




    status = FltBuildDefaultSecurityDescriptor(&sd, 
     FLT_PORT_ALL_ACCESS); 

    if (!NT_SUCCESS(status)) { 
     leave; 
    } 

    RtlInitUnicodeString(&uniString, WOODY_PORT_NAME); 

    InitializeObjectAttributes(&oa, 
     &uniString, 
     OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, 
     NULL, 
     sd); 

    status = FltCreateCommunicationPort(MiniSpyData.Filter, 
     &MiniSpyData.ServerPort, 
     &oa, 
     NULL, 
     SpyConnect, 
     SpyDisconnect, 
     SpyMessage, 
     1); 

    FltFreeSecurityDescriptor(sd); 



    if (!NT_SUCCESS(status)) { 
     leave; 
    } 

    // 
    // We are now ready to start filtering 
    // 

    status = FltStartFiltering(MiniSpyData.Filter); 

    if (!NT_SUCCESS(status)) { 

     FltUnregisterFilter(MiniSpyData.Filter); 
    } 
    else { 
    //Here is what I want to attach 
     RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1"); 
     PFLT_VOLUME vol; 
     FltGetVolumeFromName(&MiniSpyData.Filter, &uniString, &vol); 
     status = FltAttachVolume(&MiniSpyData.Filter, vol, NULL, NULL); 
    } 
+0

'FltGetVolumeFromName' 및'FltAttachVolume'은 '& MiniSpyData.Filter'가 아니어야하지만'MiniSpyData.Filter'가 아니야 - 치명적인 오류 인 경우 이에 해당됩니다. 또한 일반적인 메모로 - 당신이 'FltAttachVolume'이라고 부르는 것에 대해서? fltmgr 자동으로 기존 볼륨에 필터를 첨부하십시오 – RbMm

+0

고마워요! 내 실수 야. 이제 작동합니다 ... PC를 다시 시작하면 필터 드라이버가 연결되지 않습니다. 나는 서비스를 확인하고 확실하게 실행 중이다 ... – SuperBerry

+0

FltAttachVolume()을 호출하지 않으면 ... 그러나 FlightAttachVolume()을 DriverEntry에서 호출하면 서비스로드를 한 번 연결할 수 있지만 몇 초 후에 다시 블루 스크린이 나타납니다. 코드를 다시 확인해야합니다 ... 도움을 주셔서 감사합니다 – SuperBerry

답변

0
RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1"); 
PFLT_VOLUME vol; 
FltGetVolumeFromName(&MiniSpyData.Filter, &uniString, &vol); 
status = FltAttachVolume(&MiniSpyData.Filter, vol, NULL, NULL); 

은 위의 부분은 단순히 필요하지 않습니다 및 :

다음은 내 코드입니다. 설명해 드리죠 : 난 당신이 그것을 PFLT_FILTER * 수동에 부착 할 필요가 없습니다

  • 을주는 코드에서 무엇을보고

    1. FltGetVolumeFromName 루틴 첫 번째 매개 변수로와에서 PFLT_FILTER을 볼륨의 인스턴스 컨텍스트 등록 플래그에 FLTFL_INSTANCE_SETUP_MANUAL_ATTACHMENT을 설정하지 않으면 인스턴스 컨텍스트에서 자동으로 첨부되고 호출되므로 자세한 내용은 this을 참조하십시오.
    2. 볼륨이 아직 존재하지 않아서 잠재적 인 BSOD가 아니기 때문에 부팅하는 동안 부팅하고 싶지 않습니다.

    행운을 빈다.