int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) { char* name; char* path; RDPDR_DRIVE* drive; #ifdef WIN32 char* dev; int len; char devlist[512], buf[512]; #endif drive = (RDPDR_DRIVE*) pEntryPoints->device; name = drive->Name; path = drive->Path; #ifndef WIN32 drive_register_drive_path(pEntryPoints, name, path); #else /* Special case: path[0] == '*' -> export all drives */ /* Special case: path[0] == '%' -> user home dir */ if( path[0] == '%' ) { _snprintf(buf, sizeof(buf), "%s\\", getenv("USERPROFILE")); drive_register_drive_path(pEntryPoints, name, _strdup(buf)); } else if( path[0] == '*' ) { int i; /* Enumerate all devices: */ GetLogicalDriveStringsA(sizeof(devlist) - 1, devlist); for (dev = devlist, i = 0; *dev; dev += 4, i++) { if (*dev > 'B') { /* Suppress disk drives A and B to avoid pesty messages */ _snprintf(buf, sizeof(buf) - 4, "%s", name); len = strlen(buf); buf[len] = '_'; buf[len + 1] = dev[0]; buf[len + 2] = 0; buf[len + 3] = 0; drive_register_drive_path(pEntryPoints, _strdup(buf), _strdup(dev)); } } } else { drive_register_drive_path(pEntryPoints, name, path); } #endif return 0; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) { RDPDR_DRIVE* drive; UINT error; #ifdef WIN32 char* dev; int len; char devlist[512], buf[512]; char* bufdup; char* devdup; #endif drive = (RDPDR_DRIVE*) pEntryPoints->device; #ifndef WIN32 sys_code_page = CP_UTF8; if (strcmp(drive->Path, "*") == 0) { /* all drives */ free(drive->Path); drive->Path = _strdup("/"); if (!drive->Path) { WLog_ERR(TAG, "_strdup failed!"); return CHANNEL_RC_NO_MEMORY; } } else if (strcmp(drive->Path, "%") == 0) { char* home_env = NULL; /* home directory */ home_env = getenv("HOME"); free(drive->Path); if (home_env) { drive->Path = _strdup(home_env); if (!drive->Path) { WLog_ERR(TAG, "_strdup failed!"); return CHANNEL_RC_NO_MEMORY; } } else { drive->Path = _strdup("/"); if (!drive->Path) { WLog_ERR(TAG, "_strdup failed!"); return CHANNEL_RC_NO_MEMORY; } } } error = drive_register_drive_path(pEntryPoints, drive->Name, drive->Path); #else sys_code_page = GetACP(); /* Special case: path[0] == '*' -> export all drives */ /* Special case: path[0] == '%' -> user home dir */ if (strcmp(drive->Path, "%") == 0) { GetEnvironmentVariableA("USERPROFILE", buf, sizeof(buf)); PathCchAddBackslashA(buf, sizeof(buf)); free(drive->Path); drive->Path = _strdup(buf); if (!drive->Path) { WLog_ERR(TAG, "_strdup failed!"); return CHANNEL_RC_NO_MEMORY; } error = drive_register_drive_path(pEntryPoints, drive->Name, drive->Path); } else if (strcmp(drive->Path, "*") == 0) { int i; /* Enumerate all devices: */ GetLogicalDriveStringsA(sizeof(devlist) - 1, devlist); for (dev = devlist, i = 0; *dev; dev += 4, i++) { if (*dev > 'B') { /* Suppress disk drives A and B to avoid pesty messages */ len = sprintf_s(buf, sizeof(buf) - 4, "%s", drive->Name); buf[len] = '_'; buf[len + 1] = dev[0]; buf[len + 2] = 0; buf[len + 3] = 0; if (!(bufdup = _strdup(buf))) { WLog_ERR(TAG, "_strdup failed!"); return CHANNEL_RC_NO_MEMORY; } if (!(devdup = _strdup(dev))) { WLog_ERR(TAG, "_strdup failed!"); return CHANNEL_RC_NO_MEMORY; } if ((error = drive_register_drive_path(pEntryPoints, bufdup, devdup))) { break; } } } } else { error = drive_register_drive_path(pEntryPoints, drive->Name, drive->Path); } #endif return error; }
int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) { RDPDR_DRIVE* drive; #ifdef WIN32 char* dev; int len; char devlist[512], buf[512]; #endif drive = (RDPDR_DRIVE*) pEntryPoints->device; #ifndef WIN32 sys_code_page = CP_UTF8; if (strcmp(drive->Path, "*") == 0) { /* all drives */ free(drive->Path); drive->Path = _strdup("/"); } else if (strcmp(drive->Path, "%") == 0) { char* home_env = NULL; /* home directory */ home_env = getenv("HOME"); free(drive->Path); if (home_env) drive->Path = _strdup(home_env); else drive->Path = _strdup("/"); } drive_register_drive_path(pEntryPoints, drive->Name, drive->Path); #else sys_code_page = GetACP(); /* Special case: path[0] == '*' -> export all drives */ /* Special case: path[0] == '%' -> user home dir */ if (strcmp(drive->Path, "%") == 0) { _snprintf(buf, sizeof(buf), "%s\\", getenv("USERPROFILE")); drive_register_drive_path(pEntryPoints, drive->Name, _strdup(buf)); } else if (strcmp(drive->Path, "*") == 0) { int i; /* Enumerate all devices: */ GetLogicalDriveStringsA(sizeof(devlist) - 1, devlist); for (dev = devlist, i = 0; *dev; dev += 4, i++) { if (*dev > 'B') { /* Suppress disk drives A and B to avoid pesty messages */ len = _snprintf(buf, sizeof(buf) - 4, "%s", drive->Name); buf[len] = '_'; buf[len + 1] = dev[0]; buf[len + 2] = 0; buf[len + 3] = 0; drive_register_drive_path(pEntryPoints, _strdup(buf), _strdup(dev)); } } } else { drive_register_drive_path(pEntryPoints, drive->Name, drive->Path); } #endif return 0; }