rpc_K01.diff (a real rpc test & misc. fixes)

Greg Turner gmturner007 at ameritech.net
Sun Jan 5 13:44:42 CST 2003


Administrivia: From now on, I'm naming these rpc-series
patches using the more compact notation rpc_X##.diff.
There is no rpc_K00.diff; I botched the numbers so this
series gets to start at 01; subsequent series will continue
the tradition of zero-indexing.  Note that, if rpc_Xnn-r1 is
ever labelled, it is a replacement for rpc_Xnn.  Within a
given letter designation, the idea is that you can run the latest
"release" of a given numerical patch-level against CVS.  So, if I
made rpc_X00.diff, rpc_X01.diff, and rpc_X02.diff, the expectation
would be that they be applied to CVS in that order.  If some update
to CVS broke rpc_X01.diff, I might release rpc_X01-r1.diff, which
would "fix" the old rpc_X01 patchlevel.  This scheme hasn't changed
since the old naming scheme, but I thought I'd just remind others
(myself?) what the point of these fancy names is supposed to be.

I set out to build a test and encountered some bugs and missing
functionality along the way, which are fixed with this patch.

I used the "/prefix" option to MIDL, however, since widl doesn't
support this, I used the MIDL-generated .h file, for now.


License: X11 / Bugroff (http://tunes.org/legalese/bugroff.html)

Changelog:

* ./dlls/rpcrt4: ndr_midl.c, rpc_server.c, rpcrt4_main.c
  ./dlls/rpcrt4/tests: Makefile.in, rpc.c, gen.bat (new),
      stringinput.acf (new), stringinput.h (new),
      stringinput.idl (new), stringinput_c.c (new),
      stringinput_s.c (new)
  ./include: rpcndr.h
  ./programs/rpcss: rpcss.h:
  Greg Turner <gmturner007 at ameritech.net>
- add an actual cross-process RPC test, using MIDL-generated
  headers with some minor modifications for missing functionality
- increase the default RPCSS timeout
- add the NdrFc{Short,Long} macros
- fix some handling of the End pointers for Ndr marshalling
- fix some traces with missing \n's.

--
diff -ur -x CVS -x 'bigdif*' -x autom4te.cache ../wine.test/dlls/rpcrt4/ndr_midl.c ./dlls/rpcrt4/ndr_midl.c
--- ../wine.test/dlls/rpcrt4/ndr_midl.c	2002-12-05 15:05:46.000000000 -0600
+++ ./dlls/rpcrt4/ndr_midl.c	2003-01-03 21:25:50.000000000 -0600
@@ -214,6 +214,7 @@
   pStubMsg->RpcMsg = pRpcMsg;
   pStubMsg->Buffer = pRpcMsg->Buffer;
   pStubMsg->BufferLength = pRpcMsg->BufferLength;
+  pStubMsg->BufferEnd = pStubMsg->Buffer + pStubMsg->BufferLength;
 
   /* FIXME: determine the proper return value */
   return NULL;
@@ -236,8 +237,9 @@
     return NULL;
 
   stubmsg->BufferLength = stubmsg->RpcMsg->BufferLength;
-  stubmsg->BufferEnd = stubmsg->BufferStart = 0;
-  return (stubmsg->Buffer = (unsigned char *)stubmsg->RpcMsg->Buffer);
+  stubmsg->Buffer = stubmsg->BufferStart = (unsigned char *)stubmsg->RpcMsg->Buffer;
+  stubmsg->BufferEnd = stubmsg->Buffer + stubmsg->BufferLength;
+  return (stubmsg->Buffer);
 }
 /***********************************************************************
  *           NdrFreeBuffer [RPCRT4.@]
@@ -247,7 +249,7 @@
   TRACE("(pStubMsg == ^%p): wild guess.\n", pStubMsg);
   I_RpcFreeBuffer(pStubMsg->RpcMsg);
   pStubMsg->BufferLength = 0;
-  pStubMsg->Buffer = (unsigned char *)(pStubMsg->RpcMsg->Buffer = NULL);
+  pStubMsg->Buffer = pStubMsg->BufferEnd = (unsigned char *)(pStubMsg->RpcMsg->Buffer = NULL);
 }
 
 /************************************************************************
diff -ur -x CVS -x 'bigdif*' -x autom4te.cache ../wine.test/dlls/rpcrt4/rpc_server.c ./dlls/rpcrt4/rpc_server.c
--- ../wine.test/dlls/rpcrt4/rpc_server.c	2002-10-31 20:13:50.000000000 -0600
+++ ./dlls/rpcrt4/rpc_server.c	2003-01-05 04:30:06.000000000 -0600
@@ -458,7 +458,7 @@
  */
 RPC_STATUS WINAPI RpcServerUseProtseqA(LPSTR Protseq, unsigned int MaxCalls, void *SecurityDescriptor)
 {
-  TRACE("(Protseq == %s, MaxCalls == %d, SecurityDescriptor == ^%p)", debugstr_a(Protseq), MaxCalls, SecurityDescriptor);
+  TRACE("(Protseq == %s, MaxCalls == %d, SecurityDescriptor == ^%p)\n", debugstr_a(Protseq), MaxCalls, SecurityDescriptor);
   return RpcServerUseProtseqEpA(Protseq, MaxCalls, NULL, SecurityDescriptor);
 }
 
@@ -467,7 +467,7 @@
  */
 RPC_STATUS WINAPI RpcServerUseProtseqW(LPWSTR Protseq, unsigned int MaxCalls, void *SecurityDescriptor)
 {
-  TRACE("Protseq == %s, MaxCalls == %d, SecurityDescriptor == ^%p)", debugstr_w(Protseq), MaxCalls, SecurityDescriptor);
+  TRACE("Protseq == %s, MaxCalls == %d, SecurityDescriptor == ^%p)\n", debugstr_w(Protseq), MaxCalls, SecurityDescriptor);
   return RpcServerUseProtseqEpW(Protseq, MaxCalls, NULL, SecurityDescriptor);
 }
 
diff -ur -x CVS -x 'bigdif*' -x autom4te.cache ../wine.test/dlls/rpcrt4/rpcrt4_main.c ./dlls/rpcrt4/rpcrt4_main.c
--- ../wine.test/dlls/rpcrt4/rpcrt4_main.c	2002-12-23 19:09:52.000000000 -0600
+++ ./dlls/rpcrt4/rpcrt4_main.c	2003-01-05 04:49:26.000000000 -0600
@@ -696,17 +696,20 @@
 { 
     PROCESS_INFORMATION pi;
     STARTUPINFOA si;
-    static char cmd[6];
+    static char cmd[MAX_PATH], ev[MAX_PATH];
     BOOL rslt;
 
+    ZeroMemory(cmd, MAX_PATH);
     ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
     ZeroMemory(&si, sizeof(STARTUPINFOA));
+
     si.cb = sizeof(STARTUPINFOA);
 
-    /* apparently it's not OK to use a constant string below */
-    CopyMemory(cmd, "rpcss", 6);
+    if (GetEnvironmentVariableA("WINERPCSS", ev, MAX_PATH) > 0)
+      CopyMemory(cmd, ev, strlen(ev));
+    else
+      CopyMemory(cmd, "rpcss", 6);
 
-    /* FIXME: will this do the right thing when run as a test? */
     rslt = CreateProcessA(
         NULL,           /* executable */
         cmd,            /* command line */
diff -ur -x CVS -x 'bigdif*' -x autom4te.cache ../wine.test/dlls/rpcrt4/tests/Makefile.in ./dlls/rpcrt4/tests/Makefile.in
--- ../wine.test/dlls/rpcrt4/tests/Makefile.in	2002-10-07 16:54:07.000000000 -0500
+++ ./dlls/rpcrt4/tests/Makefile.in	2003-01-03 21:25:50.000000000 -0600
@@ -6,7 +6,9 @@
 IMPORTS   = rpcrt4
 
 CTESTS = \
-	rpc.c
+	rpc.c \
+	stringinput_c.c \
+	stringinput_s.c
 
 @MAKE_TEST_RULES@
 
diff -ur -x CVS -x 'bigdif*' -x autom4te.cache ../wine.test/dlls/rpcrt4/tests/rpc.c ./dlls/rpcrt4/tests/rpc.c
--- ../wine.test/dlls/rpcrt4/tests/rpc.c	2002-12-23 19:09:52.000000000 -0600
+++ ./dlls/rpcrt4/tests/rpc.c	2003-01-05 04:58:21.000000000 -0600
@@ -22,10 +22,42 @@
 #include <winbase.h>
 #include <winnt.h>
 #include <winerror.h>
+#include <stdio.h>
 
 #include "wine/unicode.h"
 #include "rpc.h"
 
+#include "stringinput.h"
+
+static char     base[MAX_PATH];
+static char     selfname[MAX_PATH];
+
+static int      myARGC;
+static char**   myARGV;
+
+/* appease testlist.c */
+void func_stringinput_c(void) { }
+void func_stringinput_s(void) { }
+
+/******************************************************************
+ *		init
+ *
+ * generates basic information like:
+ *      base:           absolute path to curr dir
+ *      selfname:       the way to reinvoke ourselves
+ */
+static int init(void)
+{
+    myARGC = winetest_get_mainargs( &myARGV );
+    if (!GetCurrentDirectoryA(sizeof(base), base)) return 0;
+    strcpy(selfname, myARGV[0]);
+    return 1;
+}
+
+/***************************************************************
+ * UUID Tests
+ */
+
 static UUID Uuid_Table[10] = {
   { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }, /* 0 (null) */
   { 0xdeadbeef, 0xdead, 0xbeef, {0x10, 0x21, 0x35, 0x56, 0x89, 0xa0, 0xf4, 0x8a} }, /* 1 */
@@ -119,8 +151,221 @@
     }
 }
 
+/*************************************************************
+ * StringInput tests
+ */
+
+/* here we define all the protocol sequences RPC currently works with. */
+#define SPSCount 1
+static char *SupportedProtocolSequences[SPSCount] = {
+  "ncalrpc"
+};
+
+#define RCCount 10
+static char *RandomCruds[RCCount] = {
+  "This is just some random crud",
+  "Designed \r\n to \r\n test \n",
+  "098172365 the RPC capabilities",
+  "!#$^*@%$*()*)",
+  "of this thing.\n",
+  "x",
+  "blabalbablab ablab              abla",
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG"
+  "<><><><><,.,.____&&&&&&_+-=_+-=_+jjjjjjj,.,.,><><><>,.,.<><????????abcdefghijklmnopqrstuvwxyzABCDEFG",
+  "",
+  "\001\002\003\004\005\006\007\008\009\010\011\012\013\014\015\016"
+  "\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\032"
+  "\033\034\035\036\037\038\039\040\041\042\043\044\045\046\047\048"
+  "\049\050\051\052\053\054\055\056\057\058\059\060\061\062\063\064"
+  "\065\066\067\068\069\070\071\072\073\074\075\076\077\078\079\080"
+  "\081\082\083\084\085\086\087\088\089\090\091\092\093\094\095\096"
+  "\097\098\099\100\101\102\103\104\105\106\107\108\109\110\111\112"
+  "\113\114\115\116\117\118\119\120\121\122\123\124\125\126\127\128"
+  "\129\130\131\132\133\134\135\136\137\138\139\140\141\142\143\144"
+  "\145\146\147\148\149\150\151\152\153\154\155\156\157\158\159\160"
+  "\161\162\163\164\165\166\167\168\169\170\171\172\173\174\175\176"
+  "\177\178\179\180\181\182\183\184\185\186\187\188\189\190\191\192"
+  "\193\194\195\196\197\198\199\200\201\202\203\204\205\206\207\208"
+  "\209\210\211\212\213\214\215\216\217\218\219\220\221\222\223\224"
+  "\225\226\227\228\229\230\231\232\233\234\235\236\237\238\239\240"
+  "\241\242\243\244\245\246\247\248\249\250\251\252\253\254\255"
+};
+
+unsigned int sRCIndex;
+
+void *__RPC_USER MIDL_user_allocate(size_t size)
+{
+    trace ( "Wow, __MIDL_user_allocate was called.\n" );
+    return malloc(size);
+}
+
+void __RPC_USER MIDL_user_free(void *ptr)
+{
+    trace ( "Wow, __MIDL_user_free was called.\n" );
+    free(ptr);
+}
+
+/* this test implements the server side of the stringinput rpc server;
+ * it spawns the client side as a separate process (same exe).
+ */
+void StringInputViaRPC()
+{
+    unsigned int MaxCalls = 50;
+    unsigned int PSIndex;
+    UINT32 status;
+    unsigned char *pszProtocolSequence;
+    RPC_BINDING_VECTOR *pbvBindings;
+    char                buffer[MAX_PATH];
+    PROCESS_INFORMATION	info;
+    STARTUPINFOA	si;
+
+    /* set the WINERPCSS environment variable to ensure we test from the build tree */
+    SetEnvironmentVariableA("WINERPCSS", "..\\..\\..\\programs\\rpcss\\rpcss.exe.so -t 15");
+
+    for (PSIndex = 0; PSIndex < SPSCount; PSIndex++) {
+        pszProtocolSequence = SupportedProtocolSequences[PSIndex];
+
+        /* ready the stringinput server */
+        status = RpcServerUseProtseq(pszProtocolSequence, MaxCalls ,0);
+        ok( (!status), "RpcServerUseProtseq failed" );
+
+        status = RpcServerInqBindings(&pbvBindings);
+        ok( (!status), "RpcServerInqBindings failed" );
+    
+        status = RpcEpRegister(si_manager_stringinput_v1_0_s_ifspec, pbvBindings, 0, 0);
+        ok( (!status), "RpcEpRegister failed" );
+    
+        status = RpcServerRegisterIf(si_manager_stringinput_v1_0_s_ifspec, 0, 0);
+        ok( (!status), "RpcServerRegisterIf failed" ); 
+ 
+        /* spawn the stringinput client process (ourselves, with different arguments) */
+        memset(&si, 0, sizeof(si));
+        si.cb = sizeof(si);
+
+        sprintf(buffer, "%s tests/rpc.c stringinput %s", selfname, pszProtocolSequence);
+        ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, 0L, NULL, NULL, &si, &info), "CreateProcess");
+
+        /* init the expected server inputs */
+        sRCIndex = 0;
+
+        /* start stringinput services.  termination should occur due to a call from the client */
+        status = RpcServerListen(1, MaxCalls, 0);
+        ok( (!status), "RpcServerListen failed");
+
+        /* make sure the client process shut down and succeeded */
+        ok(WaitForSingleObject(info.hProcess, 5000) == WAIT_OBJECT_0, "Child process termination");
+
+        /* FIXME: this doesn't seem to work as expected, why? */
+        GetExitCodeProcess(info.hProcess, (LPDWORD)&status);
+        ok( (!status), "Client process failed" );
+
+        CloseHandle(info.hProcess);
+        CloseHandle(info.hThread);
+
+        /* shut down stringinput server */
+        status = RpcServerUnregisterIf(si_manager_stringinput_v1_0_s_ifspec, 0, 0);
+        ok( (!status), "RpcServerUnregisterIf failed");
+    
+        status = RpcEpUnregister(si_manager_stringinput_v1_0_s_ifspec, pbvBindings, 0);
+        ok( (!status), "RpcEpUnregister failed"); 
+    
+        status = RpcBindingVectorFree(&pbvBindings);
+        ok( (!status), "RpcBindingVectorFree failed");
+    }
+}
+
+void doStringInputClient(char *pszProtocolSequence)
+{
+    UINT32 status;
+    LPSTR pszStringBinding;
+    char *theMessage;
+    unsigned int cRCIndex;
+
+    trace( "String Input Client is running with PS %s.\n", pszProtocolSequence );
+
+    /* prepare ourselves to be the client */
+    status = RpcStringBindingComposeA(0, pszProtocolSequence, NULL, NULL, 0, &pszStringBinding);
+    ok( (!status), "RpcStringBindingCompose failed");
+
+    status = RpcBindingFromStringBindingA(pszStringBinding, &stringinput_binding_handle);
+
+    ok( (!status), "RpcBindingFromStringBinding failed");
+
+    status = RpcStringFreeA((unsigned char**)&pszStringBinding);
+    ok( (!status), "RpcStringFree failed");
+
+    for (cRCIndex = 0; cRCIndex < RCCount; cRCIndex++) {
+        theMessage = RandomCruds[cRCIndex];
+
+        /* hmm, perhaps StringReceive was not such a smart name...
+           here we are /sending/ the string. */
+        si_entry_StringReceive(theMessage);
+    }
+
+    si_entry_ShutdownServer();
+
+    status = RpcBindingFree(&stringinput_binding_handle);
+    ok( (!status), "RpcBindingFree failed");
+}
+
+/* StringInput "manager" routines (server-side implementations) */
+void si_manager_StringReceive(unsigned char *msg)
+{
+    trace( "received message: checking string %d\n", sRCIndex);
+    ok( (sRCIndex < RCCount), "too many messages received");
+    ok( (!strcmp(msg, RandomCruds[sRCIndex++])), "message mismatch");
+}
+
+void si_manager_ShutdownServer()
+{
+    UINT32 status;
+    trace( "Shutdown request received.\n" );
+    status = RpcMgmtStopServerListening(0);
+    ok( (!status), "RpcMgmtStopServerListening failed");
+}
+
 START_TEST( rpc )
 {
+    int b = init();
+    ok(b, "Basic init of RPC test");
+    if (!b) return;
+
+    if ((myARGC >= 4) && (!strcmp(myARGV[2], "stringinput"))) {
+        doStringInputClient(myARGV[3]);
+        return;
+    }
+ 
     trace ( " ** Uuid Conversion and Comparison Tests **\n" );
     UuidConversionAndComparison();
+    trace ( " ** StringInput via RPC Tests **\n" );
+    StringInputViaRPC();
 }
diff -ur -x CVS -x 'bigdif*' -x autom4te.cache ../wine.test/include/rpcndr.h ./include/rpcndr.h
--- ../wine.test/include/rpcndr.h	2002-12-02 23:52:12.000000000 -0600
+++ ./include/rpcndr.h	2003-01-03 21:25:51.000000000 -0600
@@ -95,6 +95,10 @@
 #define __RPC_CALLEE WINAPI
 #define RPC_VAR_ENTRY WINAPIV
 
+#define NdrFcShort(s) (unsigned char)(s & 0xff), (unsigned char)(s >> 8)
+#define NdrFcLong(s)  (unsigned char)(s & 0xff), (unsigned char)((s & 0x0000ff00) >> 8), \
+  (unsigned char)((s & 0x00ff0000) >> 16), (unsigned char)(s >> 24)
+
 typedef struct
 {
   void *pad[2];
diff -ur -x CVS -x 'bigdif*' -x autom4te.cache ../wine.test/programs/rpcss/rpcss.h ./programs/rpcss/rpcss.h
--- ../wine.test/programs/rpcss/rpcss.h	2002-12-02 15:17:04.000000000 -0600
+++ ./programs/rpcss/rpcss.h	2003-01-05 04:41:33.000000000 -0600
@@ -25,7 +25,7 @@
 #include "windows.h"
 
 /* in seconds */
-#define RPCSS_DEFAULT_MAX_LAZY_TIMEOUT 30
+#define RPCSS_DEFAULT_MAX_LAZY_TIMEOUT 60
 
 /* rpcss_main.c */
 HANDLE RPCSS_GetMasterMutex(void);
--- /dev/null	1969-12-31 18:00:00.000000000 -0600
+++ ./dlls/rpcrt4/tests/gen.bat	2003-01-04 23:28:12.000000000 -0600
@@ -0,0 +1,13 @@
+echo off
+echo GEN.BAT
+echo *
+echo Used by Greg to generate stringinput_c.c, stringinput_h.c.
+echo *
+echo FIXME
+echo *
+echo DO NOT RUN ME UNLESS YOU KNOW WHAT YOU ARE DOING
+echo PRESS CTRL-C OTHERWISE.
+echo *
+pause
+call c:\windows\system\vcvars32.bat
+midl /prefix client si_entry_ /prefix server si_manager_ /no_format_opt stringinput.idl
--- /dev/null	1969-12-31 18:00:00.000000000 -0600
+++ ./dlls/rpcrt4/tests/stringinput.acf	2003-01-04 15:10:55.000000000 -0600
@@ -0,0 +1,4 @@
+[ implicit_handle(handle_t stringinput_binding_handle) ]
+interface stringinput
+{
+}
--- /dev/null	1969-12-31 18:00:00.000000000 -0600
+++ ./dlls/rpcrt4/tests/stringinput.h	2003-01-05 05:00:44.000000000 -0600
@@ -0,0 +1,74 @@
+/* this ALWAYS GENERATED file contains the definitions for the interfaces */
+
+
+/* File created by MIDL compiler version 5.01.0164 */
+/* at Sun Jan 05 03:00:57 2003
+ */
+/* Compiler settings for stringinput.idl:
+    Os (OptLev=s), W1, Zp8, env=Win32, ms_ext, c_ext
+    error checks: allocation ref bounds_check enum stub_data , no_format_optimization
+*/
+//@@MIDL_FILE_HEADING(  )
+
+
+/* verify that the <rpcndr.h> version is high enough to compile this file*/
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 440
+#endif
+
+#include "rpc.h"
+#include "rpcndr.h"
+
+#ifndef __stringinput_h__
+#define __stringinput_h__
+
+#ifdef __cplusplus
+extern "C"{
+#endif 
+
+/* Forward Declarations */ 
+
+void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t);
+void __RPC_USER MIDL_user_free( void __RPC_FAR * ); 
+
+#ifndef __stringinput_INTERFACE_DEFINED__
+#define __stringinput_INTERFACE_DEFINED__
+
+/* interface stringinput */
+/* [implicit_handle][version][uuid] */ 
+
+/* client prototype */
+void si_entry_StringReceive( 
+    /* [ref][string][in] */ unsigned char __RPC_FAR *thestring);
+/* server prototype */
+void si_manager_StringReceive( 
+    /* [ref][string][in] */ unsigned char __RPC_FAR *thestring);
+/* switch prototype */
+void StringReceive( 
+    /* [ref][string][in] */ unsigned char __RPC_FAR *thestring);
+
+/* client prototype */
+void si_entry_ShutdownServer( void);
+/* server prototype */
+void si_manager_ShutdownServer( void);
+/* switch prototype */
+void ShutdownServer( void);
+
+
+extern handle_t stringinput_binding_handle;
+
+
+extern RPC_IF_HANDLE si_entry_stringinput_v1_0_c_ifspec;
+extern RPC_IF_HANDLE stringinput_v1_0_c_ifspec;
+extern RPC_IF_HANDLE si_manager_stringinput_v1_0_s_ifspec;
+#endif /* __stringinput_INTERFACE_DEFINED__ */
+
+/* Additional Prototypes for ALL interfaces */
+
+/* end of Additional Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	1969-12-31 18:00:00.000000000 -0600
+++ ./dlls/rpcrt4/tests/stringinput.idl	2003-01-04 15:11:12.000000000 -0600
@@ -0,0 +1,15 @@
+/*
+ * this defines a super-simple RPC service which passes a
+ * single string to the server and returns nothing.
+ */
+
+[ 
+  uuid(cdf93a7e-2622-4ede-99b3-aa4a0dac8615),
+  version(1.0)
+]
+
+interface stringinput
+{
+void StringReceive([in, string, ref] unsigned char *thestring);
+void ShutdownServer(void);
+}
--- /dev/null	1969-12-31 18:00:00.000000000 -0600
+++ ./dlls/rpcrt4/tests/stringinput_c.c	2003-01-05 05:01:13.000000000 -0600
@@ -0,0 +1,232 @@
+/* this ALWAYS GENERATED file contains the RPC client stubs */
+
+
+/* File created by MIDL compiler version 5.01.0164 */
+/* at Sat Jan 04 23:37:58 2003
+ */
+/* Compiler settings for stringinput.idl:
+    Os (OptLev=s), W1, Zp8, env=Win32, ms_ext, c_ext
+    error checks: allocation ref bounds_check enum stub_data , no_format_optimization
+*/
+//@@MIDL_FILE_HEADING(  )
+
+#include <string.h>
+
+/* warning: slightly hacked on by greg:
+ *   all #if 0's, and the following two
+ *   lines, deviate from midl's output
+ */
+#include <assert.h>
+#define RpcRaiseException(xyz) assert(FALSE)
+
+#if defined( _ALPHA_ )
+#include <stdarg.h>
+#endif
+
+#include "stringinput.h"
+
+#define TYPE_FORMAT_STRING_SIZE   7                                 
+#define PROC_FORMAT_STRING_SIZE   9                                 
+
+typedef struct _MIDL_TYPE_FORMAT_STRING
+    {
+    short          Pad;
+    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];
+    } MIDL_TYPE_FORMAT_STRING;
+
+typedef struct _MIDL_PROC_FORMAT_STRING
+    {
+    short          Pad;
+    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];
+    } MIDL_PROC_FORMAT_STRING;
+
+
+extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString;
+extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString;
+
+/* Standard interface: stringinput, ver. 1.0,
+   GUID={0xcdf93a7e,0x2622,0x4ede,{0x99,0xb3,0xaa,0x4a,0x0d,0xac,0x86,0x15}} */
+
+handle_t stringinput_binding_handle;
+
+
+static const RPC_CLIENT_INTERFACE stringinput___RpcClientInterface =
+    {
+    sizeof(RPC_CLIENT_INTERFACE),
+    {{0xcdf93a7e,0x2622,0x4ede,{0x99,0xb3,0xaa,0x4a,0x0d,0xac,0x86,0x15}},{1,0}},
+    {{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}},
+    0,
+    0,
+    0,
+    0,
+    0,
+    0
+    };
+RPC_IF_HANDLE si_entry_stringinput_v1_0_c_ifspec = (RPC_IF_HANDLE)& stringinput___RpcClientInterface;
+
+extern const MIDL_STUB_DESC stringinput_StubDesc;
+
+/* Greg commented this to avoid a 'not used' warning. */
+/* static RPC_BINDING_HANDLE stringinput__MIDL_AutoBindHandle; */
+
+
+void si_entry_StringReceive( 
+    /* [ref][string][in] */ unsigned char __RPC_FAR *thestring)
+{
+
+    RPC_BINDING_HANDLE _Handle	=	0;
+    
+    RPC_MESSAGE _RpcMessage;
+    
+    MIDL_STUB_MESSAGE _StubMsg;
+    
+    if(!thestring)
+        {
+        RpcRaiseException(RPC_X_NULL_REF_POINTER);
+        }
+    #if 0
+    RpcTryFinally
+        {
+    #endif
+        NdrClientInitializeNew(
+                          ( PRPC_MESSAGE  )&_RpcMessage,
+                          ( PMIDL_STUB_MESSAGE  )&_StubMsg,
+                          ( PMIDL_STUB_DESC  )&stringinput_StubDesc,
+                          0);
+        
+        
+        _Handle = stringinput_binding_handle;
+        
+        
+        _StubMsg.BufferLength = 12U;
+        NdrConformantStringBufferSize( (PMIDL_STUB_MESSAGE) &_StubMsg,
+                                       (unsigned char __RPC_FAR *)thestring,
+                                       (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[4] );
+        
+        NdrGetBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg, _StubMsg.BufferLength, _Handle );
+        
+        NdrConformantStringMarshall( (PMIDL_STUB_MESSAGE)& _StubMsg,
+                                     (unsigned char __RPC_FAR *)thestring,
+                                     (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[4] );
+        
+        NdrSendReceive( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *) _StubMsg.Buffer );
+        
+	#if 0
+        }
+    RpcFinally
+        {
+	#endif
+        NdrFreeBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg );
+    #if 0
+        }
+    RpcEndFinally
+    #endif
+}
+
+
+void si_entry_ShutdownServer( void)
+{
+
+    RPC_BINDING_HANDLE _Handle	=	0;
+    
+    RPC_MESSAGE _RpcMessage;
+    
+    MIDL_STUB_MESSAGE _StubMsg;
+    #if 0
+    RpcTryFinally
+        {
+    #endif
+        NdrClientInitializeNew(
+                          ( PRPC_MESSAGE  )&_RpcMessage,
+                          ( PMIDL_STUB_MESSAGE  )&_StubMsg,
+                          ( PMIDL_STUB_DESC  )&stringinput_StubDesc,
+                          1);
+        
+        
+        _Handle = stringinput_binding_handle;
+        
+        
+        _StubMsg.BufferLength = 0U;
+        NdrGetBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg, _StubMsg.BufferLength, _Handle );
+        
+        NdrSendReceive( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *) _StubMsg.Buffer );
+        
+        #if 0
+	}
+    RpcFinally
+        {
+	#endif
+        NdrFreeBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg );
+        
+    #if 0
+	}
+    RpcEndFinally
+    #endif
+    
+}
+
+
+static const MIDL_STUB_DESC stringinput_StubDesc = 
+    {
+    (void __RPC_FAR *)& stringinput___RpcClientInterface,
+    MIDL_user_allocate,
+    MIDL_user_free,
+    /* bracketed to avoid compiler warning, presumably caused by union in our struct? */
+    { &stringinput_binding_handle },
+    0,
+    0,
+    0,
+    0,
+    __MIDL_TypeFormatString.Format,
+    1, /* -error bounds_check flag */
+    0x10001, /* Ndr library version */
+    0,
+    0x50100a4, /* MIDL Version 5.1.164 */
+    0,
+    0,
+    0,  /* notify & notify_flag routine table */
+    1,  /* Flags */
+    0,  /* Reserved3 */
+    0,  /* Reserved4 */
+    0   /* Reserved5 */
+    };
+
+#if !defined(__RPC_WIN32__)
+#error  Invalid build platform for this stub.
+#endif
+
+static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
+    {
+        0,
+        {
+			
+			0x4d,		/* FC_IN_PARAM */
+#ifndef _ALPHA_
+			0x1,		/* x86, MIPS & PPC Stack size = 1 */
+#else
+			0x2,		/* Alpha Stack size = 2 */
+#endif
+/*  2 */	NdrFcShort( 0x2 ),	/* Type Offset=2 */
+/*  4 */	0x5b,		/* FC_END */
+			0x5c,		/* FC_PAD */
+/*  6 */	0x5b,		/* FC_END */
+			0x5c,		/* FC_PAD */
+
+			0x0
+        }
+    };
+
+static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString =
+    {
+        0,
+        {
+			NdrFcShort( 0x0 ),	/* 0 */
+/*  2 */	
+			0x11, 0x8,	/* FC_RP [simple_pointer] */
+/*  4 */	
+			0x22,		/* FC_C_CSTRING */
+			0x5c,		/* FC_PAD */
+
+			0x0
+        }
+    };
--- /dev/null	1969-12-31 18:00:00.000000000 -0600
+++ ./dlls/rpcrt4/tests/stringinput_s.c	2003-01-05 05:00:59.000000000 -0600
@@ -0,0 +1,241 @@
+/* this ALWAYS GENERATED file contains the RPC server stubs */
+
+
+/* File created by MIDL compiler version 5.01.0164 */
+/* at Sat Jan 04 23:37:58 2003
+ */
+/* Compiler settings for stringinput.idl:
+    Os (OptLev=s), W1, Zp8, env=Win32, ms_ext, c_ext
+    error checks: allocation ref bounds_check enum stub_data , no_format_optimization
+*/
+//@@MIDL_FILE_HEADING(  )
+
+#include <string.h>
+
+/* warning: slightly hacked on by greg:
+ *   all #if 0's, and the following two
+ *   lines, deviate from midl's output
+ */
+#include <assert.h>
+#define RpcRaiseException(xyz) assert(FALSE)
+
+#include "stringinput.h"
+
+#define TYPE_FORMAT_STRING_SIZE   7                                 
+#define PROC_FORMAT_STRING_SIZE   9                                 
+
+typedef struct _MIDL_TYPE_FORMAT_STRING
+    {
+    short          Pad;
+    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];
+    } MIDL_TYPE_FORMAT_STRING;
+
+typedef struct _MIDL_PROC_FORMAT_STRING
+    {
+    short          Pad;
+    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];
+    } MIDL_PROC_FORMAT_STRING;
+
+extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString;
+extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString;
+
+/* Standard interface: stringinput, ver. 1.0,
+   GUID={0xcdf93a7e,0x2622,0x4ede,{0x99,0xb3,0xaa,0x4a,0x0d,0xac,0x86,0x15}} */
+
+
+extern RPC_DISPATCH_TABLE stringinput_v1_0_DispatchTable;
+
+static const RPC_SERVER_INTERFACE stringinput___RpcServerInterface =
+    {
+    sizeof(RPC_SERVER_INTERFACE),
+    {{0xcdf93a7e,0x2622,0x4ede,{0x99,0xb3,0xaa,0x4a,0x0d,0xac,0x86,0x15}},{1,0}},
+    {{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}},
+    &stringinput_v1_0_DispatchTable,
+    0,
+    0,
+    0,
+    0,
+    0
+    };
+RPC_IF_HANDLE si_manager_stringinput_v1_0_s_ifspec = (RPC_IF_HANDLE)& stringinput___RpcServerInterface;
+
+extern const MIDL_STUB_DESC stringinput_StubDesc;
+
+void __RPC_STUB
+stringinput_StringReceive(
+    PRPC_MESSAGE _pRpcMessage )
+{
+    MIDL_STUB_MESSAGE _StubMsg;
+    unsigned char __RPC_FAR *thestring;
+    RPC_STATUS _Status;
+    
+    ((void)(_Status));
+    NdrServerInitializeNew(
+                          _pRpcMessage,
+                          &_StubMsg,
+                          &stringinput_StubDesc);
+    
+    ( unsigned char __RPC_FAR * )thestring = 0;
+    #if 0
+    RpcTryFinally
+        {
+        RpcTryExcept
+            {
+    #endif
+            if ( (_pRpcMessage->DataRepresentation & 0X0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION )
+                NdrConvert( (PMIDL_STUB_MESSAGE) &_StubMsg, (PFORMAT_STRING) &__MIDL_ProcFormatString.Format[0] );
+            
+            NdrConformantStringUnmarshall( (PMIDL_STUB_MESSAGE) &_StubMsg,
+                                           (unsigned char __RPC_FAR * __RPC_FAR *)&thestring,
+                                           (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[4],
+                                           (unsigned char)0 );
+            
+            if(_StubMsg.Buffer > _StubMsg.BufferEnd)
+                {
+		RpcRaiseException(RPC_X_BAD_STUB_DATA);
+                }
+	    #if 0
+            }
+        RpcExcept( RPC_BAD_STUB_DATA_EXCEPTION_FILTER )
+            {
+            RpcRaiseException(RPC_X_BAD_STUB_DATA);
+            }
+        RpcEndExcept
+        #endif
+
+        si_manager_StringReceive(thestring);
+        
+    #if 0
+	}
+    RpcFinally
+        {
+        }
+    RpcEndFinally
+    #endif
+    _pRpcMessage->BufferLength = 
+        (unsigned int)((long)_StubMsg.Buffer - (long)_pRpcMessage->Buffer);
+    
+}
+
+void __RPC_STUB
+stringinput_ShutdownServer(
+    PRPC_MESSAGE _pRpcMessage )
+{
+    MIDL_STUB_MESSAGE _StubMsg;
+    RPC_STATUS _Status;
+    
+    ((void)(_Status));
+    NdrServerInitializeNew(
+                          _pRpcMessage,
+                          &_StubMsg,
+                          &stringinput_StubDesc);
+    
+    #if 0
+    RpcTryFinally
+        {
+        RpcTryExcept
+            {
+    #endif
+            if(_StubMsg.Buffer > _StubMsg.BufferEnd)
+                {
+		RpcRaiseException(RPC_X_BAD_STUB_DATA);
+                }
+        #if 0
+            }
+        RpcExcept( RPC_BAD_STUB_DATA_EXCEPTION_FILTER )
+            {
+            RpcRaiseException(RPC_X_BAD_STUB_DATA);
+            }
+        RpcEndExcept
+        #endif
+        si_manager_ShutdownServer();
+
+    #if 0    
+        }
+    RpcFinally
+        {
+        }
+    RpcEndFinally
+    #endif
+    _pRpcMessage->BufferLength = 
+        (unsigned int)((long)_StubMsg.Buffer - (long)_pRpcMessage->Buffer);
+    
+}
+
+
+static const MIDL_STUB_DESC stringinput_StubDesc = 
+    {
+    (void __RPC_FAR *)& stringinput___RpcServerInterface,
+    MIDL_user_allocate,
+    MIDL_user_free,
+    /* Greg added these brackets to avoid a compiler warning. */
+    { 0 },
+    0,
+    0,
+    0,
+    0,
+    __MIDL_TypeFormatString.Format,
+    1, /* -error bounds_check flag */
+    0x10001, /* Ndr library version */
+    0,
+    0x50100a4, /* MIDL Version 5.1.164 */
+    0,
+    0,
+    0,  /* notify & notify_flag routine table */
+    1,  /* Flags */
+    0,  /* Reserved3 */
+    0,  /* Reserved4 */
+    0   /* Reserved5 */
+    };
+
+static RPC_DISPATCH_FUNCTION stringinput_table[] =
+    {
+    stringinput_StringReceive,
+    stringinput_ShutdownServer,
+    0
+    };
+RPC_DISPATCH_TABLE stringinput_v1_0_DispatchTable = 
+    {
+    2,
+    stringinput_table
+    };
+
+#if !defined(__RPC_WIN32__)
+#error  Invalid build platform for this stub.
+#endif
+
+static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
+    {
+        0,
+        {
+			
+			0x4d,		/* FC_IN_PARAM */
+#ifndef _ALPHA_
+			0x1,		/* x86, MIPS & PPC Stack size = 1 */
+#else
+			0x2,		/* Alpha Stack size = 2 */
+#endif
+/*  2 */	NdrFcShort( 0x2 ),	/* Type Offset=2 */
+/*  4 */	0x5b,		/* FC_END */
+			0x5c,		/* FC_PAD */
+/*  6 */	0x5b,		/* FC_END */
+			0x5c,		/* FC_PAD */
+
+			0x0
+        }
+    };
+
+static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString =
+    {
+        0,
+        {
+			NdrFcShort( 0x0 ),	/* 0 */
+/*  2 */	
+			0x11, 0x8,	/* FC_RP [simple_pointer] */
+/*  4 */	
+			0x22,		/* FC_C_CSTRING */
+			0x5c,		/* FC_PAD */
+
+			0x0
+        }
+    };
-- 
gmt

"It does not take a majority to prevail ... but rather an irate,
tireless minority, keen on setting brushfires of freedom in the
minds of men." --Samuel Adams, Patriot




More information about the wine-patches mailing list