//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: midl.cxx // // Contents: MIDL memory allocation tests // // Functions: // // History: 29-Sep-93 CarlH Created // //-------------------------------------------------------------------------- #include "memtest.hxx" #pragma hdrstop #include #include "test.h" static const char g_szMIDLClient[] = "midl"; static const char g_szMIDLServer[] = "server"; static const WCHAR g_wszMIDLSignal[] = L"testsignal"; static const WCHAR g_wszStopSignal[] = L"stopsignal"; static const DWORD g_ccallMin = 1; static const DWORD g_ccallMax = 1; static CSignal g_sigStop(g_wszStopSignal); BYTE g_ab0[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; BYTE g_ab1[] = {0x00, 0xFF}; BYTE g_ab2[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; BYTE g_ab3[] = {0x69}; SCountedBytes g_acbIn[] = { {(sizeof(g_ab0) / sizeof(g_ab0[0])), g_ab0}, {(sizeof(g_ab1) / sizeof(g_ab1[0])), g_ab1}, {(sizeof(g_ab2) / sizeof(g_ab2[0])), g_ab2}, {(sizeof(g_ab3) / sizeof(g_ab3[0])), g_ab3} }; SCountedCountedBytes g_ccbIn = { sizeof(g_acbIn) / sizeof(g_acbIn[0]), g_acbIn }; DWORD StartServer(WCHAR *pwszServer, DWORD grfOptions); DWORD ConnectServer(void); DWORD DisconnectServer(void); BOOL CompareBytes(SCountedCountedBytes *pccbA, SCountedCountedBytes *pccbB); BOOL FreeBytes(SCountedCountedBytes *pccb); BOOL TestMIDLClient(WCHAR *pwszServer, DWORD grfOptions) { CSignal sig(g_wszMIDLSignal); SCountedCountedBytes ccbOut = {0, NULL}; RPC_STATUS stat; BOOL fPassed; PrintHeader(g_szMIDLClient); PrintTrace(g_szMIDLClient, "starting server\n"); stat = StartServer(pwszServer, grfOptions); if (!(fPassed = (stat == 0))) goto done; PrintTrace(g_szMIDLClient, "waiting for server\n"); stat = sig.Wait(grfOptions & MIDL_DEBUG ? INFINITE : 10000); if (!(fPassed = (stat == 0))) goto done; PrintTrace(g_szMIDLClient, "connecting to server\n"); stat = ConnectServer(); if (!(fPassed = (stat == 0))) goto done; PrintTrace(g_szMIDLClient, "copying bytes\n"); fPassed = _CopyBytes(&g_ccbIn, &ccbOut); if (!fPassed) goto done; PrintTrace(g_szMIDLClient, "stopping server\n"); fPassed = _StopServer(); if (!fPassed) goto done; PrintTrace(g_szMIDLClient, "comparing bytes\n"); fPassed = CompareBytes(&g_ccbIn, &ccbOut); if (!fPassed) goto done; PrintTrace(g_szMIDLClient, "freeing bytes\n"); fPassed = FreeBytes(&ccbOut); if (!fPassed) goto done; PrintTrace(g_szMIDLClient, "disconnecting from server\n"); stat = DisconnectServer(); if (!(fPassed = (stat == 0))) goto done; done: PrintResult(g_szMIDLClient, fPassed); return (fPassed); } BOOL TestMIDLServer(DWORD grfOptions) { CSignal sig(g_wszMIDLSignal); RPC_STATUS stat; BOOL fPassed; PrintHeader(g_szMIDLServer); PrintTrace(g_szMIDLServer, "registering protocol\n"); stat = RpcServerUseAllProtseqsIf(g_ccallMax, Test_ServerIfHandle, NULL); if (!(fPassed = (stat == 0))) goto done; PrintTrace(g_szMIDLServer, "registering interface\n"); stat = RpcServerRegisterIf(Test_ServerIfHandle, NULL, NULL); if (!(fPassed = (stat == 0))) goto done; #ifdef NO_OLE_RPC PrintTrace(g_szMIDLServer, "listening\n"); stat = RpcServerListen( g_ccallMin, g_ccallMax, TRUE); if (!(fPassed = ((stat == 0) || (stat == RPC_S_ALREADY_LISTENING)))) goto done; #endif // NO_OLE_RPC PrintTrace(g_szMIDLServer, "signaling client\n"); stat = sig.Signal(); if (!(fPassed = (stat == 0))) goto done; PrintTrace(g_szMIDLServer, "waiting...\n"); #ifdef NO_OLE_RPC stat = RpcMgmtWaitServerListen(); if (!(fPassed = ((stat == 0) || (stat == RPC_S_ALREADY_LISTENING)))) goto done; #else g_sigStop.Wait(); #endif // NO_OLE_RPC done: PrintResult(g_szMIDLServer, fPassed); return (fPassed); } boolean CopyBytes(SCountedCountedBytes *pccbIn, SCountedCountedBytes *pccbOut) { HRESULT hr; BOOL fPassed; long ccb = pccbIn->ccb; long icb; PrintTrace(g_szMIDLServer, "copying bytes\n"); pccbOut->ccb = ccb; pccbOut->pcb = (SCountedBytes *)CoTaskMemAlloc(ccb * sizeof(*pccbOut->pcb)); if (!(fPassed = (pccbOut != 0))) goto done; for (icb = 0; icb < ccb; icb++) { long cb = pccbIn->pcb[icb].cb; pccbOut->pcb[icb].cb = cb; pccbOut->pcb[icb].pb = (byte *)CoTaskMemAlloc(cb); if (!(fPassed = (pccbOut->pcb[icb].pb != 0))) goto done; memcpy(pccbOut->pcb[icb].pb, pccbIn->pcb[icb].pb, cb); } done: return (fPassed); } BOOL CompareBytes(SCountedCountedBytes *pccbA, SCountedCountedBytes *pccbB) { BOOL fPassed; long icb; if (!(fPassed = (pccbA->ccb == pccbB->ccb))) goto done; for (icb = 0; icb < pccbA->ccb; icb++) { if (!(fPassed = (pccbA->pcb[icb].cb == pccbB->pcb[icb].cb))) goto done; int cmp = memcmp( pccbA->pcb[icb].pb, pccbB->pcb[icb].pb, pccbB->pcb[icb].cb); if (!(fPassed = (cmp == 0))) goto done; } done: return (fPassed); } BOOL FreeBytes(SCountedCountedBytes *pccb) { BOOL fPassed = TRUE; for (long icb = 0; icb < pccb->ccb; icb++) { CoTaskMemFree(pccb->pcb[icb].pb); } CoTaskMemFree(pccb->pcb); done: return (fPassed); } boolean StopServer(void) { BOOL fPassed; PrintTrace(g_szMIDLServer, "stopping\n"); #ifdef NO_OLE_RPC fPassed = (RpcMgmtStopServerListening(NULL) == 0); #else g_sigStop.Signal(); fPassed = TRUE; #endif // NO_OLE_RPC return (fPassed); } DWORD StartServer(WCHAR *pwszServer, DWORD grfOptions) { WCHAR wszCommandLine[MAX_PATH + 1]; ULONG cwchDebug; BOOL fOK; DWORD stat; if (grfOptions & MIDL_DEBUG) { cwchDebug = wsprintf( wszCommandLine, L"ntsd %ws %ws ", (grfOptions & MIDL_AUTOGO ? L"-g" : L""), (grfOptions & MIDL_AUTOEND ? L"-G" : L"")); } else { cwchDebug = 0; } wsprintf( wszCommandLine + cwchDebug, L"%ws midlserver %cc %cs %cv", pwszServer, (grfOptions & GLOBAL_CLEANUP ? '+' : '-'), (grfOptions & GLOBAL_STATUS ? '+' : '-'), (grfOptions & GLOBAL_VERBOSE ? '+' : '-')); PrintTrace(g_szMIDLClient, "server command line: %ws\n", wszCommandLine); STARTUPINFO sui; PROCESS_INFORMATION pi; sui.cb = sizeof(sui); sui.lpReserved = 0; sui.lpDesktop = 0; sui.lpTitle = wszCommandLine; sui.dwFlags = 0; sui.cbReserved2 = 0; sui.lpReserved2 = 0; fOK = CreateProcess( NULL, wszCommandLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &sui, &pi); if (fOK) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); stat = 0; } else { stat = GetLastError(); } return (stat); } DWORD ConnectServer(void) { RPC_STATUS stat; WCHAR *pwszBinding; stat = RpcStringBindingCompose( NULL, PWSZ_PROTOCOL, NULL, PWSZ_ENDPOINT, NULL, &pwszBinding); if (stat == 0) { stat = RpcBindingFromStringBinding(pwszBinding, &g_hbindTest); RpcStringFree(&pwszBinding); } return (stat); } DWORD DisconnectServer(void) { RPC_STATUS stat; stat = RpcBindingFree(&g_hbindTest); return (stat); }