/* Editor Settings: expandtabs and use 4 spaces for indentation * ex: set softtabstop=4 tabstop=8 expandtab shiftwidth=4: * * -*- mode: c, c-basic-offset: 4 -*- */ /* * Copyright Likewise Software * All rights reserved. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the license, or (at * your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. You should have received a copy * of the GNU Lesser General Public License along with this program. If * not, see . * * LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING * TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT * WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE * TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU * LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU * HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING * TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT * license@likewisesoftware.com */ /* * Copyright (C) Likewise Software. All rights reserved. * * Module Name: * * ntipcmsg.h * * Abstract: * * NT lwmsg IPC * * Authors: Danilo Almeida (dalmeida@likewisesoftware.com) */ #ifndef __NT_IPC_MSG_H__ #define __NT_IPC_MSG_H__ #include #include "lwiodef.h" #include "lwioipc.h" #include // TODO-Add async completion support. // TODO-Add check in lwmsg to check for protocol tags > 16 bits. // Apparently, the server crashed if you do that. #define _NT_IPC_MESSAGE_TYPE_BASE 20 // // Protocol Message Types // // The message types map to message structures like this: // // NT_IPC_MESSAGE_TYPE_ --> NT_IPC_MESSAGE_ // // Any exceptions have a comment with the corresponding structure type. // typedef enum _NT_IPC_MESSAGE_TYPE { NT_IPC_MESSAGE_TYPE_CREATE_FILE = _NT_IPC_MESSAGE_TYPE_BASE, NT_IPC_MESSAGE_TYPE_CREATE_FILE_RESULT, NT_IPC_MESSAGE_TYPE_CLOSE_FILE, // NT_IPC_MESSAGE_GENERIC_FILE NT_IPC_MESSAGE_TYPE_CLOSE_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT NT_IPC_MESSAGE_TYPE_READ_FILE, NT_IPC_MESSAGE_TYPE_READ_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT NT_IPC_MESSAGE_TYPE_WRITE_FILE, NT_IPC_MESSAGE_TYPE_WRITE_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT NT_IPC_MESSAGE_TYPE_DEVICE_IO_CONTROL_FILE, // NT_IPC_MESSAGE_GENERIC_CONTROL_FILE NT_IPC_MESSAGE_TYPE_DEVICE_IO_CONTROL_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT NT_IPC_MESSAGE_TYPE_FS_CONTROL_FILE, // NT_IPC_MESSAGE_GENERIC_CONTROL_FILE NT_IPC_MESSAGE_TYPE_FS_CONTROL_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT NT_IPC_MESSAGE_TYPE_FLUSH_BUFFERS_FILE, // NT_IPC_MESSAGE_GENERIC_FILE NT_IPC_MESSAGE_TYPE_FLUSH_BUFFERS_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT NT_IPC_MESSAGE_TYPE_QUERY_INFORMATION_FILE, NT_IPC_MESSAGE_TYPE_QUERY_INFORMATION_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT NT_IPC_MESSAGE_TYPE_SET_INFORMATION_FILE, NT_IPC_MESSAGE_TYPE_SET_INFORMATION_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT NT_IPC_MESSAGE_TYPE_QUERY_DIRECTORY_FILE, NT_IPC_MESSAGE_TYPE_QUERY_DIRECTORY_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT NT_IPC_MESSAGE_TYPE_READ_DIRECTORY_CHANGE_FILE, NT_IPC_MESSAGE_TYPE_READ_DIRECTORY_CHANGE_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT NT_IPC_MESSAGE_TYPE_QUERY_FS_INFORMATION_FILE, NT_IPC_MESSAGE_TYPE_QUERY_FS_INFORMATION_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT NT_IPC_MESSAGE_TYPE_QUERY_VOLUME_INFORMATION_FILE, NT_IPC_MESSAGE_TYPE_QUERY_VOLUME_INFORMATION_FILE_RESULT, // NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT NT_IPC_MESSAGE_TYPE_LOCK_FILE, NT_IPC_MESSAGE_TYPE_LOCK_FILE_RESULT, NT_IPC_MESSAGE_TYPE_UNLOCK_FILE, NT_IPC_MESSAGE_TYPE_UNLOCK_FILE_RESULT, NT_IPC_MESSAGE_TYPE_QUERY_SECURITY_FILE, NT_IPC_MESSAGE_TYPE_QUERY_SECURITY_FILE_RESULT, NT_IPC_MESSAGE_TYPE_SET_SECURITY_FILE, NT_IPC_MESSAGE_TYPE_SET_SECURITY_FILE_RESULT } NT_IPC_MESSAGE_TYPE, *PNT_IPC_MESSAGE_TYPE; // // Protocol Helper Types // typedef struct _NT_IPC_HELPER_ECP { IN PCSTR pszType; IN PVOID pData; IN ULONG Size; } NT_IPC_HELPER_ECP, *PNT_IPC_HELPER_ECP; // // Protocol Messages // typedef struct _NT_IPC_MESSAGE_GENERIC_FILE { IN IO_FILE_HANDLE FileHandle; } NT_IPC_MESSAGE_GENERIC_FILE, *PNT_IPC_MESSAGE_GENERIC_FILE; typedef struct _NT_IPC_MESSAGE_GENERIC_CONTROL_FILE { IN IO_FILE_HANDLE FileHandle; IN ULONG ControlCode; IN PVOID InputBuffer; IN ULONG InputBufferLength; IN ULONG OutputBufferLength; } NT_IPC_MESSAGE_GENERIC_CONTROL_FILE, *PNT_IPC_MESSAGE_GENERIC_CONTROL_FILE; typedef struct _NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT { // From IO_STATUS_BLOCK (which uses context-based union): OUT NTSTATUS Status; OUT ULONG BytesTransferred; } NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT, *PNT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT; typedef struct _NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT { // Break up IO_STATUS_BLOCK into Status and BytesTransferred so that the // IPC marshaling layer can use BytesTransferred for the length of Buffer. // From IO_STATUS_BLOCK (which uses context-based union): OUT NTSTATUS Status; OUT ULONG BytesTransferred; // Length is BytesTransferred. OUT PVOID Buffer; } NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT, *PNT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT; // // NtCreateFile // // IN TAG: NT_IPC_MESSAGE_TYPE_CREATE_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_CREATE_FILE_RESULT // // IN: NT_IPC_MESSAGE_CREATE_FILE // OUT: NT_IPC_MESSAGE_CREATE_FILE_RESULT // typedef struct _NT_IPC_MESSAGE_CREATE_FILE { IN PIO_CREDS pSecurityToken; IN IO_FILE_NAME FileName; IN ACCESS_MASK DesiredAccess; IN OPTIONAL LONG64 AllocationSize; IN FILE_ATTRIBUTES FileAttributes; IN FILE_SHARE_FLAGS ShareAccess; IN FILE_CREATE_DISPOSITION CreateDisposition; IN FILE_CREATE_OPTIONS CreateOptions; IN OPTIONAL PVOID EaBuffer; // FILE_FULL_EA_INFORMATION IN ULONG EaLength; // TODO -- Add stuff for SDs, etc. #if 0 IN OPTIONAL PVOID SecurityDescriptor; // TBD IN OPTIONAL PVOID SecurityQualityOfService; // TBD #endif IN OPTIONAL PNT_IPC_HELPER_ECP EcpList; IN ULONG EcpCount; } NT_IPC_MESSAGE_CREATE_FILE, *PNT_IPC_MESSAGE_CREATE_FILE; typedef struct _NT_IPC_MESSAGE_CREATE_FILE_RESULT { OUT IO_FILE_HANDLE FileHandle; // From IO_STATUS_BLOCK (which uses context-based union): OUT NTSTATUS Status; OUT FILE_CREATE_RESULT CreateResult; } NT_IPC_MESSAGE_CREATE_FILE_RESULT, *PNT_IPC_MESSAGE_CREATE_FILE_RESULT; // // NtCloseFile // // IN TAG: NT_IPC_MESSAGE_TYPE_CLOSE_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_CLOSE_FILE_RESULT // // IN: NT_IPC_MESSAGE_GENERIC_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT // // // NtReadFile // // IN TAG: NT_IPC_MESSAGE_TYPE_READ_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_READ_FILE_RESULT // // IN: NT_IPC_MESSAGE_READ_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT // typedef struct _NT_IPC_MESSAGE_READ_FILE { IN IO_FILE_HANDLE FileHandle; IN ULONG Length; IN OPTIONAL PLONG64 ByteOffset; IN OPTIONAL PULONG Key; } NT_IPC_MESSAGE_READ_FILE, *PNT_IPC_MESSAGE_READ_FILE; // // NtWriteFile // // IN TAG: NT_IPC_MESSAGE_TYPE_WRITE_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_WRITE_FILE_RESULT // // IN: NT_IPC_MESSAGE_READ_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT // typedef struct _NT_IPC_MESSAGE_WRITE_FILE { IN IO_FILE_HANDLE FileHandle; IN PVOID Buffer; IN ULONG Length; IN OPTIONAL PLONG64 ByteOffset; IN OPTIONAL PULONG Key; } NT_IPC_MESSAGE_WRITE_FILE, *PNT_IPC_MESSAGE_WRITE_FILE; // // NtDeviceIoControlFile // // IN TAG: NT_IPC_MESSAGE_TYPE_DEVICE_IO_CONTROL_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_DEVICE_IO_CONTROL_FILE_RESULT // // IN: NT_IPC_MESSAGE_GENERIC_CONTROL_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT // // // NtFsControlFile // // IN TAG: NT_IPC_MESSAGE_TYPE_FS_CONTROL_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_FS_CONTROL_FILE_RESULT // // IN: NT_IPC_MESSAGE_GENERIC_CONTROL_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT // // // NtFlushBuffersFile // // IN TAG: NT_IPC_MESSAGE_TYPE_FLUSH_BUFFERS_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_FLUSH_BUFFERS_FILE_RESULT // // IN: NT_IPC_MESSAGE_GENERIC_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT // // // NtQueryInformationFile // // IN TAG: NT_IPC_MESSAGE_TYPE_QUERY_INFORMATION_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_QUERY_INFORMATION_FILE_RESULT // // IN: NT_IPC_MESSAGE_QUERY_INFORMATION_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT // typedef struct _NT_IPC_MESSAGE_QUERY_INFORMATION_FILE { IN IO_FILE_HANDLE FileHandle; IN ULONG Length; IN FILE_INFORMATION_CLASS FileInformationClass; } NT_IPC_MESSAGE_QUERY_INFORMATION_FILE, *PNT_IPC_MESSAGE_QUERY_INFORMATION_FILE; // // NtSetInformationFile // // IN TAG: NT_IPC_MESSAGE_TYPE_SET_INFORMATION_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_SET_INFORMATION_FILE_RESULT // // IN: NT_IPC_MESSAGE_SET_INFORMATION_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT // typedef struct _NT_IPC_MESSAGE_SET_INFORMATION_FILE { IN IO_FILE_HANDLE FileHandle; IN PVOID FileInformation; IN ULONG Length; IN FILE_INFORMATION_CLASS FileInformationClass; } NT_IPC_MESSAGE_SET_INFORMATION_FILE, *PNT_IPC_MESSAGE_SET_INFORMATION_FILE; // // NtQueryDirectoryFile // // IN TAG: NT_IPC_MESSAGE_TYPE_QUERY_DIRECTORY_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_QUERY_DIRECTORY_FILE_RESULT // // IN: NT_IPC_MESSAGE_QUERY_DIRECTORY_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT // typedef struct _NT_IPC_MESSAGE_QUERY_DIRECTORY_FILE { IN IO_FILE_HANDLE FileHandle; IN ULONG Length; IN FILE_INFORMATION_CLASS FileInformationClass; IN BOOLEAN ReturnSingleEntry; IN OPTIONAL PIO_MATCH_FILE_SPEC FileSpec; IN BOOLEAN RestartScan; } NT_IPC_MESSAGE_QUERY_DIRECTORY_FILE, *PNT_IPC_MESSAGE_QUERY_DIRECTORY_FILE; // // NtReadDirectoryChangeFile // // IN TAG: NT_IPC_MESSAGE_TYPE_READ_DIRECTORY_CHANGE_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_READ_DIRECTORY_CHANGE_FILE_RESULT // // IN: NT_IPC_MESSAGE_READ_DIRECTORY_CHANGE_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT // typedef struct _NT_IPC_MESSAGE_READ_DIRECTORY_CHANGE_FILE { IN IO_FILE_HANDLE FileHandle; OUT PVOID Buffer; IN ULONG Length; IN BOOLEAN WatchTree; IN ULONG NotifyFilter; IN OPTIONAL PULONG MaxBufferSize; } NT_IPC_MESSAGE_READ_DIRECTORY_CHANGE_FILE, *PNT_IPC_MESSAGE_READ_DIRECTORY_CHANGE_FILE; // // NtQueryVolumeInformation // // IN TAG: NT_IPC_MESSAGE_TYPE_QUERY_VOLUME_INFORMATION_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_QUERY_VOLUME_INFORMATION_FILE_RESULT // // IN: NT_IPC_MESSAGE_QUERY_VOLUME_INFORMATION_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_BUFFER_RESULT // typedef struct _NT_IPC_MESSAGE_QUERY_VOLUME_INFORMATION_FILE { IN IO_FILE_HANDLE FileHandle; IN ULONG Length; IN FILE_INFORMATION_CLASS FsInformationClass; } NT_IPC_MESSAGE_QUERY_VOLUME_INFORMATION_FILE, *PNT_IPC_MESSAGE_QUERY_VOLUME_INFORMATION_FILE; // // NtLockFile // // IN TAG: NT_IPC_MESSAGE_TYPE_LOCK_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_LOCK_FILE_RESULT // // IN: NT_IPC_MESSAGE_LOCK_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT // typedef struct _NT_IPC_MESSAGE_LOCK_FILE { IN IO_FILE_HANDLE FileHandle; IN LONG64 ByteOffset; IN LONG64 Length; IN ULONG Key; BOOLEAN FailImmediately; BOOLEAN ExclusiveLock; } NT_IPC_MESSAGE_LOCK_FILE, *PNT_IPC_MESSAGE_LOCK_FILE; // // NtUnlockFile // // IN TAG: NT_IPC_MESSAGE_TYPE_UNLOCK_FILE // OUT TAG: NT_IPC_MESSAGE_TYPE_UNLOCK_FILE_RESULT // // IN: NT_IPC_MESSAGE_UNLOCK_FILE // OUT: NT_IPC_MESSAGE_GENERIC_FILE_IO_RESULT // typedef struct _NT_IPC_MESSAGE_UNLOCK_FILE { IN IO_FILE_HANDLE FileHandle; IN LONG64 ByteOffset; IN LONG64 Length; IN ULONG Key; } NT_IPC_MESSAGE_UNLOCK_FILE, *PNT_IPC_MESSAGE_UNLOCK_FILE; typedef struct _NT_IPC_MESSAGE_QUERY_SECURITY_FILE { IN IO_FILE_HANDLE FileHandle; IN SECURITY_INFORMATION SecurityInformation; IN ULONG Length; } NT_IPC_MESSAGE_QUERY_SECURITY_FILE, *PNT_IPC_MESSAGE_QUERY_SECURITY_FILE; typedef struct _NT_IPC_MESSAGE_SET_SECURITY_FILE { IN IO_FILE_HANDLE FileHandle; IN SECURITY_INFORMATION SecurityInformation; IN PSECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor; IN ULONG Length; } NT_IPC_MESSAGE_SET_SECURITY_FILE, *PNT_IPC_MESSAGE_SET_SECURITY_FILE; // // Functions // NTSTATUS NtIpcLWMsgStatusToNtStatus( IN LWMsgStatus LwMsgStatus ); LWMsgStatus NtIpcNtStatusToLWMsgStatus( IN NTSTATUS Status ); NTSTATUS NtIpcAddProtocolSpec( IN OUT LWMsgProtocol* pProtocol ); NTSTATUS NtIpcAddProtocolSpecEx( IN OUT LWMsgProtocol* pProtocol, OUT OPTIONAL PCSTR* ppszError ); NTSTATUS NtIpcUnregisterFileHandle( IN LWMsgCall* pCall, IN IO_FILE_HANDLE FileHandle ); #endif /* __NT_IPC_MSG_H__ */ /* local variables: mode: c c-basic-offset: 4 indent-tabs-mode: nil tab-width: 4 end: */