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/co…
==============================================================================
--- 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/st…
==============================================================================
--- 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;
}