Implement a bunch of shlwapi functions, add some new stubs.
This commit is contained in:
parent
103712f1c4
commit
38bed0608a
|
@ -1,8 +1,9 @@
|
|||
/*
|
||||
* SHLWAPI ordinal functions
|
||||
*
|
||||
*
|
||||
* Copyright 1997 Marcus Meissner
|
||||
* 1998 Jürgen Schmied
|
||||
* 2001 Jon Griffiths
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -11,6 +12,10 @@
|
|||
#include "windef.h"
|
||||
#include "winnls.h"
|
||||
#include "winbase.h"
|
||||
#include "ddeml.h"
|
||||
#include "shlobj.h"
|
||||
#include "shellapi.h"
|
||||
#include "commdlg.h"
|
||||
#include "wine/unicode.h"
|
||||
#include "wine/obj_base.h"
|
||||
#include "wingdi.h"
|
||||
|
@ -20,13 +25,27 @@
|
|||
DEFAULT_DEBUG_CHANNEL(shell);
|
||||
|
||||
extern HINSTANCE shlwapi_hInstance;
|
||||
extern HMODULE SHLWAPI_hshell32;
|
||||
extern HMODULE SHLWAPI_hwinmm;
|
||||
extern HMODULE SHLWAPI_hcomdlg32;
|
||||
extern HMODULE SHLWAPI_hmpr;
|
||||
extern HMODULE SHLWAPI_hmlang;
|
||||
|
||||
/* Macro to get function pointer for a module*/
|
||||
#define GET_FUNC(module, name, fail) \
|
||||
if (!SHLWAPI_h##module) SHLWAPI_h##module = LoadLibraryA(#module ".dll"); \
|
||||
if (!SHLWAPI_h##module) return fail; \
|
||||
if (!pfnFunc) pfnFunc = (void*)GetProcAddress(SHLWAPI_h##module, name); \
|
||||
if (!pfnFunc) return fail
|
||||
|
||||
/*
|
||||
NOTES: The most functions exported by ordinal seem to be superflous.
|
||||
NOTES: Most functions exported by ordinal seem to be superflous.
|
||||
The reason for these functions to be there is to provide a wraper
|
||||
for unicode functions to providing these functions on systems without
|
||||
for unicode functions to provide these functions on systems without
|
||||
unicode functions eg. win95/win98. Since we have such functions we just
|
||||
call these.
|
||||
call these. If running Wine with native DLL's, some late bound calls may
|
||||
fail. However, its better to implement the functions in the forward DLL
|
||||
and recommend the builtin rather than reimplementing the calls here!
|
||||
*/
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -108,22 +127,63 @@ DWORD WINAPI SHLWAPI_24 (
|
|||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_38 [SHLWAPI.38]
|
||||
* SHLWAPI_30 [SHLWAPI.30]
|
||||
*
|
||||
* Seems to be an isspaceW.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_38 ( DWORD x) {
|
||||
FIXME("(%lx),stub!\n",x);
|
||||
return 0;
|
||||
}
|
||||
/*************************************************************************
|
||||
* SHLWAPI_137
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_137(
|
||||
UINT what)
|
||||
BOOL WINAPI SHLWAPI_30(LPWSTR lpcChar)
|
||||
{
|
||||
FIXME("(%#x)stub\n", what);
|
||||
switch (*lpcChar)
|
||||
{
|
||||
case (WCHAR)'\t':
|
||||
case (WCHAR)' ':
|
||||
case 160:
|
||||
case 12288:
|
||||
case 65279:
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_32 [SHLWAPI.32]
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_32(LPCWSTR lpcChar)
|
||||
{
|
||||
if (*lpcChar < (WCHAR)' ')
|
||||
return TRUE;
|
||||
|
||||
/* This is probably a shlwapi bug, but we do it the same for compatability */
|
||||
if (((DWORD)lpcChar & 0xffff) - 127 <= (WCHAR)' ')
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_40 [SHLWAPI.40]
|
||||
*
|
||||
* Get pointer to next Unicode character.
|
||||
*/
|
||||
LPCWSTR WINAPI SHLWAPI_40(LPCWSTR str)
|
||||
{
|
||||
return *str ? str + 1 : str;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_74 [SHLWAPI.74]
|
||||
*
|
||||
* Get the text from a given dialog item.
|
||||
*/
|
||||
INT WINAPI SHLWAPI_74(HWND hWnd, INT nItem, LPWSTR lpsDest,INT nDestLen)
|
||||
{
|
||||
HWND hItem = GetDlgItem(hWnd, nItem);
|
||||
|
||||
if (hItem)
|
||||
return GetWindowTextW(hItem, lpsDest, nDestLen);
|
||||
if (nDestLen)
|
||||
*lpsDest = (WCHAR)'\0';
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_151 [SHLWAPI.151]
|
||||
|
@ -134,6 +194,22 @@ DWORD WINAPI SHLWAPI_151(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_152 [SHLWAPI.152]
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_152(LPWSTR str1, LPWSTR str2, INT len)
|
||||
{
|
||||
if (!len)
|
||||
return 0;
|
||||
|
||||
while (--len && *str1 && *str1 == *str2)
|
||||
{
|
||||
str1++;
|
||||
str2++;
|
||||
}
|
||||
return *str1 - *str2;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_153 [SHLWAPI.153]
|
||||
*/
|
||||
|
@ -146,14 +222,51 @@ DWORD WINAPI SHLWAPI_153(DWORD dw1, DWORD dw2, DWORD dw3)
|
|||
/*************************************************************************
|
||||
* SHLWAPI_156 [SHLWAPI.156]
|
||||
*
|
||||
* FIXME: function guessed
|
||||
* Case sensitive string compare. Does not SetLastError().
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_156 (
|
||||
LPWSTR str1, /* [???] NOTE: "shell32.dll" */
|
||||
LPWSTR str2) /* [???] NOTE: "shell32.dll" */
|
||||
DWORD WINAPI SHLWAPI_156 ( LPWSTR str1, LPWSTR str2)
|
||||
{
|
||||
FIXME("(%s %s)stub\n",debugstr_w(str1),debugstr_w(str2));
|
||||
return lstrcmpW(str1,str2);
|
||||
while (*str1 && (*str1 == *str2)) { str1++; str2++; }
|
||||
return (INT)(*str1 - *str2);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_162 [SHLWAPI.162]
|
||||
*
|
||||
* Ensure a multibyte character string doesn't end in a hanging lead byte.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_162(LPSTR lpStr, DWORD size)
|
||||
{
|
||||
if (lpStr && size)
|
||||
{
|
||||
LPSTR lastByte = lpStr + size - 1;
|
||||
|
||||
while(lpStr < lastByte)
|
||||
lpStr += IsDBCSLeadByte(*lpStr) ? 2 : 1;
|
||||
|
||||
if(lpStr == lastByte && IsDBCSLeadByte(*lpStr))
|
||||
{
|
||||
*lpStr = '\0';
|
||||
size--;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_165 [SHLWAPI.165]
|
||||
*
|
||||
* SetWindowLongA with mask.
|
||||
*/
|
||||
LONG WINAPI SHLWAPI_165(HWND hwnd, INT offset, UINT wFlags, UINT wMask)
|
||||
{
|
||||
LONG ret = GetWindowLongA(hwnd, offset);
|
||||
UINT newFlags = (wFlags & wMask) | (ret & ~wFlags);
|
||||
|
||||
if (newFlags != ret)
|
||||
ret = SetWindowLongA(hwnd, offset, newFlags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -169,6 +282,41 @@ DWORD WINAPI SHLWAPI_169 (IUnknown * lpUnknown)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_170 [SHLWAPI.170]
|
||||
*
|
||||
* Skip URL '//' sequence.
|
||||
*/
|
||||
LPCSTR WINAPI SHLWAPI_170(LPCSTR lpszSrc)
|
||||
{
|
||||
if (lpszSrc && lpszSrc[0] == '/' && lpszSrc[1] == '/')
|
||||
lpszSrc += 2;
|
||||
return lpszSrc;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_181 [SHLWAPI.181]
|
||||
*
|
||||
* Enable or disable a menu item.
|
||||
*/
|
||||
UINT WINAPI SHLWAPI_181(HMENU hMenu, UINT wItemID, BOOL bEnable)
|
||||
{
|
||||
return EnableMenuItem(hMenu, wItemID, bEnable ? MF_ENABLED : MF_GRAYED);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_183 [SHLWAPI.183]
|
||||
*
|
||||
* Register a window class if it isn't already.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_183(WNDCLASSA *wndclass)
|
||||
{
|
||||
WNDCLASSA wca;
|
||||
if (GetClassInfoA(wndclass->hInstance, wndclass->lpszClassName, &wca))
|
||||
return TRUE;
|
||||
return (DWORD)RegisterClassA(wndclass);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_193 [SHLWAPI.193]
|
||||
*/
|
||||
|
@ -200,6 +348,105 @@ LPWSTR WINAPI SHLWAPI_215 (
|
|||
return strncpyW(lpwStrDest, lpStrSrc, len);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_218 [SHLWAPI.218]
|
||||
*
|
||||
* WideCharToMultiByte with multi language support.
|
||||
*/
|
||||
INT WINAPI SHLWAPI_218(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
|
||||
LPINT lpnMultiCharCount)
|
||||
{
|
||||
static HRESULT (WINAPI *pfnFunc)(LPDWORD,DWORD,LPCWSTR,LPINT,LPSTR,LPINT);
|
||||
WCHAR emptyW[] = { '\0' };
|
||||
int len , reqLen;
|
||||
LPSTR mem;
|
||||
|
||||
if (!lpDstStr || !lpnMultiCharCount)
|
||||
return 0;
|
||||
|
||||
if (!lpSrcStr)
|
||||
lpSrcStr = emptyW;
|
||||
|
||||
*lpDstStr = '\0';
|
||||
|
||||
len = strlenW(lpSrcStr) + 1;
|
||||
|
||||
switch (CodePage)
|
||||
{
|
||||
case CP_WINUNICODE:
|
||||
CodePage = CP_UTF8; /* Fall through... */
|
||||
case 0x0000C350: /* FIXME: CP_ #define */
|
||||
case CP_UTF7:
|
||||
case CP_UTF8:
|
||||
{
|
||||
DWORD dwMode = 0;
|
||||
INT nWideCharCount = len - 1;
|
||||
|
||||
GET_FUNC(mlang, "ConvertINetUnicodeToMultiByte", 0);
|
||||
if (!pfnFunc(&dwMode, CodePage, lpSrcStr, &nWideCharCount, lpDstStr,
|
||||
lpnMultiCharCount))
|
||||
return 0;
|
||||
|
||||
if (nWideCharCount < len - 1)
|
||||
{
|
||||
mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, *lpnMultiCharCount);
|
||||
if (!mem)
|
||||
return 0;
|
||||
|
||||
*lpnMultiCharCount = 0;
|
||||
|
||||
if (pfnFunc(&dwMode, CodePage, lpSrcStr, &len, mem, lpnMultiCharCount))
|
||||
{
|
||||
SHLWAPI_162 (mem, *lpnMultiCharCount);
|
||||
lstrcpynA(lpDstStr, mem, *lpnMultiCharCount + 1);
|
||||
return *lpnMultiCharCount + 1;
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, mem);
|
||||
return *lpnMultiCharCount;
|
||||
}
|
||||
lpDstStr[*lpnMultiCharCount] = '\0';
|
||||
return *lpnMultiCharCount;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, lpDstStr,
|
||||
*lpnMultiCharCount, NULL, NULL);
|
||||
|
||||
if (!reqLen && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, NULL, 0, NULL, NULL);
|
||||
if (reqLen)
|
||||
{
|
||||
mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, reqLen);
|
||||
if (mem)
|
||||
{
|
||||
reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem,
|
||||
reqLen, NULL, NULL);
|
||||
|
||||
reqLen = SHLWAPI_162(mem, *lpnMultiCharCount);
|
||||
reqLen++;
|
||||
|
||||
lstrcpynA(lpDstStr, mem, *lpnMultiCharCount);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, mem);
|
||||
}
|
||||
}
|
||||
}
|
||||
return reqLen;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_217 [SHLWAPI.217]
|
||||
*
|
||||
*/
|
||||
INT WINAPI SHLWAPI_217(LPCWSTR lpSrcStr, LPSTR lpDstStr, LPINT lpnMultiCharCount)
|
||||
{
|
||||
return SHLWAPI_218(CP_ACP, lpSrcStr, lpDstStr, lpnMultiCharCount);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_219 [SHLWAPI.219]
|
||||
*
|
||||
|
@ -243,7 +490,7 @@ HANDLE WINAPI SHLWAPI_222 (LPCLSID guid)
|
|||
DWORD WINAPI SHLWAPI_223 (HANDLE handle)
|
||||
{
|
||||
DWORD oldCount;
|
||||
|
||||
|
||||
FIXME("(0x%08x) stub\n",handle);
|
||||
|
||||
ReleaseSemaphore( handle, 1, &oldCount); /* +1 */
|
||||
|
@ -254,20 +501,29 @@ DWORD WINAPI SHLWAPI_223 (HANDLE handle)
|
|||
/*************************************************************************
|
||||
* SHLWAPI_237 [SHLWAPI.237]
|
||||
*
|
||||
* NOTES
|
||||
* checks if a class is registered, if not it registers it
|
||||
* Unicode version of SHLWAPI_183.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_237 (WNDCLASSW * lpWndClass)
|
||||
{
|
||||
WNDCLASSW WndClass;
|
||||
|
||||
|
||||
TRACE("(0x%08x %s)\n",lpWndClass->hInstance, debugstr_w(lpWndClass->lpszClassName));
|
||||
|
||||
if (!GetClassInfoW(lpWndClass->hInstance, lpWndClass->lpszClassName, &WndClass))
|
||||
{
|
||||
return RegisterClassW(lpWndClass);
|
||||
}
|
||||
return TRUE;
|
||||
if (GetClassInfoW(lpWndClass->hInstance, lpWndClass->lpszClassName, &WndClass))
|
||||
return TRUE;
|
||||
return RegisterClassW(lpWndClass);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_240 [SHLWAPI.240]
|
||||
*
|
||||
* Calls ASCII or Unicode WindowProc for the given window.
|
||||
*/
|
||||
LRESULT CALLBACK SHLWAPI_240(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (IsWindowUnicode(hWnd))
|
||||
return DefWindowProcW(hWnd, uMessage, wParam, lParam);
|
||||
return DefWindowProcA(hWnd, uMessage, wParam, lParam);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -344,7 +600,7 @@ DWORD WINAPI SHLWAPI_278 (
|
|||
HWND hwnd;
|
||||
HCURSOR hCursor;
|
||||
char * clsname = "WorkerA";
|
||||
|
||||
|
||||
FIXME("(0x%08lx 0x%08x 0x%08lx 0x%08lx 0x%08x 0x%08lx)stub\n",
|
||||
wndProc,hWndParent,dwExStyle,dwStyle,hMenu,z);
|
||||
|
||||
|
@ -369,6 +625,112 @@ DWORD WINAPI SHLWAPI_278 (
|
|||
return hwnd;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_289 [SHLWAPI.289]
|
||||
*
|
||||
* Late bound call to winmm.PlaySoundW
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_289(LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound)
|
||||
{
|
||||
static BOOL (WINAPI *pfnFunc)(LPCWSTR, HMODULE, DWORD) = NULL;
|
||||
|
||||
GET_FUNC(winmm, "PlaySoundW", FALSE);
|
||||
return pfnFunc(pszSound, hmod, fdwSound);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_313 [SHLWAPI.313]
|
||||
*
|
||||
* Late bound call to shell32.SHGetFileInfoW
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_313(LPCWSTR path, DWORD dwFileAttributes,
|
||||
SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
|
||||
{
|
||||
static DWORD (WINAPI *pfnFunc)(LPCWSTR,DWORD,SHFILEINFOW*,UINT,UINT) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "SHGetFileInfoW", 0);
|
||||
return pfnFunc(path, dwFileAttributes, psfi, sizeofpsfi, flags);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_318 [SHLWAPI.318]
|
||||
*
|
||||
* Late bound call to shell32.DragQueryFileW
|
||||
*/
|
||||
UINT WINAPI SHLWAPI_318(HDROP hDrop, UINT lFile, LPWSTR lpszFile, UINT lLength)
|
||||
{
|
||||
static UINT (WINAPI *pfnFunc)(HDROP, UINT, LPWSTR, UINT) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "DragQueryFileW", 0);
|
||||
return pfnFunc(hDrop, lFile, lpszFile, lLength);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_333 [SHLWAPI.333]
|
||||
*
|
||||
* Late bound call to shell32.SHBrowseForFolderW
|
||||
*/
|
||||
LPITEMIDLIST WINAPI SHLWAPI_333(LPBROWSEINFOW lpBi)
|
||||
{
|
||||
static LPITEMIDLIST (WINAPI *pfnFunc)(LPBROWSEINFOW) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "SHBrowseForFolderW", NULL);
|
||||
return pfnFunc(lpBi);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_334 [SHLWAPI.334]
|
||||
*
|
||||
* Late bound call to shell32.SHGetPathFromIDListW
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_334(LPCITEMIDLIST pidl,LPWSTR pszPath)
|
||||
{
|
||||
static BOOL (WINAPI *pfnFunc)(LPCITEMIDLIST, LPWSTR) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "SHGetPathFromIDListW", 0);
|
||||
return pfnFunc(pidl, pszPath);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_335 [SHLWAPI.335]
|
||||
*
|
||||
* Late bound call to shell32.ShellExecuteExW
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_335(LPSHELLEXECUTEINFOW lpExecInfo)
|
||||
{
|
||||
static BOOL (WINAPI *pfnFunc)(LPSHELLEXECUTEINFOW) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "ShellExecuteExW", FALSE);
|
||||
return pfnFunc(lpExecInfo);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_336 [SHLWAPI.336]
|
||||
*
|
||||
* Late bound call to shell32.SHFileOperationW.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_336(LPSHFILEOPSTRUCTW lpFileOp)
|
||||
{
|
||||
static HICON (WINAPI *pfnFunc)(LPSHFILEOPSTRUCTW) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "SHFileOperationW", 0);
|
||||
return pfnFunc(lpFileOp);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_337 [SHLWAPI.337]
|
||||
*
|
||||
* Late bound call to shell32.ExtractIconExW.
|
||||
*/
|
||||
HICON WINAPI SHLWAPI_337(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge,
|
||||
HICON *phiconSmall, UINT nIcons)
|
||||
{
|
||||
static HICON (WINAPI *pfnFunc)(LPCWSTR, INT,HICON *,HICON *, UINT) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "ExtractIconExW", (HICON)0);
|
||||
return pfnFunc(lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_342 [SHLWAPI.342]
|
||||
*
|
||||
|
@ -397,12 +759,69 @@ DWORD WINAPI SHLWAPI_346 (
|
|||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_376 [SHLWAPI.377]
|
||||
* SHLWAPI_357 [SHLWAPI.357]
|
||||
*
|
||||
* Late bound call to shell32.SHGetNewLinkInfoW
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_357(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName,
|
||||
BOOL *pfMustCopy, UINT uFlags)
|
||||
{
|
||||
static BOOL (WINAPI *pfnFunc)(LPCWSTR, LPCWSTR, LPCWSTR, BOOL*, UINT) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "SHGetNewLinkInfoW", FALSE);
|
||||
return pfnFunc(pszLinkTo, pszDir, pszName, pfMustCopy, uFlags);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_358 [SHLWAPI.358]
|
||||
*
|
||||
* Late bound call to shell32.SHDefExtractIconW
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_358(LPVOID arg1, LPVOID arg2, LPVOID arg3, LPVOID arg4,
|
||||
LPVOID arg5, LPVOID arg6)
|
||||
{
|
||||
/* FIXME: Correct args */
|
||||
static DWORD (WINAPI *pfnFunc)(LPVOID, LPVOID, LPVOID, LPVOID, LPVOID, LPVOID) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "SHDefExtractIconW", 0);
|
||||
return pfnFunc(arg1, arg2, arg3, arg4, arg5, arg6);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_364 [SHLWAPI.364]
|
||||
*
|
||||
* Wrapper for lstrcpynA with src and dst swapped.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_364(LPCSTR src, LPSTR dst, INT n)
|
||||
{
|
||||
lstrcpynA(dst, src, n);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_370 [SHLWAPI.370]
|
||||
*
|
||||
* Late bound call to shell32.ExtractIconW
|
||||
*/
|
||||
HICON WINAPI SHLWAPI_370(HINSTANCE hInstance, LPCWSTR lpszExeFileName,
|
||||
UINT nIconIndex)
|
||||
{
|
||||
static HICON (WINAPI *pfnFunc)(HINSTANCE, LPCWSTR, UINT) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "ExtractIconW", (HICON)0);
|
||||
return pfnFunc(hInstance, lpszExeFileName, nIconIndex);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_376 [SHLWAPI.376]
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_376 (LONG x)
|
||||
{
|
||||
FIXME("(0x%08lx)stub\n", x );
|
||||
return 0xabba1245;
|
||||
/* FIXME: This should be a forward in the .spec file to the win2k function
|
||||
* kernel32.GetUserDefaultUILanguage, however that function isn't there yet.
|
||||
*/
|
||||
return 0xabba1245;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -426,6 +845,139 @@ DWORD WINAPI SHLWAPI_378 (
|
|||
return LoadLibraryA(x);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_389 [SHLWAPI.389]
|
||||
*
|
||||
* Late bound call to comdlg32.GetSaveFileNameW
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_389(LPOPENFILENAMEW ofn)
|
||||
{
|
||||
static BOOL (WINAPI *pfnFunc)(LPOPENFILENAMEW) = NULL;
|
||||
|
||||
GET_FUNC(comdlg32, "GetSaveFileNameW", FALSE);
|
||||
return pfnFunc(ofn);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_390 [SHLWAPI.390]
|
||||
*
|
||||
* Late bound call to mpr.WNetRestoreConnectionW
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_390(LPVOID arg1, LPVOID arg2)
|
||||
{
|
||||
/* FIXME: Correct args */
|
||||
static DWORD (WINAPI *pfnFunc)(LPVOID, LPVOID) = NULL;
|
||||
|
||||
GET_FUNC(mpr, "WNetRestoreConnectionW", 0);
|
||||
return pfnFunc(arg1, arg2);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_391 [SHLWAPI.391]
|
||||
*
|
||||
* Late bound call to mpr.WNetGetLastErrorW
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_391(LPVOID arg1, LPVOID arg2, LPVOID arg3, LPVOID arg4,
|
||||
LPVOID arg5)
|
||||
{
|
||||
/* FIXME: Correct args */
|
||||
static DWORD (WINAPI *pfnFunc)(LPVOID, LPVOID, LPVOID, LPVOID, LPVOID) = NULL;
|
||||
|
||||
GET_FUNC(mpr, "WNetGetLastErrorW", 0);
|
||||
return pfnFunc(arg1, arg2, arg3, arg4, arg5);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_401 [SHLWAPI.401]
|
||||
*
|
||||
* Late bound call to comdlg32.PageSetupDlgW
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_401(LPPAGESETUPDLGW pagedlg)
|
||||
{
|
||||
static BOOL (WINAPI *pfnFunc)(LPPAGESETUPDLGW) = NULL;
|
||||
|
||||
GET_FUNC(comdlg32, "PageSetupDlgW", FALSE);
|
||||
return pfnFunc(pagedlg);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_402 [SHLWAPI.402]
|
||||
*
|
||||
* Late bound call to comdlg32.PrintDlgW
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_402(LPPRINTDLGW printdlg)
|
||||
{
|
||||
static BOOL (WINAPI *pfnFunc)(LPPRINTDLGW) = NULL;
|
||||
|
||||
GET_FUNC(comdlg32, "PrintDlgW", FALSE);
|
||||
return pfnFunc(printdlg);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_403 [SHLWAPI.403]
|
||||
*
|
||||
* Late bound call to comdlg32.GetOpenFileNameW
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_403(LPOPENFILENAMEW ofn)
|
||||
{
|
||||
static BOOL (WINAPI *pfnFunc)(LPOPENFILENAMEW) = NULL;
|
||||
|
||||
GET_FUNC(comdlg32, "GetOpenFileNameW", FALSE);
|
||||
return pfnFunc(ofn);
|
||||
}
|
||||
|
||||
/* INTERNAL: Map from HLS color space to RGB */
|
||||
static WORD ConvertHue(int wHue, WORD wMid1, WORD wMid2)
|
||||
{
|
||||
wHue = wHue > 240 ? wHue - 240 : wHue < 0 ? wHue + 240 : wHue;
|
||||
|
||||
if (wHue > 160)
|
||||
return wMid1;
|
||||
else if (wHue > 120)
|
||||
wHue = 160 - wHue;
|
||||
else if (wHue > 40)
|
||||
return wMid2;
|
||||
|
||||
return ((wHue * (wMid2 - wMid1) + 20) / 40) + wMid1;
|
||||
}
|
||||
|
||||
/* Convert to RGB and scale into RGB range (0..255) */
|
||||
#define GET_RGB(h) (ConvertHue(h, wMid1, wMid2) * 255 + 120) / 240
|
||||
|
||||
/*************************************************************************
|
||||
* ColorHLSToRGB [SHLWAPI.404]
|
||||
*
|
||||
* Convert from HLS color space into an RGB COLORREF.
|
||||
*
|
||||
* NOTES
|
||||
* Input HLS values are constrained to the range (0..240).
|
||||
*/
|
||||
COLORREF WINAPI ColorHLSToRGB(WORD wHue, WORD wLuminosity, WORD wSaturation)
|
||||
{
|
||||
WORD wRed;
|
||||
|
||||
if (wSaturation)
|
||||
{
|
||||
WORD wGreen, wBlue, wMid1, wMid2;
|
||||
|
||||
if (wLuminosity > 120)
|
||||
wMid2 = wSaturation + wLuminosity - (wSaturation * wLuminosity + 120) / 240;
|
||||
else
|
||||
wMid2 = ((wSaturation + 240) * wLuminosity + 120) / 240;
|
||||
|
||||
wMid1 = wLuminosity * 2 - wMid2;
|
||||
|
||||
wRed = GET_RGB(wHue + 80);
|
||||
wGreen = GET_RGB(wHue);
|
||||
wBlue = GET_RGB(wHue - 80);
|
||||
|
||||
return RGB(wRed, wGreen, wBlue);
|
||||
}
|
||||
|
||||
wRed = wLuminosity * 255 / 240;
|
||||
return RGB(wRed, wRed, wRed);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_431 [SHLWAPI.431]
|
||||
*/
|
||||
|
@ -439,20 +991,20 @@ DWORD WINAPI SHLWAPI_431 (DWORD x)
|
|||
* SHLWAPI_437 [SHLWAPI.437]
|
||||
*
|
||||
* NOTES
|
||||
* has to do something with switching the api between ascii and unicode
|
||||
* observed values: 0 and 5
|
||||
*
|
||||
* accesses
|
||||
* HKLM\System\CurrentControlSet\Control\ProductOptions
|
||||
*
|
||||
* In the real shlwapi, One time initilisation calls GetVersionEx and reads
|
||||
* the registry to determine what O/S & Service Pack level is running, and
|
||||
* therefore which functions are available. Currently we always run as NT,
|
||||
* since this means that we don't need extra code to emulate Unicode calls,
|
||||
* they are forwarded directly to the appropriate API call instead.
|
||||
* Since the flags for whether to call or emulate Unicode are internal to
|
||||
* the dll, this function does not need a full implementation.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_437 (DWORD x)
|
||||
DWORD WINAPI SHLWAPI_437 (DWORD functionToCall)
|
||||
{
|
||||
FIXME("(0x%08lx)stub\n", x);
|
||||
FIXME("(0x%08lx)stub\n", functionToCall);
|
||||
return 0xabba1247;
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* SHCreateShellPalette [SHLWAPI.@]
|
||||
*/
|
||||
|
@ -467,9 +1019,10 @@ HPALETTE WINAPI SHCreateShellPalette(HDC hdc)
|
|||
*/
|
||||
DWORD WINAPI SHGetInverseCMAP (LPVOID x, DWORD why)
|
||||
{
|
||||
FIXME("(%p, %#lx)stub\n", x, why);
|
||||
FIXME("(%p, %#lx)stub\n", x, why);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHIsLowMemoryMachine [SHLWAPI.@]
|
||||
*/
|
||||
|
@ -478,3 +1031,34 @@ DWORD WINAPI SHIsLowMemoryMachine (DWORD x)
|
|||
FIXME("0x%08lx\n", x);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* GetMenuPosFromID [SHLWAPI.@]
|
||||
*/
|
||||
INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID)
|
||||
{
|
||||
MENUITEMINFOA mi;
|
||||
INT nCount = GetMenuItemCount(hMenu), nIter = 0;
|
||||
|
||||
while (nIter < nCount)
|
||||
{
|
||||
mi.wID = 0;
|
||||
if (!GetMenuItemInfoA(hMenu, nIter, TRUE, &mi) && mi.wID == wID)
|
||||
return nIter;
|
||||
nIter++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* _SHGetInstanceExplorer [SHLWAPI.@]
|
||||
*
|
||||
* Late bound call to shell32.SHGetInstanceExplorer.
|
||||
*/
|
||||
HRESULT WINAPI _SHGetInstanceExplorer (LPUNKNOWN *lpUnknown)
|
||||
{
|
||||
static HRESULT (WINAPI *pfnFunc)(LPUNKNOWN *) = NULL;
|
||||
|
||||
GET_FUNC(shell32, "SHGetInstanceExplorer", E_FAIL);
|
||||
return pfnFunc(lpUnknown);
|
||||
}
|
||||
|
|
|
@ -3,13 +3,20 @@
|
|||
*/
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "wingdi.h"
|
||||
#include "winuser.h"
|
||||
#include "winerror.h"
|
||||
#include "winreg.h"
|
||||
#include "debugtools.h"
|
||||
#include "shlwapi.h"
|
||||
#include "wine/unicode.h"
|
||||
|
||||
DEFAULT_DEBUG_CHANNEL(shell);
|
||||
|
||||
static const char *lpszContentTypeA = "Content Type";
|
||||
static const WCHAR lpszContentTypeW[] = { 'C','o','n','t','e','n','t',' ','T','y','p','e','\0'};
|
||||
|
||||
/*************************************************************************
|
||||
* SHRegGetUSValueA [SHLWAPI.@]
|
||||
*
|
||||
|
@ -134,13 +141,13 @@ DWORD WINAPI SHGetValueA(
|
|||
{
|
||||
HKEY hSubKey;
|
||||
DWORD res;
|
||||
|
||||
|
||||
TRACE("(%s %s)\n", pSubKey, pValue);
|
||||
|
||||
|
||||
if((res = RegOpenKeyA(hkey, pSubKey, &hSubKey))) return res;
|
||||
res = RegQueryValueExA(hSubKey, pValue, 0, pwType, pvData, pbData);
|
||||
RegCloseKey( hSubKey );
|
||||
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -159,13 +166,13 @@ DWORD WINAPI SHGetValueW(
|
|||
{
|
||||
HKEY hSubKey;
|
||||
DWORD res;
|
||||
|
||||
|
||||
TRACE("(%s %s)\n", debugstr_w(pSubKey), debugstr_w(pValue));
|
||||
|
||||
|
||||
if((res = RegOpenKeyW(hkey, pSubKey, &hSubKey))) return res;
|
||||
res = RegQueryValueExW(hSubKey, pValue, 0, pwType, pvData, pbData);
|
||||
RegCloseKey( hSubKey );
|
||||
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -235,7 +242,7 @@ HRESULT WINAPI SHQueryValueExA(
|
|||
*
|
||||
* FIXME
|
||||
* if the datatype REG_EXPAND_SZ then expand the string and change
|
||||
* *pdwType to REG_SZ.
|
||||
* *pdwType to REG_SZ.
|
||||
*/
|
||||
HRESULT WINAPI SHQueryValueExW (
|
||||
HKEY hkey,
|
||||
|
@ -277,7 +284,7 @@ HRESULT WINAPI SHDeleteKeyA(
|
|||
/* find how many subkeys there are */
|
||||
dwKeyCount = 0;
|
||||
dwMaxSubkeyLen = 0;
|
||||
r = RegQueryInfoKeyA(hSubKey, NULL, NULL, NULL, &dwKeyCount,
|
||||
r = RegQueryInfoKeyA(hSubKey, NULL, NULL, NULL, &dwKeyCount,
|
||||
&dwMaxSubkeyLen, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
if(r != ERROR_SUCCESS)
|
||||
{
|
||||
|
@ -389,7 +396,7 @@ DWORD WINAPI SHDeleteEmptyKeyA(HKEY hKey, LPCSTR lpszSubKey)
|
|||
return r;
|
||||
|
||||
dwKeyCount = 0;
|
||||
r = RegQueryInfoKeyA(hSubKey, NULL, NULL, NULL, &dwKeyCount,
|
||||
r = RegQueryInfoKeyA(hSubKey, NULL, NULL, NULL, &dwKeyCount,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
if(r != ERROR_SUCCESS)
|
||||
return r;
|
||||
|
@ -419,3 +426,75 @@ DWORD WINAPI SHDeleteEmptyKeyW(HKEY hKey, LPCWSTR lpszSubKey)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_205 [SHLWAPI.205]
|
||||
*
|
||||
* Wrapper for SHGetValueA in case machine is in safe mode.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_205(HKEY hkey, LPCSTR pSubKey, LPCSTR pValue,
|
||||
LPDWORD pwType, LPVOID pvData, LPDWORD pbData)
|
||||
{
|
||||
if (GetSystemMetrics(SM_CLEANBOOT))
|
||||
return ERROR_INVALID_FUNCTION;
|
||||
return SHGetValueA(hkey, pSubKey, pValue, pwType, pvData, pbData);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_206 [SHLWAPI.206]
|
||||
*
|
||||
* Unicode version of SHLWAPI_205.
|
||||
*/
|
||||
DWORD WINAPI SHLWAPI_206(HKEY hkey, LPCWSTR pSubKey, LPCWSTR pValue,
|
||||
LPDWORD pwType, LPVOID pvData, LPDWORD pbData)
|
||||
{
|
||||
if (GetSystemMetrics(SM_CLEANBOOT))
|
||||
return ERROR_INVALID_FUNCTION;
|
||||
return SHGetValueW(hkey, pSubKey, pValue, pwType, pvData, pbData);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_320 [SHLWAPI.320]
|
||||
*
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_320(LPCSTR lpszSubKey, LPCSTR lpszValue)
|
||||
{
|
||||
DWORD dwLen = strlen(lpszValue);
|
||||
HRESULT ret = SHSetValueA(HKEY_CLASSES_ROOT, lpszSubKey, lpszContentTypeA,
|
||||
REG_SZ, lpszValue, dwLen);
|
||||
return ret ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_321 [SHLWAPI.321]
|
||||
*
|
||||
* Unicode version of SHLWAPI_320.
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_321(LPCWSTR lpszSubKey, LPCWSTR lpszValue)
|
||||
{
|
||||
DWORD dwLen = strlenW(lpszValue);
|
||||
HRESULT ret = SHSetValueW(HKEY_CLASSES_ROOT, lpszSubKey, lpszContentTypeW,
|
||||
REG_SZ, lpszValue, dwLen);
|
||||
return ret ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_322 [SHLWAPI.322]
|
||||
*
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_322(LPCSTR lpszSubKey)
|
||||
{
|
||||
HRESULT ret = SHDeleteValueA(HKEY_CLASSES_ROOT, lpszSubKey, lpszContentTypeA);
|
||||
return ret ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI_323 [SHLWAPI.323]
|
||||
*
|
||||
* Unicode version of SHLWAPI_322.
|
||||
*/
|
||||
BOOL WINAPI SHLWAPI_323(LPCWSTR lpszSubKey)
|
||||
{
|
||||
HRESULT ret = SHDeleteValueW(HKEY_CLASSES_ROOT, lpszSubKey, lpszContentTypeW);
|
||||
return ret ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,145 +41,145 @@ debug_channels (shell)
|
|||
29 stub @
|
||||
30 stub @
|
||||
31 stub @
|
||||
32 stub @
|
||||
32 stdcall @(ptr) SHLWAPI_32
|
||||
33 stub @
|
||||
34 stub @
|
||||
35 stub @
|
||||
36 stub @
|
||||
37 forward @ user32.CallWindowProcW
|
||||
38 stdcall @(long) SHLWAPI_38
|
||||
39 stub @
|
||||
40 stub @
|
||||
38 forward @ user32.CharLowerW
|
||||
39 forward @ user32.CharLowerBuffW
|
||||
40 stdcall @(wstr) SHLWAPI_40
|
||||
41 stub @
|
||||
42 stub @
|
||||
43 stub @
|
||||
44 stub @
|
||||
45 stub @
|
||||
46 stub @
|
||||
47 stub @
|
||||
48 stub @
|
||||
43 forward @ user32.CharUpperW
|
||||
44 forward @ user32.CharUpperBuffW
|
||||
45 forward @ kernel32.CompareStringW
|
||||
46 forward @ user32.CopyAcceleratorTableW
|
||||
47 forward @ user32.CreateAcceleratorTableW
|
||||
48 forward @ gdi32.CreateDCW
|
||||
49 stub @
|
||||
50 stub @
|
||||
51 stub @
|
||||
52 stub @
|
||||
53 stub @
|
||||
50 forward @ kernel32.CreateDirectoryW
|
||||
51 forward @ kernel32.CreateEventW
|
||||
52 forward @ kernel32.CreateFileW
|
||||
53 forward @ gdi32.CreateFontIndirectW
|
||||
54 forward @ gdi32.CreateICW
|
||||
55 forward @ user32.CreateWindowExW
|
||||
56 forward @ user32.DefWindowProcW
|
||||
57 stub @
|
||||
57 forward @ kernel32.DeleteFileW
|
||||
58 stub @
|
||||
59 stub @
|
||||
60 stub @
|
||||
60 forward @ user32.DispatchMessageW
|
||||
61 stub @
|
||||
62 stub @
|
||||
63 stub @
|
||||
64 stub @
|
||||
65 stub @
|
||||
66 stub @
|
||||
67 forward @ user32.FindWindowW
|
||||
68 forward @ kernel32.FormatMessageW
|
||||
69 forward @ user32.GetClassInfoW
|
||||
70 stub @
|
||||
71 stub @
|
||||
72 stub @
|
||||
73 stub @
|
||||
74 stub @
|
||||
75 stub @
|
||||
76 stub @
|
||||
77 stub @
|
||||
78 stub @
|
||||
79 stub @
|
||||
62 forward @ gdi32.EnumFontFamiliesW
|
||||
63 forward @ gdi32.EnumFontFamiliesExW
|
||||
64 forward @ kernel32.EnumResourceNamesW
|
||||
65 forward @ kernel32.FindFirstFileW
|
||||
66 forward @ kernel32.FindResourceW
|
||||
67 forward @ user32.FindWindowW
|
||||
68 forward @ kernel32.FormatMessageW
|
||||
69 forward @ user32.GetClassInfoW
|
||||
70 forward @ user32.GetClassLongW
|
||||
71 forward @ user32.GetClassNameW
|
||||
72 forward @ user32.GetClipboardFormatNameW
|
||||
73 forward @ kernel32.GetCurrentDirectoryW
|
||||
74 stdcall @(long long wstr long) SHLWAPI_74
|
||||
75 forward @ kernel32.GetFileAttributesW
|
||||
76 forward @ kernel32.GetFullPathNameW
|
||||
77 forward @ kernel32.GetLocaleInfoW
|
||||
78 forward @ user32.GetMenuStringW
|
||||
79 forward @ user32.GetMessageW
|
||||
80 forward @ kernel32.GetModuleFileNameW
|
||||
81 forward @ kernel32.GetSystemDirectoryW
|
||||
82 forward @ kernel32.SearchPathW
|
||||
83 forward @ kernel32.GetModuleHandleW
|
||||
84 stub @
|
||||
85 stub @
|
||||
86 stub @
|
||||
87 stub @
|
||||
88 stub @
|
||||
89 stub @
|
||||
90 stub @
|
||||
91 stub @
|
||||
92 stub @
|
||||
93 stub @
|
||||
84 forward @ gdi32.GetObjectW
|
||||
85 forward @ kernel32.GetPrivateProfileIntW
|
||||
86 forward @ kernel32.GetProfileStringW
|
||||
87 forward @ user32.GetPropW
|
||||
88 forward @ kernel32.GetStringTypeExW
|
||||
89 forward @ kernel32.GetTempFileNameW
|
||||
90 forward @ kernel32.GetTempPathW
|
||||
91 forward @ gdi32.GetTextExtentPoint32W
|
||||
92 forward @ gdi32.GetTextFaceW
|
||||
93 forward @ gdi32.GetTextMetricsW
|
||||
94 forward @ user32.GetWindowLongW
|
||||
95 stub @
|
||||
96 stub @
|
||||
97 stub @
|
||||
98 stub @
|
||||
99 stub @
|
||||
100 stub @
|
||||
101 stub @
|
||||
95 forward @ user32.GetWindowTextW
|
||||
96 forward @ user32.GetWindowTextLengthW
|
||||
97 forward @ kernel32.GetWindowsDirectoryW
|
||||
98 forward @ user32.InsertMenuW
|
||||
99 forward @ user32.IsDialogMessageW
|
||||
100 forward @ user32.LoadAcceleratorsW
|
||||
101 forward @ user32.LoadBitmapW
|
||||
102 forward @ user32.LoadCursorW
|
||||
103 stub @
|
||||
104 stub @
|
||||
105 stub @
|
||||
106 stub @
|
||||
103 forward @ user32.LoadIconW
|
||||
104 forward @ user32.LoadImageW
|
||||
105 forward @ user32.LoadLibraryExW
|
||||
106 forward @ user32.LoadMenuW
|
||||
107 forward @ user32.LoadStringW
|
||||
108 stub @
|
||||
109 stub @
|
||||
110 stub @
|
||||
111 stub @
|
||||
112 stub @
|
||||
113 stub @
|
||||
114 stub @
|
||||
115 stub @
|
||||
116 stub @
|
||||
117 stub @
|
||||
118 stub @
|
||||
119 stub @
|
||||
108 forward @ user32.MessageBoxIndirectW
|
||||
109 forward @ user32.ModifyMenuW
|
||||
110 forward @ gdi32.GetCharWidth32W
|
||||
111 forward @ gdi32.GetCharacterPlacementW
|
||||
112 forward @ kernel32.CopyFileW
|
||||
113 forward @ kernel32.MoveFileW
|
||||
114 forward @ user32.OemToCharW
|
||||
115 forward @ kernel32.OutputDebugStringW
|
||||
116 forward @ user32.PeekMessageW
|
||||
117 forward @ user32.PostMessageW
|
||||
118 forward @ user32.PostThreadMessageW
|
||||
119 forward @ advapi32.RegCreateKeyW
|
||||
120 forward @ advapi32.RegCreateKeyExW
|
||||
121 stub @
|
||||
122 stub @
|
||||
123 stub @
|
||||
124 stub @
|
||||
121 forward @ advapi32.RegDeleteKeyW
|
||||
122 forward @ advapi32.RegEnumKeyW
|
||||
123 forward @ advapi32.RegEnumKeyExW
|
||||
124 forward @ dvapi32.RegOpenKeyW
|
||||
125 forward @ advapi32.RegOpenKeyExW
|
||||
126 stub @
|
||||
127 stub @
|
||||
126 forward @ advapi32.RegQueryInfoKeyW
|
||||
127 forward @ advapi32.RegQueryValueW
|
||||
128 forward @ advapi32.RegQueryValueExW
|
||||
129 stub @
|
||||
130 stub @
|
||||
129 forward @ advapi32.RegSetValueW
|
||||
130 forward @ advapi32.RegSetValueExW
|
||||
131 forward @ user32.RegisterClassW
|
||||
132 forward @ user32.RegisterClipboardFormatW
|
||||
133 stub @
|
||||
134 stub @
|
||||
135 stub @
|
||||
136 stub @
|
||||
137 stdcall @(long) SHLWAPI_137
|
||||
133 forward @ user32.RegisterWindowMessageW
|
||||
134 forward @ user32.RemovePropW
|
||||
135 forward @ user32.SendDlgItemMessageW
|
||||
136 forward @ user32.SendMessageW
|
||||
137 forward @ kernel32.SetCurrentDirectoryW
|
||||
138 stub @
|
||||
139 stub @
|
||||
140 stub @
|
||||
140 forward @ user32.SetPropW
|
||||
141 forward @ user32.SetWindowLongW
|
||||
142 stub @
|
||||
142 forward @ user32.SetWindowsHookExW
|
||||
143 stub @
|
||||
144 stub @
|
||||
145 stub @
|
||||
146 stub @
|
||||
144 forward @ gdi32.StartDocW
|
||||
145 forward @ user32.SystemParametersInfoW
|
||||
146 forward @ user32.TranslateAcceleratorW
|
||||
147 forward @ user32.UnregisterClassW
|
||||
148 stub @
|
||||
149 stub @
|
||||
150 stub @
|
||||
148 forward @ user32.VkKeyScanW
|
||||
149 forward @ user32.WinHelpW
|
||||
150 forward @ user32.wvsprintfW
|
||||
151 stdcall @() SHLWAPI_151
|
||||
152 stub @
|
||||
152 stdcall @(wstr wstr long) SHLWAPI_152
|
||||
153 stdcall @(long long long) SHLWAPI_153
|
||||
154 stub @
|
||||
155 stub @
|
||||
156 stdcall @(wstr wstr) SHLWAPI_156
|
||||
157 stub @
|
||||
158 stub @
|
||||
159 stub @
|
||||
158 stub @ #(wstr wstr) SHLWAPI_158
|
||||
159 forward @ kernel32.CompareStringW
|
||||
160 stub @
|
||||
161 stub @
|
||||
162 stub @
|
||||
162 stdcall @(str long) SHLWAPI_162
|
||||
163 stub @
|
||||
164 stub @
|
||||
165 stub @
|
||||
165 stdcall @(long long long long) SHLWAPI_165
|
||||
166 stub @
|
||||
167 stub @
|
||||
168 stub @
|
||||
169 stdcall @(long) SHLWAPI_169
|
||||
170 stub @
|
||||
170 stdcall @(str) SHLWAPI_170
|
||||
171 stub @
|
||||
172 stub @
|
||||
173 stub @
|
||||
|
@ -190,9 +190,9 @@ debug_channels (shell)
|
|||
178 stub @
|
||||
179 stub @
|
||||
180 stub @
|
||||
181 stub @
|
||||
181 stdcall @(long long long) SHLWAPI_181
|
||||
182 stub @
|
||||
183 stub @
|
||||
183 stdcall @(ptr) SHLWAPI_183
|
||||
184 stub @
|
||||
185 stub @
|
||||
186 stub @
|
||||
|
@ -214,8 +214,8 @@ debug_channels (shell)
|
|||
202 stub @
|
||||
203 stub @
|
||||
204 stub @
|
||||
205 stub @
|
||||
206 stub @
|
||||
205 stdcall @(long str str ptr ptr ptr) SHLWAPI_205
|
||||
206 stdcall @(long wstr wstr ptr ptr ptr) SHLWAPI_206
|
||||
207 stub @
|
||||
208 stub @
|
||||
209 stub @
|
||||
|
@ -226,8 +226,8 @@ debug_channels (shell)
|
|||
214 stub @
|
||||
215 stdcall @(long long long) SHLWAPI_215
|
||||
216 stub @
|
||||
217 stub @
|
||||
218 stub @
|
||||
217 stdcall @(wstr str ptr) SHLWAPI_217
|
||||
218 stdcall @(long wstr str ptr) SHLWAPI_218
|
||||
219 stdcall @(long long long long) SHLWAPI_219
|
||||
220 stub @
|
||||
221 stub @
|
||||
|
@ -249,7 +249,7 @@ debug_channels (shell)
|
|||
237 stdcall @(ptr) SHLWAPI_237
|
||||
238 stub @
|
||||
239 stub @
|
||||
240 stub @
|
||||
240 stdcall @(long long long long) SHLWAPI_240
|
||||
241 stdcall @() SHLWAPI_241
|
||||
242 stub @
|
||||
243 stub @
|
||||
|
@ -298,7 +298,7 @@ debug_channels (shell)
|
|||
286 stub @
|
||||
287 stub @
|
||||
288 stub @
|
||||
289 stub @
|
||||
289 stdcall @(wstr long long) SHLWAPI_289
|
||||
290 stub @
|
||||
291 stub @
|
||||
292 stub @
|
||||
|
@ -307,32 +307,32 @@ debug_channels (shell)
|
|||
295 stub @
|
||||
296 stub @
|
||||
297 stub @
|
||||
298 stub @
|
||||
298 forward @ kernel32.WritePrivateProfileStringW
|
||||
299 stub @
|
||||
300 stub @
|
||||
301 stub @
|
||||
302 stub @
|
||||
303 stub @
|
||||
304 stub @
|
||||
305 stub @
|
||||
306 stub @
|
||||
307 stub @
|
||||
308 stub @
|
||||
301 forward @ gdi32.DrawTextExW # FIXME CreateFontW
|
||||
302 forward @ user32.GetMenuItemInfoW
|
||||
303 forward @ user32.InsertMenuItemW
|
||||
304 forward @ gdi32.CreateMetaFileW
|
||||
305 forward @ kernel32.CreateMutexW
|
||||
306 forward @ kernel32.ExpandEnvironmentStringsW
|
||||
307 forward @ kernel32.CreateSemaphoreW
|
||||
308 forward @ kernel32.IsBadStringPtrW
|
||||
309 forward @ kernel32.LoadLibraryW
|
||||
310 stub @
|
||||
311 stub @
|
||||
312 stub @
|
||||
313 stub @
|
||||
314 stub @
|
||||
315 stub @
|
||||
310 forward @ kernel32.GetTimeFormatW
|
||||
311 forward @ kernel32.GetDateFormatW
|
||||
312 forward @ kernel32.specGetPrivateProfileStringW
|
||||
313 stdcall @(ptr long ptr long long) SHLWAPI_313
|
||||
314 forward @ user32.RegisterClassExW
|
||||
315 forward @ user32.GetClassInfoExW
|
||||
316 stub SHCreateStreamOnFileAOld
|
||||
317 stub SHCreateStreamOnFileWOld
|
||||
318 stub @
|
||||
319 stub @
|
||||
320 stub @
|
||||
321 stub @
|
||||
322 stub @
|
||||
323 stub @
|
||||
318 stdcall @(long long wstr long) SHLWAPI_318
|
||||
319 forward @ user32.FindWindowExW
|
||||
320 stdcall @(str str) SHLWAPI_320
|
||||
321 stdcall @(wstr wstr) SHLWAPI_321
|
||||
322 stdcall @(str) SHLWAPI_322
|
||||
323 stdcall @(wstr) SHLWAPI_323
|
||||
324 stub @
|
||||
325 stub @
|
||||
326 stub @
|
||||
|
@ -341,22 +341,22 @@ debug_channels (shell)
|
|||
329 stub @
|
||||
330 stub @
|
||||
331 stub @
|
||||
332 stub @
|
||||
333 stub @
|
||||
334 stub @
|
||||
335 stub @
|
||||
336 stub @
|
||||
337 stub @
|
||||
338 stub @
|
||||
339 stub @
|
||||
340 stub @
|
||||
341 stub @
|
||||
332 forward @ user32.CallMsgFilterW
|
||||
333 stdcall @(ptr) SHLWAPI_333
|
||||
334 stdcall @(ptr wstr) SHLWAPI_334
|
||||
335 stdcall @(ptr) SHLWAPI_335
|
||||
336 stdcall @(ptr) SHLWAPI_336
|
||||
337 stdcall @(wstr long ptr ptr long) SHLWAPI_337
|
||||
338 forward @ kernel32.SetFileAttributesW
|
||||
339 forward @ kernel32.GetNumberFormatW
|
||||
340 forward @ user32.specMessageBoxW
|
||||
341 forward @ kernel32.FindNextFileW
|
||||
342 stdcall @(long long long long) SHLWAPI_342
|
||||
343 stub @
|
||||
344 stub @
|
||||
345 stub @
|
||||
346 stdcall @(wstr ptr long) SHLWAPI_346
|
||||
347 stub @
|
||||
347 forward @ advapi32.RegDeleteValueW
|
||||
348 stub @
|
||||
349 stub @
|
||||
350 stub @
|
||||
|
@ -366,26 +366,26 @@ debug_channels (shell)
|
|||
354 stub @
|
||||
355 stub @
|
||||
356 stub @
|
||||
357 stub @
|
||||
358 stub @
|
||||
359 stub @
|
||||
360 stub @
|
||||
361 stub @
|
||||
357 stdcall @(wstr wstr wstr long long) SHLWAPI_357
|
||||
358 stdcall @(ptr ptr ptr ptr ptr ptr) SHLWAPI_358
|
||||
359 forward @ kernel32.OpenEventW
|
||||
360 forward @ kernel32.specRemoveDirectoryW
|
||||
361 forward @ kernel32.GetShortPathNameW
|
||||
362 stub @
|
||||
363 stub @
|
||||
364 stub @
|
||||
364 stdcall @(str str long) SHLWAPI_364
|
||||
365 stub @
|
||||
366 stub @
|
||||
367 stub @
|
||||
368 stub @
|
||||
369 stub @
|
||||
370 stub @
|
||||
366 forward @ advapi32.RegEnumValueW
|
||||
367 forward @ kernel32.WritePrivateProfileStructW
|
||||
368 forward @ kernel32.GetPrivateProfileStructW
|
||||
369 forward @ kernel32.CreateProcessW
|
||||
370 stdcall @(long wstr long) SHLWAPI_370
|
||||
371 stub @
|
||||
372 stub @
|
||||
373 stub @
|
||||
374 stub @
|
||||
375 stub @
|
||||
376 stdcall @(long) SHLWAPI_376
|
||||
376 stdcall @(long) SHLWAPI_376 # kernel32.GetUserDefaultUILanguage
|
||||
377 stdcall @(long long long) SHLWAPI_377
|
||||
378 stdcall @(long long long) SHLWAPI_378
|
||||
379 stub @
|
||||
|
@ -398,9 +398,9 @@ debug_channels (shell)
|
|||
386 stub ChrCmpIW
|
||||
387 stub ColorAdjustLuma
|
||||
388 stub @
|
||||
389 stub @
|
||||
390 stub @
|
||||
391 stub @
|
||||
389 stdcall @(ptr) SHLWAPI_389
|
||||
390 stdcall @(ptr ptr) SHLWAPI_390
|
||||
391 stdcall @(ptr ptr ptr ptr ptr ) SHLWAPI_391
|
||||
392 stub @
|
||||
393 stub @
|
||||
394 stub @
|
||||
|
@ -410,10 +410,10 @@ debug_channels (shell)
|
|||
398 stub @
|
||||
399 stub @
|
||||
400 stub @
|
||||
401 stub @
|
||||
402 stub @
|
||||
403 stub @
|
||||
404 stub @
|
||||
401 stdcall @(ptr) SHLWAPI_401
|
||||
402 stdcall @(ptr) SHLWAPI_402
|
||||
403 stdcall @(ptr) SHLWAPI_403
|
||||
404 stdcall ColorHLSToRGB(long long long) ColorHLSToRGB
|
||||
405 stub @
|
||||
406 stub @
|
||||
407 stub @
|
||||
|
@ -443,7 +443,7 @@ debug_channels (shell)
|
|||
431 stdcall @(long) SHLWAPI_431
|
||||
432 stub @
|
||||
433 stub @
|
||||
434 stub @
|
||||
434 forward @ user32.SendMessageTimeoutW
|
||||
435 stub @
|
||||
436 stub @
|
||||
437 stdcall @(long) SHLWAPI_437
|
||||
|
@ -451,15 +451,15 @@ debug_channels (shell)
|
|||
439 stub @
|
||||
440 stub @
|
||||
441 stub @
|
||||
442 stub @
|
||||
443 stub @
|
||||
444 stub @
|
||||
445 stub @
|
||||
442 forward @ kernel32.GetEnvironmentVariableW
|
||||
443 forward @ kernel32.GetSystemWindowsDirectoryA
|
||||
444 forward @ kernel32.GetSystemWindowsDirectoryW
|
||||
445 stub ColorRGBToHLS
|
||||
446 stub @
|
||||
|
||||
@ stdcall DllGetVersion (ptr) SHLWAPI_DllGetVersion
|
||||
@ stub GetMenuPosFromID
|
||||
@ stub HashData
|
||||
@ stdcall GetMenuPosFromID(ptr long) GetMenuPosFromID
|
||||
@ stdcall HashData (ptr long ptr long) HashData
|
||||
@ stub IntlStrEqWorkerA
|
||||
@ stub IntlStrEqWorkerW
|
||||
@ stdcall PathAddBackslashA (str) PathAddBackslashA
|
||||
|
@ -522,10 +522,10 @@ debug_channels (shell)
|
|||
@ stdcall PathIsUNCW(wstr) PathIsUNCW
|
||||
@ stdcall PathIsURLA(str) PathIsURLA
|
||||
@ stdcall PathIsURLW(wstr) PathIsURLW
|
||||
@ stdcall PathMakePrettyA(str)PathMakePrettyA
|
||||
@ stdcall PathMakePrettyW(wstr)PathMakePrettyW
|
||||
@ stdcall PathMakeSystemFolderA(str)PathMakeSystemFolderA
|
||||
@ stdcall PathMakeSystemFolderW(wstr)PathMakeSystemFolderW
|
||||
@ stdcall PathMakePrettyA(str) PathMakePrettyA
|
||||
@ stdcall PathMakePrettyW(wstr) PathMakePrettyW
|
||||
@ stdcall PathMakeSystemFolderA(str) PathMakeSystemFolderA
|
||||
@ stdcall PathMakeSystemFolderW(wstr) PathMakeSystemFolderW
|
||||
@ stdcall PathMatchSpecA (str str) PathMatchSpecA
|
||||
@ stdcall PathMatchSpecW (wstr wstr) PathMatchSpecW
|
||||
@ stdcall PathParseIconLocationA (str) PathParseIconLocationA
|
||||
|
@ -550,12 +550,12 @@ debug_channels (shell)
|
|||
@ stdcall PathSearchAndQualifyW(wstr ptr long)PathSearchAndQualifyW
|
||||
@ stdcall PathSetDlgItemPathA (long long ptr) PathSetDlgItemPathA
|
||||
@ stdcall PathSetDlgItemPathW (long long ptr) PathSetDlgItemPathW
|
||||
@ stdcall PathSkipRootA(str)PathSkipRootA
|
||||
@ stdcall PathSkipRootW(wstr)PathSkipRootW
|
||||
@ stdcall PathStripPathA(str)PathStripPathA
|
||||
@ stdcall PathStripPathW(wstr)PathStripPathW
|
||||
@ stdcall PathStripToRootA(str)PathStripToRootA
|
||||
@ stdcall PathStripToRootW(wstr)PathStripToRootW
|
||||
@ stdcall PathSkipRootA(str) PathSkipRootA
|
||||
@ stdcall PathSkipRootW(wstr) PathSkipRootW
|
||||
@ stdcall PathStripPathA(str) PathStripPathA
|
||||
@ stdcall PathStripPathW(wstr) PathStripPathW
|
||||
@ stdcall PathStripToRootA(str) PathStripToRootA
|
||||
@ stdcall PathStripToRootW(wstr) PathStripToRootW
|
||||
@ stdcall PathUnmakeSystemFolderA(str)PathUnmakeSystemFolderA
|
||||
@ stdcall PathUnmakeSystemFolderW(wstr)PathUnmakeSystemFolderW
|
||||
@ stdcall PathUnquoteSpacesA (str) PathUnquoteSpacesA
|
||||
|
@ -677,7 +677,7 @@ debug_channels (shell)
|
|||
@ stub UrlGetLocationW
|
||||
@ stub UrlGetPartA
|
||||
@ stub UrlGetPartW
|
||||
@ stub UrlHashA
|
||||
@ stdcall UrlHashA(str ptr long) UrlHashA
|
||||
@ stub UrlHashW
|
||||
@ stub UrlIsA
|
||||
@ stub UrlIsNoHistoryA
|
||||
|
@ -691,12 +691,37 @@ debug_channels (shell)
|
|||
@ varargs wnsprintfW(ptr long wstr)wnsprintfW
|
||||
|
||||
|
||||
# exported in later versions
|
||||
# exported in later versions
|
||||
@ stdcall StrRetToBufA (ptr ptr ptr long) StrRetToBufA
|
||||
@ stdcall StrRetToBufW (ptr ptr ptr long) StrRetToBufW
|
||||
#@ stdcall StrRetToStrA (ptr ptr ptr) StrRetToStrA
|
||||
#@ stdcall StrRetToStrW (ptr ptr ptr) StrRetToStrW
|
||||
@ stdcall SHRegGetPathA(long str str ptr long)SHRegGetPathA
|
||||
@ stdcall SHRegGetPathW(long wstr wstr ptr long)SHRegGetPathW
|
||||
@ stub PathIsDirectoryEmptyA
|
||||
@ stub PathIsDirectoryEmptyW
|
||||
@ stub PathIsNetworkPathA
|
||||
@ stub PathIsNetworkPathW
|
||||
@ stub PathIsLFNFileSpecA
|
||||
@ stub PathIsLFNFileSpecW
|
||||
@ stub PathFindSuffixArrayA
|
||||
@ stub PathFindSuffixArrayW
|
||||
@ stdcall _SHGetInstanceExplorer@4(ptr) _SHGetInstanceExplorer
|
||||
@ stub PathUndecorateA
|
||||
@ stub PathUndecorateW
|
||||
@ stub SHCopyKeyA
|
||||
@ stub SHCopyKeyW
|
||||
@ stub SHAutoComplete
|
||||
@ stub SHCreateStreamOnFileA
|
||||
@ stub SHCreateStreamOnFileW
|
||||
@ stub SHCreateStreamWrapper
|
||||
@ stub SHCreateThread
|
||||
@ stub SHGetThreadRef
|
||||
@ stub SHRegDuplicateHKey
|
||||
@ stub SHSetThreadRef
|
||||
@ stub SHSkipJunction
|
||||
@ stub SHStrDupA
|
||||
@ stub SHStrDupW
|
||||
@ stub StrFormatByteSize64A
|
||||
@ stub StrFormatKBSizeA
|
||||
@ stub StrFormatKBSizeW
|
||||
|
|
|
@ -13,6 +13,11 @@
|
|||
DEFAULT_DEBUG_CHANNEL(shell);
|
||||
|
||||
HINSTANCE shlwapi_hInstance = 0;
|
||||
HMODULE SHLWAPI_hshell32 = 0;
|
||||
HMODULE SHLWAPI_hwinmm = 0;
|
||||
HMODULE SHLWAPI_hcomdlg32 = 0;
|
||||
HMODULE SHLWAPI_hmpr = 0;
|
||||
HMODULE SHLWAPI_hmlang = 0;
|
||||
|
||||
/*************************************************************************
|
||||
* SHLWAPI LibMain
|
||||
|
@ -28,6 +33,13 @@ BOOL WINAPI SHLWAPI_LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad
|
|||
case DLL_PROCESS_ATTACH:
|
||||
shlwapi_hInstance = hinstDLL;
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
if (SHLWAPI_hshell32) FreeLibrary(SHLWAPI_hshell32);
|
||||
if (SHLWAPI_hwinmm) FreeLibrary(SHLWAPI_hwinmm);
|
||||
if (SHLWAPI_hcomdlg32) FreeLibrary(SHLWAPI_hcomdlg32);
|
||||
if (SHLWAPI_hmpr) FreeLibrary(SHLWAPI_hmpr);
|
||||
if (SHLWAPI_hmlang) FreeLibrary(SHLWAPI_hmlang);
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -13,6 +13,28 @@
|
|||
|
||||
DEFAULT_DEBUG_CHANNEL(shell);
|
||||
|
||||
static const unsigned char HashDataLookup[256] = {
|
||||
0x01, 0x0E, 0x6E, 0x19, 0x61, 0xAE, 0x84, 0x77, 0x8A, 0xAA, 0x7D, 0x76, 0x1B,
|
||||
0xE9, 0x8C, 0x33, 0x57, 0xC5, 0xB1, 0x6B, 0xEA, 0xA9, 0x38, 0x44, 0x1E, 0x07,
|
||||
0xAD, 0x49, 0xBC, 0x28, 0x24, 0x41, 0x31, 0xD5, 0x68, 0xBE, 0x39, 0xD3, 0x94,
|
||||
0xDF, 0x30, 0x73, 0x0F, 0x02, 0x43, 0xBA, 0xD2, 0x1C, 0x0C, 0xB5, 0x67, 0x46,
|
||||
0x16, 0x3A, 0x4B, 0x4E, 0xB7, 0xA7, 0xEE, 0x9D, 0x7C, 0x93, 0xAC, 0x90, 0xB0,
|
||||
0xA1, 0x8D, 0x56, 0x3C, 0x42, 0x80, 0x53, 0x9C, 0xF1, 0x4F, 0x2E, 0xA8, 0xC6,
|
||||
0x29, 0xFE, 0xB2, 0x55, 0xFD, 0xED, 0xFA, 0x9A, 0x85, 0x58, 0x23, 0xCE, 0x5F,
|
||||
0x74, 0xFC, 0xC0, 0x36, 0xDD, 0x66, 0xDA, 0xFF, 0xF0, 0x52, 0x6A, 0x9E, 0xC9,
|
||||
0x3D, 0x03, 0x59, 0x09, 0x2A, 0x9B, 0x9F, 0x5D, 0xA6, 0x50, 0x32, 0x22, 0xAF,
|
||||
0xC3, 0x64, 0x63, 0x1A, 0x96, 0x10, 0x91, 0x04, 0x21, 0x08, 0xBD, 0x79, 0x40,
|
||||
0x4D, 0x48, 0xD0, 0xF5, 0x82, 0x7A, 0x8F, 0x37, 0x69, 0x86, 0x1D, 0xA4, 0xB9,
|
||||
0xC2, 0xC1, 0xEF, 0x65, 0xF2, 0x05, 0xAB, 0x7E, 0x0B, 0x4A, 0x3B, 0x89, 0xE4,
|
||||
0x6C, 0xBF, 0xE8, 0x8B, 0x06, 0x18, 0x51, 0x14, 0x7F, 0x11, 0x5B, 0x5C, 0xFB,
|
||||
0x97, 0xE1, 0xCF, 0x15, 0x62, 0x71, 0x70, 0x54, 0xE2, 0x12, 0xD6, 0xC7, 0xBB,
|
||||
0x0D, 0x20, 0x5E, 0xDC, 0xE0, 0xD4, 0xF7, 0xCC, 0xC4, 0x2B, 0xF9, 0xEC, 0x2D,
|
||||
0xF4, 0x6F, 0xB6, 0x99, 0x88, 0x81, 0x5A, 0xD9, 0xCA, 0x13, 0xA5, 0xE7, 0x47,
|
||||
0xE6, 0x8E, 0x60, 0xE3, 0x3E, 0xB3, 0xF6, 0x72, 0xA2, 0x35, 0xA0, 0xD7, 0xCD,
|
||||
0xB4, 0x2F, 0x6D, 0x2C, 0x26, 0x1F, 0x95, 0x87, 0x00, 0xD8, 0x34, 0x3F, 0x17,
|
||||
0x25, 0x45, 0x27, 0x75, 0x92, 0xB8, 0xA3, 0xC8, 0xDE, 0xEB, 0xF8, 0xF3, 0xDB,
|
||||
0x0A, 0x98, 0x83, 0x7B, 0xE5, 0xCB, 0x4C, 0x78, 0xD1 };
|
||||
|
||||
static BOOL URL_NeedEscape(CHAR ch, DWORD dwFlags)
|
||||
{
|
||||
|
||||
|
@ -27,7 +49,7 @@ static BOOL URL_NeedEscape(CHAR ch, DWORD dwFlags)
|
|||
}
|
||||
|
||||
if (ch <= 31 || ch >= 127)
|
||||
return TRUE;
|
||||
return TRUE;
|
||||
|
||||
else {
|
||||
switch (ch) {
|
||||
|
@ -55,7 +77,7 @@ static BOOL URL_NeedEscape(CHAR ch, DWORD dwFlags)
|
|||
/*************************************************************************
|
||||
* UrlCanonicalizeA [SHLWAPI]
|
||||
*/
|
||||
HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized,
|
||||
HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized,
|
||||
LPDWORD pcchCanonicalized, DWORD dwFlags)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
|
@ -68,7 +90,7 @@ HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized,
|
|||
|
||||
nLen = strlen(pszUrl);
|
||||
lpszUrlCpy = HeapAlloc(GetProcessHeap(), 0, nLen + 1);
|
||||
|
||||
|
||||
if (dwFlags & URL_DONT_SIMPLIFY)
|
||||
memcpy(lpszUrlCpy, pszUrl, nLen + 1);
|
||||
else {
|
||||
|
@ -203,7 +225,7 @@ HRESULT WINAPI UrlEscapeW(
|
|||
FIXME("(%s %p %p 0x%08lx): stub\n",debugstr_w(pszUrl),
|
||||
pszEscaped, pcchEscaped, dwFlags);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -290,3 +312,51 @@ HRESULT WINAPI UrlUnescapeW(
|
|||
pcchUnescaped, dwFlags);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* HashData [SHLWAPI]
|
||||
*
|
||||
* Hash an input block into a variable sized digest.
|
||||
*/
|
||||
BOOL WINAPI HashData(const unsigned char *lpSrc, INT nSrcLen,
|
||||
unsigned char *lpDest, INT nDestLen)
|
||||
{
|
||||
INT srcCount = nSrcLen - 1, destCount = nDestLen - 1;
|
||||
|
||||
if (IsBadReadPtr(lpSrc, nSrcLen) ||
|
||||
IsBadWritePtr(lpDest, nDestLen))
|
||||
return FALSE;
|
||||
|
||||
while (destCount >= 0)
|
||||
{
|
||||
lpDest[destCount] = (destCount & 0xff);
|
||||
destCount--;
|
||||
}
|
||||
|
||||
while (srcCount >= 0)
|
||||
{
|
||||
destCount = nDestLen - 1;
|
||||
while (destCount >= 0)
|
||||
{
|
||||
lpDest[destCount] = HashDataLookup[lpSrc[srcCount] ^ lpDest[destCount]];
|
||||
destCount--;
|
||||
}
|
||||
srcCount--;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* UrlHashA [SHLWAPI]
|
||||
*
|
||||
* Hash an ASCII URL.
|
||||
*/
|
||||
HRESULT WINAPI UrlHashA(LPCSTR pszUrl, unsigned char *lpDest, INT nDestLen)
|
||||
{
|
||||
if (IsBadStringPtrA(pszUrl, -1) || IsBadWritePtr(lpDest, nDestLen))
|
||||
return E_INVALIDARG;
|
||||
|
||||
HashData(pszUrl, strlen(pszUrl), lpDest, nDestLen);
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,20 +1,28 @@
|
|||
%long
|
||||
|
||||
BOOL
|
||||
COLORREF
|
||||
DWORD
|
||||
INT
|
||||
LONG
|
||||
HANDLE
|
||||
HDC
|
||||
HDROP
|
||||
HICON
|
||||
HINSTANCE
|
||||
HKEY
|
||||
HMENU
|
||||
HMODULE
|
||||
HPALETTE
|
||||
HRESULT
|
||||
HWND
|
||||
LPARAM
|
||||
LRESULT
|
||||
UCHAR
|
||||
UINT
|
||||
WCHAR
|
||||
WORD
|
||||
WPARAM
|
||||
|
||||
%long # --forbidden
|
||||
|
||||
|
@ -22,19 +30,34 @@ int
|
|||
|
||||
%ptr
|
||||
|
||||
BOOL *
|
||||
DLLVERSIONINFO *
|
||||
HICON *
|
||||
IStream *
|
||||
ITEMIDLIST *
|
||||
IUnknown *
|
||||
LPBROWSEINFOW
|
||||
LPBYTE
|
||||
LPCITEMIDLIST
|
||||
LPCLSID
|
||||
LPCVOID
|
||||
LPDWORD
|
||||
LPINT
|
||||
LPITEMIDLIST
|
||||
LPOPENFILENAMEW
|
||||
LPPAGESETUPDLGW
|
||||
LPPRINTDLGW
|
||||
LPSHELLEXECUTEINFOW
|
||||
LPSHFILEOPSTRUCTW
|
||||
LPSTRRET
|
||||
LPUNKNOWN *
|
||||
LPVOID
|
||||
REFIID
|
||||
REFGUID
|
||||
SHFILEINFOW *
|
||||
unsigned char *
|
||||
void *
|
||||
WNDCLASSA *
|
||||
|
||||
%ptr --extension
|
||||
|
||||
|
@ -53,4 +76,5 @@ void
|
|||
%wstr
|
||||
|
||||
LPCWSTR
|
||||
LPWSTR
|
||||
LPWSTR
|
||||
|
||||
|
|
Loading…
Reference in New Issue