From: Piotr Caban piotr@codeweavers.com
--- dlls/netapi32/netapi32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c index a82ef197f2a..53e9acfc7b4 100644 --- a/dlls/netapi32/netapi32.c +++ b/dlls/netapi32/netapi32.c @@ -180,6 +180,7 @@ NET_API_STATUS WINAPI NetServerGetInfo(LMSTR servername, DWORD level, LPBYTE* bu
TRACE("%s %ld %p\n", debugstr_w( servername ), level, bufptr );
+ if (!bufptr) return ERROR_INVALID_PARAMETER; if (!local) { if (samba_init()) @@ -199,7 +200,6 @@ NET_API_STATUS WINAPI NetServerGetInfo(LMSTR servername, DWORD level, LPBYTE* bu FIXME( "remote computers not supported\n" ); return ERROR_INVALID_LEVEL; } - if (!bufptr) return ERROR_INVALID_PARAMETER;
switch (level) { @@ -914,6 +914,7 @@ NET_API_STATUS WINAPI NetWkstaGetInfo( LMSTR servername, DWORD level,
TRACE("%s %ld %p\n", debugstr_w( servername ), level, bufptr );
+ if (!bufptr) return ERROR_INVALID_PARAMETER; if (!local) { if (samba_init()) @@ -933,7 +934,6 @@ NET_API_STATUS WINAPI NetWkstaGetInfo( LMSTR servername, DWORD level, FIXME( "remote computers not supported\n" ); return ERROR_INVALID_LEVEL; } - if (!bufptr) return ERROR_INVALID_PARAMETER;
switch (level) {
From: Piotr Caban piotr@codeweavers.com
--- dlls/netapi32/unixlib.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/dlls/netapi32/unixlib.c b/dlls/netapi32/unixlib.c index 4c5f1ba386e..ec89d345c37 100644 --- a/dlls/netapi32/unixlib.c +++ b/dlls/netapi32/unixlib.c @@ -991,6 +991,39 @@ C_ASSERT( ARRAYSIZE(__wine_unix_call_funcs) == unix_funcs_count );
typedef ULONG PTR32;
+struct server_info_101_32 +{ + unsigned int sv101_platform_id; + PTR32 sv101_name; + unsigned int sv101_version_major; + unsigned int sv101_version_minor; + unsigned int sv101_type; + PTR32 sv101_comment; +}; + +static NTSTATUS create_server_info32( unsigned int level, void *buffer ) +{ + switch (level) + { + case 101: + { + struct server_info_101_32 *si32 = (struct server_info_101_32 *)buffer; + struct server_info_101 *si = (struct server_info_101 *)buffer; + + si32->sv101_platform_id = si->sv101_platform_id; + si32->sv101_name = PtrToUlong( si->sv101_name ); + si32->sv101_version_major = si->sv101_version_major; + si32->sv101_version_minor = si->sv101_version_minor; + si32->sv101_type = si->sv101_type; + si32->sv101_comment = PtrToUlong( si->sv101_comment ); + return STATUS_SUCCESS; + } + default: + FIXME( "level %u not supported\n", level ); + return ERROR_NOT_SUPPORTED; + } +} + static NTSTATUS wow64_server_getinfo( void *args ) { struct @@ -1008,8 +1041,11 @@ static NTSTATUS wow64_server_getinfo( void *args ) ULongToPtr(params32->buffer), ULongToPtr(params32->size) }; + NTSTATUS status;
- return server_getinfo( ¶ms ); + status = server_getinfo( ¶ms ); + if (!status) status = create_server_info32( params.level, params.buffer ); + return status; }
static NTSTATUS wow64_share_add( void *args )
From: Piotr Caban piotr@codeweavers.com
--- dlls/netapi32/unixlib.c | 128 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 2 deletions(-)
diff --git a/dlls/netapi32/unixlib.c b/dlls/netapi32/unixlib.c index ec89d345c37..2dc34fac1a5 100644 --- a/dlls/netapi32/unixlib.c +++ b/dlls/netapi32/unixlib.c @@ -1048,6 +1048,126 @@ static NTSTATUS wow64_server_getinfo( void *args ) return status; }
+struct share_info_2_32 +{ + PTR32 shi2_netname; + unsigned int shi2_type; + PTR32 shi2_remark; + unsigned int shi2_permissions; + unsigned int shi2_max_uses; + unsigned int shi2_current_uses; + PTR32 shi2_path; + PTR32 shi2_passwd; +}; + +struct share_info +{ + union + { + struct share_info_2 si2; + struct share_info_502 si502; + }; + struct security_descriptor sd; + struct acl sacl; + struct acl dacl; +}; + +struct acl_32 +{ + enum acl_revision revision; + unsigned short size; + unsigned int num_aces; + PTR32 aces; +}; + +static void create_acl64( const struct acl_32 *acl32, struct acl *acl ) +{ + acl->revision = acl32->revision; + acl->size = acl32->size; + acl->num_aces = acl32->num_aces; + acl->aces = ULongToPtr( acl32->aces ); +} + +struct security_descriptor_32 +{ + enum security_descriptor_revision revision; + unsigned short type; + PTR32 owner_sid; + PTR32 group_sid; + PTR32 sacl; + PTR32 dacl; +}; + +static void create_security_descriptor64( const struct security_descriptor_32 *sd32, + struct share_info *si ) +{ + struct security_descriptor *sd = &si->sd; + + sd->revision = sd32->revision; + sd->type = sd32->type; + sd->owner_sid = ULongToPtr( sd32->owner_sid ); + sd->group_sid = ULongToPtr( sd32->group_sid ); + create_acl64( ULongToPtr(sd32->sacl), &si->sacl ); + sd->sacl = &si->sacl; + create_acl64( ULongToPtr(sd32->dacl), &si->dacl ); + sd->dacl = &si->dacl; +} + +struct share_info_502_32 +{ + PTR32 shi502_netname; + unsigned int shi502_type; + PTR32 shi502_remark; + unsigned int shi502_permissions; + unsigned int shi502_max_uses; + unsigned int shi502_current_uses; + PTR32 shi502_path; + PTR32 shi502_passwd; + unsigned int shi502_reserved; + PTR32 shi502_security_descriptor; +}; + +static NTSTATUS create_share_info64( unsigned int level, void *buffer, struct share_info *si ) +{ + switch (level) + { + case 2: + { + struct share_info_2_32 *si32 = buffer; + + si->si2.shi2_netname = ULongToPtr( si32->shi2_netname ); + si->si2.shi2_type = si32->shi2_type; + si->si2.shi2_remark = ULongToPtr( si32->shi2_remark ); + si->si2.shi2_permissions = si32->shi2_permissions; + si->si2.shi2_max_uses = si32->shi2_max_uses; + si->si2.shi2_current_uses = si32->shi2_current_uses; + si->si2.shi2_path = ULongToPtr( si32->shi2_path ); + si->si2.shi2_passwd = ULongToPtr( si32->shi2_passwd ); + return STATUS_SUCCESS; + } + case 502: + { + struct share_info_502_32 *si32 = buffer; + + si->si502.shi502_netname = ULongToPtr( si32->shi502_netname ); + si->si502.shi502_type = si32->shi502_type; + si->si502.shi502_remark = ULongToPtr( si32->shi502_remark ); + si->si502.shi502_permissions = si32->shi502_permissions; + si->si502.shi502_max_uses = si32->shi502_max_uses; + si->si502.shi502_current_uses = si32->shi502_current_uses; + si->si502.shi502_path = ULongToPtr( si32->shi502_path ); + si->si502.shi502_passwd = ULongToPtr( si32->shi502_passwd ); + si->si502.shi502_reserved = si32->shi502_reserved; + create_security_descriptor64( ULongToPtr(si32->shi502_security_descriptor), si ); + si->si502.shi502_security_descriptor = &si->sd; + return STATUS_SUCCESS; + } + default: + FIXME( "level %u not supported\n", level ); + return ERROR_NOT_SUPPORTED; + } +} + static NTSTATUS wow64_share_add( void *args ) { struct @@ -1058,15 +1178,19 @@ static NTSTATUS wow64_share_add( void *args ) PTR32 err; } const *params32 = args;
+ struct share_info si; struct share_add_params params = { ULongToPtr(params32->server), params32->level, - ULongToPtr(params32->info), + (BYTE *)&si, ULongToPtr(params32->err) }; + NTSTATUS status;
- return share_add( ¶ms ); + status = create_share_info64( params.level, ULongToPtr(params32->info), &si ); + if (!status) status = share_add( ¶ms ); + return status; }
static NTSTATUS wow64_share_del( void *args )
From: Piotr Caban piotr@codeweavers.com
--- dlls/netapi32/unixlib.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/netapi32/unixlib.c b/dlls/netapi32/unixlib.c index 2dc34fac1a5..469eaad6596 100644 --- a/dlls/netapi32/unixlib.c +++ b/dlls/netapi32/unixlib.c @@ -1212,6 +1212,37 @@ static NTSTATUS wow64_share_del( void *args ) return share_del( ¶ms ); }
+struct wksta_info_100_32 +{ + unsigned int wki100_platform_id; + PTR32 wki100_computername; + PTR32 wki100_langroup; + unsigned int wki100_ver_major; + unsigned int wki100_ver_minor; +}; + +static NTSTATUS create_wksta_info32( DWORD level, void *buffer ) +{ + switch (level) + { + case 100: + { + struct wksta_info_100_32 *wi32 = buffer; + struct wksta_info_100 *wi = buffer; + + wi32->wki100_platform_id = wi->wki100_platform_id; + wi32->wki100_computername = PtrToUlong( wi->wki100_computername ); + wi32->wki100_langroup = PtrToUlong( wi->wki100_langroup ); + wi32->wki100_ver_major = wi->wki100_ver_major; + wi32->wki100_ver_minor = wi->wki100_ver_minor; + return ERROR_SUCCESS; + } + default: + FIXME( "level %u not supported\n", level ); + return ERROR_NOT_SUPPORTED; + } +} + static NTSTATUS wow64_wksta_getinfo( void *args ) { struct @@ -1229,8 +1260,11 @@ static NTSTATUS wow64_wksta_getinfo( void *args ) ULongToPtr(params32->buffer), ULongToPtr(params32->size) }; + NTSTATUS status;
- return wksta_getinfo( ¶ms ); + status = wksta_getinfo( ¶ms ); + if (!status) status = create_wksta_info32( params.level, params.buffer ); + return status; }
static NTSTATUS wow64_change_password( void *args )
From: Piotr Caban piotr@codeweavers.com
--- dlls/netapi32/netapi32.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c index 53e9acfc7b4..3d490c2b519 100644 --- a/dlls/netapi32/netapi32.c +++ b/dlls/netapi32/netapi32.c @@ -190,10 +190,10 @@ NET_API_STATUS WINAPI NetServerGetInfo(LMSTR servername, DWORD level, LPBYTE* bu
for (;;) { - if (!(params.buffer = malloc( size ))) return ERROR_OUTOFMEMORY; + if ((ret = NetApiBufferAllocate( size, ¶ms.buffer ))) return ret; ret = SAMBA_CALL( server_getinfo, ¶ms ); if (!ret) *bufptr = params.buffer; - else free( params.buffer ); + else NetApiBufferFree( params.buffer ); if (ret != ERROR_INSUFFICIENT_BUFFER) return ret; } } @@ -924,10 +924,10 @@ NET_API_STATUS WINAPI NetWkstaGetInfo( LMSTR servername, DWORD level,
for (;;) { - if (!(params.buffer = malloc( size ))) return ERROR_OUTOFMEMORY; + if ((ret = NetApiBufferAllocate( size, ¶ms.buffer ))) return ret; ret = SAMBA_CALL( wksta_getinfo, ¶ms ); if (!ret) *bufptr = params.buffer; - else free( params.buffer ); + else NetApiBufferFree( params.buffer ); if (ret != ERROR_INSUFFICIENT_BUFFER) return ret; } }