mirror of https://github.com/lianthony/NT4.0
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.
219 lines
4.9 KiB
219 lines
4.9 KiB
#include <bvtcmn.h>
|
|
|
|
extern void __RPC_STUB __RPC_FAR Server_TestCall(PRPC_MESSAGE);
|
|
|
|
RPC_DISPATCH_FUNCTION ServerDispatchFunctions[] =
|
|
{
|
|
Server_TestCall
|
|
};
|
|
|
|
RPC_DISPATCH_TABLE ServerDispatchTable =
|
|
{
|
|
1, ServerDispatchFunctions
|
|
};
|
|
|
|
RPC_SERVER_INTERFACE BVTServerInterfaceInfo =
|
|
{
|
|
sizeof(RPC_SERVER_INTERFACE),
|
|
{{9,8,8,{0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7}},
|
|
{1,1}},
|
|
{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},
|
|
{2,0}},
|
|
&ServerDispatchTable,
|
|
0
|
|
};
|
|
|
|
int Stopped = 0;
|
|
|
|
void __RPC_STUB __RPC_FAR
|
|
Server_TestCall(PRPC_MESSAGE pMessage)
|
|
{
|
|
MSG msg;
|
|
RPC_STATUS Status;
|
|
LONG i;
|
|
long param;
|
|
|
|
EQUAL(pMessage->Buffer != 0, 1);
|
|
EQUAL(pMessage->BufferLength >= 4, 1);
|
|
EQUAL( *(unsigned long *)pMessage->Buffer, pMessage->BufferLength);
|
|
|
|
EQUAL(pMessage->ProcNum, 0);
|
|
|
|
param = *((unsigned long *)pMessage->Buffer+1);
|
|
|
|
if (param & BVT_ASYNC)
|
|
{
|
|
param -= BVT_ASYNC;
|
|
Print("Async Call.\n", param);
|
|
EQUAL(InSendMessage(), FALSE);
|
|
}
|
|
else
|
|
if (param & BVT_INPUT_SYNC)
|
|
{
|
|
param -= BVT_INPUT_SYNC;
|
|
Print("Input sync call\n", param);
|
|
EQUAL(InSendMessage(), TRUE);
|
|
}
|
|
else
|
|
{
|
|
Print("Standard call\n");
|
|
EQUAL(InSendMessage(), FALSE);
|
|
}
|
|
|
|
if (param & BVT_RAISE_EXCEPTION)
|
|
{
|
|
param -= BVT_RAISE_EXCEPTION;
|
|
if (param & BVT_SLEEP)
|
|
{
|
|
Print("Sleeping and raising an exception\n");
|
|
param -= BVT_SLEEP;
|
|
BvtSleep(param);
|
|
}
|
|
else
|
|
Print("Exception case\n");
|
|
RpcRaiseException(BVT_EXCEPTION);
|
|
}
|
|
|
|
if (param & BVT_SLEEP)
|
|
{
|
|
param -= BVT_SLEEP;
|
|
Print("Sleeping for %d mseconds\n", param);
|
|
BvtSleep(param);
|
|
}
|
|
|
|
if (param & BVT_PAUSE_THREAD)
|
|
{
|
|
param -= BVT_PAUSE_THREAD;
|
|
|
|
Print("Server paused and waiting\n");
|
|
|
|
Status =
|
|
I_RpcServerThreadPauseListening();
|
|
EQUAL(Status, RPC_S_OK);
|
|
|
|
Status =
|
|
I_RpcServerThreadPauseListening();
|
|
EQUAL(Status, RPC_S_NOT_LISTENING);
|
|
|
|
for(i = 0; i < 3000; i += 50)
|
|
{
|
|
if (PeekMessage(&msg, 0, 0, 0, TRUE))
|
|
{
|
|
Print("(message)\n");
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
else
|
|
Sleep(50);
|
|
}
|
|
|
|
Status =
|
|
I_RpcServerThreadContinueListening();
|
|
EQUAL(Status, RPC_S_OK);
|
|
|
|
Status =
|
|
I_RpcServerThreadContinueListening();
|
|
EQUAL(Status, RPC_S_ALREADY_LISTENING);
|
|
|
|
Print("Server listening again\n");
|
|
}
|
|
|
|
if (param == 1234)
|
|
{
|
|
Print("Received stop message\n");
|
|
|
|
Status =
|
|
RpcMgmtStopServerListening(0);
|
|
Stopped = 1;
|
|
EQUAL(Status, RPC_S_OK);
|
|
}
|
|
|
|
param += 666;
|
|
|
|
pMessage->BufferLength = 8;
|
|
|
|
Status = I_RpcGetBuffer(pMessage);
|
|
|
|
if (!EQUAL(Status, RPC_S_OK))
|
|
{
|
|
RpcRaiseException(BVT_SERVER_FAILURE);
|
|
}
|
|
|
|
*((unsigned long *)pMessage->Buffer) = pMessage->BufferLength;
|
|
*((unsigned long *)pMessage->Buffer+1) = param;
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
RPC_STATUS Status;
|
|
RPC_BINDING_VECTOR *BindingVector = 0;
|
|
UCHAR *StringBinding;
|
|
|
|
ParseArgs(argc, argv);
|
|
|
|
Status =
|
|
RpcNetworkIsProtseqValid("mswmsg");
|
|
EQUAL(Status, ( "RpcNetworkIsProtseqValid", RPC_S_OK) );
|
|
|
|
Status =
|
|
RpcNetworkIsProtseqValidW(L"mswmsg");
|
|
EQUAL(Status, ( "RpcNetworkIsProtseqValidW", RPC_S_OK) );
|
|
|
|
Status =
|
|
RpcServerUseProtseqEp(Protseq, 10, ServerEndpoint, 0);
|
|
EQUAL(Status, ( "RpcServerUseProtseqEp", RPC_S_OK) );
|
|
|
|
Status =
|
|
RpcServerInqBindings(&BindingVector);
|
|
EQUAL(Status, ( "RpcServerInqBindings", RPC_S_OK) );
|
|
|
|
EQUAL(BindingVector->Count, 1);
|
|
|
|
Status =
|
|
RpcBindingToStringBinding(BindingVector->BindingH[0], &StringBinding);
|
|
EQUAL(Status, ( "RpcBindingToStringBinding", RPC_S_OK) );
|
|
|
|
Print("MsWmsg BVT Server listening to: %s\n", StringBinding);
|
|
|
|
Status =
|
|
RpcStringFree(&StringBinding);
|
|
EQUAL(Status, RPC_S_OK);
|
|
|
|
Status =
|
|
RpcBindingVectorFree(&BindingVector);
|
|
EQUAL(Status, RPC_S_OK);
|
|
|
|
Status =
|
|
RpcServerRegisterIf(&BVTServerInterfaceInfo, 0, 0);
|
|
EQUAL(Status, ("RpcServerRegisterIf", RPC_S_OK) );
|
|
|
|
Status =
|
|
RpcServerListen(10, 10, TRUE);
|
|
EQUAL(Status, ("RpcServerListen", RPC_S_OK) );
|
|
|
|
while(!Stopped)
|
|
{
|
|
MSG msg;
|
|
if (GetMessage(&msg, 0, 0, 0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
else
|
|
{
|
|
Print("Main server loop: GetMessage failed: %d\n", GetLastError());
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if (ErrorCount)
|
|
Print("Failures: %d\n", ErrorCount);
|
|
else
|
|
Print("Passed\n");
|
|
|
|
return 0;
|
|
}
|
|
|