mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 20:35:43 +00:00
[FLTLIB]
- Implement FilterConnectCommunicationPort - Add the remaining IOCTLs fltlib sends to the fltmgr svn path=/trunk/; revision=74583
This commit is contained in:
parent
e53736f6e0
commit
4baf3f8e4f
8 changed files with 227 additions and 78 deletions
|
@ -9,11 +9,13 @@ include_directories(
|
|||
|
||||
list(APPEND SOURCE
|
||||
fltlib.c
|
||||
message.c
|
||||
stubs.c
|
||||
${CMAKE_CURRENT_BINARY_DIR}/fltlib.def)
|
||||
|
||||
add_library(fltlib SHARED ${SOURCE} rsrc.rc)
|
||||
set_module_type(fltlib win32dll)
|
||||
target_link_libraries(fltlib wine)
|
||||
add_target_compile_definitions(fltlib NTDDI_VERSION=NTDDI_WS03SP1)
|
||||
add_importlibs(fltlib msvcrt kernel32 ntdll)
|
||||
add_cd_file(TARGET fltlib DESTINATION reactos/system32 FOR all)
|
||||
|
|
|
@ -60,6 +60,18 @@ FilterUnload(_In_ LPCWSTR lpFilterName)
|
|||
|
||||
/* PRIVATE FUNCTIONS ****************************************************************/
|
||||
|
||||
HRESULT
|
||||
NtStatusToHResult(_In_ NTSTATUS Status)
|
||||
{
|
||||
HRESULT hr;
|
||||
hr = RtlNtStatusToDosError(Status);
|
||||
if (hr != ERROR_SUCCESS)
|
||||
{
|
||||
hr = (ULONG)hr | 0x80070000;
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
static
|
||||
HRESULT
|
||||
FilterLoadUnload(_In_z_ LPCWSTR lpFilterName,
|
||||
|
@ -103,7 +115,7 @@ FilterLoadUnload(_In_z_ LPCWSTR lpFilterName,
|
|||
|
||||
/* Tell the filter manager to load the filter for us */
|
||||
dwError = SendIoctl(hFltMgr,
|
||||
Load ? IOCTL_LOAD_FILTER : IOCTL_UNLOAD_FILTER,
|
||||
Load ? IOCTL_FILTER_LOAD : IOCTL_FILTER_UNLOAD,
|
||||
FilterName,
|
||||
BufferLength);
|
||||
|
||||
|
|
6
reactos/dll/win32/fltlib/fltlib.h
Normal file
6
reactos/dll/win32/fltlib/fltlib.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
HRESULT
|
||||
NtStatusToHResult(
|
||||
_In_ NTSTATUS Status
|
||||
);
|
180
reactos/dll/win32/fltlib/message.c
Normal file
180
reactos/dll/win32/fltlib/message.c
Normal file
|
@ -0,0 +1,180 @@
|
|||
/*
|
||||
* PROJECT: Filesystem Filter Manager library
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: dll/win32/fltlib/message.c
|
||||
* PURPOSE: Handles messaging to and from the filter manager
|
||||
* PROGRAMMERS: Ged Murphy (ged.murphy@reactos.org)
|
||||
*/
|
||||
|
||||
//#include <stdarg.h>
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
|
||||
#define NTOS_MODE_USER
|
||||
#include <ndk/iofuncs.h>
|
||||
#include <ndk/obfuncs.h>
|
||||
#include <ndk/rtlfuncs.h>
|
||||
|
||||
#include "fltuser.h"
|
||||
#include "fltlib.h"
|
||||
#include <fltmgr_shared.h>
|
||||
|
||||
#include "wine/debug.h"
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(fltlib);
|
||||
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
FilterConnectCommunicationPort(_In_ LPCWSTR lpPortName,
|
||||
_In_ DWORD dwOptions,
|
||||
_In_reads_bytes_opt_(wSizeOfContext) LPCVOID lpContext,
|
||||
_In_ WORD wSizeOfContext,
|
||||
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||
_Outptr_ HANDLE *hPort)
|
||||
{
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
PFILTER_PORT_DATA PortData;
|
||||
UNICODE_STRING DeviceName;
|
||||
UNICODE_STRING PortName;
|
||||
HANDLE FileHandle;
|
||||
ULONG PortNameSize;
|
||||
ULONG BufferSize;
|
||||
PCHAR Ptr;
|
||||
NTSTATUS Status;
|
||||
HRESULT hr;
|
||||
|
||||
*hPort = INVALID_HANDLE_VALUE;
|
||||
|
||||
/* Sanity check */
|
||||
if (lpContext && wSizeOfContext == 0)
|
||||
{
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
/* Get the length of the port name */
|
||||
PortNameSize = wcslen(lpPortName) * sizeof(WCHAR);
|
||||
|
||||
/* Calculate and allocate the size of the required buffer */
|
||||
BufferSize = sizeof(FILTER_PORT_DATA) + PortNameSize + wSizeOfContext;
|
||||
PortData = RtlAllocateHeap(GetProcessHeap(), 0, BufferSize);
|
||||
if (PortData == NULL) return E_OUTOFMEMORY;
|
||||
|
||||
/* Clear out the buffer and find the end of the fixed struct */
|
||||
RtlZeroMemory(PortData, BufferSize);
|
||||
Ptr = (PCHAR)(PortData + 1);
|
||||
|
||||
PortData->Size = BufferSize;
|
||||
PortData->Options = dwOptions;
|
||||
|
||||
/* Setup the port name */
|
||||
RtlInitUnicodeString(&PortName, lpPortName);
|
||||
PortData->PortName.Buffer = (PWCH)Ptr;
|
||||
PortData->PortName.MaximumLength = PortNameSize;
|
||||
RtlCopyUnicodeString(&PortData->PortName, &PortName);
|
||||
Ptr += PortData->PortName.Length;
|
||||
|
||||
/* Check if we were given a context */
|
||||
if (lpContext)
|
||||
{
|
||||
/* Add that into the buffer too */
|
||||
PortData->Context = Ptr;
|
||||
RtlCopyMemory(PortData->Context, lpContext, wSizeOfContext);
|
||||
}
|
||||
|
||||
/* Initialize the object attributes */
|
||||
RtlInitUnicodeString(&DeviceName, L"\\Global??\\FltMgrMsg");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&DeviceName,
|
||||
OBJ_EXCLUSIVE | OBJ_CASE_INSENSITIVE,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
/* Check if we were passed any security attributes */
|
||||
if (lpSecurityAttributes)
|
||||
{
|
||||
/* Add these manually and update the flags if we were asked to make it inheritable */
|
||||
ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
|
||||
if (lpSecurityAttributes->bInheritHandle)
|
||||
{
|
||||
ObjectAttributes.Attributes |= OBJ_INHERIT;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now get a handle to the device */
|
||||
Status = NtCreateFile(&FileHandle,
|
||||
SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA,
|
||||
&ObjectAttributes,
|
||||
&IoStatusBlock,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
FILE_OPEN_IF,
|
||||
0,
|
||||
PortData,
|
||||
BufferSize);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
*hPort = FileHandle;
|
||||
hr = S_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = NtStatusToHResult(Status);
|
||||
}
|
||||
|
||||
/* Cleanup and return */
|
||||
RtlFreeHeap(GetProcessHeap(), 0, PortData);
|
||||
return hr;
|
||||
}
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
FilterSendMessage(_In_ HANDLE hPort,
|
||||
_In_reads_bytes_(dwInBufferSize) LPVOID lpInBuffer,
|
||||
_In_ DWORD dwInBufferSize,
|
||||
_Out_writes_bytes_to_opt_(dwOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer,
|
||||
_In_ DWORD dwOutBufferSize,
|
||||
_Out_ LPDWORD lpBytesReturned)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(hPort);
|
||||
UNREFERENCED_PARAMETER(lpInBuffer);
|
||||
UNREFERENCED_PARAMETER(dwInBufferSize);
|
||||
UNREFERENCED_PARAMETER(lpOutBuffer);
|
||||
UNREFERENCED_PARAMETER(dwOutBufferSize);
|
||||
UNREFERENCED_PARAMETER(lpBytesReturned);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
FilterGetMessage(_In_ HANDLE hPort,
|
||||
_Out_writes_bytes_(dwMessageBufferSize) PFILTER_MESSAGE_HEADER lpMessageBuffer,
|
||||
_In_ DWORD dwMessageBufferSize,
|
||||
_Inout_opt_ LPOVERLAPPED lpOverlapped)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(hPort);
|
||||
UNREFERENCED_PARAMETER(lpMessageBuffer);
|
||||
UNREFERENCED_PARAMETER(dwMessageBufferSize);
|
||||
UNREFERENCED_PARAMETER(lpOverlapped);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
FilterReplyMessage(_In_ HANDLE hPort,
|
||||
_In_reads_bytes_(dwReplyBufferSize) PFILTER_REPLY_HEADER lpReplyBuffer,
|
||||
_In_ DWORD dwReplyBufferSize)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(hPort);
|
||||
UNREFERENCED_PARAMETER(lpReplyBuffer);
|
||||
UNREFERENCED_PARAMETER(dwReplyBufferSize);
|
||||
return E_NOTIMPL;
|
||||
}
|
|
@ -6,10 +6,6 @@
|
|||
* PROGRAMMERS: Ged Murphy (ged.murphy@reactos.org)
|
||||
*/
|
||||
|
||||
// Hack - our SDK reports NTDDI_VERSION as 0x05020100 (from _WIN32_WINNT 0x502)
|
||||
// which doesn't pass the FLT_MGR_BASELINE check in fltkernel.h
|
||||
#define NTDDI_VERSION NTDDI_WS03SP1
|
||||
|
||||
#include <stdarg.h>
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
|
@ -322,73 +318,6 @@ FilterInstanceGetInformation(_In_ HFILTER_INSTANCE hInstance,
|
|||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
FilterConnectCommunicationPort(_In_ LPCWSTR lpPortName,
|
||||
_In_ DWORD dwOptions,
|
||||
_In_reads_bytes_opt_(wSizeOfContext) LPCVOID lpContext,
|
||||
_In_ WORD wSizeOfContext,
|
||||
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||
_Outptr_ HANDLE *hPort)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(lpPortName);
|
||||
UNREFERENCED_PARAMETER(dwOptions);
|
||||
UNREFERENCED_PARAMETER(lpContext);
|
||||
UNREFERENCED_PARAMETER(wSizeOfContext);
|
||||
UNREFERENCED_PARAMETER(lpSecurityAttributes);
|
||||
UNREFERENCED_PARAMETER(hPort);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
FilterSendMessage(_In_ HANDLE hPort,
|
||||
_In_reads_bytes_(dwInBufferSize) LPVOID lpInBuffer,
|
||||
_In_ DWORD dwInBufferSize,
|
||||
_Out_writes_bytes_to_opt_(dwOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer,
|
||||
_In_ DWORD dwOutBufferSize,
|
||||
_Out_ LPDWORD lpBytesReturned)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(hPort);
|
||||
UNREFERENCED_PARAMETER(lpInBuffer);
|
||||
UNREFERENCED_PARAMETER(dwInBufferSize);
|
||||
UNREFERENCED_PARAMETER(lpOutBuffer);
|
||||
UNREFERENCED_PARAMETER(dwOutBufferSize);
|
||||
UNREFERENCED_PARAMETER(lpBytesReturned);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
FilterGetMessage(_In_ HANDLE hPort,
|
||||
_Out_writes_bytes_(dwMessageBufferSize) PFILTER_MESSAGE_HEADER lpMessageBuffer,
|
||||
_In_ DWORD dwMessageBufferSize,
|
||||
_Inout_opt_ LPOVERLAPPED lpOverlapped)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(hPort);
|
||||
UNREFERENCED_PARAMETER(lpMessageBuffer);
|
||||
UNREFERENCED_PARAMETER(dwMessageBufferSize);
|
||||
UNREFERENCED_PARAMETER(lpOverlapped);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
FilterReplyMessage(_In_ HANDLE hPort,
|
||||
_In_reads_bytes_(dwReplyBufferSize) PFILTER_REPLY_HEADER lpReplyBuffer,
|
||||
_In_ DWORD dwReplyBufferSize)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(hPort);
|
||||
UNREFERENCED_PARAMETER(lpReplyBuffer);
|
||||
UNREFERENCED_PARAMETER(dwReplyBufferSize);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
_Must_inspect_result_
|
||||
HRESULT
|
||||
WINAPI
|
||||
|
|
|
@ -35,7 +35,9 @@
|
|||
|
||||
typedef HANDLE HFILTER, HFILTER_INSTANCE, HFILTER_VOLUME;
|
||||
|
||||
#ifndef _NTDEF_H
|
||||
typedef _Return_type_success_(return >= 0) LONG NTSTATUS, *PNTSTATUS;
|
||||
#endif
|
||||
|
||||
/* Known File System Types */
|
||||
|
||||
|
|
|
@ -946,6 +946,7 @@ extern "C" {
|
|||
#define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L)
|
||||
#define STATUS_CALLBACK_POP_STACK ((NTSTATUS)0xC0000423)
|
||||
#define STATUS_ELEVATION_REQUIRED ((NTSTATUS)0xC000042C)
|
||||
#define STATUS_ALREADY_REGISTERED ((NTSTATUS)0xC0000718)
|
||||
#define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898)
|
||||
#define STATUS_INVALID_SIGNATURE ((NTSTATUS)0xC000A000)
|
||||
#define STATUS_HMAC_NOT_SUPPORTED ((NTSTATUS)0xC000A001)
|
||||
|
|
|
@ -1,11 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
#define IOCTL_LOAD_FILTER CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x01, 0, FILE_WRITE_DATA) //88004
|
||||
#define IOCTL_UNLOAD_FILTER CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x02, 0, FILE_WRITE_DATA) //88008
|
||||
#define IOCTL_INIT_FIND CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x03, 0, FILE_READ_DATA) //8400C
|
||||
|
||||
//84024 find first
|
||||
//84028 find next
|
||||
#define IOCTL_FILTER_LOAD CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x01, METHOD_BUFFERED, FILE_WRITE_DATA) //88004
|
||||
#define IOCTL_FILTER_UNLOAD CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x02, METHOD_BUFFERED, FILE_WRITE_DATA) //88008
|
||||
#define IOCTL_FILTER_CREATE CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x03, METHOD_BUFFERED, FILE_READ_DATA) //8400C
|
||||
#define IOCTL_FILTER_ATTATCH CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x04, METHOD_BUFFERED, FILE_WRITE_DATA) //88010
|
||||
#define IOCTL_FILTER_DETATCH CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x05, METHOD_BUFFERED, FILE_WRITE_DATA) //88014
|
||||
#define IOCTL_FILTER_SEND_MESSAGE CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x06, METHOD_NEITHER, FILE_WRITE_DATA) //8801B
|
||||
#define IOCTL_FILTER_GET_MESSAGE CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x07, METHOD_NEITHER, FILE_READ_DATA) //8401F
|
||||
#define IOCTL_FILTER_REPLY_MESSAGE CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x08, METHOD_NEITHER, FILE_WRITE_DATA) //88023
|
||||
#define IOCTL_FILTER_FIND_FIRST CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x09, METHOD_BUFFERED, FILE_READ_DATA) //84024
|
||||
#define IOCTL_FILTER_FIND_NEXT CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x0A, METHOD_BUFFERED, FILE_READ_DATA) //84028
|
||||
#define IOCTL_FILTER_GET_INFO CTL_CODE(FILE_DEVICE_DISK_FILE_SYSTEM, 0x0B, METHOD_BUFFERED, FILE_READ_DATA) //8402C
|
||||
|
||||
|
||||
typedef struct _FILTER_NAME
|
||||
|
@ -14,3 +19,15 @@ typedef struct _FILTER_NAME
|
|||
WCHAR FilterName[1];
|
||||
|
||||
} FILTER_NAME, *PFILTER_NAME;
|
||||
|
||||
|
||||
|
||||
typedef struct _FILTER_PORT_DATA
|
||||
{
|
||||
ULONG Size;
|
||||
UNICODE_STRING PortName;
|
||||
ULONG Options;
|
||||
PVOID Context;
|
||||
ULONG ContextSize;
|
||||
|
||||
} FILTER_PORT_DATA, *PFILTER_PORT_DATA;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue