4 typedef struct _LANGCODEPAGE
8 } LANGCODEPAGE
, *PLANGCODEPAGE
;
11 IsSameObject(IN IUnknown
*punk1
, IN IUnknown
*punk2
)
15 hRet
= punk1
->QueryInterface(IID_PPV_ARG(IUnknown
, &punk1
));
19 hRet
= punk2
->QueryInterface(IID_PPV_ARG(IUnknown
, &punk2
));
28 /* We're dealing with the same object if the IUnknown pointers are equal */
29 return (punk1
== punk2
) ? S_OK
: S_FALSE
;
33 LoadPopupMenu(IN HINSTANCE hInstance
,
34 IN LPCWSTR lpMenuName
)
36 HMENU hMenu
, hSubMenu
= NULL
;
38 hMenu
= LoadMenuW(hInstance
, lpMenuName
);
41 hSubMenu
= GetSubMenu(hMenu
, 0);
42 if ((hSubMenu
!= NULL
) &&
43 !RemoveMenu(hMenu
, 0, MF_BYPOSITION
))
55 FindSubMenu(IN HMENU hMenu
,
61 mii
.cbSize
= sizeof(mii
);
62 mii
.fMask
= MIIM_SUBMENU
;
64 if (GetMenuItemInfoW(hMenu
, uItem
, fByPosition
, &mii
))
73 GetCurrentLoggedOnUserName(OUT LPWSTR szBuffer
,
74 IN DWORD dwBufferSize
)
79 /* Query the user name from the registry */
80 dwSize
= (dwBufferSize
* sizeof(WCHAR
)) - 1;
81 if (RegQueryValueExW(hkExplorer
,
86 &dwSize
) == ERROR_SUCCESS
&&
87 (dwSize
/ sizeof(WCHAR
)) > 1 &&
90 szBuffer
[dwSize
/ sizeof(WCHAR
)] = L
'\0';
94 /* Fall back to GetUserName() */
95 dwSize
= dwBufferSize
;
96 if (!GetUserNameW(szBuffer
, &dwSize
))
106 FormatMenuString(IN HMENU hMenu
,
116 /* Find the menu item and read the formatting string */
117 mii
.cbSize
= sizeof(mii
);
118 mii
.fMask
= MIIM_STRING
;
119 mii
.dwTypeData
= szBufFmt
;
120 mii
.cch
= _countof(szBufFmt
);
121 if (GetMenuItemInfoW(hMenu
, uPosition
, uFlags
, &mii
))
123 /* Format the string */
124 va_start(vl
, uFlags
);
130 szBuf
[_countof(szBuf
) - 1] = L
'\0';
132 /* Update the menu item */
133 mii
.dwTypeData
= szBuf
;
134 if (SetMenuItemInfo(hMenu
, uPosition
, uFlags
, &mii
))
144 GetExplorerRegValueSet(IN HKEY hKey
,
148 WCHAR szBuffer
[MAX_PATH
];
150 DWORD dwType
, dwSize
;
153 StringCbCopyW(szBuffer
, sizeof(szBuffer
),
154 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer");
155 if (FAILED_UNEXPECTEDLY(StringCbCatW(szBuffer
, sizeof(szBuffer
), L
"\\")))
157 if (FAILED_UNEXPECTEDLY(StringCbCatW(szBuffer
, sizeof(szBuffer
), lpSubKey
)))
160 dwSize
= sizeof(szBuffer
);
161 if (RegOpenKeyExW(hKey
,
165 &hkSubKey
) == ERROR_SUCCESS
)
167 ZeroMemory(szBuffer
, sizeof(szBuffer
));
169 if (RegQueryValueExW(hkSubKey
,
174 &dwSize
) == ERROR_SUCCESS
)
176 if ((dwType
== REG_DWORD
) && (dwSize
== sizeof(DWORD
)))
177 Ret
= *((PDWORD
)szBuffer
) != 0;
179 Ret
= *((PWCHAR
)szBuffer
) != 0;
182 RegCloseKey(hkSubKey
);
188 GetVersionInfoString(IN LPCWSTR szFileName
,
189 IN LPCWSTR szVersionInfo
,
193 LPVOID lpData
= NULL
;
194 WCHAR szSubBlock
[128];
195 WCHAR
*lpszLocalBuf
= NULL
;
197 PLANGCODEPAGE lpTranslate
= NULL
;
205 dwLen
= GetFileVersionInfoSizeW(szFileName
, &dwHandle
);
209 lpData
= HeapAlloc(hProcessHeap
, 0, dwLen
);
213 if (GetFileVersionInfoW(szFileName
,
218 UserLangId
= GetUserDefaultLangID();
220 VerQueryValueW(lpData
,
221 L
"\\VarFileInfo\\Translation",
222 (LPVOID
*)&lpTranslate
,
225 for (i
= 0; i
< cbTranslate
/ sizeof(LANGCODEPAGE
); i
++)
227 /* If the bottom eight bits of the language id's
228 match, use this version information (since this
229 means that the version information and the users
230 default language are the same). */
231 if (LOBYTE(lpTranslate
[i
].wLanguage
) == LOBYTE(UserLangId
))
233 wnsprintf(szSubBlock
,
234 _countof(szSubBlock
),
235 L
"\\StringFileInfo\\%04X%04X\\%s",
236 lpTranslate
[i
].wLanguage
,
237 lpTranslate
[i
].wCodePage
,
240 if (VerQueryValueW(lpData
,
242 (LPVOID
*)&lpszLocalBuf
,
245 wcsncpy(szBuffer
, lpszLocalBuf
, cbBufLen
/ sizeof(*szBuffer
));
254 HeapFree(hProcessHeap
, 0, lpData
);