From 2835dc9fc9519799d931b88da76aeca0866dde0e Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 20 Dec 2007 16:59:07 +0100 Subject: [PATCH] ntdll: Increase the buffer size dynamically for relay debug lists. --- dlls/ntdll/relay.c | 100 +++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 59 deletions(-) diff --git a/dlls/ntdll/relay.c b/dlls/ntdll/relay.c index a50ec34e5e7..2f819c4a601 100644 --- a/dlls/ntdll/relay.c +++ b/dlls/ntdll/relay.c @@ -27,6 +27,8 @@ #include #include +#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 ); }