반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코로나19
- javascript
- vue
- 소액임금체불
- 전자소송
- reactnative
- 당사자표시정정신청서
- 이더리움
- Java
- Python
- 인민공원
- Eclipse
- Blade
- 보정명령
- cartalyst
- win32
- 체당금
- elasticSearch
- Tutorial
- Sentinel
- 개인사업자
- 코로나
- 사업자계좌
- Bootstrap
- auth
- Laravel
- blockchain
- php
- 홈택스
- as후기
Archives
- Today
- Total
그냥 사는 이야기
Wow64 redirection 해제(x64) 본문
반응형
Sys 파일 로딩 실패
우리 제품 중 Windows Server 2003 x64에서 driver파일 로딩에서 에러가 발생하였다.
::LoadLibraryEx("C:\\WINDOWS\\System32\\drivers\\acpi.sys", 0, LOAD_LIBRARY_AS_DATAFILE);
실패한 함수는 LoadLibraryEx()였고 GetLastError()에서 파일이 존재하지 않는다고 알려준다. 하지만 저 경로에 acpi.sys 파일은 분명 있다. Wow64 지원을 위해 저 경로를 SysWow64 경로로 돌려버리는 redirection 때문에 발생하였다.
간단히 이 코드로 테스트 해보면 알 수 있다.
if( 0 == _waccess_s(_T("C:\\WINDOWS\\System32\\drivers\\acpi.sys"), 0) )
{
printf("exist\n");
}
해결책
이것을 해결하기 위해서는 Wow64DisableWow64FsRedirection으로 redirection을 잠시 꺼두고 sys파일을 로드한 후 다시 revert 해주면 된다.
if( Wow64DisableWow64FsRedirection(&OldValue) )
{
if( 0 == _waccess_s(_T("C:\\WINDOWS\\System32\\drivers\\acpi.sys"), 0) )
{
printf("exist\n");
}
if ( FALSE == Wow64RevertWow64FsRedirection(OldValue) )
{
printf("Wow64RevertWow64FsRedirection failed\n");
}
}
System32를 가리킬 땐 SysWow64로 가지 않고 System32로 접근이 가능해진다.
레거시 OS
여기서 주의할 점으로는 Wow64DisableWow64FsRedirection()와 Wow64RevertWow64FsRedirection()은 최소 사용 가능 OS 버전이 Windows XP x64부터이다.
그럼 XP x86은? 그래서 위의 예처럼 직접적으로 사용하지 않고 kernel32에서 load 하여 모듈에서 function을 가져와서 사용한다. 조금 더 안정적으로 사용하려면,
...
BOOL bDisabledRedirection = FALSE;
typedef BOOL (WINAPI * LPWOW64FSREDIRECTION)(PVOID *);
...
{
LPWOW64FSREDIRECTION lpfWow64DisableWow64FsRedirection = NULL;
HMODULE hModule = LoadLibrary( _T("kernel32.dll") );
if (hModule)
{
lpfWow64DisableWow64FsRedirection =
(LPWOW64FSREDIRECTION)GetProcAddress(hModule, "Wow64DisableWow64FsRedirection");
if (lpfWow64DisableWow64FsRedirection)
{
bDisabledRedirection = (*lpfWow64DisableWow64FsRedirection)(&old_value);
}
FreeLibrary(hModule);
}
}
위와 같은 형태로 사용하면 된다.
'Development > System' 카테고리의 다른 글
Visual Studio 2008에서 Team Foundation Server 2010 사용하기 (0) | 2012.06.07 |
---|---|
Win32 API x86, x64 구분? (0) | 2010.01.27 |
devcon을 사용하여 disk를 disable 시키기 (0) | 2009.10.21 |
LoadLibrary() / FreeLibrary() 에서 memory leak 발생 (0) | 2009.07.17 |
IcmpCreateFile() 의 handle은 꼭 IcmpCloseHandle()을 해주자 (0) | 2009.04.16 |
Comments