Thursday, August 10, 2006

Named PIPE

BOOL TokNamedPipeInit(void (WINAPI * pFuncCB)(BYTE * buf))

{

// if( !pFuncCB ) return FALSE;



/* Named PIPE를 2개를 만들어서 한 개는 입력으로 한 개는 출력으로 사용한다.

단 Remote에서는 반대로 사용하여야 한다. */

g_hInPipe = CreateNamedPipe("\\\\.\\PIPE\\TOK_BCHS_PIPE_I", PIPE_ACCESS_INBOUND,

PIPE_WAIT, 1, PIPE_BUF_SIZE, PIPE_BUF_SIZE, PIPE_TIMEOUT, NULL);



g_hOutPipe = CreateNamedPipe("\\\\.\\PIPE\\TOK_BCHS_PIPE_O", PIPE_ACCESS_OUTBOUND,

PIPE_WAIT, 1, PIPE_BUF_SIZE, PIPE_BUF_SIZE, PIPE_TIMEOUT, NULL);



if( g_hInPipe == INVALID_HANDLE_VALUE || g_hOutPipe == INVALID_HANDLE_VALUE )

{

if( g_hOutPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hOutPipe);

if( g_hInPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hInPipe);

debug_printf_win(4, "NamedPipe is not opened!");

return FALSE;

}



/* 파라미터로 Callback Function을 등록하도록 하였으며, PIPE를 통해서 데이터가 입력되었을 때 처리하기 위한

스레드를 생성한다. */

g_pPipeFuncCB = pFuncCB;

g_hPipeListener = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) TokListenerProc, NULL, 0, &g_dwPipeThreadId);

if( g_hPipeListener == INVALID_HANDLE_VALUE )

{

debug_printf_win(4, "PipeThread is not created!");

return FALSE;

}



/* PIPE를 통해 IPC 통신을 하기 위한 Remote Application을 실행한다. */

WinExec("C:\\Project\\SP2_PC\\BTUI_App\\BTUIApp.exe", SW_SHOWNORMAL);



return TRUE;

}



void TokNamedPipeDeinit()

{

DWORD dwTemp;



if( g_hOutPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hOutPipe);

if( g_hInPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hInPipe);



if( GetExitCodeThread(g_hPipeListener, &dwTemp) )

{

if( dwTemp == STILL_ACTIVE ) TerminateThread(g_hPipeListener, 3);

}



if (g_hPipeListener != INVALID_HANDLE_VALUE) CloseHandle(g_hPipeListener);

}



DWORD TokListenerProc(void * pParam)

{

BYTE szPipeBuffer[PIPE_BUF_SIZE];

BYTE * pInBuffer;

DWORD dwReadLen;

BOOL bRead;



while( TRUE )

{

bRead = ReadFile(g_hInPipe, szPipeBuffer, PIPE_BUF_SIZE, &dwReadLen, NULL);

if( dwReadLen )

{

BYTE szTempBuffer[255];

if( !bRead ) return 2;



if( *((WORD *)&szPipeBuffer[0]) == 0xFFFF ) break;

pInBuffer = (BYTE *) malloc(dwReadLen);

memcpy(pInBuffer, szPipeBuffer, dwReadLen);



#if 0

/* PIPE를 통해 입력된 Command를 처리하는 함수 */

TokNamedPipeCmdRecv(pInBuffer, dwReadLen);

#else

if( g_pPipeFuncCB ) g_pPipeFuncCB(pInBuffer);

else debug_printf_win(4, (char *) pInBuffer);

#endif

}

Sleep(10);

}

debug_printf_win(4, "PIPE Closed!");

if( g_hOutPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hOutPipe);

if( g_hInPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hInPipe);



return 0;

}

No comments :