예제 #1
0
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;
}
예제 #2
0
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;
	}
}
예제 #3
0
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);
}
예제 #4
0
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;
}