Huw Davies : nsi: Implement NsiEnumerateObjectsAllParameterEx().
Alexandre Julliard
julliard at winehq.org
Tue Jun 29 15:58:27 CDT 2021
Module: wine
Branch: master
Commit: bc4db065c06764e0488e965134283131200bc33b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=bc4db065c06764e0488e965134283131200bc33b
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Jun 29 08:04:22 2021 +0100
nsi: Implement NsiEnumerateObjectsAllParameterEx().
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/nsi/nsi.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 53 insertions(+), 2 deletions(-)
diff --git a/dlls/nsi/nsi.c b/dlls/nsi/nsi.c
index d3292af9ee3..981fcdba954 100644
--- a/dlls/nsi/nsi.c
+++ b/dlls/nsi/nsi.c
@@ -25,10 +25,16 @@
#include "iptypes.h"
#include "netiodef.h"
#include "wine/nsi.h"
+#include "wine/heap.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(nsi);
+static inline HANDLE get_nsi_device( void )
+{
+ return CreateFileW( L"\\\\.\\Nsi", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
+}
+
DWORD WINAPI NsiAllocateAndGetTable( DWORD unk, const NPI_MODULEID *module, DWORD table, void **key_data, DWORD key_size,
void **rw_data, DWORD rw_size, void **dynamic_data, DWORD dynamic_size,
void **static_data, DWORD static_size, DWORD *count, DWORD unk2 )
@@ -46,7 +52,7 @@ DWORD WINAPI NsiEnumerateObjectsAllParameters( DWORD unk, DWORD unk2, const NPI_
struct nsi_enumerate_all_ex params;
DWORD err;
- FIXME( "%d %d %p %d %p %d %p %d %p %d %p %d %p: stub\n", unk, unk2, module, table, key_data, key_size,
+ TRACE( "%d %d %p %d %p %d %p %d %p %d %p %d %p\n", unk, unk2, module, table, key_data, key_size,
rw_data, rw_size, dynamic_data, dynamic_size, static_data, static_size, count );
params.unknown[0] = 0;
@@ -72,7 +78,52 @@ DWORD WINAPI NsiEnumerateObjectsAllParameters( DWORD unk, DWORD unk2, const NPI_
DWORD WINAPI NsiEnumerateObjectsAllParametersEx( struct nsi_enumerate_all_ex *params )
{
- return ERROR_CALL_NOT_IMPLEMENTED;
+ DWORD out_size, received, err = ERROR_SUCCESS;
+ HANDLE device = get_nsi_device();
+ struct nsiproxy_enumerate_all in;
+ BYTE *out, *ptr;
+
+ if (device == INVALID_HANDLE_VALUE) return GetLastError();
+
+ out_size = sizeof(DWORD) +
+ (params->key_size + params->rw_size + params->dynamic_size + params->static_size) * params->count;
+
+ out = heap_alloc( out_size );
+ if (!out)
+ {
+ CloseHandle( device );
+ return ERROR_OUTOFMEMORY;
+ }
+
+ in.module = *params->module;
+ in.first_arg = params->first_arg;
+ in.second_arg = params->second_arg;
+ in.table = params->table;
+ in.key_size = params->key_size;
+ in.rw_size = params->rw_size;
+ in.dynamic_size = params->dynamic_size;
+ in.static_size = params->static_size;
+ in.count = params->count;
+
+ if (!DeviceIoControl( device, IOCTL_NSIPROXY_WINE_ENUMERATE_ALL, &in, sizeof(in), out, out_size, &received, NULL ))
+ err = GetLastError();
+ if (err == ERROR_SUCCESS || err == ERROR_MORE_DATA)
+ {
+ params->count = *(DWORD *)out;
+ ptr = out + sizeof(DWORD);
+ if (params->key_size) memcpy( params->key_data, ptr, params->key_size * params->count );
+ ptr += params->key_size * in.count;
+ if (params->rw_size) memcpy( params->rw_data, ptr, params->rw_size * params->count );
+ ptr += params->rw_size * in.count;
+ if (params->dynamic_size) memcpy( params->dynamic_data, ptr, params->dynamic_size * params->count );
+ ptr += params->dynamic_size * in.count;
+ if (params->static_size) memcpy( params->static_data, ptr, params->static_size * params->count );
+ }
+
+ heap_free( out );
+ CloseHandle( device );
+
+ return err;
}
void WINAPI NsiFreeTable( void *key_data, void *rw_data, void *dynamic_data, void *static_data )
More information about the wine-cvs
mailing list