Now creating pipes for OpenHardwareMonitor to connect to.
By reverting client/server communication we work around our access denied error.
1.1 --- a/SoundGraphAccess.cpp Sat Feb 09 17:19:07 2013 +0100
1.2 +++ b/SoundGraphAccess.cpp Fri Apr 12 02:32:34 2013 +0200
1.3 @@ -16,6 +16,7 @@
1.4 //
1.5 #define MAX_LOADSTRING 100
1.6
1.7 +const int BUFFER_SIZE = 256;
1.8
1.9 // Global Variables:
1.10 HINSTANCE hInst = 0; // current instance
1.11 @@ -25,10 +26,10 @@
1.12 //HANDLE gThreadSender = INVALID_HANDLE_VALUE;
1.13 BOOL gQuit=FALSE;
1.14
1.15 -LPTSTR gPipeNameSender = TEXT("\\\\.\\pipe\\sga-sender");
1.16 -LPTSTR gPipeNameReceiver = TEXT("\\\\.\\pipe\\sga-receiver");
1.17 -HANDLE gPipeSender=INVALID_HANDLE_VALUE;
1.18 -HANDLE gPipeReceiver=INVALID_HANDLE_VALUE;
1.19 +LPTSTR gPipeNameInbound = TEXT("\\\\.\\pipe\\sga-inbound");
1.20 +LPTSTR gPipeNameOutbound = TEXT("\\\\.\\pipe\\sga-outbound");
1.21 +HANDLE gPipeInbound=INVALID_HANDLE_VALUE;
1.22 +HANDLE gPipeOutbound=INVALID_HANDLE_VALUE;
1.23
1.24 char gBufferReceiver[256];
1.25 char gBufferSender[256];
1.26 @@ -67,7 +68,50 @@
1.27 const char KMsgIsInit[]="is-init:";
1.28 const char KMsgIsPluginModeEnabled[]="is-plugin-mode-enabled:";
1.29 const char KMsgSetVfdText[]="set-vfd-text:";
1.30 +const char KMsgQuit[]="quit:";
1.31
1.32 +/**
1.33 +Create inbound pipe to receive messages.
1.34 +*/
1.35 +bool CreateInboundPipe()
1.36 + {
1.37 + gPipeInbound = CreateNamedPipe(gPipeNameInbound, PIPE_ACCESS_INBOUND, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, 0, NULL);
1.38 +
1.39 + //could not create named pipe
1.40 + if (gPipeInbound==INVALID_HANDLE_VALUE)
1.41 + return false;
1.42 +
1.43 + //Will complete once a client connects
1.44 + int success = ConnectNamedPipe(gPipeInbound, NULL);
1.45 +
1.46 + //could not connect client
1.47 + if (success == 0)
1.48 + return false;
1.49 +
1.50 + return true;
1.51 + }
1.52 +
1.53 +
1.54 +/**
1.55 +Create outbound pipe to send message
1.56 +*/
1.57 +bool CreateOutboundPipe()
1.58 + {
1.59 + gPipeOutbound = CreateNamedPipe(gPipeNameOutbound, PIPE_ACCESS_OUTBOUND /*| FILE_FLAG_OVERLAPPED*/, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, 0, NULL);
1.60 +
1.61 + //could not create named pipe
1.62 + if (gPipeOutbound==INVALID_HANDLE_VALUE)
1.63 + return false;
1.64 +
1.65 + //Will complete once a client connects
1.66 + int success = ConnectNamedPipe(gPipeOutbound, NULL);
1.67 +
1.68 + //could not connect client
1.69 + if (success == 0)
1.70 + return false;
1.71 +
1.72 + return true;
1.73 + }
1.74
1.75 /**
1.76 Send a message to our server.
1.77 @@ -78,10 +122,16 @@
1.78 char msg[512];
1.79 sprintf(msg,"%s\n",aResponse);
1.80 OutputDebugStringA(msg);
1.81 - WriteFile(gPipeSender, aResponse, strlen(aResponse), &cbWritten, NULL);
1.82 + WriteFile(gPipeOutbound, aResponse, strlen(aResponse), &cbWritten, NULL);
1.83 + if (strlen(aResponse)!=cbWritten)
1.84 + {
1.85 + int err = GetLastError();
1.86 + OutputDebugStringA("ERROR: WriteFile failure!\n");
1.87 + }
1.88 }
1.89
1.90
1.91 +
1.92 /**
1.93 Handle messages from our server.
1.94 */
1.95 @@ -110,7 +160,13 @@
1.96 {
1.97 //IMON API call need to be done from window thread for some reason
1.98 SendMessageToServer(KRspPending);
1.99 - PostMessage(gWnd,WM_IMON_IS_INIT,0,0);
1.100 + PostMessage(gWnd,WM_IMON_IS_INIT,0,0);
1.101 + }
1.102 + else if (strcmp(aMsg,KMsgQuit)==0)
1.103 + {
1.104 + //gQuit=TRUE;
1.105 + SendMessageToServer(KRspDone);
1.106 + DestroyWindow(gWnd);
1.107 }
1.108 else if (strstr(aMsg,KMsgSetVfdText)==aMsg)
1.109 {
1.110 @@ -144,18 +200,20 @@
1.111 */
1.112 DWORD WINAPI ThreadReceiver( LPVOID lpParam )
1.113 {
1.114 +
1.115 + /*
1.116 //Keep on trying to connect on our read pipe
1.117 - while (gPipeReceiver==INVALID_HANDLE_VALUE && !gQuit)
1.118 + while (gPipeInbound==INVALID_HANDLE_VALUE && !gQuit)
1.119 {
1.120 OutputDebugStringA("Trying to connect...\n");
1.121 - gPipeReceiver=CreateFile(gPipeNameReceiver, GENERIC_READ ,0,NULL,OPEN_EXISTING,0,NULL);
1.122 + gPipeInbound=CreateFile(gPipeNameInbound, GENERIC_READ ,0,NULL,OPEN_EXISTING,0,NULL);
1.123 Sleep(1000);
1.124 }
1.125
1.126 OutputDebugStringA("Read pipe open!\n");
1.127 //Now try connecting on our write pipe
1.128 - gPipeSender=CreateFile(gPipeNameSender, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,0,NULL);
1.129 - if (gPipeSender==INVALID_HANDLE_VALUE)
1.130 + gPipeOutbound=CreateFile(gPipeNameOutbound, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,0,NULL);
1.131 + if (gPipeOutbound==INVALID_HANDLE_VALUE)
1.132 {
1.133 int err=GetLastError();
1.134 OutputDebugStringA("ERROR: Write pipe failure!\n");
1.135 @@ -168,11 +226,16 @@
1.136 SendMessageToServer(KRspOpen);
1.137 }
1.138 //
1.139 + */
1.140 +
1.141 +
1.142 + CreateOutboundPipe();
1.143 + CreateInboundPipe();
1.144
1.145 while(!gQuit)
1.146 {
1.147 DWORD cbRead;
1.148 - BOOL success=ReadFile(gPipeReceiver,gBufferReceiver,sizeof(gBufferReceiver),&cbRead, NULL);
1.149 + BOOL success=ReadFile(gPipeInbound,gBufferReceiver,sizeof(gBufferReceiver),&cbRead, NULL);
1.150 if(success)
1.151 {
1.152 gBufferReceiver[cbRead]='\0';
1.153 @@ -195,10 +258,12 @@
1.154 //Try tell our server
1.155 SendMessageToServer(KRspClose);
1.156 //Close our pipes
1.157 - CloseHandle(gPipeReceiver);
1.158 - gPipeReceiver=INVALID_HANDLE_VALUE;
1.159 - CloseHandle(gPipeSender);
1.160 - gPipeSender=INVALID_HANDLE_VALUE;
1.161 + DisconnectNamedPipe(gPipeInbound);
1.162 + CloseHandle(gPipeInbound);
1.163 + gPipeInbound=INVALID_HANDLE_VALUE;
1.164 + DisconnectNamedPipe(gPipeOutbound);
1.165 + CloseHandle(gPipeOutbound);
1.166 + gPipeOutbound=INVALID_HANDLE_VALUE;
1.167 //Quit our application
1.168 PostMessage(gWnd,WM_CLOSE,0,0);
1.169
1.170 @@ -412,16 +477,18 @@
1.171 case WM_DESTROY:
1.172 gQuit=TRUE;
1.173 //To complete write op
1.174 - if (gPipeSender!=INVALID_HANDLE_VALUE)
1.175 + if (gPipeOutbound!=INVALID_HANDLE_VALUE)
1.176 {
1.177 - CloseHandle(gPipeSender);
1.178 - gPipeSender=INVALID_HANDLE_VALUE;
1.179 + DisconnectNamedPipe(gPipeOutbound);
1.180 + CloseHandle(gPipeOutbound);
1.181 + gPipeOutbound=INVALID_HANDLE_VALUE;
1.182 }
1.183 //To complete read op
1.184 - if (gPipeReceiver!=INVALID_HANDLE_VALUE)
1.185 + if (gPipeInbound!=INVALID_HANDLE_VALUE)
1.186 {
1.187 - CloseHandle(gPipeReceiver);
1.188 - gPipeReceiver=INVALID_HANDLE_VALUE;
1.189 + DisconnectNamedPipe(gPipeInbound);
1.190 + CloseHandle(gPipeInbound);
1.191 + gPipeInbound=INVALID_HANDLE_VALUE;
1.192 }
1.193
1.194 WaitForSingleObject(gThreadReceiver,INFINITE);