ReactOS  0.4.15-dev-3182-g7b62228
CShellLink.cpp File Reference
#include "precomp.h"
#include <appmgmt.h>
#include "pshpack1.h"
#include "poppack.h"
Include dependency graph for CShellLink.cpp:

Go to the source code of this file.

Classes

struct  LOCATION_INFO
 
struct  LOCAL_VOLUME_INFO
 
struct  volume_info
 

Macros

#define ICON_LINK_WINDOWS_COMPAT
 
#define SHLINK_LOCAL   0
 
#define SHLINK_REMOTE   1
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shell)
 
static HRESULT ShellLink_UpdatePath (LPCWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR *psPath)
 
static LPWSTR __inline HEAP_strdupAtoW (HANDLE heap, DWORD flags, LPCSTR str)
 
static LPWSTR __inline strdupW (LPCWSTR src)
 
static HRESULT Stream_LoadString (IStream *stm, BOOL unicode, LPWSTR *pstr)
 
static BOOL ShellLink_GetVolumeInfo (LPCWSTR path, CShellLink::volume_info *volume)
 
static HRESULT Stream_ReadChunk (IStream *stm, LPVOID *data)
 
static BOOL Stream_LoadVolume (LOCAL_VOLUME_INFO *vol, CShellLink::volume_info *volume)
 
static LPWSTR Stream_LoadPath (LPCSTR p, DWORD maxlen)
 
static HRESULT Stream_LoadLocation (IStream *stm, CShellLink::volume_info *volume, LPWSTR *path)
 
static HRESULT Stream_WriteString (IStream *stm, LPCWSTR str)
 
static HRESULT Stream_WriteLocationInfo (IStream *stm, LPCWSTR path, CShellLink::volume_info *volume)
 
static BOOL SHELL_ExistsFileW (LPCWSTR path)
 
static LPWSTR shelllink_get_msi_component_path (LPWSTR component)
 
static HRESULT SHELL_PidlGetIconLocationW (PCIDLIST_ABSOLUTE pidl, UINT uFlags, PWSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags)
 
static LPWSTR GetAdvertisedArg (LPCWSTR str)
 
INT_PTR CALLBACK ExtendedShortcutProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
LPWSTR SH_GetTargetTypeByPath (LPCWSTR lpcwFullPath)
 
HRESULT WINAPI IShellLink_ConstructFromPath (WCHAR *path, REFIID riid, LPVOID *ppv)
 
HRESULT WINAPI IShellLink_ConstructFromFile (IShellFolder *psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv)
 

Macro Definition Documentation

◆ ICON_LINK_WINDOWS_COMPAT

#define ICON_LINK_WINDOWS_COMPAT

Definition at line 152 of file CShellLink.cpp.

◆ SHLINK_LOCAL

#define SHLINK_LOCAL   0

Definition at line 154 of file CShellLink.cpp.

◆ SHLINK_REMOTE

#define SHLINK_REMOTE   1

Definition at line 155 of file CShellLink.cpp.

Function Documentation

◆ ExtendedShortcutProc()

INT_PTR CALLBACK ExtendedShortcutProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 2658 of file CShellLink.cpp.

2660 {
2661  switch(uMsg)
2662  {
2663  case WM_INITDIALOG:
2664  if (lParam)
2665  {
2666  HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_SHORTEX_RUN_DIFFERENT);
2667  SendMessage(hDlgCtrl, BM_SETCHECK, BST_CHECKED, 0);
2668  }
2669  return TRUE;
2670  case WM_COMMAND:
2671  {
2672  HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_SHORTEX_RUN_DIFFERENT);
2673  if (LOWORD(wParam) == IDOK)
2674  {
2675  if (SendMessage(hDlgCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)
2676  EndDialog(hwndDlg, 1);
2677  else
2678  EndDialog(hwndDlg, 0);
2679  }
2680  else if (LOWORD(wParam) == IDCANCEL)
2681  {
2682  EndDialog(hwndDlg, -1);
2683  }
2685  {
2686  if (SendMessage(hDlgCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)
2687  SendMessage(hDlgCtrl, BM_SETCHECK, BST_UNCHECKED, 0);
2688  else
2689  SendMessage(hDlgCtrl, BM_SETCHECK, BST_CHECKED, 0);
2690  }
2691  }
2692  }
2693  return FALSE;
2694 }
#define IDOK
Definition: winuser.h:824
#define TRUE
Definition: types.h:120
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
#define IDC_SHORTEX_RUN_DIFFERENT
Definition: shresdef.h:450
#define FALSE
Definition: types.h:117
#define BM_GETCHECK
Definition: winuser.h:1901
#define BM_SETCHECK
Definition: winuser.h:1904
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define WM_COMMAND
Definition: winuser.h:1723
#define BST_UNCHECKED
Definition: winuser.h:199
#define BST_CHECKED
Definition: winuser.h:197
#define SendMessage
Definition: winuser.h:5819
#define IDCANCEL
Definition: winuser.h:825
#define WM_INITDIALOG
Definition: winuser.h:1722
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82

Referenced by CShellLink::OnCommand().

◆ GetAdvertisedArg()

static LPWSTR GetAdvertisedArg ( LPCWSTR  str)
static

Definition at line 2020 of file CShellLink.cpp.

2021 {
2022  if (!str)
2023  return NULL;
2024 
2025  LPCWSTR p = wcschr(str, L':');
2026  if (!p)
2027  return NULL;
2028 
2029  DWORD len = p - str;
2030  LPWSTR ret = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * (len + 1));
2031  if (!ret)
2032  return ret;
2033 
2034  memcpy(ret, str, sizeof(WCHAR)*len);
2035  ret[len] = 0;
2036  return ret;
2037 }
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
const WCHAR * str
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
int ret
static const WCHAR L[]
Definition: oid.c:1250
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
#define NULL
Definition: types.h:112
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by CShellLink::SetAdvertiseInfo().

◆ HEAP_strdupAtoW()

static LPWSTR __inline HEAP_strdupAtoW ( HANDLE  heap,
DWORD  flags,
LPCSTR  str 
)
static

Definition at line 194 of file CShellLink.cpp.

195 {
196  INT len;
197  LPWSTR p;
198 
199  assert(str);
200 
201  len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
202  p = (LPWSTR)HeapAlloc(heap, flags, len * sizeof(WCHAR));
203  if (!p)
204  return p;
205  MultiByteToWideChar(CP_ACP, 0, str, -1, p, len);
206  return p;
207 }
#define CP_ACP
Definition: compat.h:109
#define assert(x)
Definition: debug.h:53
int32_t INT
Definition: typedefs.h:58
const WCHAR * str
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
GLbitfield flags
Definition: glext.h:7161
GLenum GLsizei len
Definition: glext.h:6722
#define NULL
Definition: types.h:112
#define MultiByteToWideChar
Definition: compat.h:110
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by CShellLink::Extract(), CShellLink::SetArguments(), CShellLink::SetDescription(), CShellLink::SetIconLocation(), CShellLink::SetPath(), CShellLink::SetRelativePath(), and CShellLink::SetWorkingDirectory().

◆ IShellLink_ConstructFromFile()

HRESULT WINAPI IShellLink_ConstructFromFile ( IShellFolder psf,
LPCITEMIDLIST  pidl,
REFIID  riid,
LPVOID ppv 
)

Definition at line 3106 of file CShellLink.cpp.

3107 {
3108  WCHAR path[MAX_PATH];
3109  if (!ILGetDisplayNameExW(psf, pidl, path, 0))
3110  return E_FAIL;
3111 
3113 }
REFIID riid
Definition: precomp.h:44
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define E_FAIL
Definition: ddrawi.h:102
BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type)
Definition: pidl.c:91
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:34

◆ IShellLink_ConstructFromPath()

HRESULT WINAPI IShellLink_ConstructFromPath ( WCHAR path,
REFIID  riid,
LPVOID ppv 
)

Definition at line 3092 of file CShellLink.cpp.

3093 {
3095  HRESULT hr = CShellLink::_CreatorClass::CreateInstance(NULL, IID_PPV_ARG(IPersistFile, &ppf));
3096  if (FAILED(hr))
3097  return hr;
3098 
3099  hr = ppf->Load(path, 0);
3100  if (FAILED(hr))
3101  return hr;
3102 
3103  return ppf->QueryInterface(riid, ppv);
3104 }
HRESULT hr
Definition: shlfolder.c:183
REFIID riid
Definition: precomp.h:44
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define IID_PPV_ARG(Itype, ppType)
LONG HRESULT
Definition: typedefs.h:79
#define NULL
Definition: types.h:112

Referenced by CFSDropTarget::_DoDrop(), IShellLink_ConstructFromFile(), and SHAddToRecentDocs().

◆ SH_GetTargetTypeByPath()

LPWSTR SH_GetTargetTypeByPath ( LPCWSTR  lpcwFullPath)

Definition at line 2701 of file CShellLink.cpp.

2702 {
2703  LPCWSTR pwszExt;
2704  static WCHAR wszBuf[MAX_PATH];
2705 
2706  /* Get file information */
2707  SHFILEINFOW fi;
2708  if (!SHGetFileInfoW(lpcwFullPath, 0, &fi, sizeof(fi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES))
2709  {
2710  ERR("SHGetFileInfoW failed for %ls (%lu)\n", lpcwFullPath, GetLastError());
2711  fi.szTypeName[0] = L'\0';
2712  fi.hIcon = NULL;
2713  }
2714 
2715  pwszExt = PathFindExtensionW(lpcwFullPath);
2716  if (pwszExt[0])
2717  {
2718  if (!fi.szTypeName[0])
2719  {
2720  /* The file type is unknown, so default to string "FileExtension File" */
2721  size_t cchRemaining = 0;
2722  LPWSTR pwszEnd = NULL;
2723 
2724  StringCchPrintfExW(wszBuf, _countof(wszBuf), &pwszEnd, &cchRemaining, 0, L"%s ", pwszExt + 1);
2725  }
2726  else
2727  {
2728  /* Update file type */
2729  StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s (%s)", fi.szTypeName, pwszExt);
2730  }
2731  }
2732 
2733  return wszBuf;
2734 }
#define SHGFI_TYPENAME
Definition: shellapi.h:165
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
WCHAR szTypeName[80]
Definition: shellapi.h:374
STRSAFEAPI StringCchPrintfExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:585
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
__wchar_t WCHAR
Definition: xmlstorage.h:180
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:414
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:179
static const WCHAR L[]
Definition: oid.c:1250
HICON hIcon
Definition: shellapi.h:370
#define ERR(fmt,...)
Definition: debug.h:110
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by CShellLink::OnInitDialog().

◆ SHELL_ExistsFileW()

static BOOL SHELL_ExistsFileW ( LPCWSTR  path)
static

Definition at line 1008 of file CShellLink.cpp.

1009 {
1011  return FALSE;
1012 
1013  return TRUE;
1014 }
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23

Referenced by ShellLink_UpdatePath().

◆ SHELL_PidlGetIconLocationW()

static HRESULT SHELL_PidlGetIconLocationW ( PCIDLIST_ABSOLUTE  pidl,
UINT  uFlags,
PWSTR  pszIconFile,
UINT  cchMax,
int piIndex,
UINT pwFlags 
)
static

Definition at line 1698 of file CShellLink.cpp.

1700 {
1701  LPCITEMIDLIST pidlLast;
1703 
1704  HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
1705  if (FAILED_UNEXPECTEDLY(hr))
1706  return hr;
1707 
1709  hr = psf->GetUIObjectOf(0, 1, &pidlLast, IID_NULL_PPV_ARG(IExtractIconW, &pei));
1710  if (FAILED_UNEXPECTEDLY(hr))
1711  return hr;
1712 
1713  hr = pei->GetIconLocation(uFlags, pszIconFile, cchMax, piIndex, pwFlags);
1714  if (FAILED_UNEXPECTEDLY(hr))
1715  return hr;
1716 
1717  return S_OK;
1718 }
HRESULT hr
Definition: shlfolder.c:183
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
UINT uFlags
Definition: api.c:59
#define IID_PPV_ARG(Itype, ppType)
#define IID_NULL_PPV_ARG(Itype, ppType)
LONG HRESULT
Definition: typedefs.h:79
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:82
UINT cchMax
#define S_OK
Definition: intsafe.h:52
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1337

Referenced by CShellLink::GetIconLocation().

◆ shelllink_get_msi_component_path()

static LPWSTR shelllink_get_msi_component_path ( LPWSTR  component)
static

Definition at line 1376 of file CShellLink.cpp.

1377 {
1378  DWORD Result, sz = 0;
1379 
1380  Result = CommandLineFromMsiDescriptor(component, NULL, &sz);
1381  if (Result != ERROR_SUCCESS)
1382  return NULL;
1383 
1384  sz++;
1385  LPWSTR path = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR));
1386  Result = CommandLineFromMsiDescriptor(component, path, &sz);
1387  if (Result != ERROR_SUCCESS)
1388  {
1389  HeapFree(GetProcessHeap(), 0, path);
1390  path = NULL;
1391  }
1392 
1393  TRACE("returning %s\n", debugstr_w(path));
1394 
1395  return path;
1396 }
#define ERROR_SUCCESS
Definition: deptool.c:10
GLsizei const GLchar ** path
Definition: glext.h:7234
DWORD WINAPI CommandLineFromMsiDescriptor(WCHAR *szDescriptor, WCHAR *szCommandLine, DWORD *pcchCommandLine)
Definition: msi.c:22
#define debugstr_w
Definition: kernel32.h:32
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by CShellLink::Resolve().

◆ ShellLink_GetVolumeInfo()

static BOOL ShellLink_GetVolumeInfo ( LPCWSTR  path,
CShellLink::volume_info volume 
)
static

Definition at line 473 of file CShellLink.cpp.

474 {
475  WCHAR drive[4] = { path[0], ':', '\\', 0 };
476 
477  volume->type = GetDriveTypeW(drive);
478  BOOL bRet = GetVolumeInformationW(drive, volume->label, _countof(volume->label), &volume->serial, NULL, NULL, NULL, 0);
479  TRACE("ret = %d type %d serial %08x name %s\n", bRet,
480  volume->type, volume->serial, debugstr_w(volume->label));
481  return bRet;
482 }
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
BOOL WINAPI GetVolumeInformationW(IN LPCWSTR lpRootPathName, IN LPWSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
Definition: volume.c:226
#define NULL
Definition: types.h:112

Referenced by CShellLink::SetTargetFromPIDLOrPath().

◆ ShellLink_UpdatePath()

static HRESULT ShellLink_UpdatePath ( LPCWSTR  sPathRel,
LPCWSTR  path,
LPCWSTR  sWorkDir,
LPWSTR psPath 
)
static

Definition at line 1020 of file CShellLink.cpp.

1021 {
1022  if (!path || !psPath)
1023  return E_INVALIDARG;
1024 
1025  if (!*psPath && sPathRel)
1026  {
1027  WCHAR buffer[2*MAX_PATH], abs_path[2*MAX_PATH];
1028  LPWSTR final = NULL;
1029 
1030  /* first try if [directory of link file] + [relative path] finds an existing file */
1031 
1032  GetFullPathNameW(path, MAX_PATH * 2, buffer, &final);
1033  if (!final)
1034  final = buffer;
1035  wcscpy(final, sPathRel);
1036 
1037  *abs_path = '\0';
1038 
1040  {
1041  if (!GetFullPathNameW(buffer, MAX_PATH, abs_path, &final))
1042  wcscpy(abs_path, buffer);
1043  }
1044  else
1045  {
1046  /* try if [working directory] + [relative path] finds an existing file */
1047  if (sWorkDir)
1048  {
1049  wcscpy(buffer, sWorkDir);
1050  wcscpy(PathAddBackslashW(buffer), sPathRel);
1051 
1053  if (!GetFullPathNameW(buffer, MAX_PATH, abs_path, &final))
1054  wcscpy(abs_path, buffer);
1055  }
1056  }
1057 
1058  /* FIXME: This is even not enough - not all shell links can be resolved using this algorithm. */
1059  if (!*abs_path)
1060  wcscpy(abs_path, sPathRel);
1061 
1062  *psPath = strdupW(abs_path);
1063  if (!*psPath)
1064  return E_OUTOFMEMORY;
1065  }
1066 
1067  return S_OK;
1068 }
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1105
GLuint buffer
Definition: glext.h:5915
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
LPWSTR WINAPI PathAddBackslashW(LPWSTR lpszPath)
Definition: path.c:294
#define E_INVALIDARG
Definition: ddrawi.h:101
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:34
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by CShellLink::Load(), and CShellLink::SetRelativePath().

◆ strdupW()

static LPWSTR __inline strdupW ( LPCWSTR  src)
static

Definition at line 209 of file CShellLink.cpp.

210 {
211  LPWSTR dest;
212  if (!src) return NULL;
213  dest = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, (wcslen(src) + 1) * sizeof(WCHAR));
214  if (dest)
215  wcscpy(dest, src);
216  return dest;
217 }
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
GLenum src
Definition: glext.h:6340
#define NULL
Definition: types.h:112
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static char * dest
Definition: rtl.c:135
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by CShellLink::DoOpen(), CShellLink::GetIconLocation(), CShellLink::Load(), CShellLink::OnNotify(), CShellLink::Resolve(), CShellLink::Save(), CShellLink::SetArguments(), CShellLink::SetDescription(), CShellLink::SetIconLocation(), CShellLink::SetPath(), CShellLink::SetRelativePath(), CShellLink::SetTargetFromPIDLOrPath(), CShellLink::SetWorkingDirectory(), and ShellLink_UpdatePath().

◆ Stream_LoadLocation()

static HRESULT Stream_LoadLocation ( IStream stm,
CShellLink::volume_info volume,
LPWSTR path 
)
static

Definition at line 554 of file CShellLink.cpp.

556 {
557  char *p = NULL;
558  HRESULT hr = Stream_ReadChunk(stm, (LPVOID*) &p);
559  if (FAILED(hr))
560  return hr;
561 
562  LOCATION_INFO *loc = reinterpret_cast<LOCATION_INFO *>(p);
563  if (loc->dwTotalSize < sizeof(LOCATION_INFO))
564  {
565  HeapFree(GetProcessHeap(), 0, p);
566  return E_FAIL;
567  }
568 
569  /* if there's valid local volume information, load it */
570  if (loc->dwVolTableOfs &&
571  ((loc->dwVolTableOfs + sizeof(LOCAL_VOLUME_INFO)) <= loc->dwTotalSize))
572  {
574 
577  }
578 
579  /* if there's a local path, load it */
580  DWORD n = loc->dwLocalPathOfs;
581  if (n && n < loc->dwTotalSize)
582  *path = Stream_LoadPath(&p[n], loc->dwTotalSize - n);
583 
584  TRACE("type %d serial %08x name %s path %s\n", volume->type,
585  volume->serial, debugstr_w(volume->label), debugstr_w(*path));
586 
587  HeapFree(GetProcessHeap(), 0, p);
588  return S_OK;
589 }
HRESULT hr
Definition: shlfolder.c:183
GLdouble n
Definition: glext.h:7729
#define E_FAIL
Definition: ddrawi.h:102
#define debugstr_w
Definition: kernel32.h:32
DWORD dwLocalPathOfs
Definition: CShellLink.cpp:167
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
LONG HRESULT
Definition: typedefs.h:79
unsigned long DWORD
Definition: ntddk_ex.h:95
#define S_OK
Definition: intsafe.h:52
DWORD dwVolTableOfs
Definition: CShellLink.cpp:166
#define NULL
Definition: types.h:112
GLfloat GLfloat p
Definition: glext.h:8902
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by CShellLink::Load().

◆ Stream_LoadPath()

static LPWSTR Stream_LoadPath ( LPCSTR  p,
DWORD  maxlen 
)
static

Definition at line 537 of file CShellLink.cpp.

538 {
539  UINT len = 0;
540 
541  while (len < maxlen && p[len])
542  len++;
543 
544  UINT wlen = MultiByteToWideChar(CP_ACP, 0, p, len, NULL, 0);
545  LPWSTR path = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, (wlen + 1) * sizeof(WCHAR));
546  if (!path)
547  return NULL;
548  MultiByteToWideChar(CP_ACP, 0, p, len, path, wlen);
549  path[wlen] = 0;
550 
551  return path;
552 }
GLsizei const GLchar ** path
Definition: glext.h:7234
#define CP_ACP
Definition: compat.h:109
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
GLenum GLsizei len
Definition: glext.h:6722
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define MultiByteToWideChar
Definition: compat.h:110
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by Stream_LoadLocation().

◆ Stream_LoadString()

static HRESULT Stream_LoadString ( IStream stm,
BOOL  unicode,
LPWSTR pstr 
)
static

Definition at line 416 of file CShellLink.cpp.

417 {
418  TRACE("%p\n", stm);
419 
420  USHORT len;
421  DWORD count = 0;
422  HRESULT hr = stm->Read(&len, sizeof(len), &count);
423  if (FAILED(hr) || count != sizeof(len))
424  return E_FAIL;
425 
426  if (unicode)
427  len *= sizeof(WCHAR);
428 
429  TRACE("reading %d\n", len);
430  LPSTR temp = (LPSTR)HeapAlloc(GetProcessHeap(), 0, len + sizeof(WCHAR));
431  if (!temp)
432  return E_OUTOFMEMORY;
433  count = 0;
434  hr = stm->Read(temp, len, &count);
435  if (FAILED(hr) || count != len)
436  {
438  return E_FAIL;
439  }
440 
441  TRACE("read %s\n", debugstr_an(temp, len));
442 
443  /* convert to unicode if necessary */
444  LPWSTR str;
445  if (!unicode)
446  {
448  str = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, (count + 1) * sizeof(WCHAR));
449  if (!str)
450  {
452  return E_OUTOFMEMORY;
453  }
456  }
457  else
458  {
459  count /= sizeof(WCHAR);
460  str = (LPWSTR)temp;
461  }
462  str[count] = 0;
463 
464  *pstr = str;
465 
466  return S_OK;
467 }
HRESULT hr
Definition: shlfolder.c:183
#define CP_ACP
Definition: compat.h:109
GLuint GLuint GLsizei count
Definition: gl.h:1545
char * LPSTR
Definition: xmlstorage.h:182
#define E_FAIL
Definition: ddrawi.h:102
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
const WCHAR * str
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
unsigned long DWORD
Definition: ntddk_ex.h:95
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
GLenum GLsizei len
Definition: glext.h:6722
#define S_OK
Definition: intsafe.h:52
unsigned short USHORT
Definition: pedump.c:61
static calc_node_t temp
Definition: rpn_ieee.c:38
#define NULL
Definition: types.h:112
#define MultiByteToWideChar
Definition: compat.h:110
WCHAR * LPWSTR
Definition: xmlstorage.h:184
HRESULT Read([out, size_is(cb), length_is(*pcbRead)] void *pv, [in] ULONG cb, [out] ULONG *pcbRead)
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by CShellLink::Load().

◆ Stream_LoadVolume()

static BOOL Stream_LoadVolume ( LOCAL_VOLUME_INFO vol,
CShellLink::volume_info volume 
)
static

Definition at line 519 of file CShellLink.cpp.

520 {
521  volume->serial = vol->dwVolSerial;
522  volume->type = vol->dwType;
523 
524  if (!vol->dwVolLabelOfs)
525  return FALSE;
526  if (vol->dwSize <= vol->dwVolLabelOfs)
527  return FALSE;
528  INT len = vol->dwSize - vol->dwVolLabelOfs;
529 
530  LPSTR label = (LPSTR)vol;
531  label += vol->dwVolLabelOfs;
532  MultiByteToWideChar(CP_ACP, 0, label, len, volume->label, _countof(volume->label));
533 
534  return TRUE;
535 }
#define TRUE
Definition: types.h:120
#define CP_ACP
Definition: compat.h:109
char * LPSTR
Definition: xmlstorage.h:182
int32_t INT
Definition: typedefs.h:58
#define FALSE
Definition: types.h:117
#define _countof(array)
Definition: sndvol32.h:68
GLenum GLsizei len
Definition: glext.h:6722
uint8_t label[11]
Definition: fsck.fat.h:65
#define MultiByteToWideChar
Definition: compat.h:110

Referenced by Stream_LoadLocation().

◆ Stream_ReadChunk()

static HRESULT Stream_ReadChunk ( IStream stm,
LPVOID data 
)
static

Definition at line 484 of file CShellLink.cpp.

485 {
486  struct sized_chunk
487  {
488  DWORD size;
489  unsigned char data[1];
490  } *chunk;
491 
492  TRACE("%p\n", stm);
493 
494  DWORD size;
495  ULONG count;
496  HRESULT hr = stm->Read(&size, sizeof(size), &count);
497  if (FAILED(hr) || count != sizeof(size))
498  return E_FAIL;
499 
500  chunk = static_cast<sized_chunk *>(HeapAlloc(GetProcessHeap(), 0, size));
501  if (!chunk)
502  return E_OUTOFMEMORY;
503 
504  chunk->size = size;
505  hr = stm->Read(chunk->data, size - sizeof(size), &count);
506  if (FAILED(hr) || count != (size - sizeof(size)))
507  {
509  return E_FAIL;
510  }
511 
512  TRACE("Read %d bytes\n", chunk->size);
513 
514  *data = chunk;
515 
516  return S_OK;
517 }
uint16_t size
Definition: btrfs_drv.h:572
HRESULT hr
Definition: shlfolder.c:183
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define E_FAIL
Definition: ddrawi.h:102
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG HRESULT
Definition: typedefs.h:79
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define S_OK
Definition: intsafe.h:52
unsigned int ULONG
Definition: retypes.h:1
HRESULT Read([out, size_is(cb), length_is(*pcbRead)] void *pv, [in] ULONG cb, [out] ULONG *pcbRead)
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by Stream_LoadLocation().

◆ Stream_WriteLocationInfo()

static HRESULT Stream_WriteLocationInfo ( IStream stm,
LPCWSTR  path,
CShellLink::volume_info volume 
)
static

Definition at line 820 of file CShellLink.cpp.

822 {
823  LOCAL_VOLUME_INFO *vol;
824  LOCATION_INFO *loc;
825 
826  TRACE("%p %s %p\n", stm, debugstr_w(path), volume);
827 
828  /* figure out the size of everything */
829  DWORD label_size = WideCharToMultiByte(CP_ACP, 0, volume->label, -1,
830  NULL, 0, NULL, NULL);
831  DWORD path_size = WideCharToMultiByte(CP_ACP, 0, path, -1,
832  NULL, 0, NULL, NULL);
833  DWORD volume_info_size = sizeof(*vol) + label_size;
834  DWORD final_path_size = 1;
835  DWORD total_size = sizeof(*loc) + volume_info_size + path_size + final_path_size;
836 
837  /* create pointers to everything */
838  loc = static_cast<LOCATION_INFO *>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, total_size));
839  vol = (LOCAL_VOLUME_INFO*) &loc[1];
840  LPSTR szLabel = (LPSTR) &vol[1];
841  LPSTR szPath = &szLabel[label_size];
842  LPSTR szFinalPath = &szPath[path_size];
843 
844  /* fill in the location information header */
845  loc->dwTotalSize = total_size;
846  loc->dwHeaderSize = sizeof(*loc);
847  loc->dwFlags = 1;
848  loc->dwVolTableOfs = sizeof(*loc);
849  loc->dwLocalPathOfs = sizeof(*loc) + volume_info_size;
850  loc->dwNetworkVolTableOfs = 0;
851  loc->dwFinalPathOfs = sizeof(*loc) + volume_info_size + path_size;
852 
853  /* fill in the volume information */
854  vol->dwSize = volume_info_size;
855  vol->dwType = volume->type;
856  vol->dwVolSerial = volume->serial;
857  vol->dwVolLabelOfs = sizeof(*vol);
858 
859  /* copy in the strings */
860  WideCharToMultiByte(CP_ACP, 0, volume->label, -1,
861  szLabel, label_size, NULL, NULL);
863  szPath, path_size, NULL, NULL);
864  *szFinalPath = 0;
865 
866  ULONG count = 0;
867  HRESULT hr = stm->Write(loc, total_size, &count);
868  HeapFree(GetProcessHeap(), 0, loc);
869 
870  return hr;
871 }
DWORD dwHeaderSize
Definition: CShellLink.cpp:164
#define WideCharToMultiByte
Definition: compat.h:111
HRESULT hr
Definition: shlfolder.c:183
#define CP_ACP
Definition: compat.h:109
GLuint GLuint GLsizei count
Definition: gl.h:1545
DWORD dwNetworkVolTableOfs
Definition: CShellLink.cpp:168
char * LPSTR
Definition: xmlstorage.h:182
#define debugstr_w
Definition: kernel32.h:32
DWORD dwLocalPathOfs
Definition: CShellLink.cpp:167
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG HRESULT
Definition: typedefs.h:79
DWORD dwFinalPathOfs
Definition: CShellLink.cpp:169
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD dwVolTableOfs
Definition: CShellLink.cpp:166
LPCWSTR szPath
Definition: env.c:37
#define NULL
Definition: types.h:112
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
unsigned int ULONG
Definition: retypes.h:1
HRESULT Write([in, size_is(cb)] const void *pv, [in] ULONG cb, [out] ULONG *pcbWritten)
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by CShellLink::Save().

◆ Stream_WriteString()

static HRESULT Stream_WriteString ( IStream stm,
LPCWSTR  str 
)
static

Definition at line 785 of file CShellLink.cpp.

786 {
787  SIZE_T length;
788  USHORT len;
789  DWORD count;
790 
791  length = wcslen(str) + 1;
792  if (length > MAXUSHORT)
793  {
794  return E_INVALIDARG;
795  }
796 
797  len = (USHORT)length;
798  HRESULT hr = stm->Write(&len, sizeof(len), &count);
799  if (FAILED(hr))
800  return hr;
801 
802  length *= sizeof(WCHAR);
803 
804  hr = stm->Write(str, (ULONG)length, &count);
805  if (FAILED(hr))
806  return hr;
807 
808  return S_OK;
809 }
HRESULT hr
Definition: shlfolder.c:183
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
#define E_INVALIDARG
Definition: ddrawi.h:101
const WCHAR * str
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLsizei len
Definition: glext.h:6722
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define S_OK
Definition: intsafe.h:52
unsigned short USHORT
Definition: pedump.c:61
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define MAXUSHORT
Definition: typedefs.h:83
unsigned int ULONG
Definition: retypes.h:1
HRESULT Write([in, size_is(cb)] const void *pv, [in] ULONG cb, [out] ULONG *pcbWritten)

Referenced by CShellLink::Save().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shell  )