1 /* fhandler_mem.cc. See fhandler.h for a description of the fhandler classes.
3 Copyright 1999, 2000 Cygnus Solutions.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
12 #include <sys/termios.h>
25 NTSTATUS NTAPI NtMapViewOfSection(HANDLE,HANDLE,PVOID*,ULONG,ULONG,
26 PLARGE_INTEGER,PULONG,SECTION_INHERIT,
28 NTSTATUS NTAPI NtOpenSection(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES);
29 NTSTATUS NTAPI NtUnmapViewOfSection(HANDLE,PVOID);
30 VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING,PCWSTR);
31 ULONG NTAPI RtlNtStatusToDosError(NTSTATUS);
34 /**********************************************************************/
35 /* fhandler_dev_mem */
37 fhandler_dev_mem::fhandler_dev_mem (const char *name, int)
38 : fhandler_base (FH_MEM, name),
43 fhandler_dev_mem::~fhandler_dev_mem (void)
48 fhandler_dev_mem::open (const char *, int flags, mode_t)
50 if (os_being_run != winNT)
53 debug_printf ("/dev/mem is accessible under NT/W2K only");
57 UNICODE_STRING memstr;
58 RtlInitUnicodeString (&memstr, L"\\device\\physicalmemory");
60 OBJECT_ATTRIBUTES attr;
61 InitializeObjectAttributes(&attr, &memstr, OBJ_CASE_INSENSITIVE, NULL, NULL);
63 if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDONLY)
64 set_access (SECTION_MAP_READ);
65 else if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_WRONLY)
66 set_access (SECTION_MAP_WRITE);
68 set_access (SECTION_MAP_READ | SECTION_MAP_WRITE);
71 NTSTATUS ret = NtOpenSection (&mem, get_access (), &attr);
74 __seterrno_from_win_error (RtlNtStatusToDosError (ret));
84 fhandler_dev_mem::write (const void *ptr, size_t len)
91 fhandler_dev_mem::read (void *ptr, size_t ulen)
96 PHYSICAL_ADDRESS phys;
99 DWORD len = ulen + 4095;
101 phys.QuadPart = (ULONGLONG) pos;
102 if ((ret = NtMapViewOfSection (get_handle (),
103 INVALID_HANDLE_VALUE,
111 PAGE_READONLY)) != STATUS_SUCCESS)
113 __seterrno_from_win_error (RtlNtStatusToDosError (ret));
117 memcpy (ptr, (char *) viewmem + (pos - phys.QuadPart), ulen);
119 if (!NT_SUCCESS(ret = NtUnmapViewOfSection (INVALID_HANDLE_VALUE, viewmem)))
121 __seterrno_from_win_error (RtlNtStatusToDosError (ret));
131 fhandler_dev_mem::close (void)
133 return fhandler_base::close ();
137 fhandler_dev_mem::lseek (off_t offset, int whence)
163 fhandler_dev_mem::fstat (struct stat *buf)
171 memset (buf, 0, sizeof *buf);
172 buf->st_mode = S_IFCHR;
173 if (os_being_run != winNT)
174 buf->st_mode |= S_IRUSR | S_IWUSR |
178 buf->st_blksize = 4096;
179 buf->st_dev = buf->st_rdev = get_device () << 8;
185 fhandler_dev_mem::dup (fhandler_base *child)
192 fhandler_dev_mem::dump ()
194 paranoid_printf("here, fhandler_dev_mem");
199 LoadDLLinitfunc (ntdll)
202 static NO_COPY LONG here = -1L;
204 while (InterlockedIncrement (&here))
206 InterlockedDecrement (&here);
207 small_printf ("Multiple tries to read ntdll.dll\n");
213 else if ((h = LoadLibrary ("ntdll.dll")) != NULL)
215 else if (!ntdll_handle)
216 api_fatal ("could not load ntdll.dll, %E");
218 InterlockedDecrement (&here);
222 static void dummy_autoload (void) __attribute__ ((unused));
224 dummy_autoload (void)
227 LoadDLLfuncEx (NtMapViewOfSection, 40, ntdll, 1)
228 LoadDLLfuncEx (NtOpenSection, 12, ntdll, 1)
229 LoadDLLfuncEx (NtUnmapViewOfSection, 8, ntdll, 1)
230 LoadDLLfuncEx (RtlInitUnicodeString, 8, ntdll, 1)
231 LoadDLLfuncEx (RtlNtStatusToDosError, 4, ntdll, 1)