https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0399644a4907f3f515659f...
commit 0399644a4907f3f515659fa10f3c0030690c2268 Author: Amine Khaldi amine.khaldi@reactos.org AuthorDate: Fri Jan 25 13:06:19 2019 +0100 Commit: Amine Khaldi amine.khaldi@reactos.org CommitDate: Fri Jan 25 13:06:19 2019 +0100
[WMIC] Sync with Wine Staging 4.0. CORE-15682 --- base/applications/cmdutils/wmic/main.c | 104 ++++++++++++++++++++------------- media/doc/README.WINE | 2 +- 2 files changed, 64 insertions(+), 42 deletions(-)
diff --git a/base/applications/cmdutils/wmic/main.c b/base/applications/cmdutils/wmic/main.c index f4a5bc74f1..5d500453cb 100644 --- a/base/applications/cmdutils/wmic/main.c +++ b/base/applications/cmdutils/wmic/main.c @@ -121,45 +121,55 @@ static WCHAR *find_prop( IWbemClassObject *class, const WCHAR *prop ) return ret; }
-static int output_string( const WCHAR *msg, ... ) +static int output_string( HANDLE handle, const WCHAR *msg, ... ) { va_list va_args; - int wlen; - DWORD count, ret; + int len; + DWORD count; WCHAR buffer[8192];
va_start( va_args, msg ); - vsprintfW( buffer, msg, va_args ); + len = vsnprintfW( buffer, ARRAY_SIZE(buffer), msg, va_args ); va_end( va_args );
- wlen = strlenW( buffer ); - ret = WriteConsoleW( GetStdHandle(STD_OUTPUT_HANDLE), buffer, wlen, &count, NULL ); - if (!ret) - { - DWORD len; - char *msgA; - - /* On Windows WriteConsoleW() fails if the output is redirected. So fall - * back to WriteFile(), assuming the console encoding is still the right - * one in that case. - */ - len = WideCharToMultiByte( GetConsoleOutputCP(), 0, buffer, wlen, NULL, 0, NULL, NULL ); - if (!(msgA = HeapAlloc( GetProcessHeap(), 0, len * sizeof(char) ))) return 0; - - WideCharToMultiByte( GetConsoleOutputCP(), 0, buffer, wlen, msgA, len, NULL, NULL ); - WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE ); - HeapFree( GetProcessHeap(), 0, msgA ); - } + if (!WriteConsoleW( handle, buffer, len, &count, NULL )) + WriteFile( handle, buffer, len * sizeof(WCHAR), &count, FALSE ); + return count; }
-static int output_message( int msg ) +static int output_error( int msg ) { static const WCHAR fmtW[] = {'%','s',0}; WCHAR buffer[8192];
LoadStringW( GetModuleHandleW(NULL), msg, buffer, ARRAY_SIZE(buffer)); - return output_string( fmtW, buffer ); + return output_string( GetStdHandle(STD_ERROR_HANDLE), fmtW, buffer ); +} + +static int output_header( const WCHAR *prop, ULONG column_width ) +{ + static const WCHAR bomW[] = {0xfeff}, fmtW[] = {'%','-','*','s','\r','\n',0}; + int len; + DWORD count; + WCHAR buffer[8192]; + + len = snprintfW( buffer, ARRAY_SIZE(buffer), fmtW, column_width, prop ); + + if (!WriteConsoleW( GetStdHandle(STD_OUTPUT_HANDLE), buffer, len, &count, NULL )) /* redirected */ + { + WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), bomW, sizeof(bomW), &count, FALSE ); + WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), buffer, len * sizeof(WCHAR), &count, FALSE ); + count += sizeof(bomW); + } + + return count; +} + +static int output_line( const WCHAR *str, ULONG column_width ) +{ + static const WCHAR fmtW[] = {'%','-','*','s','\r','\n',0}; + return output_string( GetStdHandle(STD_OUTPUT_HANDLE), fmtW, column_width, str ); }
static int query_prop( const WCHAR *class, const WCHAR *propname ) @@ -167,8 +177,6 @@ static int query_prop( const WCHAR *class, const WCHAR *propname ) static const WCHAR select_allW[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0}; static const WCHAR cimv2W[] = {'R','O','O','T','\','C','I','M','V','2',0}; static const WCHAR wqlW[] = {'W','Q','L',0}; - static const WCHAR newlineW[] = {'\n',0}; - static const WCHAR fmtW[] = {'%','s','\n',0}; HRESULT hr; IWbemLocator *locator = NULL; IWbemServices *services = NULL; @@ -178,6 +186,9 @@ static int query_prop( const WCHAR *class, const WCHAR *propname ) WCHAR *prop = NULL; BOOL first = TRUE; int len, ret = -1; + IWbemClassObject *obj; + ULONG count, width = 0; + VARIANT v;
WINE_TRACE("%s, %s\n", debugstr_w(class), debugstr_w(propname));
@@ -202,34 +213,45 @@ static int query_prop( const WCHAR *class, const WCHAR *propname ) hr = IWbemServices_ExecQuery( services, wql, query, flags, NULL, &result ); if (hr != S_OK) goto done;
- for (;;) + for (;;) /* get column width */ { - IWbemClassObject *obj; - ULONG count; - VARIANT v; + IEnumWbemClassObject_Next( result, WBEM_INFINITE, 1, &obj, &count ); + if (!count) break;
+ if (!prop && !(prop = find_prop( obj, propname ))) + { + output_error( STRING_INVALID_QUERY ); + goto done; + } + if (IWbemClassObject_Get( obj, prop, 0, &v, NULL, NULL ) == WBEM_S_NO_ERROR) + { + VariantChangeType( &v, &v, 0, VT_BSTR ); + width = max( strlenW( V_BSTR( &v ) ), width ); + VariantClear( &v ); + } + IWbemClassObject_Release( obj ); + } + width += 2; + + IEnumWbemClassObject_Reset( result ); + for (;;) + { IEnumWbemClassObject_Next( result, WBEM_INFINITE, 1, &obj, &count ); if (!count) break;
if (first) { - if (!(prop = find_prop( obj, propname ))) - { - output_message( STRING_INVALID_QUERY ); - goto done; - } - output_string( fmtW, prop ); + output_header( prop, width ); first = FALSE; } if (IWbemClassObject_Get( obj, prop, 0, &v, NULL, NULL ) == WBEM_S_NO_ERROR) { VariantChangeType( &v, &v, 0, VT_BSTR ); - output_string( fmtW, V_BSTR( &v ) ); + output_line( V_BSTR( &v ), width ); VariantClear( &v ); } IWbemClassObject_Release( obj ); } - output_string( newlineW ); ret = 0;
done: @@ -278,7 +300,7 @@ int wmain(int argc, WCHAR *argv[]) { if (++i >= argc) { - output_message( STRING_INVALID_PATH ); + output_error( STRING_INVALID_PATH ); return 1; } class = argv[i]; @@ -288,7 +310,7 @@ int wmain(int argc, WCHAR *argv[]) class = find_class( argv[i] ); if (!class) { - output_message( STRING_ALIAS_NOT_FOUND ); + output_error( STRING_ALIAS_NOT_FOUND ); return 1; } } @@ -305,6 +327,6 @@ int wmain(int argc, WCHAR *argv[]) }
not_supported: - output_message( STRING_CMDLINE_NOT_SUPPORTED ); + output_error( STRING_CMDLINE_NOT_SUPPORTED ); return 1; } diff --git a/media/doc/README.WINE b/media/doc/README.WINE index 4b31162daa..264b235946 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -231,7 +231,7 @@ reactos/base/applications/cmdutils/cscript # Synced to WineStaging-3.17 reactos/base/applications/cmdutils/reg # Synced to WineStaging-3.17 reactos/base/applications/cmdutils/schtasks # Synced to WineStaging-3.3 reactos/base/applications/cmdutils/taskkill # Synced to WineStaging-3.17 -reactos/base/applications/cmdutils/wmic # Synced to WineStaging-3.17 +reactos/base/applications/cmdutils/wmic # Synced to WineStaging-4.0 reactos/base/applications/cmdutils/wscript # Synced to WineStaging-3.17 reactos/base/applications/cmdutils/xcopy # Synced to WineStaging-3.17 reactos/base/applications/games/winmine # Synced to WineStaging-2.16 with our own resources.