- Scream a little louder about unimplemented IOCTL codes
authorGé van Geldorp <ge@gse.nl>
Sun, 8 Jan 2006 20:50:08 +0000 (20:50 +0000)
committerGé van Geldorp <ge@gse.nl>
Sun, 8 Jan 2006 20:50:08 +0000 (20:50 +0000)
- Work around missing FSCTL_PIPE_TRANSCEIVE implementation

svn path=/trunk/; revision=20729

reactos/drivers/fs/np/fsctrl.c
reactos/lib/kernel32/file/npipe.c

index a148860..b4016d1 100644 (file)
@@ -394,7 +394,7 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
   switch (IoStack->Parameters.FileSystemControl.FsControlCode)
     {
       case FSCTL_PIPE_ASSIGN_EVENT:
   switch (IoStack->Parameters.FileSystemControl.FsControlCode)
     {
       case FSCTL_PIPE_ASSIGN_EVENT:
-       DPRINT("Assign event\n");
+       DPRINT1("Assign event not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
@@ -414,12 +414,14 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
        break;
 
       case FSCTL_PIPE_QUERY_EVENT:
        break;
 
       case FSCTL_PIPE_QUERY_EVENT:
-       DPRINT("Query event\n");
+       DPRINT1("Query event not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_TRANSCEIVE:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_TRANSCEIVE:
-       DPRINT("Transceive\n");
+       /* If you implement this, please remove the workaround in
+          lib/kernel32/file/npipe.c function TransactNamedPipe() */
+       DPRINT1("Transceive not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
@@ -429,42 +431,43 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
        break;
 
       case FSCTL_PIPE_IMPERSONATE:
        break;
 
       case FSCTL_PIPE_IMPERSONATE:
-       DPRINT("Impersonate\n");
+       DPRINT1("Impersonate not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_SET_CLIENT_PROCESS:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_SET_CLIENT_PROCESS:
-       DPRINT("Set client process\n");
+       DPRINT1("Set client process not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_QUERY_CLIENT_PROCESS:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_QUERY_CLIENT_PROCESS:
-       DPRINT("Query client process\n");
+       DPRINT1("Query client process not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_INTERNAL_READ:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_INTERNAL_READ:
-       DPRINT("Internal read\n");
+       DPRINT1("Internal read not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_INTERNAL_WRITE:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_INTERNAL_WRITE:
-       DPRINT("Internal write\n");
+       DPRINT1("Internal write not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_INTERNAL_TRANSCEIVE:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_INTERNAL_TRANSCEIVE:
-       DPRINT("Internal transceive\n");
+       DPRINT1("Internal transceive not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_INTERNAL_READ_OVFLOW:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       case FSCTL_PIPE_INTERNAL_READ_OVFLOW:
-       DPRINT("Internal read overflow\n");
+       DPRINT1("Internal read overflow not implemented\n");
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       default:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
       default:
-       DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.FsControlCode);
+       DPRINT1("Unrecognized IoControlCode: %x\n",
+              IoStack->Parameters.FileSystemControl.FsControlCode);
        Status = STATUS_UNSUCCESSFUL;
     }
 
        Status = STATUS_UNSUCCESSFUL;
     }
 
index 8d46e1a..97f35ca 100644 (file)
@@ -1150,6 +1150,7 @@ TransactNamedPipe(IN HANDLE hNamedPipe,
      }
    else
      {
      }
    else
      {
+#if 0 /* We don't implement FSCTL_PIPE_TRANSCEIVE yet */
         IO_STATUS_BLOCK Iosb;
 
         Status = NtFsControlFile(hNamedPipe,
         IO_STATUS_BLOCK Iosb;
 
         Status = NtFsControlFile(hNamedPipe,
@@ -1187,6 +1188,31 @@ TransactNamedPipe(IN HANDLE hNamedPipe,
              SetLastErrorByStatus(Status);
              return FALSE;
           }
              SetLastErrorByStatus(Status);
              return FALSE;
           }
+#else /* Workaround while FSCTL_PIPE_TRANSCEIVE not available */
+        DWORD nActualBytes;
+
+        while (0 != nInBufferSize &&
+               WriteFile(hNamedPipe, lpInBuffer, nInBufferSize, &nActualBytes,
+                         NULL))
+          {
+             lpInBuffer = (LPVOID)((char *) lpInBuffer + nActualBytes);
+             nInBufferSize -= nActualBytes;
+          }
+        if (0 != nInBufferSize)
+          {
+             /* Must have dropped out of the while 'cause WriteFile failed */
+             return FALSE;
+          }
+        if (! ReadFile(hNamedPipe, lpOutBuffer, nOutBufferSize, &nActualBytes,
+                       NULL))
+          {
+             return FALSE;
+          }
+        if (NULL != lpBytesRead)
+          {
+            *lpBytesRead = nActualBytes;
+          }
+#endif
      }
 
    return TRUE;
      }
 
    return TRUE;