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의 구현에 브레이크를 건다.
CreateFileW의 구조는 아래와 같다.
HANDLE CreateFileW(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
WIMFileCreateFile에서 _CreateFileW@28을 호출하는 부분을 보면..
dwShareMode에 단순히 0이 아니라 *(ebp+8)의 값을 넣는것을 볼 수 있다. 희망이 있다!
근데 값을 보면 이미 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를 자동으로 넣는다.
끝.
반응형
'개발 및 운영 > 프로그래밍' 카테고리의 다른 글
When should AccessController.doPrivileged() be used? (0) | 2021.01.11 |
---|---|
FIPS 인증을 위한 모듈 개발 (boringssl) (0) | 2020.10.15 |
C++에서 Node.JS 사용하기 (node모듈아님) (0) | 2019.10.21 |
[C++11] std::bind 로 unique_ptr 넘기기 (0) | 2019.09.04 |
std::function 복사는 비싸다! (0) | 2019.09.04 |
댓글