testprogs/win32/rpcecho-win32-pipe server 1 byte reads
authorStefan Metzmacher <metze@samba.org>
Fri, 20 Sep 2013 20:27:54 +0000 (22:27 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Jun 2019 11:15:20 +0000 (13:15 +0200)
testprogs/win32/rpcecho-win32-pipe/rpcecho.acf
testprogs/win32/rpcecho-win32-pipe/rpcecho.h
testprogs/win32/rpcecho-win32-pipe/rpcecho.idl
testprogs/win32/rpcecho-win32-pipe/rpcecho_c.c
testprogs/win32/rpcecho-win32-pipe/rpcecho_s.c
testprogs/win32/rpcecho-win32-pipe/server.c

index 95b737c5d1cb74c3c06ec1883c6e726b78dbe2f9..25569abb0faab35020ba2fb1aa31b10d7446adc8 100755 (executable)
@@ -25,4 +25,6 @@ interface rpcecho
 {
 /*     [async] TestSleep(); */
        [async] TestBytePipeIn();
+       [async] TestBytePipeOut();
+//     [async] TestBytePipeInOut();
 }
index 0638498c96ca09f80c713653013b8e999bee764f..4c3ddc33ea17f1aaa56a2eb53b87804f7e63ea82 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Fri Sep 20 18:05:28 2013\r
+/* at Fri Sep 20 22:20:36 2013\r
  */\r
 /* Compiler settings for rpcecho.idl, rpcecho.acf:\r
     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 7.00.0555 \r
@@ -212,9 +212,16 @@ typedef struct pipe_BYTE_PIPE
 \r
 /* [async] */ void  TestBytePipeIn( \r
     /* [in] */ PRPC_ASYNC_STATE TestBytePipeIn_AsyncHandle,\r
-    /* [in] */ long count,\r
+    /* [in] */ long num_chunks,\r
+    /* [in] */ long chunk_size,\r
     /* [ref][in] */ ASYNC_BYTE_PIPE *in_pipe);\r
 \r
+/* [async] */ void  TestBytePipeOut( \r
+    /* [in] */ PRPC_ASYNC_STATE TestBytePipeOut_AsyncHandle,\r
+    /* [in] */ long num_chunks,\r
+    /* [in] */ long chunk_size,\r
+    /* [ref][out] */ ASYNC_BYTE_PIPE *out_pipe);\r
+\r
 \r
 extern handle_t rpcecho_IfHandle;\r
 \r
index ee8327e769c3b38a1e6b5507e5784a3b44c62021..0c0ac1bb865061a7caf4c0c90e8488cef5fdf647 100755 (executable)
@@ -152,18 +152,21 @@ interface rpcecho
        typedef pipe byte BYTE_PIPE;
 
        long TestBytePipeIn(
-               [in] long count,
+               [in] long num_chunks,
+               [in] long chunk_size,
                [in,ref] BYTE_PIPE *in_pipe
                );
 
        long TestBytePipeOut(
-               [in] long count,
+               [in] long num_chunks,
+               [in] long chunk_size,
                [out,ref] BYTE_PIPE *out_pipe
                );
 
 #if 0
        long TestBytePipeInOut(
-               [in] long count,
+               [in] long num_chunks,
+               [in] long chunk_size,
                [in,out,ref] BYTE_PIPE *in_out_pipe
                );
 #endif
index 9dd7ae0d62fdbec277d4fd8367c7a294c0f47ce8..6220cb468d6af920e3cd241f334e81788450b782 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Fri Sep 20 18:05:28 2013\r
+/* at Fri Sep 20 22:20:36 2013\r
  */\r
 /* Compiler settings for rpcecho.idl, rpcecho.acf:\r
     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 7.00.0555 \r
@@ -35,8 +35,8 @@
 \r
 #include "rpcecho.h"\r
 \r
-#define TYPE_FORMAT_STRING_SIZE   249                               \r
-#define PROC_FORMAT_STRING_SIZE   437                               \r
+#define TYPE_FORMAT_STRING_SIZE   263                               \r
+#define PROC_FORMAT_STRING_SIZE   493                               \r
 #define EXPR_FORMAT_STRING_SIZE   1                                 \r
 #define TRANSMIT_AS_TABLE_SIZE    0            \r
 #define WIRE_MARSHAL_TABLE_SIZE   0            \r
@@ -245,7 +245,8 @@ short TestDoublePointer(
 \r
 /* [async] */ void  TestBytePipeIn( \r
     /* [in] */ PRPC_ASYNC_STATE TestBytePipeIn_AsyncHandle,\r
-    /* [in] */ long count,\r
+    /* [in] */ long num_chunks,\r
+    /* [in] */ long chunk_size,\r
     /* [ref][in] */ ASYNC_BYTE_PIPE *in_pipe)\r
 {\r
 \r
@@ -253,12 +254,31 @@ short TestDoublePointer(
                       ( PMIDL_STUB_DESC  )&rpcecho_StubDesc,\r
                       (PFORMAT_STRING) &rpcecho__MIDL_ProcFormatString.Format[392],\r
                       TestBytePipeIn_AsyncHandle,\r
-                      count,\r
+                      num_chunks,\r
+                      chunk_size,\r
                       in_pipe);\r
     \r
 }\r
 \r
 \r
+/* [async] */ void  TestBytePipeOut( \r
+    /* [in] */ PRPC_ASYNC_STATE TestBytePipeOut_AsyncHandle,\r
+    /* [in] */ long num_chunks,\r
+    /* [in] */ long chunk_size,\r
+    /* [ref][out] */ ASYNC_BYTE_PIPE *out_pipe)\r
+{\r
+\r
+    NdrAsyncClientCall(\r
+                      ( PMIDL_STUB_DESC  )&rpcecho_StubDesc,\r
+                      (PFORMAT_STRING) &rpcecho__MIDL_ProcFormatString.Format[442],\r
+                      TestBytePipeOut_AsyncHandle,\r
+                      num_chunks,\r
+                      chunk_size,\r
+                      out_pipe);\r
+    \r
+}\r
+\r
+\r
 #if !defined(__RPC_WIN64__)\r
 #error  Invalid build platform for this stub.\r
 #endif\r
@@ -596,11 +616,11 @@ static const rpcecho_MIDL_PROC_FORMAT_STRING rpcecho__MIDL_ProcFormatString =
                        0x48,           /* Old Flags:  */\r
 /* 394 */      NdrFcLong( 0x0 ),       /* 0 */\r
 /* 398 */      NdrFcShort( 0xa ),      /* 10 */\r
-/* 400 */      NdrFcShort( 0x20 ),     /* x86 Stack size/offset = 32 */\r
-/* 402 */      NdrFcShort( 0x8 ),      /* 8 */\r
+/* 400 */      NdrFcShort( 0x28 ),     /* x86 Stack size/offset = 40 */\r
+/* 402 */      NdrFcShort( 0x10 ),     /* 16 */\r
 /* 404 */      NdrFcShort( 0x8 ),      /* 8 */\r
 /* 406 */      0xcc,           /* Oi2 Flags:  has return, has pipes, has ext, has async handle */\r
-                       0x3,            /* 3 */\r
+                       0x4,            /* 4 */\r
 /* 408 */      0xa,            /* 10 */\r
                        0x1,            /* Ext Flags:  new corr desc, */\r
 /* 410 */      NdrFcShort( 0x0 ),      /* 0 */\r
@@ -608,24 +628,76 @@ static const rpcecho_MIDL_PROC_FORMAT_STRING rpcecho__MIDL_ProcFormatString =
 /* 414 */      NdrFcShort( 0x0 ),      /* 0 */\r
 /* 416 */      NdrFcShort( 0x0 ),      /* 0 */\r
 \r
-       /* Parameter count */\r
+       /* Parameter num_chunks */\r
 \r
 /* 418 */      NdrFcShort( 0x48 ),     /* Flags:  in, base type, */\r
 /* 420 */      NdrFcShort( 0x8 ),      /* x86 Stack size/offset = 8 */\r
 /* 422 */      0x8,            /* FC_LONG */\r
                        0x0,            /* 0 */\r
 \r
-       /* Parameter in_pipe */\r
+       /* Parameter chunk_size */\r
 \r
-/* 424 */      NdrFcShort( 0x10c ),    /* Flags:  pipe, in, simple ref, */\r
+/* 424 */      NdrFcShort( 0x48 ),     /* Flags:  in, base type, */\r
 /* 426 */      NdrFcShort( 0x10 ),     /* x86 Stack size/offset = 16 */\r
-/* 428 */      NdrFcShort( 0xf0 ),     /* Type Offset=240 */\r
+/* 428 */      0x8,            /* FC_LONG */\r
+                       0x0,            /* 0 */\r
 \r
-       /* Return value */\r
+       /* Parameter in_pipe */\r
 \r
-/* 430 */      NdrFcShort( 0x70 ),     /* Flags:  out, return, base type, */\r
+/* 430 */      NdrFcShort( 0x10c ),    /* Flags:  pipe, in, simple ref, */\r
 /* 432 */      NdrFcShort( 0x18 ),     /* x86 Stack size/offset = 24 */\r
-/* 434 */      0x8,            /* FC_LONG */\r
+/* 434 */      NdrFcShort( 0xf0 ),     /* Type Offset=240 */\r
+\r
+       /* Return value */\r
+\r
+/* 436 */      NdrFcShort( 0x70 ),     /* Flags:  out, return, base type, */\r
+/* 438 */      NdrFcShort( 0x20 ),     /* x86 Stack size/offset = 32 */\r
+/* 440 */      0x8,            /* FC_LONG */\r
+                       0x0,            /* 0 */\r
+\r
+       /* Procedure TestBytePipeOut */\r
+\r
+/* 442 */      0x32,           /* FC_BIND_PRIMITIVE */\r
+                       0x48,           /* Old Flags:  */\r
+/* 444 */      NdrFcLong( 0x0 ),       /* 0 */\r
+/* 448 */      NdrFcShort( 0xb ),      /* 11 */\r
+/* 450 */      NdrFcShort( 0x28 ),     /* x86 Stack size/offset = 40 */\r
+/* 452 */      NdrFcShort( 0x10 ),     /* 16 */\r
+/* 454 */      NdrFcShort( 0x8 ),      /* 8 */\r
+/* 456 */      0xcc,           /* Oi2 Flags:  has return, has pipes, has ext, has async handle */\r
+                       0x4,            /* 4 */\r
+/* 458 */      0xa,            /* 10 */\r
+                       0x1,            /* Ext Flags:  new corr desc, */\r
+/* 460 */      NdrFcShort( 0x0 ),      /* 0 */\r
+/* 462 */      NdrFcShort( 0x0 ),      /* 0 */\r
+/* 464 */      NdrFcShort( 0x0 ),      /* 0 */\r
+/* 466 */      NdrFcShort( 0x0 ),      /* 0 */\r
+\r
+       /* Parameter num_chunks */\r
+\r
+/* 468 */      NdrFcShort( 0x48 ),     /* Flags:  in, base type, */\r
+/* 470 */      NdrFcShort( 0x8 ),      /* x86 Stack size/offset = 8 */\r
+/* 472 */      0x8,            /* FC_LONG */\r
+                       0x0,            /* 0 */\r
+\r
+       /* Parameter chunk_size */\r
+\r
+/* 474 */      NdrFcShort( 0x48 ),     /* Flags:  in, base type, */\r
+/* 476 */      NdrFcShort( 0x10 ),     /* x86 Stack size/offset = 16 */\r
+/* 478 */      0x8,            /* FC_LONG */\r
+                       0x0,            /* 0 */\r
+\r
+       /* Parameter out_pipe */\r
+\r
+/* 480 */      NdrFcShort( 0x4114 ),   /* Flags:  pipe, out, simple ref, srv alloc size=16 */\r
+/* 482 */      NdrFcShort( 0x18 ),     /* x86 Stack size/offset = 24 */\r
+/* 484 */      NdrFcShort( 0xfe ),     /* Type Offset=254 */\r
+\r
+       /* Return value */\r
+\r
+/* 486 */      NdrFcShort( 0x70 ),     /* Flags:  out, return, base type, */\r
+/* 488 */      NdrFcShort( 0x20 ),     /* x86 Stack size/offset = 32 */\r
+/* 490 */      0x8,            /* FC_LONG */\r
                        0x0,            /* 0 */\r
 \r
                        0x0\r
@@ -817,6 +889,16 @@ static const rpcecho_MIDL_TYPE_FORMAT_STRING rpcecho__MIDL_TypeFormatString =
 /* 242 */      NdrFcShort( 0xfffc ),   /* Offset= -4 (238) */\r
 /* 244 */      NdrFcShort( 0x1 ),      /* 1 */\r
 /* 246 */      NdrFcShort( 0x1 ),      /* 1 */\r
+/* 248 */      \r
+                       0x11, 0x4,      /* FC_RP [alloced_on_stack] */\r
+/* 250 */      NdrFcShort( 0x4 ),      /* Offset= 4 (254) */\r
+/* 252 */      0x1,            /* FC_BYTE */\r
+                       0x5c,           /* FC_PAD */\r
+/* 254 */      0xb5,           /* FC_PIPE */\r
+                       0x0,            /* 0 */\r
+/* 256 */      NdrFcShort( 0xfffc ),   /* Offset= -4 (252) */\r
+/* 258 */      NdrFcShort( 0x1 ),      /* 1 */\r
+/* 260 */      NdrFcShort( 0x1 ),      /* 1 */\r
 \r
                        0x0\r
         }\r
@@ -834,7 +916,8 @@ static const unsigned short rpcecho_FormatStringOffsetTable[] =
     278,\r
     322,\r
     354,\r
-    392\r
+    392,\r
+    442\r
     };\r
 \r
 \r
index 311207d5ec1d9b4feda32f84f53e21147e1008fc..a570d6bc83ac4cb260f286dfe98449c90e99bda4 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Fri Sep 20 18:05:28 2013\r
+/* at Fri Sep 20 22:20:36 2013\r
  */\r
 /* Compiler settings for rpcecho.idl, rpcecho.acf:\r
     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 7.00.0555 \r
@@ -34,8 +34,8 @@
 #include <string.h>\r
 #include "rpcecho.h"\r
 \r
-#define TYPE_FORMAT_STRING_SIZE   249                               \r
-#define PROC_FORMAT_STRING_SIZE   437                               \r
+#define TYPE_FORMAT_STRING_SIZE   263                               \r
+#define PROC_FORMAT_STRING_SIZE   493                               \r
 #define EXPR_FORMAT_STRING_SIZE   1                                 \r
 #define TRANSMIT_AS_TABLE_SIZE    0            \r
 #define WIRE_MARSHAL_TABLE_SIZE   0            \r
@@ -428,11 +428,11 @@ static const rpcecho_MIDL_PROC_FORMAT_STRING rpcecho__MIDL_ProcFormatString =
                        0x48,           /* Old Flags:  */\r
 /* 394 */      NdrFcLong( 0x0 ),       /* 0 */\r
 /* 398 */      NdrFcShort( 0xa ),      /* 10 */\r
-/* 400 */      NdrFcShort( 0x20 ),     /* x86 Stack size/offset = 32 */\r
-/* 402 */      NdrFcShort( 0x8 ),      /* 8 */\r
+/* 400 */      NdrFcShort( 0x28 ),     /* x86 Stack size/offset = 40 */\r
+/* 402 */      NdrFcShort( 0x10 ),     /* 16 */\r
 /* 404 */      NdrFcShort( 0x8 ),      /* 8 */\r
 /* 406 */      0xcc,           /* Oi2 Flags:  has return, has pipes, has ext, has async handle */\r
-                       0x3,            /* 3 */\r
+                       0x4,            /* 4 */\r
 /* 408 */      0xa,            /* 10 */\r
                        0x1,            /* Ext Flags:  new corr desc, */\r
 /* 410 */      NdrFcShort( 0x0 ),      /* 0 */\r
@@ -440,24 +440,76 @@ static const rpcecho_MIDL_PROC_FORMAT_STRING rpcecho__MIDL_ProcFormatString =
 /* 414 */      NdrFcShort( 0x0 ),      /* 0 */\r
 /* 416 */      NdrFcShort( 0x0 ),      /* 0 */\r
 \r
-       /* Parameter count */\r
+       /* Parameter num_chunks */\r
 \r
 /* 418 */      NdrFcShort( 0x48 ),     /* Flags:  in, base type, */\r
 /* 420 */      NdrFcShort( 0x8 ),      /* x86 Stack size/offset = 8 */\r
 /* 422 */      0x8,            /* FC_LONG */\r
                        0x0,            /* 0 */\r
 \r
-       /* Parameter in_pipe */\r
+       /* Parameter chunk_size */\r
 \r
-/* 424 */      NdrFcShort( 0x10c ),    /* Flags:  pipe, in, simple ref, */\r
+/* 424 */      NdrFcShort( 0x48 ),     /* Flags:  in, base type, */\r
 /* 426 */      NdrFcShort( 0x10 ),     /* x86 Stack size/offset = 16 */\r
-/* 428 */      NdrFcShort( 0xf0 ),     /* Type Offset=240 */\r
+/* 428 */      0x8,            /* FC_LONG */\r
+                       0x0,            /* 0 */\r
 \r
-       /* Return value */\r
+       /* Parameter in_pipe */\r
 \r
-/* 430 */      NdrFcShort( 0x70 ),     /* Flags:  out, return, base type, */\r
+/* 430 */      NdrFcShort( 0x10c ),    /* Flags:  pipe, in, simple ref, */\r
 /* 432 */      NdrFcShort( 0x18 ),     /* x86 Stack size/offset = 24 */\r
-/* 434 */      0x8,            /* FC_LONG */\r
+/* 434 */      NdrFcShort( 0xf0 ),     /* Type Offset=240 */\r
+\r
+       /* Return value */\r
+\r
+/* 436 */      NdrFcShort( 0x70 ),     /* Flags:  out, return, base type, */\r
+/* 438 */      NdrFcShort( 0x20 ),     /* x86 Stack size/offset = 32 */\r
+/* 440 */      0x8,            /* FC_LONG */\r
+                       0x0,            /* 0 */\r
+\r
+       /* Procedure TestBytePipeOut */\r
+\r
+/* 442 */      0x32,           /* FC_BIND_PRIMITIVE */\r
+                       0x48,           /* Old Flags:  */\r
+/* 444 */      NdrFcLong( 0x0 ),       /* 0 */\r
+/* 448 */      NdrFcShort( 0xb ),      /* 11 */\r
+/* 450 */      NdrFcShort( 0x28 ),     /* x86 Stack size/offset = 40 */\r
+/* 452 */      NdrFcShort( 0x10 ),     /* 16 */\r
+/* 454 */      NdrFcShort( 0x8 ),      /* 8 */\r
+/* 456 */      0xcc,           /* Oi2 Flags:  has return, has pipes, has ext, has async handle */\r
+                       0x4,            /* 4 */\r
+/* 458 */      0xa,            /* 10 */\r
+                       0x1,            /* Ext Flags:  new corr desc, */\r
+/* 460 */      NdrFcShort( 0x0 ),      /* 0 */\r
+/* 462 */      NdrFcShort( 0x0 ),      /* 0 */\r
+/* 464 */      NdrFcShort( 0x0 ),      /* 0 */\r
+/* 466 */      NdrFcShort( 0x0 ),      /* 0 */\r
+\r
+       /* Parameter num_chunks */\r
+\r
+/* 468 */      NdrFcShort( 0x48 ),     /* Flags:  in, base type, */\r
+/* 470 */      NdrFcShort( 0x8 ),      /* x86 Stack size/offset = 8 */\r
+/* 472 */      0x8,            /* FC_LONG */\r
+                       0x0,            /* 0 */\r
+\r
+       /* Parameter chunk_size */\r
+\r
+/* 474 */      NdrFcShort( 0x48 ),     /* Flags:  in, base type, */\r
+/* 476 */      NdrFcShort( 0x10 ),     /* x86 Stack size/offset = 16 */\r
+/* 478 */      0x8,            /* FC_LONG */\r
+                       0x0,            /* 0 */\r
+\r
+       /* Parameter out_pipe */\r
+\r
+/* 480 */      NdrFcShort( 0x4114 ),   /* Flags:  pipe, out, simple ref, srv alloc size=16 */\r
+/* 482 */      NdrFcShort( 0x18 ),     /* x86 Stack size/offset = 24 */\r
+/* 484 */      NdrFcShort( 0xfe ),     /* Type Offset=254 */\r
+\r
+       /* Return value */\r
+\r
+/* 486 */      NdrFcShort( 0x70 ),     /* Flags:  out, return, base type, */\r
+/* 488 */      NdrFcShort( 0x20 ),     /* x86 Stack size/offset = 32 */\r
+/* 490 */      0x8,            /* FC_LONG */\r
                        0x0,            /* 0 */\r
 \r
                        0x0\r
@@ -649,6 +701,16 @@ static const rpcecho_MIDL_TYPE_FORMAT_STRING rpcecho__MIDL_TypeFormatString =
 /* 242 */      NdrFcShort( 0xfffc ),   /* Offset= -4 (238) */\r
 /* 244 */      NdrFcShort( 0x1 ),      /* 1 */\r
 /* 246 */      NdrFcShort( 0x1 ),      /* 1 */\r
+/* 248 */      \r
+                       0x11, 0x4,      /* FC_RP [alloced_on_stack] */\r
+/* 250 */      NdrFcShort( 0x4 ),      /* Offset= 4 (254) */\r
+/* 252 */      0x1,            /* FC_BYTE */\r
+                       0x5c,           /* FC_PAD */\r
+/* 254 */      0xb5,           /* FC_PIPE */\r
+                       0x0,            /* 0 */\r
+/* 256 */      NdrFcShort( 0xfffc ),   /* Offset= -4 (252) */\r
+/* 258 */      NdrFcShort( 0x1 ),      /* 1 */\r
+/* 260 */      NdrFcShort( 0x1 ),      /* 1 */\r
 \r
                        0x0\r
         }\r
@@ -666,7 +728,8 @@ static const unsigned short rpcecho_FormatStringOffsetTable[] =
     278,\r
     322,\r
     354,\r
-    392\r
+    392,\r
+    442\r
     };\r
 \r
 \r
@@ -707,11 +770,12 @@ static const RPC_DISPATCH_FUNCTION rpcecho_table[] =
     NdrServerCall2,\r
     NdrServerCall2,\r
     NdrAsyncServerCall,\r
+    NdrAsyncServerCall,\r
     0\r
     };\r
 static const RPC_DISPATCH_TABLE rpcecho_v1_0_DispatchTable = \r
     {\r
-    11,\r
+    12,\r
     (RPC_DISPATCH_FUNCTION*)rpcecho_table\r
     };\r
 \r
@@ -727,7 +791,8 @@ static const SERVER_ROUTINE rpcecho_ServerRoutineTable[] =
     (SERVER_ROUTINE)TestEnum,\r
     (SERVER_ROUTINE)TestSurrounding,\r
     (SERVER_ROUTINE)TestDoublePointer,\r
-    (SERVER_ROUTINE)TestBytePipeIn\r
+    (SERVER_ROUTINE)TestBytePipeIn,\r
+    (SERVER_ROUTINE)TestBytePipeOut\r
     };\r
 \r
 static const MIDL_SERVER_INFO rpcecho_ServerInfo = \r
index 2ce56e90ad6d0d0727132158c6afafb76da8c74e..598a5d3db0c8e9ed7df758c9154ad9510c1862d8 100755 (executable)
@@ -148,28 +148,66 @@ short TestDoublePointer(short ***data)
 
 void TestBytePipeIn(
        PRPC_ASYNC_STATE TestBytePipeIn_AsyncHandle,
-       long count,
+       long num_chunks,
+       long chunk_size,
        ASYNC_BYTE_PIPE *in_pipe)
 {
        long ret;
        byte in_bytes[0x80000];
-       int bytes_count;
+       int in_bytes_count;
+       int i;
 
        printf("TestBytePipeIn: Start\n");
        fflush(stdout);
 
-       do {
-               in_pipe->pull(in_pipe->state, in_bytes, sizeof(in_bytes), &bytes_count);
-               printf("pull bytes_count[%u]\n", bytes_count);
+       in_bytes_count = sizeof(in_bytes);
+       for (i=0; in_bytes_count > 0; i++) {
+               in_bytes_count = sizeof(in_bytes);
+               in_pipe->pull(in_pipe->state, in_bytes, sizeof(byte), &in_bytes_count);
+               printf("pull[%u] bytes_count[%u]\n", i, in_bytes_count);
                fflush(stdout);
-       } while (bytes_count > 0);
+       }
 
        printf("TestBytePipeIn: End\n");
        fflush(stdout);
-       ret = count;
+       ret = i;
        RpcAsyncCompleteCall(TestBytePipeIn_AsyncHandle, &ret);
 }
 
+void TestBytePipeOut(
+       PRPC_ASYNC_STATE TestBytePipeOut_AsyncHandle,
+       long num_chunks,
+       long chunk_size,
+       ASYNC_BYTE_PIPE *out_pipe)
+{
+       long ret;
+       byte *out_bytes = NULL;
+       unsigned long out_alloc_size = 0;
+       unsigned long out_bytes_count = 0;
+       int i = 0;
+
+       printf("TestBytePipeOut: Start\n");
+       fflush(stdout);
+
+       out_alloc_size = chunk_size * sizeof(byte);
+       out_pipe->alloc(out_pipe->state, out_alloc_size, &out_bytes, &out_bytes_count);
+       memset(out_bytes, 0xCC, out_bytes_count * sizeof(byte));
+
+       for (i = 0; i <= num_chunks; i++) {
+               if (i == num_chunks) {
+                       out_bytes_count = 0;
+               }
+               printf("[%u] push outb_len[%u]\n", i, out_bytes_count);
+               fflush(stdout);
+               out_pipe->push(out_pipe->state, out_bytes, out_bytes_count);
+       }
+
+       printf("TestBytePipeOut: End\n");
+       fflush(stdout);
+       ret = i;
+       RpcAsyncCompleteCall(TestBytePipeOut_AsyncHandle, &ret);
+}
+
 void main(int argc, char **argv)
 {
        RPC_STATUS status;