rizin/librz/util/w32-sys.c
GustavoLCR 170ab3eb3b
Remove windows.h include from rz_types.h (#2410)
* Create `rz_windows.h`
* Move `RzThread` structure definitions to internal header
* Create and use `rz_th_get_user()` API to avoid exposing `RzThread` layout in external header
* Make `rz_th_self()` an IPI
* Use `_wmkdir()` in `rz_sys_mkdir()` on Windows
* Remove unused `winkd_break_read` function
* Remove `RzIORap` definition from `rz_io.h`
* Remove include of `Windows.h` from `rz_types.h`
* Use `rz_windows.h` when necessary
* Remove `RzCoreRtrHost` definition from `rz_core.h`
* Remove `rz_socket.h` include from `rz_core.h`
2022-03-16 13:54:41 +01:00

141 lines
3.2 KiB
C

// SPDX-FileCopyrightText: 2010 pancake <pancake@nopcode.org>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_types.h>
#include <rz_util.h>
#if __WINDOWS__
#include <rz_windows.h>
#include <stdio.h>
#include <tchar.h>
#define BUFSIZE 1024
void rz_sys_perror_str(const char *fun);
#define ErrorExit(x) \
{ \
rz_sys_perror(x); \
return false; \
}
char *ReadFromPipe(HANDLE fh, int *outlen);
RZ_API char *rz_sys_get_src_dir_w32(void) {
TCHAR fullpath[MAX_PATH + 1];
TCHAR shortpath[MAX_PATH + 1];
if (!GetModuleFileName(NULL, fullpath, MAX_PATH + 1) ||
!GetShortPathName(fullpath, shortpath, MAX_PATH + 1)) {
return NULL;
}
char *path = rz_sys_conv_win_to_utf8(shortpath);
char *dir = rz_file_dirname(path);
if (!rz_sys_getenv_asbool("RZ_ALT_SRC_DIR")) {
char *tmp = dir;
dir = rz_file_dirname(tmp);
free(tmp);
}
return dir;
}
RZ_API bool rz_sys_create_child_proc_w32(const char *cmdline, HANDLE in, HANDLE out, HANDLE err) {
PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si = { 0 };
LPTSTR cmdline_;
bool ret = false;
const size_t max_length = 32768 * sizeof(TCHAR);
LPTSTR _cmdline_ = malloc(max_length);
if (!_cmdline_) {
RZ_LOG_ERROR("Failed to allocate memory\n");
return false;
}
// Set up members of the STARTUPINFO structure.
// This structure specifies the STDIN and STDOUT handles for redirection.
si.cb = sizeof(STARTUPINFO);
si.hStdError = err;
si.hStdOutput = out;
si.hStdInput = in;
si.dwFlags |= STARTF_USESTDHANDLES;
cmdline_ = rz_sys_conv_utf8_to_win(cmdline);
ExpandEnvironmentStrings(cmdline_, _cmdline_, max_length - 1);
if ((ret = CreateProcess(NULL,
_cmdline_, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&si, // STARTUPINFO pointer
&pi))) { // receives PROCESS_INFORMATION
ret = true;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
} else {
rz_sys_perror("CreateProcess");
}
free(cmdline_);
free(_cmdline_);
return ret;
}
char *ReadFromPipe(HANDLE fh, int *outlen) {
DWORD dwRead;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
char *str;
int strl = 0;
int strsz = BUFSIZE + 1;
if (outlen) {
*outlen = 0;
}
str = malloc(strsz);
if (!str) {
return NULL;
}
while (true) {
bSuccess = ReadFile(fh, chBuf, BUFSIZE, &dwRead, NULL);
if (!bSuccess || dwRead == 0) {
break;
}
if (strl + dwRead > strsz) {
char *str_tmp = str;
strsz += 4096;
str = realloc(str, strsz);
if (!str) {
free(str_tmp);
return NULL;
}
}
memcpy(str + strl, chBuf, dwRead);
strl += dwRead;
}
str[strl] = 0;
if (outlen) {
*outlen = strl;
}
return str;
}
RZ_API char **rz_sys_utf8_argv_new(int argc, const wchar_t **argv) {
char **utf8_argv = calloc(argc + 1, sizeof(wchar_t *));
if (!utf8_argv) {
return NULL;
}
int i;
for (i = 0; i < argc; i++) {
utf8_argv[i] = rz_utf16_to_utf8(argv[i]);
}
return utf8_argv;
}
RZ_API void rz_sys_utf8_argv_free(int argc, char **utf8_argv) {
int i;
for (i = 0; i < argc; i++) {
free(utf8_argv[i]);
}
free(utf8_argv);
}
#endif