Alexandre Julliard : ntdll: Load the various PEB global options at startup.
Alexandre Julliard
julliard at winehq.org
Wed Jan 20 14:29:45 CST 2010
Module: wine
Branch: master
Commit: 39a1227cdbd4dd160b201cbb3297a3c68a4bf83b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=39a1227cdbd4dd160b201cbb3297a3c68a4bf83b
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jan 20 17:30:00 2010 +0100
ntdll: Load the various PEB global options at startup.
---
dlls/ntdll/loader.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/thread.c | 51 -----------------------------------------------
2 files changed, 55 insertions(+), 51 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index c16e0f6..1172a86 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -2552,6 +2552,59 @@ static NTSTATUS attach_process_dlls( void *wm )
/***********************************************************************
+ * load_global_options
+ */
+static void load_global_options(void)
+{
+ static const WCHAR sessionW[] = {'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 globalflagW[] = {'G','l','o','b','a','l','F','l','a','g',0};
+ static const WCHAR critsectW[] = {'C','r','i','t','i','c','a','l','S','e','c','t','i','o','n','T','i','m','e','o','u','t',0};
+ static const WCHAR heapresW[] = {'H','e','a','p','S','e','g','m','e','n','t','R','e','s','e','r','v','e',0};
+ static const WCHAR heapcommitW[] = {'H','e','a','p','S','e','g','m','e','n','t','C','o','m','m','i','t',0};
+ static const WCHAR decommittotalW[] = {'H','e','a','p','D','e','C','o','m','m','i','t','T','o','t','a','l','F','r','e','e','T','h','r','e','s','h','o','l','d',0};
+ static const WCHAR decommitfreeW[] = {'H','e','a','p','D','e','C','o','m','m','i','t','F','r','e','e','B','l','o','c','k','T','h','r','e','s','h','o','l','d',0};
+
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING name_str;
+ HANDLE hkey;
+ ULONG value;
+
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = 0;
+ attr.ObjectName = &name_str;
+ attr.Attributes = OBJ_CASE_INSENSITIVE;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+ RtlInitUnicodeString( &name_str, sessionW );
+
+ if (NtOpenKey( &hkey, KEY_QUERY_VALUE, &attr )) return;
+
+ query_dword_option( hkey, globalflagW, &NtCurrentTeb()->Peb->NtGlobalFlag );
+
+ query_dword_option( hkey, critsectW, &value );
+ NtCurrentTeb()->Peb->CriticalSectionTimeout.QuadPart = (ULONGLONG)value * -10000000;
+
+ query_dword_option( hkey, heapresW, &value );
+ NtCurrentTeb()->Peb->HeapSegmentReserve = value;
+
+ query_dword_option( hkey, heapcommitW, &value );
+ NtCurrentTeb()->Peb->HeapSegmentCommit = value;
+
+ query_dword_option( hkey, decommittotalW, &value );
+ NtCurrentTeb()->Peb->HeapDeCommitTotalFreeThreshold = value;
+
+ query_dword_option( hkey, decommitfreeW, &value );
+ NtCurrentTeb()->Peb->HeapDeCommitFreeBlockThreshold = value;
+
+ NtClose( hkey );
+}
+
+
+/***********************************************************************
* start_process
*/
static void start_process( void *kernel_start )
@@ -2799,6 +2852,8 @@ void __wine_process_init(void)
FILE_umask = umask(0777);
umask( FILE_umask );
+ load_global_options();
+
/* setup the load callback and create ntdll modref */
wine_dll_set_callback( load_builtin_callback );
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 929d443..ef9183a 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -183,54 +183,6 @@ done:
}
/***********************************************************************
- * 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
*
* Setup the initial thread.
@@ -310,9 +262,6 @@ 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 )))
{
More information about the wine-cvs
mailing list