driver-online
  log-inmypagesitemap
top
   자유게시판
   로그북
    견우일지
    시스템팀 개발일지
    Beginning Driver
   유용한 팁&강좌
   CrashDump분석(beta)
   개발QnA
    WDM 입문
    USB
    NDIS
    File System
    Debugging 관련
    그 외
 

GetCurrentDirectory() API를 커널에서 구현하고 싶다면?...
 ·작성일 2008.06.06:14.52 (금)  · 작성자 견우  · 조 회 9,683


프로젝트를 진행하다가 불가피하게 커널모드에서
Current Directory를 구해야하는 상황이 생겨버렸습니다...
Usermode에선 GetCurrentDirectory() API를 사용하면되지만
Kernelmode에선 없자나요~^^....

그래서 GetCurrentDirectory가 어떻게 구현이 되어있는지 살펴보았습니다...
결론은... _PEB에서 ProcessParameter에서 DosPath라는 것을 가져오는것이
GetCurrentDirectory가 하는일이더라구요~....

Windbg로 ProcessParameters를 살펴보면 다음과 같습니다.

nt!_RTL_USER_PROCESS_PARAMETERS
   +0x000 MaximumLength    : Uint4B
   +0x004 Length           : Uint4B
   +0x008 Flags            : Uint4B
   +0x00c DebugFlags       : Uint4B
   +0x010 ConsoleHandle    : Ptr32 Void
   +0x014 ConsoleFlags     : Uint4B
   +0x018 StandardInput    : Ptr32 Void
   +0x01c StandardOutput   : Ptr32 Void
   +0x020 StandardError    : Ptr32 Void
   +0x024 CurrentDirectory : _CURDIR
      +0x000 DosPath          : _UNICODE_STRING
      +0x008 Handle           : Ptr32 Void


위에 CurrentDirectory가 바로 현재 디렉토리이죠...
ReactOs를 보시면 좀더 구체적으로 소스를 살펴볼수있습니다.

ULONG NTAPI
RtlGetCurrentDirectory_U(ULONG MaximumLength,
    PWSTR Buffer)
{
     ULONG Length;
     PCURDIR cd;

     DPRINT ("RtlGetCurrentDirectory %lu %p\n", MaximumLength, Buffer);

     RtlAcquirePebLock();

     cd = (PCURDIR)&(NtCurrentPeb ()->ProcessParameters->CurrentDirectory.DosPath);
     Length = cd->DosPath.Length / sizeof(WCHAR);
     if (cd->DosPath.Buffer[Length - 1] == L'\\' &&
         cd->DosPath.Buffer[Length - 2] != L':')
         Length--;

     DPRINT ("cd->DosPath.Buffer %S Length %lu\n", cd->DosPath.Buffer, Length);

     if (MaximumLength / sizeof(WCHAR) > Length)
     {
          memcpy (Buffer, cd->DosPath.Buffer, Length * sizeof(WCHAR));
          Buffer[Length] = 0;
     }
     else
     {
          Length++;
     }

     RtlReleasePebLock ();

     DPRINT ("CurrentDirectory %S\n", Buffer);

     return (Length * sizeof(WCHAR));
}


·제라툴 굳 !! 2008.06.09 코멘트 삭제
·레오 좋은 정보 잘 봤습니다..^^* 2008.06.07 코멘트 삭제
 
quick-menu
event
study
QnA
pds
family-site concert used used2 intro
address
address