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

oldstable
Dan Kegel 2009-11-23 17:24:23 -08:00 committed by Alexandre Julliard
parent 5b4fdcc8f1
commit 0f556bf803
4 changed files with 65 additions and 1 deletions

View File

@ -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)

View File

@ -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.@)
*

View File

@ -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 )))
{

View File

@ -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*);