Dan Kegel : ntdll: Implement RtlGetNtGlobalFlags(), add related defines to winternl.h.

Alexandre Julliard julliard at winehq.org
Mon Nov 30 10:42:51 CST 2009


Module: wine
Branch: master
Commit: 0f556bf8032add24d1bf5940bf477544366ea66e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0f556bf8032add24d1bf5940bf477544366ea66e

Author: Dan Kegel <dank at kegel.com>
Date:   Mon Nov 23 17:24:23 2009 -0800

ntdll: Implement RtlGetNtGlobalFlags(), add related defines to winternl.h.

---

 dlls/ntdll/ntdll.spec |    2 +-
 dlls/ntdll/process.c  |    9 ++++++++
 dlls/ntdll/thread.c   |   50 +++++++++++++++++++++++++++++++++++++++++++++++++
 include/winternl.h    |    5 ++++
 4 files changed, 65 insertions(+), 1 deletions(-)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 382feb3..e7f298d 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -632,7 +632,7 @@
 @ stdcall RtlGetLongestNtPathLength()
 # @ stub RtlGetNativeSystemInformation
 # @ stub RtlGetNextRange
-@ stub RtlGetNtGlobalFlags
+@ stdcall RtlGetNtGlobalFlags()
 @ stdcall RtlGetNtProductType(ptr)
 @ stdcall RtlGetNtVersionNumbers(ptr ptr ptr)
 @ stdcall RtlGetOwnerSecurityDescriptor(ptr ptr ptr)
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index ba51df5..aaf8315 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -73,6 +73,15 @@ PEB * WINAPI RtlGetCurrentPeb(void)
     return NtCurrentTeb()->Peb;
 }
 
+/******************************************************************************
+ *  RtlGetNtGlobalFlags  [NTDLL.@]
+ *
+ */
+ULONG WINAPI RtlGetNtGlobalFlags(void)
+{
+    return NtCurrentTeb()->Peb->NtGlobalFlag;
+}
+
 /***********************************************************************
  *           __wine_make_process_system   (NTDLL.@)
  *
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index b9529bd..c370651 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -216,6 +216,53 @@ done:
     return status;
 }
 
+/***********************************************************************
+ *           get_global_flag
+ *
+ * This is called before the process heap is created,
+ * but after the connection to the server is established.
+ * No windows heap allocation is permitted.
+ */
+static DWORD get_global_flag(void)
+{
+    static const WCHAR sessionman_keyW[] = {'M','a','c','h','i','n','e','\\',
+                                            'S','y','s','t','e','m','\\',
+                                            'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+                                            'C','o','n','t','r','o','l','\\',
+                                            'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r',0};
+    static const WCHAR global_flagW[] = {'G','l','o','b','a','l','F','l','a','g',0};
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW, valueW;
+    HANDLE hkey;
+    char tmp[32];
+    DWORD count;
+    KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)tmp;
+    NTSTATUS status;
+
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+    RtlInitUnicodeString( &nameW, sessionman_keyW );
+
+    status = NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr );
+    if (status != STATUS_SUCCESS)
+        return 0;
+
+    RtlInitUnicodeString( &valueW, global_flagW );
+    status = NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp)-1, &count );
+    if (status != STATUS_SUCCESS)
+        return 0;
+
+    /* Some documents say this can be a string, so handle either type */
+    if (info->Type == REG_DWORD)
+        return *(DWORD *)info->Data;
+    if (info->Type == REG_SZ)
+        return strtol((char *)info->Data, NULL, 16);
+    return 0;
+}
 
 /***********************************************************************
  *           thread_init
@@ -297,6 +344,9 @@ HANDLE thread_init(void)
     server_init_process();
     info_size = server_init_thread( peb );
 
+    /* retrieve the global flags settings from the registry */
+    peb->NtGlobalFlag = get_global_flag();
+
     /* create the process heap */
     if (!(peb->ProcessHeap = RtlCreateHeap( HEAP_GROWABLE, NULL, 0, 0, NULL, NULL )))
     {
diff --git a/include/winternl.h b/include/winternl.h
index 6f21ad0..9625d88 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1732,6 +1732,10 @@ typedef void (NTAPI *RTL_WAITORTIMERCALLBACKFUNC)(PVOID,BOOLEAN); /* FIXME: not
 #define SE_CREATE_GLOBAL_PRIVILEGE       30L
 #define SE_MAX_WELL_KNOWN_PRIVILEGE      SE_CREATE_GLOBAL_PRIVILEGE
 
+/* NtGlobalFlag bits */
+#define FLG_HEAP_ENABLE_TAIL_CHECK       0x00000010
+#define FLG_HEAP_ENABLE_FREE_CHECK       0x00000020
+#define FLG_HEAP_DISABLE_COALESCING      0x00200000
 
 /* Rtl*Registry* functions structs and defines */
 #define RTL_REGISTRY_ABSOLUTE             0
@@ -2404,6 +2408,7 @@ NTSYSAPI NTSTATUS  WINAPI RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR,PSI
 NTSYSAPI NTSTATUS  WINAPI RtlGetLastNtStatus(void);
 NTSYSAPI DWORD     WINAPI RtlGetLastWin32Error(void);
 NTSYSAPI DWORD     WINAPI RtlGetLongestNtPathLength(void);
+NTSYSAPI ULONG     WINAPI RtlGetNtGlobalFlags(void);
 NTSYSAPI BOOLEAN   WINAPI RtlGetNtProductType(LPDWORD);
 NTSYSAPI NTSTATUS  WINAPI RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID *,PBOOLEAN);
 NTSYSAPI ULONG     WINAPI RtlGetProcessHeaps(ULONG,HANDLE*);




More information about the wine-cvs mailing list