static void test_debug_heap( const char *argv0, DWORD flags ) { char keyname[MAX_PATH]; char buffer[MAX_PATH]; PROCESS_INFORMATION info; STARTUPINFOA startup; BOOL ret; DWORD err; HKEY hkey; const char *basename; if ((basename = strrchr( argv0, '\\' ))) basename++; else basename = argv0; sprintf( keyname, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%s", basename ); if (!strcmp( keyname + strlen(keyname) - 3, ".so" )) keyname[strlen(keyname) - 3] = 0; err = RegCreateKeyA( HKEY_LOCAL_MACHINE, keyname, &hkey ); if (err == ERROR_ACCESS_DENIED) { skip("Not authorized to change the image file execution options\n"); return; } ok( !err, "failed to create '%s' error %u\n", keyname, err ); if (err) return; if (flags == 0xdeadbeef) /* magic value for unsetting it */ RegDeleteValueA( hkey, "GlobalFlag" ); else RegSetValueExA( hkey, "GlobalFlag", 0, REG_DWORD, (BYTE *)&flags, sizeof(flags) ); memset( &startup, 0, sizeof(startup) ); startup.cb = sizeof(startup); sprintf( buffer, "%s heap.c 0x%x", argv0, flags ); ret = CreateProcessA( NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &info ); ok( ret, "failed to create child process error %u\n", GetLastError() ); if (ret) { winetest_wait_child_process( info.hProcess ); CloseHandle( info.hThread ); CloseHandle( info.hProcess ); } RegDeleteValueA( hkey, "GlobalFlag" ); RegCloseKey( hkey ); RegDeleteKeyA( HKEY_LOCAL_MACHINE, keyname ); }
static void run_client(const char *test) { char cmdline[MAX_PATH]; PROCESS_INFORMATION info; STARTUPINFOA startup; memset(&startup, 0, sizeof startup); startup.cb = sizeof startup; make_cmdline(cmdline, test); ok(CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); winetest_wait_child_process( info.hProcess ); ok(CloseHandle(info.hProcess), "CloseHandle\n"); ok(CloseHandle(info.hThread), "CloseHandle\n"); }
static void run_child(WCHAR *secret) { static const WCHAR format[] = {'%','s',' ','q','m','g','r',' ','%','s', 0}; WCHAR cmdline[MAX_PATH]; PROCESS_INFORMATION info; STARTUPINFOW startup; memset(&startup, 0, sizeof startup); startup.cb = sizeof startup; wsprintfW(cmdline, format, progname, secret); ok(CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); winetest_wait_child_process(info.hProcess); ok(CloseHandle(info.hProcess), "CloseHandle\n"); ok(CloseHandle(info.hThread), "CloseHandle\n"); }
static void test_LresultFromObject(const char *name) { PROCESS_INFORMATION proc; STARTUPINFOA startup; char cmdline[MAX_PATH]; IUnknown *unk; HRESULT hres; LRESULT lres; lres = LresultFromObject(NULL, 0, 0); ok(lres == E_INVALIDARG, "got %lx\n", lres); hres = ObjectFromLresult(0, &IID_IUnknown, 0, (void**)&unk); ok(hres == E_FAIL, "got %x\n", hres); hres = ObjectFromLresult(0x10000, &IID_IUnknown, 0, (void**)&unk); ok(hres == E_FAIL, "got %x\n", hres); ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); lres = LresultFromObject(&IID_IUnknown, 0, &Object); ok(SUCCEEDED(lres), "got %lx\n", lres); ok(Object_ref > 1, "Object_ref = %d\n", Object_ref); hres = ObjectFromLresult(lres, &IID_IUnknown, 0, (void**)&unk); ok(hres == S_OK, "hres = %x\n", hres); ok(unk == &Object, "unk != &Object\n"); IUnknown_Release(unk); ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); lres = LresultFromObject(&IID_IUnknown, 0, &Object); ok(SUCCEEDED(lres), "got %lx\n", lres); ok(Object_ref > 1, "Object_ref = %d\n", Object_ref); sprintf(cmdline, "\"%s\" main ObjectFromLresult %lx", name, lres); memset(&startup, 0, sizeof(startup)); startup.cb = sizeof(startup); CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &proc); winetest_wait_child_process(proc.hProcess); ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); }