2011-03-11 8 views
1

응용 프로그램 가상화 프로젝트를 수행 중입니다. 그래서 NT 레벨에서 응용 프로그램을 연결하고 가상 레지스트리에 대한 레지스트리 호출을 지시합니다. 내가 파일로 이동하는 경우, 모든 응용 프로그램을 실행에 -> 열기 ... 내가 가지고있는 몇 가지 레지스트리는 아래와 같이 호출NT 레지스트리 핸들 동작

  1. ZwOpenKey(registry key path)이 ->는 핸들 예를 생성합니다 (0x04e8)
  2. ZwQueryKey(0x4ea,...)

프로세스 모니터는 공개 키와 쿼리가 모두 동일한 키에서 수행된다고 말합니다. 나는 그 자신이 동일한 열쇠임을 테스트하고 확인했다.

또한 쿼리 키는 querykey api에 대한 올바른 결과를 생성했습니다. 이 2 바이트의 차이는 모든 열린 키 및 쿼리 키의 경우가 아닙니다.

을 호출하기 전에 응용 프로그램에서 핸들을 0x4e8에서 0x4ea으로 변경하는 방법과 이유는 무엇입니까?

또한 open과 querykey 사이에서 ZWDuplicateObject의 호출을 테스트했지만 duplicateobject api는 호출되지 않았습니다.

아무도이 핸들이 어떻게 바뀌는 지 말할 수 있습니까?

답변

3

핸들의 가장 낮은 두 비트 커널에서 사용하지 않는, 그래서 응용 프로그램 및/또는 일부 API를, 다음과 같은 추가 플래그를 사용하지 않고 추가 매개 변수

을하는 것보다 다른 값으로 설정하는 무료입니다
0x4ea & 0xffc == 0x4e8 & 0xffc 

레이몬드 첸 a series가이 비트에 대한 가능한 사용을 논의했다 :

커널 핸들은 항상 4의 배수이다; 하단 두 비트는 응용 프로그램에서 사용할 수 있습니다. 그런데 어째야 응용 프로그램에서 그 비트가 필요한 이유는 무엇입니까?

+0

Damien, 나는 링크를 배우고 있습니다. 그런 좋은 방향에 대해 대단히 감사합니다. 나는 나의 경우를 위해 그것을 해결하려고 노력할 것이다. 사이에서 당신은 2 비트를 다루는 것에 대한 어떤 경험도 가지고있을 것이다. –