2017-03-23 36 views
2

파일 시스템 필터 드라이버를 만들었습니다.파일 시스템 필터 드라이버 - 파일 생성 거부

내 드라이버가 IRP_MJ_CREATE를 필터링하고 파일 이름을 인쇄합니다.

NTSTATUS DispatchCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp) 
{ 
    PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; 

    DbgPrint("DispatchCreate() : %wZ\n", &FileObject->FileName;) 

    return DispatchPassThrough(DeviceObject, Irp); 
} 

잘 작동합니다.

이제 새 파일을 만들 때마다 액세스 거부가 발생합니다.

은 (가능하면, '당신은 권한이 없습니다.')


그래서 나는 몇 가지를 시도했다.

먼저, 다음 작업을 수행했습니다.

NTSTATUS DispatchCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp) 
{ 
    PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; 
    PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); 

    ULONG Option = Stack->Parameters.Create.Options; 

    if ((Option >> 24) == FILE_CREATE) 
    { 
     DbgPrint("DispatchCreate() : File Create Denied, %wZ, %x \n", &FileObject->FileName, Option); 

     return STATUS_ACCESS_VIOLATION; // or any error code 
    } 

    return DispatchPassThrough(DeviceObject, Irp); 
} 

괜찮 았지만 조금 이상했습니다.

예를 들어, 관리자 권한이없는 경우 "C : \"에서 무언가를 만들려고하면 약간의 말을 할 수 있습니다.

현재 FileObject가 정상적으로 삭제 될지 모르겠습니다.

그래서 다음과 같이 변경했습니다.

NTSTATUS DispatchCreate(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp) 
{ 
    PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; 
    PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); 

    ULONG Option = Stack->Parameters.Create.Options; 

    if ((Option >> 24) == FILE_CREATE) 
    { 
     DbgPrint("DispatchCreate() : File Create Denied, %wZ, %x \n", &FileObject->FileName, Option); 

     Irp->IoStatus.Status = STATUS_ACCESS_VIOLATION; 
     return Irp->IoStatus.Status; 
    } 

    return DispatchPassThrough(DeviceObject, Irp); 
} 

그러나 약간 다른 오류 메시지가 발생합니다.

정상적인 권한이 없기 때문에 "액세스가 거부되었습니다"와 동일한 동작을 원합니다.



그리고 또 다른 질문이 있습니다.

다른 디스패치 루틴과 달리 IRP_MJ_CREATEIRP_MJ_CLOSEIoCompleteRequest()이 필요하지 않습니다.

나는 다음 부분 만 가지고도 핸들이 정상적으로 반환되었음을 확인했습니다. (에서 사용자 모드.)

return STATUS_SUCCESS; 

읽기 주셔서 감사합니다.

제 질문에 대한 답변을주십시오. 하지 연결된 장치에 전달할 필요 - - 당신이 필터에 어떤 요청을 거부해야하는 경우

답변

3

당신이 자신에게 설정 오류 상태 및 기타 파견 루틴과는 달리 IRP

Irp->IoStatus.Status = STATUS_ACCESS_DENIED; 
IofCompleteRequest(Irp);// !!! 
return STATUS_ACCESS_DENIED; // ! not Irp->IoStatus.Status - you can not access Irp after call IofCompleteRequest 

완전한 필요 IRP_MJ_CREATE 및 IRP_MJ_CLOSE는 하지 않습니다 IoCompleteRequest()가 필요합니다.

물론 이것은 절대 거짓입니다. 모든 Irp는 전화로 완료해야합니다. IofCompleteRequest

+0

답장을 보내 주셔서 감사합니다. 문제가 해결되었습니다. 그러나 연습을 위해 간단한 드라이버를 만들었을 때, CreateDispatch()와 CloseDispatch() 루틴은 사용자 모드 프로그램이 보통'return STATUS_SUCCESS'; 이유를 설명해 주시겠습니까? – SlayerBae

+0

@SlayerBae - 드라이버에서 제어권을 반환합니다. 생성/닫기에는 출력 매개 변수가 없습니다 (생성 상태 블록이 있지만 사용자는이를 확인할 수 없습니다). 그러나 irp는 여전히 파괴되지 않았습니다. 메모리 할당과 비슷합니다. 메모리를 할당 한 다음 더 이상 사용하지 않고 더 많이 사용하지 않아도됩니다. 메모리 누수를 제외하고는 모두 정상적으로 작동합니다. – RbMm

+0

다른 irp를 완료하지 않으면 더 심각 할 것입니다. 버퍼링 된 io에 대한 읽기 - 데이터는 사용자 버퍼에 복사되지 않습니다. 비동기식 io - apc 또는 iocp 패킷이 대기열에 저장되지 않습니다. 스레드 종료 시스템 검사 - irp가 스레드와 연관되어 있음 - 여전히 존재하는 경우 (작성/닫기가 완료되지 않은 경우와 같이) 결과 프로세스가 종료되지 않을 때 스레드가 종료 될 때 대기 (irp 완료시 대기) 할 수 있습니다. 시스템이 종료/재부팅되지 않습니다. irp를 완료하지 못함 - 메모리 누수 이상의 심각한 오류. 오랜만에 볼 수있는이 후 – RbMm