25 _In_ PFLT_PORT ClientPort,
26 _In_ PVOID ServerPortCookie,
28 _In_ ULONG SizeOfContext,
29 _Outptr_result_maybenull_ PVOID *ConnectionCookie
34 _In_opt_ PVOID ConnectionCookie
39 _In_ PVOID ConnectionCookie,
40 _In_reads_bytes_opt_(InputBufferSize) PVOID InputBuffer,
41 _In_ ULONG InputBufferSize,
42 _Out_writes_bytes_to_opt_(OutputBufferSize,*ReturnOutputBufferLength) PVOID OutputBuffer,
43 _In_ ULONG OutputBufferSize,
44 _Out_ PULONG ReturnOutputBufferLength
59 _In_ PFLT_VOLUME volumeObject,
85 _Out_ PHANDLE SectionHandle
95 #pragma alloc_text(PAGE, AvMessageNotifyCallback) 96 #pragma alloc_text(PAGE, AvConnectNotifyCallback) 97 #pragma alloc_text(PAGE, AvDisconnectNotifyCallback) 98 #pragma alloc_text(PAGE, AvPrepareServerPort) 100 #pragma alloc_text(PAGE, AvGetInstanceContextByVolume) 101 #pragma alloc_text(PAGE, AvGetInstanceContextByFileHandle) 102 #pragma alloc_text(PAGE, AvGetStreamContextByHandle) 103 #pragma alloc_text(PAGE, AvUpdateStreamContextWithScanResult) 104 #pragma alloc_text(PAGE, AvFinalizeScanAndSection) 105 #pragma alloc_text(PAGE, AvFinalizeScanContext) 106 #pragma alloc_text(PAGE, AvFinalizeSectionContext) 107 #pragma alloc_text(PAGE, AvHandleCmdCreateSectionForDataScan) 108 #pragma alloc_text(PAGE, AvHandleCmdCloseSectionForDataScan) 113 _In_ PFLT_PORT ClientPort,
114 _In_ PVOID ServerPortCookie,
116 _In_ ULONG SizeOfContext,
117 _Outptr_result_maybenull_ PVOID *ConnectionCookie
154 if (
NULL == connectionCtx) {
156 return STATUS_INVALID_PARAMETER_3;
163 connectionCookie = ExAllocatePoolWithTag( PagedPool,
166 if (
NULL == connectionCookie) {
168 return STATUS_INSUFFICIENT_RESOURCES;
171 *connectionCookie = connectionCtx->
Type;
172 switch (connectionCtx->
Type) {
175 *ConnectionCookie = connectionCookie;
179 *ConnectionCookie = connectionCookie;
183 *ConnectionCookie = connectionCookie;
187 (
"[AV]: AvConnectNotifyCallback: No such connection type. \n") );
188 ExFreePoolWithTag( connectionCookie,
190 *ConnectionCookie =
NULL;
191 return STATUS_INVALID_PARAMETER_3;
195 (
"[AV]: AvConnectNotifyCallback entered. type: %d \n", connectionCtx->
Type) );
197 return STATUS_SUCCESS;
202 _In_opt_ PVOID ConnectionCookie
224 if (
NULL == connectionType) {
231 switch (*connectionType) {
246 (
"[AV]: AvDisconnectNotifyCallback: No such connection type. \n") );
251 (
"[AV]: AvDisconnectNotifyCallback entered. type: %d \n", *connectionType) );
253 ExFreePoolWithTag( connectionType,
260 _In_ LONGLONG ScanId,
283 NTSTATUS status = STATUS_SUCCESS;
284 BOOLEAN found = FALSE;
295 link = link->Flink) {
299 if (scanCtx->
ScanId == ScanId) {
312 return STATUS_SUCCESS;
316 (
"[AV] AvGetScanCtxSynchronized: scan context not found. \n") );
320 if (NT_SUCCESS( status )){
322 status = STATUS_UNSUCCESSFUL;
330 _In_ PFLT_VOLUME VolumeObject,
354 NTSTATUS status = STATUS_SUCCESS;
355 BOOLEAN found = FALSE;
356 PFLT_INSTANCE *instArray =
NULL;
364 if ( !NT_SUCCESS(status) ) {
367 (
"[AV] AvGetInstanceContextByVolume: Failed to enumerate instances. \n") );
371 for (i = 0; i < instCnt; i++) {
373 status = FltGetInstanceContext( instArray[i], &instCtx );
375 if ( !NT_SUCCESS(status) ) {
378 (
"[AV] AvGetInstanceContextByVolume: Failed to get instance context. \n") );
382 if (instCtx->
Volume == VolumeObject) {
393 FltReleaseContext( instCtx );
401 *InstanceContext = instCtx;
402 return STATUS_SUCCESS;
406 (
"[AV] AvGetInstanceContextByVolume: instance context not found. \n") );
408 if ( NT_SUCCESS( status ) ){
410 status = STATUS_UNSUCCESSFUL;
443 NTSTATUS status = STATUS_SUCCESS;
444 PFILE_OBJECT fileObject =
NULL;
445 PFLT_VOLUME volumeObject =
NULL;
453 status = ObReferenceObjectByHandle (
458 (PVOID *)&fileObject,
461 if (!NT_SUCCESS(status)) {
464 (
"[AV] AvGetInstanceContextByFileHandle: Failed to get file object by handle. \n") );
474 if (!NT_SUCCESS(status)) {
476 (
"[AV] AvGetInstanceContextByFileHandle: Failed to get volume by file object. \n") );
482 FltObjectDereference( volumeObject );
486 ObDereferenceObject( fileObject );
520 PFILE_OBJECT fileObject =
NULL;
527 if (!NT_SUCCESS(status)) {
530 (
"[AV]: ***AvGetInstanceContextByFileHandle FAILED. \n") );
535 status = ObReferenceObjectByHandle (
540 (PVOID *)&fileObject,
543 if (!NT_SUCCESS(status)) {
546 (
"[AV] AvGetStreamContextByHandle: Failed to get file object by handle. \n") );
550 status = FltGetStreamContext( instanceContext->
Instance,
554 ObDereferenceObject( fileObject );
558 FltReleaseContext( instanceContext );
566 _Out_ PHANDLE SectionHandle
591 NTSTATUS status = STATUS_SUCCESS;
594 HANDLE sectionHandle =
NULL;
598 status = FltGetStreamContext ( ScanContext->FilterInstance,
599 ScanContext->FileObject,
602 if (!NT_SUCCESS( status )) {
605 (
"[AV] AvHandleCmdCreateSectionForDataScan: failed to get stream context.\n") );
618 ScanContext->FileObject,
621 if (!NT_SUCCESS( status )) {
624 (
"[AV] AvHandleCmdCreateSectionForDataScan: failed to create section context.\n") );
633 if (ScanContext->IoWaitOnScanCompleteNotificationAborted) {
635 status = STATUS_CANCELLED;
637 (
"[AV] AvHandleCmdCreateSectionForDataScan: Before FltCreateSectionForDataScan, it found Io is trying to abort the wait.\n") );
652 status = FltCreateSectionForDataScan( ScanContext->FilterInstance,
653 ScanContext->FileObject,
667 if (!NT_SUCCESS( status )) {
670 NTSTATUS sta = STATUS_SUCCESS;
671 PFLT_VOLUME volumeObject =
NULL;
673 UCHAR volPropBuffer[
sizeof(FLT_VOLUME_PROPERTIES)+256];
674 PFLT_VOLUME_PROPERTIES
property = (PFLT_VOLUME_PROPERTIES)volPropBuffer;
677 ScanContext->FileObject,
679 if (NT_SUCCESS( sta )) {
680 sta = FltGetVolumeProperties( volumeObject,
682 sizeof(volPropBuffer),
684 if (NT_SUCCESS( sta )) {
686 (
"[AV] ############## %wZ, %wZ, %wZ\n",
687 property->FileSystemDriverName,
688 property->FileSystemDeviceName,
689 property->RealDeviceName) );
691 FltObjectDereference( volumeObject );
695 (
"[AV] AvHandleCmdCreateSectionForDataScan: %I64x,%I64x failed to create section object. 0x%x\n",
717 FltReferenceContext( sectionContext );
718 ScanContext->SectionContext = sectionContext;
720 *SectionHandle = sectionHandle;
731 if (!NT_SUCCESS( status )) {
733 KeSetEvent( &ScanContext->ScanCompleteNotification, 0, FALSE );
744 if (!NT_SUCCESS( status )) {
749 FltReleaseContext( streamContext );
750 streamContext =
NULL;
753 if (sectionContext) {
755 FltReleaseContext( sectionContext );
756 sectionContext =
NULL;
765 if (NT_SUCCESS( status ) &&
766 ScanContext->IoWaitOnScanCompleteNotificationAborted) {
768 status = STATUS_CANCELLED;
770 (
"[AV] AvHandleCmdCreateSectionForDataScan: After FltCreateSectionForDataScan, it found Io is trying to abort the wait.\n") );
777 NtClose( sectionHandle );
817 NTSTATUS status = STATUS_SUCCESS;
821 switch( ScanResult ) {
825 (
"***[AV] AvUpdateScanResult: the caller did not specify the scan result.\n") );
839 if (ScanContext->IsFileInTxWriter) {
855 if (ScanContext->IsFileInTxWriter) {
866 FLT_ASSERTMSG(
"No such scan result.\n", FALSE);
895 NTSTATUS status = STATUS_SUCCESS;
905 if (sectionContext !=
NULL) {
945 *SectionContext =
NULL;
952 oldSectionCtx = InterlockedExchangePointer( &ScanContext->SectionContext,
NULL );
964 *SectionContext = oldSectionCtx;
971 KeSetEvent( &ScanContext->ScanCompleteNotification, 0, FALSE );
996 NTSTATUS status = STATUS_SUCCESS;
1002 if (!NT_SUCCESS(status)) {
1005 (
"***[AV]: AvFinalizeSectionContext: Close section failed.\n") );
1007 FltReleaseContext( SectionContext );
1039 NTSTATUS status = STATUS_SUCCESS;
1044 status = FltGetStreamContext ( ScanContext->FilterInstance,
1045 ScanContext->FileObject,
1048 if (!NT_SUCCESS( status )) {
1051 (
"***[AV] AvHandleCmdCloseSectionForDataScan: failed to get stream context.\n") );
1070 if ( streamContext ) {
1072 FltReleaseContext( streamContext );
1081 _In_ PVOID ConnectionCookie,
1082 _In_reads_bytes_opt_(InputBufferSize) PVOID InputBuffer,
1083 _In_ ULONG InputBufferSize,
1084 _Out_writes_bytes_to_opt_(OutputBufferSize,*ReturnOutputBufferLength) PVOID OutputBuffer,
1085 _In_ ULONG OutputBufferSize,
1086 _Out_ PULONG ReturnOutputBufferLength
1124 NTSTATUS status = STATUS_SUCCESS;
1126 HANDLE hFile =
NULL;
1127 LONGLONG scanId = 0;
1131 HANDLE sectionHandle;
1138 (
"[AV]: AvMessageNotifyCallback entered. \n") );
1141 if ((InputBuffer ==
NULL) ||
1145 return STATUS_INVALID_PARAMETER;
1160 return GetExceptionCode();
1176 if ((OutputBufferSize <
sizeof (HANDLE)) ||
1177 (OutputBuffer ==
NULL)) {
1179 return STATUS_INVALID_PARAMETER;
1182 if (!IS_ALIGNED(OutputBuffer,
sizeof(HANDLE))) {
1184 return STATUS_DATATYPE_MISALIGNMENT;
1190 if (!NT_SUCCESS( status )) {
1192 return STATUS_NOT_FOUND;
1198 if (NT_SUCCESS(status)) {
1205 (*(PHANDLE)OutputBuffer) = sectionHandle;
1206 *ReturnOutputBufferLength =
sizeof(HANDLE);
1215 NtClose( sectionHandle );
1224 status = GetExceptionCode();
1243 (
"[AV]: *******AvCmdCreateSectionForDataScan FAILED. \n") );
1248 return GetExceptionCode();
1254 if (!NT_SUCCESS( status )) {
1256 return STATUS_NOT_FOUND;
1261 if (NT_SUCCESS(status)) {
1262 *ReturnOutputBufferLength = 0;
1280 return GetExceptionCode();
1283 if ((OutputBufferSize <
sizeof (BOOLEAN)) ||
1284 (OutputBuffer ==
NULL)) {
1286 return STATUS_INVALID_PARAMETER;
1289 if (!IS_ALIGNED(OutputBuffer,
sizeof(BOOLEAN))) {
1291 return STATUS_DATATYPE_MISALIGNMENT;
1305 if (!NT_SUCCESS(status)) {
1308 (
"[AV]: **************************AvGetStreamContextByHandle FAILED. \n") );
1315 *ReturnOutputBufferLength = (ULONG)
sizeof( BOOLEAN );
1319 status = GetExceptionCode();
1322 FltReleaseContext( streamContext );
1327 return STATUS_INVALID_PARAMETER;
1336 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1358 OBJECT_ATTRIBUTES oa;
1359 UNICODE_STRING uniString;
1360 LONG maxConnections = 1;
1361 PCWSTR portName =
NULL;
1362 PFLT_PORT *pServerPort =
NULL;
1367 (
"[AV]: AvPrepareServerPort entered. \n") );
1369 switch( ConnectionType ) {
1383 FLT_ASSERTMSG(
"No such connection type.\n", FALSE);
1384 return STATUS_INVALID_PARAMETER;
1387 RtlInitUnicodeString( &uniString, portName );
1389 InitializeObjectAttributes( &oa,
1391 OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
1393 SecurityDescriptor );
struct _COMMAND_MESSAGE * PCOMMAND_MESSAGE
#define AV_QUERY_PORT_NAME
#define AV_CONNECTION_CTX_TAG
NTSTATUS AvGetInstanceContextByVolume(_In_ PFLT_VOLUME volumeObject, _Out_ PAV_INSTANCE_CONTEXT *InstanceContext)
VOID AvDisconnectNotifyCallback(_In_opt_ PVOID ConnectionCookie)
#define IS_FILE_MODIFIED(_sCtx)
#define AV_ABORT_PORT_NAME
NTSTATUS AvUpdateStreamContextWithScanResult(_Inout_ PAV_STREAM_CONTEXT StreamContext, _In_ PAV_SCAN_CONTEXT ScanContext, _In_ AVSCAN_RESULT ScanResult)
NTSTATUS AvCreateSectionContext(_In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Outptr_ PAV_SECTION_CONTEXT *SectionContext)
VOID AvFreeInstances(_In_reads_(InstanceCount) PFLT_INSTANCE *InstanceArray, _In_ ULONG InstanceCount)
NTSTATUS AvHandleCmdCloseSectionForDataScan(_Inout_ PAV_SCAN_CONTEXT ScanContext, _In_ AVSCAN_RESULT ScanResult)
#define AV_SCAN_PORT_NAME
PFLT_PORT QueryServerPort
LIST_ENTRY ScanCtxListHead
PFLT_PORT QueryClientPort
AV_SCANNER_GLOBAL_DATA Globals
NTSTATUS AvGetInstanceContextByFileHandle(_In_ HANDLE Handle, _Out_ PAV_INSTANCE_CONTEXT *InstanceContext)
NTSTATUS AvMessageNotifyCallback(_In_ PVOID ConnectionCookie, _In_reads_bytes_opt_(InputBufferSize) PVOID InputBuffer, _In_ ULONG InputBufferSize, _Out_writes_bytes_to_opt_(OutputBufferSize, *ReturnOutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferSize, _Out_ PULONG ReturnOutputBufferLength)
NTSTATUS AvReferenceScanContext(_In_ PAV_SCAN_CONTEXT ScanContext)
NTSTATUS AvConnectNotifyCallback(_In_ PFLT_PORT ClientPort, _In_ PVOID ServerPortCookie, _In_reads_bytes_(SizeOfContext) PVOID ConnectionContext, _In_ ULONG SizeOfContext, _Outptr_result_maybenull_ PVOID *ConnectionCookie)
struct _AV_FILE_REFERENCE::@0 FileId64
NTSTATUS AvGetScanCtxSynchronized(_In_ LONGLONG ScanId, _Out_ PAV_SCAN_CONTEXT *ScanCtx)
NTSTATUS AvGetStreamContextByHandle(_In_ HANDLE Handle, _Out_ PAV_STREAM_CONTEXT *StreamContext)
_In_ PLARGE_INTEGER _In_ ULONG _In_ ULONG _In_reads_bytes_(Length)
NTSTATUS AvEnumerateInstances(_Outptr_result_buffer_(*NumberInstances) PFLT_INSTANCE **InstanceArray, _Out_ PULONG NumberInstances)
UNREFERENCED_PARAMETER(FileObject)
enum _AVSCAN_COMMAND AVSCAN_COMMAND
NcLoadRegistryStringRetry NULL
NTSTATUS AvFinalizeSectionContext(_Inout_ PAV_SECTION_CONTEXT SectionContext)
NTSTATUS AvCloseSectionForDataScan(_Inout_ PAV_SECTION_CONTEXT SectionContext)
ERESOURCE ScanCtxListLock
struct _AV_CONNECTION_CONTEXT * PAV_CONNECTION_CONTEXT
#define IS_FILE_NEED_SCAN(_sCtx)
BOOLEAN CancelableOnConflictingIo
enum _AVSCAN_RESULT AVSCAN_RESULT
NTSTATUS AvReleaseScanContext(_In_ PAV_SCAN_CONTEXT ScanContext)
PFLT_PORT AbortClientPort
NTSTATUS AvHandleCmdCreateSectionForDataScan(_Inout_ PAV_SCAN_CONTEXT ScanContext, _Out_ PHANDLE SectionHandle)
#define SET_FILE_MODIFIED_EX(_flag, _sCtx)
NTSTATUS AvPrepareServerPort(_In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _In_ AVSCAN_CONNECTION_TYPE ConnectionType)
#define SET_FILE_SCANNING_EX(_flag, _sCtx)
VOID AvFinalizeScanContext(_Inout_ PAV_SCAN_CONTEXT ScanContext, _Outptr_result_maybenull_ PAV_SECTION_CONTEXT *SectionContext)
enum _AVSCAN_CONNECTION_TYPE * PAVSCAN_CONNECTION_TYPE
enum _AVSCAN_CONNECTION_TYPE AVSCAN_CONNECTION_TYPE
PFLT_PORT AbortServerPort
LONG AvExceptionFilter(_In_ PEXCEPTION_POINTERS ExceptionPointer, _In_ BOOLEAN AccessingUserBuffer)
NTSTATUS AvFinalizeScanAndSection(_Inout_ PAV_SCAN_CONTEXT ScanContext)
#define AV_DBG_PRINT(_dbgLevel, _string)
AVSCAN_CONNECTION_TYPE Type