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.
127 lines
3.5 KiB
127 lines
3.5 KiB
/****************************** Module Header ******************************\
|
|
* Module Name: crecv.c
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* Client side receiving stubs
|
|
*
|
|
* 07-06-91 ScottLu Created.
|
|
\***************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#include <dbt.h>
|
|
|
|
#define CALLBACKPROC 1
|
|
#define CLIENTSIDE 1
|
|
|
|
#include "callback.h"
|
|
|
|
/*
|
|
* Receive setup and control macros
|
|
*/
|
|
#define RECVSIDE 1
|
|
|
|
#define RECVCALL(lower, upper) \
|
|
DWORD __ ## lower (upper *pmsg)
|
|
|
|
#define BEGINRECV(err, p, cb) \
|
|
CALLBACKSTATUS CallbackStatus; \
|
|
NTSTATUS Status = STATUS_SUCCESS; \
|
|
ULONG_PTR retval = (ULONG_PTR)err; \
|
|
CallbackStatus.cbOutput = cb; \
|
|
CallbackStatus.pOutput = p;
|
|
|
|
#define FIXUPPOINTERS() \
|
|
if (pmsg->CaptureBuf.cCapturedPointers && \
|
|
pmsg->CaptureBuf.pvVirtualAddress == NULL) \
|
|
FixupCallbackPointers(&pmsg->CaptureBuf);
|
|
|
|
#if defined(_X86_) && !defined(BUILD_WOW6432)
|
|
|
|
NTSTATUS
|
|
FASTCALL
|
|
XyCallbackReturn(
|
|
IN PVOID Buffer,
|
|
IN ULONG Length,
|
|
IN NTSTATUS Status
|
|
);
|
|
|
|
#define ENDRECV() \
|
|
goto errorexit; \
|
|
errorexit: \
|
|
CallbackStatus.retval = retval; \
|
|
return XyCallbackReturn(&CallbackStatus, sizeof(CallbackStatus), \
|
|
Status)
|
|
|
|
#else
|
|
|
|
#define ENDRECV() \
|
|
goto errorexit; \
|
|
errorexit: \
|
|
CallbackStatus.retval = retval; \
|
|
return NtCallbackReturn(&CallbackStatus, sizeof(CallbackStatus), \
|
|
Status)
|
|
|
|
#endif
|
|
|
|
#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; }
|
|
|
|
/*
|
|
* Callback parameter fixup macros
|
|
*/
|
|
//#undef CALLPROC
|
|
//#define CALLPROC(p) FNID(p)
|
|
|
|
#define CALLDATA(x) (pmsg->x)
|
|
#define PCALLDATA(x) (&(pmsg->x))
|
|
#define PCALLDATAOPT(x) (pmsg->p ## x ? (PVOID)&(pmsg->x) : NULL)
|
|
#define FIRSTFIXUP(x) (pmsg->x)
|
|
#define FIXUPOPT(x) (pmsg->x)
|
|
#define FIRSTFIXUPOPT(x) FIXUPOPT(x)
|
|
#define FIXUP(x) (pmsg->x)
|
|
#define FIXUPID(x) (pmsg->x)
|
|
#define FIXUPIDOPT(x) (pmsg->x)
|
|
#define FIXUPSTRING(x) (pmsg->x.Buffer)
|
|
#define FIXUPSTRINGID(x) (pmsg->x.Buffer)
|
|
#define FIXUPSTRINGIDOPT(x) (pmsg->x.Buffer)
|
|
|
|
/***************************************************************************\
|
|
* FixupCallbackPointers
|
|
*
|
|
* Fixes up captured callback pointers.
|
|
*
|
|
* 03-13-95 JimA Created.
|
|
\***************************************************************************/
|
|
|
|
VOID FixupCallbackPointers(
|
|
PCAPTUREBUF pcb)
|
|
{
|
|
DWORD i;
|
|
LPDWORD lpdwOffset;
|
|
PVOID *ppFixup;
|
|
|
|
lpdwOffset = (LPDWORD)((PBYTE)pcb + pcb->offPointers);
|
|
for (i = 0; i < pcb->cCapturedPointers; ++i, ++lpdwOffset) {
|
|
ppFixup = (PVOID *)((PBYTE)pcb + *lpdwOffset);
|
|
*ppFixup = (PBYTE)pcb + (LONG_PTR)*ppFixup;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************\
|
|
*
|
|
* include the stub definition file
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#include "ntcb.h"
|