Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/netio.sys/Makefile.in | 2 +- dlls/netio.sys/netio.c | 120 ++++++++++++++++++++++++++++++++++++- 2 files changed, 118 insertions(+), 4 deletions(-)
diff --git a/dlls/netio.sys/Makefile.in b/dlls/netio.sys/Makefile.in index 76e541021a6..2db691540df 100644 --- a/dlls/netio.sys/Makefile.in +++ b/dlls/netio.sys/Makefile.in @@ -1,6 +1,6 @@ MODULE = netio.sys IMPORTLIB = netio -IMPORTS = ntoskrnl +IMPORTS = ntoskrnl ws2_32 EXTRADLLFLAGS = -mno-cygwin -Wl,--subsystem,native
C_SRCS = \ diff --git a/dlls/netio.sys/netio.c b/dlls/netio.sys/netio.c index fac91736ab1..cbbf8c06118 100644 --- a/dlls/netio.sys/netio.c +++ b/dlls/netio.sys/netio.c @@ -31,6 +31,8 @@ #include "ddk/wdm.h" #include "ddk/wsk.h" #include "wine/debug.h" +#include "winsock2.h" +#include "ws2tcpip.h"
#include "wine/heap.h"
@@ -42,6 +44,54 @@ struct _WSK_CLIENT WSK_CLIENT_NPI *client_npi; };
+static NTSTATUS sock_error_to_ntstatus(DWORD err) +{ + switch (err) + { + case 0: return STATUS_SUCCESS; + case WSAEBADF: return STATUS_INVALID_HANDLE; + case WSAEACCES: return STATUS_ACCESS_DENIED; + case WSAEFAULT: return STATUS_NO_MEMORY; + case WSAEINVAL: return STATUS_INVALID_PARAMETER; + case WSAEMFILE: return STATUS_TOO_MANY_OPENED_FILES; + case WSAEWOULDBLOCK: return STATUS_CANT_WAIT; + case WSAEINPROGRESS: return STATUS_PENDING; + case WSAEALREADY: return STATUS_NETWORK_BUSY; + case WSAENOTSOCK: return STATUS_OBJECT_TYPE_MISMATCH; + case WSAEDESTADDRREQ: return STATUS_INVALID_PARAMETER; + case WSAEMSGSIZE: return STATUS_BUFFER_OVERFLOW; + case WSAEPROTONOSUPPORT: + case WSAESOCKTNOSUPPORT: + case WSAEPFNOSUPPORT: + case WSAEAFNOSUPPORT: + case WSAEPROTOTYPE: return STATUS_NOT_SUPPORTED; + case WSAENOPROTOOPT: return STATUS_INVALID_PARAMETER; + case WSAEOPNOTSUPP: return STATUS_NOT_SUPPORTED; + case WSAEADDRINUSE: return STATUS_ADDRESS_ALREADY_ASSOCIATED; + case WSAEADDRNOTAVAIL: return STATUS_INVALID_PARAMETER; + case WSAECONNREFUSED: return STATUS_CONNECTION_REFUSED; + case WSAESHUTDOWN: return STATUS_PIPE_DISCONNECTED; + case WSAENOTCONN: return STATUS_CONNECTION_DISCONNECTED; + case WSAETIMEDOUT: return STATUS_IO_TIMEOUT; + case WSAENETUNREACH: return STATUS_NETWORK_UNREACHABLE; + case WSAENETDOWN: return STATUS_NETWORK_BUSY; + case WSAECONNRESET: return STATUS_CONNECTION_RESET; + case WSAECONNABORTED: return STATUS_CONNECTION_ABORTED; + case WSAHOST_NOT_FOUND: return STATUS_NOT_FOUND; + default: + FIXME("Unmapped error %u.\n", err); + return STATUS_UNSUCCESSFUL; + } +} + +static void dispatch_irp(IRP *irp, NTSTATUS status) +{ + irp->IoStatus.u.Status = status; + --irp->CurrentLocation; + --irp->Tail.Overlay.s.u2.CurrentStackLocation; + IoCompleteRequest(irp, IO_NO_INCREMENT); +} + static NTSTATUS WINAPI wsk_socket(WSK_CLIENT *client, ADDRESS_FAMILY address_family, USHORT socket_type, ULONG protocol, ULONG Flags, void *socket_context, const void *dispatch, PEPROCESS owning_process, PETHREAD owning_thread, SECURITY_DESCRIPTOR *security_descriptor, IRP *irp) @@ -81,16 +131,74 @@ static NTSTATUS WINAPI wsk_control_client(WSK_CLIENT *client, ULONG control_code return STATUS_NOT_IMPLEMENTED; }
+struct wsk_get_address_info_context +{ + UNICODE_STRING *node_name; + UNICODE_STRING *service_name; + ULONG namespace; + GUID *provider; + ADDRINFOEXW *hints; + ADDRINFOEXW **result; + IRP *irp; +}; + +static void WINAPI get_address_info_callback(TP_CALLBACK_INSTANCE *instance, void *context_) +{ + struct wsk_get_address_info_context *context = context_; + INT ret; + + TRACE("instance %p, context %p.\n", instance, context); + + ret = GetAddrInfoExW( context->node_name ? context->node_name->Buffer : NULL, + context->service_name ? context->service_name->Buffer : NULL, context->namespace, + context->provider, context->hints, context->result, NULL, NULL, NULL, NULL); + + context->irp->IoStatus.Information = 0; + dispatch_irp(context->irp, sock_error_to_ntstatus(ret)); + heap_free(context); +} + static NTSTATUS WINAPI wsk_get_address_info(WSK_CLIENT *client, UNICODE_STRING *node_name, UNICODE_STRING *service_name, ULONG name_space, GUID *provider, ADDRINFOEXW *hints, ADDRINFOEXW **result, PEPROCESS owning_process, PETHREAD owning_thread, IRP *irp) { - FIXME("client %p, node_name %p, service_name %p, name_space %#x, provider %p, hints %p, " - "result %p, owning_process %p, owning_thread %p, irp %p stub.\n", + struct wsk_get_address_info_context *context; + NTSTATUS status; + + TRACE("client %p, node_name %p, service_name %p, name_space %#x, provider %p, hints %p, " + "result %p, owning_process %p, owning_thread %p, irp %p.\n", client, node_name, service_name, name_space, provider, hints, result, owning_process, owning_thread, irp);
- return STATUS_NOT_IMPLEMENTED; + if (!irp) + return STATUS_INVALID_PARAMETER; + + if (!(context = heap_alloc(sizeof(*context)))) + { + ERR("No memory.\n"); + status = STATUS_NO_MEMORY; + dispatch_irp(irp, status); + return status; + } + + context->node_name = node_name; + context->service_name = service_name; + context->namespace = name_space; + context->provider = provider; + context->hints = hints; + context->result = result; + context->irp = irp; + + if (!TrySubmitThreadpoolCallback(get_address_info_callback, context, NULL)) + { + ERR("Could not submit thread pool callback.\n"); + status = STATUS_UNSUCCESSFUL; + dispatch_irp(irp, status); + heap_free(context); + return status; + } + TRACE("Submitted threadpool callback, context %p.\n", context); + return STATUS_PENDING; }
static void WINAPI wsk_free_address_info(WSK_CLIENT *client, ADDRINFOEXW *addr_info) @@ -142,6 +250,9 @@ void WINAPI WskReleaseProviderNPI(WSK_REGISTRATION *wsk_registration)
NTSTATUS WINAPI WskRegister(WSK_CLIENT_NPI *wsk_client_npi, WSK_REGISTRATION *wsk_registration) { + static const WORD version = MAKEWORD( 2, 2 ); + WSADATA data; + WSK_CLIENT *client;
TRACE("wsk_client_npi %p, wsk_registration %p.\n", wsk_client_npi, wsk_registration); @@ -156,6 +267,9 @@ NTSTATUS WINAPI WskRegister(WSK_CLIENT_NPI *wsk_client_npi, WSK_REGISTRATION *ws client->client_npi = wsk_client_npi; wsk_registration->ReservedRegistrationContext = client;
+ if (WSAStartup(version, &data)) + return STATUS_INTERNAL_ERROR; + return STATUS_SUCCESS; }
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/netio.sys/netio.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/dlls/netio.sys/netio.c b/dlls/netio.sys/netio.c index cbbf8c06118..00dbec76642 100644 --- a/dlls/netio.sys/netio.c +++ b/dlls/netio.sys/netio.c @@ -203,7 +203,9 @@ static NTSTATUS WINAPI wsk_get_address_info(WSK_CLIENT *client, UNICODE_STRING *
static void WINAPI wsk_free_address_info(WSK_CLIENT *client, ADDRINFOEXW *addr_info) { - FIXME("client %p, addr_info %p stub.\n", client, addr_info); + TRACE("client %p, addr_info %p.\n", client, addr_info); + + FreeAddrInfoExW(addr_info); }
static NTSTATUS WINAPI wsk_get_name_info(WSK_CLIENT *client, SOCKADDR *sock_addr, ULONG sock_addr_length,
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73378
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
It looks like Wine test machines don't have latest Wine source updated (Windows tests are ok). In the details of failed patch apply it complains about missing dlls/ntoskrnl.exe/tests/driver4.c while it is there with the latest git tree.
On 6/14/20 22:08, Marvin wrote:
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73378
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
On Sun, 14 Jun 2020, Paul Gofman wrote:
It looks like Wine test machines don't have latest Wine source updated (Windows tests are ok). In the details of failed patch apply it complains about missing dlls/ntoskrnl.exe/tests/driver4.c while it is there with the latest git tree.
Right, there's been an error recreating the wineprefix(es):
00d4:err:module:import_dll Loading library kernelbase.dll (which is needed by L"C:\windows\system32\kernel32.dll") failed (error c000007b). wine: could not load kernel32.dll, status c0000135
So the TestBot stayed on the previous configuration. I'll look into it tomorrow (either in 12 minutes or in the morning).
On 6/15/20 5:48 AM, Francois Gouget wrote:
On Sun, 14 Jun 2020, Paul Gofman wrote:
It looks like Wine test machines don't have latest Wine source updated (Windows tests are ok). In the details of failed patch apply it complains about missing dlls/ntoskrnl.exe/tests/driver4.c while it is there with the latest git tree.
Right, there's been an error recreating the wineprefix(es):
00d4:err:module:import_dll Loading library kernelbase.dll (which is needed by L"C:\windows\system32\kernel32.dll") failed (error c000007b). wine: could not load kernel32.dll, status c0000135
So the TestBot stayed on the previous configuration. I'll look into it tomorrow (either in 12 minutes or in the morning).
This should be https://bugs.winehq.org/show_bug.cgi?id=49380
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/ntoskrnl.exe/tests/driver4.c | 86 ++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/driver4.c b/dlls/ntoskrnl.exe/tests/driver4.c index d863d748369..5f45c770df1 100644 --- a/dlls/ntoskrnl.exe/tests/driver4.c +++ b/dlls/ntoskrnl.exe/tests/driver4.c @@ -54,14 +54,23 @@ static POBJECT_TYPE *pIoDriverObjectType; static WSK_CLIENT_NPI client_npi; static WSK_REGISTRATION registration; static WSK_PROVIDER_NPI provider_npi; +static KEVENT irp_complete_event; +static IRP *wsk_irp; + +static NTSTATUS WINAPI irp_completion_routine(DEVICE_OBJECT *reserved, IRP *irp, void *context) +{ + KEVENT *event = context; + + KeSetEvent(event, 1, FALSE); + return STATUS_MORE_PROCESSING_REQUIRED; +}
static void netio_init(void) { - const WSK_CLIENT_DISPATCH client_dispatch = + static const WSK_CLIENT_DISPATCH client_dispatch = { MAKE_WSK_VERSION(1, 0), 0, NULL }; - NTSTATUS status;
client_npi.Dispatch = &client_dispatch; @@ -74,14 +83,86 @@ static void netio_init(void) ok(provider_npi.Dispatch->Version >= MAKE_WSK_VERSION(1, 0), "Got unexpected version %#x.\n", provider_npi.Dispatch->Version); ok(!!provider_npi.Client, "Got null WSK_CLIENT.\n"); + + KeInitializeEvent(&irp_complete_event, SynchronizationEvent, FALSE); + wsk_irp = IoAllocateIrp(1, FALSE); }
static void netio_uninit(void) { + IoFreeIrp(wsk_irp); WskReleaseProviderNPI(®istration); WskDeregister(®istration); }
+static void test_wsk_get_address_info(void) +{ + UNICODE_STRING node_name, service_name; + ADDRINFOEXW *result, *addr_info; + unsigned int count; + NTSTATUS status; + + RtlInitUnicodeString(&service_name, L"12345"); + + wsk_irp->IoStatus.Status = 0xdeadbeef; + wsk_irp->IoStatus.Information = 0xdeadbeef; + status = provider_npi.Dispatch->WskGetAddressInfo(provider_npi.Client, &node_name, &service_name, + NS_ALL, NULL, NULL, &result, NULL, NULL, NULL); + ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#x.\n", status); + ok(wsk_irp->IoStatus.Status == 0xdeadbeef, "Got unexpected status %#x.\n", wsk_irp->IoStatus.Status); + ok(wsk_irp->IoStatus.Information == 0xdeadbeef, "Got unexpected Information %#lx.\n", + wsk_irp->IoStatus.Information); + + RtlInitUnicodeString(&node_name, L"dead.beef"); + + IoReuseIrp(wsk_irp, STATUS_UNSUCCESSFUL); + IoSetCompletionRoutine(wsk_irp, irp_completion_routine, &irp_complete_event, TRUE, TRUE, TRUE); + wsk_irp->IoStatus.Status = 0xdeadbeef; + wsk_irp->IoStatus.Information = 0xdeadbeef; + status = provider_npi.Dispatch->WskGetAddressInfo(provider_npi.Client, &node_name, &service_name, + NS_ALL, NULL, NULL, &result, NULL, NULL, wsk_irp); + ok(status == STATUS_PENDING, "Got unexpected status %#x.\n", status); + status = KeWaitForSingleObject(&irp_complete_event, Executive, KernelMode, FALSE, NULL); + ok(status == STATUS_SUCCESS, "Got unexpected status %#x.\n", status); + ok(wsk_irp->IoStatus.Status == STATUS_NOT_FOUND + || broken(wsk_irp->IoStatus.Status == STATUS_NO_MATCH) /* Win7 */, + "Got unexpected status %#x.\n", wsk_irp->IoStatus.Status); + ok(wsk_irp->IoStatus.Information == 0, "Got unexpected Information %#lx.\n", + wsk_irp->IoStatus.Information); + + RtlInitUnicodeString(&node_name, L"127.0.0.1"); + IoReuseIrp(wsk_irp, STATUS_UNSUCCESSFUL); + IoSetCompletionRoutine(wsk_irp, irp_completion_routine, &irp_complete_event, TRUE, TRUE, TRUE); + wsk_irp->IoStatus.Status = 0xdeadbeef; + wsk_irp->IoStatus.Information = 0xdeadbeef; + status = provider_npi.Dispatch->WskGetAddressInfo(provider_npi.Client, &node_name, &service_name, + NS_ALL, NULL, NULL, &result, NULL, NULL, wsk_irp); + ok(status == STATUS_PENDING, "Got unexpected status %#x.\n", status); + status = KeWaitForSingleObject(&irp_complete_event, Executive, KernelMode, FALSE, NULL); + ok(status == STATUS_SUCCESS, "Got unexpected status %#x.\n", status); + ok(wsk_irp->IoStatus.Status == STATUS_SUCCESS, "Got unexpected status %#x.\n", wsk_irp->IoStatus.Status); + ok(wsk_irp->IoStatus.Information == 0, "Got unexpected Information %#lx.\n", + wsk_irp->IoStatus.Information); + + count = 0; + addr_info = result; + while (addr_info) + { + struct sockaddr_in *addr = (struct sockaddr_in *)addr_info->ai_addr; + + ok(addr_info->ai_addrlen == sizeof(*addr), "Got unexpected ai_addrlen %u.\n", addr_info->ai_addrlen); + ok(addr->sin_family == AF_INET, "Got unexpected sin_family %u.\n", addr->sin_family); + ok(ntohs(addr->sin_port) == 12345, "Got unexpected sin_port %u.\n", ntohs(addr->sin_port)); + ok(ntohl(addr->sin_addr.s_addr) == 0x7f000001, "Got unexpected sin_addr %#x.\n", + ntohl(addr->sin_addr.s_addr)); + + ++count; + addr_info = addr_info->ai_next; + } + ok(count, "Got zero addr_info count.\n"); + provider_npi.Dispatch->WskFreeAddressInfo(provider_npi.Client, result); +} + static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack) { ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength; @@ -106,6 +187,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st ZwOpenFile(&okfile, FILE_APPEND_DATA | SYNCHRONIZE, &attr, &io, 0, FILE_SYNCHRONOUS_IO_NONALERT);
netio_init(); + test_wsk_get_address_info();
if (winetest_debug) {
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73379
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- include/mswsock.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/include/mswsock.h b/include/mswsock.h index 3f0180c9092..e402f33ecf7 100644 --- a/include/mswsock.h +++ b/include/mswsock.h @@ -164,6 +164,8 @@ typedef struct _WSACMSGHDR { /* followed by UCHAR cmsg_data[] */ } WSACMSGHDR, *PWSACMSGHDR, *LPWSACMSGHDR;
+typedef WSACMSGHDR CMSGHDR, *PCMSGHDR; + typedef enum _NLA_BLOB_DATA_TYPE { NLA_RAW_DATA, NLA_INTERFACE, /* interface name, type and speed */
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73380
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- include/ddk/wsk.h | 144 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-)
diff --git a/include/ddk/wsk.h b/include/ddk/wsk.h index a46eeadcc4b..97ab8ab3a51 100644 --- a/include/ddk/wsk.h +++ b/include/ddk/wsk.h @@ -19,6 +19,7 @@ #define _INC_WSK
#include <winsock2.h> +#include <mswsock.h>
#ifdef __cplusplus extern "C" @@ -26,11 +27,37 @@ extern "C" #endif
struct _WSK_CLIENT; + typedef struct _WSK_CLIENT WSK_CLIENT, *PWSK_CLIENT; + +typedef struct _WSK_SOCKET +{ + const void *Dispatch; +} WSK_SOCKET, *PWSK_SOCKET; + #define MAKE_WSK_VERSION(major, minor) ((USHORT)((major) << 8) | (USHORT)((minor) & 0xff)) #define WSK_NO_WAIT 0 #define WSK_INFINITE_WAIT 0xffffffff
+#define WSK_FLAG_BASIC_SOCKET 0x00000000 +#define WSK_FLAG_LISTEN_SOCKET 0x00000001 +#define WSK_FLAG_CONNECTION_SOCKET 0x00000002 +#define WSK_FLAG_DATAGRAM_SOCKET 0x00000004 +#define WSK_FLAG_STREAM_SOCKET 0x00000008 + +typedef enum _WSK_CONTROL_SOCKET_TYPE +{ + WskSetOption, + WskGetOption, + WskIoctl, +} WSK_CONTROL_SOCKET_TYPE; + +typedef enum _WSK_INSPECT_ACTION +{ + WskInspectReject, + WskInspectAccept, +} WSK_INSPECT_ACTION; + typedef struct _WSK_CLIENT_CONNECTION_DISPATCH WSK_CLIENT_CONNECTION_DISPATCH, *PWSK_CLIENT_CONNECTION_DISPATCH;
typedef struct _WSK_BUF @@ -40,12 +67,33 @@ typedef struct _WSK_BUF SIZE_T Length; } WSK_BUF, *PWSK_BUF;
+typedef struct _WSK_BUF_LIST +{ + struct _WSK_BUF_LIST *Next; + WSK_BUF Buffer; +} WSK_BUF_LIST, *PWSK_BUF_LIST; + typedef struct _WSK_DATA_INDICATION { struct _WSK_DATA_INDICATION *Next; - WSK_BUF Buffer; + WSK_BUF Buffer; } WSK_DATA_INDICATION, *PWSK_DATA_INDICATION;
+typedef struct _WSK_INSPECT_ID +{ + ULONG_PTR Key; + ULONG SerialNumber; +} WSK_INSPECT_ID, *PWSK_INSPECT_ID; + +typedef struct _WSK_DATAGRAM_INDICATION +{ + struct _WSK_DATAGRAM_INDICATION *Next; + WSK_BUF Buffer; + PCMSGHDR ControlInfo; + ULONG ControlInfoLength; + PSOCKADDR RemoteAddress; +} WSK_DATAGRAM_INDICATION, *PWSK_DATAGRAM_INDICATION; + typedef NTSTATUS (WINAPI *PFN_WSK_CLIENT_EVENT)(void *context, ULONG event, void *info, SIZE_T length); typedef NTSTATUS (WINAPI *PFN_WSK_DISCONNECT_EVENT)(void *context, ULONG flags); typedef NTSTATUS (WINAPI *PFN_WSK_SEND_BACKLOG_EVENT)(void *socket_context, SIZE_T ideal_backlog_size); @@ -114,6 +162,100 @@ typedef struct _WSK_PROVIDER_NPI const WSK_PROVIDER_DISPATCH *Dispatch; } WSK_PROVIDER_NPI, *PWSK_PROVIDER_NPI;
+typedef NTSTATUS (WINAPI *PFN_WSK_CONTROL_SOCKET)(WSK_SOCKET *socket, WSK_CONTROL_SOCKET_TYPE request_type, + ULONG control_code, ULONG level, SIZE_T input_size, void *input_buffer, SIZE_T output_size, + void *output_buffer, SIZE_T *output_size_returned, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_CLOSE_SOCKET)(WSK_SOCKET *socket, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_BIND)(WSK_SOCKET *socket, SOCKADDR *local_address, ULONG flags, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_ACCEPT)(WSK_SOCKET *listen_socket, ULONG flags, void *accept_socket_context, + const WSK_CLIENT_CONNECTION_DISPATCH *accept_socket_dispatch, SOCKADDR *local_address, + SOCKADDR *remote_address, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_CONNECT)(WSK_SOCKET *socket, SOCKADDR *remote_address, ULONG flags, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_LISTEN)(WSK_SOCKET *socket, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_SEND)(WSK_SOCKET *socket, WSK_BUF *buffer, ULONG flags, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_RECEIVE)(WSK_SOCKET *socket, WSK_BUF *buffer, ULONG flags, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_DISCONNECT)(WSK_SOCKET *socket, WSK_BUF *buffer, ULONG flags, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_GET_LOCAL_ADDRESS)(WSK_SOCKET *socket, SOCKADDR *local_address, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_GET_REMOTE_ADDRESS)(WSK_SOCKET *socket, SOCKADDR *remote_address, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_CONNECT_EX)(WSK_SOCKET *socket, SOCKADDR *remote_address, WSK_BUF *buffer, + ULONG flags, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_RELEASE_DATA_INDICATION_LIST)(WSK_SOCKET *socket, + WSK_DATA_INDICATION *data_indication); +typedef NTSTATUS (WINAPI *PFN_WSK_SEND_MESSAGES) (WSK_SOCKET *socket, WSK_BUF_LIST *buffer_list, ULONG flags, + SOCKADDR *remote_address, ULONG control_info_length, CMSGHDR *control_info, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_SEND_TO)(WSK_SOCKET *socket, WSK_BUF *buffer, ULONG flags, SOCKADDR *remote_address, + ULONG control_info_length, CMSGHDR *control_info, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_RECEIVE_FROM)(WSK_SOCKET *socket, WSK_BUF *buffer, ULONG flags, + SOCKADDR *remote_address, ULONG *control_length, CMSGHDR *control_info, ULONG *control_flags, IRP *irp); +typedef NTSTATUS (WINAPI *PFN_WSK_RELEASE_DATAGRAM_INDICATION_LIST)(WSK_SOCKET *socket, + WSK_DATAGRAM_INDICATION *datagram_indication); +typedef NTSTATUS (WINAPI *PFN_WSK_INSPECT_COMPLETE)(WSK_SOCKET *listen_socket, WSK_INSPECT_ID *inspect_id, + WSK_INSPECT_ACTION action, IRP *irp); + +/* PFN_WSK_SEND_EX, PFN_WSK_RECEIVE_EX functions are undocumented and reserved for system use. */ +typedef void *PFN_WSK_SEND_EX; +typedef void *PFN_WSK_RECEIVE_EX; + +typedef struct _WSK_PROVIDER_BASIC_DISPATCH +{ + PFN_WSK_CONTROL_SOCKET WskControlSocket; + PFN_WSK_CLOSE_SOCKET WskCloseSocket; +} WSK_PROVIDER_BASIC_DISPATCH, *PWSK_PROVIDER_BASIC_DISPATCH; + +typedef struct _WSK_PROVIDER_STREAM_DISPATCH +{ + WSK_PROVIDER_BASIC_DISPATCH Basic; + PFN_WSK_BIND WskBind; + PFN_WSK_ACCEPT WskAccept; + PFN_WSK_CONNECT WskConnect; + PFN_WSK_LISTEN WskListen; + PFN_WSK_SEND WskSend; + PFN_WSK_RECEIVE WskReceive; + PFN_WSK_DISCONNECT WskDisconnect; + PFN_WSK_RELEASE_DATA_INDICATION_LIST WskRelease; + PFN_WSK_GET_LOCAL_ADDRESS WskGetLocalAddress; + PFN_WSK_GET_REMOTE_ADDRESS WskGetRemoteAddress; + PFN_WSK_CONNECT_EX WskConnectEx; + PFN_WSK_SEND_EX WskSendEx; + PFN_WSK_RECEIVE_EX WskReceiveEx; +} WSK_PROVIDER_STREAM_DISPATCH, *PWSK_PROVIDER_STREAM_DISPATCH; + +typedef struct _WSK_PROVIDER_CONNECTION_DISPATCH +{ + WSK_PROVIDER_BASIC_DISPATCH Basic; + PFN_WSK_BIND WskBind; + PFN_WSK_CONNECT WskConnect; + PFN_WSK_GET_LOCAL_ADDRESS WskGetLocalAddress; + PFN_WSK_GET_REMOTE_ADDRESS WskGetRemoteAddress; + PFN_WSK_SEND WskSend; + PFN_WSK_RECEIVE WskReceive; + PFN_WSK_DISCONNECT WskDisconnect; + PFN_WSK_RELEASE_DATA_INDICATION_LIST WskRelease; + PFN_WSK_CONNECT_EX WskConnectEx; + PFN_WSK_SEND_EX WskSendEx; + PFN_WSK_RECEIVE_EX WskReceiveEx; +} WSK_PROVIDER_CONNECTION_DISPATCH, *PWSK_PROVIDER_CONNECTION_DISPATCH; + +typedef struct _WSK_PROVIDER_DATAGRAM_DISPATCH +{ + WSK_PROVIDER_BASIC_DISPATCH Basic; + PFN_WSK_BIND WskBind; + PFN_WSK_SEND_TO WskSendTo; + PFN_WSK_RECEIVE_FROM WskReceiveFrom; + PFN_WSK_RELEASE_DATAGRAM_INDICATION_LIST WskRelease; + PFN_WSK_GET_LOCAL_ADDRESS WskGetLocalAddress; + PFN_WSK_SEND_MESSAGES WskSendMessages; +} WSK_PROVIDER_DATAGRAM_DISPATCH, *PWSK_PROVIDER_DATAGRAM_DISPATCH; + +typedef struct _WSK_PROVIDER_LISTEN_DISPATCH +{ + WSK_PROVIDER_BASIC_DISPATCH Basic; + PFN_WSK_BIND WskBind; + PFN_WSK_ACCEPT WskAccept; + PFN_WSK_INSPECT_COMPLETE WskInspectComplete; + PFN_WSK_GET_LOCAL_ADDRESS WskGetLocalAddress; +} WSK_PROVIDER_LISTEN_DISPATCH, *PWSK_PROVIDER_LISTEN_DISPATCH; + NTSTATUS WINAPI WskRegister(WSK_CLIENT_NPI *wsk_client_npi, WSK_REGISTRATION *wsk_registration); void WINAPI WskDeregister(WSK_REGISTRATION *wsk_registration); NTSTATUS WINAPI WskCaptureProviderNPI(WSK_REGISTRATION *wsk_registration, ULONG wait_timeout,
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73381
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 Task: Patch failed to apply
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/netio.sys/netio.c | 133 +++++++++++++++++++++++++++++++++++++++-- include/ddk/wsk.h | 14 +++++ 2 files changed, 142 insertions(+), 5 deletions(-)
diff --git a/dlls/netio.sys/netio.c b/dlls/netio.sys/netio.c index 00dbec76642..3ac2008c7e3 100644 --- a/dlls/netio.sys/netio.c +++ b/dlls/netio.sys/netio.c @@ -44,6 +44,14 @@ struct _WSK_CLIENT WSK_CLIENT_NPI *client_npi; };
+struct wsk_socket_internal +{ + WSK_SOCKET wsk_socket; + SOCKET s; + const void *client_dispatch; + void *client_context; +}; + static NTSTATUS sock_error_to_ntstatus(DWORD err) { switch (err) @@ -92,16 +100,131 @@ static void dispatch_irp(IRP *irp, NTSTATUS status) IoCompleteRequest(irp, IO_NO_INCREMENT); }
+static NTSTATUS WINAPI wsk_control_socket(WSK_SOCKET *socket, WSK_CONTROL_SOCKET_TYPE request_type, + ULONG control_code, ULONG level, SIZE_T input_size, void *input_buffer, SIZE_T output_size, + void *output_buffer, SIZE_T *output_size_returned, IRP *irp) +{ + FIXME("socket %p, request_type %u, control_code %#x, level %u, input_size %lu, input_buffer %p, " + "output_size %lu, output_buffer %p, output_size_returned %p, irp %p stub.\n", + socket, request_type, control_code, level, input_size, input_buffer, output_size, + output_buffer, output_size_returned, irp); + + return STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS WINAPI wsk_close_socket(WSK_SOCKET *socket, IRP *irp) +{ + FIXME("socket %p, irp %p stub.\n", socket, irp); + + return STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS WINAPI wsk_bind(WSK_SOCKET *socket, SOCKADDR *local_address, ULONG flags, IRP *irp) +{ + FIXME("socket %p, local_address %p, flags %#x, irp %p stub.\n", + socket, local_address, flags, irp); + + return STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS WINAPI wsk_accept(WSK_SOCKET *listen_socket, ULONG flags, void *accept_socket_context, + const WSK_CLIENT_CONNECTION_DISPATCH *accept_socket_dispatch, SOCKADDR *local_address, + SOCKADDR *remote_address, IRP *irp) +{ + FIXME("listen_socket %p, flags %#x, accept_socket_context %p, accept_socket_dispatch %p, " + "local_address %p, remote_address %p, irp %p stub.\n", + listen_socket, flags, accept_socket_context, accept_socket_dispatch, local_address, + remote_address, irp); + + return STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS WINAPI wsk_inspect_complete(WSK_SOCKET *listen_socket, WSK_INSPECT_ID *inspect_id, + WSK_INSPECT_ACTION action, IRP *irp) +{ + FIXME("listen_socket %p, inspect_id %p, action %u, irp %p stub.\n", + listen_socket, inspect_id, action, irp); + + return STATUS_NOT_IMPLEMENTED; +} + +static NTSTATUS WINAPI wsk_get_local_address(WSK_SOCKET *socket, SOCKADDR *local_address, IRP *irp) +{ + FIXME("socket %p, local_address %p, irp %p stub.\n", socket, local_address, irp); + + return STATUS_NOT_IMPLEMENTED; +} + +static const WSK_PROVIDER_LISTEN_DISPATCH wsk_provider_listen_dispatch = +{ + { + wsk_control_socket, + wsk_close_socket, + }, + wsk_bind, + wsk_accept, + wsk_inspect_complete, + wsk_get_local_address, +}; + static NTSTATUS WINAPI wsk_socket(WSK_CLIENT *client, ADDRESS_FAMILY address_family, USHORT socket_type, - ULONG protocol, ULONG Flags, void *socket_context, const void *dispatch, PEPROCESS owning_process, + ULONG protocol, ULONG flags, void *socket_context, const void *dispatch, PEPROCESS owning_process, PETHREAD owning_thread, SECURITY_DESCRIPTOR *security_descriptor, IRP *irp) { - FIXME("client %p, address_family %#x, socket_type %#x, protocol %#x, Flags %#x, socket_context %p, dispatch %p, " - "owning_process %p, owning_thread %p, security_descriptor %p, irp %p stub.\n", - client, address_family, socket_type, protocol, Flags, socket_context, dispatch, owning_process, + struct wsk_socket_internal *socket; + NTSTATUS status; + SOCKET s; + + TRACE("client %p, address_family %#x, socket_type %#x, protocol %#x, flags %#x, socket_context %p, dispatch %p, " + "owning_process %p, owning_thread %p, security_descriptor %p, irp %p.\n", + client, address_family, socket_type, protocol, flags, socket_context, dispatch, owning_process, owning_thread, security_descriptor, irp);
- return STATUS_NOT_IMPLEMENTED; + if (!irp) + return STATUS_INVALID_PARAMETER; + + if (!client) + return STATUS_INVALID_HANDLE; + + irp->IoStatus.Information = 0; + + if ((s = WSASocketW(address_family, socket_type, protocol, NULL, 0, 0)) == INVALID_SOCKET) + { + status = sock_error_to_ntstatus(WSAGetLastError()); + goto done; + } + + if (!(socket = heap_alloc(sizeof(*socket)))) + { + status = STATUS_NO_MEMORY; + closesocket(s); + goto done; + } + + socket->s = s; + socket->client_dispatch = dispatch; + socket->client_context = socket_context; + + switch (flags) + { + case WSK_FLAG_LISTEN_SOCKET: + socket->wsk_socket.Dispatch = &wsk_provider_listen_dispatch; + break; + + default: + FIXME("Flags %#x not implemented.\n", flags); + closesocket(s); + heap_free(socket); + status = STATUS_NOT_IMPLEMENTED; + goto done; + } + + irp->IoStatus.Information = (ULONG_PTR)&socket->wsk_socket; + status = STATUS_SUCCESS; + +done: + dispatch_irp(irp, status); + return status ? status : STATUS_PENDING; }
static NTSTATUS WINAPI wsk_socket_connect(WSK_CLIENT *client, USHORT socket_type, ULONG protocol, diff --git a/include/ddk/wsk.h b/include/ddk/wsk.h index 97ab8ab3a51..3e0debb1c0f 100644 --- a/include/ddk/wsk.h +++ b/include/ddk/wsk.h @@ -136,6 +136,20 @@ typedef struct _WSK_CLIENT_CONNECTION_DISPATCH PFN_WSK_SEND_BACKLOG_EVENT WskSendBacklogEvent; } WSK_CLIENT_CONNECTION_DISPATCH, *PWSK_CLIENT_CONNECTION_DISPATCH;
+typedef NTSTATUS (WINAPI *PFN_WSK_ACCEPT_EVENT)(void *socket_context, ULONG flags, SOCKADDR *local_address, + SOCKADDR *remote_address, WSK_SOCKET *accept_socket, void *accept_socket_context, + const WSK_CLIENT_CONNECTION_DISPATCH **accept_socket_dispatch); +typedef WSK_INSPECT_ACTION (WINAPI *PFN_WSK_INSPECT_EVENT)(void *socket_context, SOCKADDR *local_address, + SOCKADDR *remote_address, WSK_INSPECT_ID *inspect_id); +typedef NTSTATUS (WINAPI *PFN_WSK_ABORT_EVENT)(void *socket_context, WSK_INSPECT_ID *inspect_id); + +typedef struct _WSK_CLIENT_LISTEN_DISPATCH +{ + PFN_WSK_ACCEPT_EVENT WskAcceptEvent; + PFN_WSK_INSPECT_EVENT WskInspectEvent; + PFN_WSK_ABORT_EVENT WskAbortEvent; +} WSK_CLIENT_LISTEN_DISPATCH, *PWSK_CLIENT_LISTEN_DISPATCH; + typedef struct _WSK_CLIENT_DISPATCH { USHORT Version;
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73382
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 error: patch failed: dlls/netio.sys/netio.c:44 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 error: patch failed: dlls/netio.sys/netio.c:44 Task: Patch failed to apply
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/netio.sys/netio.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/netio.sys/netio.c b/dlls/netio.sys/netio.c index 3ac2008c7e3..2b8848a275e 100644 --- a/dlls/netio.sys/netio.c +++ b/dlls/netio.sys/netio.c @@ -52,6 +52,11 @@ struct wsk_socket_internal void *client_context; };
+static inline struct wsk_socket_internal *wsk_socket_internal_from_wsk_socket(WSK_SOCKET *wsk_socket) +{ + return CONTAINING_RECORD(wsk_socket, struct wsk_socket_internal, wsk_socket); +} + static NTSTATUS sock_error_to_ntstatus(DWORD err) { switch (err) @@ -114,9 +119,18 @@ static NTSTATUS WINAPI wsk_control_socket(WSK_SOCKET *socket, WSK_CONTROL_SOCKET
static NTSTATUS WINAPI wsk_close_socket(WSK_SOCKET *socket, IRP *irp) { - FIXME("socket %p, irp %p stub.\n", socket, irp); + struct wsk_socket_internal *s = wsk_socket_internal_from_wsk_socket(socket); + NTSTATUS status;
- return STATUS_NOT_IMPLEMENTED; + TRACE("socket %p, irp %p.\n", socket, irp); + + status = closesocket(s->s) ? sock_error_to_ntstatus(WSAGetLastError()) : STATUS_SUCCESS; + heap_free(socket); + + irp->IoStatus.Information = 0; + dispatch_irp(irp, status); + + return status ? status : STATUS_PENDING; }
static NTSTATUS WINAPI wsk_bind(WSK_SOCKET *socket, SOCKADDR *local_address, ULONG flags, IRP *irp)
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73383
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 error: patch failed: dlls/netio.sys/netio.c:44 error: patch failed: dlls/netio.sys/netio.c:52 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 error: patch failed: dlls/netio.sys/netio.c:44 error: patch failed: dlls/netio.sys/netio.c:52 Task: Patch failed to apply
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/ntoskrnl.exe/tests/driver4.c | 51 +++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)
diff --git a/dlls/ntoskrnl.exe/tests/driver4.c b/dlls/ntoskrnl.exe/tests/driver4.c index 5f45c770df1..4336fdb21a4 100644 --- a/dlls/ntoskrnl.exe/tests/driver4.c +++ b/dlls/ntoskrnl.exe/tests/driver4.c @@ -163,6 +163,56 @@ static void test_wsk_get_address_info(void) provider_npi.Dispatch->WskFreeAddressInfo(provider_npi.Client, result); }
+struct socket_context +{ +}; + +static void test_wsk_listen_socket(void) +{ + static const WSK_CLIENT_LISTEN_DISPATCH client_listen_dispatch; + const WSK_PROVIDER_LISTEN_DISPATCH *dispatch; + struct socket_context context; + NTSTATUS status; + WSK_SOCKET *s; + + status = provider_npi.Dispatch->WskSocket(NULL, AF_INET, SOCK_STREAM, IPPROTO_TCP, + WSK_FLAG_LISTEN_SOCKET, &context, &client_listen_dispatch, NULL, NULL, NULL, NULL); + ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#x.\n", status); + + IoReuseIrp(wsk_irp, STATUS_UNSUCCESSFUL); + IoSetCompletionRoutine(wsk_irp, irp_completion_routine, &irp_complete_event, TRUE, TRUE, TRUE); + status = provider_npi.Dispatch->WskSocket(NULL, AF_INET, SOCK_STREAM, IPPROTO_TCP, + WSK_FLAG_LISTEN_SOCKET, &context, &client_listen_dispatch, NULL, NULL, NULL, wsk_irp); + ok(status == STATUS_INVALID_HANDLE, "Got unexpected status %#x.\n", status); + + IoReuseIrp(wsk_irp, STATUS_UNSUCCESSFUL); + IoSetCompletionRoutine(wsk_irp, irp_completion_routine, &irp_complete_event, TRUE, TRUE, TRUE); + wsk_irp->IoStatus.Status = 0xdeadbeef; + wsk_irp->IoStatus.Information = 0xdeadbeef; + status = provider_npi.Dispatch->WskSocket(provider_npi.Client, AF_INET, SOCK_STREAM, IPPROTO_TCP, + WSK_FLAG_LISTEN_SOCKET, &context, &client_listen_dispatch, NULL, NULL, NULL, wsk_irp); + ok(status == STATUS_PENDING, "Got unexpected status %#x.\n", status); + status = KeWaitForSingleObject(&irp_complete_event, Executive, KernelMode, FALSE, NULL); + ok(status == STATUS_SUCCESS, "Got unexpected status %#x.\n", status); + ok(wsk_irp->IoStatus.Status == STATUS_SUCCESS, "Got unexpected status %#x.\n", wsk_irp->IoStatus.Status); + ok(wsk_irp->IoStatus.Information, "Got zero Information.\n"); + + s = (WSK_SOCKET *)wsk_irp->IoStatus.Information; + dispatch = s->Dispatch; + + IoReuseIrp(wsk_irp, STATUS_UNSUCCESSFUL); + IoSetCompletionRoutine(wsk_irp, irp_completion_routine, &irp_complete_event, TRUE, TRUE, TRUE); + wsk_irp->IoStatus.Status = 0xdeadbeef; + wsk_irp->IoStatus.Information = 0xdeadbeef; + status = dispatch->Basic.WskCloseSocket(s, wsk_irp); + ok(status == STATUS_PENDING, "Got unexpected status %#x.\n", status); + status = KeWaitForSingleObject(&irp_complete_event, Executive, KernelMode, FALSE, NULL); + ok(status == STATUS_SUCCESS, "Got unexpected status %#x.\n", status); + ok(wsk_irp->IoStatus.Status == STATUS_SUCCESS, "Got unexpected status %#x.\n", wsk_irp->IoStatus.Status); + ok(!wsk_irp->IoStatus.Information, "Got unexpected Information %#lx.\n", + wsk_irp->IoStatus.Information); +} + static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack) { ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength; @@ -188,6 +238,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
netio_init(); test_wsk_get_address_info(); + test_wsk_listen_socket();
if (winetest_debug) {
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73384
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 error: patch failed: dlls/netio.sys/netio.c:44 error: patch failed: dlls/netio.sys/netio.c:52 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 error: patch failed: dlls/netio.sys/netio.c:203 error: patch failed: dlls/netio.sys/netio.c:44 error: patch failed: dlls/netio.sys/netio.c:52 Task: Patch failed to apply
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=73377
Your paranoid android.
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 Task: Patch failed to apply
=== debiant (build log) ===
error: patch failed: dlls/netio.sys/netio.c:31 Task: Patch failed to apply