미니필터 드라이버가 XP에서는 로딩이 잘 되는데 비스타에서 테스트 해보니 FilterLoad() 함수가 0x80070522(ERROR_PRIVILEGE_NOT_HELD) 에러를 내며 로딩이 실패(물론 관리자 권한으로 실행해도) 하네요.
WDK 도움말을 잘 읽어보니..(역시 문서를 잘 읽어야 되는데.. 쩝) FilterLoad() 함수 호출자는 SeLoadDriverPrivilege (SE_LOAD_DRIVER_PRIVILEGE) 을 가져야 한다고 적혀있습니다.
그래서 프로그램이 필터드라이버 로딩전에 SeLoadDriverPrivilege 권한을 Enable 하도록 하는 함수를 만들었습니다.
//현재 프로세스의 access token 열기
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
Status = GetLastError();
return Status;
}
//특정 권한명의 LUID(locally unique identifier)를 얻어옴
if(!LookupPrivilegeValue(NULL, strPrivilege, &Luid))
{
Status = GetLastError();
CloseHandle(hToken);
return Status;
}
//액세스 토큰에 줄 권한을 설정
ZeroMemory(&TokenPrivileges, sizeof(TOKEN_PRIVILEGES));
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Luid = Luid;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//액세스 토큰에 특정 권한을 Enable (두번째 인자가 FALSE 이면 Enable, TRUE 이면 Disable)
if(!AdjustTokenPrivileges (hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), &OldTokenPrivileges, &dwSize))
{
Status = GetLastError();
CloseHandle(hToken);
return Status;
}
CloseHandle (hToken);
return ERROR_SUCCESS;
}
이 함수를 FilterLoad() 함수전에 아래와 같이 SeLoadDriverPrivilege 를 인자로 해서 호출해 주면 됩니다.
//필터 로딩
Status = FilterLoad();
…
※ 주의 : 코드는 실제 적용 코드에서 블로깅을 위해 수정된 것입니다. 사용하실때는 코드 검증및 테스트를 하시고 사용하시기 바랍니다.