2012-03-06 7 views
16

Spojrzałem na dokumenty dla DuplicateHandle innego dnia i zauważyłem, że DuplicateHandle jest w stanie skopiować klucze rejestru (HKEY s). Odczytanie tego nieco więcej w książce SysInternals wydaje się wskazywać, że uchwyty kluczy rejestru są zwykłymi obiektami jądra, podobnymi do uchwytów plików. Jednak CloseHandle nie może zamknąć HKEY s, a RegCloseKey nie może zamykać innych rodzajów obiektów jądra.Dlaczego istnieje RegCloseKey (kiedy CloseHandle wydaje się wykonywać tę samą funkcję)?

Dlaczego rozróżnienie?

+0

Hmm, mogę tylko zgadywać, że HKEY zostały wprowadzone wcześniej (w Windows 3.1), a następnie Microsoft nie chciał ujednolicić interfejsów, mimo że implementacje zostały scalone. – Philipp

+1

Właśnie zgaduję tutaj: Na końcu dokumentacji dla 'CloseHandle()' mówi: > Zamknięcie rączki wątku nie kończy powiązanego wątku lub usuwa obiekt wątku. Zamknięcie uchwytu procesu nie kończy powiązanego procesu ani nie usuwa obiektu procesu. Aby usunąć obiekt wątku, należy zakończyć wątek, a następnie zamknąć wszystkie uchwyty do wątku. Aby uzyskać więcej informacji, zobacz Zakończenie wątku. Aby usunąć obiekt procesu, należy zakończyć proces, a następnie zamknąć wszystkie uchwyty do procesu. Podczas zamykania klucza rejestru mogą wystąpić podobne operacje. – yasouser

+0

@Philipp: Tak też myślałem, z wyjątkiem np. CreateFile znajdowały się w Win3.1 dni (jeśli się nie mylę) i nie ma funkcji "CloseFile". –

Odpowiedz

14

Dzieje się tak, ponieważ tylko część funkcjonalności rejestru jest zaimplementowana w jądrze. Obejmuje podstawowe operacje (tworzenie, usuwanie, czytanie, zapisywanie itp.) Do pracy z lokalnymi kluczami rejestru.

pozostałe funkcje są realizowane w Advapi32.dll i pracy w trybie użytkownika:

  • dostępu do zdalnego rejestru używając RegConnectRegistry
  • Dostęp do HKEY_PERFORMANCE_DATA
  • Konwersja Win32 reprezentacji rejestru Native reprezentacja
  • Przekierowanie rejestru WOW64 w systemach 64-bitowych (dla aplikacji 32-bitowych)

Część funkcji jądra jest dostępna za pośrednictwem interfejsu Native API: NtCreateKey, NtOpenKey itp. Porównując te funkcje z interfejsem Win32 API, można zauważyć, że Native API używa "klasycznych" deskryptorów HANDLE zamiast HKEY.

+0

Jak już powiedziałem, powodem jest to, że niektóre funkcje rejestru są zaimplementowane w trybie użytkownika (advapi32.dll), a nie wszystkie obiekty HKEY są w rzeczywistości "prawdziwymi" uchwytami jądra. – Flot2011

+0

Przepraszam, tak, już usunąłem swój komentarz, ponieważ widziałem to w międzyczasie :) –

+0

@ Flot2011: Po prostu ciekawy, czy możesz zacytować źródło informacji? Ciężko jest znaleźć takie informacje typu "insider". – yasouser

Powiązane problemy