[PATCH v2 2/2] wbemprox: Get the disk drive serial number from mountmgr.
Zebediah Figura
z.figura12 at gmail.com
Mon May 25 10:02:22 CDT 2020
On 5/25/20 8:46 AM, Hans Leidekker wrote:
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49160
> Signed-off-by: Hans Leidekker <hans at codeweavers.com>
> ---
> dlls/wbemprox/builtin.c | 41 +++++++++++++++++++++++++++++++++++--
> dlls/wbemprox/tests/query.c | 26 +++++++++++++++++++++++
> 2 files changed, 65 insertions(+), 2 deletions(-)
>
> diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
> index ddd12d6ebc..eaadcc5804 100644
> --- a/dlls/wbemprox/builtin.c
> +++ b/dlls/wbemprox/builtin.c
> @@ -44,6 +44,7 @@
> #include "ntsecapi.h"
> #include "winspool.h"
> #include "setupapi.h"
> +#include "ntddstor.h"
>
> #include "wine/asm.h"
> #include "wine/debug.h"
> @@ -140,7 +141,7 @@ static const struct column col_diskdrive[] =
> { L"MediaType", CIM_STRING },
> { L"Model", CIM_STRING },
> { L"PNPDeviceID", CIM_STRING },
> - { L"SerialNumber", CIM_STRING },
> + { L"SerialNumber", CIM_STRING|COL_FLAG_DYNAMIC },
> { L"Size", CIM_UINT64 },
> };
> static const struct column col_diskdrivetodiskpartition[] =
> @@ -2081,6 +2082,42 @@ static UINT64 get_freespace( const WCHAR *dir, UINT64 *disksize )
> }
> return free.QuadPart;
> }
> +static WCHAR *get_diskdrive_serialnumber( WCHAR letter )
> +{
> + WCHAR *ret = NULL;
> + STORAGE_DEVICE_DESCRIPTOR *desc;
> + HANDLE handle = INVALID_HANDLE_VALUE;
> + STORAGE_PROPERTY_QUERY query = {0};
> + WCHAR drive[7];
> + DWORD size;
> +
> + swprintf( drive, ARRAY_SIZE(drive), L"\\\\.\\%c:", letter );
> + handle = CreateFileW( drive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 );
You shouldn't need read permissions to open the file;
IOCTL_STORAGE_QUERY_PROPERTY has FILE_ANY_ACCESS permissions.
> + if (handle == INVALID_HANDLE_VALUE) goto done;
> +
> + query.PropertyId = StorageDeviceProperty;
> + query.QueryType = PropertyStandardQuery;
> +
> + size = sizeof(*desc) + 256;
> + for (;;)
> + {
> + if (!(desc = heap_alloc( size ))) break;
> + if (DeviceIoControl( handle, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), desc, size, NULL, NULL ))
> + {
> + if (desc->SerialNumberOffset) ret = heap_strdupAW( (const char *)desc + desc->SerialNumberOffset );
> + heap_free( desc );
> + break;
> + }
> + heap_free( desc );
> + if (GetLastError() == ERROR_MORE_DATA) size = desc->Size;
> + else break;
> + }
> +
> +done:
> + if (handle != INVALID_HANDLE_VALUE) CloseHandle( handle );
> + if (!ret) ret = heap_strdupW( L"WINEHDISK" );
> + return ret;
> +}
>
> static enum fill_status fill_diskdrive( struct table *table, const struct expr *cond )
> {
> @@ -2114,7 +2151,7 @@ static enum fill_status fill_diskdrive( struct table *table, const struct expr *
> rec->mediatype = (type == DRIVE_FIXED) ? L"Fixed hard disk" : L"Removable media";
> rec->model = L"Wine Disk Drive";
> rec->pnpdevice_id = L"IDE\\Disk\\VEN_WINE";
> - rec->serialnumber = L"WINEHDISK";
> + rec->serialnumber = get_diskdrive_serialnumber( root[0] );
> get_freespace( root, &size );
> rec->size = size;
> if (!match_row( table, row, cond, &status ))
> diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c
> index a9b4910ebf..578e9308df 100644
> --- a/dlls/wbemprox/tests/query.c
> +++ b/dlls/wbemprox/tests/query.c
> @@ -1456,6 +1456,31 @@ static void test_Win32_DesktopMonitor( IWbemServices *services )
> SysFreeString( wql );
> }
>
> +static void test_Win32_DiskDrive( IWbemServices *services )
> +{
> + BSTR wql = SysAllocString( L"wql" ), query = SysAllocString( L"SELECT * FROM Win32_DiskDrive" );
> + IEnumWbemClassObject *result;
> + IWbemClassObject *obj;
> + HRESULT hr;
> + DWORD count;
> +
> + hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
> + ok( hr == S_OK, "got %08x\n", hr );
> +
> + for (;;)
> + {
> + hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
> + if (hr != S_OK) break;
> +
> + check_property( obj, L"DeviceID", VT_BSTR, CIM_STRING );
> + IWbemClassObject_Release( obj );
> + }
> +
> + IEnumWbemClassObject_Release( result );
> + SysFreeString( query );
> + SysFreeString( wql );
> +}
> +
> static void test_Win32_DisplayControllerConfiguration( IWbemServices *services )
> {
> BSTR wql = SysAllocString( L"wql" );
> @@ -1561,6 +1586,7 @@ START_TEST(query)
> test_Win32_ComputerSystemProduct( services );
> test_Win32_Bios( services );
> test_Win32_DesktopMonitor( services );
> + test_Win32_DiskDrive( services );
> test_Win32_DisplayControllerConfiguration( services );
> test_Win32_IP4RouteTable( services );
> test_Win32_OperatingSystem( services );
>
More information about the wine-devel
mailing list