* autoload.cc: Add load statement for `NtOpenFile'.

* fhandler.h (fhandler_dev_raw::get_unit): New method.
	(fhandler_dev_tape::norewind): Eliminate.
	(fhandler_dev_tape::is_rewind_device): New method.
	* fhandler_raw.cc (fhandler_dev_raw::open): Open new
	fixed device name devices using NT internal method.
	Keep calling fhandler_base::open() for old mount table
	device mapping compatibility devices.
	(fhandler_dev_raw::fstat): Eliminate.  Settings are done
	by fhandler_base::fstat() already.
	* fhandler_tape.cc: Remove `norewind' usage throughout.
	* ntdll.h: Define FILE_SYNCHRONOUS_IO_NONALERT.
	Define struct _IO_STATUS_BLOCK.
	Declare NtOpenFile().
	* path.cc (get_raw_device_number): Add new approach for
	using fixed device names.
	(win32_device_name): Ditto.
	(get_device_number): Ditto.  Require POSIX path to begin
	with "/dev/".
	(mount_info::conv_to_win32_path): Call win32_device_name()
	instead of get_device_number() after evaluating mount points
	to allow changing the win32 destination path again.
	* security.cc (str2buf2uni): Remove `static' to be able to
	call function from fhandler_dev_raw::open().
	* wincap.cc: Set flag has_raw_devices appropriately.
	* wincap.h: Add flag has_raw_devices.
This commit is contained in:
Corinna Vinschen
2001-10-16 14:53:26 +00:00
parent 2ac3bab68d
commit 990690655c
10 changed files with 253 additions and 60 deletions

View File

@@ -16,6 +16,7 @@
#include <cygwin/rdevio.h>
#include <sys/mtio.h>
#include <ntdef.h>
#include "cygerrno.h"
#include "perprocess.h"
#include "security.h"
@@ -23,6 +24,7 @@
#include "path.h"
#include "dtable.h"
#include "cygheap.h"
#include "ntdll.h"
/* static wrapper functions to hide the effect of media changes and
bus resets which occurs after a new media is inserted. This is
@@ -132,22 +134,69 @@ fhandler_dev_raw::~fhandler_dev_raw (void)
}
int
fhandler_dev_raw::open (path_conv *, int flags, mode_t)
fhandler_dev_raw::open (path_conv *real_path, int flags, mode_t)
{
int ret;
if (!wincap.has_raw_devices ())
{
set_errno (ENOENT);
debug_printf("%s is accessible under NT/W2K only",real_path->get_win32());
return 0;
}
/* Check for illegal flags. */
if (flags & (O_APPEND | O_EXCL))
{
set_errno (EINVAL);
return 0;
}
/* Always open a raw device existing and binary. */
flags &= ~(O_CREAT | O_TRUNC);
flags |= O_BINARY;
ret = fhandler_base::open (NULL, flags);
if (ret)
if (get_device () == FH_FLOPPY && get_unit () >= 224)
{
if (devbufsiz > 1L)
devbuf = new char [devbufsiz];
/* Compatibility mode for old mount table device mapping. */
if (!fhandler_base::open (real_path, flags))
return 0;
}
else
devbufsiz = 0;
return ret;
{
DWORD access = GENERIC_READ | SYNCHRONIZE;
if (get_device () == FH_TAPE
|| (flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_WRONLY
|| (flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDWR)
access |= GENERIC_WRITE;
extern void str2buf2uni (UNICODE_STRING &, WCHAR *, const char *);
UNICODE_STRING dev;
WCHAR devname[MAX_PATH + 1];
str2buf2uni (dev, devname, real_path->get_win32 ());
OBJECT_ATTRIBUTES attr;
InitializeObjectAttributes(&attr, &dev, OBJ_CASE_INSENSITIVE, NULL, NULL);
HANDLE h;
IO_STATUS_BLOCK io;
NTSTATUS status = NtOpenFile (&h, access, &attr, &io, wincap.shared (),
FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS (status))
{
set_errno (RtlNtStatusToDosError (status));
debug_printf ("NtOpenFile: NTSTATUS: %d, Win32: %E", status);
return 0;
}
set_io_handle (h);
set_flags (flags);
}
set_r_binary (O_BINARY);
set_w_binary (O_BINARY);
if (devbufsiz > 1L)
devbuf = new char [devbufsiz];
return 1;
}
int
@@ -156,15 +205,6 @@ fhandler_dev_raw::close (void)
return fhandler_base::close ();
}
int
fhandler_dev_raw::fstat (struct stat *buf, path_conv *pc)
{
this->fhandler_base::fstat (buf, pc);
buf->st_blksize = devbuf ? devbufsiz : 1;
return 0;
}
int
fhandler_dev_raw::raw_read (void *ptr, size_t ulen)
{