[ros-diffs] [dchapyshev] 37396: - Implement BindIoCompletionCallback, ReadFileScatter, WriteFileGather (based on Wine) - Move DnsHostnameToComputerNameA/W to computername.c

dchapyshev at svn.reactos.org dchapyshev at svn.reactos.org
Mon Nov 17 12:53:59 CET 2008


Author: dchapyshev
Date: Mon Nov 17 05:53:59 2008
New Revision: 37396

URL: http://svn.reactos.org/svn/reactos?rev=37396&view=rev
Log:
- Implement BindIoCompletionCallback, ReadFileScatter, WriteFileGather (based on Wine)
- Move DnsHostnameToComputerNameA/W to computername.c

Modified:
    trunk/reactos/dll/win32/kernel32/misc/computername.c
    trunk/reactos/dll/win32/kernel32/misc/stubs.c

Modified: trunk/reactos/dll/win32/kernel32/misc/computername.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/computername.c?rev=37396&r1=37395&r2=37396&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/computername.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/computername.c [iso-8859-1] Mon Nov 17 05:53:59 2008
@@ -461,4 +461,73 @@
   }
 }
 
+
+/*
+ * @implemented
+ */
+BOOL
+STDCALL
+DnsHostnameToComputerNameA(LPCSTR Hostname,
+                           LPSTR ComputerName,
+                           LPDWORD nSize)
+{
+    DWORD len;
+
+    DPRINT("(%s, %p, %p)\n", Hostname, ComputerName, nSize);
+
+    if (!Hostname || !nSize)
+        return FALSE;
+
+    len = lstrlenA(Hostname);
+
+    if (len > MAX_COMPUTERNAME_LENGTH)
+        len = MAX_COMPUTERNAME_LENGTH;
+
+    if (*nSize < len)
+    {
+        *nSize = len;
+        return FALSE;
+    }
+
+    if (!ComputerName) return FALSE;
+
+    memcpy( ComputerName, Hostname, len );
+    ComputerName[len + 1] = 0;
+    return TRUE;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+STDCALL
+DnsHostnameToComputerNameW (
+	LPCWSTR hostname,
+    LPWSTR computername,
+	LPDWORD size
+    )
+{
+    DWORD len;
+
+    DPRINT("(%s, %p, %p): stub\n", hostname, computername, size);
+
+    if (!hostname || !size) return FALSE;
+    len = lstrlenW(hostname);
+
+    if (len > MAX_COMPUTERNAME_LENGTH)
+        len = MAX_COMPUTERNAME_LENGTH;
+
+    if (*size < len)
+    {
+        *size = len;
+        return FALSE;
+    }
+    if (!computername) return FALSE;
+
+    memcpy( computername, hostname, len * sizeof(WCHAR) );
+    computername[len + 1] = 0;
+    return TRUE;
+}
+
 /* EOF */

Modified: trunk/reactos/dll/win32/kernel32/misc/stubs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/stubs.c?rev=37396&r1=37395&r2=37396&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/stubs.c [iso-8859-1] Mon Nov 17 05:53:59 2008
@@ -342,18 +342,29 @@
 }
 
 /*
- * @unimplemented
- */
-BOOL
-STDCALL
-BindIoCompletionCallback (
-    HANDLE FileHandle,
-    LPOVERLAPPED_COMPLETION_ROUTINE Function,
-    ULONG Flags
-    )
-{
-    STUB;
-    return 0;
+ * @implemented
+ */
+BOOL
+STDCALL
+BindIoCompletionCallback(HANDLE FileHandle,
+                         LPOVERLAPPED_COMPLETION_ROUTINE Function,
+                         ULONG Flags)
+{
+    NTSTATUS Status = 0;
+
+    DPRINT("(%p, %p, %d)\n", FileHandle, Function, Flags);
+
+    Status = RtlSetIoCompletionCallback(FileHandle,
+                                        (PRTL_OVERLAPPED_COMPLETION_ROUTINE) Function,
+                                        Flags);
+
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 /*
@@ -562,20 +573,45 @@
 }
 
 /*
- * @unimplemented
- */
-BOOL
-STDCALL
-ReadFileScatter(
-    HANDLE hFile,
-    FILE_SEGMENT_ELEMENT aSegmentArray[],
-    DWORD nNumberOfBytesToRead,
-    LPDWORD lpReserved,
-    LPOVERLAPPED lpOverlapped
-    )
-{
-    STUB;
-    return 0;
+ * @implemented
+ */
+BOOL
+STDCALL
+ReadFileScatter(HANDLE hFile,
+                FILE_SEGMENT_ELEMENT aSegmentArray[],
+                DWORD nNumberOfBytesToRead,
+                LPDWORD lpReserved,
+                LPOVERLAPPED lpOverlapped)
+{
+    PIO_STATUS_BLOCK pIOStatus;
+    LARGE_INTEGER Offset;
+    NTSTATUS Status;
+
+    DPRINT("(%p %p %u %p)\n", hFile, aSegmentArray, nNumberOfBytesToRead, lpOverlapped);
+
+    Offset.LowPart  = lpOverlapped->Offset;
+    Offset.HighPart = lpOverlapped->OffsetHigh;
+    pIOStatus = (PIO_STATUS_BLOCK) lpOverlapped;
+    pIOStatus->Status = STATUS_PENDING;
+    pIOStatus->Information = 0;
+
+    Status = NtReadFileScatter(hFile,
+                               NULL,
+                               NULL,
+                               NULL,
+                               pIOStatus,
+                               aSegmentArray,
+                               nNumberOfBytesToRead,
+                               &Offset,
+                               NULL);
+
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 /*
@@ -678,20 +714,45 @@
 }
 
 /*
- * @unimplemented
- */
-BOOL
-STDCALL
-WriteFileGather(
-    HANDLE hFile,
-    FILE_SEGMENT_ELEMENT aSegmentArray[],
-    DWORD nNumberOfBytesToWrite,
-    LPDWORD lpReserved,
-    LPOVERLAPPED lpOverlapped
-    )
-{
-    STUB;
-    return 0;
+ * @implemented
+ */
+BOOL
+STDCALL
+WriteFileGather(HANDLE hFile,
+                FILE_SEGMENT_ELEMENT aSegmentArray[],
+                DWORD nNumberOfBytesToWrite,
+                LPDWORD lpReserved,
+                LPOVERLAPPED lpOverlapped)
+{
+    PIO_STATUS_BLOCK IOStatus;
+    LARGE_INTEGER Offset;
+    NTSTATUS Status;
+
+    DPRINT("%p %p %u %p\n", hFile, aSegmentArray, nNumberOfBytesToWrite, lpOverlapped);
+
+    Offset.LowPart = lpOverlapped->Offset;
+    Offset.HighPart = lpOverlapped->OffsetHigh;
+    IOStatus = (PIO_STATUS_BLOCK) lpOverlapped;
+    IOStatus->Status = STATUS_PENDING;
+    IOStatus->Information = 0;
+
+    Status = NtWriteFileGather(hFile,
+                               NULL,
+                               NULL,
+                               NULL,
+                               IOStatus,
+                               aSegmentArray,
+                               nNumberOfBytesToWrite,
+                               &Offset,
+                               NULL);
+
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 /*
@@ -705,39 +766,6 @@
 {
     STUB;
     return 0;
-}
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-DnsHostnameToComputerNameW (
-	LPCWSTR hostname,
-    LPWSTR computername,
-	LPDWORD size
-    )
-{
-    DWORD len;
-
-    DPRINT("(%s, %p, %p): stub\n", hostname, computername, size);
-
-    if (!hostname || !size) return FALSE;
-    len = lstrlenW(hostname);
-
-    if (len > MAX_COMPUTERNAME_LENGTH)
-        len = MAX_COMPUTERNAME_LENGTH;
-
-    if (*size < len)
-    {
-        *size = len;
-        return FALSE;
-    }
-    if (!computername) return FALSE;
-
-    memcpy( computername, hostname, len * sizeof(WCHAR) );
-    computername[len + 1] = 0;
-    return TRUE;
 }
 
 /*
@@ -919,21 +947,6 @@
 /*
  * @unimplemented
  */
-BOOL
-STDCALL
-DnsHostnameToComputerNameA (
-    LPCSTR Hostname,
-    LPSTR ComputerName,
-    LPDWORD nSize
-    )
-{
-    STUB;
-    return 0;
-}
-
-/*
- * @unimplemented
- */
 HANDLE
 STDCALL
 FindFirstVolumeMountPointA(
@@ -947,23 +960,22 @@
 }
 
 /*
- * @unimplemented
- */
-BOOL
-STDCALL
-FindNextVolumeA(
-	HANDLE handle,
-	LPSTR volume,
-	DWORD len
-    )
-{
-    WCHAR *buffer = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+ * @implemented
+ */
+BOOL
+STDCALL
+FindNextVolumeA(HANDLE handle,
+                LPSTR volume,
+                DWORD len)
+{
+    WCHAR *buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
     BOOL ret;
 
     if ((ret = FindNextVolumeW( handle, buffer, len )))
     {
         if (!WideCharToMultiByte( CP_ACP, 0, buffer, -1, volume, len, NULL, NULL )) ret = FALSE;
     }
+
     HeapFree( GetProcessHeap(), 0, buffer );
     return ret;
 }



More information about the Ros-diffs mailing list