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.
 
 
 
 
 
 

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