2013-03-16 20:41:13 +00:00
|
|
|
/*
|
2010-05-21 19:30:13 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* FILE: subsys/system/dhcp/pipe.c
|
|
|
|
* PURPOSE: DHCP client pipe
|
|
|
|
* PROGRAMMER: arty
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <rosdhcp.h>
|
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
#include <reactos/debug.h>
|
|
|
|
|
|
|
|
#define COMM_PIPE_OUTPUT_BUFFER sizeof(COMM_DHCP_REQ)
|
|
|
|
#define COMM_PIPE_INPUT_BUFFER sizeof(COMM_DHCP_REPLY)
|
|
|
|
#define COMM_PIPE_DEFAULT_TIMEOUT 1000
|
|
|
|
|
2021-08-08 12:09:31 +00:00
|
|
|
DWORD PipeSend( HANDLE CommPipe, COMM_DHCP_REPLY *Reply ) {
|
2010-05-21 19:30:13 +00:00
|
|
|
DWORD Written = 0;
|
2021-08-08 12:09:31 +00:00
|
|
|
OVERLAPPED Overlapped = {0};
|
2010-05-21 19:30:13 +00:00
|
|
|
BOOL Success =
|
|
|
|
WriteFile( CommPipe,
|
|
|
|
Reply,
|
|
|
|
sizeof(*Reply),
|
|
|
|
&Written,
|
2021-08-08 12:09:31 +00:00
|
|
|
&Overlapped);
|
|
|
|
if (!Success)
|
|
|
|
{
|
|
|
|
WaitForSingleObject(CommPipe, INFINITE);
|
|
|
|
Success = GetOverlappedResult(CommPipe,
|
|
|
|
&Overlapped,
|
|
|
|
&Written,
|
|
|
|
TRUE);
|
|
|
|
}
|
|
|
|
|
2010-05-21 19:30:13 +00:00
|
|
|
return Success ? Written : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD WINAPI PipeThreadProc( LPVOID Parameter ) {
|
2011-09-10 23:54:02 +00:00
|
|
|
DWORD BytesRead;
|
2010-05-21 19:30:13 +00:00
|
|
|
COMM_DHCP_REQ Req;
|
|
|
|
COMM_DHCP_REPLY Reply;
|
|
|
|
BOOL Result, Connected;
|
2021-08-08 12:09:31 +00:00
|
|
|
HANDLE Events[2];
|
|
|
|
HANDLE CommPipe;
|
|
|
|
OVERLAPPED Overlapped = {0};
|
|
|
|
DWORD dwError;
|
2010-05-21 19:30:13 +00:00
|
|
|
|
2021-08-08 12:09:31 +00:00
|
|
|
DPRINT("PipeThreadProc(%p)\n", Parameter);
|
|
|
|
|
|
|
|
CommPipe = CreateNamedPipeW
|
|
|
|
( DHCP_PIPE_NAME,
|
|
|
|
PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE | FILE_FLAG_OVERLAPPED,
|
|
|
|
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
|
|
|
|
1,
|
|
|
|
COMM_PIPE_OUTPUT_BUFFER,
|
|
|
|
COMM_PIPE_INPUT_BUFFER,
|
|
|
|
COMM_PIPE_DEFAULT_TIMEOUT,
|
|
|
|
NULL );
|
|
|
|
if (CommPipe == INVALID_HANDLE_VALUE)
|
|
|
|
{
|
|
|
|
DbgPrint("DHCP: Could not create named pipe\n");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
Events[0] = (HANDLE)Parameter;
|
|
|
|
Events[1] = CommPipe;
|
|
|
|
|
|
|
|
while( TRUE )
|
|
|
|
{
|
|
|
|
Connected = ConnectNamedPipe(CommPipe, &Overlapped);
|
|
|
|
if (!Connected)
|
|
|
|
{
|
|
|
|
dwError = GetLastError();
|
|
|
|
if (dwError == ERROR_IO_PENDING)
|
|
|
|
{
|
|
|
|
dwError = WaitForMultipleObjects(2, Events, FALSE, INFINITE);
|
|
|
|
DPRINT("WaitForMultipleObjects() returned %lu\n", dwError);
|
|
|
|
if (dwError == WAIT_OBJECT_0 + 1)
|
|
|
|
{
|
|
|
|
Connected = GetOverlappedResult(CommPipe,
|
|
|
|
&Overlapped,
|
|
|
|
&BytesRead,
|
|
|
|
TRUE);
|
|
|
|
}
|
|
|
|
else if (dwError == WAIT_OBJECT_0)
|
|
|
|
{
|
|
|
|
CancelIo(CommPipe);
|
|
|
|
CloseHandle(CommPipe);
|
|
|
|
CommPipe = INVALID_HANDLE_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-05-21 19:30:13 +00:00
|
|
|
|
|
|
|
if (!Connected) {
|
|
|
|
DbgPrint("DHCP: Could not connect named pipe\n");
|
|
|
|
CloseHandle( CommPipe );
|
|
|
|
CommPipe = INVALID_HANDLE_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-08-08 12:09:31 +00:00
|
|
|
Result = ReadFile(CommPipe, &Req, sizeof(Req), &BytesRead, &Overlapped);
|
|
|
|
if (!Result)
|
|
|
|
{
|
|
|
|
dwError = GetLastError();
|
|
|
|
if (dwError == ERROR_IO_PENDING)
|
|
|
|
{
|
|
|
|
dwError = WaitForMultipleObjects(2, Events, FALSE, INFINITE);
|
|
|
|
DPRINT("WaitForMultipleObjects() returned %lu\n", dwError);
|
|
|
|
if (dwError == WAIT_OBJECT_0 + 1)
|
|
|
|
{
|
|
|
|
Result = GetOverlappedResult(CommPipe,
|
|
|
|
&Overlapped,
|
|
|
|
&BytesRead,
|
|
|
|
TRUE);
|
|
|
|
}
|
|
|
|
else if (dwError == WAIT_OBJECT_0)
|
|
|
|
{
|
|
|
|
CancelIo(CommPipe);
|
|
|
|
DisconnectNamedPipe( CommPipe );
|
|
|
|
CloseHandle(CommPipe);
|
|
|
|
CommPipe = INVALID_HANDLE_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-05-21 19:30:13 +00:00
|
|
|
if( Result ) {
|
|
|
|
switch( Req.Type ) {
|
|
|
|
case DhcpReqQueryHWInfo:
|
2021-08-08 12:09:31 +00:00
|
|
|
DSQueryHWInfo( PipeSend, CommPipe, &Req );
|
2010-05-21 19:30:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DhcpReqLeaseIpAddress:
|
2021-08-08 12:09:31 +00:00
|
|
|
DSLeaseIpAddress( PipeSend, CommPipe, &Req );
|
2010-05-21 19:30:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DhcpReqReleaseIpAddress:
|
2021-08-08 12:09:31 +00:00
|
|
|
DSReleaseIpAddressLease( PipeSend, CommPipe, &Req );
|
2010-05-21 19:30:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DhcpReqRenewIpAddress:
|
2021-08-08 12:09:31 +00:00
|
|
|
DSRenewIpAddressLease( PipeSend, CommPipe, &Req );
|
2010-05-21 19:30:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DhcpReqStaticRefreshParams:
|
2021-08-08 12:09:31 +00:00
|
|
|
DSStaticRefreshParams( PipeSend, CommPipe, &Req );
|
2010-05-21 19:30:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DhcpReqGetAdapterInfo:
|
2021-08-08 12:09:31 +00:00
|
|
|
DSGetAdapterInfo( PipeSend, CommPipe, &Req );
|
2010-05-21 19:30:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
DPRINT1("Unrecognized request type %d\n", Req.Type);
|
|
|
|
ZeroMemory( &Reply, sizeof( COMM_DHCP_REPLY ) );
|
|
|
|
Reply.Reply = 0;
|
2021-08-08 12:09:31 +00:00
|
|
|
PipeSend(CommPipe, &Reply );
|
2010-05-21 19:30:13 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
DisconnectNamedPipe( CommPipe );
|
|
|
|
}
|
|
|
|
|
2021-08-08 12:09:31 +00:00
|
|
|
DPRINT("Pipe thread stopped!\n");
|
2010-05-21 19:30:13 +00:00
|
|
|
|
2021-08-08 12:09:31 +00:00
|
|
|
return TRUE;
|
2010-05-21 19:30:13 +00:00
|
|
|
}
|
|
|
|
|
2021-08-08 12:09:31 +00:00
|
|
|
HANDLE PipeInit(HANDLE hStopEvent)
|
|
|
|
{
|
|
|
|
return CreateThread( NULL, 0, PipeThreadProc, (LPVOID)hStopEvent, 0, NULL);
|
2010-05-21 19:30:13 +00:00
|
|
|
}
|