WCHAR *msi_font_version_from_file( const WCHAR *filename ) { static const WCHAR fmtW[] = {'%','u','.','%','u','.','0','.','0',0}; WCHAR *version, *p, *q, *ret = NULL; if ((version = load_ttf_name_id( filename, NAME_ID_VERSION ))) { int len, major = 0, minor = 0; if ((p = strchrW( version, ';' ))) *p = 0; p = version; while (*p && !isdigitW( *p )) p++; if ((q = strchrW( p, '.' ))) { major = atoiW( p ); p = ++q; while (*q && isdigitW( *q )) q++; if (!*q || *q == ' ') minor = atoiW( p ); else major = 0; } len = strlenW( fmtW ) + 20; ret = msi_alloc( len * sizeof(WCHAR) ); sprintfW( ret, fmtW, major, minor ); msi_free( version ); } return ret; }
static void load_registry_parameters(void) { static const WCHAR controlW[] = { 'S','y','s','t','e','m','\\', 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', 'C','o','n','t','r','o','l',0 }; static const WCHAR pipetimeoutW[] = {'S','e','r','v','i','c','e','s','P','i','p','e','T','i','m','e','o','u','t',0}; static const WCHAR killtimeoutW[] = {'W','a','i','t','T','o','K','i','l','l','S','e','r','v','i','c','e','T','i','m','e','o','u','t',0}; HKEY key; WCHAR buffer[64]; DWORD type, count, val; if (RegOpenKeyW( HKEY_LOCAL_MACHINE, controlW, &key )) return; count = sizeof(buffer); if (!RegQueryValueExW( key, pipetimeoutW, NULL, &type, (BYTE *)buffer, &count ) && type == REG_SZ && (val = atoiW( buffer ))) service_pipe_timeout = val; count = sizeof(buffer); if (!RegQueryValueExW( key, killtimeoutW, NULL, &type, (BYTE *)buffer, &count ) && type == REG_SZ && (val = atoiW( buffer ))) service_kill_timeout = val; RegCloseKey( key ); }
BOOLEAN WINAPI GetPwrDiskSpindownRange(PUINT RangeMax, PUINT RangeMin) { HKEY hKey; BYTE lpValue[40]; LONG r; DWORD cbValue = sizeof(lpValue); TRACE("(%p, %p)\n", RangeMax, RangeMin); if (RangeMax == NULL || RangeMin == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } SetLastError(ERROR_SUCCESS); WaitForSingleObject(PPRegSemaphore, INFINITE); r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPowerCfgSubKey, 0, KEY_READ, &hKey); if (r != ERROR_SUCCESS) { TRACE("RegOpenKeyEx failed: %d\n", r); TRACE("Using defaults: 3600, 3\n"); *RangeMax = 3600; *RangeMin = 3; ReleaseSemaphore(PPRegSemaphore, 1, NULL); return TRUE; } r = RegQueryValueExW(hKey, szDiskMax, 0, 0, lpValue, &cbValue); if (r != ERROR_SUCCESS) { TRACE("Couldn't open DiskSpinDownMax: %d\n", r); TRACE("Using default: 3600\n"); *RangeMax = 3600; } else { *RangeMax = atoiW((LPCWSTR)lpValue); } cbValue = sizeof(lpValue); r = RegQueryValueExW(hKey, szDiskMin, 0, 0, lpValue, &cbValue); if (r != ERROR_SUCCESS) { TRACE("Couldn't open DiskSpinDownMin: %d\n", r); TRACE("Using default: 3\n"); *RangeMin = 3; } else { *RangeMin = atoiW((LPCWSTR)lpValue); } RegCloseKey(hKey); ReleaseSemaphore(PPRegSemaphore, 1, NULL); return TRUE; }
static LANGID *parse_languages( const WCHAR *languages, DWORD *num_ids ) { UINT i, count = 1; WCHAR *str = strdupW( languages ), *p, *q; LANGID *ret; if (!str) return NULL; for (p = q = str; (q = strchrW( q, ',' )); q++) count++; if (!(ret = msi_alloc( count * sizeof(LANGID) ))) { msi_free( str ); return NULL; } i = 0; while (*p) { q = strchrW( p, ',' ); if (q) *q = 0; ret[i] = atoiW( p ); if (!q) break; p = q + 1; i++; } msi_free( str ); *num_ids = count; return ret; }
static HRESULT WINAPI MMDevPropStore_GetAt(IPropertyStore *iface, DWORD prop, PROPERTYKEY *key) { MMDevPropStore *This = impl_from_IPropertyStore(iface); WCHAR buffer[50]; DWORD len = sizeof(buffer)/sizeof(*buffer); HRESULT hr; HKEY propkey; TRACE("(%p)->(%u,%p)\n", iface, prop, key); if (!key) return E_POINTER; hr = MMDevPropStore_OpenPropKey(&This->parent->devguid, This->parent->flow, &propkey); if (FAILED(hr)) return hr; if (RegEnumKeyExW(propkey, prop, buffer, &len, NULL, NULL, NULL, NULL) != ERROR_SUCCESS || len <= 40) { WARN("GetAt %u failed\n", prop); return E_INVALIDARG; } RegCloseKey(propkey); buffer[39] = 0; CLSIDFromString(buffer, &key->fmtid); key->pid = atoiW(&buffer[40]); return S_OK; }
static HRESULT WINAPI WshShortcut_put_IconLocation(IWshShortcut *iface, BSTR IconPath) { WshShortcut *This = impl_from_IWshShortcut(iface); HRESULT hr; WCHAR *ptr; BSTR path; INT icon; TRACE("(%p)->(%s)\n", This, debugstr_w(IconPath)); /* scan for icon id */ ptr = strrchrW(IconPath, ','); if (!ptr) { WARN("icon index not found\n"); return E_FAIL; } path = SysAllocStringLen(IconPath, ptr-IconPath); /* skip spaces if any */ while (isspaceW(*++ptr)) ; icon = atoiW(ptr); hr = IShellLinkW_SetIconLocation(This->link, path, icon); SysFreeString(path); return hr; }
static BOOL IPADDRESS_ConstrainField (IPADDRESS_INFO *infoPtr, int currentfield) { IPPART_INFO *part = &infoPtr->Part[currentfield]; WCHAR field[10]; static const WCHAR fmt[] = { '%', 'd', 0 }; int curValue, newValue; TRACE("(currentfield=%d)\n", currentfield); if (currentfield < 0 || currentfield > 3) return FALSE; if (!GetWindowTextW (part->EditHwnd, field, 4)) return FALSE; curValue = atoiW(field); TRACE(" curValue=%d\n", curValue); newValue = IPADDRESS_IPNotify(infoPtr, currentfield, curValue); TRACE(" newValue=%d\n", newValue); if (newValue < part->LowerLimit) newValue = part->LowerLimit; if (newValue > part->UpperLimit) newValue = part->UpperLimit; if (newValue == curValue) return FALSE; wsprintfW (field, fmt, newValue); TRACE(" field='%s'\n", debugstr_w(field)); return SetWindowTextW (part->EditHwnd, field); }
DWORD msi_version_str_to_dword(LPCWSTR p) { DWORD major, minor = 0, build = 0, version = 0; if (!p) return version; major = atoiW(p); p = strchrW(p, '.'); if (p) { minor = atoiW(p+1); p = strchrW(p+1, '.'); if (p) build = atoiW(p+1); } return MAKELONG(build, MAKEWORD(minor, major)); }
static HRESULT getIconLocationForFolder(IExtractIconW *iface, UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) { IExtractIconWImpl *This = (IExtractIconWImpl *)iface; int icon_idx; WCHAR wszPath[MAX_PATH]; WCHAR wszCLSIDValue[CHARS_IN_GUID]; static const WCHAR shellClassInfo[] = { '.','S','h','e','l','l','C','l','a','s','s','I','n','f','o',0 }; static const WCHAR iconFile[] = { 'I','c','o','n','F','i','l','e',0 }; static const WCHAR clsid[] = { 'C','L','S','I','D',0 }; static const WCHAR clsid2[] = { 'C','L','S','I','D','2',0 }; static const WCHAR iconIndex[] = { 'I','c','o','n','I','n','d','e','x',0 }; if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, iconFile, wszPath, MAX_PATH)) { WCHAR wszIconIndex[10]; SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, iconIndex, wszIconIndex, 10); *piIndex = atoiW(wszIconIndex); } else if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, clsid, wszCLSIDValue, CHARS_IN_GUID) && HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &icon_idx)) { *piIndex = icon_idx; } else if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, clsid2, wszCLSIDValue, CHARS_IN_GUID) && HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &icon_idx)) { *piIndex = icon_idx; } else { static const WCHAR folder[] = { 'F','o','l','d','e','r',0 }; if (!HCR_GetDefaultIconW(folder, szIconFile, cchMax, &icon_idx)) { lstrcpynW(szIconFile, swShell32Name, cchMax); icon_idx = -IDI_SHELL_FOLDER; } if (uFlags & GIL_OPENICON) *piIndex = icon_idx<0? icon_idx-1: icon_idx+1; else *piIndex = icon_idx; } return S_OK; }
/*********************************************************************** * build_zonemap_from_reg [internal] * * Enumerate the Zones in the Registry and return the Zones in a DWORD-array * The number of the Zones is returned in data[0] */ static LPDWORD build_zonemap_from_reg(void) { WCHAR name[32]; HKEY hkey; LPDWORD data = NULL; DWORD allocated = 6; /* space for the zonecount and Zone "0" up to Zone "4" */ DWORD used = 0; DWORD res; DWORD len; res = RegOpenKeyW(HKEY_CURRENT_USER, wszZonesKey, &hkey); if (res) return NULL; data = heap_alloc(allocated * sizeof(DWORD)); if (!data) goto cleanup; while (!res) { name[0] = '\0'; len = sizeof(name) / sizeof(name[0]); res = RegEnumKeyExW(hkey, used, name, &len, NULL, NULL, NULL, NULL); if (!res) { used++; if (used == allocated) { LPDWORD new_data; allocated *= 2; new_data = heap_realloc_zero(data, allocated * sizeof(DWORD)); if (!new_data) goto cleanup; data = new_data; } data[used] = atoiW(name); } } if (used) { RegCloseKey(hkey); data[0] = used; return data; } cleanup: /* something failed */ RegCloseKey(hkey); heap_free(data); return NULL; }
void msi_parse_version_string(LPCWSTR verStr, PDWORD ms, PDWORD ls) { const WCHAR *ptr; int x1 = 0, x2 = 0, x3 = 0, x4 = 0; x1 = atoiW(verStr); ptr = strchrW(verStr, '.'); if (ptr) { x2 = atoiW(ptr + 1); ptr = strchrW(ptr + 1, '.'); } if (ptr) { x3 = atoiW(ptr + 1); ptr = strchrW(ptr + 1, '.'); } if (ptr) x4 = atoiW(ptr + 1); /* FIXME: byte-order dependent? */ *ms = x1 << 16 | x2; *ls = x3 << 16 | x4; }
static void ACTION_VerStrToInteger(LPCWSTR verStr, PDWORD ms, PDWORD ls) { const WCHAR *ptr; int x1 = 0, x2 = 0, x3 = 0, x4 = 0; x1 = atoiW(verStr); ptr = strchrW(verStr, '.'); if (ptr) { x2 = atoiW(ptr + 1); ptr = strchrW(ptr + 1, '.'); } if (ptr) { x3 = atoiW(ptr + 1); ptr = strchrW(ptr + 1, '.'); } if (ptr) x4 = atoiW(ptr + 1); /* FIXME: byte-order dependent? */ *ms = x1 << 16 | x2; *ls = x3 << 16 | x4; }
static BOOL check_language(DWORD lang1, LPCWSTR lang2, DWORD attributes) { DWORD langdword; if (!lang2 || lang2[0]==0) return TRUE; langdword = atoiW(lang2); if (attributes & msidbUpgradeAttributesLanguagesExclusive) return (lang1 != langdword); else return (lang1 == langdword); }
/***************************************************************************** * SIC_LoadOverlayIcon [internal] * * Load a shell overlay icon and return its icon cache index. */ static int SIC_LoadOverlayIcon(int icon_idx) { WCHAR buffer[1024], wszIdx[8]; HKEY hKeyShellIcons; LPCWSTR iconPath; int iconIdx; static const WCHAR wszShellIcons[] = { 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'E','x','p','l','o','r','e','r','\\','S','h','e','l','l',' ','I','c','o','n','s',0 }; static const WCHAR wszNumFmt[] = {'%','d',0}; iconPath = swShell32Name; /* default: load icon from shell32.dll */ iconIdx = icon_idx; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, wszShellIcons, 0, KEY_READ, &hKeyShellIcons) == ERROR_SUCCESS) { DWORD count = sizeof(buffer); sprintfW(wszIdx, wszNumFmt, icon_idx); /* read icon path and index */ if (RegQueryValueExW(hKeyShellIcons, wszIdx, NULL, NULL, (LPBYTE)buffer, &count) == ERROR_SUCCESS) { LPWSTR p = strchrW(buffer, ','); if (!p) { ERR("Icon index in %s/%s corrupted, no comma.\n", debugstr_w(wszShellIcons),debugstr_w(wszIdx)); RegCloseKey(hKeyShellIcons); return -1; } *p++ = 0; iconPath = buffer; iconIdx = atoiW(p); } RegCloseKey(hKeyShellIcons); } InitOnceExecuteOnce( &sic_init_once, SIC_Initialize, NULL, NULL ); return SIC_LoadIcon(iconPath, iconIdx, 0); }
/*********************************************************************** * WININET_GetConnectionStatus */ static INT WININET_GetConnectionStatus( HINTERNET hRequest ) { WCHAR szStatus[0x20]; DWORD sz, index, dwStatus; TRACE("%p\n", hRequest ); sz = sizeof szStatus; index = 0; if( !HttpQueryInfoW( hRequest, HTTP_QUERY_STATUS_CODE, szStatus, &sz, &index)) return -1; dwStatus = atoiW( szStatus ); TRACE("request %p status = %d\n", hRequest, dwStatus ); return dwStatus; }
static BOOL HCR_RegGetIconW(HKEY hkey, LPWSTR szDest, LPCWSTR szName, DWORD len, int* picon_idx) { DWORD dwType; WCHAR sTemp[MAX_PATH]; WCHAR sNum[7]; if (!RegQueryValueExW(hkey, szName, 0, &dwType, (LPBYTE)szDest, &len)) { if (dwType == REG_EXPAND_SZ) { ExpandEnvironmentStringsW(szDest, sTemp, MAX_PATH); lstrcpynW(szDest, sTemp, len); } if (ParseFieldW (szDest, 2, sNum, _countof(sNum))) *picon_idx = atoiW(sNum); else *picon_idx=0; /* sometimes the icon number is missing */ ParseFieldW (szDest, 1, szDest, len); PathUnquoteSpacesW(szDest); return TRUE; } return FALSE; }
time_t ConvertTimeString(LPCWSTR asctime) { WCHAR tmpChar[TIME_STRING_LEN]; WCHAR *tmpChar2; struct tm t; int timelen = strlenW(asctime); if(!timelen) return 0; /* FIXME: the atoiWs below rely on that tmpChar is \0 padded */ memset( tmpChar, 0, sizeof(tmpChar) ); lstrcpynW(tmpChar, asctime, TIME_STRING_LEN); /* Assert that the string is the expected length */ if (strlenW(asctime) >= TIME_STRING_LEN) FIXME("\n"); /* Convert a time such as 'Mon, 15 Nov 1999 16:09:35 GMT' into a SYSTEMTIME structure * We assume the time is in this format * and divide it into easy to swallow chunks */ tmpChar[3]='\0'; tmpChar[7]='\0'; tmpChar[11]='\0'; tmpChar[16]='\0'; tmpChar[19]='\0'; tmpChar[22]='\0'; tmpChar[25]='\0'; memset( &t, 0, sizeof(t) ); t.tm_year = atoiW(tmpChar+12) - 1900; t.tm_mday = atoiW(tmpChar+5); t.tm_hour = atoiW(tmpChar+17); t.tm_min = atoiW(tmpChar+20); t.tm_sec = atoiW(tmpChar+23); /* and month */ tmpChar2 = tmpChar + 8; switch(tmpChar2[2]) { case 'n': if(tmpChar2[1]=='a') t.tm_mon = 0; else t.tm_mon = 5; break; case 'b': t.tm_mon = 1; break; case 'r': if(tmpChar2[1]=='a') t.tm_mon = 2; else t.tm_mon = 3; break; case 'y': t.tm_mon = 4; break; case 'l': t.tm_mon = 6; break; case 'g': t.tm_mon = 7; break; case 'p': t.tm_mon = 8; break; case 't': t.tm_mon = 9; break; case 'v': t.tm_mon = 10; break; case 'c': t.tm_mon = 11; break; default: FIXME("\n"); } return mktime(&t); }
static int terminate_processes(void) { DWORD *pid_list, pid_list_size; DWORD self_pid = GetCurrentProcessId(); unsigned int i; int status_code = 0; pid_list = enumerate_processes(&pid_list_size); if (!pid_list) { taskkill_message(STRING_ENUM_FAILED); return 1; } for (i = 0; i < task_count; i++) { WCHAR *p = task_list[i]; BOOL is_numeric = TRUE; /* Determine whether the string is not numeric. */ while (*p) { if (!isdigitW(*p++)) { is_numeric = FALSE; break; } } if (is_numeric) { DWORD pid = atoiW(task_list[i]); HANDLE process; if (pid == self_pid) { taskkill_message(STRING_SELF_TERMINATION); status_code = 1; continue; } process = OpenProcess(PROCESS_TERMINATE, FALSE, pid); if (!process) { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; continue; } if (!TerminateProcess(process, 0)) { taskkill_message_printfW(STRING_TERMINATE_FAILED, task_list[i]); status_code = 1; CloseHandle(process); continue; } taskkill_message_printfW(STRING_TERM_PID_SEARCH, pid); CloseHandle(process); } else { DWORD index; BOOL found_process = FALSE; for (index = 0; index < pid_list_size; index++) { WCHAR process_name[MAX_PATH]; if (get_process_name_from_pid(pid_list[index], process_name, MAX_PATH) && !strcmpiW(process_name, task_list[i])) { HANDLE process; if (pid_list[index] == self_pid) { taskkill_message(STRING_SELF_TERMINATION); status_code = 1; continue; } process = OpenProcess(PROCESS_TERMINATE, FALSE, pid_list[index]); if (!process) { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; continue; } if (!TerminateProcess(process, 0)) { taskkill_message_printfW(STRING_TERMINATE_FAILED, task_list[i]); status_code = 1; CloseHandle(process); continue; } found_process = TRUE; taskkill_message_printfW(STRING_TERM_PROC_SEARCH, task_list[i], pid_list[index]); CloseHandle(process); } } if (!found_process) { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; } } } HeapFree(GetProcessHeap(), 0, pid_list); return status_code; }
/* The implemented task enumeration and termination behavior does not * exactly match native behavior. On Windows: * * In the case of terminating by process name, specifying a particular * process name more times than the number of running instances causes * all instances to be terminated, but termination failure messages to * be printed as many times as the difference between the specification * quantity and the number of running instances. * * Successful terminations are all listed first in order, with failing * terminations being listed at the end. * * A PID of zero causes taskkill to warn about the inability to terminate * system processes. */ static int send_close_messages(void) { DWORD *pid_list, pid_list_size; DWORD self_pid = GetCurrentProcessId(); unsigned int i; int status_code = 0; pid_list = enumerate_processes(&pid_list_size); if (!pid_list) { taskkill_message(STRING_ENUM_FAILED); return 1; } for (i = 0; i < task_count; i++) { WCHAR *p = task_list[i]; BOOL is_numeric = TRUE; /* Determine whether the string is not numeric. */ while (*p) { if (!isdigitW(*p++)) { is_numeric = FALSE; break; } } if (is_numeric) { DWORD pid = atoiW(task_list[i]); struct pid_close_info info = { pid }; if (pid == self_pid) { taskkill_message(STRING_SELF_TERMINATION); status_code = 1; continue; } EnumWindows(pid_enum_proc, (LPARAM)&info); if (info.found) taskkill_message_printfW(STRING_CLOSE_PID_SEARCH, pid); else { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; } } else { DWORD index; BOOL found_process = FALSE; for (index = 0; index < pid_list_size; index++) { WCHAR process_name[MAX_PATH]; if (get_process_name_from_pid(pid_list[index], process_name, MAX_PATH) && !strcmpiW(process_name, task_list[i])) { struct pid_close_info info = { pid_list[index] }; found_process = TRUE; if (pid_list[index] == self_pid) { taskkill_message(STRING_SELF_TERMINATION); status_code = 1; continue; } EnumWindows(pid_enum_proc, (LPARAM)&info); taskkill_message_printfW(STRING_CLOSE_PROC_SRCH, process_name, pid_list[index]); } } if (!found_process) { taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); status_code = 128; } } } HeapFree(GetProcessHeap(), 0, pid_list); return status_code; }
static HRESULT HttpProtocol_start_downloading(Protocol *prot) { HttpProtocol *This = ASYNCPROTOCOL_THIS(prot); LPWSTR content_type, content_length, ranges; DWORD len = sizeof(DWORD); DWORD status_code; BOOL res; HRESULT hres; static const WCHAR wszDefaultContentType[] = {'t','e','x','t','/','h','t','m','l',0}; if(!This->http_negotiate) { WARN("Expected IHttpNegotiate pointer to be non-NULL\n"); return S_OK; } res = HttpQueryInfoW(This->base.request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status_code, &len, NULL); if(res) { LPWSTR response_headers = query_http_info(This, HTTP_QUERY_RAW_HEADERS_CRLF); if(response_headers) { hres = IHttpNegotiate_OnResponse(This->http_negotiate, status_code, response_headers, NULL, NULL); heap_free(response_headers); if (hres != S_OK) { WARN("IHttpNegotiate_OnResponse failed: %08x\n", hres); return S_OK; } } }else { WARN("HttpQueryInfo failed: %d\n", GetLastError()); } ranges = query_http_info(This, HTTP_QUERY_ACCEPT_RANGES); if(ranges) { IInternetProtocolSink_ReportProgress(This->base.protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL); heap_free(ranges); } content_type = query_http_info(This, HTTP_QUERY_CONTENT_TYPE); if(content_type) { /* remove the charset, if present */ LPWSTR p = strchrW(content_type, ';'); if (p) *p = '\0'; IInternetProtocolSink_ReportProgress(This->base.protocol_sink, (This->base.bindf & BINDF_FROMURLMON) ? BINDSTATUS_MIMETYPEAVAILABLE : BINDSTATUS_RAWMIMETYPE, content_type); heap_free(content_type); }else { WARN("HttpQueryInfo failed: %d\n", GetLastError()); IInternetProtocolSink_ReportProgress(This->base.protocol_sink, (This->base.bindf & BINDF_FROMURLMON) ? BINDSTATUS_MIMETYPEAVAILABLE : BINDSTATUS_RAWMIMETYPE, wszDefaultContentType); } content_length = query_http_info(This, HTTP_QUERY_CONTENT_LENGTH); if(content_length) { This->base.content_length = atoiW(content_length); heap_free(content_length); } return S_OK; }
/********************************************************************** * get_nt_registry_version * * Fetch the version information from the NT-style registry keys. */ static BOOL get_nt_registry_version( RTL_OSVERSIONINFOEXW *version ) { static const WCHAR version_keyW[] = {'M','a','c','h','i','n','e','\\', 'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s',' ','N','T','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n',0}; static const WCHAR service_pack_keyW[] = {'M','a','c','h','i','n','e','\\', 'S','y','s','t','e','m','\\', 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', 'C','o','n','t','r','o','l','\\', 'W','i','n','d','o','w','s',0}; static const WCHAR product_keyW[] = {'M','a','c','h','i','n','e','\\', 'S','y','s','t','e','m','\\', 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', 'C','o','n','t','r','o','l','\\', 'P','r','o','d','u','c','t','O','p','t','i','o','n','s',0}; static const WCHAR CurrentBuildNumberW[] = {'C','u','r','r','e','n','t','B','u','i','l','d','N','u','m','b','e','r',0}; static const WCHAR CSDVersionW[] = {'C','S','D','V','e','r','s','i','o','n',0}; static const WCHAR CurrentVersionW[] = {'C','u','r','r','e','n','t','V','e','r','s','i','o','n',0}; static const WCHAR ProductTypeW[] = {'P','r','o','d','u','c','t','T','y','p','e',0}; static const WCHAR WinNTW[] = {'W','i','n','N','T',0}; static const WCHAR ServerNTW[] = {'S','e','r','v','e','r','N','T',0}; static const WCHAR LanmanNTW[] = {'L','a','n','m','a','n','N','T',0}; OBJECT_ATTRIBUTES attr; UNICODE_STRING nameW, valueW; HANDLE hkey, hkey2; char tmp[64]; DWORD count; BOOL ret = FALSE; KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)tmp; attr.Length = sizeof(attr); attr.RootDirectory = 0; attr.ObjectName = &nameW; attr.Attributes = 0; attr.SecurityDescriptor = NULL; attr.SecurityQualityOfService = NULL; RtlInitUnicodeString( &nameW, version_keyW ); if (NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr )) return FALSE; memset( version, 0, sizeof(*version) ); RtlInitUnicodeString( &valueW, CurrentVersionW ); if (!NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp)-1, &count )) { WCHAR *p, *str = (WCHAR *)info->Data; str[info->DataLength / sizeof(WCHAR)] = 0; p = strchrW( str, '.' ); if (p) { *p++ = 0; version->dwMinorVersion = atoiW( p ); } version->dwMajorVersion = atoiW( str ); } if (version->dwMajorVersion) /* we got the main version, now fetch the other fields */ { ret = TRUE; version->dwPlatformId = VER_PLATFORM_WIN32_NT; /* get build number */ RtlInitUnicodeString( &valueW, CurrentBuildNumberW ); if (!NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp)-1, &count )) { WCHAR *str = (WCHAR *)info->Data; str[info->DataLength / sizeof(WCHAR)] = 0; version->dwBuildNumber = atoiW( str ); } /* get version description */ RtlInitUnicodeString( &valueW, CSDVersionW ); if (!NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp)-1, &count )) { DWORD len = min( info->DataLength, sizeof(version->szCSDVersion) - sizeof(WCHAR) ); memcpy( version->szCSDVersion, info->Data, len ); version->szCSDVersion[len / sizeof(WCHAR)] = 0; } /* get service pack version */ RtlInitUnicodeString( &nameW, service_pack_keyW ); if (!NtOpenKey( &hkey2, KEY_ALL_ACCESS, &attr )) { RtlInitUnicodeString( &valueW, CSDVersionW ); if (!NtQueryValueKey( hkey2, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp), &count )) { if (info->DataLength >= sizeof(DWORD)) { DWORD dw = *(DWORD *)info->Data; version->wServicePackMajor = LOWORD(dw) >> 8; version->wServicePackMinor = LOWORD(dw) & 0xff; } }
static HRESULT do_process_key(LPCOLESTR *pstr, HKEY parent_key, strbuf *buf, BOOL do_register) { LPCOLESTR iter; HRESULT hres; LONG lres; HKEY hkey = 0; strbuf name; enum { NORMAL, NO_REMOVE, IS_VAL, FORCE_REMOVE, DO_DELETE } key_type = NORMAL; static const WCHAR wstrNoRemove[] = {'N','o','R','e','m','o','v','e',0}; static const WCHAR wstrForceRemove[] = {'F','o','r','c','e','R','e','m','o','v','e',0}; static const WCHAR wstrDelete[] = {'D','e','l','e','t','e',0}; static const WCHAR wstrval[] = {'v','a','l',0}; iter = *pstr; hres = get_word(&iter, buf); if(FAILED(hres)) return hres; strbuf_init(&name); while(buf->str[1] || buf->str[0] != '}') { key_type = NORMAL; if(!lstrcmpiW(buf->str, wstrNoRemove)) key_type = NO_REMOVE; else if(!lstrcmpiW(buf->str, wstrForceRemove)) key_type = FORCE_REMOVE; else if(!lstrcmpiW(buf->str, wstrval)) key_type = IS_VAL; else if(!lstrcmpiW(buf->str, wstrDelete)) key_type = DO_DELETE; if(key_type != NORMAL) { hres = get_word(&iter, buf); if(FAILED(hres)) break; } TRACE("name = %s\n", debugstr_w(buf->str)); if(do_register) { if(key_type == IS_VAL) { hkey = parent_key; strbuf_write(buf->str, &name, -1); }else if(key_type == DO_DELETE) { TRACE("Deleting %s\n", debugstr_w(buf->str)); RegDeleteTreeW(parent_key, buf->str); }else { if(key_type == FORCE_REMOVE) RegDeleteTreeW(parent_key, buf->str); lres = RegCreateKeyW(parent_key, buf->str, &hkey); if(lres != ERROR_SUCCESS) { WARN("Could not create(open) key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } } }else if(key_type != IS_VAL && key_type != DO_DELETE) { strbuf_write(buf->str, &name, -1); lres = RegOpenKeyW(parent_key, buf->str, &hkey); if(lres != ERROR_SUCCESS) WARN("Could not open key %s: %08x\n", debugstr_w(name.str), lres); } if(key_type != DO_DELETE && *iter == '=') { iter++; hres = get_word(&iter, buf); if(FAILED(hres)) break; if(buf->len != 1) { WARN("Wrong registry type: %s\n", debugstr_w(buf->str)); hres = DISP_E_EXCEPTION; break; } if(do_register) { switch(buf->str[0]) { case 's': hres = get_word(&iter, buf); if(FAILED(hres)) break; lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_SZ, (PBYTE)buf->str, (lstrlenW(buf->str)+1)*sizeof(WCHAR)); if(lres != ERROR_SUCCESS) { WARN("Could set value of key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } break; case 'd': { DWORD dw; hres = get_word(&iter, buf); if(FAILED(hres)) break; dw = atoiW(buf->str); lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_DWORD, (PBYTE)&dw, sizeof(dw)); if(lres != ERROR_SUCCESS) { WARN("Could set value of key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } break; } case 'b': { BYTE *bytes; DWORD count; DWORD i; hres = get_word(&iter, buf); if(FAILED(hres)) break; count = (lstrlenW(buf->str) + 1) / 2; bytes = HeapAlloc(GetProcessHeap(), 0, count); if(bytes == NULL) { hres = E_OUTOFMEMORY; break; } for(i = 0; i < count && buf->str[2*i]; i++) { WCHAR digits[3]; if(!isxdigitW(buf->str[2*i]) || !isxdigitW(buf->str[2*i + 1])) { hres = E_FAIL; break; } digits[0] = buf->str[2*i]; digits[1] = buf->str[2*i + 1]; digits[2] = 0; bytes[i] = (BYTE) strtoulW(digits, NULL, 16); } if(SUCCEEDED(hres)) { lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_BINARY, bytes, count); if(lres != ERROR_SUCCESS) { WARN("Could not set value of key: 0x%08x\n", lres); hres = HRESULT_FROM_WIN32(lres); } } HeapFree(GetProcessHeap(), 0, bytes); break; } default: WARN("Wrong resource type: %s\n", debugstr_w(buf->str)); hres = DISP_E_EXCEPTION; }; if(FAILED(hres)) break; }else { if(*iter == '-') iter++; hres = get_word(&iter, buf); if(FAILED(hres)) break; } }else if(key_type == IS_VAL) { WARN("value not set!\n"); hres = DISP_E_EXCEPTION; break; } if(key_type != IS_VAL && key_type != DO_DELETE && *iter == '{' && isspaceW(iter[1])) { hres = get_word(&iter, buf); if(FAILED(hres)) break; hres = do_process_key(&iter, hkey, buf, do_register); if(FAILED(hres)) break; } TRACE("%x %x\n", do_register, key_type); if(!do_register && (key_type == NORMAL || key_type == FORCE_REMOVE)) { TRACE("Deleting %s\n", debugstr_w(name.str)); RegDeleteKeyW(parent_key, name.str); } if(hkey && key_type != IS_VAL) RegCloseKey(hkey); hkey = 0; name.len = 0; hres = get_word(&iter, buf); if(FAILED(hres)) break; } HeapFree(GetProcessHeap(), 0, name.str); if(hkey && key_type != IS_VAL) RegCloseKey(hkey); *pstr = iter; return hres; }
/************************************************************************** * StrToIntW [COMCTL32.365] * * See StrToIntA. */ INT WINAPI StrToIntW (LPCWSTR lpString) { return atoiW(lpString); }
/****************************************************************** * start_debugger * * Does the effective debugger startup according to 'format' */ static BOOL start_debugger(PEXCEPTION_POINTERS epointers, HANDLE hEvent) { OBJECT_ATTRIBUTES attr; UNICODE_STRING nameW; char *cmdline, *env, *p; HANDLE hDbgConf; DWORD bAuto = TRUE; PROCESS_INFORMATION info; STARTUPINFOA startup; char* format = NULL; BOOL ret = FALSE; char buffer[256]; static const WCHAR AeDebugW[] = {'M','a','c','h','i','n','e','\\', 'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s',' ','N','T','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'A','e','D','e','b','u','g',0}; static const WCHAR DebuggerW[] = {'D','e','b','u','g','g','e','r',0}; static const WCHAR AutoW[] = {'A','u','t','o',0}; format_exception_msg( epointers, buffer, sizeof(buffer) ); MESSAGE("wine: %s (thread %04x), starting debugger...\n", buffer, GetCurrentThreadId()); attr.Length = sizeof(attr); attr.RootDirectory = 0; attr.ObjectName = &nameW; attr.Attributes = 0; attr.SecurityDescriptor = NULL; attr.SecurityQualityOfService = NULL; RtlInitUnicodeString( &nameW, AeDebugW ); if (!NtOpenKey( &hDbgConf, KEY_ALL_ACCESS, &attr )) { char buffer[64]; KEY_VALUE_PARTIAL_INFORMATION *info; DWORD format_size = 0; RtlInitUnicodeString( &nameW, DebuggerW ); if (NtQueryValueKey( hDbgConf, &nameW, KeyValuePartialInformation, NULL, 0, &format_size ) == STATUS_BUFFER_OVERFLOW) { char *data = HeapAlloc(GetProcessHeap(), 0, format_size); NtQueryValueKey( hDbgConf, &nameW, KeyValuePartialInformation, data, format_size, &format_size ); info = (KEY_VALUE_PARTIAL_INFORMATION *)data; RtlUnicodeToMultiByteSize( &format_size, (WCHAR *)info->Data, info->DataLength ); format = HeapAlloc( GetProcessHeap(), 0, format_size+1 ); RtlUnicodeToMultiByteN( format, format_size, NULL, (WCHAR *)info->Data, info->DataLength ); format[format_size] = 0; if (info->Type == REG_EXPAND_SZ) { char* tmp; /* Expand environment variable references */ format_size=ExpandEnvironmentStringsA(format,NULL,0); tmp=HeapAlloc(GetProcessHeap(), 0, format_size); ExpandEnvironmentStringsA(format,tmp,format_size); HeapFree(GetProcessHeap(), 0, format); format=tmp; } HeapFree( GetProcessHeap(), 0, data ); } RtlInitUnicodeString( &nameW, AutoW ); if (!NtQueryValueKey( hDbgConf, &nameW, KeyValuePartialInformation, buffer, sizeof(buffer)-sizeof(WCHAR), &format_size )) { info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer; if (info->Type == REG_DWORD) memcpy( &bAuto, info->Data, sizeof(DWORD) ); else if (info->Type == REG_SZ) { WCHAR *str = (WCHAR *)info->Data; str[info->DataLength/sizeof(WCHAR)] = 0; bAuto = atoiW( str ); } } NtClose(hDbgConf); } if (format) { cmdline = HeapAlloc(GetProcessHeap(), 0, strlen(format) + 2*20); sprintf(cmdline, format, GetCurrentProcessId(), hEvent); HeapFree(GetProcessHeap(), 0, format); } else { cmdline = HeapAlloc(GetProcessHeap(), 0, 80); sprintf(cmdline, "winedbg --auto %d %ld", GetCurrentProcessId(), (ULONG_PTR)hEvent); } if (!bAuto) { HMODULE mod = GetModuleHandleA( "user32.dll" ); MessageBoxA_funcptr pMessageBoxA = NULL; if (mod) pMessageBoxA = (MessageBoxA_funcptr)GetProcAddress( mod, "MessageBoxA" ); if (pMessageBoxA) { static const char msg[] = ".\nDo you wish to debug it?"; char buffer[256]; format_exception_msg( epointers, buffer, sizeof(buffer)-sizeof(msg) ); strcat( buffer, msg ); if (pMessageBoxA( 0, buffer, "Exception raised", MB_YESNO | MB_ICONHAND ) == IDNO) { TRACE("Killing process\n"); goto EXIT; } } } /* make WINEDEBUG empty in the environment */ env = GetEnvironmentStringsA(); for (p = env; *p; p += strlen(p) + 1) { if (!memcmp( p, "WINEDEBUG=", sizeof("WINEDEBUG=")-1 )) { char *next = p + strlen(p); char *end = next + 1; while (*end) end += strlen(end) + 1; memmove( p + sizeof("WINEDEBUG=") - 1, next, end + 1 - next ); break; } } TRACE("Starting debugger %s\n", debugstr_a(cmdline)); memset(&startup, 0, sizeof(startup)); startup.cb = sizeof(startup); startup.dwFlags = STARTF_USESHOWWINDOW; startup.wShowWindow = SW_SHOWNORMAL; ret = CreateProcessA(NULL, cmdline, NULL, NULL, TRUE, 0, env, NULL, &startup, &info); FreeEnvironmentStringsA( env ); if (ret) { /* wait for debugger to come up... */ HANDLE handles[2]; CloseHandle(info.hThread); handles[0]=hEvent; handles[1]=info.hProcess; WaitForMultipleObjects(2, handles, FALSE, INFINITE); CloseHandle(info.hProcess); } else ERR("Couldn't start debugger (%s) (%d)\n" "Read the Wine Developers Guide on how to set up winedbg or another debugger\n", debugstr_a(cmdline), GetLastError()); EXIT: HeapFree(GetProcessHeap(), 0, cmdline); return ret; }
int wmain( int argc, WCHAR *argv[] ) { static const WCHAR noneW[] = {'n','o','n','e',0}; static const WCHAR mszipW[] = {'m','s','z','i','p',0}; WCHAR *p, *command; char buffer[MAX_PATH]; char filename[MAX_PATH]; char *cab_file, *file_part; int i; while (argv[1] && argv[1][0] == '-') { switch (argv[1][1]) { case 'd': argv++; argc--; opt_cabinet_size = atoiW( argv[1] ); if (opt_cabinet_size < 50000) { WINE_MESSAGE( "cabarc: Cabinet size must be at least 50000\n" ); return 1; } break; case 'h': usage(); return 0; case 'i': argv++; argc--; opt_cabinet_id = atoiW( argv[1] ); break; case 'm': argv++; argc--; if (!strcmpiW( argv[1], noneW )) opt_compression = tcompTYPE_NONE; else if (!strcmpiW( argv[1], mszipW )) opt_compression = tcompTYPE_MSZIP; else { WINE_MESSAGE( "cabarc: Unknown compression type '%s'\n", optarg ); return 1; } break; case 'p': opt_preserve_paths = 1; break; case 'r': opt_recurse = 1; break; case 's': argv++; argc--; opt_reserve_space = atoiW( argv[1] ); break; case 'v': opt_verbose++; break; default: usage(); return 1; } argv++; argc--; } command = argv[1]; if (argc < 3 || !command[0] || command[1]) { usage(); return 1; } cab_file = strdupWtoA( CP_ACP, argv[2] ); argv += 2; argc -= 2; if (!GetFullPathNameA( cab_file, MAX_PATH, buffer, &file_part ) || !file_part) { WINE_ERR( "cannot get full name for %s\n", wine_dbgstr_a( cab_file )); return 1; } strcpy(filename, file_part); file_part[0] = 0; /* map slash to backslash in all file arguments */ for (i = 1; i < argc; i++) for (p = argv[i]; *p; p++) if (*p == '/') *p = '\\'; opt_files = argv + 1; opt_cab_file = filename; switch (*command) { case 'l': case 'L': return list_cabinet( buffer ); case 'n': case 'N': return new_cabinet( buffer ); case 'x': case 'X': if (argc > 1) /* check for destination dir as last argument */ { WCHAR *last = argv[argc - 1]; if (last[0] && last[strlenW(last) - 1] == '\\') { opt_dest_dir = last; argv[--argc] = NULL; } } WINE_TRACE("Extracting file(s) from cabinet %s\n", wine_dbgstr_a(cab_file)); return extract_cabinet( buffer ); default: usage(); return 1; } }
static HRESULT HttpProtocol_start_downloading(Protocol *prot) { HttpProtocol *This = impl_from_Protocol(prot); LPWSTR content_type, content_length, ranges; DWORD len = sizeof(DWORD); DWORD status_code; BOOL res; HRESULT hres; static const WCHAR wszDefaultContentType[] = {'t','e','x','t','/','h','t','m','l',0}; if(!This->http_negotiate) { WARN("Expected IHttpNegotiate pointer to be non-NULL\n"); return S_OK; } res = HttpQueryInfoW(This->base.request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status_code, &len, NULL); if(res) { WCHAR *response_headers; if((This->base.bind_info.dwOptions & BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS) && is_redirect_response(status_code)) { WCHAR *location; TRACE("Got redirect with disabled auto redirects\n"); location = query_http_info(This, HTTP_QUERY_LOCATION); This->base.flags |= FLAG_RESULT_REPORTED | FLAG_LAST_DATA_REPORTED; IInternetProtocolSink_ReportResult(This->base.protocol_sink, INET_E_REDIRECT_FAILED, 0, location); heap_free(location); return INET_E_REDIRECT_FAILED; } response_headers = query_http_info(This, HTTP_QUERY_RAW_HEADERS_CRLF); if(response_headers) { hres = IHttpNegotiate_OnResponse(This->http_negotiate, status_code, response_headers, NULL, NULL); heap_free(response_headers); if (hres != S_OK) { WARN("IHttpNegotiate_OnResponse failed: %08x\n", hres); return S_OK; } } }else { WARN("HttpQueryInfo failed: %d\n", GetLastError()); } ranges = query_http_info(This, HTTP_QUERY_ACCEPT_RANGES); if(ranges) { IInternetProtocolSink_ReportProgress(This->base.protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL); heap_free(ranges); } content_type = query_http_info(This, HTTP_QUERY_CONTENT_TYPE); if(content_type) { /* remove the charset, if present */ LPWSTR p = strchrW(content_type, ';'); if (p) *p = '\0'; IInternetProtocolSink_ReportProgress(This->base.protocol_sink, (This->base.bindf & BINDF_FROMURLMON) ? BINDSTATUS_MIMETYPEAVAILABLE : BINDSTATUS_RAWMIMETYPE, content_type); heap_free(content_type); }else { WARN("HttpQueryInfo failed: %d\n", GetLastError()); IInternetProtocolSink_ReportProgress(This->base.protocol_sink, (This->base.bindf & BINDF_FROMURLMON) ? BINDSTATUS_MIMETYPEAVAILABLE : BINDSTATUS_RAWMIMETYPE, wszDefaultContentType); } content_length = query_http_info(This, HTTP_QUERY_CONTENT_LENGTH); if(content_length) { This->base.content_length = atoiW(content_length); heap_free(content_length); } return S_OK; }