Now creating pipes for OpenHardwareMonitor to connect to.
authorStephaneLenclud
Fri, 12 Apr 2013 02:32:34 +0200
changeset 6f1413622948f
parent 5 d8eb6be0f3d5
child 7 ad71cf47d037
Now creating pipes for OpenHardwareMonitor to connect to.
By reverting client/server communication we work around our access denied error.
SoundGraphAccess.cpp
     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);