Partially implement NtOpenFile and NtReadFile.

This commit is contained in:
Mike McCormack 2002-06-14 00:36:20 +00:00 committed by Alexandre Julliard
parent 9428f06993
commit 55d1ea7c75
1 changed files with 161 additions and 4 deletions

View File

@ -16,16 +16,28 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "config.h"
#include "wine/port.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#ifdef HAVE_SYS_ERRNO_H
#include <sys/errno.h>
#endif
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/server.h"
#include "ntdll_misc.h" #include "ntdll_misc.h"
#include "file.h" /* FIXME */
#include "ntddk.h" #include "ntddk.h"
#include "winioctl.h" #include "winioctl.h"
WINE_DEFAULT_DEBUG_CHANNEL(ntdll); WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
/************************************************************************** /**************************************************************************
* NtOpenFile [NTDLL.@] * NtOpenFile [NTDLL.@]
* ZwOpenFile [NTDLL.@] * ZwOpenFile [NTDLL.@]
@ -46,11 +58,60 @@ NTSTATUS WINAPI NtOpenFile(
ULONG ShareAccess, ULONG ShareAccess,
ULONG OpenOptions) ULONG OpenOptions)
{ {
FIXME("(%p,0x%08lx,%p,%p,0x%08lx,0x%08lx) stub\n", ULONG len = 0;
FileHandle, DesiredAccess, ObjectAttributes, PSTR filename;
IoStatusBlock, ShareAccess, OpenOptions); CHAR szDosDevices[] = "\\DosDevices\\";
DOS_FULL_NAME full_name;
NTSTATUS r;
FIXME("(%p,0x%08lx,%p,%p,0x%08lx,0x%08lx) partial stub\n",
FileHandle, DesiredAccess, ObjectAttributes,
IoStatusBlock, ShareAccess, OpenOptions);
dump_ObjectAttributes (ObjectAttributes); dump_ObjectAttributes (ObjectAttributes);
return 0;
if(ObjectAttributes->RootDirectory)
{
FIXME("Object root directory unknown %x\n",
ObjectAttributes->RootDirectory);
return STATUS_OBJECT_NAME_NOT_FOUND;
}
/* create an ascii string from the unicode filename */
RtlUnicodeToMultiByteSize( &len, ObjectAttributes->ObjectName->Buffer,
ObjectAttributes->ObjectName->Length );
filename = RtlAllocateHeap( GetProcessHeap(), 0, len + 1);
RtlUnicodeToMultiByteN(filename, len, NULL, ObjectAttributes->ObjectName->Buffer,
ObjectAttributes->ObjectName->Length );
filename[len]=0;
/* FIXME: DOSFS stuff should call here, not vice-versa */
if(strncmp(filename, szDosDevices, strlen(szDosDevices)))
return STATUS_OBJECT_NAME_NOT_FOUND;
/* FIXME: this calls SetLastError() -> bad */
if(!DOSFS_GetFullName(&filename[strlen(szDosDevices)], TRUE,
&full_name))
return STATUS_OBJECT_NAME_NOT_FOUND;
/* FIXME: modify server protocol so
create file takes an OBJECT_ATTRIBUTES structure */
SERVER_START_REQ( create_file )
{
req->access = DesiredAccess;
req->inherit = 0;
req->sharing = ShareAccess;
req->create = OPEN_EXISTING;
req->attrs = 0;
req->drive_type = GetDriveTypeA( full_name.short_name );
wine_server_add_data( req, full_name.long_name, strlen(full_name.long_name) );
SetLastError(0);
r = wine_server_call( req );
*FileHandle = reply->handle;
}
SERVER_END_REQ;
return r;
} }
/************************************************************************** /**************************************************************************
@ -94,6 +155,34 @@ NTSTATUS WINAPI NtCreateFile(
return 0; return 0;
} }
/* set the last error depending on errno */
NTSTATUS NTFILE_errno_to_status(int val)
{
switch (val)
{
case EAGAIN: return ( STATUS_SHARING_VIOLATION );
case ESPIPE:
case EBADF: return ( STATUS_INVALID_HANDLE );
case ENOSPC: return ( STATUS_DISK_FULL );
case EACCES:
case ESRCH:
case EPERM: return ( STATUS_ACCESS_DENIED );
case EROFS: return ( STATUS_MEDIA_WRITE_PROTECTED );
case EBUSY: return ( STATUS_FILE_LOCK_CONFLICT );
case ENOENT: return ( STATUS_NO_SUCH_FILE );
case EISDIR: return ( STATUS_FILE_IS_A_DIRECTORY );
case ENFILE:
case EMFILE: return ( STATUS_NO_MORE_FILES );
case EEXIST: return ( STATUS_OBJECT_NAME_COLLISION );
case EINVAL: return ( STATUS_INVALID_PARAMETER );
case ENOTEMPTY: return ( STATUS_DIRECTORY_NOT_EMPTY );
case EIO: return ( STATUS_ACCESS_VIOLATION );
}
perror("file_set_error");
return ( STATUS_INVALID_PARAMETER );
}
/****************************************************************************** /******************************************************************************
* NtReadFile [NTDLL.@] * NtReadFile [NTDLL.@]
* ZwReadFile [NTDLL.@] * ZwReadFile [NTDLL.@]
@ -108,6 +197,8 @@ NTSTATUS WINAPI NtCreateFile(
* ULONG Length * ULONG Length
* PLARGE_INTEGER ByteOffset OPTIONAL * PLARGE_INTEGER ByteOffset OPTIONAL
* PULONG Key OPTIONAL * PULONG Key OPTIONAL
*
* IoStatusBlock->Information contains the number of bytes read on return.
*/ */
NTSTATUS WINAPI NtReadFile ( NTSTATUS WINAPI NtReadFile (
HANDLE FileHandle, HANDLE FileHandle,
@ -119,6 +210,72 @@ NTSTATUS WINAPI NtReadFile (
ULONG Length, ULONG Length,
PLARGE_INTEGER ByteOffset, PLARGE_INTEGER ByteOffset,
PULONG Key) PULONG Key)
{
int fd, result, flags, ret;
enum fd_type type;
FIXME("(0x%08x,0x%08x,%p,%p,%p,%p,0x%08lx,%p,%p),partial stub!\n",
FileHandle,EventHandle,ApcRoutine,ApcContext,IoStatusBlock,Buffer,Length,ByteOffset,Key);
if (IsBadWritePtr( Buffer, Length ) ||
IsBadWritePtr( IoStatusBlock, sizeof *IoStatusBlock) ||
IsBadWritePtr( ByteOffset, sizeof *ByteOffset) )
return STATUS_ACCESS_VIOLATION;
IoStatusBlock->Information = 0;
ret = wine_server_handle_to_fd( FileHandle, GENERIC_READ, &fd, &type, &flags );
if(ret)
return ret;
/* FIXME: this code only does synchronous reads so far */
/* FIXME: depending on how libc implements this, between two processes
there could be a race condition between the seek and read here */
do
{
result = pread( fd, Buffer, Length, ByteOffset->QuadPart);
}
while ( (result == -1) && ((errno == EAGAIN) || (errno == EINTR)) );
close( fd );
if (result == -1)
{
return IoStatusBlock->u.Status = NTFILE_errno_to_status(errno);
}
IoStatusBlock->Information = result;
IoStatusBlock->u.Status = 0;
return STATUS_SUCCESS;
}
/******************************************************************************
* NtWriteFile [NTDLL.@]
* ZwWriteFile [NTDLL.@]
*
* Parameters
* HANDLE32 FileHandle
* HANDLE32 Event OPTIONAL
* PIO_APC_ROUTINE ApcRoutine OPTIONAL
* PVOID ApcContext OPTIONAL
* PIO_STATUS_BLOCK IoStatusBlock
* PVOID Buffer
* ULONG Length
* PLARGE_INTEGER ByteOffset OPTIONAL
* PULONG Key OPTIONAL
*/
NTSTATUS WINAPI NtWriteFile (
HANDLE FileHandle,
HANDLE EventHandle,
PIO_APC_ROUTINE ApcRoutine,
PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock,
PVOID Buffer,
ULONG Length,
PLARGE_INTEGER ByteOffset,
PULONG Key)
{ {
FIXME("(0x%08x,0x%08x,%p,%p,%p,%p,0x%08lx,%p,%p),stub!\n", FIXME("(0x%08x,0x%08x,%p,%p,%p,%p,0x%08lx,%p,%p),stub!\n",
FileHandle,EventHandle,ApcRoutine,ApcContext,IoStatusBlock,Buffer,Length,ByteOffset,Key); FileHandle,EventHandle,ApcRoutine,ApcContext,IoStatusBlock,Buffer,Length,ByteOffset,Key);