124 lines
3.2 KiB
C++
124 lines
3.2 KiB
C++
|
#define DBG 1
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <memory.h>
|
||
|
#include <malloc.h>
|
||
|
#include <stdlib.h>
|
||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||
|
#define WIN32_LEAN_AND_MEAN
|
||
|
#endif
|
||
|
#include <windows.h>
|
||
|
#include <rpc.h>
|
||
|
#include <midles.h>
|
||
|
#include "..\smgr.h"
|
||
|
|
||
|
#define RPC_CHAR WCHAR
|
||
|
|
||
|
#define CHECK_STATUS(status, string) if (status) { \
|
||
|
printf("%s failed - %d (%08x)\n", (string), (status), (status)); \
|
||
|
exit(1); \
|
||
|
} else printf("%s okay\n", (string));
|
||
|
|
||
|
PVOID SystemHeap = NULL;
|
||
|
|
||
|
extern "C" {
|
||
|
|
||
|
void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t bytes)
|
||
|
{
|
||
|
return RtlAllocateHeap(SystemHeap, 0, bytes);
|
||
|
}
|
||
|
|
||
|
void __RPC_USER MIDL_user_free(void __RPC_FAR * p)
|
||
|
{
|
||
|
RtlFreeHeap(SystemHeap, 0, p);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
int __cdecl main(int argc, char *argv[])
|
||
|
{
|
||
|
RPC_STATUS status;
|
||
|
unsigned char __RPC_FAR *stringBinding;
|
||
|
handle_t binding;
|
||
|
SyncManagerCommands CurrentCommand;
|
||
|
UString *param = NULL;
|
||
|
int ClientOrServer;
|
||
|
BOOL bResult;
|
||
|
STARTUPINFO startInfo;
|
||
|
PROCESS_INFORMATION processInfo;
|
||
|
RPC_CHAR CmdLine[400];
|
||
|
|
||
|
memset(&startInfo, 0, sizeof(startInfo));
|
||
|
startInfo.cb = sizeof(startInfo);
|
||
|
|
||
|
SystemHeap = GetProcessHeap();
|
||
|
|
||
|
if (argc != 3)
|
||
|
{
|
||
|
printf("Usage:\n\tsyncclnt s|c syncmgr_server\n");
|
||
|
return 2;
|
||
|
}
|
||
|
|
||
|
if (*argv[1] == 'c' || *argv[1] == 'C')
|
||
|
ClientOrServer = 1;
|
||
|
else
|
||
|
ClientOrServer = 0;
|
||
|
|
||
|
status = RpcStringBindingComposeA(0,
|
||
|
(unsigned char *)"ncacn_ip_tcp",
|
||
|
(unsigned char *)argv[2],
|
||
|
(unsigned char *)"",
|
||
|
0,
|
||
|
&stringBinding);
|
||
|
|
||
|
CHECK_STATUS(status, "RpcStringBindingCompose");
|
||
|
|
||
|
status = RpcBindingFromStringBindingA(stringBinding, &binding);
|
||
|
CHECK_STATUS(status, "RpcBindingFromStringBinding");
|
||
|
|
||
|
RpcStringFreeA(&stringBinding);
|
||
|
|
||
|
DeleteFile(L"c:\\perf.log");
|
||
|
|
||
|
RpcMgmtSetComTimeout(binding, RPC_C_BINDING_INFINITE_TIMEOUT);
|
||
|
|
||
|
// start the loop
|
||
|
do
|
||
|
{
|
||
|
GetCommand(binding, ClientOrServer, &CurrentCommand, ¶m);
|
||
|
switch (CurrentCommand)
|
||
|
{
|
||
|
case smcNOP:
|
||
|
continue;
|
||
|
|
||
|
case smcExec:
|
||
|
wcscpy(CmdLine, param->pString);
|
||
|
CmdLine[param->nlength] = 0;
|
||
|
MIDL_user_free(param);
|
||
|
param = NULL;
|
||
|
bResult = CreateProcess(NULL, CmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL,
|
||
|
NULL, &startInfo, &processInfo);
|
||
|
if (bResult)
|
||
|
{
|
||
|
CloseHandle(processInfo.hThread);
|
||
|
WaitForSingleObject(processInfo.hProcess, INFINITE);
|
||
|
CloseHandle(processInfo.hProcess);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("CreateProcess failed: %S, %d\n", CmdLine, GetLastError());
|
||
|
return 2;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
while(CurrentCommand != smcExit);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|