Exemplo n.º 1
2
/// <summary>
/// Starts filtering process and thread access rights.
/// </summary>
NTSTATUS HsRegisterProtector()
{
	NTSTATUS status;
	OB_CALLBACK_REGISTRATION callbackRegistration;
	OB_OPERATION_REGISTRATION operationRegistration[2];

	operationRegistration[0].ObjectType = PsProcessType;
	operationRegistration[0].Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
	operationRegistration[0].PreOperation = HspObPreCallback;
	operationRegistration[0].PostOperation = NULL;

	operationRegistration[1].ObjectType = PsThreadType;
	operationRegistration[1].Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
	operationRegistration[1].PreOperation = HspObPreCallback;
	operationRegistration[1].PostOperation = NULL;

	callbackRegistration.Version = OB_FLT_REGISTRATION_VERSION;
	callbackRegistration.RegistrationContext = NULL;
	callbackRegistration.OperationRegistrationCount = ARRAYSIZE(operationRegistration);
	callbackRegistration.OperationRegistration = operationRegistration;

	RtlInitUnicodeString(&callbackRegistration.Altitude, L"40100.7");

	FltInitializePushLock(&ObCallbackInstance.ProtectedProcessLock);

	RtlInitializeGenericTableAvl(
		&ObCallbackInstance.ProtectedProcesses,
		HspCompareProtectedProcess,
		HsAvlAllocate,
		HsAvlFree,
		NULL);

	status = ObRegisterCallbacks(&callbackRegistration, &ObCallbackInstance.RegistrationHandle);

	if (!NT_SUCCESS(status))
		FltDeletePushLock(&ObCallbackInstance.ProtectedProcessLock);

	return status;
}
Exemplo n.º 2
0
FilterBoxList::FilterBoxList (
    )
{
    FltInitializePushLock( &m_AccessLock );
    InitializeListHead( &m_List );
}
Exemplo n.º 3
0
static NTSTATUS
UcaAllocateContext(_In_ FLT_CONTEXT_TYPE ContextType,
                   _Outptr_ PFLT_CONTEXT *Context)

{
    PUCA_TRANSACTION_CONTEXT TransactionContext;
    NTSTATUS Status;

    PAGED_CODE();

    switch (ContextType)
    {
        case FLT_STREAM_CONTEXT:
            /* Allocate stream context */
            Status = FltAllocateContext(DriverData.FilterHandle,
                                        FLT_STREAM_CONTEXT,
                                        sizeof(UCA_STREAM_CONTEXT),
                                        UCA_CONTEXT_POOL_TYPE,
                                        Context);

            if (NT_SUCCESS(Status))
            {
                RtlZeroMemory(*Context, sizeof(UCA_STREAM_CONTEXT));
                FltInitializePushLock(&((PUCA_STREAM_CONTEXT)*Context)->Lock);
            }
            break;

        case FLT_FILE_CONTEXT:
            /* Allocate file context */
            Status = FltAllocateContext(DriverData.FilterHandle,
                                        FLT_FILE_CONTEXT,
                                        sizeof(UCA_STREAM_CONTEXT),
                                        UCA_CONTEXT_POOL_TYPE,
                                        Context);
            if (NT_SUCCESS(Status))
            {
                RtlZeroMemory(*Context, sizeof(UCA_STREAM_CONTEXT));
                FltInitializePushLock(&((PUCA_STREAM_CONTEXT)*Context)->Lock);
            }
            break;

        case FLT_TRANSACTION_CONTEXT:
            /* Allocate transaction context */
            Status = FltAllocateContext(DriverData.FilterHandle,
                                        FLT_TRANSACTION_CONTEXT,
                                        sizeof(UCA_TRANSACTION_CONTEXT),
                                        UCA_CONTEXT_POOL_TYPE,
                                        Context);

            if (NT_SUCCESS(Status))
            {
                TransactionContext = (PUCA_TRANSACTION_CONTEXT)*Context;

                /* Zero the memory */
                RtlZeroMemory(TransactionContext, sizeof(UCA_TRANSACTION_CONTEXT));

                /* Initialize the notify list */
                InitializeListHead(&TransactionContext->DeleteNotifyList);

                /* The resource needs to be in NPP */
                TransactionContext->Resource = (PERESOURCE)ExAllocatePoolWithTag(NonPagedPool,
                                                                                 sizeof(ERESOURCE),
                                                                                 UCA_ERESOURCE_POOL_TAG);
                if (TransactionContext->Resource == NULL)
                {
                    FltReleaseContext(TransactionContext);
                    return STATUS_INSUFFICIENT_RESOURCES;
                }

                /* Initialize the lock */
                ExInitializeResourceLite(TransactionContext->Resource);
            }
            break;

        case FLT_INSTANCE_CONTEXT:
            /* Allocate instance context */
            Status = FltAllocateContext(DriverData.FilterHandle,
                                        FLT_INSTANCE_CONTEXT,
                                        sizeof(UCA_INSTANCE_CONTEXT),
                                        UCA_CONTEXT_POOL_TYPE,
                                        Context);

            if (NT_SUCCESS(Status))
            {
                RtlZeroMemory(*Context, sizeof(UCA_INSTANCE_CONTEXT));
            }
            break;

        default:
            Status = STATUS_INVALID_PARAMETER;
            break;
    }

    return Status;
}