]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/Sec/SecMain.c
Fix the return value bug when updating public key database variable failure.
[mirror_edk2.git] / Nt32Pkg / Sec / SecMain.c
index ce00812936ab03c9b684e12c9c3837b9fa40a1f6..602cca9b1bfed9b6ca8f5dcc0b16ab4388ecda24 100644 (file)
@@ -1,6 +1,6 @@
 /**@file\r
 \r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -30,7 +30,9 @@ Abstract:
 \r
 #include "SecMain.h"\r
 \r
-\r
+#ifndef SE_TIME_ZONE_NAME\r
+#define SE_TIME_ZONE_NAME                 TEXT("SeTimeZonePrivilege")\r
+#endif\r
 \r
 NT_PEI_LOAD_FILE_PPI                      mSecNtLoadFilePpi     = { SecWinNtPeiLoadFile };\r
 \r
@@ -107,6 +109,16 @@ SecNt32PeCoffRelocateImage (
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext\r
   );\r
 \r
+VOID\r
+EFIAPI\r
+PeiSwitchStacks (\r
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *Context3,  OPTIONAL\r
+  IN      VOID                      *NewStack\r
+  );\r
+\r
 VOID\r
 SecPrint (\r
   CHAR8  *Format,\r
@@ -121,11 +133,13 @@ SecPrint (
   \r
   _vsnprintf (Buffer, sizeof (Buffer), Format, Marker);\r
 \r
+  va_end (Marker);\r
+\r
   CharCount = strlen (Buffer);\r
   WriteFile (\r
     GetStdHandle (STD_OUTPUT_HANDLE), \r
     Buffer,\r
-    CharCount,\r
+    (DWORD)CharCount,\r
     (LPDWORD)&CharCount,\r
     NULL\r
     );\r
@@ -155,6 +169,8 @@ Returns:
 --*/\r
 {\r
   EFI_STATUS            Status;\r
+  HANDLE                Token;\r
+  TOKEN_PRIVILEGES      TokenPrivileges;\r
   EFI_PHYSICAL_ADDRESS  InitialStackMemory;\r
   UINT64                InitialStackMemorySize;\r
   UINTN                 Index;\r
@@ -168,6 +184,16 @@ Returns:
   CHAR16                *FirmwareVolumesStr;\r
   UINTN                 *StackPointer;\r
 \r
+  //\r
+  // Enable the privilege so that RTC driver can successfully run SetTime()\r
+  //\r
+  OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &Token);\r
+  if (LookupPrivilegeValue(NULL, SE_TIME_ZONE_NAME, &TokenPrivileges.Privileges[0].Luid)) {\r
+    TokenPrivileges.PrivilegeCount = 1;\r
+    TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\r
+    AdjustTokenPrivileges(Token, FALSE, &TokenPrivileges, 0, (PTOKEN_PRIVILEGES) NULL, 0);\r
+  }\r
+\r
   MemorySizeStr      = (CHAR16 *) PcdGetPtr (PcdWinNtMemorySizeForSecMain);\r
   FirmwareVolumesStr = (CHAR16 *) PcdGetPtr (PcdWinNtFirmwareVolume);\r
 \r
@@ -362,7 +388,7 @@ Returns:
   //\r
   NtFileHandle = CreateFile (\r
                   FileName,\r
-                  GENERIC_READ | GENERIC_WRITE,\r
+                  GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE,\r
                   FILE_SHARE_READ,\r
                   NULL,\r
                   CreationDisposition,\r
@@ -378,7 +404,7 @@ Returns:
   NtMapHandle = CreateFileMapping (\r
                   NtFileHandle,\r
                   NULL,\r
-                  PAGE_READWRITE,\r
+                  PAGE_EXECUTE_READWRITE,\r
                   0,\r
                   MapSize,\r
                   NULL\r
@@ -391,7 +417,7 @@ Returns:
   //\r
   VirtualAddress = MapViewOfFileEx (\r
                     NtMapHandle,\r
-                    FILE_MAP_ALL_ACCESS,\r
+                    FILE_MAP_EXECUTE | FILE_MAP_ALL_ACCESS,\r
                     0,\r
                     0,\r
                     MapSize,\r
@@ -489,6 +515,7 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+#if defined (MDE_CPU_IA32)\r
 /**\r
   Transfers control to a function starting with a new stack.\r
 \r
@@ -546,6 +573,7 @@ PeiSwitchStacks (
   //\r
   ASSERT (FALSE);  \r
 }\r
+#endif\r
 \r
 VOID\r
 SecLoadFromCore (\r