파일 시스템 필터 드라이버를 만들었습니다.파일 시스템 필터 드라이버 - 파일 생성 거부
내 드라이버가 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_CREATE
과 IRP_MJ_CLOSE
은 IoCompleteRequest()
이 필요하지 않습니다.
나는 다음 부분 만 가지고도 핸들이 정상적으로 반환되었음을 확인했습니다. (에서 사용자 모드.)
return STATUS_SUCCESS;
읽기 주셔서 감사합니다.
제 질문에 대한 답변을주십시오. 하지 연결된 장치에 전달할 필요 - - 당신이 필터에 어떤 요청을 거부해야하는 경우
답장을 보내 주셔서 감사합니다. 문제가 해결되었습니다. 그러나 연습을 위해 간단한 드라이버를 만들었을 때, CreateDispatch()와 CloseDispatch() 루틴은 사용자 모드 프로그램이 보통'return STATUS_SUCCESS'; 이유를 설명해 주시겠습니까? – SlayerBae
@SlayerBae - 드라이버에서 제어권을 반환합니다. 생성/닫기에는 출력 매개 변수가 없습니다 (생성 상태 블록이 있지만 사용자는이를 확인할 수 없습니다). 그러나 irp는 여전히 파괴되지 않았습니다. 메모리 할당과 비슷합니다. 메모리를 할당 한 다음 더 이상 사용하지 않고 더 많이 사용하지 않아도됩니다. 메모리 누수를 제외하고는 모두 정상적으로 작동합니다. – RbMm
다른 irp를 완료하지 않으면 더 심각 할 것입니다. 버퍼링 된 io에 대한 읽기 - 데이터는 사용자 버퍼에 복사되지 않습니다. 비동기식 io - apc 또는 iocp 패킷이 대기열에 저장되지 않습니다. 스레드 종료 시스템 검사 - irp가 스레드와 연관되어 있음 - 여전히 존재하는 경우 (작성/닫기가 완료되지 않은 경우와 같이) 결과 프로세스가 종료되지 않을 때 스레드가 종료 될 때 대기 (irp 완료시 대기) 할 수 있습니다. 시스템이 종료/재부팅되지 않습니다. irp를 완료하지 못함 - 메모리 누수 이상의 심각한 오류. 오랜만에 볼 수있는이 후 – RbMm