Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

107 lines
3.5 KiB

#include <windows.h>
#include <shlwapi.h>
#include <commctrl.h>
#include "dataitem.h"
#include "resource.h"
#include "stdio.h"
#include "util.h"
#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
#define EXPLORER_EXE_STRING TEXT("explorer.exe")
#define HTTP_PREFIX_STRING TEXT("http://")
CDataItem::CDataItem()
{
m_szTitle[0] = 0;
m_szCmdLine[0] = 0;
m_szArgs[0] = 0;
m_dwFlags = 0;
m_dwType = 0;
}
CDataItem::~CDataItem()
{
}
BOOL CDataItem::SetData( LPTSTR pszTitle, LPTSTR pszCmd, LPTSTR pszArgs, DWORD dwFlags, DWORD dwType)
{
BOOL fRet = FALSE;
if (!m_szCmdLine[0] && // not init'd yet
pszTitle &&
pszCmd)
{
lstrcpyn(m_szTitle, pszTitle, ARRAYSIZE(m_szTitle)); // fine, we control pszTitle
lstrcpyn(m_szCmdLine, pszCmd, ARRAYSIZE(m_szCmdLine)); // fine, we control pszCmd
if (pszArgs)
{
lstrcpyn( m_szArgs, pszArgs, ARRAYSIZE(m_szArgs)); // fine, we control pszArgs
}
m_dwType = dwType;
m_dwFlags = dwFlags;
fRet = TRUE;
}
return fRet;
}
#define BUFFER_SIZE 1000
BOOL CDataItem::Invoke(HWND hwnd)
{
BOOL fResult = FALSE;
if (m_szCmdLine[0])
{
TCHAR szExpandedExecutable[BUFFER_SIZE];
TCHAR szExpandedArgs[BUFFER_SIZE];
fResult = SafeExpandEnvStringsA(m_szCmdLine, szExpandedExecutable, ARRAYSIZE(szExpandedExecutable));
if (fResult)
{
if (m_szArgs[0])
{
fResult = SafeExpandEnvStringsA(m_szArgs, szExpandedArgs, ARRAYSIZE(szExpandedArgs));
}
else
{
szExpandedArgs[0] = 0;
}
if (fResult)
{
TCHAR szDirectory[MAX_PATH];
int cchDirectory = GetModuleFileName(NULL, szDirectory, ARRAYSIZE(szDirectory));
if (cchDirectory > 0 && cchDirectory < MAX_PATH)
{
if (LocalPathRemoveFileSpec(szDirectory))
{
if (!strncmp(szExpandedExecutable, EXPLORER_EXE_STRING, ARRAYSIZE(EXPLORER_EXE_STRING))) // explorer paths must be opened
{
if (szExpandedArgs[0] && !strncmp(szExpandedArgs, HTTP_PREFIX_STRING, ARRAYSIZE(HTTP_PREFIX_STRING) - 1))
{
// opening a weblink
fResult = ((INT_PTR)ShellExecute(hwnd, TEXT("open"), szExpandedArgs, NULL, NULL, SW_SHOWNORMAL) > 32);
}
else
{
// opening a folder
if (szExpandedArgs[0])
{
LocalPathAppendA(szDirectory, szExpandedArgs, ARRAYSIZE(szDirectory));
}
fResult = ((INT_PTR)ShellExecute(hwnd, TEXT("open"), szDirectory, NULL, NULL, SW_SHOWNORMAL) > 32);
}
}
else
{
fResult = ((INT_PTR)ShellExecute(hwnd, NULL, szExpandedExecutable, szExpandedArgs, szDirectory, SW_SHOWNORMAL) > 32);
}
}
}
}
}
}
return fResult;
}