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.
 
 
 
 
 
 

143 lines
3.5 KiB

#include "stock.h"
#pragma hdrstop
#ifndef UNICODE
#define UNICODE
#endif
#include <dobjutil.h>
STDAPI DataObj_SetBlob(IDataObject *pdtobj, UINT cf, LPCVOID pvBlob, UINT cbBlob)
{
HRESULT hr = E_OUTOFMEMORY;
void *pv = GlobalAlloc(GPTR, cbBlob);
if (pv)
{
CopyMemory(pv, pvBlob, cbBlob);
hr = DataObj_SetGlobal(pdtobj, cf, pv);
if (FAILED(hr))
GlobalFree((HGLOBAL)pv);
}
return hr;
}
STDAPI DataObj_GetBlob(IDataObject *pdtobj, UINT cf, void *pvBlob, UINT cbBlob)
{
STGMEDIUM medium = {0};
FORMATETC fmte = {(CLIPFORMAT) cf, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
HRESULT hr = pdtobj->GetData(&fmte, &medium);
if (SUCCEEDED(hr))
{
void *pv = GlobalLock(medium.hGlobal);
if (pv)
{
SIZE_T cb = GlobalSize(medium.hGlobal);
if (cb < cbBlob)
{
RIP(!"Corrupted IDataObject - HGLOBAL too small");
hr = E_UNEXPECTED;
}
else
{
CopyMemory(pvBlob, pv, cbBlob);
}
GlobalUnlock(medium.hGlobal);
}
else
{
hr = E_UNEXPECTED;
}
ReleaseStgMedium(&medium);
}
return hr;
}
STDAPI DataObj_SetDWORD(IDataObject *pdtobj, UINT cf, DWORD dw)
{
return DataObj_SetBlob(pdtobj, cf, &dw, sizeof(DWORD));
}
STDAPI_(DWORD) DataObj_GetDWORD(IDataObject *pdtobj, UINT cf, DWORD dwDefault)
{
DWORD dwRet;
if (FAILED(DataObj_GetBlob(pdtobj, cf, &dwRet, sizeof(DWORD))))
dwRet = dwDefault;
return dwRet;
}
STDAPI DataObj_SetGlobal(IDataObject *pdtobj, UINT cf, HGLOBAL hGlobal)
{
FORMATETC fmte = {(CLIPFORMAT) cf, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM medium = {0};
medium.tymed = TYMED_HGLOBAL;
medium.hGlobal = hGlobal;
medium.pUnkForRelease = NULL;
// give the data object ownership of ths
return pdtobj->SetData(&fmte, &medium, TRUE);
}
STDAPI_(LPIDA) DataObj_GetHIDAEx(IDataObject *pdtobj, CLIPFORMAT cf, STGMEDIUM *pmedium)
{
FORMATETC fmte = {cf, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
if (pmedium)
{
pmedium->pUnkForRelease = NULL;
pmedium->hGlobal = NULL;
}
if (!pmedium)
{
if (S_OK == pdtobj->QueryGetData(&fmte))
return (LPIDA)TRUE;
else
return (LPIDA)FALSE;
}
else if (SUCCEEDED(pdtobj->GetData(&fmte, pmedium)))
{
return (LPIDA)GlobalLock(pmedium->hGlobal);
}
return NULL;
}
STDAPI_(LPIDA) DataObj_GetHIDA(IDataObject *pdtobj, STGMEDIUM *pmedium)
{
static CLIPFORMAT cfHIDA = 0;
if (!cfHIDA)
{
cfHIDA = (CLIPFORMAT)RegisterClipboardFormat(CFSTR_SHELLIDLIST);
}
return DataObj_GetHIDAEx(pdtobj, cfHIDA, pmedium);
}
STDAPI_(void) ReleaseStgMediumHGLOBAL(void *pv, STGMEDIUM *pmedium)
{
if (pmedium->hGlobal && (pmedium->tymed == TYMED_HGLOBAL))
{
#ifdef DEBUG
if (pv)
{
void *pvT = (void *)GlobalLock(pmedium->hGlobal);
ASSERT(pvT == pv);
GlobalUnlock(pmedium->hGlobal);
}
#endif
GlobalUnlock(pmedium->hGlobal);
}
else
{
ASSERT(0);
}
ReleaseStgMedium(pmedium);
}
STDAPI_(void) HIDA_ReleaseStgMedium(LPIDA pida, STGMEDIUM * pmedium)
{
ReleaseStgMediumHGLOBAL((void *)pida, pmedium);
}