From ff9902d2243198820215694662b8484019a497b6 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sat, 22 Sep 2012 12:47:03 +0000 Subject: [PATCH] [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 --- reactos/dll/win32/rpcrt4/rpc_transport.c | 18 +++++++-------- reactos/dll/win32/rpcrt4/rpcrt4_ros.diff | 28 ++++++++++-------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/reactos/dll/win32/rpcrt4/rpc_transport.c b/reactos/dll/win32/rpcrt4/rpc_transport.c index 7f729553915..1ec0fc6b667 100644 --- a/reactos/dll/win32/rpcrt4/rpc_transport.c +++ b/reactos/dll/win32/rpcrt4/rpc_transport.c @@ -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; diff --git a/reactos/dll/win32/rpcrt4/rpcrt4_ros.diff b/reactos/dll/win32/rpcrt4/rpcrt4_ros.diff index 16555776d2b..48b0e731684 100644 --- a/reactos/dll/win32/rpcrt4/rpcrt4_ros.diff +++ b/reactos/dll/win32/rpcrt4/rpcrt4_ros.diff @@ -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; -- 2.17.1