2012-08-23 11 views
0

파일이 닫혀있을 때 파일을 변경하고 열 때 변경 사항을 되돌리고 싶습니다. 필자는 파일을 암호화하고 싶지 않은 것을 제외하고는 암호화 드라이버와 비슷합니다.MiniFilter 드라이버 - IRP_MJ_CLOSE 및 IRP_MJ_CREATE의 파일 바이트 수정

Visual Studio 2012에 WDK8이 포함 된 새로운 "필터 드라이버 : 파일 시스템 미니 필터"프로젝트를 만들고 콜백 함수로 PreCreate, PostCreate, PreClose 및 PostClose를 등록했습니다.

예를 들어, 파일의 IRP_MJ_CLOSE에의 바이트가있는 {72,101,108,108,111} ("안녕하세요"), 나는 PostClose 기능 후 파일이 하드 디스크에 다음과 같이 것이라고 원하는 : {10,11,12, 72,101,108,108,111}.

나는 그냥만큼 쉬운 일이 아닙니다 의심 :

FLT_PREOP_CALLBACK_STATUS 
    PreClose (
    _Inout_ PFLT_CALLBACK_DATA Data, 
    _In_ PCFLT_RELATED_OBJECTS FltObjects, 
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext 
    ) 
{ 
    //... 

    //some if statment... 
    { 
     Data->Iopb->Parameters.Write.WriteBuffer = newBfr; 
     Data->Iopb->Parameters.Write.Length = newLen; 
    } 
    //... 

    return FLT_PREOP_SUCCESS_WITH_CALLBACK; 
} 

내가 주제에 대한 몇 가지 지침을 싶습니다.

또한 이것을 디버깅하는 가장 좋은 방법은 무엇입니까? Windows 7 디버그로 인쇄하는 방법을 찾지 못했습니다.

감사합니다. gfgqtmakia.

편집 : http://code.msdn.microsoft.com/windowshardware/swapBuffer-File-System-6b7e6e2d을 읽었지만 읽기/쓰기 용이므로 도움이되지 않을 것입니다. 다루지 않으려 고합니다.

EDIT2 : 파일이 하드 드라이브에 있고 IRP 중간에 있지 않으면 PreCreate 및 PostClose에서 변경해야합니다. 그러면 버퍼를 처리 할 필요가 없습니다. " 날아라. "그러나 디스크에?

답변

1

스왑 버퍼과 같은 것을 써야합니다. PostCreate/PreClose에서 파일 데이터를 수정하는 것은 좋은 생각이 아닙니다.

몇 가지 이유 :

  • 첫째 PostCreate/PreClose에 당신은 Data->Iopb->Parameters.Write.WriteBuffer에 접근 할 수 없습니다. 이는 IRP_MJ_WRITE에서만 유효합니다. FltWriteFile을 사용하여 데이터를 파일에 쓸 수 있습니다.
  • Windows 커널은 IRP_MJ_CLOSE 이후의 디스크에 파일 데이터를 즉시 쓸 수 없습니다. 페이지 캐시에 대해 생각해보십시오.
  • 페이징 I/O, 직접 I/O 등과 같이 복잡하게 처리해야하는 경우가 있습니다.
  • 또 다른 중요한 사실은 파일 크기를 변경한다는 것입니다 (실제 데이터 길이는 5 바이트이며 데이터를 8 바이트로 업데이트 함). 이제는 관리하기가 매우 어렵습니다. minifilter/파일 시스템 드라이버에서 파일 크기를 변경하지 않는 것이 좋습니다.
+0

감사합니다. 그러나 PreCreate 및 PostClose는 어떻습니까? – assafmo

+0

@gfgqtmakia 같은 주장이 그들에게도 적용됩니다. – Rohan

+0

그러나 파일이 HD에서로드되기 전과 파일이 HD에 기록 된 후입니다. – assafmo