/// <summary>
/// Type Confusion Ioctl Handler
/// </summary>
/// <param name="pIrp">The pointer to IRP</param>
/// <param name="pIoStackIrp">The pointer to IO_STACK_LOCATION structure</param>
/// <returns>NTSTATUS</returns>
NTSTATUS TypeConfusionIoctlHandler(IN PIRP pIrp, IN PIO_STACK_LOCATION pIoStackIrp) {
    NTSTATUS status = STATUS_UNSUCCESSFUL;
    PTYPE_CONFUSION_USER_OBJECT pTypeConfusionUserObject = NULL;

    UNREFERENCED_PARAMETER(pIrp);
    PAGED_CODE();

    pTypeConfusionUserObject = (PTYPE_CONFUSION_USER_OBJECT)
                                pIoStackIrp->Parameters.DeviceIoControl.Type3InputBuffer;

    if (pTypeConfusionUserObject) {
        status = TriggerTypeConfusion(pTypeConfusionUserObject);
    }

    return status;
}
/// <summary>
/// Type Confusion Ioctl Handler
/// </summary>
/// <param name="Irp">The pointer to IRP</param>
/// <param name="IrpSp">The pointer to IO_STACK_LOCATION structure</param>
/// <returns>NTSTATUS</returns>
NTSTATUS TypeConfusionIoctlHandler(IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp) {
    NTSTATUS Status = STATUS_UNSUCCESSFUL;
    PUSER_TYPE_CONFUSION_OBJECT UserTypeConfusionObject = NULL;

    UNREFERENCED_PARAMETER(Irp);
    PAGED_CODE();

    UserTypeConfusionObject = (PUSER_TYPE_CONFUSION_OBJECT)
                               IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;

    if (UserTypeConfusionObject) {
        Status = TriggerTypeConfusion(UserTypeConfusionObject);
    }

    return Status;
}