[PATCH 1/5] http.sys: Allow sending response data.

Zebediah Figura z.figura12 at gmail.com
Wed Aug 28 20:45:27 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/http.sys/http.c | 45 ++++++++++++++++++++++++++++++++++++++++++++
 include/wine/http.h  |  8 ++++++++
 2 files changed, 53 insertions(+)

diff --git a/dlls/http.sys/http.c b/dlls/http.sys/http.c
index 4115afc8672..b2400a26b7c 100644
--- a/dlls/http.sys/http.c
+++ b/dlls/http.sys/http.c
@@ -1193,6 +1193,48 @@ static NTSTATUS http_receive_request(struct request_queue *queue, IRP *irp)
     return ret;
 }
 
+static NTSTATUS http_send_response(struct request_queue *queue, IRP *irp)
+{
+    const struct http_response *response = irp->AssociatedIrp.SystemBuffer;
+    struct connection *conn;
+
+    TRACE("id %s, len %d.\n", wine_dbgstr_longlong(response->id), response->len);
+
+    EnterCriticalSection(&http_cs);
+
+    LIST_FOR_EACH_ENTRY(conn, &connections, struct connection, entry)
+    {
+        if (conn->req_id == response->id)
+        {
+            if (send(conn->socket, response->buffer, response->len, 0) >= 0)
+            {
+                conn->queue = NULL;
+                conn->req_id = HTTP_NULL_ID;
+                WSAEventSelect(conn->socket, request_event, FD_READ | FD_CLOSE);
+                irp->IoStatus.Information = response->len;
+                /* We might have another request already in the buffer. */
+                if (parse_request(conn) < 0)
+                {
+                    WARN("Failed to parse request; shutting down connection.\n");
+                    send_400(conn);
+                    close_connection(conn);
+                }
+            }
+            else
+            {
+                ERR("Got error %u; shutting down connection.\n", WSAGetLastError());
+                close_connection(conn);
+            }
+
+            LeaveCriticalSection(&http_cs);
+            return STATUS_SUCCESS;
+        }
+    }
+
+    LeaveCriticalSection(&http_cs);
+    return STATUS_CONNECTION_INVALID;
+}
+
 static NTSTATUS WINAPI dispatch_ioctl(DEVICE_OBJECT *device, IRP *irp)
 {
     IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation(irp);
@@ -1210,6 +1252,9 @@ static NTSTATUS WINAPI dispatch_ioctl(DEVICE_OBJECT *device, IRP *irp)
     case IOCTL_HTTP_RECEIVE_REQUEST:
         ret = http_receive_request(queue, irp);
         break;
+    case IOCTL_HTTP_SEND_RESPONSE:
+        ret = http_send_response(queue, irp);
+        break;
     default:
         FIXME("Unhandled ioctl %#x.\n", stack->Parameters.DeviceIoControl.IoControlCode);
         ret = STATUS_NOT_IMPLEMENTED;
diff --git a/include/wine/http.h b/include/wine/http.h
index 1145cab71a7..eb75d8f60ef 100644
--- a/include/wine/http.h
+++ b/include/wine/http.h
@@ -26,6 +26,7 @@
 #define IOCTL_HTTP_ADD_URL          CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, 0)
 #define IOCTL_HTTP_REMOVE_URL       CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, 0)
 #define IOCTL_HTTP_RECEIVE_REQUEST  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, 0)
+#define IOCTL_HTTP_SEND_RESPONSE    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, 0)
 
 struct http_add_url_params
 {
@@ -41,4 +42,11 @@ struct http_receive_request_params
     ULONG bits;
 };
 
+struct http_response
+{
+    HTTP_REQUEST_ID id;
+    int len;
+    char buffer[1];
+};
+
 #endif
-- 
2.22.0




More information about the wine-devel mailing list