int dc_init_fast_crypt() { int i; /* enable thread pool */ if (lock_xchg(&pool_enabled, 1) != 0) { return ST_OK; } /* initialize resources */ ExInitializeNPagedLookasideList( &pool_req_mem, NULL, NULL, 0, sizeof(req_item), '3_cd', 0); KeInitializeEvent(&pool_signal_event, NotificationEvent, FALSE); ExInitializeSListHead(&pool_head); KeInitializeSpinLock(&pool_lock); /* start worker threads */ for (i = 0; i < dc_cpu_count; i++) { if (start_system_thread(dc_worker_thread, NULL, &pool_threads[i]) != ST_OK) { dc_free_fast_crypt(); return ST_ERR_THREAD; } } return ST_OK; }
int dc_verify_device(dev_hook *hook) { u32 chg_count; if (io_hook_ioctl(hook, IOCTL_DISK_CHECK_VERIFY, NULL, 0, &chg_count, sizeof(chg_count)) == ST_OK) { if (lock_xchg(&hook->chg_count, chg_count) != chg_count) { return ST_MEDIA_CHANGED; } else { return ST_OK; } } else { return ST_NO_MEDIA; } }
void cp_free_fast_crypt() { int i; /* disable thread pool */ if (lock_xchg(&pool_enabled, 0) == 0) { return; } /* stop all threads */ for (i = 0; i < MAX_CPU_COUNT; i++) { if (pool_threads[i] != NULL) { KeSetEvent(&pool_signal_event, IO_NO_INCREMENT, FALSE); ZwWaitForSingleObject(pool_threads[i], FALSE, NULL); ZwClose(pool_threads[i]); } } /* free memory */ memset(&pool_threads, 0, sizeof(pool_threads)); ExDeleteNPagedLookasideList(&pool_req_mem); }
static NTSTATUS dc_ioctl_complete(PDEVICE_OBJECT dev_obj, PIRP irp, void *param) { PIO_STACK_LOCATION irp_sp = IoGetCurrentIrpStackLocation(irp); dev_hook *hook = dev_obj->DeviceExtension; u32 ioctl = irp_sp->Parameters.DeviceIoControl.IoControlCode; NTSTATUS status = irp->IoStatus.Status; u32 *chg_c; int change; if (irp->PendingReturned) { IoMarkIrpPending(irp); } if ( NT_SUCCESS(status) && (hook->flags & F_ENABLED) ) { switch (ioctl) { case IOCTL_DISK_GET_LENGTH_INFO: { PGET_LENGTH_INFORMATION gl = pv(irp->AssociatedIrp.SystemBuffer); gl->Length.QuadPart = hook->use_size; } break; case IOCTL_DISK_GET_PARTITION_INFO: { PPARTITION_INFORMATION pi = pv(irp->AssociatedIrp.SystemBuffer); pi->PartitionLength.QuadPart = hook->use_size; } break; case IOCTL_DISK_GET_PARTITION_INFO_EX: { PPARTITION_INFORMATION_EX pi = pv(irp->AssociatedIrp.SystemBuffer); pi->PartitionLength.QuadPart = hook->use_size; } break; case IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX: { PDISK_GEOMETRY_EX dgx = pv(irp->AssociatedIrp.SystemBuffer); dgx->DiskSize.QuadPart = hook->use_size; } break; } } if ( (hook->flags & F_REMOVABLE) && (IS_VERIFY_IOCTL(ioctl) != 0) ) { chg_c = pv(irp->AssociatedIrp.SystemBuffer); change = NT_SUCCESS(status) == FALSE; if (irp->IoStatus.Information == sizeof(u32)) { change |= lock_xchg(&hook->chg_count, *chg_c) != *chg_c; *chg_c += hook->chg_mount; } if ( (change != 0) && (hook->dsk_size != 0) ) { DbgMsg("media removed\n"); dc_unmount_async(hook); } } IoReleaseRemoveLock(&hook->remove_lock, irp); return STATUS_SUCCESS; }