HttpResponse* http_response_new() { HttpResponse* ret = (HttpResponse*)calloc(1, sizeof(HttpResponse)); if (!ret) return NULL; ret->Authenticates = ListDictionary_New(FALSE); ListDictionary_KeyObject(ret->Authenticates)->fnObjectEquals = strings_equals_nocase; ListDictionary_KeyObject(ret->Authenticates)->fnObjectFree = string_free; ListDictionary_ValueObject(ret->Authenticates)->fnObjectEquals = strings_equals_nocase; ListDictionary_ValueObject(ret->Authenticates)->fnObjectFree = string_free; return ret; }
DEVMAN* devman_new(rdpdrPlugin* rdpdr) { DEVMAN* devman; devman = (DEVMAN*) calloc(1, sizeof(DEVMAN)); if (!devman) { WLog_INFO(TAG, "calloc failed!"); return NULL; } devman->plugin = (void*) rdpdr; devman->id_sequence = 1; devman->devices = ListDictionary_New(TRUE); if (!devman->devices) { WLog_INFO(TAG, "ListDictionary_New failed!"); return NULL; } ListDictionary_ValueObject(devman->devices)->fnObjectFree = (OBJECT_FREE_FN) devman_device_free; return devman; }
pbRPCContext* pbrpc_server_new() { pbRPCContext* context = calloc(1, sizeof(pbRPCContext)); context->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); context->transactions = ListDictionary_New(TRUE); ListDictionary_ValueObject(context->transactions)->fnObjectFree = list_dictionary_item_free; context->writeQueue = Queue_New(TRUE, -1, -1); context->writeQueue->object.fnObjectFree = queue_item_free; return context; }
void drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, char* name, char* path) { int i, length; DRIVE_DEVICE* drive; #ifdef WIN32 /* * We cannot enter paths like c:\ because : is an arg separator * thus, paths are entered as c+\ and the + is substituted here */ if (path[1] == '+') { if ((path[0]>='a' && path[0]<='z') || (path[0]>='A' && path[0]<='Z')) { path[1] = ':'; } } #endif if (name[0] && path[0]) { drive = (DRIVE_DEVICE*) malloc(sizeof(DRIVE_DEVICE)); ZeroMemory(drive, sizeof(DRIVE_DEVICE)); drive->device.type = RDPDR_DTYP_FILESYSTEM; drive->device.name = name; drive->device.IRPRequest = drive_irp_request; drive->device.Free = drive_free; length = (int) strlen(name); drive->device.data = Stream_New(NULL, length + 1); for (i = 0; i <= length; i++) Stream_Write_UINT8(drive->device.data, name[i] < 0 ? '_' : name[i]); drive->path = path; drive->files = ListDictionary_New(TRUE); ListDictionary_ValueObject(drive->files)->fnObjectFree = (OBJECT_FREE_FN) drive_file_free; drive->IrpQueue = MessageQueue_New(NULL); drive->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) drive_thread_func, drive, CREATE_SUSPENDED, NULL); pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) drive); ResumeThread(drive->thread); } }
HttpResponse* http_response_new(void) { HttpResponse* response = (HttpResponse*) calloc(1, sizeof(HttpResponse)); if (!response) return NULL; response->Authenticates = ListDictionary_New(FALSE); if (!response->Authenticates) goto fail; response->data = Stream_New(NULL, 2048); if (!response->data) goto fail; ListDictionary_KeyObject(response->Authenticates)->fnObjectEquals = strings_equals_nocase; ListDictionary_ValueObject(response->Authenticates)->fnObjectEquals = strings_equals_nocase; return response; fail: http_response_free(response); return NULL; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, char* name, char* path) { int i, length; DRIVE_DEVICE* drive; UINT error; #ifdef WIN32 /* * We cannot enter paths like c:\ because : is an arg separator * thus, paths are entered as c+\ and the + is substituted here */ if (path[1] == '+') { if ((path[0] >= 'a' && path[0] <= 'z') || (path[0] >= 'A' && path[0] <= 'Z')) { path[1] = ':'; } } #endif if (name[0] && path[0]) { drive = (DRIVE_DEVICE*) calloc(1, sizeof(DRIVE_DEVICE)); if (!drive) { WLog_ERR(TAG, "calloc failed!"); return CHANNEL_RC_NO_MEMORY; } drive->device.type = RDPDR_DTYP_FILESYSTEM; drive->device.name = name; drive->device.IRPRequest = drive_irp_request; drive->device.Free = drive_free; drive->rdpcontext = pEntryPoints->rdpcontext; length = (int) strlen(name); drive->device.data = Stream_New(NULL, length + 1); if (!drive->device.data) { WLog_ERR(TAG, "Stream_New failed!"); error = CHANNEL_RC_NO_MEMORY; goto out_error; } for (i = 0; i <= length; i++) Stream_Write_UINT8(drive->device.data, name[i] < 0 ? '_' : name[i]); drive->path = path; drive->files = ListDictionary_New(TRUE); if (!drive->files) { WLog_ERR(TAG, "ListDictionary_New failed!"); error = CHANNEL_RC_NO_MEMORY; goto out_error; } ListDictionary_ValueObject(drive->files)->fnObjectFree = (OBJECT_FREE_FN) drive_file_free; drive->IrpQueue = MessageQueue_New(NULL); if (!drive->IrpQueue) { WLog_ERR(TAG, "ListDictionary_New failed!"); error = CHANNEL_RC_NO_MEMORY; goto out_error; } if ((error = pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) drive))) { WLog_ERR(TAG, "RegisterDevice failed with error %u!", error); goto out_error; } if (!(drive->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) drive_thread_func, drive, CREATE_SUSPENDED, NULL))) { WLog_ERR(TAG, "CreateThread failed!"); goto out_error; } ResumeThread(drive->thread); } return CHANNEL_RC_OK; out_error: MessageQueue_Free(drive->IrpQueue); ListDictionary_Free(drive->files); free(drive); return error; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) { char* name; char* path; size_t length; int ck; RDPDR_SMARTCARD* device; SMARTCARD_DEVICE* smartcard; UINT error = CHANNEL_RC_NO_MEMORY; device = (RDPDR_SMARTCARD*) pEntryPoints->device; name = device->Name; path = device->Path; smartcard = (SMARTCARD_DEVICE*) calloc(1, sizeof(SMARTCARD_DEVICE)); if (!smartcard) { WLog_ERR(TAG, "calloc failed!"); return CHANNEL_RC_NO_MEMORY; } smartcard->device.type = RDPDR_DTYP_SMARTCARD; smartcard->device.name = "SCARD"; smartcard->device.IRPRequest = smartcard_irp_request; smartcard->device.Init = smartcard_init; smartcard->device.Free = smartcard_free; smartcard->rdpcontext = pEntryPoints->rdpcontext; length = strlen(smartcard->device.name); smartcard->device.data = Stream_New(NULL, length + 1); if (!smartcard->device.data) { WLog_ERR(TAG, "Stream_New failed!"); goto error_device_data; } Stream_Write(smartcard->device.data, "SCARD", 6); smartcard->name = NULL; smartcard->path = NULL; if (path) { smartcard->path = path; smartcard->name = name; } else if (name) { if (1 == sscanf(name, "%d", &ck)) smartcard->path = name; else smartcard->name = name; } smartcard->IrpQueue = MessageQueue_New(NULL); if (!smartcard->IrpQueue) { WLog_ERR(TAG, "MessageQueue_New failed!"); goto error_irp_queue; } smartcard->CompletedIrpQueue = Queue_New(TRUE, -1, -1); if (!smartcard->CompletedIrpQueue) { WLog_ERR(TAG, "Queue_New failed!"); goto error_completed_irp_queue; } smartcard->rgSCardContextList = ListDictionary_New(TRUE); if (!smartcard->rgSCardContextList) { WLog_ERR(TAG, "ListDictionary_New failed!"); goto error_context_list; } ListDictionary_ValueObject(smartcard->rgSCardContextList)->fnObjectFree = (OBJECT_FREE_FN) smartcard_context_free; smartcard->rgOutstandingMessages = ListDictionary_New(TRUE); if (!smartcard->rgOutstandingMessages) { WLog_ERR(TAG, "ListDictionary_New failed!"); goto error_outstanding_messages; } if ((error = pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) smartcard))) { WLog_ERR(TAG, "RegisterDevice failed!"); goto error_outstanding_messages; } smartcard->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) smartcard_thread_func, smartcard, CREATE_SUSPENDED, NULL); if (!smartcard->thread) { WLog_ERR(TAG, "ListDictionary_New failed!"); error = ERROR_INTERNAL_ERROR; goto error_thread; } ResumeThread(smartcard->thread); return CHANNEL_RC_OK; error_thread: ListDictionary_Free(smartcard->rgOutstandingMessages); error_outstanding_messages: ListDictionary_Free(smartcard->rgSCardContextList); error_context_list: Queue_Free(smartcard->CompletedIrpQueue); error_completed_irp_queue: MessageQueue_Free(smartcard->IrpQueue); error_irp_queue: Stream_Free(smartcard->device.data, TRUE); error_device_data: free(smartcard); return error; }
int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) { char* name; char* path; int length, ck; RDPDR_SMARTCARD* device; SMARTCARD_DEVICE* smartcard; device = (RDPDR_SMARTCARD*) pEntryPoints->device; name = device->Name; path = device->Path; smartcard = (SMARTCARD_DEVICE*) calloc(1, sizeof(SMARTCARD_DEVICE)); if (!smartcard) return -1; smartcard->device.type = RDPDR_DTYP_SMARTCARD; smartcard->device.name = "SCARD"; smartcard->device.IRPRequest = smartcard_irp_request; smartcard->device.Init = smartcard_init; smartcard->device.Free = smartcard_free; length = strlen(smartcard->device.name); smartcard->device.data = Stream_New(NULL, length + 1); if (!smartcard->device.data) goto error_device_data; Stream_Write(smartcard->device.data, "SCARD", 6); smartcard->name = NULL; smartcard->path = NULL; if (path) { smartcard->path = path; smartcard->name = name; } else if (name) { if (1 == sscanf(name, "%d", &ck)) smartcard->path = name; else smartcard->name = name; } smartcard->IrpQueue = MessageQueue_New(NULL); if (!smartcard->IrpQueue) goto error_irp_queue; smartcard->CompletedIrpQueue = Queue_New(TRUE, -1, -1); if (!smartcard->CompletedIrpQueue) goto error_completed_irp_queue; smartcard->rgSCardContextList = ListDictionary_New(TRUE); if (!smartcard->rgSCardContextList) goto error_context_list; ListDictionary_ValueObject(smartcard->rgSCardContextList)->fnObjectFree = (OBJECT_FREE_FN) smartcard_context_free; smartcard->rgOutstandingMessages = ListDictionary_New(TRUE); if (!smartcard->rgOutstandingMessages) goto error_outstanding_messages; smartcard->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) smartcard_thread_func, smartcard, CREATE_SUSPENDED, NULL); if (!smartcard->thread) goto error_thread; pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) smartcard); ResumeThread(smartcard->thread); return 0; error_thread: ListDictionary_Free(smartcard->rgOutstandingMessages); error_outstanding_messages: ListDictionary_Free(smartcard->rgSCardContextList); error_context_list: Queue_Free(smartcard->CompletedIrpQueue); error_completed_irp_queue: MessageQueue_Free(smartcard->IrpQueue); error_irp_queue: Stream_Free(smartcard->device.data, TRUE); error_device_data: free(smartcard); return -1; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) { SMARTCARD_DEVICE* smartcard = NULL; size_t length; UINT error = CHANNEL_RC_NO_MEMORY; if (!sSmartcard) { wObject* obj; smartcard = (SMARTCARD_DEVICE*) calloc(1, sizeof(SMARTCARD_DEVICE)); if (!smartcard) { WLog_ERR(TAG, "calloc failed!"); return CHANNEL_RC_NO_MEMORY; } smartcard->device.type = RDPDR_DTYP_SMARTCARD; smartcard->device.name = "SCARD"; smartcard->device.IRPRequest = smartcard_irp_request; smartcard->device.Init = smartcard_init; smartcard->device.Free = smartcard_free; smartcard->names = LinkedList_New(); smartcard->rdpcontext = pEntryPoints->rdpcontext; length = strlen(smartcard->device.name); smartcard->device.data = Stream_New(NULL, length + 1); if (!smartcard->device.data || !smartcard->names) { WLog_ERR(TAG, "Stream_New failed!"); goto fail; } Stream_Write(smartcard->device.data, "SCARD", 6); smartcard->IrpQueue = MessageQueue_New(NULL); if (!smartcard->IrpQueue) { WLog_ERR(TAG, "MessageQueue_New failed!"); goto fail; } smartcard->CompletedIrpQueue = Queue_New(TRUE, -1, -1); if (!smartcard->CompletedIrpQueue) { WLog_ERR(TAG, "Queue_New failed!"); goto fail; } smartcard->rgSCardContextList = ListDictionary_New(TRUE); if (!smartcard->rgSCardContextList) { WLog_ERR(TAG, "ListDictionary_New failed!"); goto fail; } obj = ListDictionary_ValueObject(smartcard->rgSCardContextList); obj->fnObjectFree = smartcard_context_free; smartcard->rgOutstandingMessages = ListDictionary_New(TRUE); if (!smartcard->rgOutstandingMessages) { WLog_ERR(TAG, "ListDictionary_New failed!"); goto fail; } if ((error = pEntryPoints->RegisterDevice(pEntryPoints->devman, &smartcard->device))) { WLog_ERR(TAG, "RegisterDevice failed!"); goto fail; } smartcard->thread = CreateThread(NULL, 0, smartcard_thread_func, smartcard, CREATE_SUSPENDED, NULL); if (!smartcard->thread) { WLog_ERR(TAG, "ListDictionary_New failed!"); error = ERROR_INTERNAL_ERROR; goto fail; } ResumeThread(smartcard->thread); } else smartcard = sSmartcard; if (pEntryPoints->device->Name) LinkedList_AddLast(smartcard->names, pEntryPoints->device->Name); sSmartcard = smartcard; return CHANNEL_RC_OK; fail: smartcard_free_(smartcard); return error; }