ntdll/kernel32: #29
Eric Pouech
pouech-eric at wanadoo.fr
Sat Jun 21 07:18:50 CDT 2003
- start moving a few file related functions from files/file.c to
dlls/kernel subdir (also splitting 16bit APIs in a separate file)
- implemented ntdll.Nt{Lock|Unlock}File, and made use of those for the
kernel32 equivalent
- implemented a few information classes in NtQueryInformationFile and
NtSetInformationFile (still lots of missing classes)
- enhanced the get_file_info server request in order to implement
correctly NtQueryInformationFile (change time & file alloc size)
- rewrote registry loading to comply with latest changes
A+
--
Eric Pouech
-------------- next part --------------
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/kernel28/file16.c dlls/kernel/file16.c
--- dlls/kernel28/file16.c 1970-01-01 01:00:00.000000000 +0100
+++ dlls/kernel/file16.c 2003-06-21 11:43:41.000000000 +0200
@@ -0,0 +1,221 @@
+/*
+ * File handling functions
+ *
+ * Copyright 1993 John Burton
+ * Copyright 1996 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * TODO:
+ * Fix the CopyFileEx methods to implement the "extended" functionality.
+ * Right now, they simply call the CopyFile method.
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdio.h>
+#include <assert.h>
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "winerror.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winternl.h"
+#include "wine/winbase16.h"
+#include "wine/server.h"
+
+#include "msdos.h"
+#include "kernel_private.h"
+
+#include "wine/unicode.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(file);
+
+/***********************************************************************
+ * _hread16 (KERNEL.349)
+ */
+LONG WINAPI _hread16( HFILE16 hFile, LPVOID buffer, LONG count)
+{
+ return _lread( (HFILE)DosFileHandleToWin32Handle(hFile), buffer, count );
+}
+
+
+/***********************************************************************
+ * _hwrite (KERNEL.350)
+ */
+LONG WINAPI _hwrite16( HFILE16 hFile, LPCSTR buffer, LONG count )
+{
+ return _hwrite( (HFILE)DosFileHandleToWin32Handle(hFile), buffer, count );
+}
+
+
+/***********************************************************************
+ * _lcreat (KERNEL.83)
+ */
+HFILE16 WINAPI _lcreat16( LPCSTR path, INT16 attr )
+{
+ return Win32HandleToDosFileHandle( (HANDLE)_lcreat( path, attr ) );
+}
+
+/***********************************************************************
+ * _llseek (KERNEL.84)
+ *
+ * FIXME:
+ * Seeking before the start of the file should be allowed for _llseek16,
+ * but cause subsequent I/O operations to fail (cf. interrupt list)
+ *
+ */
+LONG WINAPI _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
+{
+ return SetFilePointer( DosFileHandleToWin32Handle(hFile), lOffset, NULL, nOrigin );
+}
+
+
+/***********************************************************************
+ * _lopen (KERNEL.85)
+ */
+HFILE16 WINAPI _lopen16( LPCSTR path, INT16 mode )
+{
+ return Win32HandleToDosFileHandle( (HANDLE)_lopen( path, mode ) );
+}
+
+
+/***********************************************************************
+ * _lread16 (KERNEL.82)
+ */
+UINT16 WINAPI _lread16( HFILE16 hFile, LPVOID buffer, UINT16 count )
+{
+ return (UINT16)_lread((HFILE)DosFileHandleToWin32Handle(hFile), buffer, (LONG)count );
+}
+
+
+/***********************************************************************
+ * _lwrite (KERNEL.86)
+ */
+UINT16 WINAPI _lwrite16( HFILE16 hFile, LPCSTR buffer, UINT16 count )
+{
+ return (UINT16)_hwrite( (HFILE)DosFileHandleToWin32Handle(hFile), buffer, (LONG)count );
+}
+
+/***********************************************************************
+ * _hread (KERNEL.349)
+ */
+LONG WINAPI WIN16_hread( HFILE16 hFile, SEGPTR buffer, LONG count )
+{
+ LONG maxlen;
+
+ TRACE("%d %08lx %ld\n", hFile, (DWORD)buffer, count );
+
+ /* Some programs pass a count larger than the allocated buffer */
+ maxlen = GetSelectorLimit16( SELECTOROF(buffer) ) - OFFSETOF(buffer) + 1;
+ if (count > maxlen) count = maxlen;
+ return _lread((HFILE)DosFileHandleToWin32Handle(hFile), MapSL(buffer), count );
+}
+
+
+/***********************************************************************
+ * _lread (KERNEL.82)
+ */
+UINT16 WINAPI WIN16_lread( HFILE16 hFile, SEGPTR buffer, UINT16 count )
+{
+ return (UINT16)WIN16_hread( hFile, buffer, (LONG)count );
+}
+
+
+/***********************************************************************
+ * DeleteFile (KERNEL.146)
+ */
+BOOL16 WINAPI DeleteFile16( LPCSTR path )
+{
+ return DeleteFileA( path );
+}
+
+/**************************************************************************
+ * GetFileAttributes (KERNEL.420)
+ */
+DWORD WINAPI GetFileAttributes16( LPCSTR name )
+{
+ return GetFileAttributesA( name );
+}
+
+
+/***********************************************************************
+ * GetTempFileName (KERNEL.97)
+ */
+UINT16 WINAPI GetTempFileName16( BYTE drive, LPCSTR prefix, UINT16 unique,
+ LPSTR buffer )
+{
+ char temppath[MAX_PATH];
+ char *prefix16 = NULL;
+ UINT16 ret;
+
+ if (!(drive & ~TF_FORCEDRIVE)) /* drive 0 means current default drive */
+ {
+ GetCurrentDirectoryA(sizeof(temppath), temppath);
+ drive |= temppath[0];
+ }
+
+ if (drive & TF_FORCEDRIVE)
+ {
+ char d[3];
+
+ d[0] = drive & ~TF_FORCEDRIVE;
+ d[1] = ':';
+ d[2] = '\0';
+ if (GetDriveTypeA(d) == DRIVE_NO_ROOT_DIR)
+ {
+ drive &= ~TF_FORCEDRIVE;
+ WARN("invalid drive %d specified\n", drive );
+ }
+ }
+
+ if (drive & TF_FORCEDRIVE)
+ sprintf(temppath,"%c:", drive & ~TF_FORCEDRIVE );
+ else
+ GetTempPathA( MAX_PATH, temppath );
+
+ if (prefix)
+ {
+ prefix16 = HeapAlloc(GetProcessHeap(), 0, strlen(prefix) + 2);
+ *prefix16 = '~';
+ strcpy(prefix16 + 1, prefix);
+ }
+
+ ret = GetTempFileNameA( temppath, prefix16, unique, buffer );
+
+ if (prefix16) HeapFree(GetProcessHeap(), 0, prefix16);
+ return ret;
+}
+
+/**************************************************************************
+ * SetFileAttributes (KERNEL.421)
+ */
+BOOL16 WINAPI SetFileAttributes16( LPCSTR lpFileName, DWORD attributes )
+{
+ return SetFileAttributesA( lpFileName, attributes );
+}
+
+
+/***********************************************************************
+ * SetHandleCount (KERNEL.199)
+ */
+UINT16 WINAPI SetHandleCount16( UINT16 count )
+{
+ return SetHandleCount( count );
+}
+
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/kernel28/file.c dlls/kernel/file.c
--- dlls/kernel28/file.c 1970-01-01 01:00:00.000000000 +0100
+++ dlls/kernel/file.c 2003-06-21 11:30:35.000000000 +0200
@@ -0,0 +1,347 @@
+/*
+ * File handling functions
+ *
+ * Copyright 1993 John Burton
+ * Copyright 1996 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * TODO:
+ * Fix the CopyFileEx methods to implement the "extended" functionality.
+ * Right now, they simply call the CopyFile method.
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "winerror.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winternl.h"
+
+#include "kernel_private.h"
+
+#include "wine/unicode.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(file);
+
+/**************************************************************************
+ * Operations on file handles *
+ **************************************************************************/
+
+/***********************************************************************
+ * _hread (KERNEL32.@)
+ */
+LONG WINAPI _hread( HFILE hFile, LPVOID buffer, LONG count)
+{
+ return _lread( hFile, buffer, count );
+}
+
+
+/***********************************************************************
+ * _hwrite (KERNEL32.@)
+ *
+ * experimentation yields that _lwrite:
+ * o truncates the file at the current position with
+ * a 0 len write
+ * o returns 0 on a 0 length write
+ * o works with console handles
+ *
+ */
+LONG WINAPI _hwrite( HFILE handle, LPCSTR buffer, LONG count )
+{
+ DWORD result;
+
+ TRACE("%d %p %ld\n", handle, buffer, count );
+
+ if (!count)
+ {
+ /* Expand or truncate at current position */
+ if (!SetEndOfFile( (HANDLE)handle )) return HFILE_ERROR;
+ return 0;
+ }
+ if (!WriteFile( (HANDLE)handle, buffer, count, &result, NULL ))
+ return HFILE_ERROR;
+ return result;
+}
+
+
+/***********************************************************************
+ * _lclose (KERNEL32.@)
+ */
+HFILE WINAPI _lclose( HFILE hFile )
+{
+ TRACE("handle %d\n", hFile );
+ return CloseHandle( (HANDLE)hFile ) ? 0 : HFILE_ERROR;
+}
+
+
+/***********************************************************************
+ * _lcreat (KERNEL32.@)
+ */
+HFILE WINAPI _lcreat( LPCSTR path, INT attr )
+{
+ /* Mask off all flags not explicitly allowed by the doc */
+ attr &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
+ TRACE("%s %02x\n", path, attr );
+ return (HFILE)CreateFileA( path, GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ CREATE_ALWAYS, attr, 0 );
+}
+
+
+/***********************************************************************
+ * _lopen (KERNEL32.@)
+ */
+HFILE WINAPI _lopen( LPCSTR path, INT mode )
+{
+ DWORD access, sharing;
+
+ TRACE("('%s',%04x)\n", path, mode );
+ FILE_ConvertOFMode( mode, &access, &sharing );
+ return (HFILE)CreateFileA( path, access, sharing, NULL, OPEN_EXISTING, 0, 0 );
+}
+
+
+/***********************************************************************
+ * _lread (KERNEL32.@)
+ */
+UINT WINAPI _lread( HFILE handle, LPVOID buffer, UINT count )
+{
+ DWORD result;
+ if (!ReadFile( (HANDLE)handle, buffer, count, &result, NULL )) return -1;
+ return result;
+}
+
+
+/***********************************************************************
+ * _llseek (KERNEL32.@)
+ */
+LONG WINAPI _llseek( HFILE hFile, LONG lOffset, INT nOrigin )
+{
+ return SetFilePointer( (HANDLE)hFile, lOffset, NULL, nOrigin );
+}
+
+
+/***********************************************************************
+ * _lwrite (KERNEL32.@)
+ */
+UINT WINAPI _lwrite( HFILE hFile, LPCSTR buffer, UINT count )
+{
+ return (UINT)_hwrite( hFile, buffer, (LONG)count );
+}
+
+
+/***********************************************************************
+ * FlushFileBuffers (KERNEL32.@)
+ */
+BOOL WINAPI FlushFileBuffers( HANDLE hFile )
+{
+ NTSTATUS nts;
+ IO_STATUS_BLOCK ioblk;
+
+ if (is_console_handle( hFile ))
+ {
+ /* this will fail (as expected) for an output handle */
+ /* FIXME: wait until FlushFileBuffers is moved to dll/kernel */
+ /* return FlushConsoleInputBuffer( hFile ); */
+ return TRUE;
+ }
+ nts = NtFlushBuffersFile( hFile, &ioblk );
+ if (nts != STATUS_SUCCESS)
+ {
+ SetLastError( RtlNtStatusToDosError( nts ) );
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * GetFileSize (KERNEL32.@)
+ */
+DWORD WINAPI GetFileSize( HANDLE hFile, LPDWORD filesizehigh )
+{
+ BY_HANDLE_FILE_INFORMATION info;
+ if (!GetFileInformationByHandle( hFile, &info )) return -1;
+ if (filesizehigh) *filesizehigh = info.nFileSizeHigh;
+ return info.nFileSizeLow;
+}
+
+
+/***********************************************************************
+ * GetFileSizeEx (KERNEL32.@)
+ */
+BOOL WINAPI GetFileSizeEx( HANDLE hFile, PLARGE_INTEGER lpFileSize )
+{
+ BY_HANDLE_FILE_INFORMATION info;
+
+ if (!lpFileSize)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+
+ if (!GetFileInformationByHandle( hFile, &info ))
+ {
+ return FALSE;
+ }
+
+ lpFileSize->s.LowPart = info.nFileSizeLow;
+ lpFileSize->s.HighPart = info.nFileSizeHigh;
+
+ return TRUE;
+}
+
+
+/**************************************************************************
+ * LockFile (KERNEL32.@)
+ */
+BOOL WINAPI LockFile( HANDLE hFile, DWORD offset_low, DWORD offset_high,
+ DWORD count_low, DWORD count_high )
+{
+ NTSTATUS status;
+ LARGE_INTEGER count, offset;
+
+ TRACE( "%p %lx%08lx %lx%08lx\n",
+ hFile, offset_high, offset_low, count_high, count_low );
+
+ count.s.LowPart = count_low;
+ count.s.HighPart = count_high;
+ offset.s.LowPart = offset_low;
+ offset.s.HighPart = offset_high;
+
+ status = NtLockFile( hFile, 0, NULL, NULL,
+ NULL, &offset, &count, NULL, TRUE, TRUE );
+
+ if (status != STATUS_SUCCESS) SetLastError( RtlNtStatusToDosError(status) );
+ return !status;
+}
+
+
+/**************************************************************************
+ * LockFileEx [KERNEL32.@]
+ *
+ * Locks a byte range within an open file for shared or exclusive access.
+ *
+ * RETURNS
+ * success: TRUE
+ * failure: FALSE
+ *
+ * NOTES
+ * Per Microsoft docs, the third parameter (reserved) must be set to 0.
+ */
+BOOL WINAPI LockFileEx( HANDLE hFile, DWORD flags, DWORD reserved,
+ DWORD count_low, DWORD count_high, LPOVERLAPPED overlapped )
+{
+ NTSTATUS status;
+ LARGE_INTEGER count, offset;
+
+ if (reserved)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+
+ TRACE( "%p %lx%08lx %lx%08lx flags %lx\n",
+ hFile, overlapped->OffsetHigh, overlapped->Offset,
+ count_high, count_low, flags );
+
+ count.s.LowPart = count_low;
+ count.s.HighPart = count_high;
+ offset.s.LowPart = overlapped->Offset;
+ offset.s.HighPart = overlapped->OffsetHigh;
+
+ status = NtLockFile( hFile, overlapped->hEvent, NULL, NULL,
+ NULL, &offset, &count, NULL,
+ flags & LOCKFILE_FAIL_IMMEDIATELY,
+ flags & LOCKFILE_EXCLUSIVE_LOCK );
+
+ if (status) SetLastError( RtlNtStatusToDosError(status) );
+ return !status;
+}
+
+
+/**************************************************************************
+ * UnlockFile (KERNEL32.@)
+ */
+BOOL WINAPI UnlockFile( HANDLE hFile, DWORD offset_low, DWORD offset_high,
+ DWORD count_low, DWORD count_high )
+{
+ NTSTATUS status;
+ LARGE_INTEGER count, offset;
+
+ count.s.LowPart = count_low;
+ count.s.HighPart = count_high;
+ offset.s.LowPart = offset_low;
+ offset.s.HighPart = offset_high;
+
+ status = NtUnlockFile( hFile, NULL, &offset, &count, NULL);
+ if (status) SetLastError( RtlNtStatusToDosError(status) );
+ return !status;
+}
+
+
+/**************************************************************************
+ * UnlockFileEx (KERNEL32.@)
+ */
+BOOL WINAPI UnlockFileEx( HANDLE hFile, DWORD reserved, DWORD count_low, DWORD count_high,
+ LPOVERLAPPED overlapped )
+{
+ if (reserved)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+ if (overlapped->hEvent) FIXME("Unimplemented overlapped operation\n");
+
+ return UnlockFile( hFile, overlapped->Offset, overlapped->OffsetHigh, count_low, count_high );
+}
+
+/**************************************************************************
+ * Operations on file names *
+ **************************************************************************/
+
+/**************************************************************************
+ * ReplaceFileW (KERNEL32.@)
+ * ReplaceFile (KERNEL32.@)
+ */
+BOOL WINAPI ReplaceFileW(LPCWSTR lpReplacedFileName,LPCWSTR lpReplacementFileName,
+ LPCWSTR lpBackupFileName, DWORD dwReplaceFlags,
+ LPVOID lpExclude, LPVOID lpReserved)
+{
+ FIXME("(%s,%s,%s,%08lx,%p,%p) stub\n",debugstr_w(lpReplacedFileName),debugstr_w(lpReplacementFileName),
+ debugstr_w(lpBackupFileName),dwReplaceFlags,lpExclude,lpReserved);
+ SetLastError(ERROR_UNABLE_TO_MOVE_REPLACEMENT);
+ return FALSE;
+}
+
+
+/**************************************************************************
+ * ReplaceFileA (KERNEL32.@)
+ */
+BOOL WINAPI ReplaceFileA(LPCSTR lpReplacedFileName,LPCSTR lpReplacementFileName,
+ LPCSTR lpBackupFileName, DWORD dwReplaceFlags,
+ LPVOID lpExclude, LPVOID lpReserved)
+{
+ FIXME("(%s,%s,%s,%08lx,%p,%p) stub\n",lpReplacedFileName,lpReplacementFileName,
+ lpBackupFileName,dwReplaceFlags,lpExclude,lpReserved);
+ SetLastError(ERROR_UNABLE_TO_MOVE_REPLACEMENT);
+ return FALSE;
+}
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/kernel28/kernel_private.h dlls/kernel/kernel_private.h
--- dlls/kernel28/kernel_private.h 2003-06-21 04:07:10.000000000 +0200
+++ dlls/kernel/kernel_private.h 2003-06-21 10:41:57.000000000 +0200
@@ -44,4 +44,9 @@
return h != INVALID_HANDLE_VALUE ? (HANDLE)((DWORD)h ^ 3) : INVALID_HANDLE_VALUE;
}
+/* Size of per-process table of DOS handles */
+#define DOS_TABLE_SIZE 256
+extern HANDLE dos_handles[DOS_TABLE_SIZE];
+void FILE_ConvertOFMode( INT mode, DWORD *access, DWORD *sharing );
+
#endif
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/kernel28/Makefile.in dlls/kernel/Makefile.in
--- dlls/kernel28/Makefile.in 2003-05-22 08:28:26.000000000 +0200
+++ dlls/kernel/Makefile.in 2003-05-25 18:57:57.000000000 +0200
@@ -28,6 +28,8 @@
console.c \
debugger.c \
editline.c \
+ file.c \
+ file16.c \
format_msg.c \
kernel_main.c \
lcformat.c \
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/ntdll28/file.c dlls/ntdll/file.c
--- dlls/ntdll28/file.c 2003-06-20 08:07:22.000000000 +0200
+++ dlls/ntdll/file.c 2003-06-21 14:00:42.000000000 +0200
@@ -345,32 +345,161 @@
* NtQueryInformationFile [NTDLL.@]
* ZwQueryInformationFile [NTDLL.@]
*/
-NTSTATUS WINAPI NtQueryInformationFile(
- HANDLE FileHandle,
- PIO_STATUS_BLOCK IoStatusBlock,
- PVOID FileInformation,
- ULONG Length,
- FILE_INFORMATION_CLASS FileInformationClass)
+NTSTATUS WINAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io_status,
+ PVOID ptr, LONG len,
+ FILE_INFORMATION_CLASS class)
{
- FIXME("(%p,%p,%p,0x%08lx,0x%08x),stub!\n",
- FileHandle,IoStatusBlock,FileInformation,Length,FileInformationClass);
- return 0;
+ NTSTATUS status;
+ LONG used = 0;
+ BYTE answer[256];
+ time_t ct = 0, wt = 0, at = 0;
+
+ TRACE("(%p,%p,%p,0x%08lx,0x%08x)\n", hFile, io_status, ptr, len, class);
+
+ switch (class)
+ {
+ case FileBasicInformation:
+ {
+ FILE_BASIC_INFORMATION* fbi = (FILE_BASIC_INFORMATION*)answer;
+ if (sizeof(answer) < sizeof(*fbi)) goto too_small;
+
+ SERVER_START_REQ( get_file_info )
+ {
+ req->handle = hFile;
+ if (!(status = wine_server_call( req )))
+ {
+ /* FIXME: which file types are supported ?
+ * Serial ports (FILE_TYPE_CHAR) are not,
+ * and MSDN also says that pipes are not supported.
+ * FILE_TYPE_REMOTE seems to be supported according to
+ * MSDN q234741.txt */
+ if ((reply->type == FILE_TYPE_DISK) ||
+ (reply->type == FILE_TYPE_REMOTE))
+ {
+ at = reply->access_time;
+ wt = reply->write_time;
+ ct = reply->change_time;
+ fbi->FileAttributes = reply->attr;
+ used = sizeof(*fbi);
+ }
+ else status = STATUS_INVALID_HANDLE; /* FIXME ??? */
+ }
+ }
+ SERVER_END_REQ;
+ if (used)
+ {
+ RtlSecondsSince1970ToTime(wt, &fbi->CreationTime);
+ RtlSecondsSince1970ToTime(wt, &fbi->LastWriteTime);
+ RtlSecondsSince1970ToTime(ct, &fbi->ChangeTime);
+ RtlSecondsSince1970ToTime(at, &fbi->LastAccessTime);
+ }
+ }
+ break;
+ case FileStandardInformation:
+ {
+ FILE_STANDARD_INFORMATION* fsi = (FILE_STANDARD_INFORMATION*)answer;
+ if (sizeof(answer) < sizeof(*fsi)) goto too_small;
+
+ SERVER_START_REQ( get_file_info )
+ {
+ req->handle = hFile;
+ if (!(status = wine_server_call( req )))
+ {
+ /* FIXME: which file types are supported ?
+ * Serial ports (FILE_TYPE_CHAR) are not,
+ * and MSDN also says that pipes are not supported.
+ * FILE_TYPE_REMOTE seems to be supported according to
+ * MSDN q234741.txt */
+ if ((reply->type == FILE_TYPE_DISK) ||
+ (reply->type == FILE_TYPE_REMOTE))
+ {
+ fsi->AllocationSize.s.HighPart = reply->alloc_high;
+ fsi->AllocationSize.s.LowPart = reply->alloc_low;
+ fsi->EndOfFile.s.HighPart = reply->size_high;
+ fsi->EndOfFile.s.LowPart = reply->size_low;
+ fsi->NumberOfLinks = reply->links;
+ fsi->DeletePending = FALSE; /* FIXME */
+ fsi->Directory = (reply->attr & FILE_ATTRIBUTE_DIRECTORY);
+ used = sizeof(*fsi);
+ }
+ else status = STATUS_INVALID_HANDLE; /* FIXME ??? */
+ }
+ }
+ SERVER_END_REQ;
+ }
+ break;
+ case FilePositionInformation:
+ {
+ FILE_POSITION_INFORMATION* fpi = (FILE_POSITION_INFORMATION*)answer;
+ if (sizeof(answer) < sizeof(*fpi)) goto too_small;
+
+ SERVER_START_REQ( set_file_pointer )
+ {
+ req->handle = hFile;
+ req->low = 0;
+ req->high = 0;
+ req->whence = SEEK_CUR;
+ if (!(status = wine_server_call( req )))
+ {
+ fpi->CurrentByteOffset.s.HighPart = reply->new_high;
+ fpi->CurrentByteOffset.s.LowPart = reply->new_low;
+ used = sizeof(*fpi);
+ }
+ }
+ SERVER_END_REQ;
+ }
+ break;
+ default:
+ FIXME("Unsupported class (%d)\n", class);
+ return io_status->u.Status = STATUS_NOT_IMPLEMENTED;
+ }
+ if (used) memcpy(ptr, answer, min(used, len));
+ io_status->u.Status = status;
+ io_status->Information = len;
+ return status;
+ too_small:
+ io_status->Information = 0;
+ return io_status->u.Status = STATUS_BUFFER_TOO_SMALL;
}
/******************************************************************************
* NtSetInformationFile [NTDLL.@]
* ZwSetInformationFile [NTDLL.@]
*/
-NTSTATUS WINAPI NtSetInformationFile(
- HANDLE FileHandle,
- PIO_STATUS_BLOCK IoStatusBlock,
- PVOID FileInformation,
- ULONG Length,
- FILE_INFORMATION_CLASS FileInformationClass)
+NTSTATUS WINAPI NtSetInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io_status,
+ PVOID ptr, ULONG len,
+ FILE_INFORMATION_CLASS class)
{
- FIXME("(%p,%p,%p,0x%08lx,0x%08x)\n",
- FileHandle,IoStatusBlock,FileInformation,Length,FileInformationClass);
- return 0;
+ NTSTATUS status = STATUS_INVALID_PARAMETER_3;
+
+ TRACE("(%p,%p,%p,0x%08lx,0x%08x)\n", hFile, io_status, ptr, len, class);
+
+ switch (class)
+ {
+ case FilePositionInformation:
+ if (len >= sizeof(FILE_POSITION_INFORMATION))
+ {
+ FILE_POSITION_INFORMATION* fpi = (FILE_POSITION_INFORMATION*)ptr;
+
+ SERVER_START_REQ( set_file_pointer )
+ {
+ req->handle = hFile;
+ req->low = fpi->CurrentByteOffset.s.LowPart;
+ req->high = fpi->CurrentByteOffset.s.HighPart;
+ req->whence = SEEK_SET;
+ status = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ status = STATUS_SUCCESS;
+ }
+ break;
+ default:
+ FIXME("Unsupported class (%d)\n", class);
+ return STATUS_NOT_IMPLEMENTED;
+ }
+ io_status->u.Status = status;
+ io_status->Information = 0;
+ return status;
}
/******************************************************************************
@@ -487,7 +616,7 @@
case FileFsMaximumInformation:
break;
}
- IoStatusBlock->DUMMYUNIONNAME.Status = STATUS_SUCCESS;
+ IoStatusBlock->u.Status = STATUS_SUCCESS;
IoStatusBlock->Information = len;
return STATUS_SUCCESS;
}
@@ -514,3 +643,104 @@
}
return ret;
}
+
+/******************************************************************
+ * NtLockFile (NTDLL.@)
+ *
+ *
+ */
+NTSTATUS WINAPI NtLockFile( HANDLE hFile, HANDLE lock_granted_event,
+ PIO_APC_ROUTINE apc, void* apc_user,
+ PIO_STATUS_BLOCK io_status, PLARGE_INTEGER offset,
+ PLARGE_INTEGER count, ULONG* key, BOOLEAN dont_wait,
+ BOOLEAN exclusive )
+{
+ NTSTATUS ret;
+ HANDLE handle;
+ BOOLEAN async;
+
+ if (apc || io_status || key)
+ {
+ FIXME("Unimplemented yet parameter\n");
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ for (;;)
+ {
+ SERVER_START_REQ( lock_file )
+ {
+ req->handle = hFile;
+ req->offset_low = offset->s.LowPart;
+ req->offset_high = offset->s.HighPart;
+ req->count_low = count->s.LowPart;
+ req->count_high = count->s.HighPart;
+ req->shared = !exclusive;
+ req->wait = !dont_wait;
+ ret = wine_server_call( req );
+ handle = reply->handle;
+ async = reply->overlapped;
+ }
+ SERVER_END_REQ;
+ if (ret != STATUS_PENDING)
+ {
+ if (!ret && lock_granted_event) NtSetEvent(lock_granted_event, NULL);
+ return ret;
+ }
+
+ if (async)
+ {
+ FIXME( "Async I/O lock wait not implemented, might deadlock\n" );
+ if (handle) NtClose( handle );
+ return STATUS_PENDING;
+ }
+ if (handle)
+ {
+ NtWaitForSingleObject( handle, FALSE, NULL );
+ NtClose( handle );
+ }
+ else
+ {
+ LARGE_INTEGER time;
+
+ /* Unix lock conflict, sleep a bit and retry */
+ time.QuadPart = 100 * (ULONGLONG)10000;
+ time.QuadPart = -time.QuadPart;
+ NtWaitForMultipleObjects( 0, NULL, FALSE, FALSE, &time );
+ }
+ }
+}
+
+
+/******************************************************************
+ * NtUnlockFile (NTDLL.@)
+ *
+ *
+ */
+NTSTATUS WINAPI NtUnlockFile( HANDLE hFile, PIO_STATUS_BLOCK io_status,
+ PLARGE_INTEGER offset, PLARGE_INTEGER count,
+ PULONG key )
+{
+ NTSTATUS status;
+
+ TRACE( "%p %lx%08lx %lx%08lx\n",
+ hFile, offset->s.HighPart, offset->s.LowPart, count->s.HighPart, count->s.LowPart );
+
+ if (io_status || key)
+ {
+ FIXME("Unimplemented yet parameter\n");
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ SERVER_START_REQ( unlock_file )
+ {
+ req->handle = hFile;
+ req->offset_low = offset->s.LowPart;
+ req->offset_high = offset->s.HighPart;
+ req->count_low = count->s.LowPart;
+ req->count_high = count->s.HighPart;
+ status = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ return status;
+}
+
diff -u -N -r -x '*~' -x '.#*' -x CVS dlls/ntdll28/ntdll.spec dlls/ntdll/ntdll.spec
--- dlls/ntdll28/ntdll.spec 2003-06-20 08:07:22.000000000 +0200
+++ dlls/ntdll/ntdll.spec 2003-06-21 10:24:19.000000000 +0200
@@ -123,7 +123,7 @@
@ stdcall NtListenPort(ptr ptr)
@ stub NtLoadDriver
@ stdcall NtLoadKey(ptr ptr)
-@ stub NtLockFile
+@ stdcall NtLockFile(long long ptr ptr ptr ptr ptr ptr long long)
@ stdcall NtLockVirtualMemory(long ptr ptr long)
@ stub NtMakeTemporaryObject
@ stdcall NtMapViewOfSection(long long ptr long long ptr ptr long long long)
@@ -245,7 +245,7 @@
@ stub NtUnloadDriver
@ stdcall NtUnloadKey(long)
@ stub NtUnloadKeyEx
-@ stub NtUnlockFile
+@ stdcall NtUnlockFile(long ptr ptr ptr ptr)
@ stdcall NtUnlockVirtualMemory(long ptr ptr long)
@ stdcall NtUnmapViewOfSection(long ptr)
@ stub NtVdmControl
@@ -655,7 +655,7 @@
@ stdcall ZwListenPort(ptr ptr) NtListenPort
@ stub ZwLoadDriver
@ stdcall ZwLoadKey(ptr ptr) NtLoadKey
-@ stub ZwLockFile
+@ stdcall ZwLockFile(long long ptr ptr ptr ptr ptr ptr long long) NtLockFile
@ stdcall ZwLockVirtualMemory(long ptr ptr long) NtLockVirtualMemory
@ stub ZwMakeTemporaryObject
@ stdcall ZwMapViewOfSection(long long ptr long long ptr ptr long long long) NtMapViewOfSection
@@ -774,7 +774,7 @@
@ stub ZwUnloadDriver
@ stdcall ZwUnloadKey(long) NtUnloadKey
@ stub ZwUnloadKeyEx
-@ stub ZwUnlockFile
+@ stdcall ZwUnlockFile(long ptr ptr ptr ptr) NtUnlockFile
@ stdcall ZwUnlockVirtualMemory(long ptr ptr long) NtUnlockVirtualMemory
@ stdcall ZwUnmapViewOfSection(long ptr) NtUnmapViewOfSection
@ stub ZwVdmControl
diff -u -N -r -x '*~' -x '.#*' -x CVS files28/file.c files/file.c
--- files28/file.c 2003-06-21 09:30:51.000000000 +0200
+++ files/file.c 2003-06-21 11:38:17.000000000 +0200
@@ -70,7 +70,7 @@
#include "heap.h"
#include "msdos.h"
#include "wincon.h"
-#include "../kernel/kernel_private.h" /* FIXME: to be changed when moving file to dlls/kernel */
+#include "../kernel/kernel_private.h"
#include "smb.h"
#include "wine/unicode.h"
@@ -82,14 +82,10 @@
#define MAP_ANON MAP_ANONYMOUS
#endif
-/* Size of per-process table of DOS handles */
-#define DOS_TABLE_SIZE 256
-
/* Macro to derive file offset from OVERLAPPED struct */
#define OVERLAPPED_OFFSET(overlapped) ((off_t) (overlapped)->Offset + ((off_t) (overlapped)->OffsetHigh << 32))
-static HANDLE dos_handles[DOS_TABLE_SIZE];
-
+HANDLE dos_handles[DOS_TABLE_SIZE];
mode_t FILE_umask;
extern HANDLE WINAPI FILE_SmbOpen(LPCSTR name);
@@ -172,7 +168,7 @@
*
* Convert OF_* mode into flags for CreateFile.
*/
-static void FILE_ConvertOFMode( INT mode, DWORD *access, DWORD *sharing )
+void FILE_ConvertOFMode( INT mode, DWORD *access, DWORD *sharing )
{
switch(mode & 0x03)
{
@@ -921,15 +917,6 @@
/**************************************************************************
- * GetFileAttributes (KERNEL.420)
- */
-DWORD WINAPI GetFileAttributes16( LPCSTR name )
-{
- return GetFileAttributesA( name );
-}
-
-
-/**************************************************************************
* GetFileAttributesW (KERNEL32.@)
*/
DWORD WINAPI GetFileAttributesW( LPCWSTR name )
@@ -975,15 +962,6 @@
/**************************************************************************
- * SetFileAttributes (KERNEL.421)
- */
-BOOL16 WINAPI SetFileAttributes16( LPCSTR lpFileName, DWORD attributes )
-{
- return SetFileAttributesA( lpFileName, attributes );
-}
-
-
-/**************************************************************************
* SetFileAttributesW (KERNEL32.@)
*/
BOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName, DWORD attributes)
@@ -1082,43 +1060,6 @@
/***********************************************************************
- * GetFileSize (KERNEL32.@)
- */
-DWORD WINAPI GetFileSize( HANDLE hFile, LPDWORD filesizehigh )
-{
- BY_HANDLE_FILE_INFORMATION info;
- if (!GetFileInformationByHandle( hFile, &info )) return -1;
- if (filesizehigh) *filesizehigh = info.nFileSizeHigh;
- return info.nFileSizeLow;
-}
-
-
-/***********************************************************************
- * GetFileSizeEx (KERNEL32.@)
- */
-BOOL WINAPI GetFileSizeEx( HANDLE hFile, PLARGE_INTEGER lpFileSize )
-{
- BY_HANDLE_FILE_INFORMATION info;
-
- if (!lpFileSize)
- {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
-
- if (!GetFileInformationByHandle( hFile, &info ))
- {
- return FALSE;
- }
-
- lpFileSize->s.LowPart = info.nFileSizeLow;
- lpFileSize->s.HighPart = info.nFileSizeHigh;
-
- return TRUE;
-}
-
-
-/***********************************************************************
* GetFileTime (KERNEL32.@)
*/
BOOL WINAPI GetFileTime( HANDLE hFile, FILETIME *lpCreationTime,
@@ -1133,6 +1074,7 @@
return TRUE;
}
+
/***********************************************************************
* FILE_GetTempFileName : utility for GetTempFileName
*/
@@ -1245,50 +1187,11 @@
/***********************************************************************
- * GetTempFileName (KERNEL.97)
- */
-UINT16 WINAPI GetTempFileName16( BYTE drive, LPCSTR prefix, UINT16 unique,
- LPSTR buffer )
-{
- char temppath[MAX_PATH];
- char *prefix16 = NULL;
- UINT16 ret;
-
- if (!(drive & ~TF_FORCEDRIVE)) /* drive 0 means current default drive */
- drive |= DRIVE_GetCurrentDrive() + 'A';
-
- if ((drive & TF_FORCEDRIVE) &&
- !DRIVE_IsValid( toupper(drive & ~TF_FORCEDRIVE) - 'A' ))
- {
- drive &= ~TF_FORCEDRIVE;
- WARN("invalid drive %d specified\n", drive );
- }
-
- if (drive & TF_FORCEDRIVE)
- sprintf(temppath,"%c:", drive & ~TF_FORCEDRIVE );
- else
- GetTempPathA( MAX_PATH, temppath );
-
- if (prefix)
- {
- prefix16 = HeapAlloc(GetProcessHeap(), 0, strlen(prefix) + 2);
- *prefix16 = '~';
- strcpy(prefix16 + 1, prefix);
- }
-
- ret = GetTempFileNameA( temppath, prefix16, unique, buffer );
-
- if (prefix16) HeapFree(GetProcessHeap(), 0, prefix16);
- return ret;
-}
-
-/***********************************************************************
* FILE_DoOpenFile
*
* Implementation of OpenFile16() and OpenFile32().
*/
-static HFILE FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT mode,
- BOOL win32 )
+static HFILE FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT mode, BOOL win32 )
{
HFILE hFileRet;
HANDLE handle;
@@ -1631,15 +1534,6 @@
/***********************************************************************
- * _lclose (KERNEL32.@)
- */
-HFILE WINAPI _lclose( HFILE hFile )
-{
- TRACE("handle %d\n", hFile );
- return CloseHandle( (HANDLE)hFile ) ? 0 : HFILE_ERROR;
-}
-
-/***********************************************************************
* GetOverlappedResult (KERNEL32.@)
*
* Check the result of an Asynchronous data transfer from a file.
@@ -2213,75 +2107,6 @@
/***********************************************************************
- * _hread (KERNEL.349)
- */
-LONG WINAPI WIN16_hread( HFILE16 hFile, SEGPTR buffer, LONG count )
-{
- LONG maxlen;
-
- TRACE("%d %08lx %ld\n",
- hFile, (DWORD)buffer, count );
-
- /* Some programs pass a count larger than the allocated buffer */
- maxlen = GetSelectorLimit16( SELECTOROF(buffer) ) - OFFSETOF(buffer) + 1;
- if (count > maxlen) count = maxlen;
- return _lread((HFILE)DosFileHandleToWin32Handle(hFile), MapSL(buffer), count );
-}
-
-
-/***********************************************************************
- * _lread (KERNEL.82)
- */
-UINT16 WINAPI WIN16_lread( HFILE16 hFile, SEGPTR buffer, UINT16 count )
-{
- return (UINT16)WIN16_hread( hFile, buffer, (LONG)count );
-}
-
-
-/***********************************************************************
- * _lread (KERNEL32.@)
- */
-UINT WINAPI _lread( HFILE handle, LPVOID buffer, UINT count )
-{
- DWORD result;
- if (!ReadFile( (HANDLE)handle, buffer, count, &result, NULL )) return -1;
- return result;
-}
-
-
-/***********************************************************************
- * _lread16 (KERNEL.82)
- */
-UINT16 WINAPI _lread16( HFILE16 hFile, LPVOID buffer, UINT16 count )
-{
- return (UINT16)_lread((HFILE)DosFileHandleToWin32Handle(hFile), buffer, (LONG)count );
-}
-
-
-/***********************************************************************
- * _lcreat (KERNEL.83)
- */
-HFILE16 WINAPI _lcreat16( LPCSTR path, INT16 attr )
-{
- return Win32HandleToDosFileHandle( (HANDLE)_lcreat( path, attr ) );
-}
-
-
-/***********************************************************************
- * _lcreat (KERNEL32.@)
- */
-HFILE WINAPI _lcreat( LPCSTR path, INT attr )
-{
- /* Mask off all flags not explicitly allowed by the doc */
- attr &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
- TRACE("%s %02x\n", path, attr );
- return (HFILE)CreateFileA( path, GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
- CREATE_ALWAYS, attr, 0 );
-}
-
-
-/***********************************************************************
* SetFilePointer (KERNEL32.@)
*/
DWORD WINAPI SetFilePointer( HANDLE hFile, LONG distance, LONG *highword,
@@ -2311,132 +2136,6 @@
}
-/***********************************************************************
- * _llseek (KERNEL.84)
- *
- * FIXME:
- * Seeking before the start of the file should be allowed for _llseek16,
- * but cause subsequent I/O operations to fail (cf. interrupt list)
- *
- */
-LONG WINAPI _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
-{
- return SetFilePointer( DosFileHandleToWin32Handle(hFile), lOffset, NULL, nOrigin );
-}
-
-
-/***********************************************************************
- * _llseek (KERNEL32.@)
- */
-LONG WINAPI _llseek( HFILE hFile, LONG lOffset, INT nOrigin )
-{
- return SetFilePointer( (HANDLE)hFile, lOffset, NULL, nOrigin );
-}
-
-
-/***********************************************************************
- * _lopen (KERNEL.85)
- */
-HFILE16 WINAPI _lopen16( LPCSTR path, INT16 mode )
-{
- return Win32HandleToDosFileHandle( (HANDLE)_lopen( path, mode ) );
-}
-
-
-/***********************************************************************
- * _lopen (KERNEL32.@)
- */
-HFILE WINAPI _lopen( LPCSTR path, INT mode )
-{
- DWORD access, sharing;
-
- TRACE("('%s',%04x)\n", path, mode );
- FILE_ConvertOFMode( mode, &access, &sharing );
- return (HFILE)CreateFileA( path, access, sharing, NULL, OPEN_EXISTING, 0, 0 );
-}
-
-
-/***********************************************************************
- * _lwrite (KERNEL.86)
- */
-UINT16 WINAPI _lwrite16( HFILE16 hFile, LPCSTR buffer, UINT16 count )
-{
- return (UINT16)_hwrite( (HFILE)DosFileHandleToWin32Handle(hFile), buffer, (LONG)count );
-}
-
-/***********************************************************************
- * _lwrite (KERNEL32.@)
- */
-UINT WINAPI _lwrite( HFILE hFile, LPCSTR buffer, UINT count )
-{
- return (UINT)_hwrite( hFile, buffer, (LONG)count );
-}
-
-
-/***********************************************************************
- * _hread16 (KERNEL.349)
- */
-LONG WINAPI _hread16( HFILE16 hFile, LPVOID buffer, LONG count)
-{
- return _lread( (HFILE)DosFileHandleToWin32Handle(hFile), buffer, count );
-}
-
-
-/***********************************************************************
- * _hread (KERNEL32.@)
- */
-LONG WINAPI _hread( HFILE hFile, LPVOID buffer, LONG count)
-{
- return _lread( hFile, buffer, count );
-}
-
-
-/***********************************************************************
- * _hwrite (KERNEL.350)
- */
-LONG WINAPI _hwrite16( HFILE16 hFile, LPCSTR buffer, LONG count )
-{
- return _hwrite( (HFILE)DosFileHandleToWin32Handle(hFile), buffer, count );
-}
-
-
-/***********************************************************************
- * _hwrite (KERNEL32.@)
- *
- * experimentation yields that _lwrite:
- * o truncates the file at the current position with
- * a 0 len write
- * o returns 0 on a 0 length write
- * o works with console handles
- *
- */
-LONG WINAPI _hwrite( HFILE handle, LPCSTR buffer, LONG count )
-{
- DWORD result;
-
- TRACE("%d %p %ld\n", handle, buffer, count );
-
- if (!count)
- {
- /* Expand or truncate at current position */
- if (!SetEndOfFile( (HANDLE)handle )) return HFILE_ERROR;
- return 0;
- }
- if (!WriteFile( (HANDLE)handle, buffer, count, &result, NULL ))
- return HFILE_ERROR;
- return result;
-}
-
-
-/***********************************************************************
- * SetHandleCount (KERNEL.199)
- */
-UINT16 WINAPI SetHandleCount16( UINT16 count )
-{
- return SetHandleCount( count );
-}
-
-
/*************************************************************************
* SetHandleCount (KERNEL32.@)
*/
@@ -2446,32 +2145,6 @@
}
-/***********************************************************************
- * FlushFileBuffers (KERNEL32.@)
- */
-BOOL WINAPI FlushFileBuffers( HANDLE hFile )
-{
- NTSTATUS nts;
- IO_STATUS_BLOCK ioblk;
-
- if (is_console_handle( hFile ))
- {
- /* this will fail (as expected) for an output handle */
- /* FIXME: wait until FlushFileBuffers is moved to dll/kernel */
- /* return FlushConsoleInputBuffer( hFile ); */
- return TRUE;
- }
- nts = NtFlushBuffersFile( hFile, &ioblk );
- if (nts != STATUS_SUCCESS)
- {
- SetLastError( RtlNtStatusToDosError( nts ) );
- return FALSE;
- }
-
- return TRUE;
-}
-
-
/**************************************************************************
* SetEndOfFile (KERNEL32.@)
*/
@@ -2489,15 +2162,6 @@
/***********************************************************************
- * DeleteFile (KERNEL.146)
- */
-BOOL16 WINAPI DeleteFile16( LPCSTR path )
-{
- return DeleteFileA( path );
-}
-
-
-/***********************************************************************
* DeleteFileW (KERNEL32.@)
*/
BOOL WINAPI DeleteFileW( LPCWSTR path )
@@ -3041,6 +2705,7 @@
return CopyFileW(sourceFilename, destFilename, (copyFlags & COPY_FILE_FAIL_IF_EXISTS) != 0);
}
+
/**************************************************************************
* CopyFileExA (KERNEL32.@)
*/
@@ -3097,136 +2762,6 @@
/**************************************************************************
- * LockFile (KERNEL32.@)
- */
-BOOL WINAPI LockFile( HANDLE hFile, DWORD offset_low, DWORD offset_high,
- DWORD count_low, DWORD count_high )
-{
- BOOL ret;
-
- TRACE( "%p %lx%08lx %lx%08lx\n", hFile, offset_high, offset_low, count_high, count_low );
-
- SERVER_START_REQ( lock_file )
- {
- req->handle = hFile;
- req->offset_low = offset_low;
- req->offset_high = offset_high;
- req->count_low = count_low;
- req->count_high = count_high;
- req->shared = FALSE;
- req->wait = FALSE;
- ret = !wine_server_call_err( req );
- }
- SERVER_END_REQ;
- return ret;
-}
-
-/**************************************************************************
- * LockFileEx [KERNEL32.@]
- *
- * Locks a byte range within an open file for shared or exclusive access.
- *
- * RETURNS
- * success: TRUE
- * failure: FALSE
- *
- * NOTES
- * Per Microsoft docs, the third parameter (reserved) must be set to 0.
- */
-BOOL WINAPI LockFileEx( HANDLE hFile, DWORD flags, DWORD reserved,
- DWORD count_low, DWORD count_high, LPOVERLAPPED overlapped )
-{
- NTSTATUS err;
- BOOL async;
- HANDLE handle;
-
- if (reserved)
- {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
-
- TRACE( "%p %lx%08lx %lx%08lx flags %lx\n",
- hFile, overlapped->OffsetHigh, overlapped->Offset, count_high, count_low, flags );
-
- for (;;)
- {
- SERVER_START_REQ( lock_file )
- {
- req->handle = hFile;
- req->offset_low = overlapped->Offset;
- req->offset_high = overlapped->OffsetHigh;
- req->count_low = count_low;
- req->count_high = count_high;
- req->shared = !(flags & LOCKFILE_EXCLUSIVE_LOCK);
- req->wait = !(flags & LOCKFILE_FAIL_IMMEDIATELY);
- err = wine_server_call( req );
- handle = reply->handle;
- async = reply->overlapped;
- }
- SERVER_END_REQ;
- if (err != STATUS_PENDING)
- {
- if (err) SetLastError( RtlNtStatusToDosError(err) );
- return !err;
- }
- if (async)
- {
- FIXME( "Async I/O lock wait not implemented, might deadlock\n" );
- if (handle) CloseHandle( handle );
- SetLastError( ERROR_IO_PENDING );
- return FALSE;
- }
- if (handle)
- {
- WaitForSingleObject( handle, INFINITE );
- CloseHandle( handle );
- }
- else Sleep(100); /* Unix lock conflict, sleep a bit and retry */
- }
-}
-
-
-/**************************************************************************
- * UnlockFile (KERNEL32.@)
- */
-BOOL WINAPI UnlockFile( HANDLE hFile, DWORD offset_low, DWORD offset_high,
- DWORD count_low, DWORD count_high )
-{
- BOOL ret;
-
- TRACE( "%p %lx%08lx %lx%08lx\n", hFile, offset_high, offset_low, count_high, count_low );
-
- SERVER_START_REQ( unlock_file )
- {
- req->handle = hFile;
- req->offset_low = offset_low;
- req->offset_high = offset_high;
- req->count_low = count_low;
- req->count_high = count_high;
- ret = !wine_server_call_err( req );
- }
- SERVER_END_REQ;
- return ret;
-}
-
-
-/**************************************************************************
- * UnlockFileEx (KERNEL32.@)
- */
-BOOL WINAPI UnlockFileEx( HANDLE hFile, DWORD reserved, DWORD count_low, DWORD count_high,
- LPOVERLAPPED overlapped )
-{
- if (reserved)
- {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
- return UnlockFile( hFile, overlapped->Offset, overlapped->OffsetHigh, count_low, count_high );
-}
-
-
-/**************************************************************************
* GetFileAttributesExW (KERNEL32.@)
*/
BOOL WINAPI GetFileAttributesExW(
@@ -3290,29 +2825,3 @@
return ret;
}
-/**************************************************************************
- * ReplaceFileW (KERNEL32.@)
- * ReplaceFile (KERNEL32.@)
- */
-BOOL WINAPI ReplaceFileW(LPCWSTR lpReplacedFileName,LPCWSTR lpReplacementFileName,
- LPCWSTR lpBackupFileName, DWORD dwReplaceFlags,
- LPVOID lpExclude, LPVOID lpReserved)
-{
- FIXME("(%s,%s,%s,%08lx,%p,%p) stub\n",debugstr_w(lpReplacedFileName),debugstr_w(lpReplacementFileName),
- debugstr_w(lpBackupFileName),dwReplaceFlags,lpExclude,lpReserved);
- SetLastError(ERROR_UNABLE_TO_MOVE_REPLACEMENT);
- return FALSE;
-}
-
-/**************************************************************************
- * ReplaceFileA (KERNEL32.@)
- */
-BOOL WINAPI ReplaceFileA(LPCSTR lpReplacedFileName,LPCSTR lpReplacementFileName,
- LPCSTR lpBackupFileName, DWORD dwReplaceFlags,
- LPVOID lpExclude, LPVOID lpReserved)
-{
- FIXME("(%s,%s,%s,%08lx,%p,%p) stub\n",lpReplacedFileName,lpReplacementFileName,
- lpBackupFileName,dwReplaceFlags,lpExclude,lpReserved);
- SetLastError(ERROR_UNABLE_TO_MOVE_REPLACEMENT);
- return FALSE;
-}
diff -u -N -r -x '*~' -x '.#*' -x CVS include28/wine/server_protocol.h include/wine/server_protocol.h
--- include28/wine/server_protocol.h 2003-06-21 09:29:17.000000000 +0200
+++ include/wine/server_protocol.h 2003-06-21 10:31:58.000000000 +0200
@@ -892,8 +892,11 @@
int attr;
time_t access_time;
time_t write_time;
+ time_t change_time;
int size_high;
int size_low;
+ int alloc_high;
+ int alloc_low;
int links;
int index_high;
int index_low;
@@ -3605,6 +3608,6 @@
struct query_virtual_memory_info_reply query_virtual_memory_info_reply;
};
-#define SERVER_PROTOCOL_VERSION 110
+#define SERVER_PROTOCOL_VERSION 111
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff -u -N -r -x '*~' -x '.#*' -x CVS include28/winternl.h include/winternl.h
--- include28/winternl.h 2003-06-20 08:07:35.000000000 +0200
+++ include/winternl.h 2003-06-21 10:24:56.000000000 +0200
@@ -936,6 +936,7 @@
NTSTATUS WINAPI NtFreeVirtualMemory(HANDLE,PVOID*,ULONG*,ULONG);
NTSTATUS WINAPI NtGetContextThread(HANDLE,CONTEXT*);
NTSTATUS WINAPI NtLoadKey(const OBJECT_ATTRIBUTES *,const OBJECT_ATTRIBUTES *);
+NTSTATUS WINAPI NtLockFile(HANDLE,HANDLE,PIO_APC_ROUTINE,void*,PIO_STATUS_BLOCK,PLARGE_INTEGER,PLARGE_INTEGER,ULONG*,BOOLEAN,BOOLEAN);
NTSTATUS WINAPI NtLockVirtualMemory(HANDLE,PVOID*,ULONG*,ULONG);
NTSTATUS WINAPI NtMapViewOfSection(HANDLE,HANDLE,PVOID*,ULONG,ULONG,const LARGE_INTEGER*,ULONG*,SECTION_INHERIT,ULONG,ULONG);
NTSTATUS WINAPI NtNotifyChangeKey(HKEY,HANDLE,PIO_APC_ROUTINE,PVOID,PIO_STATUS_BLOCK,ULONG,BOOLEAN,PVOID,ULONG,BOOLEAN);
@@ -951,6 +952,7 @@
NTSTATUS WINAPI NtPulseEvent(HANDLE,PULONG);
NTSTATUS WINAPI NtQueueApcThread(HANDLE,PNTAPCFUNC,ULONG_PTR,ULONG_PTR,ULONG_PTR);
NTSTATUS WINAPI NtQueryDefaultLocale(BOOLEAN,LCID*);
+NTSTATUS WINAPI NtQueryInformationFile(HANDLE,PIO_STATUS_BLOCK,PVOID,LONG,FILE_INFORMATION_CLASS);
NTSTATUS WINAPI NtQueryInformationProcess(HANDLE,PROCESSINFOCLASS,PVOID,ULONG,PULONG);
NTSTATUS WINAPI NtQueryInformationThread(HANDLE,THREADINFOCLASS,PVOID,ULONG,PULONG);
NTSTATUS WINAPI NtQueryInformationToken(HANDLE,DWORD,LPVOID,DWORD,LPDWORD);
@@ -973,6 +975,7 @@
NTSTATUS WINAPI NtSetContextThread(HANDLE,const CONTEXT*);
NTSTATUS WINAPI NtSetDefaultLocale(BOOLEAN,LCID);
NTSTATUS WINAPI NtSetEvent(HANDLE,PULONG);
+NTSTATUS WINAPI NtSetInformationFile(HANDLE,PIO_STATUS_BLOCK,PVOID,ULONG,FILE_INFORMATION_CLASS);
NTSTATUS WINAPI NtSetInformationKey(HKEY,const int,PVOID,ULONG);
NTSTATUS WINAPI NtSetInformationObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG);
NTSTATUS WINAPI NtSetSecurityObject(HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
@@ -983,6 +986,7 @@
NTSTATUS WINAPI NtTerminateProcess(HANDLE,LONG);
NTSTATUS WINAPI NtTerminateThread(HANDLE,LONG);
NTSTATUS WINAPI NtUnloadKey(HKEY);
+NTSTATUS WINAPI NtUnlockFile(HANDLE,PIO_STATUS_BLOCK,PLARGE_INTEGER,PLARGE_INTEGER,PULONG);
NTSTATUS WINAPI NtUnlockVirtualMemory(HANDLE,PVOID*,ULONG*,ULONG);
NTSTATUS WINAPI NtUnmapViewOfSection(HANDLE,PVOID);
NTSTATUS WINAPI NtWaitForSingleObject(HANDLE,BOOLEAN,PLARGE_INTEGER);
diff -u -N -r -x '*~' -x '.#*' -x CVS scheduler28/process.c scheduler/process.c
--- scheduler28/process.c 2003-06-21 09:31:18.000000000 +0200
+++ scheduler/process.c 2003-06-21 10:34:20.000000000 +0200
@@ -368,7 +368,7 @@
/* <hack: to be changed later on> */
process_pmts.CurrentDirectoryName.Length = 3 * sizeof(WCHAR);
process_pmts.CurrentDirectoryName.MaximumLength = RtlGetLongestNtPathLength() * sizeof(WCHAR);
- process_pmts.CurrentDirectoryName.Buffer = RtlAllocateHeap( NtCurrentTeb()->Peb->ProcessHeap, 0, process_pmts.CurrentDirectoryName.MaximumLength);
+ process_pmts.CurrentDirectoryName.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, process_pmts.CurrentDirectoryName.MaximumLength);
process_pmts.CurrentDirectoryName.Buffer[0] = 'C';
process_pmts.CurrentDirectoryName.Buffer[1] = ':';
process_pmts.CurrentDirectoryName.Buffer[2] = '\\';
diff -u -N -r -x '*~' -x '.#*' -x CVS server28/file.c server/file.c
--- server28/file.c 2003-05-15 20:34:06.000000000 +0200
+++ server/file.c 2003-05-25 13:15:12.000000000 +0200
@@ -329,15 +329,22 @@
if (!(st.st_mode & S_IWUSR)) reply->attr |= FILE_ATTRIBUTE_READONLY;
reply->access_time = st.st_atime;
reply->write_time = st.st_mtime;
+ reply->change_time = st.st_ctime;
if (S_ISDIR(st.st_mode))
{
- reply->size_high = 0;
- reply->size_low = 0;
+ reply->size_high = 0;
+ reply->size_low = 0;
+ reply->alloc_high = 0;
+ reply->alloc_low = 0;
}
else
{
- reply->size_high = st.st_size >> 32;
- reply->size_low = st.st_size & 0xffffffff;
+ file_pos_t alloc;
+ reply->size_high = st.st_size >> 32;
+ reply->size_low = st.st_size & 0xffffffff;
+ alloc = (file_pos_t)st.st_blksize * st.st_blocks;
+ reply->alloc_high = alloc >> 32;
+ reply->alloc_low = alloc & 0xffffffff;
}
reply->links = st.st_nlink;
reply->index_high = st.st_dev;
diff -u -N -r -x '*~' -x '.#*' -x CVS server28/protocol.def server/protocol.def
--- server28/protocol.def 2003-06-21 09:29:28.000000000 +0200
+++ server/protocol.def 2003-06-21 10:25:12.000000000 +0200
@@ -677,8 +677,11 @@
int attr; /* file attributes */
time_t access_time; /* last access time */
time_t write_time; /* last write time */
+ time_t change_time; /* last change time */
int size_high; /* file size */
int size_low; /* file size */
+ int alloc_high; /* size used on disk */
+ int alloc_low; /* size used on disk */
int links; /* number of links */
int index_high; /* unique index */
int index_low; /* unique index */
diff -u -N -r -x '*~' -x '.#*' -x CVS server28/trace.c server/trace.c
--- server28/trace.c 2003-06-21 09:29:28.000000000 +0200
+++ server/trace.c 2003-06-21 10:25:12.000000000 +0200
@@ -893,8 +893,11 @@
fprintf( stderr, " attr=%d,", req->attr );
fprintf( stderr, " access_time=%ld,", req->access_time );
fprintf( stderr, " write_time=%ld,", req->write_time );
+ fprintf( stderr, " change_time=%ld,", req->change_time );
fprintf( stderr, " size_high=%d,", req->size_high );
fprintf( stderr, " size_low=%d,", req->size_low );
+ fprintf( stderr, " alloc_high=%d,", req->alloc_high );
+ fprintf( stderr, " alloc_low=%d,", req->alloc_low );
fprintf( stderr, " links=%d,", req->links );
fprintf( stderr, " index_high=%d,", req->index_high );
fprintf( stderr, " index_low=%d,", req->index_low );
Index: misc/registry.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/misc/registry.c,v
retrieving revision 1.126
diff -u -r1.126 registry.c
--- misc/registry.c 2 May 2003 20:17:32 -0000 1.126
+++ misc/registry.c 25 May 2003 09:53:22 -0000
@@ -313,7 +313,7 @@
};
/* recursive helper function to display a directory tree [Internal] */
-void _w31_dumptree(unsigned short idx,unsigned char *txt,struct _w31_tabent *tab,struct _w31_header *head,HKEY hkey,time_t lastmodified, int level)
+static void _w31_dumptree(unsigned short idx,unsigned char *txt,struct _w31_tabent *tab,struct _w31_header *head,HKEY hkey,time_t lastmodified, int level)
{
static const WCHAR classesW[] = {'.','c','l','a','s','s','e','s',0};
struct _w31_dirent *dir;
@@ -379,9 +379,9 @@
/******************************************************************************
* _w31_loadreg [Internal]
*/
-void _w31_loadreg(void)
+static void _w31_loadreg(void)
{
- HFILE hf;
+ HANDLE hf;
HKEY root;
OBJECT_ATTRIBUTES attr;
UNICODE_STRING nameW;
@@ -392,56 +392,57 @@
OFSTRUCT ofs;
BY_HANDLE_FILE_INFORMATION hfinfo;
time_t lastmodified;
+ DWORD r;
TRACE("(void)\n");
- hf = OpenFile("reg.dat",&ofs,OF_READ);
- if (hf==HFILE_ERROR) return;
+ hf = (HANDLE)OpenFile("reg.dat",&ofs,OF_READ);
+ if (hf==(HANDLE)HFILE_ERROR) return;
/* read & dump header */
- if (sizeof(head)!=_lread(hf,&head,sizeof(head))) {
+ if (!ReadFile(hf,&head,sizeof(head),&r,NULL) || r!=sizeof(head)) {
ERR("reg.dat is too short.\n");
- _lclose(hf);
+ CloseHandle(hf);
return;
}
if (memcmp(head.cookie, "SHCC3.10", sizeof(head.cookie))!=0) {
ERR("reg.dat has bad signature.\n");
- _lclose(hf);
+ CloseHandle(hf);
return;
}
len = head.tabcnt * sizeof(struct _w31_tabent);
/* read and dump index table */
tab = _xmalloc(len);
- if (len!=_lread(hf,tab,len)) {
+ if (!ReadFile(hf,tab,len,&r,NULL) || r!=len) {
ERR("couldn't read %d bytes.\n",len);
free(tab);
- _lclose(hf);
+ CloseHandle(hf);
return;
}
/* read text */
txt = _xmalloc(head.textsize);
- if (-1==_llseek(hf,head.textoff,SEEK_SET)) {
+ if (-1==SetFilePointer(hf,head.textoff,NULL,SEEK_SET)) {
ERR("couldn't seek to textblock.\n");
free(tab);
free(txt);
- _lclose(hf);
+ CloseHandle(hf);
return;
}
- if (head.textsize!=_lread(hf,txt,head.textsize)) {
+ if (!ReadFile(hf,txt,head.textsize,&r,NULL) || r!=head.textsize) {
ERR("textblock too short (%d instead of %ld).\n",len,head.textsize);
free(tab);
free(txt);
- _lclose(hf);
+ CloseHandle(hf);
return;
}
- if (!GetFileInformationByHandle((HANDLE)hf,&hfinfo)) {
+ if (!GetFileInformationByHandle(hf,&hfinfo)) {
ERR("GetFileInformationByHandle failed?.\n");
free(tab);
free(txt);
- _lclose(hf);
+ CloseHandle(hf);
return;
}
lastmodified = DOSFS_FileTimeToUnixTime(&hfinfo.ftLastWriteTime,NULL);
@@ -461,7 +462,7 @@
}
free(tab);
free(txt);
- _lclose(hf);
+ CloseHandle(hf);
return;
}
More information about the wine-patches
mailing list