Esempio n. 1
0
int win_run_cmd(char* cmd)
{
	STARTUPINFO sinfo;
	PROCESS_INFORMATION pinfo;
	DWORD ret;
	memset(&pinfo, 0, sizeof(pinfo));
	memset(&sinfo, 0, sizeof(sinfo));
	sinfo.cb = sizeof(sinfo);

	/* start it */
	if(!CreateProcess(NULL, cmd, NULL, NULL, 0, CREATE_NO_WINDOW,
		NULL, NULL, &sinfo, &pinfo)) {
		log_win_err(cmd, GetLastError());
		return -1;
	}

	/* wait for it */
	if(WaitForSingleObject(pinfo.hProcess, INFINITE) == WAIT_FAILED) {
		log_win_err("cannot WaitForSingleObject(exe):", GetLastError());
	}
	if(!GetExitCodeProcess(pinfo.hProcess, &ret)) {
		log_win_err("cannot GetExitCodeProcess", GetLastError());
		ret = -1;
	}
	CloseHandle(pinfo.hProcess);
	CloseHandle(pinfo.hThread);
	return ret;
}
Esempio n. 2
0
void win_set_resolv(char* ip)
{
	const char* key = "SYSTEM\\CurrentControlSet\\Services\\Tcpip"
		"\\Parameters";
	const char* ifs = "SYSTEM\\CurrentControlSet\\services\\Tcpip"
		"\\Parameters\\Interfaces";
	const char* key6 = "SYSTEM\\CurrentControlSet\\Services\\Tcpip6"
		"\\Parameters";
	const char* ifs6 = "SYSTEM\\CurrentControlSet\\services\\Tcpip6"
		"\\Parameters\\Interfaces";
	HKEY hk;
	verbose(VERB_DETAIL, "set reg %s", ip);

	/* needs administrator permissions */
	if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)key,
		0, /* reserved, mustbezero */
		NULL, /* class of key, ignored */
		REG_OPTION_NON_VOLATILE, /* values saved on disk */
		KEY_WRITE, /* we want write permission */
		NULL, /* use default security descriptor */
		&hk, /* result */
		NULL)) /* not interested if key new or existing */
	{
		log_win_err("could not open registry key", GetLastError());
	} else {
		/* set NameServer */
		if(RegSetValueEx(hk, (LPCTSTR)"NameServer", 0, REG_SZ,
			(BYTE*)ip, (DWORD)strlen(ip)+1)) {
			log_win_err("could not set regkey NameServer", GetLastError());
		}
		RegCloseKey(hk);
	}

	/* set all interfaces/guid/nameserver */
	enum_guids(ifs, &enum_reg_set_nameserver, ip);

	/* IPv6 */
	/* needs administrator permissions */
	if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)key6,
		0, /* reserved, mustbezero */
		NULL, /* class of key, ignored */
		REG_OPTION_NON_VOLATILE, /* values saved on disk */
		KEY_WRITE, /* we want write permission */
		NULL, /* use default security descriptor */
		&hk, /* result */
		NULL)) /* not interested if key new or existing */
	{
		log_win_err("could not open registry key6", GetLastError());
	} else {
		/* set NameServer */
		if(RegSetValueEx(hk, (LPCTSTR)"NameServer", 0, REG_SZ,
			(BYTE*)ip, (DWORD)strlen(ip)+1)) {
			log_win_err("could not set6 regkey NameServer", GetLastError());
		}
		RegCloseKey(hk);
	}

	/* set all interfaces/guid/nameserver */
	enum_guids(ifs6, &enum_reg_set_nameserver, ip);
}
Esempio n. 3
0
void ub_thread_join(ub_thread_t thr)
{
	DWORD ret = WaitForSingleObject(thr, INFINITE);
	if(ret == WAIT_FAILED) {
		log_win_err("WaitForSingleObject(Thread):WAIT_FAILED", 
			GetLastError());
	} else if(ret == WAIT_TIMEOUT) {
		log_win_err("WaitForSingleObject(Thread):WAIT_TIMEOUT", 
			GetLastError());
	}
	/* and close the handle to the thread */
	if(!CloseHandle(thr)) {
		log_win_err("CloseHandle(Thread) failed", GetLastError());
	}
}
Esempio n. 4
0
void* ub_thread_key_get(ub_thread_key_t key)
{
	void* ret = (void*)TlsGetValue(key);
	if(ret == NULL && GetLastError() != ERROR_SUCCESS) {
		log_win_err("TlsGetValue failed", GetLastError());
	}
	return ret;
}
Esempio n. 5
0
void ub_thread_key_create(ub_thread_key_t* key, void* f)
{
	*key = TlsAlloc();
	if(*key == TLS_OUT_OF_INDEXES) {
		*key = 0;
		log_win_err("TlsAlloc Failed(OUT_OF_INDEXES)", GetLastError());
	}
	else ub_thread_key_set(*key, f);
}
Esempio n. 6
0
void
enum_reg_set_nameserver(HKEY hk, void* arg)
{
	DWORD len = 0;
	if(arg) len = strlen((char*)arg);
	if(RegSetValueEx(hk, (LPCTSTR)"NameServer", 0, REG_SZ,
		(BYTE*)arg, (DWORD)len)) {
		log_win_err("could not enumset regkey NameServer", GetLastError());
	}
}
Esempio n. 7
0
/** enumerate all subkeys of base, and call process(hk, arg) on them */
void enum_guids(const char* base, void (*process_it)(HKEY,void*), void* arg)
{
	char subname[1024];
	HKEY base_hk, sub_hk;
	DWORD sz = sizeof(subname);
	DWORD i = 0, ret;
	if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)base,
		0, /* reserved, mustbezero */
		NULL, /* class of key, ignored */
		REG_OPTION_NON_VOLATILE, /* values saved on disk */
		KEY_WRITE|KEY_ENUMERATE_SUB_KEYS,
		NULL, /* use default security descriptor */
		&base_hk, /* result */
		NULL)) /* not interested if key new or existing */
	{
		log_win_err("could not open enum registry key", GetLastError());
		return;
	}
	while( (ret=RegEnumKeyEx(base_hk, i, (LPTSTR)subname, &sz, NULL, NULL,
		0, NULL)) == ERROR_SUCCESS) {
		verbose(VERB_ALGO, "enum %d %s", (int)i, subname);
		/* process it */
		if(RegOpenKeyEx(base_hk, (LPCTSTR)subname, 0, KEY_WRITE,
			&sub_hk)) {
			log_win_err("enum cannot RegOpenKey", GetLastError());
		} else {
			fptr_ok(fptr_whitelist_enum_reg(process_it));
			(*process_it)(sub_hk, arg);
			RegCloseKey(sub_hk);
		}
		/* prepare for next iteration */
		i++;
		sz = sizeof(subname);
	}
	if(ret == ERROR_MORE_DATA) {
		log_err("part of %s has registry keys that are too long", base);
	} else if(ret != ERROR_NO_MORE_ITEMS) {
		log_win_err("cannot RegEnumKey", GetLastError());
	}
	RegCloseKey(base_hk);	
}
Esempio n. 8
0
void ub_thread_create(ub_thread_t* thr, void* (*func)(void*), void* arg)
{
#ifndef HAVE__BEGINTHREADEX
	*thr = CreateThread(NULL, /* default security (no inherit handle) */
		0, /* default stack size */
		(LPTHREAD_START_ROUTINE)func, arg,
		0, /* default flags, run immediately */
		NULL); /* do not store thread identifier anywhere */
#else
	/* the begintheadex routine setups for the C lib; aligns stack */
	*thr=(ub_thread_t)_beginthreadex(NULL, 0, (void*)func, arg, 0, NULL);
#endif
	if(*thr == NULL) {
		log_win_err("CreateThread failed", GetLastError());
		fatal_exit("thread create failed");
	}
}
Esempio n. 9
0
void ub_thread_key_set(ub_thread_key_t key, void* v)
{
	if(!TlsSetValue(key, v)) {
		log_win_err("TlsSetValue failed", GetLastError());
	}
}