mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 12:26:32 +00:00
[SERVICES] ScmControlService: Use TransactNamedPipe() instead of successive Write+Read (#7441)
This function combines those that write a message to and read a message from the specified pipe into a single operation. Its usage helps in simplifying the code further.
This commit is contained in:
parent
0f7b021fe6
commit
84f423f030
|
@ -1430,7 +1430,6 @@ ScmControlServiceEx(
|
|||
DWORD PacketSize;
|
||||
DWORD i;
|
||||
PWSTR Ptr;
|
||||
DWORD dwWriteCount = 0;
|
||||
DWORD dwReadCount = 0;
|
||||
OVERLAPPED Overlapped = {0};
|
||||
|
||||
|
@ -1507,70 +1506,26 @@ ScmControlServiceEx(
|
|||
/* Acquire the service control critical section, to synchronize requests */
|
||||
EnterCriticalSection(&ControlServiceCriticalSection);
|
||||
|
||||
bResult = WriteFile(hControlPipe,
|
||||
bResult = TransactNamedPipe(hControlPipe,
|
||||
ControlPacket,
|
||||
PacketSize,
|
||||
&dwWriteCount,
|
||||
&Overlapped);
|
||||
if (!bResult)
|
||||
{
|
||||
dwError = GetLastError();
|
||||
if (dwError == ERROR_IO_PENDING)
|
||||
{
|
||||
DPRINT("WriteFile(%S, %d) returned ERROR_IO_PENDING\n", pServiceName, dwControl);
|
||||
|
||||
dwError = WaitForSingleObject(hControlPipe,
|
||||
PipeTimeout);
|
||||
DPRINT("WaitForSingleObject(%S, %d) returned %lu\n", pServiceName, dwControl, dwError);
|
||||
|
||||
if (dwError == WAIT_TIMEOUT)
|
||||
{
|
||||
DPRINT1("WaitForSingleObject(%S, %d) timed out\n", pServiceName, dwControl);
|
||||
bResult = CancelIo(hControlPipe);
|
||||
if (!bResult)
|
||||
DPRINT1("CancelIo(%S, %d) failed (Error %lu)\n", pServiceName, dwControl, GetLastError());
|
||||
|
||||
dwError = ERROR_SERVICE_REQUEST_TIMEOUT;
|
||||
goto Done;
|
||||
}
|
||||
else if (dwError == WAIT_OBJECT_0)
|
||||
{
|
||||
bResult = GetOverlappedResult(hControlPipe,
|
||||
&Overlapped,
|
||||
&dwWriteCount,
|
||||
TRUE);
|
||||
if (!bResult)
|
||||
{
|
||||
dwError = GetLastError();
|
||||
DPRINT1("GetOverlappedResult(%S, %d) failed (Error %lu)\n", pServiceName, dwControl, dwError);
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("WriteFile(%S, %d) failed (Error %lu)\n", pServiceName, dwControl, dwError);
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
|
||||
/* Read the reply */
|
||||
Overlapped.hEvent = NULL;
|
||||
|
||||
bResult = ReadFile(hControlPipe,
|
||||
&ReplyPacket,
|
||||
sizeof(ReplyPacket),
|
||||
&dwReadCount,
|
||||
&Overlapped);
|
||||
if (!bResult)
|
||||
{
|
||||
/* Fail for any error other than pending IO */
|
||||
dwError = GetLastError();
|
||||
if (dwError == ERROR_IO_PENDING)
|
||||
if (dwError != ERROR_IO_PENDING)
|
||||
{
|
||||
DPRINT("ReadFile(%S, %d) returned ERROR_IO_PENDING\n", pServiceName, dwControl);
|
||||
DPRINT1("TransactNamedPipe(%S, %d) failed (Error %lu)\n", pServiceName, dwControl, dwError);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
dwError = WaitForSingleObject(hControlPipe,
|
||||
PipeTimeout);
|
||||
DPRINT("TransactNamedPipe(%S, %d) returned ERROR_IO_PENDING\n", pServiceName, dwControl);
|
||||
|
||||
dwError = WaitForSingleObject(hControlPipe, PipeTimeout);
|
||||
DPRINT("WaitForSingleObject(%S, %d) returned %lu\n", pServiceName, dwControl, dwError);
|
||||
|
||||
if (dwError == WAIT_TIMEOUT)
|
||||
|
@ -1581,7 +1536,6 @@ ScmControlServiceEx(
|
|||
DPRINT1("CancelIo(%S, %d) failed (Error %lu)\n", pServiceName, dwControl, GetLastError());
|
||||
|
||||
dwError = ERROR_SERVICE_REQUEST_TIMEOUT;
|
||||
goto Done;
|
||||
}
|
||||
else if (dwError == WAIT_OBJECT_0)
|
||||
{
|
||||
|
@ -1593,16 +1547,9 @@ ScmControlServiceEx(
|
|||
{
|
||||
dwError = GetLastError();
|
||||
DPRINT1("GetOverlappedResult(%S, %d) failed (Error %lu)\n", pServiceName, dwControl, dwError);
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("ReadFile(%S, %d) failed (Error %lu)\n", pServiceName, dwControl, dwError);
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
|
||||
Done:
|
||||
/* Release the service control critical section */
|
||||
|
|
Loading…
Reference in a new issue