mirror of
https://github.com/reactos/reactos.git
synced 2024-12-31 19:42:51 +00:00
[RPCRT4]
- Fix overlapped I/O error handling for pipe transport - ROS now works with Windows npfs.sys again (CORE-2198) - Wine has this completely reworked, so this ros-diff should finally disappear with the next sync svn path=/trunk/; revision=57365
This commit is contained in:
parent
3cce9acbab
commit
ff9902d224
2 changed files with 21 additions and 25 deletions
|
@ -438,10 +438,11 @@ static int rpcrt4_conn_np_read(RpcConnection *Connection,
|
|||
{
|
||||
DWORD bytes_read;
|
||||
ret = ReadFile(npc->pipe, buf, bytes_left, &bytes_read, &ovl);
|
||||
if ((!ret || !bytes_read) && (GetLastError() != ERROR_IO_PENDING))
|
||||
break;
|
||||
ret = GetOverlappedResult(npc->pipe, &ovl, &bytes_read, TRUE);
|
||||
if (!ret && (GetLastError() != ERROR_MORE_DATA))
|
||||
if (!ret && GetLastError() == ERROR_IO_PENDING)
|
||||
ret = GetOverlappedResult(npc->pipe, &ovl, &bytes_read, TRUE);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA)
|
||||
ret = TRUE;
|
||||
if (!ret || !bytes_read)
|
||||
break;
|
||||
bytes_left -= bytes_read;
|
||||
buf += bytes_read;
|
||||
|
@ -458,7 +459,7 @@ static int rpcrt4_conn_np_write(RpcConnection *Connection,
|
|||
BOOL ret = TRUE;
|
||||
unsigned int bytes_left = count;
|
||||
OVERLAPPED ovl;
|
||||
|
||||
|
||||
ZeroMemory(&ovl, sizeof(ovl));
|
||||
ovl.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
|
||||
|
||||
|
@ -466,10 +467,9 @@ static int rpcrt4_conn_np_write(RpcConnection *Connection,
|
|||
{
|
||||
DWORD bytes_written;
|
||||
ret = WriteFile(npc->pipe, buf, bytes_left, &bytes_written, &ovl);
|
||||
if ((!ret || !bytes_written) && (GetLastError() != ERROR_IO_PENDING))
|
||||
break;
|
||||
ret = GetOverlappedResult(npc->pipe, &ovl, &bytes_written, TRUE);
|
||||
if (!ret && (GetLastError() != ERROR_MORE_DATA))
|
||||
if (!ret && GetLastError() == ERROR_IO_PENDING)
|
||||
ret = GetOverlappedResult(npc->pipe, &ovl, &bytes_written, TRUE);
|
||||
if (!ret || !bytes_written)
|
||||
break;
|
||||
bytes_left -= bytes_written;
|
||||
buf += bytes_written;
|
||||
|
|
|
@ -127,7 +127,7 @@ Index: rpc_transport.c
|
|||
I_RpcFree(pname);
|
||||
|
||||
return r;
|
||||
@@ -412,18 +429,24 @@ static int rpcrt4_conn_np_read(RpcConnec
|
||||
@@ -412,11 +429,17 @@ static int rpcrt4_conn_np_read(RpcConnec
|
||||
char *buf = buffer;
|
||||
BOOL ret = TRUE;
|
||||
unsigned int bytes_left = count;
|
||||
|
@ -140,15 +140,13 @@ Index: rpc_transport.c
|
|||
{
|
||||
DWORD bytes_read;
|
||||
- ret = ReadFile(npc->pipe, buf, bytes_left, &bytes_read, NULL);
|
||||
- if (!ret && GetLastError() == ERROR_MORE_DATA)
|
||||
- ret = TRUE;
|
||||
- if (!ret || !bytes_read)
|
||||
+ ret = ReadFile(npc->pipe, buf, bytes_left, &bytes_read, &ovl);
|
||||
+ if ((!ret || !bytes_read) && (GetLastError() != ERROR_IO_PENDING))
|
||||
+ break;
|
||||
+ ret = GetOverlappedResult(npc->pipe, &ovl, &bytes_read, TRUE);
|
||||
+ if (!ret && (GetLastError() != ERROR_MORE_DATA))
|
||||
break;
|
||||
+ if (!ret && GetLastError() == ERROR_IO_PENDING)
|
||||
+ ret = GetOverlappedResult(npc->pipe, &ovl, &bytes_read, TRUE);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA)
|
||||
ret = TRUE;
|
||||
if (!ret || !bytes_read)
|
||||
@@ -424,6 +447,7 @@ static int rpcrt4_conn_np_read(RpcConnec
|
||||
bytes_left -= bytes_read;
|
||||
buf += bytes_read;
|
||||
}
|
||||
|
@ -156,12 +154,12 @@ Index: rpc_transport.c
|
|||
return ret ? count : -1;
|
||||
}
|
||||
|
||||
@@ -434,16 +457,24 @@ static int rpcrt4_conn_np_write(RpcConne
|
||||
@@ -434,16 +458,23 @@ static int rpcrt4_conn_np_write(RpcConne
|
||||
const char *buf = buffer;
|
||||
BOOL ret = TRUE;
|
||||
unsigned int bytes_left = count;
|
||||
+ OVERLAPPED ovl;
|
||||
+
|
||||
+
|
||||
+ ZeroMemory(&ovl, sizeof(ovl));
|
||||
+ ovl.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
|
||||
|
||||
|
@ -169,12 +167,10 @@ Index: rpc_transport.c
|
|||
{
|
||||
DWORD bytes_written;
|
||||
- ret = WriteFile(npc->pipe, buf, bytes_left, &bytes_written, NULL);
|
||||
- if (!ret || !bytes_written)
|
||||
+ ret = WriteFile(npc->pipe, buf, bytes_left, &bytes_written, &ovl);
|
||||
+ if ((!ret || !bytes_written) && (GetLastError() != ERROR_IO_PENDING))
|
||||
+ break;
|
||||
+ ret = GetOverlappedResult(npc->pipe, &ovl, &bytes_written, TRUE);
|
||||
+ if (!ret && (GetLastError() != ERROR_MORE_DATA))
|
||||
+ if (!ret && GetLastError() == ERROR_IO_PENDING)
|
||||
+ ret = GetOverlappedResult(npc->pipe, &ovl, &bytes_written, TRUE);
|
||||
if (!ret || !bytes_written)
|
||||
break;
|
||||
bytes_left -= bytes_written;
|
||||
buf += bytes_written;
|
||||
|
|
Loading…
Reference in a new issue