scroll mode for very long start menus
[reactos.git] / reactos / apps / tests / nptest / npclient.c
1 #include <windows.h>
2
3 VOID MyErrExit(LPTSTR Message)
4 {
5 // MessageBox(NULL, Message, NULL, MB_OK);
6 puts(Message);
7 ExitProcess(0);
8 }
9
10 int main(int argc, char *argv[])
11 {
12 HANDLE hPipe;
13 LPVOID lpvMessage;
14 CHAR chBuf[512];
15 BOOL fSuccess;
16 DWORD cbRead, cbWritten, dwMode;
17 LPTSTR lpszPipename = "\\\\.\\pipe\\mynamedpipe";
18
19 // Try to open a named pipe; wait for it, if necessary.
20
21 while (1)
22 {
23 hPipe = CreateFile(
24 lpszPipename, // pipe name
25 GENERIC_READ | // read and write access
26 GENERIC_WRITE,
27 0, // no sharing
28 NULL, // no security attributes
29 OPEN_EXISTING, // opens existing pipe
30 0, // default attributes
31 NULL); // no template file
32
33 // Break if the pipe handle is valid.
34
35 if (hPipe != INVALID_HANDLE_VALUE)
36 break;
37
38 // Exit if an error other than ERROR_PIPE_BUSY occurs.
39
40 if (GetLastError() != ERROR_PIPE_BUSY)
41 MyErrExit("Could not open pipe");
42
43 // All pipe instances are busy, so wait for 20 seconds.
44
45 if (! WaitNamedPipe(lpszPipename, 20000) )
46 MyErrExit("Could not open pipe");
47 }
48
49 // The pipe connected; change to message-read mode.
50
51 dwMode = PIPE_READMODE_MESSAGE;
52 fSuccess = SetNamedPipeHandleState(
53 hPipe, // pipe handle
54 &dwMode, // new pipe mode
55 NULL, // don't set maximum bytes
56 NULL); // don't set maximum time
57 if (!fSuccess)
58 MyErrExit("SetNamedPipeHandleState");
59
60 // Send a message to the pipe server.
61
62 lpvMessage = (argc > 1) ? argv[1] : "default message";
63
64 fSuccess = WriteFile(
65 hPipe, // pipe handle
66 lpvMessage, // message
67 strlen(lpvMessage) + 1, // message length
68 &cbWritten, // bytes written
69 NULL); // not overlapped
70 if (! fSuccess)
71 MyErrExit("WriteFile");
72
73 do
74 {
75 // Read from the pipe.
76
77 fSuccess = ReadFile(
78 hPipe, // pipe handle
79 chBuf, // buffer to receive reply
80 512, // size of buffer
81 &cbRead, // number of bytes read
82 NULL); // not overlapped
83
84 if (! fSuccess && GetLastError() != ERROR_MORE_DATA)
85 break;
86
87 // Reply from the pipe is written to STDOUT.
88
89 if (! WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
90 chBuf, cbRead, &cbWritten, NULL))
91 {
92 break;
93 }
94
95 } while (! fSuccess); // repeat loop if ERROR_MORE_DATA
96
97 CloseHandle(hPipe);
98
99 return 0;
100 }