Alexandre Julliard : ntdll: Increase the buffer size dynamically for relay debug lists.
Alexandre Julliard
julliard at winehq.org
Fri Dec 21 07:28:24 CST 2007
Module: wine
Branch: master
Commit: 2835dc9fc9519799d931b88da76aeca0866dde0e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2835dc9fc9519799d931b88da76aeca0866dde0e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Dec 20 16:59:07 2007 +0100
ntdll: Increase the buffer size dynamically for relay debug lists.
---
dlls/ntdll/relay.c | 100 +++++++++++++++++++++------------------------------
1 files changed, 41 insertions(+), 59 deletions(-)
diff --git a/dlls/ntdll/relay.c b/dlls/ntdll/relay.c
index a50ec34..2f819c4 100644
--- a/dlls/ntdll/relay.c
+++ b/dlls/ntdll/relay.c
@@ -27,6 +27,8 @@
#include <stdarg.h>
#include <stdio.h>
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
#include "winternl.h"
#include "wine/exception.h"
@@ -133,6 +135,37 @@ static const WCHAR **build_list( const WCHAR *buffer )
return ret;
}
+/***********************************************************************
+ * load_list_value
+ *
+ * Load a function list from a registry value.
+ */
+static const WCHAR **load_list( HKEY hkey, const WCHAR *value )
+{
+ char initial_buffer[4096];
+ char *buffer = initial_buffer;
+ DWORD count;
+ NTSTATUS status;
+ UNICODE_STRING name;
+ const WCHAR **list = NULL;
+
+ RtlInitUnicodeString( &name, value );
+ status = NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count );
+ if (status == STATUS_BUFFER_OVERFLOW)
+ {
+ buffer = RtlAllocateHeap( GetProcessHeap(), 0, count );
+ status = NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, count, &count );
+ }
+ if (status == STATUS_SUCCESS)
+ {
+ WCHAR *str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)buffer)->Data;
+ list = build_list( str );
+ if (list) TRACE( "%s = %s\n", debugstr_w(value), debugstr_w(str) );
+ }
+
+ if (buffer != initial_buffer) RtlFreeHeap( GetProcessHeap(), 0, buffer );
+ return list;
+}
/***********************************************************************
* init_debug_lists
@@ -143,10 +176,7 @@ static void init_debug_lists(void)
{
OBJECT_ATTRIBUTES attr;
UNICODE_STRING name;
- char buffer[1024];
HANDLE root, hkey;
- DWORD count;
- WCHAR *str;
static const WCHAR configW[] = {'S','o','f','t','w','a','r','e','\\',
'W','i','n','e','\\',
'D','e','b','u','g',0};
@@ -176,62 +206,14 @@ static void init_debug_lists(void)
NtClose( root );
if (!hkey) return;
- str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)buffer)->Data;
- RtlInitUnicodeString( &name, RelayIncludeW );
- if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
- {
- TRACE("RelayInclude = %s\n", debugstr_w(str) );
- debug_relay_includelist = build_list( str );
- }
-
- RtlInitUnicodeString( &name, RelayExcludeW );
- if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
- {
- TRACE( "RelayExclude = %s\n", debugstr_w(str) );
- debug_relay_excludelist = build_list( str );
- }
-
- RtlInitUnicodeString( &name, SnoopIncludeW );
- if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
- {
- TRACE_(snoop)( "SnoopInclude = %s\n", debugstr_w(str) );
- debug_snoop_includelist = build_list( str );
- }
-
- RtlInitUnicodeString( &name, SnoopExcludeW );
- if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
- {
- TRACE_(snoop)( "SnoopExclude = %s\n", debugstr_w(str) );
- debug_snoop_excludelist = build_list( str );
- }
-
- RtlInitUnicodeString( &name, RelayFromIncludeW );
- if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
- {
- TRACE("RelayFromInclude = %s\n", debugstr_w(str) );
- debug_from_relay_includelist = build_list( str );
- }
-
- RtlInitUnicodeString( &name, RelayFromExcludeW );
- if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
- {
- TRACE( "RelayFromExclude = %s\n", debugstr_w(str) );
- debug_from_relay_excludelist = build_list( str );
- }
-
- RtlInitUnicodeString( &name, SnoopFromIncludeW );
- if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
- {
- TRACE_(snoop)("SnoopFromInclude = %s\n", debugstr_w(str) );
- debug_from_snoop_includelist = build_list( str );
- }
-
- RtlInitUnicodeString( &name, SnoopFromExcludeW );
- if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
- {
- TRACE_(snoop)( "SnoopFromExclude = %s\n", debugstr_w(str) );
- debug_from_snoop_excludelist = build_list( str );
- }
+ debug_relay_includelist = load_list( hkey, RelayIncludeW );
+ debug_relay_excludelist = load_list( hkey, RelayExcludeW );
+ debug_snoop_includelist = load_list( hkey, SnoopIncludeW );
+ debug_snoop_excludelist = load_list( hkey, SnoopExcludeW );
+ debug_from_relay_includelist = load_list( hkey, RelayFromIncludeW );
+ debug_from_relay_excludelist = load_list( hkey, RelayFromExcludeW );
+ debug_from_snoop_includelist = load_list( hkey, SnoopFromIncludeW );
+ debug_from_snoop_excludelist = load_list( hkey, SnoopFromExcludeW );
NtClose( hkey );
}
More information about the wine-cvs
mailing list