# HG changeset patch # User StephaneLenclud # Date 1365726754 -7200 # Node ID f1413622948fafdab594547eafb265d3c5672000 # Parent d8eb6be0f3d5e1451b6ed334c06063b032bceb08 Now creating pipes for OpenHardwareMonitor to connect to. By reverting client/server communication we work around our access denied error. diff -r d8eb6be0f3d5 -r f1413622948f SoundGraphAccess.cpp --- a/SoundGraphAccess.cpp Sat Feb 09 17:19:07 2013 +0100 +++ b/SoundGraphAccess.cpp Fri Apr 12 02:32:34 2013 +0200 @@ -16,6 +16,7 @@ // #define MAX_LOADSTRING 100 +const int BUFFER_SIZE = 256; // Global Variables: HINSTANCE hInst = 0; // current instance @@ -25,10 +26,10 @@ //HANDLE gThreadSender = INVALID_HANDLE_VALUE; BOOL gQuit=FALSE; -LPTSTR gPipeNameSender = TEXT("\\\\.\\pipe\\sga-sender"); -LPTSTR gPipeNameReceiver = TEXT("\\\\.\\pipe\\sga-receiver"); -HANDLE gPipeSender=INVALID_HANDLE_VALUE; -HANDLE gPipeReceiver=INVALID_HANDLE_VALUE; +LPTSTR gPipeNameInbound = TEXT("\\\\.\\pipe\\sga-inbound"); +LPTSTR gPipeNameOutbound = TEXT("\\\\.\\pipe\\sga-outbound"); +HANDLE gPipeInbound=INVALID_HANDLE_VALUE; +HANDLE gPipeOutbound=INVALID_HANDLE_VALUE; char gBufferReceiver[256]; char gBufferSender[256]; @@ -67,7 +68,50 @@ const char KMsgIsInit[]="is-init:"; const char KMsgIsPluginModeEnabled[]="is-plugin-mode-enabled:"; const char KMsgSetVfdText[]="set-vfd-text:"; +const char KMsgQuit[]="quit:"; +/** +Create inbound pipe to receive messages. +*/ +bool CreateInboundPipe() + { + gPipeInbound = CreateNamedPipe(gPipeNameInbound, PIPE_ACCESS_INBOUND, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, 0, NULL); + + //could not create named pipe + if (gPipeInbound==INVALID_HANDLE_VALUE) + return false; + + //Will complete once a client connects + int success = ConnectNamedPipe(gPipeInbound, NULL); + + //could not connect client + if (success == 0) + return false; + + return true; + } + + +/** +Create outbound pipe to send message +*/ +bool CreateOutboundPipe() + { + gPipeOutbound = CreateNamedPipe(gPipeNameOutbound, PIPE_ACCESS_OUTBOUND /*| FILE_FLAG_OVERLAPPED*/, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, 0, NULL); + + //could not create named pipe + if (gPipeOutbound==INVALID_HANDLE_VALUE) + return false; + + //Will complete once a client connects + int success = ConnectNamedPipe(gPipeOutbound, NULL); + + //could not connect client + if (success == 0) + return false; + + return true; + } /** Send a message to our server. @@ -78,10 +122,16 @@ char msg[512]; sprintf(msg,"%s\n",aResponse); OutputDebugStringA(msg); - WriteFile(gPipeSender, aResponse, strlen(aResponse), &cbWritten, NULL); + WriteFile(gPipeOutbound, aResponse, strlen(aResponse), &cbWritten, NULL); + if (strlen(aResponse)!=cbWritten) + { + int err = GetLastError(); + OutputDebugStringA("ERROR: WriteFile failure!\n"); + } } + /** Handle messages from our server. */ @@ -110,7 +160,13 @@ { //IMON API call need to be done from window thread for some reason SendMessageToServer(KRspPending); - PostMessage(gWnd,WM_IMON_IS_INIT,0,0); + PostMessage(gWnd,WM_IMON_IS_INIT,0,0); + } + else if (strcmp(aMsg,KMsgQuit)==0) + { + //gQuit=TRUE; + SendMessageToServer(KRspDone); + DestroyWindow(gWnd); } else if (strstr(aMsg,KMsgSetVfdText)==aMsg) { @@ -144,18 +200,20 @@ */ DWORD WINAPI ThreadReceiver( LPVOID lpParam ) { + + /* //Keep on trying to connect on our read pipe - while (gPipeReceiver==INVALID_HANDLE_VALUE && !gQuit) + while (gPipeInbound==INVALID_HANDLE_VALUE && !gQuit) { OutputDebugStringA("Trying to connect...\n"); - gPipeReceiver=CreateFile(gPipeNameReceiver, GENERIC_READ ,0,NULL,OPEN_EXISTING,0,NULL); + gPipeInbound=CreateFile(gPipeNameInbound, GENERIC_READ ,0,NULL,OPEN_EXISTING,0,NULL); Sleep(1000); } OutputDebugStringA("Read pipe open!\n"); //Now try connecting on our write pipe - gPipeSender=CreateFile(gPipeNameSender, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,0,NULL); - if (gPipeSender==INVALID_HANDLE_VALUE) + gPipeOutbound=CreateFile(gPipeNameOutbound, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,0,NULL); + if (gPipeOutbound==INVALID_HANDLE_VALUE) { int err=GetLastError(); OutputDebugStringA("ERROR: Write pipe failure!\n"); @@ -168,11 +226,16 @@ SendMessageToServer(KRspOpen); } // + */ + + + CreateOutboundPipe(); + CreateInboundPipe(); while(!gQuit) { DWORD cbRead; - BOOL success=ReadFile(gPipeReceiver,gBufferReceiver,sizeof(gBufferReceiver),&cbRead, NULL); + BOOL success=ReadFile(gPipeInbound,gBufferReceiver,sizeof(gBufferReceiver),&cbRead, NULL); if(success) { gBufferReceiver[cbRead]='\0'; @@ -195,10 +258,12 @@ //Try tell our server SendMessageToServer(KRspClose); //Close our pipes - CloseHandle(gPipeReceiver); - gPipeReceiver=INVALID_HANDLE_VALUE; - CloseHandle(gPipeSender); - gPipeSender=INVALID_HANDLE_VALUE; + DisconnectNamedPipe(gPipeInbound); + CloseHandle(gPipeInbound); + gPipeInbound=INVALID_HANDLE_VALUE; + DisconnectNamedPipe(gPipeOutbound); + CloseHandle(gPipeOutbound); + gPipeOutbound=INVALID_HANDLE_VALUE; //Quit our application PostMessage(gWnd,WM_CLOSE,0,0); @@ -412,16 +477,18 @@ case WM_DESTROY: gQuit=TRUE; //To complete write op - if (gPipeSender!=INVALID_HANDLE_VALUE) + if (gPipeOutbound!=INVALID_HANDLE_VALUE) { - CloseHandle(gPipeSender); - gPipeSender=INVALID_HANDLE_VALUE; + DisconnectNamedPipe(gPipeOutbound); + CloseHandle(gPipeOutbound); + gPipeOutbound=INVALID_HANDLE_VALUE; } //To complete read op - if (gPipeReceiver!=INVALID_HANDLE_VALUE) + if (gPipeInbound!=INVALID_HANDLE_VALUE) { - CloseHandle(gPipeReceiver); - gPipeReceiver=INVALID_HANDLE_VALUE; + DisconnectNamedPipe(gPipeInbound); + CloseHandle(gPipeInbound); + gPipeInbound=INVALID_HANDLE_VALUE; } WaitForSingleObject(gThreadReceiver,INFINITE);