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.
285 lines
13 KiB
285 lines
13 KiB
/**************************************************************************\
|
|
* Module Name: ntsend.h
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* client-side macros for kernel-mode
|
|
*
|
|
* 03-21-95 JimA Created.
|
|
\**************************************************************************/
|
|
|
|
/*
|
|
* The BEGINCALLCONNECT macro ensures that the thread is set up correctly.
|
|
*/
|
|
#define BEGINCALLCONNECT() \
|
|
{ \
|
|
ULONG_PTR retval; \
|
|
{ \
|
|
if (NtCurrentTeb()->Win32ThreadInfo == NULL) { \
|
|
if (!USERTHREADCONNECT()) { \
|
|
MSGERROR(); \
|
|
} \
|
|
}
|
|
|
|
/*
|
|
* Use this macro if you don't need to access shared memory.
|
|
*/
|
|
#define BEGINCALL() \
|
|
{ \
|
|
ULONG_PTR retval; \
|
|
{
|
|
|
|
#define BEGINCALL_CLASSV() \
|
|
{ \
|
|
ULONG_PTR retval; \
|
|
TCHAR ClassNameVer[MAX_ATOM_LEN]; \
|
|
LPTSTR lpClassNameVer; \
|
|
BOOL bRegistered = FALSE; \
|
|
PACTIVATION_CONTEXT lpActivationContext = NULL; \
|
|
LPWSTR lpDllName = NULL; \
|
|
{ \
|
|
lpClassNameVer = (LPTSTR)ClassNameToVersion((LPCWSTR)pszClassName, \
|
|
(LPWSTR)ClassNameVer, &lpDllName, &lpActivationContext, IS_ANSI); \
|
|
if (lpClassNameVer == NULL) { \
|
|
RIPMSG0(RIP_WARNING, "Couldn't resolve class name"); \
|
|
MSGERROR(); \
|
|
}
|
|
|
|
#define BEGINCALLVOID() \
|
|
{
|
|
|
|
#define ERRORTRAP(error) \
|
|
goto cleanup; \
|
|
} \
|
|
goto errorexit; \
|
|
errorexit: \
|
|
retval = (ULONG_PTR)error; \
|
|
cleanup:
|
|
|
|
#define ERRORTRAPVOID() \
|
|
goto errorexit; \
|
|
errorexit:
|
|
|
|
#define ENDCALL(type) \
|
|
return (type)retval; \
|
|
}
|
|
|
|
#define ENDCALLVOID() \
|
|
return; \
|
|
}
|
|
|
|
#define MSGERROR() goto errorexit
|
|
|
|
#define MSGERRORCODE(code) { \
|
|
RIPERR0(code, RIP_WARNING, "Unspecified error"); \
|
|
goto errorexit; }
|
|
|
|
#define MSGNTERRORCODE(code) { \
|
|
RIPNTERR0(code, RIP_WARNING, "Unspecified error"); \
|
|
goto errorexit; }
|
|
|
|
#define MESSAGECALL(api) \
|
|
LRESULT api( \
|
|
HWND hwnd, \
|
|
UINT msg, \
|
|
WPARAM wParam, \
|
|
LPARAM lParam, \
|
|
ULONG_PTR xParam, \
|
|
DWORD xpfnProc, \
|
|
BOOL bAnsi)
|
|
|
|
/*
|
|
* Copy optional string/Ordinal where if hiword is FF/FFFF then new WORD is a
|
|
* resource oridinal ID
|
|
* Sources is Unicode
|
|
*/
|
|
#define OrdinalLPSTR(src) (MAKELONG(0xFFFF,((*(DWORD UNALIGNED *)src) >> 8)))
|
|
#define OrdinalLPSTRW(src) (MAKELONG(0xFFFF,((*(DWORD UNALIGNED *)src) >> 8)))
|
|
#define OrdinalLPWSTR(src) (*(DWORD UNALIGNED *)src)
|
|
#define OrdinalLPWSTRA(src) (*(DWORD UNALIGNED *)((PBYTE)src + 1))
|
|
|
|
/*
|
|
* Ansi->Unicode macros
|
|
*/
|
|
#define COPYLPSTRW(pinstr, psz) \
|
|
if (!RtlCaptureAnsiString((pinstr), (LPCSTR)(psz), TRUE)) \
|
|
MSGERROR();
|
|
|
|
#define COPYLPSTRIDW(pinstr, psz) \
|
|
if (IS_PTR(psz)) { \
|
|
if (!RtlCaptureAnsiString((pinstr), (LPCSTR)(psz), TRUE)) \
|
|
MSGERROR(); \
|
|
} \
|
|
else { \
|
|
(pinstr)->fAllocated = FALSE; \
|
|
(pinstr)->pstr = &(pinstr)->strCapture; \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = 0; \
|
|
(pinstr)->strCapture.Buffer = (LPWSTR)(psz); \
|
|
}
|
|
|
|
#define COPYLPSTRIDOPTW COPYLPSTRIDW
|
|
#define COPYLPSTROPTW COPYLPSTRW
|
|
|
|
#define LARGECOPYLPSTRW(pinstr, psz) \
|
|
if(!RtlCaptureLargeAnsiString((pinstr), (LPCSTR)(psz), TRUE)) \
|
|
MSGERROR();
|
|
|
|
#define LARGECOPYLPSTROPTW LARGECOPYLPSTRW
|
|
|
|
#define LARGECOPYLPSTRORDINALOPTW(pinstr, psz) \
|
|
(pinstr)->pstr = &(pinstr)->strCapture; \
|
|
(pinstr)->fAllocated = FALSE; \
|
|
if (psz) { \
|
|
if (*(LPBYTE)(psz) != 0xff) { \
|
|
if (!RtlCaptureLargeAnsiString((pinstr), (LPCSTR)(psz), TRUE)) \
|
|
MSGERROR(); \
|
|
} else { \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = sizeof(DWORD); \
|
|
dwOrdinal = OrdinalLPSTRW(psz); \
|
|
(pinstr)->strCapture.Buffer = (LPWSTR)&dwOrdinal; \
|
|
} \
|
|
} else { \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = 0; \
|
|
(pinstr)->strCapture.Buffer = NULL; \
|
|
}
|
|
|
|
#define FIRSTCOPYLPSTRW(pinstr, psz) \
|
|
if (!RtlCaptureAnsiString((pinstr), (LPCSTR)(psz), FALSE)) \
|
|
MSGERROR();
|
|
|
|
#define FIRSTCOPYLPSTRIDW(pinstr, psz) \
|
|
if (IS_PTR(psz)) { \
|
|
if (!RtlCaptureAnsiString((pinstr), (LPCSTR)(psz), FALSE)) \
|
|
MSGERROR(); \
|
|
} else { \
|
|
(pinstr)->fAllocated = FALSE; \
|
|
(pinstr)->pstr = &(pinstr)->strCapture; \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = 0; \
|
|
(pinstr)->strCapture.Buffer = (LPWSTR)(psz); \
|
|
}
|
|
|
|
#define FIRSTCOPYLPSTRIDOPTW FIRSTCOPYLPSTRIDW
|
|
#define FIRSTCOPYLPSTROPTW FIRSTCOPYLPSTRW
|
|
|
|
#define FIRSTLARGECOPYLPSTRW(pinstr, psz) \
|
|
if (!RtlCaptureLargeAnsiString((pinstr), (LPCSTR)(psz), FALSE)) \
|
|
MSGERROR();
|
|
|
|
#define FIRSTLARGECOPYLPSTROPTW FIRSTLARGECOPYLPSTRW
|
|
|
|
#define FIRSTLARGECOPYLPSTRORDINALOPTW(pinstr, psz) \
|
|
(pinstr)->pstr = &(pinstr)->strCapture; \
|
|
(pinstr)->fAllocated = FALSE; \
|
|
if (psz) { \
|
|
if (*(LPBYTE)(psz) != 0xff) { \
|
|
if (!RtlCaptureLargeAnsiString((pinstr), (LPCSTR)(psz), FALSE)) \
|
|
MSGERROR(); \
|
|
} else { \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = sizeof(DWORD); \
|
|
dwOrdinal = OrdinalLPSTRW(psz); \
|
|
(pinstr)->strCapture.Buffer = (LPWSTR)&dwOrdinal; \
|
|
} \
|
|
} else { \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = 0; \
|
|
(pinstr)->strCapture.Buffer = NULL; \
|
|
}
|
|
|
|
#define CLEANUPLPSTRW(instr) \
|
|
if (instr.fAllocated) \
|
|
UserLocalFree(KPVOID_TO_PVOID(instr.strCapture.Buffer));
|
|
|
|
/*
|
|
* Unicode->Unicode macros
|
|
*/
|
|
#define COPYLPWSTR(pinstr, psz) \
|
|
(pinstr)->fAllocated = FALSE; \
|
|
(pinstr)->pstr = &(pinstr)->strCapture; \
|
|
RtlInitUnicodeString(&(pinstr)->strCapture, (psz));
|
|
|
|
#define COPYLPWSTRID(pinstr, psz) \
|
|
(pinstr)->fAllocated = FALSE; \
|
|
(pinstr)->pstr = &(pinstr)->strCapture; \
|
|
if (IS_PTR(psz)) \
|
|
RtlInitUnicodeString(&(pinstr)->strCapture, (psz)); \
|
|
else { \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = 0; \
|
|
(pinstr)->strCapture.Buffer = (LPWSTR)(psz); \
|
|
}
|
|
|
|
#define COPYLPWSTRIDOPT COPYLPWSTRID
|
|
#define COPYLPWSTROPT COPYLPWSTR
|
|
|
|
#define LARGECOPYLPWSTR(pinstr, psz) \
|
|
(pinstr)->fAllocated = FALSE; \
|
|
(pinstr)->pstr = &(pinstr)->strCapture; \
|
|
RtlInitLargeUnicodeString(&(pinstr)->strCapture, (psz), (UINT)-1);
|
|
|
|
#define LARGECOPYLPWSTROPT LARGECOPYLPWSTR
|
|
|
|
#define LARGECOPYLPWSTRORDINALOPT(pinstr, psz) \
|
|
(pinstr)->fAllocated = FALSE; \
|
|
(pinstr)->pstr = &(pinstr)->strCapture; \
|
|
if (psz) { \
|
|
if (*(LPWORD)(psz) != 0xffff) \
|
|
RtlInitLargeUnicodeString(&(pinstr)->strCapture, (psz), (UINT)-1); \
|
|
else { \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = sizeof(DWORD); \
|
|
dwOrdinal = OrdinalLPWSTR(psz); \
|
|
(pinstr)->strCapture.Buffer = (LPWSTR)&dwOrdinal; \
|
|
} \
|
|
} else { \
|
|
(pinstr)->strCapture.Length = \
|
|
(pinstr)->strCapture.MaximumLength = 0; \
|
|
(pinstr)->strCapture.Buffer = NULL; \
|
|
}
|
|
|
|
#define FIRSTCOPYLPWSTR COPYLPWSTR
|
|
#define FIRSTCOPYLPWSTRID COPYLPWSTRID
|
|
#define FIRSTCOPYLPWSTRIDOPT COPYLPWSTRIDOPT
|
|
#define FIRSTCOPYLPWSTROPT COPYLPWSTROPT
|
|
#define FIRSTLARGECOPYLPWSTR LARGECOPYLPWSTR
|
|
#define FIRSTLARGECOPYLPWSTROPT LARGECOPYLPWSTROPT
|
|
#define FIRSTLARGECOPYLPWSTRORDINALOPT LARGECOPYLPWSTRORDINALOPT
|
|
|
|
#define CLEANUPLPWSTR(instr)
|
|
|
|
/*
|
|
* Type-neutral macros
|
|
*/
|
|
#ifdef UNICODE
|
|
|
|
#define COPYLPTSTR COPYLPWSTR
|
|
#define COPYLPTSTRID COPYLPWSTRID
|
|
#define COPYLPTSTRIDOPT COPYLPWSTRIDOPT
|
|
#define COPYLPTSTROPT COPYLPWSTROPT
|
|
#define FIRSTCOPYLPTSTR COPYLPWSTR
|
|
#define FIRSTCOPYLPTSTRID COPYLPWSTRID
|
|
#define FIRSTCOPYLPTSTRIDOPT COPYLPWSTRIDOPT
|
|
#define LARGECOPYLPTSTR LARGECOPYLPWSTR
|
|
#define LARGECOPYLPTSTROPT LARGECOPYLPWSTROPT
|
|
#define FIRSTLARGECOPYLPTSTROPT LARGECOPYLPWSTROPT
|
|
#define CLEANUPLPTSTR CLEANUPLPWSTR
|
|
|
|
#else
|
|
|
|
#define COPYLPTSTR COPYLPSTRW
|
|
#define COPYLPTSTRID COPYLPSTRIDW
|
|
#define COPYLPTSTRIDOPT COPYLPSTRIDOPTW
|
|
#define COPYLPTSTROPT COPYLPSTROPTW
|
|
#define FIRSTCOPYLPTSTR COPYLPSTRW
|
|
#define FIRSTCOPYLPTSTRID COPYLPSTRIDW
|
|
#define FIRSTCOPYLPTSTRIDOPT COPYLPSTRIDOPTW
|
|
#define LARGECOPYLPTSTR LARGECOPYLPSTRW
|
|
#define LARGECOPYLPTSTROPT LARGECOPYLPSTROPTW
|
|
#define FIRSTLARGECOPYLPTSTROPT LARGECOPYLPSTROPTW
|
|
#define CLEANUPLPTSTR CLEANUPLPSTRW
|
|
|
|
#endif
|