/*++ Copyright (c) 1999 Microsoft Corporation Module Name: regredir.h Abstract: This module define the APis to redirect 32bit registry calls. All 32bit wow process must use following set of wowregistry APIs to manipulate registry so that 32-bit and 64-bit registry can co exist in the same system registry. Author: ATM Shafiqul Khalid (askhalid) 15-Oct-1999 Revision History: --*/ #ifndef _REGREDIR_H_ #define _REGREDIR_H_ #if _MSC_VER > 1000 #pragma once #endif #ifdef __cplusplus extern "C" { #endif typedef CCHAR KPROCESSOR_MODE; // // Nt level registry API calls // #define REG_OPAQUE_ATTRIB_MIRROR 0x00000001 // need to see the 64 bit side #define REG_OPAQUE_ATTRIB_REAL 0x00000002 // this is real value #define DONT_CREATE_DEST_KEY 0x00000004 // Suync only if destination key exist #define SKIP_SPECIAL_CASE 0x00000008 // Skip special case #define MAX_KEY_BUFF_LEN STATIC_UNICODE_BUFFER_LENGTH*4 typedef struct { DWORD dwSignature; DWORD dwAttribute; } REG_OPAQUE_VALUE; typedef struct { POBJECT_ATTRIBUTES pObjectAddress; // pointer to the object that that has been patched using this one PUNICODE_STRING p64bitName; // pointer to the correct unicode object name HANDLE RootDirectory; // handle to the root directory in case different handle need to pass UNICODE_STRING PatchedName; // pointer to the buffer holding patched name PVOID pThis; // pointer to this object to avoid multiple free SIZE_T Len; // Length of this memory segment including buffer at the end; } PATCHED_OBJECT_ATTRIB, *PPATCHED_OBJECT_ATTRIB; BOOL IsUnderWow64 (); BOOL UpdateKeyTag ( HKEY hBase, DWORD dwAttribute ); NTSTATUS RemapNtCreateKey( OUT PHANDLE phPatchedHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG TitleIndex, IN PUNICODE_STRING Class OPTIONAL, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL ); NTSTATUS Wow64NtCreateKey( OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG TitleIndex, IN PUNICODE_STRING Class OPTIONAL, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL ); NTSTATUS Wow64NtDeleteKey( IN HANDLE KeyHandle ); NTSTATUS Wow64NtDeleteValueKey( IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName ); NTSTATUS Wow64NtEnumerateKey( IN HANDLE KeyHandle, IN ULONG Index, IN KEY_INFORMATION_CLASS KeyInformationClass, OUT PVOID KeyInformation, IN ULONG Length, OUT PULONG ResultLength ); NTSTATUS Wow64NtEnumerateValueKey( IN HANDLE KeyHandle, IN ULONG Index, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, OUT PVOID KeyValueInformation, IN ULONG Length, OUT PULONG ResultLength ); NTSTATUS Wow64NtFlushKey( IN HANDLE KeyHandle ); NTSTATUS Wow64NtInitializeRegistry( IN USHORT BootCondition ); NTSTATUS Wow64NtNotifyChangeKey( IN HANDLE KeyHandle, IN HANDLE Event OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG CompletionFilter, IN BOOLEAN WatchTree, OUT PVOID Buffer, IN ULONG BufferSize, IN BOOLEAN Asynchronous ); NTSTATUS Wow64NtNotifyChangeMultipleKeys( IN HANDLE MasterKeyHandle, IN ULONG Count, IN OBJECT_ATTRIBUTES SlaveObjects[], IN HANDLE Event OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG CompletionFilter, IN BOOLEAN WatchTree, OUT PVOID Buffer, IN ULONG BufferSize, IN BOOLEAN Asynchronous ); NTSTATUS Wow64NtLoadKey( IN POBJECT_ATTRIBUTES TargetKey, IN POBJECT_ATTRIBUTES SourceFile ); NTSTATUS Wow64NtLoadKey2( IN POBJECT_ATTRIBUTES TargetKey, IN POBJECT_ATTRIBUTES SourceFile, IN ULONG Flags ); NTSTATUS Wow64NtOpenKey( OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes ); NTSTATUS Wow64NtQueryKey( IN HANDLE KeyHandle, IN KEY_INFORMATION_CLASS KeyInformationClass, OUT PVOID KeyInformation, IN ULONG Length, OUT PULONG ResultLength ); NTSTATUS Wow64NtQueryValueKey( IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, OUT PVOID KeyValueInformation, IN ULONG Length, OUT PULONG ResultLength ); NTSTATUS Wow64NtQueryMultipleValueKey( IN HANDLE KeyHandle, IN PKEY_VALUE_ENTRY ValueEntries, IN ULONG EntryCount, OUT PVOID ValueBuffer, IN OUT PULONG BufferLength, OUT OPTIONAL PULONG RequiredBufferLength ); NTSTATUS Wow64NtReplaceKey( IN POBJECT_ATTRIBUTES NewFile, IN HANDLE TargetHandle, IN POBJECT_ATTRIBUTES OldFile ); NTSTATUS Wow64NtRestoreKey( IN HANDLE KeyHandle, IN HANDLE FileHandle, IN ULONG Flags ); NTSTATUS Wow64NtSaveKey( IN HANDLE KeyHandle, IN HANDLE FileHandle ); NTSTATUS Wow64NtSaveMergedKeys( IN HANDLE HighPrecedenceKeyHandle, IN HANDLE LowPrecedenceKeyHandle, IN HANDLE FileHandle ); NTSTATUS Wow64NtSetValueKey( IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN ULONG TitleIndex OPTIONAL, IN ULONG Type, IN PVOID Data, IN ULONG DataSize ); NTSTATUS Wow64NtUnloadKey( IN POBJECT_ATTRIBUTES TargetKey ); NTSTATUS Wow64NtSetInformationKey( IN HANDLE KeyHandle, IN KEY_SET_INFORMATION_CLASS KeySetInformationClass, IN PVOID KeySetInformation, IN ULONG KeySetInformationLength ); NTSTATUS Wow64NtClose( IN HANDLE Handle ); VOID DisplayCallParam ( char *strCallLoc, POBJECT_ATTRIBUTES ObjectAttributes ); NTSTATUS Wow64NtQueryOpenSubKeys( IN POBJECT_ATTRIBUTES TargetKey, OUT PULONG HandleCount ); BOOL IsIsnNode ( PWCHAR wStr, PWCHAR *pwStrIsn ); NTSTATUS CreatePathFromInsNode( PWCHAR wStr, PWCHAR wStrIsn ); NTSTATUS OpenIsnNodeByObjectAttributes ( POBJECT_ATTRIBUTES ObjectAttributes, ACCESS_MASK DesiredAccess, PHANDLE phPatchedHandle ); int Regwcsnicmp( const WCHAR * first, const WCHAR * last, size_t count ); BOOL SyncRegCreateKey ( HANDLE hBase, PWCHAR AbsPath, DWORD Flag ); BOOL NtSyncNode ( HANDLE hBase, PWCHAR AbsPath, BOOL bForceSync ); BOOL IsOnReflectionList ( PWCHAR Path ); BOOL NtSyncNodeOpenCreate ( IN POBJECT_ATTRIBUTES ObjectAttributes ); NTSTATUS ObjectAttributesToKeyName ( POBJECT_ATTRIBUTES ObjectAttributes, PWCHAR AbsPath, DWORD AbsPathLenIn, BOOL *bPatched, DWORD *ParentLen ); NTSTATUS Wow64NtSetSecurityObject ( IN HANDLE Handle, IN SECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor ); void CleanupReflector ( DWORD dwFlag ); PWCHAR wcsistr( PWCHAR string1, PWCHAR string2 ); #ifdef __cplusplus } #endif //__cplusplus #endif // _REGREDIR_H_