xref: /reactos/dll/win32/fltlib/message.c (revision 40462c92)
1 /*
2 * PROJECT:         Filesystem Filter Manager library
3 * LICENSE:         GPL - See COPYING in the top level directory
4 * FILE:            dll/win32/fltlib/message.c
5 * PURPOSE:         Handles messaging to and from the filter manager
6 * PROGRAMMERS:     Ged Murphy (ged.murphy@reactos.org)
7 */
8 
9 #define WIN32_NO_STATUS
10 #include <windef.h>
11 #include <winbase.h>
12 
13 #define NTOS_MODE_USER
14 #include <ndk/iofuncs.h>
15 #include <ndk/obfuncs.h>
16 #include <ndk/rtlfuncs.h>
17 #include <fltuser.h>
18 #include <fltmgr_shared.h>
19 
20 #include "fltlib.h"
21 
22 _Must_inspect_result_
23 HRESULT
24 WINAPI
25 FilterConnectCommunicationPort(_In_ LPCWSTR lpPortName,
26                                _In_ DWORD dwOptions,
27                                _In_reads_bytes_opt_(wSizeOfContext) LPCVOID lpContext,
28                                _In_ WORD wSizeOfContext,
29                                _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
30                                _Outptr_ HANDLE *hPort)
31 {
32     OBJECT_ATTRIBUTES ObjectAttributes;
33     IO_STATUS_BLOCK IoStatusBlock;
34     PFILTER_PORT_DATA PortData;
35     UNICODE_STRING DeviceName;
36     UNICODE_STRING PortName;
37     HANDLE FileHandle;
38     SIZE_T PortNameSize;
39     SIZE_T BufferSize;
40     PCHAR Ptr;
41     NTSTATUS Status;
42     HRESULT hr;
43 
44     *hPort = INVALID_HANDLE_VALUE;
45 
46     /* Sanity check */
47     if (lpContext && wSizeOfContext == 0)
48     {
49         return E_INVALIDARG;
50     }
51 
52     /* Get the length of the port name */
53     PortNameSize = wcslen(lpPortName) * sizeof(WCHAR);
54 
55     /* Calculate and allocate the size of the required buffer */
56     BufferSize = sizeof(FILTER_PORT_DATA) + PortNameSize + wSizeOfContext;
57     PortData = RtlAllocateHeap(GetProcessHeap(), 0, BufferSize);
58     if (PortData == NULL) return E_OUTOFMEMORY;
59 
60     /* Clear out the buffer and find the end of the fixed struct */
61     RtlZeroMemory(PortData, BufferSize);
62     Ptr = (PCHAR)(PortData + 1);
63 
64     PortData->Size = BufferSize;
65     PortData->Options = dwOptions;
66 
67     /* Setup the port name */
68     RtlInitUnicodeString(&PortName, lpPortName);
69     PortData->PortName.Buffer = (PWCH)Ptr;
70     PortData->PortName.MaximumLength = PortNameSize;
71     RtlCopyUnicodeString(&PortData->PortName, &PortName);
72     Ptr += PortData->PortName.Length;
73 
74     /* Check if we were given a context */
75     if (lpContext)
76     {
77         /* Add that into the buffer too */
78         PortData->Context = Ptr;
79         RtlCopyMemory(PortData->Context, lpContext, wSizeOfContext);
80     }
81 
82     /* Initialize the object attributes */
83     RtlInitUnicodeString(&DeviceName, L"\\Global??\\FltMgrMsg");
84     InitializeObjectAttributes(&ObjectAttributes,
85                                &DeviceName,
86                                OBJ_EXCLUSIVE | OBJ_CASE_INSENSITIVE,
87                                NULL,
88                                NULL);
89 
90     /* Check if we were passed any security attributes */
91     if (lpSecurityAttributes)
92     {
93         /* Add these manually and update the flags if we were asked to make it inheritable */
94         ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
95         if (lpSecurityAttributes->bInheritHandle)
96         {
97             ObjectAttributes.Attributes |= OBJ_INHERIT;
98         }
99     }
100 
101     /* Now get a handle to the device */
102     Status = NtCreateFile(&FileHandle,
103                           SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA,
104                           &ObjectAttributes,
105                           &IoStatusBlock,
106                           0,
107                           0,
108                           0,
109                           FILE_OPEN_IF,
110                           0,
111                           PortData,
112                           BufferSize);
113     if (NT_SUCCESS(Status))
114     {
115         *hPort = FileHandle;
116         hr = S_OK;
117     }
118     else
119     {
120         hr = NtStatusToHResult(Status);
121     }
122 
123     /* Cleanup and return */
124     RtlFreeHeap(GetProcessHeap(), 0, PortData);
125     return hr;
126 }
127 
128 _Must_inspect_result_
129 HRESULT
130 WINAPI
131 FilterSendMessage(_In_ HANDLE hPort,
132                   _In_reads_bytes_(dwInBufferSize) LPVOID lpInBuffer,
133                   _In_ DWORD dwInBufferSize,
134                   _Out_writes_bytes_to_opt_(dwOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer,
135                   _In_ DWORD dwOutBufferSize,
136                   _Out_ LPDWORD lpBytesReturned)
137 {
138     UNREFERENCED_PARAMETER(hPort);
139     UNREFERENCED_PARAMETER(lpInBuffer);
140     UNREFERENCED_PARAMETER(dwInBufferSize);
141     UNREFERENCED_PARAMETER(lpOutBuffer);
142     UNREFERENCED_PARAMETER(dwOutBufferSize);
143     UNREFERENCED_PARAMETER(lpBytesReturned);
144     return E_NOTIMPL;
145 }
146 
147 _Must_inspect_result_
148 HRESULT
149 WINAPI
150 FilterGetMessage(_In_ HANDLE hPort,
151                  _Out_writes_bytes_(dwMessageBufferSize) PFILTER_MESSAGE_HEADER lpMessageBuffer,
152                  _In_ DWORD dwMessageBufferSize,
153                  _Inout_opt_ LPOVERLAPPED lpOverlapped)
154 {
155     UNREFERENCED_PARAMETER(hPort);
156     UNREFERENCED_PARAMETER(lpMessageBuffer);
157     UNREFERENCED_PARAMETER(dwMessageBufferSize);
158     UNREFERENCED_PARAMETER(lpOverlapped);
159     return E_NOTIMPL;
160 }
161 
162 _Must_inspect_result_
163 HRESULT
164 WINAPI
165 FilterReplyMessage(_In_ HANDLE hPort,
166                    _In_reads_bytes_(dwReplyBufferSize) PFILTER_REPLY_HEADER lpReplyBuffer,
167                    _In_ DWORD dwReplyBufferSize)
168 {
169     UNREFERENCED_PARAMETER(hPort);
170     UNREFERENCED_PARAMETER(lpReplyBuffer);
171     UNREFERENCED_PARAMETER(dwReplyBufferSize);
172     return E_NOTIMPL;
173 }
174