init.c
Upload User: caisha3
Upload Date: 2013-09-21
Package Size: 208739k
Code Size: 7k
Category:

Windows Develop

Development Platform:

Visual C++

  1. /*++
  2. Copyright (c) 1991 Microsoft Corporation
  3. Module Name:
  4.     Init.c
  5. Abstract:
  6.     This module contains the entry point for the Win32 Registry APIs
  7.     client side DLL.
  8. Author:
  9.     David J. Gilman (davegi) 06-Feb-1992
  10. --*/
  11. #include <rpc.h>
  12. #include "regrpc.h"
  13. #include "client.h"
  14. #if DBG
  15. BOOLEAN BreakPointOnEntry = FALSE;
  16. #endif
  17. BOOL LocalInitializeRegCreateKey();
  18. BOOL LocalCleanupRegCreateKey();
  19. BOOL InitializePredefinedHandlesTable();
  20. BOOL CleanupPredefinedHandlesTable();
  21. BOOL InitializeHKEYRestrictedSite();
  22. BOOL InitializeClassesRoot();
  23. BOOL CleanupClassesRoot(BOOL fOnlyThisThread);
  24. #if defined(_REGCLASS_MALLOC_INSTRUMENTED_)
  25. BOOL InitializeInstrumentedRegClassHeap();
  26. BOOL CleanupInstrumentedRegClassHeap();
  27. #endif // defined(_REGCLASS_MALLOC_INSTRUMENTED_)
  28. #if defined(LEAK_TRACK)
  29. BOOL InitializeLeakTrackTable();
  30. BOOL CleanupLeakTrackTable();
  31. #endif // defined (LEAK_TRACK)
  32. enum
  33. {
  34.     ENUM_TABLE_REMOVEKEY_CRITERIA_THISTHREAD = 1,
  35.     ENUM_TABLE_REMOVEKEY_CRITERIA_ANYTHREAD = 2
  36. };
  37. HKEY HKEY_RestrictedSite = NULL;
  38. extern BOOL gbDllHasThreadState ;
  39. BOOL
  40. RegInitialize (
  41.     IN HANDLE   Handle,
  42.     IN DWORD    Reason,
  43.     IN PVOID    Reserved
  44.     )
  45. /*++
  46. Routine Description:
  47.     Returns TRUE.
  48. Arguments:
  49.     Handle      - Unused.
  50.     Reason      - Unused.
  51.     Reserved    - Unused.
  52. Return Value:
  53.     BOOL        - Returns TRUE.
  54. --*/
  55. {
  56.     UNREFERENCED_PARAMETER( Handle );
  57.     switch( Reason ) {
  58.     case DLL_PROCESS_ATTACH:
  59. #ifndef REMOTE_NOTIFICATION_DISABLED
  60.         if( !InitializeRegNotifyChangeKeyValue( ) ||
  61.             !LocalInitializeRegCreateKey() ||
  62.             !InitializePredefinedHandlesTable() ) {
  63.             return( FALSE );
  64.         }
  65. #else
  66. #if defined(_REGCLASS_MALLOC_INSTRUMENTED_)
  67.         if ( !InitializeInstrumentedRegClassHeap()) {
  68.             return FALSE;
  69.         }
  70. #endif // defined(_REGCLASS_MALLOC_INSTRUMENTED_)
  71.         if( !LocalInitializeRegCreateKey() ||
  72.             !InitializePredefinedHandlesTable() ||
  73.             !InitializeHKEYRestrictedSite() ||
  74.             !InitializeClassesRoot()) {
  75.             return( FALSE );
  76.         }
  77. #endif 
  78. #if defined(LEAK_TRACK)
  79.         InitializeLeakTrackTable();
  80.         // ginore errors
  81. #endif // LEAK_TRACK
  82.         return( TRUE );
  83.         break;
  84.     case DLL_PROCESS_DETACH:
  85.         // Reserved == NULL when this is called via FreeLibrary,
  86.         //    we need to cleanup Performance keys.
  87.         // Reserved != NULL when this is called during process exits,
  88.         //    no need to do anything.
  89.         if( Reserved == NULL &&
  90.             !CleanupPredefinedHandles()) {
  91.             return( FALSE );
  92.         }
  93.         if (NULL != HKEY_RestrictedSite)
  94.             NtClose(HKEY_RestrictedSite);
  95. #ifndef REMOTE_NOTIFICATION_DISABLED
  96.         if( !CleanupRegNotifyChangeKeyValue( ) ||
  97.             !LocalCleanupRegCreateKey() ||
  98.             !CleanupPredefinedHandlesTable() ||
  99.             !CleanupClassesRoot( FALSE ) {
  100.             return( FALSE );
  101.         }
  102. #else
  103.         if( !LocalCleanupRegCreateKey() ||
  104.             !CleanupPredefinedHandlesTable() ||
  105.             !CleanupClassesRoot( FALSE )) {
  106.             return( FALSE );
  107.         }
  108. #if defined(LEAK_TRACK)
  109.         CleanupLeakTrackTable();
  110. #endif // LEAK_TRACK
  111. #if defined(_REGCLASS_MALLOC_INSTRUMENTED_)
  112.         if ( !CleanupInstrumentedRegClassHeap()) {
  113.             return FALSE;
  114.         }
  115. #endif // defined(_REGCLASS_MALLOC_INSTRUMENTED_)
  116. #endif
  117.         return( TRUE );
  118.         break;
  119.     case DLL_THREAD_ATTACH:
  120.         break;
  121.     case DLL_THREAD_DETACH:
  122.         if ( gbDllHasThreadState ) {
  123.             return CleanupClassesRoot( TRUE );
  124.         }
  125.         break;
  126.     }
  127.     return TRUE;
  128. }
  129. BOOL 
  130. InitializeHKEYRestrictedSite()
  131. /*++
  132. Routine Description:
  133.     If the current process has a restricted token then some registry accesses
  134.     get remapped to HKCURestrictedSites<site sid>
  135. Arguments:
  136.     None
  137. Return Value:
  138.     Return TRUE if the site key was initialized
  139. Notes:
  140.     Actually, don't fail anything.  Stuff that tries to write to the registry
  141.     won't work but everything else should be ok.
  142. --*/
  143. {
  144.     NTSTATUS        status;
  145.     UNICODE_STRING  CurrentUserPath;
  146.     WCHAR           SiteDirectoryBuffer[MAX_MANGLED_SITE];
  147.     LPWSTR          SiteDirectory = SiteDirectoryBuffer;
  148.     UNICODE_STRING  RestrictedSitesPath;
  149.     HANDLE          hToken;
  150.     PSID            sidSite;
  151.     USHORT          MaximumLength;
  152.     PVOID           pvPrevious;
  153.     OBJECT_ATTRIBUTES    attributes;
  154.     status = NtOpenProcessToken(NtCurrentProcess(), TOKEN_QUERY, &hToken);
  155.     if (STATUS_SUCCESS != status)
  156.         goto ErrorOut;
  157.     if (!IsTokenRestricted(hToken))
  158.     {
  159.         NtClose(hToken);
  160.         return TRUE;
  161.     }
  162.     sidSite = GetSiteSidFromToken(hToken);
  163.     NtClose(hToken);
  164.     if (NULL == sidSite)
  165.     {
  166.         status = STATUS_NO_MEMORY;
  167.         goto ErrorOut;
  168.     }
  169.     status = GetMangledSiteSid(sidSite, MAX_MANGLED_SITE, &SiteDirectory);
  170.     RtlFreeSid(sidSite);
  171.     if (S_OK != status)
  172.     {
  173.         status = STATUS_UNSUCCESSFUL;
  174.         goto ErrorOut;
  175.     }
  176.     ASSERT(SiteDirectory == SiteDirectoryBuffer);
  177.     status = RtlFormatCurrentUserKeyPath(&CurrentUserPath);
  178.     if (STATUS_SUCCESS == status) 
  179.     {    
  180.         MaximumLength = (USHORT) (CurrentUserPath.Length 
  181.                                   + sizeof(L"\RestrictedSites\")
  182.                                   + lstrlenW(SiteDirectory) * sizeof(WCHAR));
  183.         RestrictedSitesPath.Length        = 0;
  184.         RestrictedSitesPath.MaximumLength = MaximumLength;
  185.         RestrictedSitesPath.Buffer        = RtlAllocateHeap(
  186.                                                     RtlProcessHeap(), 
  187.                                                     0, 
  188.                                                     MaximumLength);
  189.         if (NULL != RestrictedSitesPath.Buffer)
  190.         {
  191.             RtlCopyUnicodeString(&RestrictedSitesPath, &CurrentUserPath);
  192.             RtlAppendUnicodeToString(
  193.                             &RestrictedSitesPath, 
  194.                             L"\RestrictedSites\");
  195.             RtlAppendUnicodeToString(&RestrictedSitesPath, SiteDirectory);
  196.             InitializeObjectAttributes(
  197.                     &attributes,
  198.                     &RestrictedSitesPath,
  199.                     OBJ_CASE_INSENSITIVE,
  200.                     NULL,
  201.                     NULL)
  202.             status = NtOpenKey(
  203.                             &HKEY_RestrictedSite, 
  204.                             MAXIMUM_ALLOWED, 
  205.                             &attributes);
  206.                                 
  207.             RtlFreeHeap(RtlProcessHeap(), 0, RestrictedSitesPath.Buffer);
  208.         }
  209.         else
  210.         {
  211.             status = STATUS_NO_MEMORY;
  212.         }
  213.         RtlFreeUnicodeString(&CurrentUserPath);
  214.     }
  215. ErrorOut:
  216. #if DBG
  217.     if (STATUS_SUCCESS != status)
  218.         DbgPrint("InitializeHKEYRestrictedSite failed (0x%08x)n", status);
  219. #endif
  220.     return TRUE;
  221. }