지돌이의 블로그 입니다!

WIMCreateFile에는 CreateFile와는 달리 dwShareMode옵션이 없다.

 

이를 사용할 수 있는지 확인해 보기 위해 분석을 시도한다.

 

volatile const void* p_WIMCreateFile = WIMCreateFile;
const void* p_CreateFileW = CreateFileW;
HANDLE hTemp = CreateFileW(_T("E:\\ISO\\boot.wim"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
CloseHandle(hTemp);
HANDLE hWim = WIMCreateFile(_T("E:\\ISO\\boot.wim"), WIM_GENERIC_READ, WIM_OPEN_EXISTING, 0, 0, 0);
printf("hWim = %p\n", hWim);

 

일단 위 코드를 실행하고 VisualStudio Debug Window중에 디스어셈블창을 열어서 CreateFile의 구현에 브레이크를 건다.

 

[사진1] _CreateFileW@28에 브레이크가 걸린 모습

CreateFileW의 구조는 아래와 같다.

HANDLE CreateFileW(
  LPCWSTR               lpFileName,
  DWORD                 dwDesiredAccess,
  DWORD                 dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD                 dwCreationDisposition,
  DWORD                 dwFlagsAndAttributes,
  HANDLE                hTemplateFile
);

WIMFileCreateFile에서 _CreateFileW@28을 호출하는 부분을 보면..

[사진2] WIMFileCreateFile함수내에서 _CreateFileW@28 호출하는 부분

dwShareMode에 단순히 0이 아니라 *(ebp+8)의 값을 넣는것을 볼 수 있다. 희망이 있다!

 

[사진3] (사진2)에서 dwShareMode의 값

근데 값을 보면 이미 FILE_SHARE_READ 가 있다... 근데 왜 CreateFile으로 열고 있으면 WIMCreateFile이 안되었던 거지??? 뭔가 잘못했었나 보다...ㅠㅠ

 

아쉬우니 좀더 뒤져보면...

 

v7 = GetWimDesiredAccess(v3) & 0x40000000 /* GENERIC_WRITE */;
v20 = (v7 == 0) ? FILE_SHARE_READ : 0;
if ( GetFlagsAndAttributes(v3) & 0x40 /* FILE_ATTRIBUTE_DEVICE */)
  dwShareMode = 3; // FILE_SHARE_READ | FILE_SHARE_WRITE
else
  dwShareMode = v20;

결국...
GENERIC_WRITE가 없으면 FILE_SHARE_READ를 자동으로 넣는다.

 

끝.

Comment +0