mirror of
https://github.com/reactos/reactos
synced 2025-10-08 09:22:51 +02:00
Compare commits
11 Commits
sndblst
...
ReactOS-0.
Author | SHA1 | Date | |
---|---|---|---|
|
b9855717d2 | ||
|
95f1659d23 | ||
|
0927cf2cfa | ||
|
5c1b8a026c | ||
|
02b00d9c04 | ||
|
935b7c2953 | ||
|
1b7327da76 | ||
|
f77c44657c | ||
|
df0328b7cc | ||
|
94c8483b04 | ||
|
fc7e59ce74 |
@@ -1 +1 @@
|
|||||||
loaders\dos\loadros ntoskrnl\kimage.bin %1 %2 %3 %4
|
loaders\dos\loadros ntoskrnl\kimage.bin services\dd\ide\ide.o services\fs\vfat\vfatfsd.o services\dd\keyboard\keyboard.o %2 %3 %4
|
||||||
|
@@ -1,340 +0,0 @@
|
|||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
675 Mass Ave, Cambridge, MA 02139, USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Appendix: How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) 19yy <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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 General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
@@ -20,8 +20,5 @@ IoInitializeDpc
|
|||||||
IoInitializeTimer
|
IoInitializeTimer
|
||||||
IoStartTimer
|
IoStartTimer
|
||||||
IoStopTimer
|
IoStopTimer
|
||||||
|
|
||||||
Partially implemented
|
|
||||||
|
|
||||||
IoCreateDevice
|
IoCreateDevice
|
||||||
IoCallDriver
|
IoCallDriver
|
||||||
|
@@ -1,31 +0,0 @@
|
|||||||
* Kernel things implemented [exceptions in brackets]
|
|
||||||
|
|
||||||
Spinlocks [Uniprocessor only]
|
|
||||||
IRQ levels [Not APC_LEVEL or WAKE_LEVEL, uniprocessor only]
|
|
||||||
ISRs [Partial, uniprocessor only]
|
|
||||||
Timers [Untested]
|
|
||||||
DPCs [Untested]
|
|
||||||
Objects [Partial]
|
|
||||||
Namespace [Partial]
|
|
||||||
Handle tables [One process only]
|
|
||||||
Threads [Some initial work]
|
|
||||||
RTL list functions [All except sequenced lists]
|
|
||||||
Zones [Untested]
|
|
||||||
Memory pool [Working but semantics partially incompatiable]
|
|
||||||
Device objects [Some but no support for layering]
|
|
||||||
IRP [Partial]
|
|
||||||
Memory sections [Partial, no file mappings]
|
|
||||||
PCI interface [Probes but no support]
|
|
||||||
CreateFile API [Device only]
|
|
||||||
ReadFile/WriteFile API [Device only]
|
|
||||||
MDL functions [Untested]
|
|
||||||
|
|
||||||
* Kernel things unimplemented (partial)
|
|
||||||
|
|
||||||
Add support for source level debugging to Bochs
|
|
||||||
Support for remote debugging
|
|
||||||
Process managment
|
|
||||||
Dispatcher objects (Mutex, Semaphore etc)
|
|
||||||
Investigate user and kernel mode APCs
|
|
||||||
Asynchronous I/O
|
|
||||||
Optimization
|
|
@@ -15,7 +15,7 @@
|
|||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
#include "minix_fs.h"
|
#include "minix.h"
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
@@ -34,6 +34,7 @@ BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject,
|
|||||||
DPRINT("MinixReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
|
DPRINT("MinixReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
|
||||||
pDeviceObject,DiskSector,Buffer);
|
pDeviceObject,DiskSector,Buffer);
|
||||||
|
|
||||||
|
sectorNumber.HighPart = 0;
|
||||||
sectorNumber.LowPart = DiskSector * BLOCKSIZE;
|
sectorNumber.LowPart = DiskSector * BLOCKSIZE;
|
||||||
|
|
||||||
KeInitializeEvent(&event, NotificationEvent, FALSE);
|
KeInitializeEvent(&event, NotificationEvent, FALSE);
|
||||||
@@ -82,3 +83,51 @@ BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject,
|
|||||||
ExFreePool(mbr);
|
ExFreePool(mbr);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOLEAN MinixWriteSector(IN PDEVICE_OBJECT pDeviceObject,
|
||||||
|
IN ULONG DiskSector,
|
||||||
|
IN UCHAR* Buffer)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER sectorNumber;
|
||||||
|
PIRP irp;
|
||||||
|
IO_STATUS_BLOCK ioStatus;
|
||||||
|
KEVENT event;
|
||||||
|
NTSTATUS status;
|
||||||
|
ULONG sectorSize;
|
||||||
|
|
||||||
|
DPRINT("MinixWriteSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
|
||||||
|
pDeviceObject,DiskSector,Buffer);
|
||||||
|
|
||||||
|
sectorNumber.LowPart = DiskSector * BLOCKSIZE;
|
||||||
|
|
||||||
|
KeInitializeEvent(&event, NotificationEvent, FALSE);
|
||||||
|
|
||||||
|
sectorSize = BLOCKSIZE;
|
||||||
|
|
||||||
|
irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
|
||||||
|
pDeviceObject,
|
||||||
|
Buffer,
|
||||||
|
sectorSize,
|
||||||
|
§orNumber,
|
||||||
|
&event,
|
||||||
|
&ioStatus );
|
||||||
|
|
||||||
|
|
||||||
|
status = IoCallDriver(pDeviceObject,
|
||||||
|
irp);
|
||||||
|
|
||||||
|
if (status == STATUS_PENDING) {
|
||||||
|
KeWaitForSingleObject(&event,
|
||||||
|
Suspended,
|
||||||
|
KernelMode,
|
||||||
|
FALSE,
|
||||||
|
NULL);
|
||||||
|
status = ioStatus.Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(status)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
@@ -1,2 +1,9 @@
|
|||||||
all: minix.o blockdev.o
|
OBJECTS = block.o rw.o inode.o dir.o mount.o blockdev.o
|
||||||
$(LD) -r minix.o blockdev.o -o minixfsd.o
|
|
||||||
|
all: minix.o
|
||||||
|
|
||||||
|
minix.o: $(OBJECTS)
|
||||||
|
$(LD) -r $(OBJECTS) -o minix.o
|
||||||
|
|
||||||
|
WIN32_LEAN_AND_MEAN = yes
|
||||||
|
include ../../../rules.mak
|
||||||
|
@@ -1,454 +0,0 @@
|
|||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: services/fs/minix/minix.c
|
|
||||||
* PURPOSE: Minix FSD
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
|
||||||
#include <internal/string.h>
|
|
||||||
#include <wstring.h>
|
|
||||||
|
|
||||||
#define NDEBUG
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
#include "minix_fs.h"
|
|
||||||
|
|
||||||
/* GLOBALS ******************************************************************/
|
|
||||||
|
|
||||||
static PDRIVER_OBJECT DriverObject;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
PDEVICE_OBJECT AttachedDevice;
|
|
||||||
struct minix_inode root_inode;
|
|
||||||
char superblock_buf[BLOCKSIZE];
|
|
||||||
struct minix_super_block* sb;
|
|
||||||
} MINIX_DEVICE_EXTENSION;
|
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned int MinixGetIndirectBlock(struct minix_inode* inode,
|
|
||||||
unsigned char* buffer, int blk)
|
|
||||||
{
|
|
||||||
unsigned short int* buf = (unsigned short int *)buffer;
|
|
||||||
return(buf[blk]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int MinixGetBlock(PDEVICE_OBJECT DeviceObject,
|
|
||||||
struct minix_inode* inode,
|
|
||||||
int blk)
|
|
||||||
{
|
|
||||||
int block;
|
|
||||||
char* buffer;
|
|
||||||
|
|
||||||
|
|
||||||
DPRINT("MinixGetBlock(inode %x, blk %d)\n",inode,blk);
|
|
||||||
|
|
||||||
if (blk < 7)
|
|
||||||
{
|
|
||||||
block = inode->i_zone[blk];
|
|
||||||
return(block);
|
|
||||||
}
|
|
||||||
blk = blk - 7;
|
|
||||||
|
|
||||||
buffer = ExAllocatePool(NonPagedPool,1024);
|
|
||||||
|
|
||||||
if (blk < 512)
|
|
||||||
{
|
|
||||||
block = inode->i_zone[7];
|
|
||||||
MinixReadSector(DeviceObject,block,buffer);
|
|
||||||
block = MinixGetIndirectBlock(inode,buffer,blk);
|
|
||||||
ExFreePool(buffer);
|
|
||||||
return(block);
|
|
||||||
}
|
|
||||||
blk = blk - 512;
|
|
||||||
block = inode->i_zone[8];
|
|
||||||
MinixReadSector(DeviceObject,block,buffer);
|
|
||||||
block = MinixGetIndirectBlock(inode,buffer,(blk>>9)&511);
|
|
||||||
MinixReadSector(DeviceObject,block,buffer);
|
|
||||||
block = MinixGetIndirectBlock(inode,buffer,blk&511);
|
|
||||||
ExFreePool(buffer);
|
|
||||||
return(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS MinixReadBlock(PDEVICE_OBJECT DeviceObject,
|
|
||||||
struct minix_inode* inode,
|
|
||||||
int blk,
|
|
||||||
PVOID buffer)
|
|
||||||
{
|
|
||||||
unsigned int block;
|
|
||||||
|
|
||||||
DPRINT("MinixReadBlock(inode %x, blk %d, buffer %x)\n",inode,blk,buffer);
|
|
||||||
block = MinixGetBlock(DeviceObject,inode,blk);
|
|
||||||
DPRINT("block %d\n",block);
|
|
||||||
return(MinixReadSector(DeviceObject,block,buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID MinixMount(PDEVICE_OBJECT DeviceToMount)
|
|
||||||
{
|
|
||||||
PDEVICE_OBJECT DeviceObject;
|
|
||||||
MINIX_DEVICE_EXTENSION* DeviceExt;
|
|
||||||
|
|
||||||
IoCreateDevice(DriverObject,
|
|
||||||
sizeof(MINIX_DEVICE_EXTENSION),
|
|
||||||
NULL,
|
|
||||||
FILE_DEVICE_FILE_SYSTEM,
|
|
||||||
0,
|
|
||||||
FALSE,
|
|
||||||
&DeviceObject);
|
|
||||||
DeviceObject->Flags = DeviceObject->Flags | DO_DIRECT_IO;
|
|
||||||
DeviceExt = DeviceObject->DeviceExtension;
|
|
||||||
|
|
||||||
MinixReadSector(DeviceToMount,1,DeviceExt->superblock_buf);
|
|
||||||
DeviceExt->sb = (struct minix_super_block *)(DeviceExt->superblock_buf);
|
|
||||||
|
|
||||||
DeviceExt->AttachedDevice = IoAttachDeviceToDeviceStack(DeviceObject,
|
|
||||||
DeviceToMount);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS MinixFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|
||||||
{
|
|
||||||
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
|
|
||||||
PVPB vpb = Stack->Parameters.Mount.Vpb;
|
|
||||||
PDEVICE_OBJECT DeviceToMount = Stack->Parameters.Mount.DeviceObject;
|
|
||||||
NTSTATUS Status;
|
|
||||||
char* superblock_buf;
|
|
||||||
struct minix_super_block* sb;
|
|
||||||
|
|
||||||
DbgPrint("MinixFileSystemControl(DeviceObject %x, Irp %x)\n",DeviceObject,
|
|
||||||
Irp);
|
|
||||||
DPRINT("DeviceToMount %x\n",DeviceToMount);
|
|
||||||
|
|
||||||
superblock_buf = ExAllocatePool(NonPagedPool,BLOCKSIZE);
|
|
||||||
|
|
||||||
DPRINT("MinixReadSector %x\n",MinixReadSector);
|
|
||||||
MinixReadSector(DeviceToMount,1,superblock_buf);
|
|
||||||
sb = (struct minix_super_block *)superblock_buf;
|
|
||||||
DPRINT("Magic %x\n",sb->s_magic);
|
|
||||||
DPRINT("Imap blocks %x\n",sb->s_imap_blocks);
|
|
||||||
DPRINT("Zmap blocks %x\n",sb->s_zmap_blocks);
|
|
||||||
if (sb->s_magic==MINIX_SUPER_MAGIC2)
|
|
||||||
{
|
|
||||||
DPRINT("%s() = STATUS_SUCCESS\n",__FUNCTION__);
|
|
||||||
MinixMount(DeviceToMount);
|
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DPRINT("%s() = STATUS_UNRECOGNIZED_VOLUME\n",__FUNCTION__);
|
|
||||||
Status = STATUS_UNRECOGNIZED_VOLUME;
|
|
||||||
}
|
|
||||||
|
|
||||||
Irp->IoStatus.Status = Status;
|
|
||||||
Irp->IoStatus.Information = 0;
|
|
||||||
|
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS MinixReadInode(PDEVICE_OBJECT DeviceObject,
|
|
||||||
MINIX_DEVICE_EXTENSION* DeviceExt,
|
|
||||||
ULONG ino,
|
|
||||||
struct minix_inode* result)
|
|
||||||
{
|
|
||||||
int block;
|
|
||||||
char* buffer;
|
|
||||||
struct minix_inode* inodes;
|
|
||||||
|
|
||||||
DPRINT("MinixReadInode(ino %x, result %x)\n",ino,result);
|
|
||||||
|
|
||||||
buffer = ExAllocatePool(NonPagedPool,1024);
|
|
||||||
inodes = (struct minix_inode *)buffer;
|
|
||||||
|
|
||||||
block = 2 + DeviceExt->sb->s_imap_blocks + DeviceExt->sb->s_zmap_blocks
|
|
||||||
+ ((ino-1) / MINIX_INODES_PER_BLOCK);
|
|
||||||
DPRINT("Reading block %x offset %x\n",block,block*BLOCKSIZE);
|
|
||||||
DPRINT("Index %x\n",(ino-1)%MINIX_INODES_PER_BLOCK);
|
|
||||||
MinixReadSector(DeviceObject,block,buffer);
|
|
||||||
memcpy(result,&inodes[(ino-1)%MINIX_INODES_PER_BLOCK],
|
|
||||||
sizeof(struct minix_inode));
|
|
||||||
DPRINT("result->i_uid %x\n",result->i_uid);
|
|
||||||
DPRINT("result->i_size %x\n",result->i_size);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN MinixCompareUnicodeStringToAnsi(PCH AnsiStr, PWCHAR UnicodeStr,
|
|
||||||
ULONG MaxLen)
|
|
||||||
{
|
|
||||||
unsigned int i = 0;
|
|
||||||
|
|
||||||
while (i<MaxLen)
|
|
||||||
{
|
|
||||||
if ((*AnsiStr)!=(*UnicodeStr))
|
|
||||||
{
|
|
||||||
return(FALSE);
|
|
||||||
}
|
|
||||||
if ((*AnsiStr)==0 && (*UnicodeStr)==0)
|
|
||||||
{
|
|
||||||
return(TRUE);
|
|
||||||
}
|
|
||||||
AnsiStr++;
|
|
||||||
UnicodeStr++;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return(TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG MinixDirLookup(PDEVICE_OBJECT DeviceObject,
|
|
||||||
struct minix_inode* dir,
|
|
||||||
PWCHAR Name)
|
|
||||||
{
|
|
||||||
char* buffer;
|
|
||||||
struct minix_dir_entry* entry;
|
|
||||||
unsigned int offset;
|
|
||||||
unsigned int i;
|
|
||||||
unsigned int inode;
|
|
||||||
|
|
||||||
buffer=ExAllocatePool(NonPagedPool,BLOCKSIZE);
|
|
||||||
|
|
||||||
for (i=0;i<(dir->i_size/MINIX_DIR_ENTRY_SIZE);i++)
|
|
||||||
{
|
|
||||||
offset = i*MINIX_DIR_ENTRY_SIZE;
|
|
||||||
if ((offset%BLOCKSIZE)==0)
|
|
||||||
{
|
|
||||||
MinixReadBlock(DeviceObject,
|
|
||||||
dir,
|
|
||||||
offset/BLOCKSIZE,
|
|
||||||
buffer);
|
|
||||||
}
|
|
||||||
entry = (struct minix_dir_entry *)&buffer[offset%BLOCKSIZE];
|
|
||||||
DPRINT("Inode %x Name %.30s\n",entry->inode,entry->name);
|
|
||||||
if (MinixCompareUnicodeStringToAnsi(entry->name,Name,30))
|
|
||||||
{
|
|
||||||
inode = entry->inode;
|
|
||||||
ExFreePool(buffer);
|
|
||||||
DPRINT("MinixDirLookup() = %d\n",inode);
|
|
||||||
return(inode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ExFreePool(buffer);
|
|
||||||
DPRINT("MinixDirLookup() = %d\n",0);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS MinixOpen(PDEVICE_OBJECT DeviceObject,
|
|
||||||
MINIX_DEVICE_EXTENSION* DeviceExt,
|
|
||||||
PWSTR DeviceName,
|
|
||||||
struct minix_inode* result)
|
|
||||||
{
|
|
||||||
PWSTR current;
|
|
||||||
PWSTR next;
|
|
||||||
PWSTR string = DeviceName;
|
|
||||||
struct minix_inode current_dir;
|
|
||||||
unsigned int current_ino;
|
|
||||||
|
|
||||||
DbgPrint("MinixOpen(DeviceObject %x, DeviceName %w, result %x)\n",
|
|
||||||
DeviceObject,DeviceName,result);
|
|
||||||
DPRINT("DeviceName %x\n",DeviceName);
|
|
||||||
|
|
||||||
next = &string[0];
|
|
||||||
current = next+1;
|
|
||||||
|
|
||||||
current_ino = MINIX_ROOT_INO;
|
|
||||||
|
|
||||||
while (next!=NULL && current_ino!=0)
|
|
||||||
{
|
|
||||||
MinixReadInode(DeviceObject,DeviceExt,current_ino,¤t_dir);
|
|
||||||
|
|
||||||
DPRINT("current %w next %x\n",current,next);
|
|
||||||
|
|
||||||
*next = '\\';
|
|
||||||
current = next+1;
|
|
||||||
next = wcschr(next+1,'\\');
|
|
||||||
if (next!=NULL)
|
|
||||||
{
|
|
||||||
*next=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_ino = MinixDirLookup(DeviceObject,¤t_dir,current);
|
|
||||||
}
|
|
||||||
if (next==NULL && current_ino!=0)
|
|
||||||
{
|
|
||||||
MinixReadInode(DeviceObject,DeviceExt,current_ino,¤t_dir);
|
|
||||||
}
|
|
||||||
memcpy(result,¤t_dir,sizeof(struct minix_inode));
|
|
||||||
DPRINT("MinxOpen() = STATUS_SUCCESS\n",0);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS MinixWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|
||||||
{
|
|
||||||
DPRINT("MinixWrite(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
|
|
||||||
|
|
||||||
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|
||||||
Irp->IoStatus.Information = 0;
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS MinixRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|
||||||
{
|
|
||||||
ULONG Length;
|
|
||||||
PVOID Buffer;
|
|
||||||
ULONG Offset;
|
|
||||||
ULONG CurrentOffset;
|
|
||||||
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
|
|
||||||
PFILE_OBJECT FileObject = Stack->FileObject;
|
|
||||||
MINIX_DEVICE_EXTENSION* DeviceExt = DeviceObject->DeviceExtension;
|
|
||||||
struct minix_inode* inode = (struct minix_inode *)FileObject->FsContext;
|
|
||||||
PVOID TempBuffer;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
DPRINT("MinixRead(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
|
|
||||||
|
|
||||||
Length = Stack->Parameters.Read.Length;
|
|
||||||
Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
|
|
||||||
Offset = Stack->Parameters.Read.ByteOffset.LowPart;
|
|
||||||
|
|
||||||
TempBuffer = ExAllocatePool(NonPagedPool,BLOCKSIZE);
|
|
||||||
|
|
||||||
DPRINT("Length %x Buffer %x Offset %x\n",Length,Buffer,Offset);
|
|
||||||
|
|
||||||
CurrentOffset=Offset;
|
|
||||||
|
|
||||||
if ((Offset%BLOCKSIZE)!=0)
|
|
||||||
{
|
|
||||||
CHECKPOINT;
|
|
||||||
|
|
||||||
CurrentOffset = Offset - (Offset%BLOCKSIZE);
|
|
||||||
|
|
||||||
MinixReadBlock(DeviceExt->AttachedDevice,inode,
|
|
||||||
CurrentOffset/BLOCKSIZE,
|
|
||||||
TempBuffer);
|
|
||||||
memcpy(Buffer,TempBuffer+(Offset%BLOCKSIZE),
|
|
||||||
min(BLOCKSIZE - (Offset%BLOCKSIZE),Length));
|
|
||||||
DPRINT("(BLOCKSIZE - (Offset%BLOCKSIZE)) %d\n",
|
|
||||||
(BLOCKSIZE - (Offset%BLOCKSIZE)));
|
|
||||||
DPRINT("Length %d\n",Length);
|
|
||||||
CurrentOffset = CurrentOffset + BLOCKSIZE;
|
|
||||||
Buffer = Buffer + BLOCKSIZE - (Offset%BLOCKSIZE);
|
|
||||||
Length = Length - min(BLOCKSIZE - (Offset%BLOCKSIZE),Length);
|
|
||||||
DPRINT("CurrentOffset %d Buffer %x Length %d\n",CurrentOffset,Buffer,
|
|
||||||
Length);
|
|
||||||
}
|
|
||||||
for (i=0;i<(Length/BLOCKSIZE);i++)
|
|
||||||
{
|
|
||||||
CHECKPOINT;
|
|
||||||
|
|
||||||
MinixReadBlock(DeviceExt->AttachedDevice,inode,
|
|
||||||
CurrentOffset/BLOCKSIZE,Buffer);
|
|
||||||
CurrentOffset = CurrentOffset + BLOCKSIZE;
|
|
||||||
Buffer = Buffer + BLOCKSIZE;
|
|
||||||
Length = Length - BLOCKSIZE;
|
|
||||||
}
|
|
||||||
if (Length > 0)
|
|
||||||
{
|
|
||||||
CHECKPOINT;
|
|
||||||
|
|
||||||
MinixReadBlock(DeviceExt->AttachedDevice,inode,
|
|
||||||
CurrentOffset/BLOCKSIZE,
|
|
||||||
TempBuffer);
|
|
||||||
memcpy(Buffer,TempBuffer,Length);
|
|
||||||
}
|
|
||||||
|
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
||||||
Irp->IoStatus.Information = Length;
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS MinixClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|
||||||
{
|
|
||||||
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
|
|
||||||
PFILE_OBJECT FileObject = Stack->FileObject;
|
|
||||||
|
|
||||||
DPRINT("MinixClose(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
|
|
||||||
|
|
||||||
ExFreePool(FileObject->FsContext);
|
|
||||||
|
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
||||||
Irp->IoStatus.Information = 0;
|
|
||||||
|
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS MinixCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|
||||||
{
|
|
||||||
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
|
|
||||||
PFILE_OBJECT FileObject = Stack->FileObject;
|
|
||||||
NTSTATUS Status;
|
|
||||||
struct minix_inode* result;
|
|
||||||
MINIX_DEVICE_EXTENSION* DeviceExt;
|
|
||||||
|
|
||||||
DPRINT("MinixCreate(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
|
|
||||||
DPRINT("Opening file %x %w\n",FileObject->FileName.Buffer,
|
|
||||||
FileObject->FileName.Buffer);
|
|
||||||
DPRINT("FileObject->FileName.Buffer %x\n",
|
|
||||||
FileObject->FileName.Buffer);
|
|
||||||
|
|
||||||
DeviceExt = (MINIX_DEVICE_EXTENSION *)DeviceObject->DeviceExtension;
|
|
||||||
result = ExAllocatePool(NonPagedPool,sizeof(struct minix_inode));
|
|
||||||
DPRINT("result %x\n",result);
|
|
||||||
Status = MinixOpen(DeviceExt->AttachedDevice,DeviceExt,
|
|
||||||
FileObject->FileName.Buffer,result);
|
|
||||||
|
|
||||||
if (Status==STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
FileObject->FsContext=result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Irp->IoStatus.Status = Status;
|
|
||||||
Irp->IoStatus.Information = 0;
|
|
||||||
|
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS DriverEntry(PDRIVER_OBJECT _DriverObject,
|
|
||||||
PUNICODE_STRING RegistryPath)
|
|
||||||
/*
|
|
||||||
* FUNCTION: Called by the system to initalize the driver
|
|
||||||
* ARGUMENTS:
|
|
||||||
* DriverObject = object describing this driver
|
|
||||||
* RegistryPath = path to our configuration entries
|
|
||||||
* RETURNS: Success or failure
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
PDEVICE_OBJECT DeviceObject;
|
|
||||||
NTSTATUS ret;
|
|
||||||
UNICODE_STRING ustr;
|
|
||||||
ANSI_STRING astr;
|
|
||||||
|
|
||||||
DbgPrint("Minix FSD 0.0.1\n");
|
|
||||||
|
|
||||||
DriverObject = _DriverObject;
|
|
||||||
|
|
||||||
RtlInitAnsiString(&astr,"\\Device\\Minix");
|
|
||||||
RtlAnsiStringToUnicodeString(&ustr,&astr,TRUE);
|
|
||||||
ret = IoCreateDevice(DriverObject,0,&ustr,
|
|
||||||
FILE_DEVICE_PARALLEL_PORT,0,FALSE,&DeviceObject);
|
|
||||||
if (ret!=STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceObject->Flags=0;
|
|
||||||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = MinixClose;
|
|
||||||
DriverObject->MajorFunction[IRP_MJ_CREATE] = MinixCreate;
|
|
||||||
DriverObject->MajorFunction[IRP_MJ_READ] = MinixRead;
|
|
||||||
DriverObject->MajorFunction[IRP_MJ_WRITE] = MinixWrite;
|
|
||||||
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
|
|
||||||
MinixFileSystemControl;
|
|
||||||
DriverObject->DriverUnload = NULL;
|
|
||||||
|
|
||||||
IoRegisterFileSystem(DeviceObject);
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
@@ -1,80 +0,0 @@
|
|||||||
#define MINIX_ROOT_INO 1
|
|
||||||
|
|
||||||
/* Not the same as the bogus LINK_MAX in <linux/limits.h>. Oh well. */
|
|
||||||
#define MINIX_LINK_MAX 250
|
|
||||||
|
|
||||||
#define MINIX_I_MAP_SLOTS 8
|
|
||||||
#define MINIX_Z_MAP_SLOTS 64
|
|
||||||
#define MINIX_SUPER_MAGIC 0x137F /* original minix fs */
|
|
||||||
#define MINIX_SUPER_MAGIC2 0x138F /* minix fs, 30 char names */
|
|
||||||
#define MINIX2_SUPER_MAGIC 0x2468 /* minix V2 fs */
|
|
||||||
#define MINIX2_SUPER_MAGIC2 0x2478 /* minix V2 fs, 30 char names */
|
|
||||||
#define MINIX_VALID_FS 0x0001 /* Clean fs. */
|
|
||||||
#define MINIX_ERROR_FS 0x0002 /* fs has errors. */
|
|
||||||
|
|
||||||
#define MINIX_INODES_PER_BLOCK ((BLOCKSIZE)/(sizeof (struct minix_inode)))
|
|
||||||
#define MINIX2_INODES_PER_BLOCK ((BLOCKSIZE)/(sizeof (struct minix2_inode)))
|
|
||||||
|
|
||||||
#define MINIX_V1 0x0001 /* original minix fs */
|
|
||||||
#define MINIX_V2 0x0002 /* minix V2 fs */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the original minix inode layout on disk.
|
|
||||||
* Note the 8-bit gid and atime and ctime.
|
|
||||||
*/
|
|
||||||
struct minix_inode {
|
|
||||||
unsigned short int i_mode;
|
|
||||||
unsigned short int i_uid;
|
|
||||||
unsigned long i_size;
|
|
||||||
unsigned long i_time;
|
|
||||||
unsigned char i_gid;
|
|
||||||
unsigned char i_nlinks;
|
|
||||||
unsigned short int i_zone[9];
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The new minix inode has all the time entries, as well as
|
|
||||||
* long block numbers and a third indirect block (7+1+1+1
|
|
||||||
* instead of 7+1+1). Also, some previously 8-bit values are
|
|
||||||
* now 16-bit. The inode is now 64 bytes instead of 32.
|
|
||||||
*/
|
|
||||||
struct minix2_inode {
|
|
||||||
unsigned short int i_mode;
|
|
||||||
unsigned short int i_nlinks;
|
|
||||||
unsigned short int i_uid;
|
|
||||||
unsigned short int i_gid;
|
|
||||||
unsigned long i_size;
|
|
||||||
unsigned long i_atime;
|
|
||||||
unsigned long i_mtime;
|
|
||||||
unsigned long i_ctime;
|
|
||||||
unsigned long i_zone[10];
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* minix super-block data on disk
|
|
||||||
*/
|
|
||||||
struct minix_super_block {
|
|
||||||
unsigned short int s_ninodes;
|
|
||||||
unsigned short int s_nzones;
|
|
||||||
unsigned short int s_imap_blocks;
|
|
||||||
unsigned short int s_zmap_blocks;
|
|
||||||
unsigned short int s_firstdatazone;
|
|
||||||
unsigned short int s_log_zone_size;
|
|
||||||
unsigned long s_max_size;
|
|
||||||
unsigned short int s_magic;
|
|
||||||
unsigned short int s_state;
|
|
||||||
unsigned long s_zones;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct minix_dir_entry {
|
|
||||||
unsigned short int inode;
|
|
||||||
char name[0];
|
|
||||||
};
|
|
||||||
#define MINIX_DIR_ENTRY_SIZE (sizeof(struct minix_dir_entry)+30)
|
|
||||||
|
|
||||||
BOOLEAN MinixReadSector(IN PDEVICE_OBJECT pDeviceObject,
|
|
||||||
IN ULONG DiskSector,
|
|
||||||
IN UCHAR* Buffer);
|
|
||||||
|
|
||||||
#define BLOCKSIZE (1024)
|
|
@@ -1,11 +0,0 @@
|
|||||||
These are a selection of services for the ReactOS kernel. They include
|
|
||||||
|
|
||||||
parallel = parallel port driver
|
|
||||||
serial = serial port driver
|
|
||||||
mouse = mouse driver
|
|
||||||
null = null device driver
|
|
||||||
ide = IDE (hard disk) driver
|
|
||||||
keyboard = keyboard driver
|
|
||||||
loop = Allows accessing a file as a block device
|
|
||||||
scramdisk = Filesystem encryption driver
|
|
||||||
event = Sample driver demonstrating notifying a user thread using an event
|
|
@@ -43,9 +43,127 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
#endif /* !NULL */
|
#endif /* !NULL */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Definitions needed for the ddk includes (we miss out win32 only stuff to
|
||||||
|
* cut down on the compile time)
|
||||||
|
*/
|
||||||
|
typedef unsigned char UCHAR;
|
||||||
|
typedef unsigned int UINT;
|
||||||
|
typedef unsigned long ULONG;
|
||||||
|
typedef unsigned short USHORT;
|
||||||
|
typedef unsigned short WCHAR;
|
||||||
|
typedef unsigned short WORD;
|
||||||
|
typedef int WINBOOL;
|
||||||
|
typedef unsigned char BOOLEAN;
|
||||||
|
typedef unsigned int DWORD; /* was unsigned long */
|
||||||
|
typedef unsigned short *LPWSTR;
|
||||||
|
typedef unsigned short *PWSTR;
|
||||||
|
typedef unsigned char *PUCHAR;
|
||||||
|
typedef unsigned int *PUINT;
|
||||||
|
typedef unsigned long *PULONG;
|
||||||
|
typedef unsigned short *PUSHORT;
|
||||||
|
typedef void *PVOID;
|
||||||
|
typedef unsigned char BYTE;
|
||||||
|
typedef void *LPVOID;
|
||||||
|
|
||||||
|
/* Check VOID before defining CHAR, SHORT, and LONG */
|
||||||
|
#ifndef VOID
|
||||||
|
#define VOID void
|
||||||
|
typedef char CHAR;
|
||||||
|
typedef short SHORT;
|
||||||
|
typedef long LONG;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef CHAR *PCHAR;
|
||||||
|
typedef CHAR *PCH;
|
||||||
|
typedef void *HANDLE;
|
||||||
|
typedef char CCHAR;
|
||||||
|
|
||||||
|
typedef enum _SECURITY_IMPERSONATION_LEVEL {
|
||||||
|
SecurityAnonymous,
|
||||||
|
SecurityIdentification,
|
||||||
|
SecurityImpersonation,
|
||||||
|
SecurityDelegation
|
||||||
|
} SECURITY_IMPERSONATION_LEVEL;
|
||||||
|
|
||||||
|
typedef enum tagTOKEN_TYPE {
|
||||||
|
TokenPrimary = 1,
|
||||||
|
TokenImpersonation
|
||||||
|
} TOKEN_TYPE;
|
||||||
|
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
|
|
||||||
|
typedef const unsigned short *PCWSTR;
|
||||||
|
|
||||||
|
typedef char* PCSZ;
|
||||||
|
|
||||||
|
#define CONST const
|
||||||
|
|
||||||
|
#ifdef i386
|
||||||
|
#define STDCALL __attribute__ ((stdcall))
|
||||||
|
#define CDECL __attribute((cdecl))
|
||||||
|
#define CALLBACK WINAPI
|
||||||
|
#define PASCAL WINAPI
|
||||||
|
#else
|
||||||
|
#define STDCALL
|
||||||
|
#define CDECL
|
||||||
|
#define CALLBACK
|
||||||
|
#define PASCAL
|
||||||
|
#endif
|
||||||
|
#define WINAPI STDCALL
|
||||||
|
#define APIENTRY STDCALL
|
||||||
|
#define WINGDIAPI
|
||||||
|
|
||||||
|
typedef BYTE *PBOOLEAN;
|
||||||
|
typedef HANDLE *PHANDLE;
|
||||||
|
|
||||||
|
typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID);
|
||||||
|
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
|
||||||
|
|
||||||
|
typedef unsigned short ATOM;
|
||||||
|
|
||||||
|
#ifdef UNICODE
|
||||||
|
typedef unsigned short *LPTCH;
|
||||||
|
typedef unsigned short *LPTSTR;
|
||||||
|
#else
|
||||||
|
typedef char *LPTCH;
|
||||||
|
typedef char *LPTSTR;
|
||||||
|
#endif /* UNICODE */
|
||||||
|
|
||||||
|
typedef long *PLONG;
|
||||||
|
typedef unsigned short *PWCHAR;
|
||||||
|
typedef char *LPSTR;
|
||||||
|
typedef double LONGLONG, *PLONGLONG;
|
||||||
|
|
||||||
|
typedef enum _MEDIA_TYPE {
|
||||||
|
Unknown,
|
||||||
|
F5_1Pt2_512,
|
||||||
|
F3_1Pt44_512,
|
||||||
|
F3_2Pt88_512,
|
||||||
|
F3_20Pt8_512,
|
||||||
|
F3_720_512,
|
||||||
|
F5_360_512,
|
||||||
|
F5_320_512,
|
||||||
|
F5_320_1024,
|
||||||
|
F5_180_512,
|
||||||
|
F5_160_512,
|
||||||
|
RemovableMedia,
|
||||||
|
FixedMedia
|
||||||
|
} MEDIA_TYPE;
|
||||||
|
|
||||||
|
#ifndef max
|
||||||
|
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef min
|
||||||
|
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
#ifndef RC_INVOKED
|
#ifndef RC_INVOKED
|
||||||
|
|
||||||
/* typedef ACMDRIVERENUMCB;
|
/* typedef ACMDRIVERENUMCB;
|
||||||
@@ -58,30 +176,15 @@ typedef ACMFORMATENUMCB;
|
|||||||
typedef ACMFORMATTAGENUMCB;
|
typedef ACMFORMATTAGENUMCB;
|
||||||
typedef APPLET_PROC;
|
typedef APPLET_PROC;
|
||||||
*/
|
*/
|
||||||
typedef unsigned short ATOM;
|
|
||||||
/* Changed from BOOL to WINBOOL to avoid Objective-C conflict */
|
/* Changed from BOOL to WINBOOL to avoid Objective-C conflict */
|
||||||
typedef int WINBOOL;
|
|
||||||
typedef unsigned char BOOLEAN;
|
|
||||||
typedef unsigned char BYTE;
|
|
||||||
typedef unsigned long CALTYPE;
|
typedef unsigned long CALTYPE;
|
||||||
typedef unsigned long CALID;
|
typedef unsigned long CALID;
|
||||||
typedef char CCHAR;
|
|
||||||
typedef unsigned long COLORREF;
|
typedef unsigned long COLORREF;
|
||||||
#define CONST const
|
|
||||||
|
|
||||||
/* Check VOID before defining CHAR, SHORT, and LONG */
|
|
||||||
#ifndef VOID
|
|
||||||
#define VOID void
|
|
||||||
typedef char CHAR;
|
|
||||||
typedef short SHORT;
|
|
||||||
typedef long LONG;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
typedef CTRYID;
|
typedef CTRYID;
|
||||||
typedef DLGPROC;
|
typedef DLGPROC;
|
||||||
*/
|
*/
|
||||||
typedef unsigned int DWORD; /* was unsigned long */
|
|
||||||
typedef double DWORDLONG, *PDWORDLONG;
|
typedef double DWORDLONG, *PDWORDLONG;
|
||||||
/*
|
/*
|
||||||
typedef EDITWORDBREAKPROC;
|
typedef EDITWORDBREAKPROC;
|
||||||
@@ -92,7 +195,6 @@ typedef ENUMRESTYPEPROC;
|
|||||||
*/
|
*/
|
||||||
typedef float FLOAT;
|
typedef float FLOAT;
|
||||||
/* typedef GLOBALHANDLE; */
|
/* typedef GLOBALHANDLE; */
|
||||||
typedef void *HANDLE;
|
|
||||||
typedef HANDLE HACCEL;
|
typedef HANDLE HACCEL;
|
||||||
typedef HANDLE HBITMAP;
|
typedef HANDLE HBITMAP;
|
||||||
typedef HANDLE HBRUSH;
|
typedef HANDLE HBRUSH;
|
||||||
@@ -138,7 +240,6 @@ typedef unsigned short LANGID;
|
|||||||
typedef DWORD LCID;
|
typedef DWORD LCID;
|
||||||
typedef DWORD LCTYPE;
|
typedef DWORD LCTYPE;
|
||||||
/* typedef LOCALHANDLE */
|
/* typedef LOCALHANDLE */
|
||||||
typedef double LONGLONG, *PLONGLONG;
|
|
||||||
typedef unsigned short *LP;
|
typedef unsigned short *LP;
|
||||||
typedef long LPARAM;
|
typedef long LPARAM;
|
||||||
typedef WINBOOL *LPBOOL;
|
typedef WINBOOL *LPBOOL;
|
||||||
@@ -147,7 +248,6 @@ typedef CONST CHAR *LPCCH;
|
|||||||
typedef CHAR *LPCH;
|
typedef CHAR *LPCH;
|
||||||
typedef COLORREF *LPCOLORREF;
|
typedef COLORREF *LPCOLORREF;
|
||||||
typedef const char *LPCSTR;
|
typedef const char *LPCSTR;
|
||||||
typedef char* PCSZ;
|
|
||||||
|
|
||||||
#ifdef UNICODE
|
#ifdef UNICODE
|
||||||
typedef const unsigned short *LPCTSTR;
|
typedef const unsigned short *LPCTSTR;
|
||||||
@@ -163,41 +263,23 @@ typedef HANDLE *LPHANDLE;
|
|||||||
/* typedef LPHANDLER_FUNCTION; */
|
/* typedef LPHANDLER_FUNCTION; */
|
||||||
typedef int *LPINT;
|
typedef int *LPINT;
|
||||||
typedef long *LPLONG;
|
typedef long *LPLONG;
|
||||||
typedef char *LPSTR;
|
|
||||||
|
|
||||||
#ifdef UNICODE
|
|
||||||
typedef unsigned short *LPTCH;
|
|
||||||
typedef unsigned short *LPTSTR;
|
|
||||||
#else
|
|
||||||
typedef char *LPTCH;
|
|
||||||
typedef char *LPTSTR;
|
|
||||||
#endif /* UNICODE */
|
|
||||||
|
|
||||||
typedef long LRESULT;
|
typedef long LRESULT;
|
||||||
typedef void *LPVOID;
|
|
||||||
typedef const void *LPCVOID;
|
typedef const void *LPCVOID;
|
||||||
typedef unsigned short *LPWCH;
|
typedef unsigned short *LPWCH;
|
||||||
typedef unsigned short *LPWORD;
|
typedef unsigned short *LPWORD;
|
||||||
typedef unsigned short *LPWSTR;
|
|
||||||
typedef unsigned short *PWSTR;
|
|
||||||
/* typedef NPSTR; */
|
/* typedef NPSTR; */
|
||||||
typedef unsigned short *NWPSTR;
|
typedef unsigned short *NWPSTR;
|
||||||
typedef WINBOOL *PWINBOOL;
|
typedef WINBOOL *PWINBOOL;
|
||||||
typedef BYTE *PBOOLEAN;
|
|
||||||
typedef BYTE *PBYTE;
|
typedef BYTE *PBYTE;
|
||||||
typedef const CHAR *PCCH;
|
typedef const CHAR *PCCH;
|
||||||
typedef CHAR *PCH;
|
|
||||||
typedef CHAR *PCHAR;
|
|
||||||
typedef const char *PCSTR;
|
typedef const char *PCSTR;
|
||||||
typedef const unsigned short *PCWCH;
|
typedef const unsigned short *PCWCH;
|
||||||
typedef const unsigned short *PCWSTR;
|
|
||||||
typedef DWORD *PDWORD;
|
typedef DWORD *PDWORD;
|
||||||
typedef float *PFLOAT;
|
typedef float *PFLOAT;
|
||||||
typedef HANDLE *PHANDLE;
|
|
||||||
/* typedef PHKEY; */
|
/* typedef PHKEY; */
|
||||||
typedef int *PINT;
|
typedef int *PINT;
|
||||||
/* typedef LCID *PLCID; */
|
/* typedef LCID *PLCID; */
|
||||||
typedef long *PLONG;
|
|
||||||
typedef short *PSHORT;
|
typedef short *PSHORT;
|
||||||
/* typedef PSID; */
|
/* typedef PSID; */
|
||||||
typedef char *PSTR;
|
typedef char *PSTR;
|
||||||
@@ -215,13 +297,7 @@ typedef char *PTCHAR;
|
|||||||
typedef char *PTSTR;
|
typedef char *PTSTR;
|
||||||
#endif /* UNICODE */
|
#endif /* UNICODE */
|
||||||
|
|
||||||
typedef unsigned char *PUCHAR;
|
|
||||||
typedef unsigned int *PUINT;
|
|
||||||
typedef unsigned long *PULONG;
|
|
||||||
typedef unsigned short *PUSHORT;
|
|
||||||
typedef void *PVOID;
|
|
||||||
typedef unsigned short *PWCH;
|
typedef unsigned short *PWCH;
|
||||||
typedef unsigned short *PWCHAR;
|
|
||||||
typedef unsigned short *PWORD;
|
typedef unsigned short *PWORD;
|
||||||
/*
|
/*
|
||||||
typedef PWSTR;
|
typedef PWSTR;
|
||||||
@@ -246,30 +322,10 @@ typedef char TCHAR;
|
|||||||
typedef BYTE BCHAR;
|
typedef BYTE BCHAR;
|
||||||
#endif /* UNICODE */
|
#endif /* UNICODE */
|
||||||
|
|
||||||
typedef unsigned char UCHAR;
|
|
||||||
typedef unsigned int UINT;
|
|
||||||
typedef unsigned long ULONG;
|
|
||||||
typedef unsigned short USHORT;
|
|
||||||
typedef unsigned short WCHAR;
|
|
||||||
typedef unsigned short WORD;
|
|
||||||
typedef unsigned int WPARAM;
|
typedef unsigned int WPARAM;
|
||||||
/* typedef YIELDPROC; */
|
/* typedef YIELDPROC; */
|
||||||
|
|
||||||
/* Only use __stdcall under WIN32 compiler */
|
/* Only use __stdcall under WIN32 compiler */
|
||||||
#ifdef i386
|
|
||||||
#define STDCALL __attribute__ ((stdcall))
|
|
||||||
#define CDECL __attribute((cdecl))
|
|
||||||
#define CALLBACK WINAPI
|
|
||||||
#define PASCAL WINAPI
|
|
||||||
#else
|
|
||||||
#define STDCALL
|
|
||||||
#define CDECL
|
|
||||||
#define CALLBACK
|
|
||||||
#define PASCAL
|
|
||||||
#endif
|
|
||||||
#define WINAPI STDCALL
|
|
||||||
#define APIENTRY STDCALL
|
|
||||||
#define WINGDIAPI
|
|
||||||
|
|
||||||
#define _export
|
#define _export
|
||||||
|
|
||||||
@@ -281,21 +337,6 @@ typedef enum _ACL_INFORMATION_CLASS {
|
|||||||
AclSizeInformation
|
AclSizeInformation
|
||||||
} ACL_INFORMATION_CLASS;
|
} ACL_INFORMATION_CLASS;
|
||||||
|
|
||||||
typedef enum _MEDIA_TYPE {
|
|
||||||
Unknown,
|
|
||||||
F5_1Pt2_512,
|
|
||||||
F3_1Pt44_512,
|
|
||||||
F3_2Pt88_512,
|
|
||||||
F3_20Pt8_512,
|
|
||||||
F3_720_512,
|
|
||||||
F5_360_512,
|
|
||||||
F5_320_512,
|
|
||||||
F5_320_1024,
|
|
||||||
F5_180_512,
|
|
||||||
F5_160_512,
|
|
||||||
RemovableMedia,
|
|
||||||
FixedMedia
|
|
||||||
} MEDIA_TYPE;
|
|
||||||
|
|
||||||
#define RASCS_DONE 0x2000
|
#define RASCS_DONE 0x2000
|
||||||
#define RASCS_PAUSED 0x1000
|
#define RASCS_PAUSED 0x1000
|
||||||
@@ -339,14 +380,7 @@ typedef enum _RASPROJECTION {
|
|||||||
RASP_PppIpx = 0x802B,
|
RASP_PppIpx = 0x802B,
|
||||||
RASP_PppIp = 0x8021
|
RASP_PppIp = 0x8021
|
||||||
} RASPROJECTION ;
|
} RASPROJECTION ;
|
||||||
|
|
||||||
typedef enum _SECURITY_IMPERSONATION_LEVEL {
|
|
||||||
SecurityAnonymous,
|
|
||||||
SecurityIdentification,
|
|
||||||
SecurityImpersonation,
|
|
||||||
SecurityDelegation
|
|
||||||
} SECURITY_IMPERSONATION_LEVEL;
|
|
||||||
|
|
||||||
typedef enum _SID_NAME_USE {
|
typedef enum _SID_NAME_USE {
|
||||||
SidTypeUser = 1,
|
SidTypeUser = 1,
|
||||||
SidTypeGroup,
|
SidTypeGroup,
|
||||||
@@ -370,12 +404,7 @@ typedef enum _TOKEN_INFORMATION_CLASS {
|
|||||||
TokenImpersonationLevel,
|
TokenImpersonationLevel,
|
||||||
TokenStatistics
|
TokenStatistics
|
||||||
} TOKEN_INFORMATION_CLASS;
|
} TOKEN_INFORMATION_CLASS;
|
||||||
|
|
||||||
typedef enum tagTOKEN_TYPE {
|
|
||||||
TokenPrimary = 1,
|
|
||||||
TokenImpersonation
|
|
||||||
} TOKEN_TYPE;
|
|
||||||
|
|
||||||
#endif /* ! defined (RC_INVOKED) */
|
#endif /* ! defined (RC_INVOKED) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -421,13 +450,6 @@ typedef enum tagTOKEN_TYPE {
|
|||||||
#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore))
|
#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore))
|
||||||
#define MAKEWPARAM(l, h) ((WPARAM) MAKELONG(l, h))
|
#define MAKEWPARAM(l, h) ((WPARAM) MAKELONG(l, h))
|
||||||
|
|
||||||
#ifndef max
|
|
||||||
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef min
|
|
||||||
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PALETTEINDEX(i) ((COLORREF) (0x01000000 | (DWORD) (WORD) (i)))
|
#define PALETTEINDEX(i) ((COLORREF) (0x01000000 | (DWORD) (WORD) (i)))
|
||||||
#define PALETTERGB(r, g, b) (0x02000000 | RGB(r, g, b))
|
#define PALETTERGB(r, g, b) (0x02000000 | RGB(r, g, b))
|
||||||
@@ -451,8 +473,6 @@ typedef enum tagTOKEN_TYPE {
|
|||||||
typedef int CALLBACK (*BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM);
|
typedef int CALLBACK (*BFFCALLBACK) (HWND, UINT, LPARAM, LPARAM);
|
||||||
typedef UINT CALLBACK (*LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
typedef UINT CALLBACK (*LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
||||||
typedef UINT CALLBACK (*LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
typedef UINT CALLBACK (*LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
||||||
typedef DWORD CALLBACK (*PTHREAD_START_ROUTINE) (LPVOID);
|
|
||||||
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
|
|
||||||
typedef DWORD CALLBACK (*EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG);
|
typedef DWORD CALLBACK (*EDITSTREAMCALLBACK) (DWORD, LPBYTE, LONG, LONG);
|
||||||
typedef UINT CALLBACK (*LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
typedef UINT CALLBACK (*LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
||||||
typedef UINT CALLBACK (*LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
typedef UINT CALLBACK (*LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
|
||||||
@@ -565,6 +585,8 @@ typedef DWORD CCSTYLEFLAGA, *PCCSTYLEFLAGA, *LPCCSTYLEFLAGA;
|
|||||||
|
|
||||||
#endif /* ! defined (RC_INVOKED) */
|
#endif /* ! defined (RC_INVOKED) */
|
||||||
|
|
||||||
|
#endif /* WIN32_LEAN_AND_MEAN */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
@@ -94,3 +94,59 @@ PLIST_ENTRY ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
|
|||||||
|
|
||||||
VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
|
VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
|
||||||
WORK_QUEUE_TYPE QueueType);
|
WORK_QUEUE_TYPE QueueType);
|
||||||
|
VOID ExRaiseStatus(NTSTATUS Status);
|
||||||
|
VOID ExReinitializeResourceLite(PERESOURCE Resource);
|
||||||
|
VOID ExReleaseFastMutex(PFAST_MUTEX Mutex);
|
||||||
|
VOID ExReleaseFastMutexUnsafe(PFAST_MUTEX Mutex);
|
||||||
|
VOID ExReleaseResource(PERESOURCE Resource);
|
||||||
|
VOID ExReleaseResourceForThread(PERESOURCE Resource,
|
||||||
|
ERESOURCE_THREAD ResourceThreadId);
|
||||||
|
VOID ExReleaseResourceForThreadLite(PERESOURCE Resource,
|
||||||
|
ERESOURCE_THREAD ResourceThreadId);
|
||||||
|
VOID ExSystemTimeToLocalTime(PLARGE_INTEGER SystemTime,
|
||||||
|
PLARGE_INTEGER LocalTime);
|
||||||
|
BOOLEAN ExTryToAcquireFastMutex(PFAST_MUTEX FastMutex);
|
||||||
|
BOOLEAN ExTryToAcquireResourceExclusiveLite(PERESOURCE Resource);
|
||||||
|
PVOID InterlockedCompareExchange(PVOID* Destination,
|
||||||
|
PVOID Exchange,
|
||||||
|
PVOID Comperand);
|
||||||
|
LONG InterlockedDecrement(PLONG Addend);
|
||||||
|
LONG InterlockedExchange(PLONG Target, LONG Value);
|
||||||
|
LONG InterlockedExchangeAdd(PLONG Addend, LONG Value);
|
||||||
|
LONG InterlockedIncrement(PLONG Addend);
|
||||||
|
|
||||||
|
PVOID ExInterlockedAllocateFromZone(PZONE_HEADER Zone, PKSPIN_LOCK Lock);
|
||||||
|
PVOID ExInterlockedFreeToZone(PZONE_HEADER Zone, PVOID Block,
|
||||||
|
PKSPIN_LOCK Lock);
|
||||||
|
NTSTATUS ExInterlockedExtendZone(PZONE_HEADER Zone, PVOID Segment,
|
||||||
|
ULONG SegmentSize, PKSPIN_LOCK Lock);
|
||||||
|
PSINGLE_LIST_ENTRY ExInterlockedPopEntryList(PSINGLE_LIST_ENTRY ListHead,
|
||||||
|
PKSPIN_LOCK Lock);
|
||||||
|
PSINGLE_LIST_ENTRY ExInterlockedPushEntryList(PSINGLE_LIST_ENTRY ListHead,
|
||||||
|
PSINGLE_LIST_ENTRY ListEntry,
|
||||||
|
PKSPIN_LOCK Lock);
|
||||||
|
PSINGLE_LIST_ENTRY ExInterlockedPushEntrySList(PSLIST_HEADER ListHead,
|
||||||
|
PSINGLE_LIST_ENTRY ListEntry,
|
||||||
|
PKSPIN_LOCK Lock);
|
||||||
|
PSINGLE_LIST_ENTRY ExInterlockedPopEntrySList(PSLIST_HEADER ListHead,
|
||||||
|
PKSPIN_LOCK Lock);
|
||||||
|
BOOLEAN ExIsFullZone(PZONE_HEADER Zone);
|
||||||
|
BOOLEAN ExIsObjectInFirstZoneSegment(PZONE_HEADER Zone, PVOID Object);
|
||||||
|
VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
|
||||||
|
PLARGE_INTEGER SystemTime);
|
||||||
|
|
||||||
|
typedef unsigned int (exception_hook)(CONTEXT* c, unsigned int exp);
|
||||||
|
unsigned int ExHookException(exception_hook fn, unsigned int exp);
|
||||||
|
|
||||||
|
INTERLOCKED_RESULT ExInterlockedDecrementLong(PLONG Addend,
|
||||||
|
PKSPIN_LOCK Lock);
|
||||||
|
ULONG ExInterlockedExchangeUlong(PULONG Target,
|
||||||
|
ULONG Value,
|
||||||
|
PKSPIN_LOCK Lock);
|
||||||
|
INTERLOCKED_RESULT ExInterlockedIncrementLong(PLONG Addend,
|
||||||
|
PKSPIN_LOCK Lock);
|
||||||
|
BOOLEAN ExIsResourceAcquiredExclusiveLite(PERESOURCE Resource);
|
||||||
|
BOOLEAN ExIsResourceAcquiredSharedLite(PERESOURCE Resource);
|
||||||
|
USHORT ExQueryDepthSListHead(PSLIST_HEADER SListHead);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -51,76 +51,20 @@ enum
|
|||||||
*/
|
*/
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
/*
|
IRP_NOCACHE = 0x1,
|
||||||
* Read any data from the actual backing media
|
IRP_PAGING_IO = 0x2,
|
||||||
*/
|
IRP_MOUNT_COMPLETION = 0x4,
|
||||||
IRP_NOCACHE,
|
IRP_SYNCHRONOUS_API = 0x8,
|
||||||
|
IRP_ASSOCIATED_IRP = 0x10,
|
||||||
/*
|
IRP_BUFFERED_IO = 0x20,
|
||||||
* The I/O operation is performing paging
|
IRP_DEALLOCATE_BUFFER = 0x40,
|
||||||
*/
|
IRP_INPUT_OPERATION = 0x80,
|
||||||
IRP_PAGING_IO,
|
IRP_SYNCHRONOUS_PAGING_IO = 0x100,
|
||||||
|
IRP_CREATE_OPERATION = 0x200,
|
||||||
/*
|
IRP_READ_OPERATION = 0x400,
|
||||||
* The IRP is for a mount operation
|
IRP_WRITE_OPERATION = 0x800,
|
||||||
*/
|
IRP_CLOSE_OPERATION = 0x1000,
|
||||||
IRP_MOUNT_COMPLETION,
|
IRP_DEFER_IO_COMPLETION = 0x2000,
|
||||||
|
|
||||||
/*
|
|
||||||
* The API expects synchronous behaviour
|
|
||||||
*/
|
|
||||||
IRP_SYNCHRONOUS_API,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The IRP is associated with a larger operation
|
|
||||||
*/
|
|
||||||
IRP_ASSOCIATED_IRP,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The AssociatedIrp.SystemBuffer field is valid
|
|
||||||
*/
|
|
||||||
IRP_BUFFERED_IO,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The system buffer was allocated from pool and should be deallocated
|
|
||||||
* by the I/O manager
|
|
||||||
*/
|
|
||||||
IRP_DEALLOCATE_BUFFER,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The IRP is for an input operation
|
|
||||||
*/
|
|
||||||
IRP_INPUT_OPERATION,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The paging operation should complete synchronously
|
|
||||||
*/
|
|
||||||
IRP_SYNCHRONOUS_PAGING_IO,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The IRP represents a filesystem create operation
|
|
||||||
*/
|
|
||||||
IRP_CREATE_OPERATION,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The IRP represents a filesystem read operation
|
|
||||||
*/
|
|
||||||
IRP_READ_OPERATION,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The IRP represents a filesystem write operation
|
|
||||||
*/
|
|
||||||
IRP_WRITE_OPERATION,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The IRP represents a filesystem close operation
|
|
||||||
*/
|
|
||||||
IRP_CLOSE_OPERATION,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Asynchronous behavior is advised but not required
|
|
||||||
*/
|
|
||||||
IRP_DEFER_IO_COMPLETION,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -128,52 +72,27 @@ enum
|
|||||||
*/
|
*/
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
/*
|
SL_FORCE_ACCESS_CHECK = 0x1,
|
||||||
* Force an access check even if opened in kernel mode
|
SL_OPEN_PAGING_FILE = 0x2,
|
||||||
*/
|
SL_OPEN_TARGET_DIRECTORY = 0x4,
|
||||||
SL_FORCE_ACCESS_CHECK,
|
SL_CASE_SENSITIVE = 0x8,
|
||||||
|
SL_KEY_SPECIFIED = 0x10,
|
||||||
/*
|
SL_OVERRIDE_VERIFY_VOLUME = 0x20,
|
||||||
* The file being opened is a paging file
|
SL_WRITE_THROUGH = 0x40,
|
||||||
*/
|
SL_FT_SEQUENTIAL_WRITE = 0x80,
|
||||||
SL_OPEN_PAGING_FILE,
|
SL_FAIL_IMMEDIATELY = 0x100,
|
||||||
|
SL_EXCLUSIVE_LOCK = 0x200,
|
||||||
SL_OPEN_TARGET_DIRECTORY,
|
SL_RESTART_SCAN = 0x400,
|
||||||
|
SL_RETURN_SINGLE_ENTRY = 0x800,
|
||||||
SL_CASE_SENSITIVE,
|
SL_INDEX_SPECIFIED = 0x1000,
|
||||||
|
SL_WATCH_TREE = 0x2000,
|
||||||
SL_KEY_SPECIFIED,
|
SL_ALLOW_RAW_MOUNT = 0x4000,
|
||||||
|
|
||||||
SL_OVERRIDE_VERIFY_VOLUME,
|
|
||||||
|
|
||||||
SL_WRITE_THROUGH,
|
|
||||||
|
|
||||||
SL_FT_SEQUENTIAL_WRITE,
|
|
||||||
|
|
||||||
SL_FAIL_IMMEDIATELY,
|
|
||||||
|
|
||||||
SL_EXCLUSIVE_LOCK,
|
|
||||||
|
|
||||||
SL_RESTART_SCAN,
|
|
||||||
|
|
||||||
SL_RETURN_SINGLE_ENTRY,
|
|
||||||
|
|
||||||
SL_INDEX_SPECIFIED,
|
|
||||||
|
|
||||||
SL_WATCH_TREE,
|
|
||||||
|
|
||||||
SL_ALLOW_RAW_MOUNT,
|
|
||||||
|
|
||||||
SL_PENDING_RETURNED,
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
#define SL_PENDING_RETURNED 0x01
|
||||||
{
|
#define SL_INVOKE_ON_CANCEL 0x20
|
||||||
SL_INVOKE_ON_SUCCESS = 1,
|
#define SL_INVOKE_ON_SUCCESS 0x40
|
||||||
SL_INVOKE_ON_ERROR = 2,
|
#define SL_INVOKE_ON_ERROR 0x80
|
||||||
SL_INVOKE_ON_CANCEL = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Possible flags for the device object flags
|
* Possible flags for the device object flags
|
||||||
@@ -187,56 +106,60 @@ enum
|
|||||||
/*
|
/*
|
||||||
* Possible device types
|
* Possible device types
|
||||||
*/
|
*/
|
||||||
enum
|
#define FILE_DEVICE_BEEP 0x00000001
|
||||||
{
|
#define FILE_DEVICE_CD_ROM 0x00000002
|
||||||
/*
|
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
|
||||||
* Standard define types
|
#define FILE_DEVICE_CONTROLLER 0x00000004
|
||||||
*/
|
#define FILE_DEVICE_DATALINK 0x00000005
|
||||||
FILE_DEVICE_BEEP,
|
#define FILE_DEVICE_DFS 0x00000006
|
||||||
FILE_DEVICE_CDROM,
|
#define FILE_DEVICE_DISK 0x00000007
|
||||||
FILE_DEVICE_CONTROLLER,
|
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
|
||||||
FILE_DEVICE_DISK,
|
#define FILE_DEVICE_FILE_SYSTEM 0x00000009
|
||||||
FILE_DEVICE_INPORT_PORT,
|
#define FILE_DEVICE_INPORT_PORT 0x0000000a
|
||||||
FILE_DEVICE_KEYBOARD,
|
#define FILE_DEVICE_KEYBOARD 0x0000000b
|
||||||
FILE_DEVICE_MIDI_IN,
|
#define FILE_DEVICE_MAILSLOT 0x0000000c
|
||||||
FILE_DEVICE_MIDI_OUT,
|
#define FILE_DEVICE_MIDI_IN 0x0000000d
|
||||||
FILE_DEVICE_MOUSE,
|
#define FILE_DEVICE_MIDI_OUT 0x0000000e
|
||||||
FILE_DEVICE_NULL,
|
#define FILE_DEVICE_MOUSE 0x0000000f
|
||||||
FILE_DEVICE_PARALLEL_PORT,
|
#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
|
||||||
FILE_DEVICE_PRINTER,
|
#define FILE_DEVICE_NAMED_PIPE 0x00000011
|
||||||
FILE_DEVICE_SCANNER,
|
#define FILE_DEVICE_NETWORK 0x00000012
|
||||||
FILE_DEVICE_SERIAL_MOUSE_PORT,
|
#define FILE_DEVICE_NETWORK_BROWSER 0x00000013
|
||||||
FILE_DEVICE_SERIAL_PORT,
|
#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
|
||||||
FILE_DEVICE_SCREEN,
|
#define FILE_DEVICE_NULL 0x00000015
|
||||||
FILE_DEVICE_TAPE,
|
#define FILE_DEVICE_PARALLEL_PORT 0x00000016
|
||||||
FILE_DEVICE_UNKNOWN,
|
#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
|
||||||
FILE_DEVICE_VIDEO,
|
#define FILE_DEVICE_PRINTER 0x00000018
|
||||||
FILE_DEVICE_VIRTUAL_DISK,
|
#define FILE_DEVICE_SCANNER 0x00000019
|
||||||
FILE_DEVICE_WAVE_IN,
|
#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
|
||||||
FILE_DEVICE_WAVE_OUT,
|
#define FILE_DEVICE_SERIAL_PORT 0x0000001b
|
||||||
FILE_DEVICE_8042_PORT,
|
#define FILE_DEVICE_SCREEN 0x0000001c
|
||||||
FILE_DEVICE_FILE_SYSTEM,
|
#define FILE_DEVICE_SOUND 0x0000001d
|
||||||
|
#define FILE_DEVICE_STREAMS 0x0000001e
|
||||||
/*
|
#define FILE_DEVICE_TAPE 0x0000001f
|
||||||
* Values beyond this are reserved for ISVs
|
#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
|
||||||
*/
|
#define FILE_DEVICE_TRANSPORT 0x00000021
|
||||||
FILE_DEVICE_FIRST_FREE = 32768
|
#define FILE_DEVICE_UNKNOWN 0x00000022
|
||||||
};
|
#define FILE_DEVICE_VIDEO 0x00000023
|
||||||
|
#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
|
||||||
|
#define FILE_DEVICE_WAVE_IN 0x00000025
|
||||||
|
#define FILE_DEVICE_WAVE_OUT 0x00000026
|
||||||
|
#define FILE_DEVICE_8042_PORT 0x00000027
|
||||||
|
#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
|
||||||
|
#define FILE_DEVICE_BATTERY 0x00000029
|
||||||
|
#define FILE_DEVICE_BUS_EXTENDER 0x0000002a
|
||||||
|
#define FILE_DEVICE_MODEM 0x0000002b
|
||||||
|
#define FILE_DEVICE_VDM 0x0000002c
|
||||||
|
|
||||||
|
#define FILE_REMOVABLE_MEDIA 0x00000001
|
||||||
|
#define FILE_READ_ONLY_DEVICE 0x00000002
|
||||||
|
#define FILE_FLOPPY_DISKETTE 0x00000004
|
||||||
|
#define FILE_WRITE_ONCE_MEDIA 0x00000008
|
||||||
|
#define FILE_REMOTE_DEVICE 0x00000010
|
||||||
|
#define FILE_DEVICE_IS_MOUNTED 0x00000020
|
||||||
|
#define FILE_VIRTUAL_VOLUME 0x00000040
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Possible device characteristics
|
|
||||||
*/
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
FILE_REMOVABLE_MEDIA = 0x1,
|
|
||||||
FILE_READ_ONLY_DEVICE = 0x2,
|
|
||||||
FILE_FLOPPY_DISKETTE = 0x4,
|
|
||||||
FILE_WRITE_ONCE_MEDIA = 0x8,
|
|
||||||
FILE_REMOTE_DEVICE = 0x10,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PURPOSE: Bus types
|
* PURPOSE: Bus types
|
||||||
*/
|
*/
|
||||||
@@ -286,22 +209,123 @@ enum
|
|||||||
IRP_MJ_MAXIMUM_FUNCTION,
|
IRP_MJ_MAXIMUM_FUNCTION,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
|
||||||
/*
|
/*
|
||||||
* PURPOSE: Details about the result of a file open or create
|
* Minor function numbers for IRP_MJ_FILE_SYSTEM_CONTROL
|
||||||
*/
|
*/
|
||||||
{
|
|
||||||
FILE_CREATED,
|
|
||||||
// FILE_OPENED,
|
|
||||||
FILE_OVERWRITTEN,
|
|
||||||
FILE_SUPERSEDED,
|
|
||||||
FILE_EXISTS,
|
|
||||||
FILE_DOES_NOT_EXIST,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define IRP_MN_USER_FS_REQUEST 0x00
|
#define IRP_MN_USER_FS_REQUEST 0x00
|
||||||
#define IRP_MN_MOUNT_VOLUME 0x01
|
#define IRP_MN_MOUNT_VOLUME 0x01
|
||||||
#define IRP_MN_VERIFY_VOLUME 0x02
|
#define IRP_MN_VERIFY_VOLUME 0x02
|
||||||
#define IRP_MN_LOAD_FILE_SYSTEM 0x03
|
#define IRP_MN_LOAD_FILE_SYSTEM 0x03
|
||||||
|
|
||||||
|
#define IO_DISK_INCREMENT 4
|
||||||
|
|
||||||
|
#define FILE_WORD_ALIGNMENT 0x0001
|
||||||
|
|
||||||
|
/*
|
||||||
|
* File disposition values
|
||||||
|
*/
|
||||||
|
#define FILE_CREATED 0x0000
|
||||||
|
#define FILE_OPENED 0x0001
|
||||||
|
#define FILE_OVERWRITTEN 0x0002
|
||||||
|
#define FILE_SUPERSEDED 0x0003
|
||||||
|
#define FILE_DOES_NOT_EXIST 0x0004
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* file creation flags
|
||||||
|
*/
|
||||||
|
#define FILE_DIRECTORY_FILE 0x00000001
|
||||||
|
#define FILE_WRITE_THROUGH 0x00000002
|
||||||
|
#define FILE_SEQUENTIAL_ONLY 0x00000004
|
||||||
|
#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
|
||||||
|
|
||||||
|
#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
|
||||||
|
#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
|
||||||
|
#define FILE_NON_DIRECTORY_FILE 0x00000040
|
||||||
|
#define FILE_CREATE_TREE_CONNECTION 0x00000080
|
||||||
|
|
||||||
|
#define FILE_COMPLETE_IF_OPLOCKED 0x00000100
|
||||||
|
#define FILE_NO_EA_KNOWLEDGE 0x00000200
|
||||||
|
|
||||||
|
#define FILE_RANDOM_ACCESS 0x00000800
|
||||||
|
|
||||||
|
#define FILE_DELETE_ON_CLOSE 0x00001000
|
||||||
|
#define FILE_OPEN_BY_FILE_ID 0x00002000
|
||||||
|
#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
|
||||||
|
#define FILE_NO_COMPRESSION 0x00008000
|
||||||
|
|
||||||
|
#define FILE_RESERVE_OPFILTER 0x00100000
|
||||||
|
#define FILE_TRANSACTED_MODE 0x00200000
|
||||||
|
#define FILE_OPEN_OFFLINE_FILE 0x00400000
|
||||||
|
|
||||||
|
#define FILE_VALID_OPTION_FLAGS 0x007fffff
|
||||||
|
#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
|
||||||
|
#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
|
||||||
|
#define FILE_VALID_SET_FLAGS 0x00001036
|
||||||
|
|
||||||
|
/*
|
||||||
|
* file information
|
||||||
|
*/
|
||||||
|
#define FileDirectoryInformation 1
|
||||||
|
#define FileFullDirectoryInformation 2
|
||||||
|
#define FileBothDirectoryInformation 3
|
||||||
|
#define FileBasicInformation 4
|
||||||
|
#define FileStandardInformation 5
|
||||||
|
#define FileInternalInformation 6
|
||||||
|
#define FileEaInformation 7
|
||||||
|
#define FileAccessInformation 8
|
||||||
|
#define FileNameInformation 9
|
||||||
|
#define FileRenameInformation 10
|
||||||
|
#define FileLinkInformation 11
|
||||||
|
#define FileNamesInformation 12
|
||||||
|
#define FileDispositionInformation 13
|
||||||
|
#define FilePositionInformation 14
|
||||||
|
#define FileFullEaInformation 15
|
||||||
|
#define FileModeInformation 16
|
||||||
|
#define FileAlignmentInformation 17
|
||||||
|
#define FileAllInformation 18
|
||||||
|
#define FileAllocationInformation 19
|
||||||
|
#define FileEndOfFileInformation 20
|
||||||
|
#define FileAlternateNameInformation 21
|
||||||
|
#define FileStreamInformation 22
|
||||||
|
#define FilePipeInformation 23
|
||||||
|
#define FilePipeLocalInformation 24
|
||||||
|
#define FilePipeRemoteInformation 25
|
||||||
|
#define FileMailslotQueryInformation 26
|
||||||
|
#define FileMailslotSetInformation 27
|
||||||
|
#define FileCompressionInformation 28
|
||||||
|
#define FileCopyOnWriteInformation 29
|
||||||
|
#define FileCompletionInformation 30
|
||||||
|
#define FileMoveClusterInformation 31
|
||||||
|
#define FileOleClassIdInformation 32
|
||||||
|
#define FileOleStateBitsInformation 33
|
||||||
|
#define FileNetworkOpenInformation 34
|
||||||
|
#define FileObjectIdInformation 35
|
||||||
|
#define FileOleAllInformation 36
|
||||||
|
#define FileOleDirectoryInformation 37
|
||||||
|
#define FileContentIndexInformation 38
|
||||||
|
#define FileInheritContentIndexInformation 39
|
||||||
|
#define FileOleInformation 40
|
||||||
|
#define FileMaximumInformation 41
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef ULONG FS_INFORMATION_CLASS;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* file system information class values
|
||||||
|
*/
|
||||||
|
#define FileFsVolumeInformation 1
|
||||||
|
#define FileFsLabelInformation 2
|
||||||
|
#define FileFsSizeInformation 3
|
||||||
|
#define FileFsDeviceInformation 4
|
||||||
|
#define FileFsAttributeInformation 5
|
||||||
|
#define FileFsControlInformation 6
|
||||||
|
#define FileFsQuotaQueryInformation 7
|
||||||
|
#define FileFsQuotaSetInformation 8
|
||||||
|
#define FileFsMaximumInformation 9
|
||||||
|
|
||||||
|
#define IRP_MN_QUERY_DIRECTORY 0x01
|
||||||
|
#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,5 +1,10 @@
|
|||||||
/* IO MANAGER ***************************************************************/
|
/* IO MANAGER ***************************************************************/
|
||||||
|
|
||||||
|
BOOLEAN IoRaiseInformationalHardError(NTSTATUS ErrorStatus,
|
||||||
|
PUNICODE_STRING String,
|
||||||
|
PKTHREAD Thread);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Registers the driver with WMI
|
* FUNCTION: Registers the driver with WMI
|
||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
@@ -503,7 +508,6 @@ NTSTATUS IoWritePartitionTable(PDEVICE_OBJECT DeviceObject,
|
|||||||
ULONG NumberOfHeads,
|
ULONG NumberOfHeads,
|
||||||
struct _DRIVE_LAYOUT_INFORMATION* PBuffer);
|
struct _DRIVE_LAYOUT_INFORMATION* PBuffer);
|
||||||
|
|
||||||
typedef ULONG FS_INFORMATION_CLASS;
|
|
||||||
|
|
||||||
// Preliminary guess
|
// Preliminary guess
|
||||||
NTKERNELAPI NTSTATUS IoQueryFileVolumeInformation(IN PFILE_OBJECT FileObject,
|
NTKERNELAPI NTSTATUS IoQueryFileVolumeInformation(IN PFILE_OBJECT FileObject,
|
||||||
|
@@ -127,6 +127,42 @@ typedef struct _IO_STACK_LOCATION
|
|||||||
struct _VPB* Vpb;
|
struct _VPB* Vpb;
|
||||||
struct _DEVICE_OBJECT* DeviceObject;
|
struct _DEVICE_OBJECT* DeviceObject;
|
||||||
} Mount;
|
} Mount;
|
||||||
|
struct {
|
||||||
|
ULONG Length;
|
||||||
|
FILE_INFORMATION_CLASS FileInformationClass;
|
||||||
|
} QueryFile;
|
||||||
|
struct {
|
||||||
|
ULONG Length;
|
||||||
|
FS_INFORMATION_CLASS FileInformationClass;
|
||||||
|
} QueryVolume;
|
||||||
|
struct {
|
||||||
|
ULONG Length;
|
||||||
|
FS_INFORMATION_CLASS FileInformationClass;
|
||||||
|
} SetVolume;
|
||||||
|
struct {
|
||||||
|
ULONG Length;
|
||||||
|
FILE_INFORMATION_CLASS FileInformationClass;
|
||||||
|
struct FILE_OBJECT* FileObject;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
BOOLEAN ReplaceIfExists;
|
||||||
|
BOOLEAN AdvanceOnly;
|
||||||
|
} d;
|
||||||
|
ULONG ClusterCount;
|
||||||
|
HANDLE DeleteHandle;
|
||||||
|
} u;
|
||||||
|
} SetFile;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a guess
|
||||||
|
*/
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
FILE_INFORMATION_CLASS FileInformationClass;
|
||||||
|
BOOLEAN ReturnSingleEntry;
|
||||||
|
PUNICODE_STRING FileName;
|
||||||
|
BOOLEAN RestartScan;
|
||||||
|
} QueryDirectory;
|
||||||
} Parameters;
|
} Parameters;
|
||||||
|
|
||||||
PIO_COMPLETION_ROUTINE CompletionRoutine;
|
PIO_COMPLETION_ROUTINE CompletionRoutine;
|
||||||
|
@@ -155,4 +155,88 @@ VOID KeBugCheckEx(ULONG BugCheckCode,
|
|||||||
*/
|
*/
|
||||||
VOID KeBugCheck(ULONG BugCheckCode);
|
VOID KeBugCheck(ULONG BugCheckCode);
|
||||||
|
|
||||||
|
// kmutant definition slightly modified from nt5 ddk
|
||||||
|
|
||||||
|
typedef struct _KMUTANT
|
||||||
|
{
|
||||||
|
DISPATCHER_HEADER Header;
|
||||||
|
LIST_ENTRY MutantListEntry;
|
||||||
|
struct _KTHREAD* OwnerThread;
|
||||||
|
BOOLEAN Abandoned;
|
||||||
|
UCHAR ApcDisable;
|
||||||
|
} KMUTANT, *PKMUTANT;
|
||||||
|
|
||||||
|
// io permission map has a 8k size
|
||||||
|
// Each bit in the IOPM corresponds to an io port byte address. The bitmap
|
||||||
|
// is initialized to allow IO at any port. [ all bits set ].
|
||||||
|
|
||||||
|
typedef struct _IOPM
|
||||||
|
{
|
||||||
|
UCHAR Bitmap[8192];
|
||||||
|
} IOPM, *PIOPM;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION: Provides the kernel with a new access map for a driver
|
||||||
|
* ARGUMENTS:
|
||||||
|
* NewMap: = If FALSE the kernel's map is set to all disabled. If TRUE
|
||||||
|
* the kernel disables access to a particular port.
|
||||||
|
* IoPortMap = Caller supplies storage for the io permission map.
|
||||||
|
* REMARKS
|
||||||
|
* Each bit in the IOPM corresponds to an io port byte address. The bitmap
|
||||||
|
* is initialized to allow IO at any port. [ all bits set ]. The IOPL determines
|
||||||
|
* the minium privilege level required to perform IO prior to checking the permission map.
|
||||||
|
*/
|
||||||
|
void Ke386SetIoAccessMap(int NewMap, PIOPM *IoPermissionMap);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION: Queries the io permission map.
|
||||||
|
* ARGUMENTS:
|
||||||
|
* NewMap: = If FALSE the kernel's map is set to all disabled. If TRUE
|
||||||
|
* the kernel disables access to a particular port.
|
||||||
|
* IoPortMap = Caller supplies storage for the io permission map.
|
||||||
|
* REMARKS
|
||||||
|
* Each bit in the IOPM corresponds to an io port byte address. The bitmap
|
||||||
|
* is initialized to allow IO at any port. [ all bits set ]. The IOPL determines
|
||||||
|
* the minium privilege level required to perform IO prior to checking the permission map.
|
||||||
|
*/
|
||||||
|
void Ke386QueryIoAccessMap(BOOLEAN NewMap, PIOPM *IoPermissionMap);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION: Set the process IOPL
|
||||||
|
* ARGUMENTS:
|
||||||
|
* Eprocess = Pointer to a executive process object
|
||||||
|
* EnableIo = Specify TRUE to enable IO and FALSE to disable
|
||||||
|
*/
|
||||||
|
NTSTATUS Ke386IoSetAccessProcess(PEPROCESS Eprocess, BOOLEAN EnableIo);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION: Releases a set of Global Descriptor Table Selectors
|
||||||
|
* ARGUMENTS:
|
||||||
|
* SelArray =
|
||||||
|
* NumOfSelectors =
|
||||||
|
*/
|
||||||
|
NTSTATUS KeI386ReleaseGdtSelectors(
|
||||||
|
OUT PULONG SelArray,
|
||||||
|
IN ULONG NumOfSelectors
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION: Allocates a set of Global Descriptor Table Selectors
|
||||||
|
* ARGUMENTS:
|
||||||
|
* SelArray =
|
||||||
|
* NumOfSelectors =
|
||||||
|
*/
|
||||||
|
NTSTATUS KeI386AllocateGdtSelectors(
|
||||||
|
OUT PULONG SelArray,
|
||||||
|
IN ULONG NumOfSelectors
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION: Raises a user mode exception
|
||||||
|
* ARGUMENTS:
|
||||||
|
* ExceptionCode = Status code of the exception
|
||||||
|
*/
|
||||||
|
void KeRaiseUserException(NTSTATUS ExceptionCode);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __INCLUDE_DDK_KEFUNCS_H */
|
#endif /* __INCLUDE_DDK_KEFUNCS_H */
|
||||||
|
@@ -101,65 +101,6 @@ typedef struct _KDEVICE_QUEUE
|
|||||||
KSPIN_LOCK Lock;
|
KSPIN_LOCK Lock;
|
||||||
} KDEVICE_QUEUE, *PKDEVICE_QUEUE;
|
} KDEVICE_QUEUE, *PKDEVICE_QUEUE;
|
||||||
|
|
||||||
#if RIGHT_DEFINITION_PROVIDED_ABOVE
|
|
||||||
#define _KTHREAD _ETHREAD
|
|
||||||
|
|
||||||
typedef struct _KTHREAD
|
|
||||||
/*
|
|
||||||
* PURPOSE: Describes a thread of execution
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
CSHORT Type;
|
|
||||||
CSHORT Size;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Head of the queue of apcs
|
|
||||||
*/
|
|
||||||
LIST_ENTRY ApcQueueHead;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Entry in the linked list of threads
|
|
||||||
*/
|
|
||||||
LIST_ENTRY Entry;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Current state of the thread
|
|
||||||
*/
|
|
||||||
ULONG State;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Priority modifier of the thread
|
|
||||||
*/
|
|
||||||
ULONG Priority;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Pointer to our process
|
|
||||||
*/
|
|
||||||
struct _EPROCESS* Process;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Handle of our process
|
|
||||||
*/
|
|
||||||
HANDLE ProcessHandle;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Thread affinity mask
|
|
||||||
*/
|
|
||||||
ULONG AffinityMask;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Saved thread context
|
|
||||||
*/
|
|
||||||
hal_thread_state context;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Timeout for the thread to be woken up
|
|
||||||
*/
|
|
||||||
signed long long int wake_time;
|
|
||||||
|
|
||||||
} KTHREAD, *PKTHREAD, *PETHREAD;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _KAPC
|
typedef struct _KAPC
|
||||||
{
|
{
|
||||||
|
@@ -1,6 +1,13 @@
|
|||||||
/* MEMORY MANAGMENT ******************************************************/
|
/* MEMORY MANAGMENT ******************************************************/
|
||||||
|
|
||||||
#include <internal/hal/page.h>
|
#include <internal/mmhal.h>
|
||||||
|
|
||||||
|
BOOLEAN MmIsNonPagedSystemAddressValid(PVOID VirtualAddress);
|
||||||
|
BOOLEAN MmIsThisAnNtAsSystem(VOID);
|
||||||
|
|
||||||
|
#define PAGE_ROUND_UP(x) ( (((ULONG)x)%PAGESIZE) ? ((((ULONG)x)&(~0xfff))+0x1000) : ((ULONG)x) )
|
||||||
|
#define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~0xfff))
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Determines if the given virtual address is page aligned
|
* FUNCTION: Determines if the given virtual address is page aligned
|
||||||
|
@@ -22,13 +22,6 @@ extern "C"
|
|||||||
|
|
||||||
#define QUAD_PART(LI) (*(LONGLONG *)(&LI))
|
#define QUAD_PART(LI) (*(LONGLONG *)(&LI))
|
||||||
|
|
||||||
|
|
||||||
#define IO_DISK_INCREMENT 4
|
|
||||||
|
|
||||||
#define FILE_WORD_ALIGNMENT 0x0001
|
|
||||||
|
|
||||||
#define FILE_OPENED 0x0001
|
|
||||||
|
|
||||||
#include <ddk/status.h>
|
#include <ddk/status.h>
|
||||||
#include <ddk/ntdef.h>
|
#include <ddk/ntdef.h>
|
||||||
#include <ddk/defines.h>
|
#include <ddk/defines.h>
|
||||||
@@ -41,6 +34,7 @@ extern "C"
|
|||||||
#include <ddk/iotypes.h>
|
#include <ddk/iotypes.h>
|
||||||
#include <ddk/extypes.h>
|
#include <ddk/extypes.h>
|
||||||
#include <ddk/pstypes.h>
|
#include <ddk/pstypes.h>
|
||||||
|
#include <ddk/zwtypes.h>
|
||||||
#include <ddk/ioctrl.h>
|
#include <ddk/ioctrl.h>
|
||||||
#include <internal/hal/ddk.h>
|
#include <internal/hal/ddk.h>
|
||||||
|
|
||||||
@@ -53,7 +47,8 @@ extern "C"
|
|||||||
#include <ddk/psfuncs.h>
|
#include <ddk/psfuncs.h>
|
||||||
#include <ddk/obfuncs.h>
|
#include <ddk/obfuncs.h>
|
||||||
#include <ddk/dbgfuncs.h>
|
#include <ddk/dbgfuncs.h>
|
||||||
|
#include <ddk/sefuncs.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -6,5 +6,8 @@ struct _ETHREAD;
|
|||||||
struct _EPROCESS;
|
struct _EPROCESS;
|
||||||
|
|
||||||
#define NTKERNELAPI
|
#define NTKERNELAPI
|
||||||
|
#define NTSYSAPI
|
||||||
|
#define NTAPI
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
* Object = Object's body
|
* Object = Object's body
|
||||||
*/
|
*/
|
||||||
VOID ObDeferenceObject(PVOID Object);
|
VOID ObDereferenceObject(PVOID Object);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Performs access validation on an object handle and if access
|
* FUNCTION: Performs access validation on an object handle and if access
|
||||||
|
@@ -96,27 +96,13 @@ typedef struct _OBJECT
|
|||||||
* PURPOSE: Header for every object managed by the object manager
|
* PURPOSE: Header for every object managed by the object manager
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
/*
|
UNICODE_STRING Name;
|
||||||
* PURPOSE: Name of this entry
|
LIST_ENTRY Entry;
|
||||||
*/
|
ULONG RefCount;
|
||||||
UNICODE_STRING name;
|
ULONG HandleCount;
|
||||||
|
BOOLEAN Permanent;
|
||||||
/*
|
struct _DIRECTORY_OBJECT* Parent;
|
||||||
* PURPOSE: Our entry in our parents list of subdirectory
|
POBJECT_TYPE ObjectType;
|
||||||
*/
|
|
||||||
LIST_ENTRY entry;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Number of non-handle references to this object
|
|
||||||
*/
|
|
||||||
ULONG RefCount;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Number of handles opened to this object
|
|
||||||
*/
|
|
||||||
ULONG HandleCount;
|
|
||||||
|
|
||||||
struct _DIRECTORY_OBJECT* Parent;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PURPOSE: Object type
|
* PURPOSE: Object type
|
||||||
@@ -141,3 +127,9 @@ typedef struct _OBJECT_ATTRIBUTES {
|
|||||||
SECURITY_DESCRIPTOR *SecurityDescriptor;
|
SECURITY_DESCRIPTOR *SecurityDescriptor;
|
||||||
SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService;
|
SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService;
|
||||||
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
|
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
|
||||||
|
|
||||||
|
typedef struct _HANDLE_TABLE
|
||||||
|
{
|
||||||
|
LIST_ENTRY ListHead;
|
||||||
|
KSPIN_LOCK ListLock;
|
||||||
|
} HANDLE_TABLE, *PHANDLE_TABLE;
|
||||||
|
@@ -25,7 +25,7 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
|
|||||||
PKSTART_ROUTINE StartRoutine,
|
PKSTART_ROUTINE StartRoutine,
|
||||||
PVOID StartContext);
|
PVOID StartContext);
|
||||||
NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus);
|
NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus);
|
||||||
NTSTATUS PsSuspendThread(VOID);
|
VOID PsSuspendThread(PETHREAD Thread);
|
||||||
NTSTATUS PsWakeThread(PETHREAD Thread);
|
VOID PsResumeThread(PETHREAD Thread);
|
||||||
PETHREAD PsGetCurrentThread(VOID);
|
PETHREAD PsGetCurrentThread(VOID);
|
||||||
struct _EPROCESS* PsGetCurrentProcess(VOID);
|
struct _EPROCESS* PsGetCurrentProcess(VOID);
|
||||||
|
@@ -131,7 +131,7 @@ typedef struct _KTHREAD
|
|||||||
ULONG Quantum;
|
ULONG Quantum;
|
||||||
UCHAR ThreadState; //Thread state is a typeless enum, otherwise it should be const integer
|
UCHAR ThreadState; //Thread state is a typeless enum, otherwise it should be const integer
|
||||||
ULONG FreezeCount;
|
ULONG FreezeCount;
|
||||||
ULONG SuspendCount;
|
LONG SuspendCount;
|
||||||
PTRAP_FRAME TrapFrame;
|
PTRAP_FRAME TrapFrame;
|
||||||
PVOID *Tls;
|
PVOID *Tls;
|
||||||
KWAIT_BLOCK WaitBlock[4];
|
KWAIT_BLOCK WaitBlock[4];
|
||||||
@@ -149,6 +149,7 @@ typedef struct _KTHREAD
|
|||||||
*/
|
*/
|
||||||
hal_thread_state Context;
|
hal_thread_state Context;
|
||||||
LIST_ENTRY Entry;
|
LIST_ENTRY Entry;
|
||||||
|
ULONG LastTick;
|
||||||
} KTHREAD, *PKTHREAD;
|
} KTHREAD, *PKTHREAD;
|
||||||
|
|
||||||
|
|
||||||
@@ -255,26 +256,28 @@ typedef struct _ETHREAD {
|
|||||||
} ETHREAD, *PETHREAD;
|
} ETHREAD, *PETHREAD;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _KPROCESS {
|
typedef struct _KPROCESS
|
||||||
DISPATCHER_HEADER DispatcherHeader;
|
{
|
||||||
PVOID PageTableDirectory; // FIXME: I shoud point to a PTD
|
DISPATCHER_HEADER DispatcherHeader;
|
||||||
TIME ElapsedTime;
|
PVOID PageTableDirectory; // FIXME: I shoud point to a PTD
|
||||||
TIME KernelTime;
|
TIME ElapsedTime;
|
||||||
TIME UserTime;
|
TIME KernelTime;
|
||||||
LIST_ENTRY InOutSwap; // ??
|
TIME UserTime;
|
||||||
KSPIN_LOCK SpinLock;
|
LIST_ENTRY InOutSwap; // ??
|
||||||
KAFFINITY Affinity;
|
KSPIN_LOCK SpinLock;
|
||||||
ULONG StackCount;
|
KAFFINITY Affinity;
|
||||||
KPRIORITY BasePriority;
|
ULONG StackCount;
|
||||||
ULONG DefaultThreadQuantum;
|
KPRIORITY BasePriority;
|
||||||
UCHAR ProcessState;
|
ULONG DefaultThreadQuantum;
|
||||||
ULONG ThreadSeed;
|
UCHAR ProcessState;
|
||||||
UCHAR DisableBoost;
|
ULONG ThreadSeed;
|
||||||
|
UCHAR DisableBoost;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Added by David Welch (welch@mcmail.com)
|
* Added by David Welch (welch@mcmail.com)
|
||||||
*/
|
*/
|
||||||
LIST_ENTRY MemoryAreaList;
|
LIST_ENTRY MemoryAreaList;
|
||||||
|
HANDLE_TABLE HandleTable;
|
||||||
} KPROCESS, *PKPROCESS;
|
} KPROCESS, *PKPROCESS;
|
||||||
|
|
||||||
typedef struct _EPROCESS
|
typedef struct _EPROCESS
|
||||||
|
@@ -153,6 +153,8 @@ LONG RtlCompareString(PSTRING String1, PSTRING String2,
|
|||||||
LONG RtlCompareUnicodeString(PUNICODE_STRING String1,
|
LONG RtlCompareUnicodeString(PUNICODE_STRING String1,
|
||||||
PUNICODE_STRING String2,
|
PUNICODE_STRING String2,
|
||||||
BOOLEAN BaseInsensitive);
|
BOOLEAN BaseInsensitive);
|
||||||
|
LARGE_INTEGER RtlConvertLongToLargeInteger(LONG SignedInteger);
|
||||||
|
LARGE_INTEGER RtlConvertUlongToLargeInteger(ULONG UnsignedInteger);
|
||||||
VOID RtlCopyBytes(PVOID Destination, CONST VOID* Source, ULONG Length);
|
VOID RtlCopyBytes(PVOID Destination, CONST VOID* Source, ULONG Length);
|
||||||
VOID RtlCopyMemory(VOID* Destination, VOID* Source, ULONG Length);
|
VOID RtlCopyMemory(VOID* Destination, VOID* Source, ULONG Length);
|
||||||
VOID RtlCopyString(PSTRING DestinationString, PSTRING SourceString);
|
VOID RtlCopyString(PSTRING DestinationString, PSTRING SourceString);
|
||||||
@@ -165,12 +167,27 @@ NTSTATUS RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
|
|||||||
NTSTATUS RtlDeleteRegistryValue(ULONG RelativeTo,
|
NTSTATUS RtlDeleteRegistryValue(ULONG RelativeTo,
|
||||||
PWSTR Path,
|
PWSTR Path,
|
||||||
PWSTR ValueName);
|
PWSTR ValueName);
|
||||||
|
LARGE_INTEGER RtlEnlargedIntegerMultiply(LONG Multiplicand,
|
||||||
|
LONG Multiplier);
|
||||||
|
ULONG RtlEnlargedUnsignedDivide(ULARGE_INTEGER Dividend,
|
||||||
|
ULONG Divisor,
|
||||||
|
PULONG Remainder);
|
||||||
|
LARGE_INTEGER RtlEnlargedUnsignedMultiply(ULONG Multiplicand,
|
||||||
|
ULONG Multiplier);
|
||||||
BOOLEAN RtlEqualString(PSTRING String1,
|
BOOLEAN RtlEqualString(PSTRING String1,
|
||||||
PSTRING String2,
|
PSTRING String2,
|
||||||
BOOLEAN CaseInSensitive);
|
BOOLEAN CaseInSensitive);
|
||||||
BOOLEAN RtlEqualUnicodeString(PUNICODE_STRING String1,
|
BOOLEAN RtlEqualUnicodeString(PUNICODE_STRING String1,
|
||||||
PUNICODE_STRING String2,
|
PUNICODE_STRING String2,
|
||||||
BOOLEAN CaseInSensitive);
|
BOOLEAN CaseInSensitive);
|
||||||
|
LARGE_INTEGER RtlExtendedIntegerMultiply(LARGE_INTEGER Multiplicand,
|
||||||
|
LONG Multiplier);
|
||||||
|
LARGE_INTEGER RtlExtendedLargeIntegerDivide(LARGE_INTEGER Dividend,
|
||||||
|
ULONG Divisor,
|
||||||
|
PULONG Remainder);
|
||||||
|
LARGE_INTEGER RtlExtendedMagicDivide(LARGE_INTEGER Dividend,
|
||||||
|
LARGE_INTEGER MagicDivisor,
|
||||||
|
CCHAR ShiftCount);
|
||||||
VOID RtlFillMemory(PVOID Destination, ULONG Length, UCHAR Fill);
|
VOID RtlFillMemory(PVOID Destination, ULONG Length, UCHAR Fill);
|
||||||
VOID RtlFreeAnsiString(PANSI_STRING AnsiString);
|
VOID RtlFreeAnsiString(PANSI_STRING AnsiString);
|
||||||
VOID RtlFreeUnicodeString(PUNICODE_STRING UnicodeString);
|
VOID RtlFreeUnicodeString(PUNICODE_STRING UnicodeString);
|
||||||
@@ -182,8 +199,13 @@ VOID RtlInitUnicodeString(PUNICODE_STRING DestinationString,
|
|||||||
NTSTATUS RtlIntegerToUnicodeString(ULONG Value,
|
NTSTATUS RtlIntegerToUnicodeString(ULONG Value,
|
||||||
ULONG Base,
|
ULONG Base,
|
||||||
PUNICODE_STRING String);
|
PUNICODE_STRING String);
|
||||||
|
LARGE_INTEGER RtlLargeIntegerAdd(LARGE_INTEGER Addend1,
|
||||||
|
LARGE_INTEGER Addend2);
|
||||||
|
VOID RtlLargeIntegerAnd(PLARGE_INTEGER Result,
|
||||||
|
LARGE_INTEGER Source,
|
||||||
|
LARGE_INTEGER Mask);
|
||||||
|
|
||||||
/** LARGE_INTEGER Functions *******************************************/
|
/* MISSING FUNCTIONS GO HERE */
|
||||||
LARGE_INTEGER RtlConvertLongToLargeInteger(LONG SignedInteger);
|
LARGE_INTEGER RtlConvertLongToLargeInteger(LONG SignedInteger);
|
||||||
LARGE_INTEGER RtlConvertUlongToLargeInteger(ULONG UnsignedInteger);
|
LARGE_INTEGER RtlConvertUlongToLargeInteger(ULONG UnsignedInteger);
|
||||||
LARGE_INTEGER RtlEnlargedIntegerMultiply(LONG Multiplicand,
|
LARGE_INTEGER RtlEnlargedIntegerMultiply(LONG Multiplicand,
|
||||||
@@ -240,8 +262,6 @@ LARGE_INTEGER RtlLargeIntegerShiftRight(LARGE_INTEGER LargeInteger,
|
|||||||
LARGE_INTEGER RtlLargeIntegerSubtract(LARGE_INTEGER Minuend,
|
LARGE_INTEGER RtlLargeIntegerSubtract(LARGE_INTEGER Minuend,
|
||||||
LARGE_INTEGER Subtrahend);
|
LARGE_INTEGER Subtrahend);
|
||||||
|
|
||||||
/* MISSING FUNCTIONS GO HERE */
|
|
||||||
|
|
||||||
ULONG RtlLengthSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor);
|
ULONG RtlLengthSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor);
|
||||||
VOID RtlMoveMemory(PVOID Destination, CONST VOID* Source, ULONG Length);
|
VOID RtlMoveMemory(PVOID Destination, CONST VOID* Source, ULONG Length);
|
||||||
NTSTATUS RtlQueryRegistryValues(ULONG RelativeTo,
|
NTSTATUS RtlQueryRegistryValues(ULONG RelativeTo,
|
||||||
@@ -299,5 +319,30 @@ RtlFreeHeap(
|
|||||||
PVOID Address
|
PVOID Address
|
||||||
);
|
);
|
||||||
|
|
||||||
|
NTSTATUS RtlUnicodeStringToAnsiString(IN OUT PANSI_STRING DestinationString,
|
||||||
|
IN PUNICODE_STRING SourceString,
|
||||||
|
IN BOOLEAN AllocateDestinationString);
|
||||||
|
NTSTATUS RtlUnicodeStringToInteger(IN PUNICODE_STRING String, IN ULONG Base,
|
||||||
|
OUT PULONG Value);
|
||||||
|
NTSTATUS RtlUpcaseUnicodeString(IN OUT PUNICODE_STRING DestinationString,
|
||||||
|
IN PUNICODE_STRING SourceString,
|
||||||
|
IN BOOLEAN AllocateDestinationString);
|
||||||
|
VOID RtlUpperString(PSTRING DestinationString, PSTRING SourceString);
|
||||||
|
BOOLEAN RtlValidSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor);
|
||||||
|
NTSTATUS RtlWriteRegistryValue(ULONG RelativeTo,
|
||||||
|
PWSTR Path,
|
||||||
|
PWSTR ValueName,
|
||||||
|
ULONG ValueType,
|
||||||
|
PVOID ValueData,
|
||||||
|
ULONG ValueLength);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VOID RtlStoreUlong(PULONG Address,
|
||||||
|
ULONG Value);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __DDK_RTL_H */
|
#endif /* __DDK_RTL_H */
|
||||||
|
@@ -14,10 +14,6 @@
|
|||||||
typedef ULONG ACCESS_MODE, *PACCESS_MODE;
|
typedef ULONG ACCESS_MODE, *PACCESS_MODE;
|
||||||
typedef SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE;
|
typedef SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE;
|
||||||
|
|
||||||
typedef struct _SECURITY_SUBJECT_CONTEXT
|
|
||||||
{
|
|
||||||
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
|
|
||||||
|
|
||||||
typedef struct _SECURITY_DESCRIPTOR_CONTEXT
|
typedef struct _SECURITY_DESCRIPTOR_CONTEXT
|
||||||
{
|
{
|
||||||
} SECURITY_DESCRIPTOR_CONTEXT, *PSECURITY_DESCRIPTOR_CONTEXT;
|
} SECURITY_DESCRIPTOR_CONTEXT, *PSECURITY_DESCRIPTOR_CONTEXT;
|
||||||
@@ -44,4 +40,13 @@ typedef struct _ACCESS_TOKEN {
|
|||||||
UCHAR VariablePart[0];
|
UCHAR VariablePart[0];
|
||||||
} ACCESS_TOKEN, *PACCESS_TOKEN;
|
} ACCESS_TOKEN, *PACCESS_TOKEN;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _SECURITY_SUBJECT_CONTEXT
|
||||||
|
{
|
||||||
|
PACCESS_TOKEN ClientToken;
|
||||||
|
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
|
||||||
|
PACCESS_TOKEN PrimaryToken;
|
||||||
|
PVOID ProcessAuditId;
|
||||||
|
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,14 +0,0 @@
|
|||||||
/* SYSTEM STRUCTURES ******************************************************/
|
|
||||||
|
|
||||||
#include <internal/hal/hal.h>
|
|
||||||
#include <ddk/cfgtypes.h>
|
|
||||||
#include <ddk/ketypes.h>
|
|
||||||
#include <ddk/obtypes.h>
|
|
||||||
#include <ddk/mmtypes.h>
|
|
||||||
#include <ddk/iotypes.h>
|
|
||||||
#include <ddk/extypes.h>
|
|
||||||
#include <ddk/pstypes.h>
|
|
||||||
|
|
||||||
typedef struct _ADAPTER_OBJECT
|
|
||||||
{
|
|
||||||
} ADAPTER_OBJECT, *PADAPTER_OBJECT;
|
|
File diff suppressed because it is too large
Load Diff
@@ -32,6 +32,224 @@
|
|||||||
#ifndef _GNU_H_WINDOWS32_DEFINES
|
#ifndef _GNU_H_WINDOWS32_DEFINES
|
||||||
#define _GNU_H_WINDOWS32_DEFINES
|
#define _GNU_H_WINDOWS32_DEFINES
|
||||||
|
|
||||||
|
#define WINBASEAPI
|
||||||
|
|
||||||
|
#define EXCEPTION_MAXIMUM_PARAMETERS (15)
|
||||||
|
#define ANYSIZE_ARRAY (1)
|
||||||
|
|
||||||
|
#define STATUS_WAIT_0 (0x00000000L)
|
||||||
|
#define STATUS_ABANDONED_WAIT_0 (0x00000080L)
|
||||||
|
#define STATUS_USER_APC (0x000000C0L)
|
||||||
|
#define STATUS_TIMEOUT (0x00000102L)
|
||||||
|
#define STATUS_PENDING (0x00000103L)
|
||||||
|
#define STATUS_GUARD_PAGE_VIOLATION (0x80000001L)
|
||||||
|
#define STATUS_DATATYPE_MISALIGNMENT (0x80000002L)
|
||||||
|
#define STATUS_BREAKPOINT (0x80000003L)
|
||||||
|
#define STATUS_SINGLE_STEP (0x80000004L)
|
||||||
|
#define STATUS_IN_PAGE_ERROR (0xC0000006L)
|
||||||
|
#define STATUS_INVALID_HANDLE (0xC0000008L)
|
||||||
|
#define STATUS_ILLEGAL_INSTRUCTION (0xC000001DL)
|
||||||
|
#define STATUS_NONCONTINUABLE_EXCEPTION (0xC0000025L)
|
||||||
|
#define STATUS_INVALID_DISPOSITION (0xC0000026L)
|
||||||
|
#define STATUS_ARRAY_BOUNDS_EXCEEDED (0xC000008CL)
|
||||||
|
#define STATUS_FLOAT_DENORMAL_OPERAND (0xC000008DL)
|
||||||
|
#define STATUS_FLOAT_DIVIDE_BY_ZERO (0xC000008EL)
|
||||||
|
#define STATUS_FLOAT_INEXACT_RESULT (0xC000008FL)
|
||||||
|
#define STATUS_FLOAT_INVALID_OPERATION (0xC0000090L)
|
||||||
|
#define STATUS_FLOAT_OVERFLOW (0xC0000091L)
|
||||||
|
#define STATUS_FLOAT_STACK_CHECK (0xC0000092L)
|
||||||
|
#define STATUS_FLOAT_UNDERFLOW (0xC0000093L)
|
||||||
|
#define STATUS_INTEGER_DIVIDE_BY_ZERO (0xC0000094L)
|
||||||
|
#define STATUS_INTEGER_OVERFLOW (0xC0000095L)
|
||||||
|
#define STATUS_PRIVILEGED_INSTRUCTION (0xC0000096L)
|
||||||
|
#define STATUS_STACK_OVERFLOW (0xC00000FDL)
|
||||||
|
#define STATUS_CONTROL_C_EXIT (0xC000013AL)
|
||||||
|
|
||||||
|
#define SEC_COMMIT (134217728)
|
||||||
|
#define SEC_IMAGE (16777216)
|
||||||
|
#define SEC_NOCACHE (268435456)
|
||||||
|
#define SEC_RESERVE (67108864)
|
||||||
|
#define PAGE_READONLY (2)
|
||||||
|
#define PAGE_READWRITE (4)
|
||||||
|
#define PAGE_WRITECOPY (8)
|
||||||
|
#define PAGE_EXECUTE (16)
|
||||||
|
#define PAGE_EXECUTE_READ (32)
|
||||||
|
#define PAGE_EXECUTE_READWRITE (64)
|
||||||
|
#define PAGE_EXECUTE_WRITECOPY (128)
|
||||||
|
#define PAGE_GUARD (256)
|
||||||
|
#define PAGE_NOACCESS (1)
|
||||||
|
#define PAGE_NOCACHE (512)
|
||||||
|
#define MEM_COMMIT (4096)
|
||||||
|
#define MEM_FREE (65536)
|
||||||
|
#define MEM_RESERVE (8192)
|
||||||
|
#define MEM_IMAGE (16777216)
|
||||||
|
#define MEM_MAPPED (262144)
|
||||||
|
#define MEM_PRIVATE (131072)
|
||||||
|
#define MEM_DECOMMIT (16384)
|
||||||
|
#define MEM_RELEASE (32768)
|
||||||
|
#define MEM_TOP_DOWN (1048576)
|
||||||
|
#define EXCEPTION_GUARD_PAGE (0x80000001L)
|
||||||
|
#define SECTION_EXTEND_SIZE (0x10)
|
||||||
|
#define SECTION_MAP_READ (0x4)
|
||||||
|
#define SECTION_MAP_WRITE (0x2)
|
||||||
|
#define SECTION_QUERY (0x1)
|
||||||
|
#define SECTION_ALL_ACCESS (0xf001fL)
|
||||||
|
|
||||||
|
|
||||||
|
/* DuplicateHandle, MapViewOfFile */
|
||||||
|
#define DUPLICATE_CLOSE_SOURCE (1)
|
||||||
|
#define DUPLICATE_SAME_ACCESS (2)
|
||||||
|
#define FILE_MAP_ALL_ACCESS (0xf001fL)
|
||||||
|
#define FILE_MAP_READ (4)
|
||||||
|
#define FILE_MAP_WRITE (2)
|
||||||
|
#define FILE_MAP_COPY (1)
|
||||||
|
#define MUTEX_ALL_ACCESS (0x1f0001L)
|
||||||
|
#define MUTEX_MODIFY_STATE (1)
|
||||||
|
#define SYNCHRONIZE (0x100000L)
|
||||||
|
#define SEMAPHORE_ALL_ACCESS (0x1f0003L)
|
||||||
|
#define SEMAPHORE_MODIFY_STATE (2)
|
||||||
|
#define EVENT_ALL_ACCESS (0x1f0003L)
|
||||||
|
#define EVENT_MODIFY_STATE (2)
|
||||||
|
#define KEY_ALL_ACCESS (0xf003fL)
|
||||||
|
#define KEY_CREATE_LINK (32)
|
||||||
|
#define KEY_CREATE_SUB_KEY (4)
|
||||||
|
#define KEY_ENUMERATE_SUB_KEYS (8)
|
||||||
|
#define KEY_EXECUTE (0x20019L)
|
||||||
|
#define KEY_NOTIFY (16)
|
||||||
|
#define KEY_QUERY_VALUE (1)
|
||||||
|
#define KEY_READ (0x20019L)
|
||||||
|
#define KEY_SET_VALUE (2)
|
||||||
|
#define KEY_WRITE (0x20006L)
|
||||||
|
#define PROCESS_ALL_ACCESS (0x1f0fffL)
|
||||||
|
#define PROCESS_CREATE_PROCESS (128)
|
||||||
|
#define PROCESS_CREATE_THREAD (2)
|
||||||
|
#define PROCESS_DUP_HANDLE (64)
|
||||||
|
#define PROCESS_QUERY_INFORMATION (1024)
|
||||||
|
#define PROCESS_SET_INFORMATION (512)
|
||||||
|
#define PROCESS_TERMINATE (1)
|
||||||
|
#define PROCESS_VM_OPERATION (8)
|
||||||
|
#define PROCESS_VM_READ (16)
|
||||||
|
#define PROCESS_VM_WRITE (32)
|
||||||
|
#define THREAD_ALL_ACCESS (0x1f03ffL)
|
||||||
|
#define THREAD_DIRECT_IMPERSONATION (512)
|
||||||
|
#define THREAD_GET_CONTEXT (8)
|
||||||
|
#define THREAD_IMPERSONATE (256)
|
||||||
|
#define THREAD_QUERY_INFORMATION (64)
|
||||||
|
#define THREAD_SET_CONTEXT (16)
|
||||||
|
#define THREAD_SET_INFORMATION (32)
|
||||||
|
#define THREAD_SET_THREAD_TOKEN (128)
|
||||||
|
#define THREAD_SUSPEND_RESUME (2)
|
||||||
|
#define THREAD_TERMINATE (1)
|
||||||
|
|
||||||
|
#define PACKED __attribute__((packed))
|
||||||
|
|
||||||
|
#define THREAD_PRIORITY_ABOVE_NORMAL (1)
|
||||||
|
#define THREAD_PRIORITY_BELOW_NORMAL (-1)
|
||||||
|
#define THREAD_PRIORITY_HIGHEST (2)
|
||||||
|
#define THREAD_PRIORITY_IDLE (-15)
|
||||||
|
#define THREAD_PRIORITY_LOWEST (-2)
|
||||||
|
#define THREAD_PRIORITY_NORMAL (0)
|
||||||
|
#define THREAD_PRIORITY_TIME_CRITICAL (15)
|
||||||
|
#define THREAD_PRIORITY_ERROR_RETURN (2147483647)
|
||||||
|
|
||||||
|
/* CreateFile, GetFileAttributes, SetFileAttributes */
|
||||||
|
#define GENERIC_READ (0x80000000L)
|
||||||
|
#define GENERIC_WRITE (0x40000000L)
|
||||||
|
#define FILE_READ_DATA ( 0x0001 ) /* file & pipe */
|
||||||
|
#define FILE_LIST_DIRECTORY ( 0x0001 ) /* directory */
|
||||||
|
|
||||||
|
#define FILE_WRITE_DATA ( 0x0002 ) /* file & pipe */
|
||||||
|
#define FILE_ADD_FILE ( 0x0002 ) /* directory */
|
||||||
|
|
||||||
|
#define FILE_APPEND_DATA ( 0x0004 ) /* file */
|
||||||
|
#define FILE_ADD_SUBDIRECTORY ( 0x0004 ) /* directory */
|
||||||
|
#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) /* named pipe */
|
||||||
|
|
||||||
|
#define FILE_READ_EA ( 0x0008 ) /* file & directory */
|
||||||
|
#define FILE_READ_PROPERTIES FILE_READ_EA
|
||||||
|
|
||||||
|
#define FILE_WRITE_EA ( 0x0010 ) /* file & directory */
|
||||||
|
#define FILE_WRITE_PROPERTIES FILE_WRITE_EA
|
||||||
|
|
||||||
|
#define FILE_EXECUTE ( 0x0020 ) /* file */
|
||||||
|
#define FILE_TRAVERSE ( 0x0020 ) /* directory */
|
||||||
|
|
||||||
|
#define FILE_DELETE_CHILD ( 0x0040 ) /* directory */
|
||||||
|
|
||||||
|
#define FILE_READ_ATTRIBUTES ( 0x0080 ) /* all */
|
||||||
|
|
||||||
|
#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) /* all */
|
||||||
|
|
||||||
|
#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
|
||||||
|
|
||||||
|
#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
|
||||||
|
FILE_READ_DATA |\
|
||||||
|
FILE_READ_ATTRIBUTES |\
|
||||||
|
FILE_READ_EA |\
|
||||||
|
SYNCHRONIZE)
|
||||||
|
|
||||||
|
|
||||||
|
#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
|
||||||
|
FILE_WRITE_DATA |\
|
||||||
|
FILE_WRITE_ATTRIBUTES |\
|
||||||
|
FILE_WRITE_EA |\
|
||||||
|
FILE_APPEND_DATA |\
|
||||||
|
SYNCHRONIZE)
|
||||||
|
|
||||||
|
|
||||||
|
#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
|
||||||
|
FILE_READ_ATTRIBUTES |\
|
||||||
|
FILE_EXECUTE |\
|
||||||
|
SYNCHRONIZE)
|
||||||
|
|
||||||
|
#define FILE_SHARE_DELETE (4)
|
||||||
|
#define FILE_SHARE_READ (1)
|
||||||
|
#define FILE_SHARE_WRITE (2)
|
||||||
|
#define CONSOLE_TEXTMODE_BUFFER (1)
|
||||||
|
#define CREATE_NEW (1)
|
||||||
|
#define CREATE_ALWAYS (2)
|
||||||
|
#define OPEN_EXISTING (3)
|
||||||
|
#define OPEN_ALWAYS (4)
|
||||||
|
#define TRUNCATE_EXISTING (5)
|
||||||
|
#define FILE_ATTRIBUTE_ARCHIVE (32)
|
||||||
|
#define FILE_ATTRIBUTE_COMPRESSED (2048)
|
||||||
|
#define FILE_ATTRIBUTE_NORMAL (128)
|
||||||
|
#define FILE_ATTRIBUTE_DIRECTORY (16)
|
||||||
|
#define FILE_ATTRIBUTE_HIDDEN (2)
|
||||||
|
#define FILE_ATTRIBUTE_READONLY (1)
|
||||||
|
#define FILE_ATTRIBUTE_SYSTEM (4)
|
||||||
|
#define FILE_ATTRIBUTE_TEMPORARY (256)
|
||||||
|
#define FILE_FLAG_WRITE_THROUGH (2147483648)
|
||||||
|
#define FILE_FLAG_OVERLAPPED (1073741824)
|
||||||
|
#define FILE_FLAG_NO_BUFFERING (536870912)
|
||||||
|
#define FILE_FLAG_RANDOM_ACCESS (268435456)
|
||||||
|
#define FILE_FLAG_SEQUENTIAL_SCAN (134217728)
|
||||||
|
#define FILE_FLAG_DELETE_ON_CLOSE (67108864)
|
||||||
|
#define FILE_FLAG_BACKUP_SEMANTICS (33554432)
|
||||||
|
#define FILE_FLAG_POSIX_SEMANTICS (16777216)
|
||||||
|
#define SECURITY_ANONYMOUS (0)
|
||||||
|
#define SECURITY_IDENTIFICATION (65536)
|
||||||
|
#define SECURITY_IMPERSONATION (131072)
|
||||||
|
#define SECURITY_DELEGATION (196608)
|
||||||
|
#define SECURITY_CONTEXT_TRACKING (262144)
|
||||||
|
#define SECURITY_EFFECTIVE_ONLY (524288)
|
||||||
|
#define SECURITY_SQOS_PRESENT (1048576)
|
||||||
|
|
||||||
|
/* Standard rights */
|
||||||
|
#define STANDARD_RIGHTS_REQUIRED (0xf0000L)
|
||||||
|
#define STANDARD_RIGHTS_WRITE (0x20000L)
|
||||||
|
#define STANDARD_RIGHTS_READ (0x20000L)
|
||||||
|
#define STANDARD_RIGHTS_EXECUTE (0x20000L)
|
||||||
|
#define STANDARD_RIGHTS_ALL (0x1f0000L)
|
||||||
|
#define SPECIFIC_RIGHTS_ALL (0xffffL)
|
||||||
|
|
||||||
|
/* ACCESS_MASK */
|
||||||
|
#define MAXIMUM_ALLOWED (0x2000000L)
|
||||||
|
#define GENERIC_ALL (0x10000000L)
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
@@ -45,7 +263,6 @@ extern "C" {
|
|||||||
#define SECURITY_DYNAMIC_TRACKING (1)
|
#define SECURITY_DYNAMIC_TRACKING (1)
|
||||||
#define MAX_DEFAULTCHAR (2)
|
#define MAX_DEFAULTCHAR (2)
|
||||||
#define MAX_LEADBYTES (12)
|
#define MAX_LEADBYTES (12)
|
||||||
#define EXCEPTION_MAXIMUM_PARAMETERS (15)
|
|
||||||
#define CCHDEVICENAME (32)
|
#define CCHDEVICENAME (32)
|
||||||
#define CCHFORMNAME (32)
|
#define CCHFORMNAME (32)
|
||||||
#define MENU_TEXT_LEN (40)
|
#define MENU_TEXT_LEN (40)
|
||||||
@@ -54,7 +271,6 @@ extern "C" {
|
|||||||
#define NETBIOS_NAME_LEN (16)
|
#define NETBIOS_NAME_LEN (16)
|
||||||
#define OFS_MAXPATHNAME (128)
|
#define OFS_MAXPATHNAME (128)
|
||||||
#define MAX_TAB_STOPS (32)
|
#define MAX_TAB_STOPS (32)
|
||||||
#define ANYSIZE_ARRAY (1)
|
|
||||||
#define RAS_MaxCallbackNumber (128)
|
#define RAS_MaxCallbackNumber (128)
|
||||||
#define RAS_MaxDeviceName (128)
|
#define RAS_MaxDeviceName (128)
|
||||||
#define RAS_MaxDeviceType (16)
|
#define RAS_MaxDeviceType (16)
|
||||||
@@ -382,119 +598,7 @@ extern "C" {
|
|||||||
#define DIB_PAL_COLORS (1)
|
#define DIB_PAL_COLORS (1)
|
||||||
#define DIB_RGB_COLORS (0)
|
#define DIB_RGB_COLORS (0)
|
||||||
|
|
||||||
/* CreateFile, GetFileAttributes, SetFileAttributes */
|
|
||||||
#define GENERIC_READ (0x80000000L)
|
|
||||||
#define GENERIC_WRITE (0x40000000L)
|
|
||||||
#define FILE_READ_DATA ( 0x0001 ) /* file & pipe */
|
|
||||||
#define FILE_LIST_DIRECTORY ( 0x0001 ) /* directory */
|
|
||||||
|
|
||||||
#define FILE_WRITE_DATA ( 0x0002 ) /* file & pipe */
|
|
||||||
#define FILE_ADD_FILE ( 0x0002 ) /* directory */
|
|
||||||
|
|
||||||
#define FILE_APPEND_DATA ( 0x0004 ) /* file */
|
|
||||||
#define FILE_ADD_SUBDIRECTORY ( 0x0004 ) /* directory */
|
|
||||||
#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) /* named pipe */
|
|
||||||
|
|
||||||
#define FILE_READ_EA ( 0x0008 ) /* file & directory */
|
|
||||||
#define FILE_READ_PROPERTIES FILE_READ_EA
|
|
||||||
|
|
||||||
#define FILE_WRITE_EA ( 0x0010 ) /* file & directory */
|
|
||||||
#define FILE_WRITE_PROPERTIES FILE_WRITE_EA
|
|
||||||
|
|
||||||
#define FILE_EXECUTE ( 0x0020 ) /* file */
|
|
||||||
#define FILE_TRAVERSE ( 0x0020 ) /* directory */
|
|
||||||
|
|
||||||
#define FILE_DELETE_CHILD ( 0x0040 ) /* directory */
|
|
||||||
|
|
||||||
#define FILE_READ_ATTRIBUTES ( 0x0080 ) /* all */
|
|
||||||
|
|
||||||
#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) /* all */
|
|
||||||
|
|
||||||
#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
|
|
||||||
|
|
||||||
#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
|
|
||||||
FILE_READ_DATA |\
|
|
||||||
FILE_READ_ATTRIBUTES |\
|
|
||||||
FILE_READ_EA |\
|
|
||||||
SYNCHRONIZE)
|
|
||||||
|
|
||||||
|
|
||||||
#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
|
|
||||||
FILE_WRITE_DATA |\
|
|
||||||
FILE_WRITE_ATTRIBUTES |\
|
|
||||||
FILE_WRITE_EA |\
|
|
||||||
FILE_APPEND_DATA |\
|
|
||||||
SYNCHRONIZE)
|
|
||||||
|
|
||||||
|
|
||||||
#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
|
|
||||||
FILE_READ_ATTRIBUTES |\
|
|
||||||
FILE_EXECUTE |\
|
|
||||||
SYNCHRONIZE)
|
|
||||||
|
|
||||||
#define FILE_SHARE_DELETE (4)
|
|
||||||
#define FILE_SHARE_READ (1)
|
|
||||||
#define FILE_SHARE_WRITE (2)
|
|
||||||
#define CONSOLE_TEXTMODE_BUFFER (1)
|
|
||||||
#define CREATE_NEW (1)
|
|
||||||
#define CREATE_ALWAYS (2)
|
|
||||||
#define OPEN_EXISTING (3)
|
|
||||||
#define OPEN_ALWAYS (4)
|
|
||||||
#define TRUNCATE_EXISTING (5)
|
|
||||||
#define FILE_ATTRIBUTE_ARCHIVE (32)
|
|
||||||
#define FILE_ATTRIBUTE_COMPRESSED (2048)
|
|
||||||
#define FILE_ATTRIBUTE_NORMAL (128)
|
|
||||||
#define FILE_ATTRIBUTE_DIRECTORY (16)
|
|
||||||
#define FILE_ATTRIBUTE_HIDDEN (2)
|
|
||||||
#define FILE_ATTRIBUTE_READONLY (1)
|
|
||||||
#define FILE_ATTRIBUTE_SYSTEM (4)
|
|
||||||
#define FILE_ATTRIBUTE_TEMPORARY (256)
|
|
||||||
#define FILE_FLAG_WRITE_THROUGH (2147483648)
|
|
||||||
#define FILE_FLAG_OVERLAPPED (1073741824)
|
|
||||||
#define FILE_FLAG_NO_BUFFERING (536870912)
|
|
||||||
#define FILE_FLAG_RANDOM_ACCESS (268435456)
|
|
||||||
#define FILE_FLAG_SEQUENTIAL_SCAN (134217728)
|
|
||||||
#define FILE_FLAG_DELETE_ON_CLOSE (67108864)
|
|
||||||
#define FILE_FLAG_BACKUP_SEMANTICS (33554432)
|
|
||||||
#define FILE_FLAG_POSIX_SEMANTICS (16777216)
|
|
||||||
#define SECURITY_ANONYMOUS (0)
|
|
||||||
#define SECURITY_IDENTIFICATION (65536)
|
|
||||||
#define SECURITY_IMPERSONATION (131072)
|
|
||||||
#define SECURITY_DELEGATION (196608)
|
|
||||||
#define SECURITY_CONTEXT_TRACKING (262144)
|
|
||||||
#define SECURITY_EFFECTIVE_ONLY (524288)
|
|
||||||
#define SECURITY_SQOS_PRESENT (1048576)
|
|
||||||
|
|
||||||
/* CreateFileMapping, VirtualAlloc, VirtualFree, VirtualProtect */
|
/* CreateFileMapping, VirtualAlloc, VirtualFree, VirtualProtect */
|
||||||
#define SEC_COMMIT (134217728)
|
|
||||||
#define SEC_IMAGE (16777216)
|
|
||||||
#define SEC_NOCACHE (268435456)
|
|
||||||
#define SEC_RESERVE (67108864)
|
|
||||||
#define PAGE_READONLY (2)
|
|
||||||
#define PAGE_READWRITE (4)
|
|
||||||
#define PAGE_WRITECOPY (8)
|
|
||||||
#define PAGE_EXECUTE (16)
|
|
||||||
#define PAGE_EXECUTE_READ (32)
|
|
||||||
#define PAGE_EXECUTE_READWRITE (64)
|
|
||||||
#define PAGE_EXECUTE_WRITECOPY (128)
|
|
||||||
#define PAGE_GUARD (256)
|
|
||||||
#define PAGE_NOACCESS (1)
|
|
||||||
#define PAGE_NOCACHE (512)
|
|
||||||
#define MEM_COMMIT (4096)
|
|
||||||
#define MEM_FREE (65536)
|
|
||||||
#define MEM_RESERVE (8192)
|
|
||||||
#define MEM_IMAGE (16777216)
|
|
||||||
#define MEM_MAPPED (262144)
|
|
||||||
#define MEM_PRIVATE (131072)
|
|
||||||
#define MEM_DECOMMIT (16384)
|
|
||||||
#define MEM_RELEASE (32768)
|
|
||||||
#define MEM_TOP_DOWN (1048576)
|
|
||||||
#define EXCEPTION_GUARD_PAGE (0x80000001L)
|
|
||||||
#define SECTION_EXTEND_SIZE (0x10)
|
|
||||||
#define SECTION_MAP_READ (0x4)
|
|
||||||
#define SECTION_MAP_WRITE (0x2)
|
|
||||||
#define SECTION_QUERY (0x1)
|
|
||||||
#define SECTION_ALL_ACCESS (0xf001fL)
|
|
||||||
|
|
||||||
/* CreateFont */
|
/* CreateFont */
|
||||||
#define FW_DONTCARE (0)
|
#define FW_DONTCARE (0)
|
||||||
@@ -1051,50 +1155,6 @@ extern "C" {
|
|||||||
#define DT_WORDBREAK (16)
|
#define DT_WORDBREAK (16)
|
||||||
#define DT_INTERNAL (4096)
|
#define DT_INTERNAL (4096)
|
||||||
|
|
||||||
/* DuplicateHandle, MapViewOfFile */
|
|
||||||
#define DUPLICATE_CLOSE_SOURCE (1)
|
|
||||||
#define DUPLICATE_SAME_ACCESS (2)
|
|
||||||
#define FILE_MAP_ALL_ACCESS (0xf001fL)
|
|
||||||
#define FILE_MAP_READ (4)
|
|
||||||
#define FILE_MAP_WRITE (2)
|
|
||||||
#define FILE_MAP_COPY (1)
|
|
||||||
#define MUTEX_ALL_ACCESS (0x1f0001L)
|
|
||||||
#define MUTEX_MODIFY_STATE (1)
|
|
||||||
#define SYNCHRONIZE (0x100000L)
|
|
||||||
#define SEMAPHORE_ALL_ACCESS (0x1f0003L)
|
|
||||||
#define SEMAPHORE_MODIFY_STATE (2)
|
|
||||||
#define EVENT_ALL_ACCESS (0x1f0003L)
|
|
||||||
#define EVENT_MODIFY_STATE (2)
|
|
||||||
#define KEY_ALL_ACCESS (0xf003fL)
|
|
||||||
#define KEY_CREATE_LINK (32)
|
|
||||||
#define KEY_CREATE_SUB_KEY (4)
|
|
||||||
#define KEY_ENUMERATE_SUB_KEYS (8)
|
|
||||||
#define KEY_EXECUTE (0x20019L)
|
|
||||||
#define KEY_NOTIFY (16)
|
|
||||||
#define KEY_QUERY_VALUE (1)
|
|
||||||
#define KEY_READ (0x20019L)
|
|
||||||
#define KEY_SET_VALUE (2)
|
|
||||||
#define KEY_WRITE (0x20006L)
|
|
||||||
#define PROCESS_ALL_ACCESS (0x1f0fffL)
|
|
||||||
#define PROCESS_CREATE_PROCESS (128)
|
|
||||||
#define PROCESS_CREATE_THREAD (2)
|
|
||||||
#define PROCESS_DUP_HANDLE (64)
|
|
||||||
#define PROCESS_QUERY_INFORMATION (1024)
|
|
||||||
#define PROCESS_SET_INFORMATION (512)
|
|
||||||
#define PROCESS_TERMINATE (1)
|
|
||||||
#define PROCESS_VM_OPERATION (8)
|
|
||||||
#define PROCESS_VM_READ (16)
|
|
||||||
#define PROCESS_VM_WRITE (32)
|
|
||||||
#define THREAD_ALL_ACCESS (0x1f03ffL)
|
|
||||||
#define THREAD_DIRECT_IMPERSONATION (512)
|
|
||||||
#define THREAD_GET_CONTEXT (8)
|
|
||||||
#define THREAD_IMPERSONATE (256)
|
|
||||||
#define THREAD_QUERY_INFORMATION (64)
|
|
||||||
#define THREAD_SET_CONTEXT (16)
|
|
||||||
#define THREAD_SET_INFORMATION (32)
|
|
||||||
#define THREAD_SET_THREAD_TOKEN (128)
|
|
||||||
#define THREAD_SUSPEND_RESUME (2)
|
|
||||||
#define THREAD_TERMINATE (1)
|
|
||||||
|
|
||||||
/* EditWordBreakProc */
|
/* EditWordBreakProc */
|
||||||
#define WB_ISDELIMITER (2)
|
#define WB_ISDELIMITER (2)
|
||||||
@@ -1902,14 +1962,6 @@ extern "C" {
|
|||||||
#define VTA_CENTER (6)
|
#define VTA_CENTER (6)
|
||||||
|
|
||||||
/* GetThreadPriority */
|
/* GetThreadPriority */
|
||||||
#define THREAD_PRIORITY_ABOVE_NORMAL (1)
|
|
||||||
#define THREAD_PRIORITY_BELOW_NORMAL (-1)
|
|
||||||
#define THREAD_PRIORITY_HIGHEST (2)
|
|
||||||
#define THREAD_PRIORITY_IDLE (-15)
|
|
||||||
#define THREAD_PRIORITY_LOWEST (-2)
|
|
||||||
#define THREAD_PRIORITY_NORMAL (0)
|
|
||||||
#define THREAD_PRIORITY_TIME_CRITICAL (15)
|
|
||||||
#define THREAD_PRIORITY_ERROR_RETURN (2147483647)
|
|
||||||
#define TLS_MINIMUM_AVAILABLE (64)
|
#define TLS_MINIMUM_AVAILABLE (64)
|
||||||
|
|
||||||
/* GetTimeFormat */
|
/* GetTimeFormat */
|
||||||
@@ -4110,17 +4162,6 @@ extern "C" {
|
|||||||
#define TAPE_DRIVE_WRITE_SETMARKS (-2130706432)
|
#define TAPE_DRIVE_WRITE_SETMARKS (-2130706432)
|
||||||
#define TAPE_DRIVE_WRITE_SHORT_FMKS (-2080374784)
|
#define TAPE_DRIVE_WRITE_SHORT_FMKS (-2080374784)
|
||||||
|
|
||||||
/* Standard rights */
|
|
||||||
#define STANDARD_RIGHTS_REQUIRED (0xf0000L)
|
|
||||||
#define STANDARD_RIGHTS_WRITE (0x20000L)
|
|
||||||
#define STANDARD_RIGHTS_READ (0x20000L)
|
|
||||||
#define STANDARD_RIGHTS_EXECUTE (0x20000L)
|
|
||||||
#define STANDARD_RIGHTS_ALL (0x1f0000L)
|
|
||||||
#define SPECIFIC_RIGHTS_ALL (0xffffL)
|
|
||||||
|
|
||||||
/* ACCESS_MASK */
|
|
||||||
#define MAXIMUM_ALLOWED (0x2000000L)
|
|
||||||
#define GENERIC_ALL (0x10000000L)
|
|
||||||
|
|
||||||
/* SID */
|
/* SID */
|
||||||
#define SECURITY_NULL_RID (0L)
|
#define SECURITY_NULL_RID (0L)
|
||||||
@@ -5052,33 +5093,6 @@ extern "C" {
|
|||||||
|
|
||||||
#define POLYFILL_LAST (2)
|
#define POLYFILL_LAST (2)
|
||||||
|
|
||||||
#define STATUS_WAIT_0 (0x00000000L)
|
|
||||||
#define STATUS_ABANDONED_WAIT_0 (0x00000080L)
|
|
||||||
#define STATUS_USER_APC (0x000000C0L)
|
|
||||||
#define STATUS_TIMEOUT (0x00000102L)
|
|
||||||
#define STATUS_PENDING (0x00000103L)
|
|
||||||
#define STATUS_GUARD_PAGE_VIOLATION (0x80000001L)
|
|
||||||
#define STATUS_DATATYPE_MISALIGNMENT (0x80000002L)
|
|
||||||
#define STATUS_BREAKPOINT (0x80000003L)
|
|
||||||
#define STATUS_SINGLE_STEP (0x80000004L)
|
|
||||||
#define STATUS_IN_PAGE_ERROR (0xC0000006L)
|
|
||||||
#define STATUS_INVALID_HANDLE (0xC0000008L)
|
|
||||||
#define STATUS_ILLEGAL_INSTRUCTION (0xC000001DL)
|
|
||||||
#define STATUS_NONCONTINUABLE_EXCEPTION (0xC0000025L)
|
|
||||||
#define STATUS_INVALID_DISPOSITION (0xC0000026L)
|
|
||||||
#define STATUS_ARRAY_BOUNDS_EXCEEDED (0xC000008CL)
|
|
||||||
#define STATUS_FLOAT_DENORMAL_OPERAND (0xC000008DL)
|
|
||||||
#define STATUS_FLOAT_DIVIDE_BY_ZERO (0xC000008EL)
|
|
||||||
#define STATUS_FLOAT_INEXACT_RESULT (0xC000008FL)
|
|
||||||
#define STATUS_FLOAT_INVALID_OPERATION (0xC0000090L)
|
|
||||||
#define STATUS_FLOAT_OVERFLOW (0xC0000091L)
|
|
||||||
#define STATUS_FLOAT_STACK_CHECK (0xC0000092L)
|
|
||||||
#define STATUS_FLOAT_UNDERFLOW (0xC0000093L)
|
|
||||||
#define STATUS_INTEGER_DIVIDE_BY_ZERO (0xC0000094L)
|
|
||||||
#define STATUS_INTEGER_OVERFLOW (0xC0000095L)
|
|
||||||
#define STATUS_PRIVILEGED_INSTRUCTION (0xC0000096L)
|
|
||||||
#define STATUS_STACK_OVERFLOW (0xC00000FDL)
|
|
||||||
#define STATUS_CONTROL_C_EXIT (0xC000013AL)
|
|
||||||
|
|
||||||
#define EXCEPTION_CTRL_C
|
#define EXCEPTION_CTRL_C
|
||||||
|
|
||||||
@@ -5139,7 +5153,6 @@ DECLARE_HANDLE(HANDLE);
|
|||||||
|
|
||||||
#define ASCIICHAR AsciiChar
|
#define ASCIICHAR AsciiChar
|
||||||
#define FAR
|
#define FAR
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
|
|
||||||
#define FILTER_TEMP_DUPLICATE_ACCOUNT (0x0001)
|
#define FILTER_TEMP_DUPLICATE_ACCOUNT (0x0001)
|
||||||
#define FILTER_NORMAL_ACCOUNT (0x0002)
|
#define FILTER_NORMAL_ACCOUNT (0x0002)
|
||||||
@@ -5164,4 +5177,6 @@ DECLARE_HANDLE(HANDLE);
|
|||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* WIN32_LEAN_AND_MEAN */
|
||||||
|
|
||||||
#endif /* _GNU_H_WINDOWS32_DEFINES */
|
#endif /* _GNU_H_WINDOWS32_DEFINES */
|
||||||
|
@@ -31,6 +31,8 @@
|
|||||||
#ifndef _GNU_H_WINDOWS32_FUNCTIONS
|
#ifndef _GNU_H_WINDOWS32_FUNCTIONS
|
||||||
#define _GNU_H_WINDOWS32_FUNCTIONS
|
#define _GNU_H_WINDOWS32_FUNCTIONS
|
||||||
|
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
@@ -7430,6 +7432,9 @@ DWORD STDCALL NetGroupEnum (LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD,
|
|||||||
DWORD STDCALL NetLocalGroupEnum (LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD,
|
DWORD STDCALL NetLocalGroupEnum (LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD,
|
||||||
LPDWORD, LPDWORD);
|
LPDWORD, LPDWORD);
|
||||||
|
|
||||||
|
|
||||||
|
VOID CopyMemory(PVOID Destination, CONST VOID* Source, DWORD Length);
|
||||||
|
|
||||||
void WINAPI
|
void WINAPI
|
||||||
SHAddToRecentDocs (UINT, LPCVOID);
|
SHAddToRecentDocs (UINT, LPCVOID);
|
||||||
|
|
||||||
@@ -7481,4 +7486,6 @@ SHLoadInProc (REFCLSID);
|
|||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* WIN32_LEAN_AND_MEAN */
|
||||||
|
|
||||||
#endif /* _GNU_H_WINDOWS32_FUNCTIONS */
|
#endif /* _GNU_H_WINDOWS32_FUNCTIONS */
|
||||||
|
@@ -38,6 +38,11 @@ extern char _ctmp;
|
|||||||
|
|
||||||
#define upalpha ('A' - 'a')
|
#define upalpha ('A' - 'a')
|
||||||
|
|
||||||
|
extern inline int isspace(char c)
|
||||||
|
{
|
||||||
|
return(c==' '||c=='\t');
|
||||||
|
}
|
||||||
|
|
||||||
extern inline char toupper(char c)
|
extern inline char toupper(char c)
|
||||||
{
|
{
|
||||||
if ((c>='a') && (c<='z')) return (c+upalpha);
|
if ((c>='a') && (c<='z')) return (c+upalpha);
|
||||||
|
@@ -23,15 +23,17 @@
|
|||||||
#define DPRINT1(x)
|
#define DPRINT1(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define UNIMPLEMENTED do {DbgPrint("%s at %s:%d is umimplemented, have a nice day\n",__FUNCTION__,__FILE__,__LINE__); for(;;); } while(0);
|
#define UNIMPLEMENTED do {DbgPrint("%s at %s:%d is unimplemented, have a nice day\n",__FUNCTION__,__FILE__,__LINE__); for(;;); } while(0);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
#define DPRINT(fmt,args...) do { DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint(fmt,args); ExAllocatePool(NonPagedPool, 0); } while(0);
|
#define OLD_DPRINT(fmt,args...) do { DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint(fmt,args); } while(0);
|
||||||
|
#define DPRINT(args...) do { DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint(args); ExAllocatePool(NonPagedPool,0); } while(0);
|
||||||
//#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); (*((unsigned int *)0))=1; for (;;); }
|
//#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); (*((unsigned int *)0))=1; for (;;); }
|
||||||
#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); for (;;); }
|
#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); for (;;); }
|
||||||
#define CHECKPOINT do {DbgPrint("%s:%d\n",__FILE__,__LINE__); ExAllocatePool(NonPagedPool, 0); } while(0);
|
#define CHECKPOINT do { DbgPrint("%s:%d\n",__FILE__,__LINE__); ExAllocatePool(NonPagedPool,0); } while(0);
|
||||||
#else
|
#else
|
||||||
#define DPRINT(fmt,args...)
|
#define DPRINT(args...)
|
||||||
|
#define OLD_DPRINT(args...)
|
||||||
#define assert(x)
|
#define assert(x)
|
||||||
#define CHECKPOINT
|
#define CHECKPOINT
|
||||||
#endif /* NDEBUG */
|
#endif /* NDEBUG */
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: dma.h,v 1.3 1998/08/25 04:48:36 rex Exp $
|
/* $Id: dma.h,v 1.1.1.2 1998/08/25 04:27:32 rex Exp $
|
||||||
* linux/include/asm/dma.h: Defines for using and allocating dma channels.
|
* linux/include/asm/dma.h: Defines for using and allocating dma channels.
|
||||||
* Written by Hennus Bergman, 1992.
|
* Written by Hennus Bergman, 1992.
|
||||||
* High DMA channel support & info by Hannu Savolainen
|
* High DMA channel support & info by Hannu Savolainen
|
||||||
|
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __INTERNAL_HAL_HAL_H
|
|
||||||
#define __INTERNAL_HAL_HAL_H
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short previous_task;
|
|
||||||
unsigned short reserved1;
|
|
||||||
unsigned long esp0;
|
|
||||||
unsigned short ss0;
|
|
||||||
unsigned short reserved2;
|
|
||||||
unsigned long esp1;
|
|
||||||
unsigned short ss1;
|
|
||||||
unsigned short reserved3;
|
|
||||||
unsigned long esp2;
|
|
||||||
unsigned short ss2;
|
|
||||||
unsigned short reserved4;
|
|
||||||
unsigned long cr3;
|
|
||||||
unsigned long eip;
|
|
||||||
unsigned long eflags;
|
|
||||||
unsigned long eax;
|
|
||||||
unsigned long ecx;
|
|
||||||
unsigned long edx;
|
|
||||||
unsigned long ebx;
|
|
||||||
unsigned long esp;
|
|
||||||
unsigned long ebp;
|
|
||||||
unsigned long esi;
|
|
||||||
unsigned long edi;
|
|
||||||
unsigned short es;
|
|
||||||
unsigned short reserved5;
|
|
||||||
unsigned short cs;
|
|
||||||
unsigned short reserved6;
|
|
||||||
unsigned short ss;
|
|
||||||
unsigned short reserved7;
|
|
||||||
unsigned short ds;
|
|
||||||
unsigned short reserved8;
|
|
||||||
unsigned short fs;
|
|
||||||
unsigned short reserved9;
|
|
||||||
unsigned short gs;
|
|
||||||
unsigned short reserved10;
|
|
||||||
unsigned short ldt;
|
|
||||||
unsigned short reserved11;
|
|
||||||
unsigned short trap;
|
|
||||||
unsigned short iomap_base;
|
|
||||||
|
|
||||||
unsigned short nr;
|
|
||||||
|
|
||||||
unsigned char io_bitmap[1];
|
|
||||||
} hal_thread_state;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FUNCTION: Probes for a PCI bus
|
|
||||||
* RETURNS: True if found
|
|
||||||
*/
|
|
||||||
BOOL HalPciProbe(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FUNCTION: Probes for a BIOS32 extension
|
|
||||||
*/
|
|
||||||
VOID Hal_bios32_probe(VOID);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FUNCTION: Determines if a a bios32 service is present
|
|
||||||
*/
|
|
||||||
BOOLEAN Hal_bios32_is_service_present(ULONG service);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __INTERNAL_HAL_HAL_H */
|
|
@@ -1,82 +0,0 @@
|
|||||||
/*
|
|
||||||
* Lowlevel memory managment definitions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __INTERNAL_HAL_PAGE_H
|
|
||||||
#define __INTERNAL_HAL_PAGE_H
|
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
|
||||||
|
|
||||||
#define PAGESIZE (4096)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets a page entry
|
|
||||||
* vaddr: The virtual address to set the page entry for
|
|
||||||
* attributes: The access attributes to give the page
|
|
||||||
* physaddr: The physical address the page should map to
|
|
||||||
*/
|
|
||||||
void set_page(unsigned int vaddr, unsigned int attributes,
|
|
||||||
unsigned int physaddr);
|
|
||||||
|
|
||||||
#define PAGE_ROUND_UP(x) ( (((ULONG)x)%PAGESIZE) ? ((((ULONG)x)&(~0xfff))+0x1000) : ((ULONG)x) )
|
|
||||||
#define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~0xfff))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Page access attributes (or these together)
|
|
||||||
*/
|
|
||||||
#define PA_READ (1<<0)
|
|
||||||
#define PA_WRITE ((1<<0)+(1<<1))
|
|
||||||
#define PA_EXECUTE PA_READ
|
|
||||||
#define PA_PCD (1<<4)
|
|
||||||
#define PA_PWT (1<<3)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Page attributes
|
|
||||||
*/
|
|
||||||
#define PA_USER (1<<2)
|
|
||||||
#define PA_SYSTEM (0)
|
|
||||||
|
|
||||||
#define KERNEL_BASE (0xc0000000)
|
|
||||||
#define IDMAP_BASE (0xd0000000)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return a linear address which can be used to access the physical memory
|
|
||||||
* starting at x
|
|
||||||
*/
|
|
||||||
extern inline unsigned int physical_to_linear(unsigned int x)
|
|
||||||
{
|
|
||||||
return(x+IDMAP_BASE);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern inline unsigned int linear_to_physical(unsigned int x)
|
|
||||||
{
|
|
||||||
return(x-IDMAP_BASE);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FLUSH_TLB __asm__("movl %cr3,%eax\n\tmovl %eax,%cr3\n\t")
|
|
||||||
|
|
||||||
extern inline unsigned int* get_page_directory(void)
|
|
||||||
{
|
|
||||||
unsigned int page_dir=0;
|
|
||||||
__asm__("movl %%cr3,%0\n\t"
|
|
||||||
: "=r" (page_dir));
|
|
||||||
return((unsigned int *)physical_to_linear(page_dir));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Amount of memory that can be mapped by a page table
|
|
||||||
*/
|
|
||||||
#define PAGE_TABLE_SIZE (4*1024*1024)
|
|
||||||
|
|
||||||
#define PAGE_MASK(x) (x&(~0xfff))
|
|
||||||
#define VADDR_TO_PT_OFFSET(x) (((x/1024)%4096))
|
|
||||||
#define VADDR_TO_PD_OFFSET(x) ((x)/(4*1024*1024))
|
|
||||||
|
|
||||||
unsigned int* get_page_entry(unsigned int vaddr);
|
|
||||||
|
|
||||||
BOOL is_page_present(unsigned int vaddr);
|
|
||||||
|
|
||||||
#endif /* __INTERNAL_HAL_PAGE_H */
|
|
@@ -1,343 +0,0 @@
|
|||||||
#ifndef _ASM_SEGMENT_H
|
|
||||||
#define _ASM_SEGMENT_H
|
|
||||||
|
|
||||||
#define ZERO_DS 0x18
|
|
||||||
#define KERNEL_CS 0x20
|
|
||||||
#define KERNEL_DS 0x28
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Uh, these should become the main single-value transfer routines..
|
|
||||||
* They automatically use the right size if we just have the right
|
|
||||||
* pointer type..
|
|
||||||
*/
|
|
||||||
#define put_user(x,ptr) __put_user((unsigned long)(x),(ptr),sizeof(*(ptr)))
|
|
||||||
#define get_user(ptr) ((__typeof__(*(ptr)))__get_user((ptr),sizeof(*(ptr))))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is a silly but good way to make sure that
|
|
||||||
* the __put_user function is indeed always optimized,
|
|
||||||
* and that we use the correct sizes..
|
|
||||||
*/
|
|
||||||
extern int bad_user_access_length(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dummy pointer type structure.. gcc won't try to do something strange
|
|
||||||
* this way..
|
|
||||||
*/
|
|
||||||
struct __segment_dummy { unsigned long a[100]; };
|
|
||||||
#define __sd(x) ((struct __segment_dummy *) (x))
|
|
||||||
#define __const_sd(x) ((const struct __segment_dummy *) (x))
|
|
||||||
|
|
||||||
static inline void __put_user(unsigned long x, void * y, int size)
|
|
||||||
{
|
|
||||||
switch (size) {
|
|
||||||
case 1:
|
|
||||||
__asm__ ("movb %b1,%%fs:%0"
|
|
||||||
:"=m" (*__sd(y))
|
|
||||||
:"iq" ((unsigned char) x), "m" (*__sd(y)));
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
__asm__ ("movw %w1,%%fs:%0"
|
|
||||||
:"=m" (*__sd(y))
|
|
||||||
:"ir" ((unsigned short) x), "m" (*__sd(y)));
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
__asm__ ("movl %1,%%fs:%0"
|
|
||||||
:"=m" (*__sd(y))
|
|
||||||
:"ir" (x), "m" (*__sd(y)));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
bad_user_access_length();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long __get_user(const void * y, int size)
|
|
||||||
{
|
|
||||||
unsigned long result;
|
|
||||||
|
|
||||||
switch (size) {
|
|
||||||
case 1:
|
|
||||||
__asm__ ("movb %%fs:%1,%b0"
|
|
||||||
:"=q" (result)
|
|
||||||
:"m" (*__const_sd(y)));
|
|
||||||
return (unsigned char) result;
|
|
||||||
case 2:
|
|
||||||
__asm__ ("movw %%fs:%1,%w0"
|
|
||||||
:"=r" (result)
|
|
||||||
:"m" (*__const_sd(y)));
|
|
||||||
return (unsigned short) result;
|
|
||||||
case 4:
|
|
||||||
__asm__ ("movl %%fs:%1,%0"
|
|
||||||
:"=r" (result)
|
|
||||||
:"m" (*__const_sd(y)));
|
|
||||||
return result;
|
|
||||||
default:
|
|
||||||
return bad_user_access_length();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __generic_memcpy_tofs(void * to, const void * from, unsigned long n)
|
|
||||||
{
|
|
||||||
__asm__ volatile
|
|
||||||
(" cld
|
|
||||||
push %%es
|
|
||||||
push %%fs
|
|
||||||
cmpl $3,%0
|
|
||||||
pop %%es
|
|
||||||
jbe 1f
|
|
||||||
movl %%edi,%%ecx
|
|
||||||
negl %%ecx
|
|
||||||
andl $3,%%ecx
|
|
||||||
subl %%ecx,%0
|
|
||||||
rep; movsb
|
|
||||||
movl %0,%%ecx
|
|
||||||
shrl $2,%%ecx
|
|
||||||
rep; movsl
|
|
||||||
andl $3,%0
|
|
||||||
1: movl %0,%%ecx
|
|
||||||
rep; movsb
|
|
||||||
pop %%es"
|
|
||||||
:"=abd" (n)
|
|
||||||
:"0" (n),"D" ((long) to),"S" ((long) from)
|
|
||||||
:"cx","di","si");
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __constant_memcpy_tofs(void * to, const void * from, unsigned long n)
|
|
||||||
{
|
|
||||||
switch (n) {
|
|
||||||
case 0:
|
|
||||||
return;
|
|
||||||
case 1:
|
|
||||||
__put_user(*(const char *) from, (char *) to, 1);
|
|
||||||
return;
|
|
||||||
case 2:
|
|
||||||
__put_user(*(const short *) from, (short *) to, 2);
|
|
||||||
return;
|
|
||||||
case 3:
|
|
||||||
__put_user(*(const short *) from, (short *) to, 2);
|
|
||||||
__put_user(*(2+(const char *) from), 2+(char *) to, 1);
|
|
||||||
return;
|
|
||||||
case 4:
|
|
||||||
__put_user(*(const int *) from, (int *) to, 4);
|
|
||||||
return;
|
|
||||||
case 8:
|
|
||||||
__put_user(*(const int *) from, (int *) to, 4);
|
|
||||||
__put_user(*(1+(const int *) from), 1+(int *) to, 4);
|
|
||||||
return;
|
|
||||||
case 12:
|
|
||||||
__put_user(*(const int *) from, (int *) to, 4);
|
|
||||||
__put_user(*(1+(const int *) from), 1+(int *) to, 4);
|
|
||||||
__put_user(*(2+(const int *) from), 2+(int *) to, 4);
|
|
||||||
return;
|
|
||||||
case 16:
|
|
||||||
__put_user(*(const int *) from, (int *) to, 4);
|
|
||||||
__put_user(*(1+(const int *) from), 1+(int *) to, 4);
|
|
||||||
__put_user(*(2+(const int *) from), 2+(int *) to, 4);
|
|
||||||
__put_user(*(3+(const int *) from), 3+(int *) to, 4);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#define COMMON(x) \
|
|
||||||
__asm__("cld\n\t" \
|
|
||||||
"push %%es\n\t" \
|
|
||||||
"push %%fs\n\t" \
|
|
||||||
"pop %%es\n\t" \
|
|
||||||
"rep ; movsl\n\t" \
|
|
||||||
x \
|
|
||||||
"pop %%es" \
|
|
||||||
: /* no outputs */ \
|
|
||||||
:"c" (n/4),"D" ((long) to),"S" ((long) from) \
|
|
||||||
:"cx","di","si")
|
|
||||||
|
|
||||||
switch (n % 4) {
|
|
||||||
case 0:
|
|
||||||
COMMON("");
|
|
||||||
return;
|
|
||||||
case 1:
|
|
||||||
COMMON("movsb\n\t");
|
|
||||||
return;
|
|
||||||
case 2:
|
|
||||||
COMMON("movsw\n\t");
|
|
||||||
return;
|
|
||||||
case 3:
|
|
||||||
COMMON("movsw\n\tmovsb\n\t");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#undef COMMON
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __generic_memcpy_fromfs(void * to, const void * from, unsigned long n)
|
|
||||||
{
|
|
||||||
__asm__ volatile
|
|
||||||
(" cld
|
|
||||||
cmpl $3,%0
|
|
||||||
jbe 1f
|
|
||||||
movl %%edi,%%ecx
|
|
||||||
negl %%ecx
|
|
||||||
andl $3,%%ecx
|
|
||||||
subl %%ecx,%0
|
|
||||||
fs; rep; movsb
|
|
||||||
movl %0,%%ecx
|
|
||||||
shrl $2,%%ecx
|
|
||||||
fs; rep; movsl
|
|
||||||
andl $3,%0
|
|
||||||
1: movl %0,%%ecx
|
|
||||||
fs; rep; movsb"
|
|
||||||
:"=abd" (n)
|
|
||||||
:"0" (n),"D" ((long) to),"S" ((long) from)
|
|
||||||
:"cx","di","si", "memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __constant_memcpy_fromfs(void * to, const void * from, unsigned long n)
|
|
||||||
{
|
|
||||||
switch (n) {
|
|
||||||
case 0:
|
|
||||||
return;
|
|
||||||
case 1:
|
|
||||||
*(char *)to = __get_user((const char *) from, 1);
|
|
||||||
return;
|
|
||||||
case 2:
|
|
||||||
*(short *)to = __get_user((const short *) from, 2);
|
|
||||||
return;
|
|
||||||
case 3:
|
|
||||||
*(short *) to = __get_user((const short *) from, 2);
|
|
||||||
*((char *) to + 2) = __get_user(2+(const char *) from, 1);
|
|
||||||
return;
|
|
||||||
case 4:
|
|
||||||
*(int *) to = __get_user((const int *) from, 4);
|
|
||||||
return;
|
|
||||||
case 8:
|
|
||||||
*(int *) to = __get_user((const int *) from, 4);
|
|
||||||
*(1+(int *) to) = __get_user(1+(const int *) from, 4);
|
|
||||||
return;
|
|
||||||
case 12:
|
|
||||||
*(int *) to = __get_user((const int *) from, 4);
|
|
||||||
*(1+(int *) to) = __get_user(1+(const int *) from, 4);
|
|
||||||
*(2+(int *) to) = __get_user(2+(const int *) from, 4);
|
|
||||||
return;
|
|
||||||
case 16:
|
|
||||||
*(int *) to = __get_user((const int *) from, 4);
|
|
||||||
*(1+(int *) to) = __get_user(1+(const int *) from, 4);
|
|
||||||
*(2+(int *) to) = __get_user(2+(const int *) from, 4);
|
|
||||||
*(3+(int *) to) = __get_user(3+(const int *) from, 4);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#define COMMON(x) \
|
|
||||||
__asm__("cld\n\t" \
|
|
||||||
"rep ; fs ; movsl\n\t" \
|
|
||||||
x \
|
|
||||||
: /* no outputs */ \
|
|
||||||
:"c" (n/4),"D" ((long) to),"S" ((long) from) \
|
|
||||||
:"cx","di","si","memory")
|
|
||||||
|
|
||||||
switch (n % 4) {
|
|
||||||
case 0:
|
|
||||||
COMMON("");
|
|
||||||
return;
|
|
||||||
case 1:
|
|
||||||
COMMON("fs ; movsb");
|
|
||||||
return;
|
|
||||||
case 2:
|
|
||||||
COMMON("fs ; movsw");
|
|
||||||
return;
|
|
||||||
case 3:
|
|
||||||
COMMON("fs ; movsw\n\tfs ; movsb");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#undef COMMON
|
|
||||||
}
|
|
||||||
|
|
||||||
#define memcpy_fromfs(to, from, n) \
|
|
||||||
(__builtin_constant_p(n) ? \
|
|
||||||
__constant_memcpy_fromfs((to),(from),(n)) : \
|
|
||||||
__generic_memcpy_fromfs((to),(from),(n)))
|
|
||||||
|
|
||||||
#define memcpy_tofs(to, from, n) \
|
|
||||||
(__builtin_constant_p(n) ? \
|
|
||||||
__constant_memcpy_tofs((to),(from),(n)) : \
|
|
||||||
__generic_memcpy_tofs((to),(from),(n)))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These are deprecated..
|
|
||||||
*
|
|
||||||
* Use "put_user()" and "get_user()" with the proper pointer types instead.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define get_fs_byte(addr) __get_user((const unsigned char *)(addr),1)
|
|
||||||
#define get_fs_word(addr) __get_user((const unsigned short *)(addr),2)
|
|
||||||
#define get_fs_long(addr) __get_user((const unsigned int *)(addr),4)
|
|
||||||
|
|
||||||
#define put_fs_byte(x,addr) __put_user((x),(unsigned char *)(addr),1)
|
|
||||||
#define put_fs_word(x,addr) __put_user((x),(unsigned short *)(addr),2)
|
|
||||||
#define put_fs_long(x,addr) __put_user((x),(unsigned int *)(addr),4)
|
|
||||||
|
|
||||||
#ifdef WE_REALLY_WANT_TO_USE_A_BROKEN_INTERFACE
|
|
||||||
|
|
||||||
static inline unsigned short get_user_word(const short *addr)
|
|
||||||
{
|
|
||||||
return __get_user(addr, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned char get_user_byte(const char * addr)
|
|
||||||
{
|
|
||||||
return __get_user(addr,1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long get_user_long(const int *addr)
|
|
||||||
{
|
|
||||||
return __get_user(addr, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void put_user_byte(char val,char *addr)
|
|
||||||
{
|
|
||||||
__put_user(val, addr, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void put_user_word(short val,short * addr)
|
|
||||||
{
|
|
||||||
__put_user(val, addr, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void put_user_long(unsigned long val,int * addr)
|
|
||||||
{
|
|
||||||
__put_user(val, addr, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Someone who knows GNU asm better than I should double check the following.
|
|
||||||
* It seems to work, but I don't know if I'm doing something subtly wrong.
|
|
||||||
* --- TYT, 11/24/91
|
|
||||||
* [ nothing wrong here, Linus: I just changed the ax to be any reg ]
|
|
||||||
*/
|
|
||||||
|
|
||||||
static inline unsigned long get_fs(void)
|
|
||||||
{
|
|
||||||
unsigned long _v;
|
|
||||||
__asm__("mov %%fs,%w0":"=r" (_v):"0" (0));
|
|
||||||
return _v;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long get_ds(void)
|
|
||||||
{
|
|
||||||
unsigned long _v;
|
|
||||||
__asm__("mov %%ds,%w0":"=r" (_v):"0" (0));
|
|
||||||
return _v;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void set_fs(unsigned long val)
|
|
||||||
{
|
|
||||||
__asm__ __volatile__("mov %w0,%%fs": /* no output */ :"r" (val));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void set_ds(unsigned long val)
|
|
||||||
{
|
|
||||||
__asm__ __volatile__("mov %w0,%%ds": /* no output */ :"r" (val));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
|
||||||
|
|
||||||
#endif /* _ASM_SEGMENT_H */
|
|
@@ -51,6 +51,7 @@ typedef struct
|
|||||||
unsigned char io_bitmap[1];
|
unsigned char io_bitmap[1];
|
||||||
} hal_thread_state;
|
} hal_thread_state;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Probes for a PCI bus
|
* FUNCTION: Probes for a PCI bus
|
||||||
* RETURNS: True if found
|
* RETURNS: True if found
|
||||||
|
@@ -14,6 +14,10 @@
|
|||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <internal/ob.h>
|
#include <internal/ob.h>
|
||||||
|
|
||||||
|
extern POBJECT_TYPE IoDeviceType;
|
||||||
|
extern POBJECT_TYPE IoFileType;
|
||||||
|
extern POBJECT_TYPE IoSymbolicLinkType;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Called to initalize a loaded driver
|
* FUNCTION: Called to initalize a loaded driver
|
||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
@@ -36,5 +40,9 @@ PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction,
|
|||||||
PKEVENT UserEvent,
|
PKEVENT UserEvent,
|
||||||
PIO_STATUS_BLOCK IoStatusBlock,
|
PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
PDEVICE_OBJECT DeviceToMount);
|
PDEVICE_OBJECT DeviceToMount);
|
||||||
|
NTSTATUS IoPageRead(PFILE_OBJECT FileObject,
|
||||||
|
PVOID Address,
|
||||||
|
PLARGE_INTEGER Offset,
|
||||||
|
PIO_STATUS_BLOCK StatusBlock);
|
||||||
|
VOID IoSecondStageCompletion(PIRP Irp, CCHAR PriorityBoost);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: include/internal/iomgr.h
|
|
||||||
* PURPOSE: Internal io manager declarations
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* 28/05/97: Created
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __INCLUDE_INTERNAL_IOMGR_H
|
|
||||||
#define __INCLUDE_INTERNAL_IOMGR_H
|
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FUNCTION: Called to initalize a loaded driver
|
|
||||||
* ARGUMENTS:
|
|
||||||
* entry = pointer to the driver initialization routine
|
|
||||||
* RETURNS: Success or failure
|
|
||||||
*/
|
|
||||||
NTSTATUS InitalizeLoadedDriver(PDRIVER_INITIALIZE entry);
|
|
||||||
|
|
||||||
VOID IoInitCancelHandling(VOID);
|
|
||||||
VOID IoInitSymbolicLinkImplementation(VOID);
|
|
||||||
|
|
||||||
#endif
|
|
@@ -15,6 +15,10 @@
|
|||||||
|
|
||||||
/* INTERNAL KERNEL FUNCTIONS ************************************************/
|
/* INTERNAL KERNEL FUNCTIONS ************************************************/
|
||||||
|
|
||||||
|
VOID KeAcquireDispatcherDatabaseLock(BOOLEAN Wait);
|
||||||
|
VOID KeReleaseDispatcherDatabaseLock(BOOLEAN Wait);
|
||||||
|
VOID KeDispatcherObjectWake(DISPATCHER_HEADER* hdr);
|
||||||
|
|
||||||
VOID KiInterruptDispatch(ULONG irq);
|
VOID KiInterruptDispatch(ULONG irq);
|
||||||
VOID KiDispatchInterrupt(ULONG irq);
|
VOID KiDispatchInterrupt(ULONG irq);
|
||||||
VOID KiTimerInterrupt(VOID);
|
VOID KiTimerInterrupt(VOID);
|
||||||
|
@@ -5,8 +5,6 @@
|
|||||||
#ifndef __INCLUDE_INTERNAL_MM_H
|
#ifndef __INCLUDE_INTERNAL_MM_H
|
||||||
#define __INCLUDE_INTERNAL_MM_H
|
#define __INCLUDE_INTERNAL_MM_H
|
||||||
|
|
||||||
#define PAGE_SYSTEM (0x80000000)
|
|
||||||
|
|
||||||
#include <internal/linkage.h>
|
#include <internal/linkage.h>
|
||||||
#include <internal/ntoskrnl.h>
|
#include <internal/ntoskrnl.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
@@ -16,25 +14,31 @@
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
MEMORY_AREA_INVALID,
|
MEMORY_AREA_INVALID,
|
||||||
MEMORY_AREA_SECTION_VIEW,
|
MEMORY_AREA_SECTION_VIEW_COMMIT,
|
||||||
MEMORY_AREA_CONTINUOUS_MEMORY,
|
MEMORY_AREA_CONTINUOUS_MEMORY,
|
||||||
MEMORY_AREA_NO_CACHE,
|
MEMORY_AREA_NO_CACHE,
|
||||||
MEMORY_AREA_IO_MAPPING,
|
MEMORY_AREA_IO_MAPPING,
|
||||||
MEMORY_AREA_SYSTEM,
|
MEMORY_AREA_SYSTEM,
|
||||||
MEMORY_AREA_MDL_MAPPING,
|
MEMORY_AREA_MDL_MAPPING,
|
||||||
|
MEMORY_AREA_COMMIT,
|
||||||
|
MEMORY_AREA_RESERVE,
|
||||||
|
MEMORY_AREA_SECTION_VIEW_RESERVE,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
CSHORT Type;
|
CSHORT Type;
|
||||||
CSHORT Size;
|
CSHORT Size;
|
||||||
FILE_OBJECT* File;
|
LARGE_INTEGER MaximumSize;
|
||||||
} SECTION_OBJECT;
|
ULONG SectionPageProtection;
|
||||||
|
ULONG AllocateAttributes;
|
||||||
|
PFILE_OBJECT FileObject;
|
||||||
|
} SECTION_OBJECT, *PSECTION_OBJECT;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ULONG Type;
|
ULONG Type;
|
||||||
ULONG BaseAddress;
|
PVOID BaseAddress;
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
ULONG Attributes;
|
ULONG Attributes;
|
||||||
LIST_ENTRY Entry;
|
LIST_ENTRY Entry;
|
||||||
@@ -47,22 +51,28 @@ typedef struct
|
|||||||
ULONG ViewOffset;
|
ULONG ViewOffset;
|
||||||
} SectionData;
|
} SectionData;
|
||||||
} Data;
|
} Data;
|
||||||
} MEMORY_AREA;
|
} MEMORY_AREA, *PMEMORY_AREA;
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS MmCreateMemoryArea(KPROCESSOR_MODE Mode,
|
NTSTATUS MmCreateMemoryArea(KPROCESSOR_MODE Mode,
|
||||||
|
PEPROCESS Process,
|
||||||
ULONG Type,
|
ULONG Type,
|
||||||
PULONG BaseAddress,
|
PVOID* BaseAddress,
|
||||||
ULONG Length,
|
ULONG Length,
|
||||||
ULONG Attributes,
|
ULONG Attributes,
|
||||||
MEMORY_AREA** Result);
|
MEMORY_AREA** Result);
|
||||||
MEMORY_AREA* MmOpenMemoryAreaByAddress(ULONG Address);
|
MEMORY_AREA* MmOpenMemoryAreaByAddress(PEPROCESS Process, PVOID Address);
|
||||||
NTSTATUS MmInitMemoryAreas(VOID);
|
NTSTATUS MmInitMemoryAreas(VOID);
|
||||||
VOID ExInitNonPagedPool(ULONG BaseAddress);
|
VOID ExInitNonPagedPool(ULONG BaseAddress);
|
||||||
NTSTATUS MmFreeMemoryArea(PVOID BaseAddress,
|
NTSTATUS MmFreeMemoryArea(PEPROCESS Process,
|
||||||
|
PVOID BaseAddress,
|
||||||
ULONG Length,
|
ULONG Length,
|
||||||
BOOLEAN FreePages);
|
BOOLEAN FreePages);
|
||||||
VOID MmDumpMemoryAreas(VOID);
|
VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead);
|
||||||
|
NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea);
|
||||||
|
NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea);
|
||||||
|
NTSTATUS MmInitSectionImplementation(VOID);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Gets a page with a restricted max physical address (i.e.
|
* FUNCTION: Gets a page with a restricted max physical address (i.e.
|
||||||
@@ -96,4 +106,13 @@ void mark_page_not_writable(unsigned int vaddr);
|
|||||||
|
|
||||||
void VirtualInit(boot_param* bp);
|
void VirtualInit(boot_param* bp);
|
||||||
|
|
||||||
|
#define MM_LOWEST_USER_ADDRESS (4096)
|
||||||
|
|
||||||
|
PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process,
|
||||||
|
PMEMORY_AREA OriginalMemoryArea,
|
||||||
|
PVOID BaseAddress,
|
||||||
|
ULONG Length,
|
||||||
|
ULONG NewType,
|
||||||
|
ULONG NewAttributes);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -44,6 +44,8 @@ enum
|
|||||||
OBJTYP_DEVICE,
|
OBJTYP_DEVICE,
|
||||||
OBJTYP_THREAD,
|
OBJTYP_THREAD,
|
||||||
OBJTYP_FILE,
|
OBJTYP_FILE,
|
||||||
|
OBJTYP_PROCESS,
|
||||||
|
OBJTYP_SECTION,
|
||||||
OBJTYP_MAX,
|
OBJTYP_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -51,27 +53,23 @@ BOOL ObAddObjectToNameSpace(PUNICODE_STRING path, POBJECT_HEADER Object);
|
|||||||
|
|
||||||
VOID ObRegisterType(CSHORT id, OBJECT_TYPE* type);
|
VOID ObRegisterType(CSHORT id, OBJECT_TYPE* type);
|
||||||
|
|
||||||
VOID ObInitializeObjectHeader(CSHORT id, PWSTR name,
|
VOID ObInitializeObjectHeader(POBJECT_TYPE Type, PWSTR name,
|
||||||
POBJECT_HEADER obj);
|
POBJECT_HEADER obj);
|
||||||
|
HANDLE ObInsertHandle(PKPROCESS Process, PVOID ObjectBody,
|
||||||
/*
|
ACCESS_MASK GrantedAccess, BOOLEAN Inherit);
|
||||||
* FUNCTION: Get the size of an object
|
|
||||||
* ARGUMENTS:
|
|
||||||
* Type = Object type
|
|
||||||
* RETURNS: The size in bytes
|
|
||||||
*/
|
|
||||||
ULONG ObSizeOf(CSHORT Type);
|
|
||||||
HANDLE ObAddHandle(PVOID obj);
|
|
||||||
VOID ObDeleteHandle(HANDLE Handle);
|
VOID ObDeleteHandle(HANDLE Handle);
|
||||||
NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
|
NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object,
|
||||||
PWSTR* UnparsedSection);
|
PWSTR* UnparsedSection);
|
||||||
PVOID ObGetObjectByHandle(HANDLE h);
|
|
||||||
PVOID ObGenericCreateObject(PHANDLE Handle,
|
PVOID ObGenericCreateObject(PHANDLE Handle,
|
||||||
ACCESS_MASK DesiredAccess,
|
ACCESS_MASK DesiredAccess,
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
CSHORT Type);
|
POBJECT_TYPE Type);
|
||||||
NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes,
|
NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
PVOID* Object, PWSTR* UnparsedSection);
|
PVOID* Object, PWSTR* UnparsedSection);
|
||||||
|
VOID ObInitializeHandleTable(PKPROCESS Parent, BOOLEAN Inherit,
|
||||||
|
PKPROCESS Process);
|
||||||
|
VOID ObRemoveEntry(POBJECT_HEADER Header);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Creates an entry within a directory
|
* FUNCTION: Creates an entry within a directory
|
||||||
@@ -92,6 +90,18 @@ extern inline PVOID HEADER_TO_BODY(POBJECT_HEADER obj)
|
|||||||
return(((void *)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER));
|
return(((void *)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OBJECT_ALLOC_SIZE(type) (ObSizeOf(type)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
|
#define OBJECT_ALLOC_SIZE(type) (type->NonpagedPoolCharge+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PURPOSE: Defines a handle
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
PVOID ObjectBody;
|
||||||
|
ACCESS_MASK GrantedAccess;
|
||||||
|
BOOLEAN Inherit;
|
||||||
|
} HANDLE_REP, *PHANDLE_REP;
|
||||||
|
|
||||||
|
PHANDLE_REP ObTranslateHandle(PKPROCESS Process, HANDLE h);
|
||||||
|
|
||||||
#endif /* __INCLUDE_INTERNAL_OBJMGR_H */
|
#endif /* __INCLUDE_INTERNAL_OBJMGR_H */
|
||||||
|
@@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: include/internal/objmgr.h
|
|
||||||
* PURPOSE: Object manager definitions
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __INCLUDE_INTERNAL_OBJMGR_H
|
|
||||||
#define __INCLUDE_INTERNAL_OBJMGR_H
|
|
||||||
|
|
||||||
#include <ddk/types.h>
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
CSHORT Type;
|
|
||||||
CSHORT Size;
|
|
||||||
} COMMON_BODY_HEADER, *PCOMMON_BODY_HEADER;
|
|
||||||
|
|
||||||
typedef struct _DIRECTORY_OBJECT
|
|
||||||
{
|
|
||||||
CSHORT Type;
|
|
||||||
CSHORT Size;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Head of the list of our subdirectories
|
|
||||||
*/
|
|
||||||
LIST_ENTRY head;
|
|
||||||
KSPIN_LOCK Lock;
|
|
||||||
} DIRECTORY_OBJECT, *PDIRECTORY_OBJECT;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Enumeration of object types
|
|
||||||
*/
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
OBJTYP_INVALID,
|
|
||||||
OBJTYP_TYPE,
|
|
||||||
OBJTYP_DIRECTORY,
|
|
||||||
OBJTYP_SYMLNK,
|
|
||||||
OBJTYP_DEVICE,
|
|
||||||
OBJTYP_THREAD,
|
|
||||||
OBJTYP_FILE,
|
|
||||||
OBJTYP_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
BOOL ObAddObjectToNameSpace(PUNICODE_STRING path, POBJECT_HEADER Object);
|
|
||||||
|
|
||||||
VOID ObRegisterType(CSHORT id, OBJECT_TYPE* type);
|
|
||||||
|
|
||||||
VOID ObInitializeObjectHeader(CSHORT id, PWSTR name,
|
|
||||||
POBJECT_HEADER obj);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FUNCTION: Get the size of an object
|
|
||||||
* ARGUMENTS:
|
|
||||||
* Type = Object type
|
|
||||||
* RETURNS: The size in bytes
|
|
||||||
*/
|
|
||||||
ULONG ObSizeOf(CSHORT Type);
|
|
||||||
HANDLE ObAddHandle(PVOID obj);
|
|
||||||
PVOID ObLookupObject(HANDLE rooth, PWSTR _string);
|
|
||||||
PVOID ObGetObjectByHandle(HANDLE h);
|
|
||||||
PVOID ObGenericCreateObject(PHANDLE Handle,
|
|
||||||
ACCESS_MASK DesiredAccess,
|
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
|
||||||
CSHORT Type);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FUNCTION: Creates an entry within a directory
|
|
||||||
* ARGUMENTS:
|
|
||||||
* parent = Parent directory
|
|
||||||
* object = Header of the object to add
|
|
||||||
*/
|
|
||||||
VOID ObCreateEntry(PDIRECTORY_OBJECT parent, POBJECT_HEADER object);
|
|
||||||
|
|
||||||
extern inline POBJECT_HEADER BODY_TO_HEADER(PVOID body)
|
|
||||||
{
|
|
||||||
PCOMMON_BODY_HEADER chdr = (PCOMMON_BODY_HEADER)body;
|
|
||||||
return(CONTAINING_RECORD((&(chdr->Type)),OBJECT_HEADER,Type));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern inline PVOID HEADER_TO_BODY(POBJECT_HEADER obj)
|
|
||||||
{
|
|
||||||
return(((void *)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER));
|
|
||||||
}
|
|
||||||
|
|
||||||
#define OBJECT_ALLOC_SIZE(type) (ObSizeOf(type)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER))
|
|
||||||
|
|
||||||
#endif /* __INCLUDE_INTERNAL_OBJMGR_H */
|
|
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include <internal/linkage.h>
|
#include <internal/linkage.h>
|
||||||
|
|
||||||
static PVOID ExAllocatePagedPool(POOL_TYPE Type, ULONG size);
|
PVOID ExAllocatePagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag);
|
||||||
static PVOID ExAllocateNonPagedPool(POOL_TYPE Type, ULONG size);
|
PVOID ExAllocateNonPagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag);
|
||||||
|
|
||||||
#endif /* __INTERNAL_POOL_H */
|
#endif /* __INTERNAL_POOL_H */
|
||||||
|
@@ -3,12 +3,16 @@
|
|||||||
|
|
||||||
#include <internal/hal.h>
|
#include <internal/hal.h>
|
||||||
|
|
||||||
extern EPROCESS SystemProcess;
|
extern PEPROCESS SystemProcess;
|
||||||
extern HANDLE SystemProcessHandle;
|
extern HANDLE SystemProcessHandle;
|
||||||
|
|
||||||
|
extern POBJECT_TYPE PsThreadType;
|
||||||
|
extern POBJECT_TYPE PsProcessType;
|
||||||
|
|
||||||
void PsInitThreadManagment(void);
|
void PsInitThreadManagment(void);
|
||||||
VOID PsInitProcessManagment(VOID);
|
VOID PsInitProcessManagment(VOID);
|
||||||
VOID PsInitIdleThread(VOID);
|
VOID PsInitIdleThread(VOID);
|
||||||
|
VOID PsDispatchThread(VOID);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PURPOSE: Thread states
|
* PURPOSE: Thread states
|
||||||
@@ -45,9 +49,9 @@ enum
|
|||||||
* Functions the HAL must provide
|
* Functions the HAL must provide
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void HalInitFirstTask(PKTHREAD thread);
|
void HalInitFirstTask(PETHREAD thread);
|
||||||
BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext);
|
||||||
PVOID StartContext);
|
|
||||||
void HalTaskSwitch(PKTHREAD thread);
|
void HalTaskSwitch(PKTHREAD thread);
|
||||||
|
NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,52 +0,0 @@
|
|||||||
#ifndef __INCLUDE_INTERNAL_PSMGR_H
|
|
||||||
#define __INCLUDE_INTERNAL_PSMGR_H
|
|
||||||
|
|
||||||
#include <internal/hal.h>
|
|
||||||
|
|
||||||
extern EPROCESS SystemProcess;
|
|
||||||
extern HANDLE SystemProcessHandle;
|
|
||||||
|
|
||||||
void PsInitThreadManagment(void);
|
|
||||||
VOID PsInitIdleThread(VOID);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Thread states
|
|
||||||
*/
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* PURPOSE: Don't touch
|
|
||||||
*/
|
|
||||||
THREAD_STATE_INVALID,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Waiting to be dispatched
|
|
||||||
*/
|
|
||||||
THREAD_STATE_RUNNABLE,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Currently running
|
|
||||||
*/
|
|
||||||
THREAD_STATE_RUNNING,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PURPOSE: Doesn't want to run
|
|
||||||
*/
|
|
||||||
THREAD_STATE_SUSPENDED,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Waiting to be freed
|
|
||||||
*/
|
|
||||||
THREAD_STATE_TERMINATED,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Functions the HAL must provide
|
|
||||||
*/
|
|
||||||
|
|
||||||
void HalInitFirstTask(PKTHREAD thread);
|
|
||||||
BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
|
||||||
PVOID StartContext);
|
|
||||||
void HalTaskSwitch(PKTHREAD thread);
|
|
||||||
|
|
||||||
#endif
|
|
@@ -9,9 +9,9 @@
|
|||||||
#ifndef __VERSION_H
|
#ifndef __VERSION_H
|
||||||
#define __VERSION_H
|
#define __VERSION_H
|
||||||
|
|
||||||
#define KERNEL_VERSION "0.0.11"
|
#define KERNEL_VERSION "0.0.12"
|
||||||
#define KERNEL_MAJOR_VERSION 0
|
#define KERNEL_MAJOR_VERSION 0
|
||||||
#define KERNEL_MINOR_VERSION 0
|
#define KERNEL_MINOR_VERSION 0
|
||||||
#define KERNEL_PATCH_LEVEL 11
|
#define KERNEL_PATCH_LEVEL 12
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
extern KSPIN_LOCK DispatcherDatabaseLock;
|
|
||||||
extern BOOLEAN WaitSet;
|
|
@@ -105,6 +105,4 @@ typedef struct __HEAP
|
|||||||
HEAP_BLOCK Start __attribute__((aligned (8)));
|
HEAP_BLOCK Start __attribute__((aligned (8)));
|
||||||
} HEAP, *PHEAP;
|
} HEAP, *PHEAP;
|
||||||
|
|
||||||
//PHEAP __ProcessHeap;
|
|
||||||
|
|
||||||
#endif /* __INCLUDE_KERNEL32_HEAP_H */
|
#endif /* __INCLUDE_KERNEL32_HEAP_H */
|
||||||
|
@@ -32,10 +32,338 @@
|
|||||||
#ifndef _GNU_H_WINDOWS32_STRUCTURES
|
#ifndef _GNU_H_WINDOWS32_STRUCTURES
|
||||||
#define _GNU_H_WINDOWS32_STRUCTURES
|
#define _GNU_H_WINDOWS32_STRUCTURES
|
||||||
|
|
||||||
|
typedef struct _LARGE_INTEGER {
|
||||||
|
DWORD LowPart;
|
||||||
|
LONG HighPart;
|
||||||
|
} LARGE_INTEGER, *PLARGE_INTEGER;
|
||||||
|
|
||||||
|
typedef struct _LIST_ENTRY {
|
||||||
|
struct _LIST_ENTRY *Flink;
|
||||||
|
struct _LIST_ENTRY *Blink;
|
||||||
|
} LIST_ENTRY, *PLIST_ENTRY;
|
||||||
|
|
||||||
|
typedef DWORD ACCESS_MASK;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _SID_IDENTIFIER_AUTHORITY {
|
||||||
|
BYTE Value[6];
|
||||||
|
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY,
|
||||||
|
*LPSID_IDENTIFIER_AUTHORITY;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _ACL {
|
||||||
|
BYTE AclRevision;
|
||||||
|
BYTE Sbz1;
|
||||||
|
WORD AclSize;
|
||||||
|
WORD AceCount;
|
||||||
|
WORD Sbz2;
|
||||||
|
} ACL, *PACL;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _SID {
|
||||||
|
BYTE Revision;
|
||||||
|
BYTE SubAuthorityCount;
|
||||||
|
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
||||||
|
DWORD SubAuthority[ANYSIZE_ARRAY];
|
||||||
|
} SID, *PSID;
|
||||||
|
|
||||||
|
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
|
||||||
|
|
||||||
|
typedef struct _SECURITY_DESCRIPTOR {
|
||||||
|
BYTE Revision;
|
||||||
|
BYTE Sbz1;
|
||||||
|
SECURITY_DESCRIPTOR_CONTROL Control;
|
||||||
|
PSID Owner;
|
||||||
|
PSID Group;
|
||||||
|
PACL Sacl;
|
||||||
|
PACL Dacl;
|
||||||
|
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
|
||||||
|
|
||||||
|
typedef struct _SECURITY_QUALITY_OF_SERVICE {
|
||||||
|
DWORD Length;
|
||||||
|
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
|
||||||
|
/* SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; */
|
||||||
|
WINBOOL ContextTrackingMode;
|
||||||
|
BOOLEAN EffectiveOnly;
|
||||||
|
} SECURITY_QUALITY_OF_SERVICE;
|
||||||
|
|
||||||
|
typedef LARGE_INTEGER LUID, *PLUID;
|
||||||
|
|
||||||
|
typedef struct _TOKEN_SOURCE {
|
||||||
|
CHAR SourceName[8];
|
||||||
|
LUID SourceIdentifier;
|
||||||
|
} TOKEN_SOURCE;
|
||||||
|
|
||||||
|
typedef struct _PARTITION_INFORMATION {
|
||||||
|
BYTE PartitionType;
|
||||||
|
BOOLEAN BootIndicator;
|
||||||
|
BOOLEAN RecognizedPartition;
|
||||||
|
BOOLEAN RewritePartition;
|
||||||
|
LARGE_INTEGER StartingOffset;
|
||||||
|
LARGE_INTEGER PartitionLength;
|
||||||
|
LARGE_INTEGER HiddenSectors;
|
||||||
|
} PARTITION_INFORMATION ;
|
||||||
|
|
||||||
|
typedef struct _SINGLE_LIST_ENTRY {
|
||||||
|
struct _SINGLE_LIST_ENTRY *Next;
|
||||||
|
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _CRITICAL_SECTION_DEBUG {
|
||||||
|
WORD Type;
|
||||||
|
WORD CreatorBackTraceIndex;
|
||||||
|
struct _CRITICAL_SECTION *CriticalSection;
|
||||||
|
LIST_ENTRY ProcessLocksList;
|
||||||
|
DWORD EntryCount;
|
||||||
|
DWORD ContentionCount;
|
||||||
|
DWORD Depth;
|
||||||
|
PVOID OwnerBackTrace[ 5 ];
|
||||||
|
} CRITICAL_SECTION_DEBUG, *PCRITICAL_SECTION_DEBUG;
|
||||||
|
|
||||||
|
typedef struct _CRITICAL_SECTION {
|
||||||
|
PCRITICAL_SECTION_DEBUG DebugInfo;
|
||||||
|
LONG LockCount;
|
||||||
|
LONG RecursionCount;
|
||||||
|
HANDLE OwningThread;
|
||||||
|
HANDLE LockSemaphore;
|
||||||
|
DWORD Reserved;
|
||||||
|
} CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION;
|
||||||
|
|
||||||
|
typedef struct _ULARGE_INTEGER {
|
||||||
|
DWORD LowPart;
|
||||||
|
DWORD HighPart;
|
||||||
|
} ULARGE_INTEGER, *PULARGE_INTEGER;
|
||||||
|
|
||||||
|
typedef struct _GENERIC_MAPPING {
|
||||||
|
ACCESS_MASK GenericRead;
|
||||||
|
ACCESS_MASK GenericWrite;
|
||||||
|
ACCESS_MASK GenericExecute;
|
||||||
|
ACCESS_MASK GenericAll;
|
||||||
|
} GENERIC_MAPPING, *PGENERIC_MAPPING;
|
||||||
|
|
||||||
|
typedef struct _LUID_AND_ATTRIBUTES {
|
||||||
|
LUID Luid;
|
||||||
|
DWORD Attributes;
|
||||||
|
} LUID_AND_ATTRIBUTES;
|
||||||
|
|
||||||
|
typedef struct _PRIVILEGE_SET {
|
||||||
|
DWORD PrivilegeCount;
|
||||||
|
DWORD Control;
|
||||||
|
LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
|
||||||
|
} PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET;
|
||||||
|
|
||||||
|
#ifdef __i386__
|
||||||
|
|
||||||
|
typedef struct _FLOATING_SAVE_AREA {
|
||||||
|
DWORD ControlWord;
|
||||||
|
DWORD StatusWord;
|
||||||
|
DWORD TagWord;
|
||||||
|
DWORD ErrorOffset;
|
||||||
|
DWORD ErrorSelector;
|
||||||
|
DWORD DataOffset;
|
||||||
|
DWORD DataSelector;
|
||||||
|
BYTE RegisterArea[80];
|
||||||
|
DWORD Cr0NpxState;
|
||||||
|
} FLOATING_SAVE_AREA;
|
||||||
|
|
||||||
|
typedef struct _CONTEXT {
|
||||||
|
DWORD ContextFlags;
|
||||||
|
|
||||||
|
DWORD Dr0;
|
||||||
|
DWORD Dr1;
|
||||||
|
DWORD Dr2;
|
||||||
|
DWORD Dr3;
|
||||||
|
DWORD Dr6;
|
||||||
|
DWORD Dr7;
|
||||||
|
|
||||||
|
FLOATING_SAVE_AREA FloatSave;
|
||||||
|
|
||||||
|
DWORD SegGs;
|
||||||
|
DWORD SegFs;
|
||||||
|
DWORD SegEs;
|
||||||
|
DWORD SegDs;
|
||||||
|
|
||||||
|
DWORD Edi;
|
||||||
|
DWORD Esi;
|
||||||
|
DWORD Ebx;
|
||||||
|
DWORD Edx;
|
||||||
|
DWORD Ecx;
|
||||||
|
DWORD Eax;
|
||||||
|
|
||||||
|
DWORD Ebp;
|
||||||
|
DWORD Eip;
|
||||||
|
DWORD SegCs;
|
||||||
|
DWORD EFlags;
|
||||||
|
DWORD Esp;
|
||||||
|
DWORD SegSs;
|
||||||
|
} CONTEXT, *PCONTEXT, *LPCONTEXT;
|
||||||
|
|
||||||
|
#else /* __ppc__ */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/* Floating point registers returned when CONTEXT_FLOATING_POINT is set */
|
||||||
|
double Fpr0;
|
||||||
|
double Fpr1;
|
||||||
|
double Fpr2;
|
||||||
|
double Fpr3;
|
||||||
|
double Fpr4;
|
||||||
|
double Fpr5;
|
||||||
|
double Fpr6;
|
||||||
|
double Fpr7;
|
||||||
|
double Fpr8;
|
||||||
|
double Fpr9;
|
||||||
|
double Fpr10;
|
||||||
|
double Fpr11;
|
||||||
|
double Fpr12;
|
||||||
|
double Fpr13;
|
||||||
|
double Fpr14;
|
||||||
|
double Fpr15;
|
||||||
|
double Fpr16;
|
||||||
|
double Fpr17;
|
||||||
|
double Fpr18;
|
||||||
|
double Fpr19;
|
||||||
|
double Fpr20;
|
||||||
|
double Fpr21;
|
||||||
|
double Fpr22;
|
||||||
|
double Fpr23;
|
||||||
|
double Fpr24;
|
||||||
|
double Fpr25;
|
||||||
|
double Fpr26;
|
||||||
|
double Fpr27;
|
||||||
|
double Fpr28;
|
||||||
|
double Fpr29;
|
||||||
|
double Fpr30;
|
||||||
|
double Fpr31;
|
||||||
|
double Fpscr;
|
||||||
|
|
||||||
|
/* Integer registers returned when CONTEXT_INTEGER is set. */
|
||||||
|
DWORD Gpr0;
|
||||||
|
DWORD Gpr1;
|
||||||
|
DWORD Gpr2;
|
||||||
|
DWORD Gpr3;
|
||||||
|
DWORD Gpr4;
|
||||||
|
DWORD Gpr5;
|
||||||
|
DWORD Gpr6;
|
||||||
|
DWORD Gpr7;
|
||||||
|
DWORD Gpr8;
|
||||||
|
DWORD Gpr9;
|
||||||
|
DWORD Gpr10;
|
||||||
|
DWORD Gpr11;
|
||||||
|
DWORD Gpr12;
|
||||||
|
DWORD Gpr13;
|
||||||
|
DWORD Gpr14;
|
||||||
|
DWORD Gpr15;
|
||||||
|
DWORD Gpr16;
|
||||||
|
DWORD Gpr17;
|
||||||
|
DWORD Gpr18;
|
||||||
|
DWORD Gpr19;
|
||||||
|
DWORD Gpr20;
|
||||||
|
DWORD Gpr21;
|
||||||
|
DWORD Gpr22;
|
||||||
|
DWORD Gpr23;
|
||||||
|
DWORD Gpr24;
|
||||||
|
DWORD Gpr25;
|
||||||
|
DWORD Gpr26;
|
||||||
|
DWORD Gpr27;
|
||||||
|
DWORD Gpr28;
|
||||||
|
DWORD Gpr29;
|
||||||
|
DWORD Gpr30;
|
||||||
|
DWORD Gpr31;
|
||||||
|
|
||||||
|
DWORD Cr; /* Condition register */
|
||||||
|
DWORD Xer; /* Fixed point exception register */
|
||||||
|
|
||||||
|
/* The following are set when CONTEXT_CONTROL is set. */
|
||||||
|
DWORD Msr; /* Machine status register */
|
||||||
|
DWORD Iar; /* Instruction address register */
|
||||||
|
DWORD Lr; /* Link register */
|
||||||
|
DWORD Ctr; /* Control register */
|
||||||
|
|
||||||
|
/* Control which context values are returned */
|
||||||
|
DWORD ContextFlags;
|
||||||
|
DWORD Fill[3];
|
||||||
|
|
||||||
|
/* Registers returned if CONTEXT_DEBUG_REGISTERS is set. */
|
||||||
|
DWORD Dr0; /* Breakpoint Register 1 */
|
||||||
|
DWORD Dr1; /* Breakpoint Register 2 */
|
||||||
|
DWORD Dr2; /* Breakpoint Register 3 */
|
||||||
|
DWORD Dr3; /* Breakpoint Register 4 */
|
||||||
|
DWORD Dr4; /* Breakpoint Register 5 */
|
||||||
|
DWORD Dr5; /* Breakpoint Register 6 */
|
||||||
|
DWORD Dr6; /* Debug Status Register */
|
||||||
|
DWORD Dr7; /* Debug Control Register */
|
||||||
|
} CONTEXT, *PCONTEXT, *LPCONTEXT;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct value_ent {
|
||||||
|
LPTSTR ve_valuename;
|
||||||
|
DWORD ve_valuelen;
|
||||||
|
DWORD ve_valueptr;
|
||||||
|
DWORD ve_type;
|
||||||
|
} VALENT, *PVALENT;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _EXCEPTION_RECORD {
|
||||||
|
DWORD ExceptionCode;
|
||||||
|
DWORD ExceptionFlags;
|
||||||
|
struct _EXCEPTION_RECORD *ExceptionRecord;
|
||||||
|
PVOID ExceptionAddress;
|
||||||
|
DWORD NumberParameters;
|
||||||
|
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
|
||||||
|
} EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD;
|
||||||
|
|
||||||
|
typedef struct _DRIVE_LAYOUT_INFORMATION {
|
||||||
|
DWORD PartitionCount;
|
||||||
|
DWORD Signature;
|
||||||
|
PARTITION_INFORMATION PartitionEntry[1];
|
||||||
|
} DRIVE_LAYOUT_INFORMATION;
|
||||||
|
|
||||||
|
typedef struct _KEY_EVENT_RECORD {
|
||||||
|
WINBOOL bKeyDown;
|
||||||
|
WORD wRepeatCount;
|
||||||
|
WORD wVirtualKeyCode;
|
||||||
|
WORD wVirtualScanCode;
|
||||||
|
|
||||||
|
char AsciiChar;
|
||||||
|
char pad;
|
||||||
|
#if 0
|
||||||
|
union {
|
||||||
|
WCHAR UnicodeChar;
|
||||||
|
CHAR AsciiChar;
|
||||||
|
} uChar;
|
||||||
|
#endif
|
||||||
|
DWORD dwControlKeyState;
|
||||||
|
} KEY_EVENT_RECORD PACKED;
|
||||||
|
|
||||||
|
typedef struct _COORD {
|
||||||
|
SHORT X;
|
||||||
|
SHORT Y;
|
||||||
|
} COORD;
|
||||||
|
|
||||||
|
typedef struct _MOUSE_EVENT_RECORD {
|
||||||
|
COORD dwMousePosition;
|
||||||
|
DWORD dwButtonState;
|
||||||
|
DWORD dwControlKeyState;
|
||||||
|
DWORD dwEventFlags;
|
||||||
|
} MOUSE_EVENT_RECORD;
|
||||||
|
|
||||||
|
typedef struct _DISK_GEOMETRY {
|
||||||
|
LARGE_INTEGER Cylinders;
|
||||||
|
MEDIA_TYPE MediaType;
|
||||||
|
DWORD TracksPerCylinder;
|
||||||
|
DWORD SectorsPerTrack;
|
||||||
|
DWORD BytesPerSector;
|
||||||
|
} DISK_GEOMETRY ;
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
typedef struct _ABC {
|
typedef struct _ABC {
|
||||||
int abcA;
|
int abcA;
|
||||||
UINT abcB;
|
UINT abcB;
|
||||||
@@ -60,7 +388,6 @@ typedef struct _ACE_HEADER {
|
|||||||
WORD AceSize;
|
WORD AceSize;
|
||||||
} ACE_HEADER;
|
} ACE_HEADER;
|
||||||
|
|
||||||
typedef DWORD ACCESS_MASK;
|
|
||||||
typedef ACCESS_MASK REGSAM;
|
typedef ACCESS_MASK REGSAM;
|
||||||
|
|
||||||
typedef struct _ACCESS_ALLOWED_ACE {
|
typedef struct _ACCESS_ALLOWED_ACE {
|
||||||
@@ -81,14 +408,6 @@ typedef struct tagACCESSTIMEOUT {
|
|||||||
DWORD iTimeOutMSec;
|
DWORD iTimeOutMSec;
|
||||||
} ACCESSTIMEOUT;
|
} ACCESSTIMEOUT;
|
||||||
|
|
||||||
typedef struct _ACL {
|
|
||||||
BYTE AclRevision;
|
|
||||||
BYTE Sbz1;
|
|
||||||
WORD AclSize;
|
|
||||||
WORD AceCount;
|
|
||||||
WORD Sbz2;
|
|
||||||
} ACL, *PACL;
|
|
||||||
|
|
||||||
typedef struct _ACL_REVISION_INFORMATION {
|
typedef struct _ACL_REVISION_INFORMATION {
|
||||||
DWORD AclRevision;
|
DWORD AclRevision;
|
||||||
} ACL_REVISION_INFORMATION;
|
} ACL_REVISION_INFORMATION;
|
||||||
@@ -629,11 +948,6 @@ typedef struct _CONSOLE_CURSOR_INFO {
|
|||||||
WINBOOL bVisible;
|
WINBOOL bVisible;
|
||||||
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
|
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
|
||||||
|
|
||||||
typedef struct _COORD {
|
|
||||||
SHORT X;
|
|
||||||
SHORT Y;
|
|
||||||
} COORD;
|
|
||||||
|
|
||||||
typedef struct _SMALL_RECT {
|
typedef struct _SMALL_RECT {
|
||||||
SHORT Left;
|
SHORT Left;
|
||||||
SHORT Top;
|
SHORT Top;
|
||||||
@@ -649,183 +963,6 @@ typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
|
|||||||
COORD dwMaximumWindowSize;
|
COORD dwMaximumWindowSize;
|
||||||
} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO ;
|
} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO ;
|
||||||
|
|
||||||
#ifdef __i386__
|
|
||||||
|
|
||||||
typedef struct _FLOATING_SAVE_AREA {
|
|
||||||
DWORD ControlWord;
|
|
||||||
DWORD StatusWord;
|
|
||||||
DWORD TagWord;
|
|
||||||
DWORD ErrorOffset;
|
|
||||||
DWORD ErrorSelector;
|
|
||||||
DWORD DataOffset;
|
|
||||||
DWORD DataSelector;
|
|
||||||
BYTE RegisterArea[80];
|
|
||||||
DWORD Cr0NpxState;
|
|
||||||
} FLOATING_SAVE_AREA;
|
|
||||||
|
|
||||||
typedef struct _CONTEXT {
|
|
||||||
DWORD ContextFlags;
|
|
||||||
|
|
||||||
DWORD Dr0;
|
|
||||||
DWORD Dr1;
|
|
||||||
DWORD Dr2;
|
|
||||||
DWORD Dr3;
|
|
||||||
DWORD Dr6;
|
|
||||||
DWORD Dr7;
|
|
||||||
|
|
||||||
FLOATING_SAVE_AREA FloatSave;
|
|
||||||
|
|
||||||
DWORD SegGs;
|
|
||||||
DWORD SegFs;
|
|
||||||
DWORD SegEs;
|
|
||||||
DWORD SegDs;
|
|
||||||
|
|
||||||
DWORD Edi;
|
|
||||||
DWORD Esi;
|
|
||||||
DWORD Ebx;
|
|
||||||
DWORD Edx;
|
|
||||||
DWORD Ecx;
|
|
||||||
DWORD Eax;
|
|
||||||
|
|
||||||
DWORD Ebp;
|
|
||||||
DWORD Eip;
|
|
||||||
DWORD SegCs;
|
|
||||||
DWORD EFlags;
|
|
||||||
DWORD Esp;
|
|
||||||
DWORD SegSs;
|
|
||||||
} CONTEXT, *PCONTEXT, *LPCONTEXT;
|
|
||||||
|
|
||||||
#else /* __ppc__ */
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
/* Floating point registers returned when CONTEXT_FLOATING_POINT is set */
|
|
||||||
double Fpr0;
|
|
||||||
double Fpr1;
|
|
||||||
double Fpr2;
|
|
||||||
double Fpr3;
|
|
||||||
double Fpr4;
|
|
||||||
double Fpr5;
|
|
||||||
double Fpr6;
|
|
||||||
double Fpr7;
|
|
||||||
double Fpr8;
|
|
||||||
double Fpr9;
|
|
||||||
double Fpr10;
|
|
||||||
double Fpr11;
|
|
||||||
double Fpr12;
|
|
||||||
double Fpr13;
|
|
||||||
double Fpr14;
|
|
||||||
double Fpr15;
|
|
||||||
double Fpr16;
|
|
||||||
double Fpr17;
|
|
||||||
double Fpr18;
|
|
||||||
double Fpr19;
|
|
||||||
double Fpr20;
|
|
||||||
double Fpr21;
|
|
||||||
double Fpr22;
|
|
||||||
double Fpr23;
|
|
||||||
double Fpr24;
|
|
||||||
double Fpr25;
|
|
||||||
double Fpr26;
|
|
||||||
double Fpr27;
|
|
||||||
double Fpr28;
|
|
||||||
double Fpr29;
|
|
||||||
double Fpr30;
|
|
||||||
double Fpr31;
|
|
||||||
double Fpscr;
|
|
||||||
|
|
||||||
/* Integer registers returned when CONTEXT_INTEGER is set. */
|
|
||||||
DWORD Gpr0;
|
|
||||||
DWORD Gpr1;
|
|
||||||
DWORD Gpr2;
|
|
||||||
DWORD Gpr3;
|
|
||||||
DWORD Gpr4;
|
|
||||||
DWORD Gpr5;
|
|
||||||
DWORD Gpr6;
|
|
||||||
DWORD Gpr7;
|
|
||||||
DWORD Gpr8;
|
|
||||||
DWORD Gpr9;
|
|
||||||
DWORD Gpr10;
|
|
||||||
DWORD Gpr11;
|
|
||||||
DWORD Gpr12;
|
|
||||||
DWORD Gpr13;
|
|
||||||
DWORD Gpr14;
|
|
||||||
DWORD Gpr15;
|
|
||||||
DWORD Gpr16;
|
|
||||||
DWORD Gpr17;
|
|
||||||
DWORD Gpr18;
|
|
||||||
DWORD Gpr19;
|
|
||||||
DWORD Gpr20;
|
|
||||||
DWORD Gpr21;
|
|
||||||
DWORD Gpr22;
|
|
||||||
DWORD Gpr23;
|
|
||||||
DWORD Gpr24;
|
|
||||||
DWORD Gpr25;
|
|
||||||
DWORD Gpr26;
|
|
||||||
DWORD Gpr27;
|
|
||||||
DWORD Gpr28;
|
|
||||||
DWORD Gpr29;
|
|
||||||
DWORD Gpr30;
|
|
||||||
DWORD Gpr31;
|
|
||||||
|
|
||||||
DWORD Cr; /* Condition register */
|
|
||||||
DWORD Xer; /* Fixed point exception register */
|
|
||||||
|
|
||||||
/* The following are set when CONTEXT_CONTROL is set. */
|
|
||||||
DWORD Msr; /* Machine status register */
|
|
||||||
DWORD Iar; /* Instruction address register */
|
|
||||||
DWORD Lr; /* Link register */
|
|
||||||
DWORD Ctr; /* Control register */
|
|
||||||
|
|
||||||
/* Control which context values are returned */
|
|
||||||
DWORD ContextFlags;
|
|
||||||
DWORD Fill[3];
|
|
||||||
|
|
||||||
/* Registers returned if CONTEXT_DEBUG_REGISTERS is set. */
|
|
||||||
DWORD Dr0; /* Breakpoint Register 1 */
|
|
||||||
DWORD Dr1; /* Breakpoint Register 2 */
|
|
||||||
DWORD Dr2; /* Breakpoint Register 3 */
|
|
||||||
DWORD Dr3; /* Breakpoint Register 4 */
|
|
||||||
DWORD Dr4; /* Breakpoint Register 5 */
|
|
||||||
DWORD Dr5; /* Breakpoint Register 6 */
|
|
||||||
DWORD Dr6; /* Debug Status Register */
|
|
||||||
DWORD Dr7; /* Debug Control Register */
|
|
||||||
} CONTEXT, *PCONTEXT, *LPCONTEXT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct _LIST_ENTRY {
|
|
||||||
struct _LIST_ENTRY *Flink;
|
|
||||||
struct _LIST_ENTRY *Blink;
|
|
||||||
} LIST_ENTRY, *PLIST_ENTRY;
|
|
||||||
|
|
||||||
typedef struct _CRITICAL_SECTION_DEBUG {
|
|
||||||
WORD Type;
|
|
||||||
WORD CreatorBackTraceIndex;
|
|
||||||
struct _CRITICAL_SECTION *CriticalSection;
|
|
||||||
LIST_ENTRY ProcessLocksList;
|
|
||||||
DWORD EntryCount;
|
|
||||||
DWORD ContentionCount;
|
|
||||||
DWORD Depth;
|
|
||||||
PVOID OwnerBackTrace[ 5 ];
|
|
||||||
} CRITICAL_SECTION_DEBUG, *PCRITICAL_SECTION_DEBUG;
|
|
||||||
|
|
||||||
typedef struct _CRITICAL_SECTION {
|
|
||||||
PCRITICAL_SECTION_DEBUG DebugInfo;
|
|
||||||
LONG LockCount;
|
|
||||||
LONG RecursionCount;
|
|
||||||
HANDLE OwningThread;
|
|
||||||
HANDLE LockSemaphore;
|
|
||||||
DWORD Reserved;
|
|
||||||
} CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION;
|
|
||||||
|
|
||||||
typedef struct _SECURITY_QUALITY_OF_SERVICE {
|
|
||||||
DWORD Length;
|
|
||||||
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
|
|
||||||
/* SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; */
|
|
||||||
WINBOOL ContextTrackingMode;
|
|
||||||
BOOLEAN EffectiveOnly;
|
|
||||||
} SECURITY_QUALITY_OF_SERVICE;
|
|
||||||
|
|
||||||
typedef struct tagCONVCONTEXT {
|
typedef struct tagCONVCONTEXT {
|
||||||
UINT cb;
|
UINT cb;
|
||||||
UINT wFlags;
|
UINT wFlags;
|
||||||
@@ -1009,15 +1146,6 @@ typedef struct {
|
|||||||
BYTE rgb[1];
|
BYTE rgb[1];
|
||||||
} DDEUP;
|
} DDEUP;
|
||||||
|
|
||||||
typedef struct _EXCEPTION_RECORD {
|
|
||||||
DWORD ExceptionCode;
|
|
||||||
DWORD ExceptionFlags;
|
|
||||||
struct _EXCEPTION_RECORD *ExceptionRecord;
|
|
||||||
PVOID ExceptionAddress;
|
|
||||||
DWORD NumberParameters;
|
|
||||||
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
|
|
||||||
} EXCEPTION_RECORD, *PEXCEPTION_RECORD, *LPEXCEPTION_RECORD;
|
|
||||||
|
|
||||||
typedef struct _EXCEPTION_DEBUG_INFO {
|
typedef struct _EXCEPTION_DEBUG_INFO {
|
||||||
EXCEPTION_RECORD ExceptionRecord;
|
EXCEPTION_RECORD ExceptionRecord;
|
||||||
DWORD dwFirstChance;
|
DWORD dwFirstChance;
|
||||||
@@ -1176,20 +1304,7 @@ typedef struct tagDIBSECTION {
|
|||||||
HANDLE dshSection;
|
HANDLE dshSection;
|
||||||
DWORD dsOffset;
|
DWORD dsOffset;
|
||||||
} DIBSECTION;
|
} DIBSECTION;
|
||||||
|
|
||||||
typedef struct _LARGE_INTEGER {
|
|
||||||
DWORD LowPart;
|
|
||||||
LONG HighPart;
|
|
||||||
} LARGE_INTEGER, *PLARGE_INTEGER;
|
|
||||||
|
|
||||||
typedef struct _DISK_GEOMETRY {
|
|
||||||
LARGE_INTEGER Cylinders;
|
|
||||||
MEDIA_TYPE MediaType;
|
|
||||||
DWORD TracksPerCylinder;
|
|
||||||
DWORD SectorsPerTrack;
|
|
||||||
DWORD BytesPerSector;
|
|
||||||
} DISK_GEOMETRY ;
|
|
||||||
|
|
||||||
typedef struct _DISK_PERFORMANCE {
|
typedef struct _DISK_PERFORMANCE {
|
||||||
LARGE_INTEGER BytesRead;
|
LARGE_INTEGER BytesRead;
|
||||||
LARGE_INTEGER BytesWritten;
|
LARGE_INTEGER BytesWritten;
|
||||||
@@ -1274,21 +1389,7 @@ typedef struct {
|
|||||||
UINT uiLengthDrawn;
|
UINT uiLengthDrawn;
|
||||||
} DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS;
|
} DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS;
|
||||||
|
|
||||||
typedef struct _PARTITION_INFORMATION {
|
|
||||||
BYTE PartitionType;
|
|
||||||
BOOLEAN BootIndicator;
|
|
||||||
BOOLEAN RecognizedPartition;
|
|
||||||
BOOLEAN RewritePartition;
|
|
||||||
LARGE_INTEGER StartingOffset;
|
|
||||||
LARGE_INTEGER PartitionLength;
|
|
||||||
LARGE_INTEGER HiddenSectors;
|
|
||||||
} PARTITION_INFORMATION ;
|
|
||||||
|
|
||||||
typedef struct _DRIVE_LAYOUT_INFORMATION {
|
|
||||||
DWORD PartitionCount;
|
|
||||||
DWORD Signature;
|
|
||||||
PARTITION_INFORMATION PartitionEntry[1];
|
|
||||||
} DRIVE_LAYOUT_INFORMATION;
|
|
||||||
|
|
||||||
typedef struct _DRIVER_INFO_1 {
|
typedef struct _DRIVER_INFO_1 {
|
||||||
LPTSTR pName;
|
LPTSTR pName;
|
||||||
@@ -2255,12 +2356,6 @@ typedef struct tagGCP_RESULTS {
|
|||||||
UINT nMaxFit;
|
UINT nMaxFit;
|
||||||
} GCP_RESULTS, *LPGCP_RESULTS;
|
} GCP_RESULTS, *LPGCP_RESULTS;
|
||||||
|
|
||||||
typedef struct _GENERIC_MAPPING {
|
|
||||||
ACCESS_MASK GenericRead;
|
|
||||||
ACCESS_MASK GenericWrite;
|
|
||||||
ACCESS_MASK GenericExecute;
|
|
||||||
ACCESS_MASK GenericAll;
|
|
||||||
} GENERIC_MAPPING, *PGENERIC_MAPPING;
|
|
||||||
|
|
||||||
typedef struct _GLYPHMETRICS {
|
typedef struct _GLYPHMETRICS {
|
||||||
UINT gmBlackBoxX;
|
UINT gmBlackBoxX;
|
||||||
@@ -2366,30 +2461,6 @@ typedef struct _IMAGEINFO {
|
|||||||
RECT rcImage;
|
RECT rcImage;
|
||||||
} IMAGEINFO;
|
} IMAGEINFO;
|
||||||
|
|
||||||
typedef struct _KEY_EVENT_RECORD {
|
|
||||||
WINBOOL bKeyDown;
|
|
||||||
WORD wRepeatCount;
|
|
||||||
WORD wVirtualKeyCode;
|
|
||||||
WORD wVirtualScanCode;
|
|
||||||
|
|
||||||
char AsciiChar;
|
|
||||||
char pad;
|
|
||||||
#if 0
|
|
||||||
union {
|
|
||||||
WCHAR UnicodeChar;
|
|
||||||
CHAR AsciiChar;
|
|
||||||
} uChar;
|
|
||||||
#endif
|
|
||||||
DWORD dwControlKeyState;
|
|
||||||
} KEY_EVENT_RECORD PACKED;
|
|
||||||
|
|
||||||
typedef struct _MOUSE_EVENT_RECORD {
|
|
||||||
COORD dwMousePosition;
|
|
||||||
DWORD dwButtonState;
|
|
||||||
DWORD dwControlKeyState;
|
|
||||||
DWORD dwEventFlags;
|
|
||||||
} MOUSE_EVENT_RECORD;
|
|
||||||
|
|
||||||
typedef struct _WINDOW_BUFFER_SIZE_RECORD {
|
typedef struct _WINDOW_BUFFER_SIZE_RECORD {
|
||||||
COORD dwSize;
|
COORD dwSize;
|
||||||
} WINDOW_BUFFER_SIZE_RECORD;
|
} WINDOW_BUFFER_SIZE_RECORD;
|
||||||
@@ -2439,29 +2510,6 @@ typedef struct _JOB_INFO_1 {
|
|||||||
SYSTEMTIME Submitted;
|
SYSTEMTIME Submitted;
|
||||||
} JOB_INFO_1;
|
} JOB_INFO_1;
|
||||||
|
|
||||||
typedef struct _SID_IDENTIFIER_AUTHORITY {
|
|
||||||
BYTE Value[6];
|
|
||||||
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY,
|
|
||||||
*LPSID_IDENTIFIER_AUTHORITY;
|
|
||||||
|
|
||||||
typedef struct _SID {
|
|
||||||
BYTE Revision;
|
|
||||||
BYTE SubAuthorityCount;
|
|
||||||
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
|
||||||
DWORD SubAuthority[ANYSIZE_ARRAY];
|
|
||||||
} SID, *PSID;
|
|
||||||
|
|
||||||
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
|
|
||||||
|
|
||||||
typedef struct _SECURITY_DESCRIPTOR {
|
|
||||||
BYTE Revision;
|
|
||||||
BYTE Sbz1;
|
|
||||||
SECURITY_DESCRIPTOR_CONTROL Control;
|
|
||||||
PSID Owner;
|
|
||||||
PSID Group;
|
|
||||||
PACL Sacl;
|
|
||||||
PACL Dacl;
|
|
||||||
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
|
|
||||||
|
|
||||||
typedef struct _JOB_INFO_2 {
|
typedef struct _JOB_INFO_2 {
|
||||||
DWORD JobId;
|
DWORD JobId;
|
||||||
@@ -2541,12 +2589,7 @@ typedef struct _LOCALGROUP_MEMBERS_INFO_3 {
|
|||||||
|
|
||||||
typedef long FXPT16DOT16, * LPFXPT16DOT16;
|
typedef long FXPT16DOT16, * LPFXPT16DOT16;
|
||||||
|
|
||||||
typedef LARGE_INTEGER LUID, *PLUID;
|
|
||||||
|
|
||||||
typedef struct _LUID_AND_ATTRIBUTES {
|
|
||||||
LUID Luid;
|
|
||||||
DWORD Attributes;
|
|
||||||
} LUID_AND_ATTRIBUTES;
|
|
||||||
|
|
||||||
typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
|
typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
|
||||||
typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
|
typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
|
||||||
@@ -3472,11 +3515,6 @@ typedef struct _PRINTPROCESSOR_INFO_1 {
|
|||||||
LPTSTR pName;
|
LPTSTR pName;
|
||||||
} PRINTPROCESSOR_INFO_1;
|
} PRINTPROCESSOR_INFO_1;
|
||||||
|
|
||||||
typedef struct _PRIVILEGE_SET {
|
|
||||||
DWORD PrivilegeCount;
|
|
||||||
DWORD Control;
|
|
||||||
LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
|
|
||||||
} PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET;
|
|
||||||
|
|
||||||
typedef struct _PROCESS_HEAP_ENTRY {
|
typedef struct _PROCESS_HEAP_ENTRY {
|
||||||
PVOID lpData;
|
PVOID lpData;
|
||||||
@@ -3839,9 +3877,6 @@ typedef struct _SID_AND_ATTRIBUTES {
|
|||||||
typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
|
typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
|
||||||
typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
|
typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
|
||||||
|
|
||||||
typedef struct _SINGLE_LIST_ENTRY {
|
|
||||||
struct _SINGLE_LIST_ENTRY *Next;
|
|
||||||
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
|
|
||||||
|
|
||||||
typedef struct tagSOUNDSENTRY {
|
typedef struct tagSOUNDSENTRY {
|
||||||
UINT cbSize;
|
UINT cbSize;
|
||||||
@@ -4083,11 +4118,6 @@ typedef struct tagTOGGLEKEYS {
|
|||||||
DWORD cbSize;
|
DWORD cbSize;
|
||||||
DWORD dwFlags;
|
DWORD dwFlags;
|
||||||
} TOGGLEKEYS;
|
} TOGGLEKEYS;
|
||||||
|
|
||||||
typedef struct _TOKEN_SOURCE {
|
|
||||||
CHAR SourceName[8];
|
|
||||||
LUID SourceIdentifier;
|
|
||||||
} TOKEN_SOURCE;
|
|
||||||
|
|
||||||
typedef struct _TOKEN_CONTROL {
|
typedef struct _TOKEN_CONTROL {
|
||||||
LUID TokenId;
|
LUID TokenId;
|
||||||
@@ -4216,12 +4246,7 @@ typedef struct {
|
|||||||
UINT nSec;
|
UINT nSec;
|
||||||
UINT nInc;
|
UINT nInc;
|
||||||
} UDACCEL;
|
} UDACCEL;
|
||||||
|
|
||||||
typedef struct _ULARGE_INTEGER {
|
|
||||||
DWORD LowPart;
|
|
||||||
DWORD HighPart;
|
|
||||||
} ULARGE_INTEGER, *PULARGE_INTEGER;
|
|
||||||
|
|
||||||
typedef struct _UNIVERSAL_NAME_INFO {
|
typedef struct _UNIVERSAL_NAME_INFO {
|
||||||
LPTSTR lpUniversalName;
|
LPTSTR lpUniversalName;
|
||||||
} UNIVERSAL_NAME_INFO;
|
} UNIVERSAL_NAME_INFO;
|
||||||
@@ -4232,13 +4257,6 @@ typedef struct tagUSEROBJECTFLAGS {
|
|||||||
DWORD dwFlags;
|
DWORD dwFlags;
|
||||||
} USEROBJECTFLAGS;
|
} USEROBJECTFLAGS;
|
||||||
|
|
||||||
typedef struct value_ent {
|
|
||||||
LPTSTR ve_valuename;
|
|
||||||
DWORD ve_valuelen;
|
|
||||||
DWORD ve_valueptr;
|
|
||||||
DWORD ve_type;
|
|
||||||
} VALENT, *PVALENT;
|
|
||||||
|
|
||||||
typedef struct _VERIFY_INFORMATION {
|
typedef struct _VERIFY_INFORMATION {
|
||||||
LARGE_INTEGER StartingOffset;
|
LARGE_INTEGER StartingOffset;
|
||||||
DWORD Length;
|
DWORD Length;
|
||||||
@@ -4555,5 +4573,7 @@ typedef struct
|
|||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* WIN32_LEAN_AND_MEAN */
|
||||||
|
|
||||||
#endif /* _GNU_H_WINDOWS32_STRUCTURES */
|
#endif /* _GNU_H_WINDOWS32_STRUCTURES */
|
||||||
|
|
||||||
|
@@ -41,7 +41,7 @@
|
|||||||
#include <base.h>
|
#include <base.h>
|
||||||
|
|
||||||
/* WIN32 messages */
|
/* WIN32 messages */
|
||||||
#ifndef _WIN32_LEAN_AND_MEAN
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
#include <messages.h>
|
#include <messages.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -54,20 +54,22 @@
|
|||||||
#include <structs.h>
|
#include <structs.h>
|
||||||
|
|
||||||
/* WIN32 functions */
|
/* WIN32 functions */
|
||||||
#ifndef _WIN32_LEAN_AND_MEAN
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
#include <funcs.h>
|
#include <funcs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* ! defined (RC_INVOKED) */
|
#endif /* ! defined (RC_INVOKED) */
|
||||||
|
|
||||||
/* WIN32 error codes */
|
/* WIN32 error codes */
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
#include <errors.h>
|
#include <errors.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef RC_INVOKED
|
#ifndef RC_INVOKED
|
||||||
|
|
||||||
/* Windows sockets specification version 1.1 */
|
/* Windows sockets specification version 1.1 */
|
||||||
#ifdef Win32_Winsock
|
#ifdef Win32_Winsock
|
||||||
#ifndef _WIN32_LEAN_AND_MEAN
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
#include <sockets.h>
|
#include <sockets.h>
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@@ -36,6 +36,11 @@ extern size_t wcsnlen(const wchar_t * s, size_t count);
|
|||||||
extern int wcsicmp(const wchar_t* cs,const wchar_t * ct);
|
extern int wcsicmp(const wchar_t* cs,const wchar_t * ct);
|
||||||
extern int wcsnicmp(const wchar_t* cs,const wchar_t * ct, size_t count);
|
extern int wcsnicmp(const wchar_t* cs,const wchar_t * ct, size_t count);
|
||||||
|
|
||||||
|
WCHAR wtoupper(WCHAR c);
|
||||||
|
WCHAR wtolower(WCHAR c);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,32 +1,16 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Win32 File Api functions
|
* Win32 File Api functions
|
||||||
* Author: Boudewijn Dekker
|
* Author: Boudewijn Dekker
|
||||||
* to do: many more to add ..
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#undef WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
// AnsiOrOemtoUnicode
|
|
||||||
// pupose: internal procedure used in file api
|
|
||||||
|
|
||||||
NTSTATUS AnsiOrOemtoUnicode(PUNICODE_STRING DestinationString,PANSI_STRING SourceString, BOOLEAN AllocateDestinationString);
|
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN bIsFileApiAnsi; // set the file api to ansi or oem
|
BOOLEAN bIsFileApiAnsi; // set the file api to ansi or oem
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS AnsiOrOemtoUnicode(PUNICODE_STRING DestinationString,PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
|
|
||||||
{
|
|
||||||
if ( bIsFileApiAnsi ) {
|
|
||||||
return __AnsiStringToUnicodeString(DestinationString, SourceString, AllocateDestinationString);
|
|
||||||
else
|
|
||||||
return __OemStringToUnicodeString(DestinationString, SourceString, AllocateDestinationString);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
WINBASEAPI
|
WINBASEAPI
|
||||||
VOID
|
VOID
|
||||||
WINAPI
|
WINAPI
|
||||||
@@ -36,7 +20,59 @@ SetFileApisToOEM(VOID)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HANDLE STDCALL CreateFileA(LPCSTR lpFileName,
|
||||||
|
DWORD dwDesiredAccess,
|
||||||
|
DWORD dwShareMode,
|
||||||
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||||
|
DWORD dwCreationDisposition,
|
||||||
|
DWORD dwFlagsAndAttributes,
|
||||||
|
HANDLE hTemplateFile)
|
||||||
|
{
|
||||||
|
HANDLE FileHandle;
|
||||||
|
NTSTATUS Status;
|
||||||
|
WCHAR FileNameW[255];
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
ULONG i = 0;
|
||||||
|
UNICODE_STRING FileNameString;
|
||||||
|
ULONG Flags = 0;
|
||||||
|
|
||||||
|
if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
|
||||||
|
{
|
||||||
|
Flags = Flags | FILE_SYNCHRONOUS_IO_ALERT;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileNameString.Length = 0;
|
||||||
|
|
||||||
|
while ((*lpFileName)!=0)
|
||||||
|
{
|
||||||
|
FileNameW[i] = *lpFileName;
|
||||||
|
lpFileName++;
|
||||||
|
i++;
|
||||||
|
FileNameString.Length++;
|
||||||
|
}
|
||||||
|
FileNameW[i] = 0;
|
||||||
|
FileNameString.Length++;
|
||||||
|
|
||||||
|
FileNameString.Buffer = &FileNameW;
|
||||||
|
FileNameString.MaximumLength = FileNameString.Length;
|
||||||
|
|
||||||
|
ObjectAttributes.RootDirectory = NULL;
|
||||||
|
ObjectAttributes.ObjectName = &FileNameString;
|
||||||
|
|
||||||
|
Status = NtCreateFile(&FileHandle,
|
||||||
|
dwDesiredAccess,
|
||||||
|
&ObjectAttributes,
|
||||||
|
&IoStatusBlock,
|
||||||
|
NULL,
|
||||||
|
dwFlagsAndAttributes,
|
||||||
|
dwShareMode,
|
||||||
|
dwCreationDisposition,
|
||||||
|
Flags,
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
return(FileHandle);
|
||||||
|
}
|
||||||
|
|
||||||
WINBASEAPI
|
WINBASEAPI
|
||||||
VOID
|
VOID
|
||||||
@@ -49,10 +85,275 @@ SetFileApisToANSI(VOID)
|
|||||||
|
|
||||||
|
|
||||||
WINBASEAPI
|
WINBASEAPI
|
||||||
BOOLEAN
|
WINBOOL
|
||||||
WINAPI
|
STDCALL
|
||||||
AreFileApisANSI(VOID)
|
AreFileApisANSI(VOID)
|
||||||
{
|
{
|
||||||
return bIsFileApiAnsi;
|
return bIsFileApiAnsi;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL STDCALL WriteFile(HANDLE hFile,
|
||||||
|
LPCVOID lpBuffer,
|
||||||
|
DWORD nNumberOfBytesToWrite,
|
||||||
|
LPDWORD lpNumberOfBytesWritten,
|
||||||
|
LPOVERLAPPED lpOverLapped)
|
||||||
|
{
|
||||||
|
//FIXME: WriteFile should write to a console if appropriate
|
||||||
|
LARGE_INTEGER Offset;
|
||||||
|
HANDLE hEvent = NULL;
|
||||||
|
NTSTATUS errCode;
|
||||||
|
|
||||||
|
if (lpOverLapped != NULL )
|
||||||
|
{
|
||||||
|
Offset.LowPart = lpOverLapped->Offset;
|
||||||
|
Offset.HighPart = lpOverLapped->OffsetHigh;
|
||||||
|
lpOverLapped->Internal = STATUS_PENDING;
|
||||||
|
hEvent= lpOverLapped->hEvent;
|
||||||
|
}
|
||||||
|
errCode = NtWriteFile(hFile,hEvent,NULL,NULL,
|
||||||
|
(PIO_STATUS_BLOCK)lpOverLapped,
|
||||||
|
lpBuffer,
|
||||||
|
nNumberOfBytesToWrite,
|
||||||
|
&Offset,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(errCode))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
WINBOOL STDCALL ReadFile(HANDLE hFile,
|
||||||
|
LPVOID lpBuffer,
|
||||||
|
DWORD nNumberOfBytesToRead,
|
||||||
|
LPDWORD lpNumberOfBytesRead,
|
||||||
|
LPOVERLAPPED lpOverLapped)
|
||||||
|
{
|
||||||
|
//FIXME ReadFile should write to a console if appropriate
|
||||||
|
HANDLE hEvent = NULL;
|
||||||
|
LARGE_INTEGER Offset;
|
||||||
|
NTSTATUS errCode;
|
||||||
|
PIO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
IO_STATUS_BLOCK IIosb;
|
||||||
|
OVERLAPPED IOverlapped;
|
||||||
|
|
||||||
|
if ( lpOverLapped != NULL )
|
||||||
|
{
|
||||||
|
Offset.LowPart = lpOverLapped->Offset;
|
||||||
|
Offset.HighPart = lpOverLapped->OffsetHigh;
|
||||||
|
lpOverLapped->Internal = STATUS_PENDING;
|
||||||
|
hEvent = lpOverLapped->hEvent;
|
||||||
|
IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IoStatusBlock = &IIosb;
|
||||||
|
}
|
||||||
|
|
||||||
|
errCode = NtReadFile(hFile,
|
||||||
|
hEvent,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
IoStatusBlock,
|
||||||
|
lpBuffer,
|
||||||
|
nNumberOfBytesToRead,
|
||||||
|
&Offset,
|
||||||
|
NULL);
|
||||||
|
if ( errCode < 0 )
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
ReadFileEx(
|
||||||
|
HANDLE hFile,
|
||||||
|
LPVOID lpBuffer,
|
||||||
|
DWORD nNumberOfBytesToRead,
|
||||||
|
LPOVERLAPPED lpOverLapped,
|
||||||
|
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
|
||||||
|
)
|
||||||
|
{
|
||||||
|
HANDLE hEvent = NULL;
|
||||||
|
LARGE_INTEGER Offset;
|
||||||
|
NTSTATUS errCode;
|
||||||
|
|
||||||
|
if ( lpOverLapped != NULL ) {
|
||||||
|
Offset.LowPart = lpOverLapped->Offset;
|
||||||
|
Offset.HighPart = lpOverLapped->OffsetHigh;
|
||||||
|
lpOverLapped->Internal = STATUS_PENDING;
|
||||||
|
hEvent = lpOverLapped->hEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
errCode = NtReadFile(hFile,
|
||||||
|
hEvent,
|
||||||
|
(PIO_APC_ROUTINE)lpCompletionRoutine,
|
||||||
|
NULL,
|
||||||
|
(PIO_STATUS_BLOCK)lpOverLapped,
|
||||||
|
lpBuffer,
|
||||||
|
nNumberOfBytesToRead,
|
||||||
|
&Offset,
|
||||||
|
NULL);
|
||||||
|
if ( errCode < 0 ) {
|
||||||
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
LockFile(
|
||||||
|
HANDLE hFile,
|
||||||
|
DWORD dwFileOffsetLow,
|
||||||
|
DWORD dwFileOffsetHigh,
|
||||||
|
DWORD nNumberOfBytesToLockLow,
|
||||||
|
DWORD nNumberOfBytesToLockHigh
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DWORD dwReserved;
|
||||||
|
OVERLAPPED Overlapped;
|
||||||
|
|
||||||
|
Overlapped.Offset = dwFileOffsetLow;
|
||||||
|
Overlapped.OffsetHigh = dwFileOffsetHigh;
|
||||||
|
dwReserved = 0;
|
||||||
|
|
||||||
|
return LockFileEx(hFile, LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK,dwReserved,nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, &Overlapped ) ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
LockFileEx(
|
||||||
|
HANDLE hFile,
|
||||||
|
DWORD dwFlags,
|
||||||
|
DWORD dwReserved,
|
||||||
|
DWORD nNumberOfBytesToLockLow,
|
||||||
|
DWORD nNumberOfBytesToLockHigh,
|
||||||
|
LPOVERLAPPED lpOverlapped
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER BytesToLock;
|
||||||
|
BOOL LockImmediate;
|
||||||
|
BOOL LockExclusive;
|
||||||
|
NTSTATUS errCode;
|
||||||
|
LARGE_INTEGER Offset;
|
||||||
|
|
||||||
|
if(dwReserved != 0)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
lpOverlapped->Internal = STATUS_PENDING;
|
||||||
|
|
||||||
|
Offset.LowPart = lpOverlapped->Offset;
|
||||||
|
Offset.HighPart = lpOverlapped->OffsetHigh;
|
||||||
|
|
||||||
|
if ( (dwFlags & LOCKFILE_FAIL_IMMEDIATELY) == LOCKFILE_FAIL_IMMEDIATELY )
|
||||||
|
LockImmediate = TRUE;
|
||||||
|
else
|
||||||
|
LockImmediate = FALSE;
|
||||||
|
|
||||||
|
if ( (dwFlags & LOCKFILE_EXCLUSIVE_LOCK) == LOCKFILE_EXCLUSIVE_LOCK )
|
||||||
|
LockExclusive = TRUE;
|
||||||
|
else
|
||||||
|
LockExclusive = FALSE;
|
||||||
|
|
||||||
|
BytesToLock.LowPart = nNumberOfBytesToLockLow;
|
||||||
|
BytesToLock.HighPart = nNumberOfBytesToLockHigh;
|
||||||
|
|
||||||
|
errCode = NtLockFile(hFile,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(PIO_STATUS_BLOCK)lpOverlapped,
|
||||||
|
&Offset,
|
||||||
|
&BytesToLock,
|
||||||
|
NULL,
|
||||||
|
LockImmediate,
|
||||||
|
LockExclusive);
|
||||||
|
if ( errCode < 0 )
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
UnlockFile(
|
||||||
|
HANDLE hFile,
|
||||||
|
DWORD dwFileOffsetLow,
|
||||||
|
DWORD dwFileOffsetHigh,
|
||||||
|
DWORD nNumberOfBytesToUnlockLow,
|
||||||
|
DWORD nNumberOfBytesToUnlockHigh
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DWORD dwReserved;
|
||||||
|
OVERLAPPED Overlapped;
|
||||||
|
Overlapped.Offset = dwFileOffsetLow;
|
||||||
|
Overlapped.OffsetHigh = dwFileOffsetHigh;
|
||||||
|
dwReserved = 0;
|
||||||
|
return UnlockFileEx(hFile, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh, &Overlapped);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
WINBOOL STDCALL UnlockFileEx(HANDLE hFile,
|
||||||
|
DWORD dwReserved,
|
||||||
|
DWORD nNumberOfBytesToUnLockLow,
|
||||||
|
DWORD nNumberOfBytesToUnLockHigh,
|
||||||
|
LPOVERLAPPED lpOverlapped)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER BytesToUnLock;
|
||||||
|
LARGE_INTEGER StartAddress;
|
||||||
|
NTSTATUS errCode;
|
||||||
|
|
||||||
|
if(dwReserved != 0)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if ( lpOverlapped == NULL )
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BytesToUnLock.LowPart = nNumberOfBytesToUnLockLow;
|
||||||
|
BytesToUnLock.HighPart = nNumberOfBytesToUnLockHigh;
|
||||||
|
|
||||||
|
StartAddress.LowPart = lpOverlapped->Offset;
|
||||||
|
StartAddress.HighPart = lpOverlapped->OffsetHigh;
|
||||||
|
|
||||||
|
errCode = NtUnlockFile(hFile,
|
||||||
|
(PIO_STATUS_BLOCK)lpOverlapped,
|
||||||
|
StartAddress,
|
||||||
|
BytesToUnLock,
|
||||||
|
NULL);
|
||||||
|
if ( errCode < 0 ) {
|
||||||
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -5,10 +5,11 @@
|
|||||||
* todo: check the _lopen for correctness
|
* todo: check the _lopen for correctness
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#undef WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wstring.h>
|
#include <wstring.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -26,8 +27,7 @@ long _hread(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
UINT STDCALL _lread(HFILE fd,LPVOID buffer,UINT count)
|
||||||
_lread(HFILE fd,LPVOID buffer,long count)
|
|
||||||
{
|
{
|
||||||
return _hread(fd,buffer, count);
|
return _hread(fd,buffer, count);
|
||||||
}
|
}
|
||||||
@@ -54,14 +54,15 @@ long _hwrite(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT
|
||||||
long _lwrite(
|
STDCALL
|
||||||
HFILE hFile,
|
_lwrite(
|
||||||
LPCSTR lpBuffer,
|
HFILE hFile,
|
||||||
long lBytes
|
LPCSTR lpBuffer,
|
||||||
)
|
UINT uBytes
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return _hwrite(hFile,lpBuffer,lBytes);
|
return _hwrite(hFile,lpBuffer,uBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OF_OPENMASK (OF_READ|OF_READWRITE|OF_WRITE|OF_CREATE)
|
#define OF_OPENMASK (OF_READ|OF_READWRITE|OF_WRITE|OF_CREATE)
|
||||||
@@ -123,7 +124,7 @@ int _lclose(
|
|||||||
if ( CloseHandle((HANDLE)hFile) )
|
if ( CloseHandle((HANDLE)hFile) )
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
rerturn -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LONG _llseek(
|
LONG _llseek(
|
||||||
|
@@ -1,9 +1,30 @@
|
|||||||
all: dummy
|
all: kernel32.a
|
||||||
|
|
||||||
OBJECTS = file/file.o file/lfile.o mem/virtual.o mem/local.o mem/global.o
|
SYNCH_OBJECTS = synch/critical.o
|
||||||
|
|
||||||
kernel32_lib: $(OBJECTS)
|
#MISC_OBJECTS = misc/atom.o
|
||||||
$(LD) --oformat=coff-go32 -Ttext b0000000 $(LDFLAGS) $(OBJECTS) -o kernel32.dll
|
MISC_OBJECTS = misc/error.o
|
||||||
|
|
||||||
|
#FILE_OBJECTS = file/file.o file/lfile.o
|
||||||
|
FILE_OBJECTS = file/file.o file/curdir.o
|
||||||
|
|
||||||
|
MEM_OBJECTS = mem/virtual.o mem/heap.o mem/utils.o
|
||||||
|
|
||||||
|
#THREAD_OBJECTS = thread/thread.o
|
||||||
|
|
||||||
|
PROCESS_OBJECTS = process/proc.o
|
||||||
|
|
||||||
|
STRING_OBJECTS = string/lstring.o
|
||||||
|
|
||||||
|
INTERNAL_OBJECTS = internal/dprintf.o internal/vsprintf.o
|
||||||
|
|
||||||
|
OBJECTS = $(MISC_OBJECTS) $(FILE_OBJECTS) $(THREAD_OBJECTS) \
|
||||||
|
$(PROCESS_OBJECTS) $(STRING_OBJECTS) $(MEM_OBJECTS) \
|
||||||
|
$(INTERNAL_OBJECTS) $(SYNCH_OBJECTS)
|
||||||
|
|
||||||
|
|
||||||
|
kernel32.a: $(OBJECTS)
|
||||||
|
$(AR) vrcs kernel32.a $(OBJECTS)
|
||||||
|
|
||||||
dummy:
|
dummy:
|
||||||
|
|
||||||
|
@@ -1,320 +0,0 @@
|
|||||||
/*
|
|
||||||
* Win32 Global/Local heap functions (GlobalXXX, LocalXXX).
|
|
||||||
* These functions included in Win32 for compatibility with 16 bit Windows
|
|
||||||
* Especially the moveable blocks and handles are oldish.
|
|
||||||
* But the ability to directly allocate memory with GPTR and LPTR is widely
|
|
||||||
* used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#define MAGIC_GLOBAL_USED 0x5342BEEF
|
|
||||||
#define GLOBAL_LOCK_MAX 0xFF
|
|
||||||
|
|
||||||
typedef struct __GLOBAL_LOCAL_HANDLE
|
|
||||||
{
|
|
||||||
ULONG Magic;
|
|
||||||
LPVOID Pointer;
|
|
||||||
BYTE Flags;
|
|
||||||
BYTE LockCount;
|
|
||||||
} GLOBAL_HANDLE, LOCAL_HANDLE, *PGLOBAL_HANDLE, *PLOCAL_HANDLE;
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalAlloc -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
HGLOBAL WINAPI GlobalAlloc(UINT flags, DWORD size)
|
|
||||||
{
|
|
||||||
PGLOBAL_HANDLE phandle;
|
|
||||||
LPVOID palloc;
|
|
||||||
|
|
||||||
aprintf("GlobalAlloc( 0x%X, 0x%lX )\n", flags, size );
|
|
||||||
|
|
||||||
if((flags & GMEM_MOVEABLE)==0) /* POINTER */
|
|
||||||
{
|
|
||||||
palloc=HeapAlloc(__ProcessHeap, 0, size);
|
|
||||||
return (HGLOBAL) palloc;
|
|
||||||
}
|
|
||||||
else /* HANDLE */
|
|
||||||
{
|
|
||||||
HeapLock(__ProcessHeap);
|
|
||||||
|
|
||||||
|
|
||||||
phandle=__HeapAllocFragment(__ProcessHeap, 0, sizeof(GLOBAL_HANDLE));
|
|
||||||
if(size)
|
|
||||||
{
|
|
||||||
palloc=HeapAlloc(__ProcessHeap, 0, size+sizeof(HANDLE));
|
|
||||||
*(PHANDLE)palloc=(HANDLE) &(phandle->Pointer);
|
|
||||||
phandle->Pointer=palloc+sizeof(HANDLE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
phandle->Pointer=NULL;
|
|
||||||
phandle->Magic=MAGIC_GLOBAL_USED;
|
|
||||||
phandle->Flags=flags>>8;
|
|
||||||
phandle->LockCount=0;
|
|
||||||
HeapUnlock(__ProcessHeap);
|
|
||||||
|
|
||||||
return (HGLOBAL) &(phandle->Pointer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalLock -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
LPVOID WINAPI GlobalLock(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
PGLOBAL_HANDLE phandle;
|
|
||||||
LPVOID palloc;
|
|
||||||
|
|
||||||
aprintf("GlobalLock( 0x%lX )\n", (ULONG) hmem );
|
|
||||||
|
|
||||||
if(((ULONG)hmem%8)==0)
|
|
||||||
return (LPVOID) hmem;
|
|
||||||
|
|
||||||
HeapLock(__ProcessHeap);
|
|
||||||
phandle=(PGLOBAL_HANDLE)(((LPVOID) hmem)-4);
|
|
||||||
if(phandle->Magic==MAGIC_GLOBAL_USED)
|
|
||||||
{
|
|
||||||
if(phandle->LockCount<GLOBAL_LOCK_MAX)
|
|
||||||
phandle->LockCount++;
|
|
||||||
palloc=phandle->Pointer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dprintf("GlobalLock: invalid handle\n");
|
|
||||||
palloc=(LPVOID) hmem;
|
|
||||||
}
|
|
||||||
HeapUnlock(__ProcessHeap);
|
|
||||||
return palloc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalUnlock -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
BOOL WINAPI GlobalUnlock(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
PGLOBAL_HANDLE phandle;
|
|
||||||
BOOL locked;
|
|
||||||
|
|
||||||
aprintf("GlobalUnlock( 0x%lX )\n", (ULONG) hmem );
|
|
||||||
|
|
||||||
if(((ULONG)hmem%8)==0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
HeapLock(__ProcessHeap);
|
|
||||||
phandle=(PGLOBAL_HANDLE)(((LPVOID) hmem)-4);
|
|
||||||
if(phandle->Magic==MAGIC_GLOBAL_USED)
|
|
||||||
{
|
|
||||||
if((phandle->LockCount<GLOBAL_LOCK_MAX)&&(phandle->LockCount>0))
|
|
||||||
phandle->LockCount--;
|
|
||||||
|
|
||||||
locked=(phandle->LockCount==0) ? TRUE : FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dprintf("GlobalUnlock: invalid handle\n");
|
|
||||||
locked=FALSE;
|
|
||||||
}
|
|
||||||
HeapUnlock(__ProcessHeap);
|
|
||||||
return locked;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalHandle -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
HGLOBAL WINAPI GlobalHandle(LPCVOID pmem)
|
|
||||||
{
|
|
||||||
aprintf("GlobalHandle( 0x%lX )\n", (ULONG) pmem );
|
|
||||||
|
|
||||||
if(((ULONG)pmem%8)==0) /* FIXED */
|
|
||||||
return (HGLOBAL) pmem;
|
|
||||||
else /* MOVEABLE */
|
|
||||||
return (HGLOBAL) *(LPVOID *)(pmem-sizeof(HANDLE));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalReAlloc -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hmem, DWORD size, UINT flags)
|
|
||||||
{
|
|
||||||
LPVOID palloc;
|
|
||||||
HGLOBAL hnew;
|
|
||||||
PGLOBAL_HANDLE phandle;
|
|
||||||
|
|
||||||
aprintf("GlobalReAlloc( 0x%lX, 0x%lX, 0x%X )\n", (ULONG) hmem, size, flags );
|
|
||||||
|
|
||||||
hnew=NULL;
|
|
||||||
HeapLock(__ProcessHeap);
|
|
||||||
if(flags & GMEM_MODIFY) /* modify flags */
|
|
||||||
{
|
|
||||||
if( (((ULONG)hmem%8)==0) && (flags & GMEM_MOVEABLE))
|
|
||||||
{
|
|
||||||
/* make a fixed block moveable
|
|
||||||
* actually only NT is able to do this. And it's soo simple
|
|
||||||
*/
|
|
||||||
size=HeapSize(__ProcessHeap, 0, (LPVOID) hmem);
|
|
||||||
hnew=GlobalAlloc( flags, size);
|
|
||||||
palloc=GlobalLock(hnew);
|
|
||||||
memcpy(palloc, (LPVOID) hmem, size);
|
|
||||||
GlobalUnlock(hnew);
|
|
||||||
GlobalFree(hmem);
|
|
||||||
}
|
|
||||||
else if((((ULONG)hmem%8) != 0)&&(flags & GMEM_DISCARDABLE))
|
|
||||||
{
|
|
||||||
/* change the flags to make our block "discardable" */
|
|
||||||
phandle=(PGLOBAL_HANDLE)(((LPVOID) hmem)-4);
|
|
||||||
phandle->Flags = phandle->Flags | (GMEM_DISCARDABLE >> 8);
|
|
||||||
hnew=hmem;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
hnew=NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(((ULONG)hmem%8)!=0)
|
|
||||||
{
|
|
||||||
/* reallocate fixed memory */
|
|
||||||
hnew=(HANDLE)HeapReAlloc(__ProcessHeap, 0, (LPVOID) hmem, size);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* reallocate a moveable block */
|
|
||||||
phandle=(PGLOBAL_HANDLE)(((LPVOID) hmem)-4);
|
|
||||||
if(phandle->LockCount!=0)
|
|
||||||
SetLastError(ERROR_INVALID_HANDLE);
|
|
||||||
else if(size!=0)
|
|
||||||
{
|
|
||||||
hnew=hmem;
|
|
||||||
if(phandle->Pointer)
|
|
||||||
{
|
|
||||||
palloc=HeapReAlloc(__ProcessHeap, 0,
|
|
||||||
phandle->Pointer-sizeof(HANDLE),
|
|
||||||
size+sizeof(HANDLE) );
|
|
||||||
phandle->Pointer=palloc+sizeof(HANDLE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
palloc=HeapAlloc(__ProcessHeap, 0, size+sizeof(HANDLE));
|
|
||||||
*(PHANDLE)palloc=hmem;
|
|
||||||
phandle->Pointer=palloc+sizeof(HANDLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(phandle->Pointer)
|
|
||||||
{
|
|
||||||
HeapFree(__ProcessHeap, 0, phandle->Pointer-sizeof(HANDLE));
|
|
||||||
phandle->Pointer=NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
HeapUnlock(__ProcessHeap);
|
|
||||||
return hnew;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalFree -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
HGLOBAL WINAPI GlobalFree(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
PGLOBAL_HANDLE phandle;
|
|
||||||
|
|
||||||
aprintf("GlobalFree( 0x%lX )\n", (ULONG) hmem );
|
|
||||||
|
|
||||||
if(((ULONG)hmem%4)==0) /* POINTER */
|
|
||||||
{
|
|
||||||
HeapFree(__ProcessHeap, 0, (LPVOID) hmem);
|
|
||||||
}
|
|
||||||
else /* HANDLE */
|
|
||||||
{
|
|
||||||
HeapLock(__ProcessHeap);
|
|
||||||
phandle=(PGLOBAL_HANDLE)(((LPVOID) hmem)-4);
|
|
||||||
if(phandle->Magic==MAGIC_GLOBAL_USED)
|
|
||||||
{
|
|
||||||
HeapLock(__ProcessHeap);
|
|
||||||
if(phandle->LockCount!=0)
|
|
||||||
SetLastError(ERROR_INVALID_HANDLE);
|
|
||||||
if(phandle->Pointer)
|
|
||||||
HeapFree(__ProcessHeap, 0, phandle->Pointer-sizeof(HANDLE));
|
|
||||||
__HeapFreeFragment(__ProcessHeap, 0, phandle);
|
|
||||||
}
|
|
||||||
HeapUnlock(__ProcessHeap);
|
|
||||||
}
|
|
||||||
return hmem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalSize -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
DWORD WINAPI GlobalSize(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
DWORD retval;
|
|
||||||
PGLOBAL_HANDLE phandle;
|
|
||||||
|
|
||||||
aprintf("GlobalSize( 0x%lX )\n", (ULONG) hmem );
|
|
||||||
|
|
||||||
if(((ULONG)hmem%8)==0)
|
|
||||||
{
|
|
||||||
retval=HeapSize(__ProcessHeap, 0, hmem);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HeapLock(__ProcessHeap);
|
|
||||||
phandle=(PGLOBAL_HANDLE)(((LPVOID) hmem)-4);
|
|
||||||
if(phandle->Magic==MAGIC_GLOBAL_USED)
|
|
||||||
{
|
|
||||||
retval=HeapSize(__ProcessHeap, 0, (phandle->Pointer)-sizeof(HANDLE))-4;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dprintf("GlobalSize: invalid handle\n");
|
|
||||||
retval=0;
|
|
||||||
}
|
|
||||||
HeapUnlock(__ProcessHeap);
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalWire -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
LPVOID WINAPI GlobalWire(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
return GlobalLock( hmem );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalUnWire -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
BOOL WINAPI GlobalUnWire(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
return GlobalUnlock( hmem);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalFix -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
VOID WINAPI GlobalFix(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
GlobalLock( hmem );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalUnfix -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
VOID WINAPI GlobalUnfix(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
GlobalUnlock( hmem);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
* GlobalFlags -- KERNEL32 *
|
|
||||||
*********************************************************************/
|
|
||||||
UINT WINAPI GlobalFlags(HGLOBAL hmem)
|
|
||||||
{
|
|
||||||
return LocalFlags( (HLOCAL) hmem);
|
|
||||||
}
|
|
||||||
|
|
@@ -26,7 +26,9 @@
|
|||||||
* Put the type definitions of the heap in a seperate header. Boudewijn Dekker
|
* Put the type definitions of the heap in a seperate header. Boudewijn Dekker
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <kernel32/kernel32.h>
|
||||||
#include <kernel32/heap.h>
|
#include <kernel32/heap.h>
|
||||||
|
#include <internal/string.h>
|
||||||
|
|
||||||
static HEAP_BUCKET __HeapDefaultBuckets[]=
|
static HEAP_BUCKET __HeapDefaultBuckets[]=
|
||||||
{
|
{
|
||||||
@@ -40,13 +42,14 @@ static HEAP_BUCKET __HeapDefaultBuckets[]=
|
|||||||
{ NULL, 256, 15, 4088 },
|
{ NULL, 256, 15, 4088 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PHEAP __ProcessHeap;
|
||||||
|
|
||||||
static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end);
|
static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end);
|
||||||
static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end);
|
static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end);
|
||||||
static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag);
|
static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag);
|
||||||
static VOID __HeapFreeRest(PHEAP pheap, PHEAP_BLOCK pfree, ULONG allocsize,
|
static VOID __HeapFreeRest(PHEAP pheap, PHEAP_BLOCK pfree, ULONG allocsize,
|
||||||
ULONG newsize);
|
ULONG newsize);
|
||||||
static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, ULONG size);
|
static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size);
|
||||||
static BOOL __HeapFree(PHEAP pheap, ULONG flags, LPVOID pmem);
|
static BOOL __HeapFree(PHEAP pheap, ULONG flags, LPVOID pmem);
|
||||||
static PHEAP_SUBALLOC __HeapAllocSub(PHEAP pheap, PHEAP_BUCKET pbucket);
|
static PHEAP_SUBALLOC __HeapAllocSub(PHEAP pheap, PHEAP_BUCKET pbucket);
|
||||||
static LPVOID __HeapAllocFragment(PHEAP pheap, ULONG flags, ULONG size);
|
static LPVOID __HeapAllocFragment(PHEAP pheap, ULONG flags, ULONG size);
|
||||||
@@ -67,12 +70,14 @@ static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end)
|
|||||||
{
|
{
|
||||||
dprintf("__HeapCommit( 0x%lX, 0x%lX, 0x%lX)\n",
|
dprintf("__HeapCommit( 0x%lX, 0x%lX, 0x%lX)\n",
|
||||||
(ULONG) pheap, (ULONG) start, (ULONG) end);
|
(ULONG) pheap, (ULONG) start, (ULONG) end);
|
||||||
#ifdef NOT
|
|
||||||
__VirtualDump();
|
|
||||||
#endif
|
|
||||||
if(end >= pheap->LastBlock)
|
if(end >= pheap->LastBlock)
|
||||||
pheap->LastBlock=end;
|
pheap->LastBlock=end;
|
||||||
return __VirtualCommit(start, end-start, PAGE_READWRITE);
|
if (VirtualAlloc(start,end-start,MEM_COMMIT,PAGE_READWRITE)!=start)
|
||||||
|
{
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
@@ -89,7 +94,8 @@ static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end)
|
|||||||
#endif
|
#endif
|
||||||
if((end >= pheap->LastBlock)&&(start<= pheap->LastBlock))
|
if((end >= pheap->LastBlock)&&(start<= pheap->LastBlock))
|
||||||
pheap->LastBlock=start;
|
pheap->LastBlock=start;
|
||||||
return __VirtualDecommit(start, end-start );
|
|
||||||
|
return(VirtualFree(start,end-start,MEM_RESERVE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
@@ -106,7 +112,10 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag)
|
|||||||
LPVOID commitend;
|
LPVOID commitend;
|
||||||
ULONG freesize;
|
ULONG freesize;
|
||||||
ULONG allocsize;
|
ULONG allocsize;
|
||||||
|
|
||||||
|
dprintf("__HeapAlloc(pheap %x, flags %x, size %d, tag %x)\n",
|
||||||
|
pheap,flags,size,tag);
|
||||||
|
|
||||||
pfree=&(pheap->Start);
|
pfree=&(pheap->Start);
|
||||||
allocsize=SIZE_ROUND(size);
|
allocsize=SIZE_ROUND(size);
|
||||||
freesize=HEAP_SIZE(pfree);
|
freesize=HEAP_SIZE(pfree);
|
||||||
@@ -154,7 +163,7 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag)
|
|||||||
/* update our administration */
|
/* update our administration */
|
||||||
palloc->Size= size | tag;
|
palloc->Size= size | tag;
|
||||||
if((flags | pheap->Flags)& HEAP_ZERO_MEMORY)
|
if((flags | pheap->Flags)& HEAP_ZERO_MEMORY)
|
||||||
memset((LPVOID)palloc+HEAP_ADMIN_SIZE, 0, allocsize);
|
FillMemory((LPVOID)palloc+HEAP_ADMIN_SIZE, allocsize, 0);
|
||||||
return (LPVOID)palloc+HEAP_ADMIN_SIZE;
|
return (LPVOID)palloc+HEAP_ADMIN_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,7 +245,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
|
|||||||
/* alloc a new fragment */
|
/* alloc a new fragment */
|
||||||
pmem=__HeapAllocFragment(pheap, flags, size);
|
pmem=__HeapAllocFragment(pheap, flags, size);
|
||||||
if(pmem)
|
if(pmem)
|
||||||
memcpy(pmem, pold, size);
|
CopyMemory(pmem, pold, size);
|
||||||
return pmem;
|
return pmem;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -300,7 +309,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
|
|||||||
oldsize=HEAP_SIZE(prealloc);
|
oldsize=HEAP_SIZE(prealloc);
|
||||||
pmem=__HeapAlloc(pheap, flags, size, HEAP_NORMAL_TAG);
|
pmem=__HeapAlloc(pheap, flags, size, HEAP_NORMAL_TAG);
|
||||||
if(pmem)
|
if(pmem)
|
||||||
memcpy(pmem, pold, oldsize);
|
CopyMemory(pmem, pold, oldsize);
|
||||||
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
|
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
|
||||||
memset(pmem + oldsize, 0, size-oldsize);
|
memset(pmem + oldsize, 0, size-oldsize);
|
||||||
__HeapFree(pheap, flags, pold);
|
__HeapFree(pheap, flags, pold);
|
||||||
@@ -502,7 +511,7 @@ static LPVOID __HeapReAllocFragment(PHEAP pheap, ULONG flags,
|
|||||||
pmem=__HeapAllocFragment(pheap, flags, size);
|
pmem=__HeapAllocFragment(pheap, flags, size);
|
||||||
|
|
||||||
if(pmem)
|
if(pmem)
|
||||||
memcpy(pmem, pold, size);
|
CopyMemory(pmem, pold, size);
|
||||||
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
|
if((flags|pheap->Flags)&HEAP_ZERO_MEMORY)
|
||||||
memset(pmem+pfrag->Size, 0, size-pfrag->Size);
|
memset(pmem+pfrag->Size, 0, size-pfrag->Size);
|
||||||
|
|
||||||
@@ -580,12 +589,15 @@ static BOOL __HeapFreeFragment(PHEAP pheap, ULONG flags, LPVOID pfree )
|
|||||||
PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
|
PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
|
||||||
{
|
{
|
||||||
PHEAP pheap=(PHEAP) base;
|
PHEAP pheap=(PHEAP) base;
|
||||||
|
|
||||||
|
dprintf("__HeapPrepare(base %x, minsize %d, maxsize %d, flags %x)\n",
|
||||||
|
base,minsize,maxsize,flags);
|
||||||
|
|
||||||
pheap->Magic=MAGIC_HEAP;
|
pheap->Magic=MAGIC_HEAP;
|
||||||
pheap->End= ((LPVOID)pheap)+minsize;
|
pheap->End= ((LPVOID)pheap)+minsize;
|
||||||
pheap->Flags=flags;
|
pheap->Flags=flags;
|
||||||
pheap->LastBlock=(LPVOID)pheap + PAGESIZE;
|
pheap->LastBlock=(LPVOID)pheap + PAGESIZE;
|
||||||
memcpy(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets));
|
CopyMemory(pheap->Bucket,__HeapDefaultBuckets,sizeof(__HeapDefaultBuckets));
|
||||||
if(__ProcessHeap)
|
if(__ProcessHeap)
|
||||||
{
|
{
|
||||||
pheap->NextHeap=__ProcessHeap->NextHeap;
|
pheap->NextHeap=__ProcessHeap->NextHeap;
|
||||||
@@ -611,8 +623,8 @@ PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
|
|||||||
|
|
||||||
VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize)
|
VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize)
|
||||||
{
|
{
|
||||||
mmap(base, PAGESIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
|
VirtualAlloc(base,maxsize,MEM_RESERVE,PAGE_READWRITE);
|
||||||
__DevZero, 0);
|
VirtualAlloc(base,PAGESIZE,MEM_COMMIT,PAGE_READWRITE);
|
||||||
|
|
||||||
__HeapPrepare(base, minsize, maxsize, 0);
|
__HeapPrepare(base, minsize, maxsize, 0);
|
||||||
}
|
}
|
||||||
@@ -621,16 +633,14 @@ VOID WINAPI __HeapInit(LPVOID base, ULONG minsize, ULONG maxsize)
|
|||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* HeapCreate -- KERNEL32 *
|
* HeapCreate -- KERNEL32 *
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
HANDLE STDCALL HeapCreate(DWORD flags, DWORD minsize, DWORD maxsize)
|
||||||
HANDLE WINAPI HeapCreate(ULONG flags, ULONG minsize, ULONG maxsize)
|
|
||||||
{
|
{
|
||||||
PHEAP pheap;
|
PHEAP pheap;
|
||||||
|
|
||||||
aprintf("HeapCreate( 0x%lX, 0x%lX, 0x%lX )\n", flags, minsize, maxsize);
|
aprintf("HeapCreate( 0x%lX, 0x%lX, 0x%lX )\n", flags, minsize, maxsize);
|
||||||
|
|
||||||
pheap = __VirtualReserve(NULL, minsize, PAGE_READWRITE | MEM_TOP_DOWN);
|
pheap = VirtualAlloc(NULL, minsize, MEM_TOP_DOWN, PAGE_READWRITE);
|
||||||
__VirtualCommit(pheap, PAGESIZE, PAGE_READWRITE);
|
VirtualAlloc(pheap, PAGESIZE, MEM_COMMIT, PAGE_READWRITE);
|
||||||
__VirtualDump();
|
|
||||||
return (HANDLE) __HeapPrepare(pheap, minsize, maxsize, flags);
|
return (HANDLE) __HeapPrepare(pheap, minsize, maxsize, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -647,15 +657,15 @@ BOOL WINAPI HeapDestroy(HANDLE hheap)
|
|||||||
return __ErrorReturnFalse(ERROR_INVALID_PARAMETER);
|
return __ErrorReturnFalse(ERROR_INVALID_PARAMETER);
|
||||||
|
|
||||||
DeleteCriticalSection(&(pheap->Synchronize));
|
DeleteCriticalSection(&(pheap->Synchronize));
|
||||||
__VirtualRelease(pheap);
|
VirtualFree(pheap,0,MEM_RELEASE);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* HeapAlloc -- KERNEL32 *
|
* HeapAlloc -- KERNEL32 *
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
LPVOID WINAPI HeapAlloc(HANDLE hheap, ULONG flags, ULONG size)
|
LPVOID STDCALL HeapAlloc(HANDLE hheap, DWORD flags, DWORD size)
|
||||||
{
|
{
|
||||||
PHEAP pheap=hheap;
|
PHEAP pheap=hheap;
|
||||||
LPVOID retval;
|
LPVOID retval;
|
||||||
@@ -684,7 +694,7 @@ LPVOID WINAPI HeapAlloc(HANDLE hheap, ULONG flags, ULONG size)
|
|||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* HeapReAlloc -- KERNEL32 *
|
* HeapReAlloc -- KERNEL32 *
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size)
|
LPVOID STDCALL HeapReAlloc(HANDLE hheap, DWORD flags, LPVOID ptr, DWORD size)
|
||||||
{
|
{
|
||||||
PHEAP pheap=hheap;
|
PHEAP pheap=hheap;
|
||||||
PHEAP_BLOCK pfree=((PHEAP_BLOCK)ptr-1);
|
PHEAP_BLOCK pfree=((PHEAP_BLOCK)ptr-1);
|
||||||
@@ -714,7 +724,7 @@ LPVOID WINAPI HeapReAlloc(HANDLE hheap, ULONG flags, LPVOID ptr, ULONG size)
|
|||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* HeapFree -- KERNEL32 *
|
* HeapFree -- KERNEL32 *
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
BOOL WINAPI HeapFree(HANDLE hheap, ULONG flags, LPVOID ptr)
|
WINBOOL STDCALL HeapFree(HANDLE hheap, DWORD flags, LPVOID ptr)
|
||||||
{
|
{
|
||||||
PHEAP pheap=hheap;
|
PHEAP pheap=hheap;
|
||||||
PHEAP_BLOCK pfree=(PHEAP_BLOCK)((LPVOID)ptr-HEAP_ADMIN_SIZE);
|
PHEAP_BLOCK pfree=(PHEAP_BLOCK)((LPVOID)ptr-HEAP_ADMIN_SIZE);
|
||||||
|
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS user mode libraries
|
|
||||||
* FILE: kernel32/mem/utils.cc
|
|
||||||
* PURPOSE: Various simple memory initalizations functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
VOID ZeroMemory(PVOID Destination, DWORD Length)
|
|
||||||
{
|
|
||||||
#ifdef __i386__
|
|
||||||
|
|
||||||
#endif /* __i386__ */
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID CopyMemory(PVOID Destination, CONST VOID* Source, DWORD Length)
|
|
||||||
{
|
|
||||||
#ifdef __i386__
|
|
||||||
#endif /* __i386__ */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@@ -9,11 +9,92 @@
|
|||||||
/* INCLUDES ******************************************************************/
|
/* INCLUDES ******************************************************************/
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
LPVOID STDCALL VirtualAllocEx(HANDLE hProcess,
|
||||||
|
LPVOID lpAddress,
|
||||||
|
DWORD dwSize,
|
||||||
|
DWORD flAllocationType,
|
||||||
|
DWORD flProtect)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Status = ZwAllocateVirtualMemory(hProcess,
|
||||||
|
&lpAddress,
|
||||||
|
0,
|
||||||
|
dwSize,
|
||||||
|
flAllocationType,
|
||||||
|
flProtect);
|
||||||
|
if (Status != STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
return(lpAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
LPVOID STDCALL VirtualAlloc(LPVOID lpAddress,
|
||||||
|
DWORD dwSize,
|
||||||
|
DWORD flAllocationType,
|
||||||
|
DWORD flProtect)
|
||||||
|
{
|
||||||
|
return(VirtualAllocEx(GetCurrentProcess(),lpAddress,dwSize,flAllocationType,
|
||||||
|
flProtect));
|
||||||
|
}
|
||||||
|
|
||||||
|
WINBOOL STDCALL VirtualFreeEx(HANDLE hProcess,
|
||||||
|
LPVOID lpAddress,
|
||||||
|
DWORD dwSize,
|
||||||
|
DWORD dwFreeType)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Status = ZwFreeVirtualMemory(hProcess,
|
||||||
|
&lpAddress,
|
||||||
|
dwSize,
|
||||||
|
dwFreeType);
|
||||||
|
if (Status != STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
WINBOOL STDCALL VirtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType)
|
WINBOOL STDCALL VirtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType)
|
||||||
{
|
{
|
||||||
return(VirtualFreeEx(GetCurrentProcess(),lpAddress,dwSize,dwFreeType));
|
return(VirtualFreeEx(GetCurrentProcess(),lpAddress,dwSize,dwFreeType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WINBOOL STDCALL VirtualProtect(LPVOID lpAddress,
|
||||||
|
DWORD dwSize,
|
||||||
|
DWORD flNewProtect,
|
||||||
|
PDWORD lpflOldProtect)
|
||||||
|
{
|
||||||
|
return(VirtualProtectEx(GetCurrentProcess(),
|
||||||
|
lpAddress,
|
||||||
|
dwSize,
|
||||||
|
flNewProtect,
|
||||||
|
lpflOldProtect));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WINBOOL STDCALL VirtualProtectEx(HANDLE hProcess,
|
||||||
|
LPVOID lpAddress,
|
||||||
|
DWORD dwSize,
|
||||||
|
DWORD flNewProtect,
|
||||||
|
PDWORD lpflOldProtect)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Status = ZwProtectVirtualMemory(hProcess,
|
||||||
|
lpAddress,
|
||||||
|
dwSize,
|
||||||
|
flNewProtect,
|
||||||
|
lpflOldProtect);
|
||||||
|
if (Status != STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
#include <windows.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
/*
|
/*
|
||||||
* Win32 Process Api functions
|
* Win32 Process Api functions
|
||||||
@@ -14,14 +15,18 @@
|
|||||||
#define NT_CURRENT_THREAD 0xFFFFFFFE
|
#define NT_CURRENT_THREAD 0xFFFFFFFE
|
||||||
|
|
||||||
|
|
||||||
WINBASEAPI
|
HANDLE STDCALL GetCurrentProcess(VOID)
|
||||||
HANDLE
|
|
||||||
WINAPI
|
|
||||||
GetCurrentProcess()
|
|
||||||
{
|
{
|
||||||
return NT_CURRENT_PROCESS;
|
return NT_CURRENT_PROCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HANDLE STDCALL GetCurrentThread()
|
||||||
|
{
|
||||||
|
return NT_CURRENT_PROCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
WINBASEAPI
|
WINBASEAPI
|
||||||
DWORD
|
DWORD
|
||||||
WINAPI
|
WINAPI
|
||||||
@@ -31,14 +36,6 @@ GetCurrentProcessId()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WINBASEAPI
|
|
||||||
HANDLE
|
|
||||||
WINAPI
|
|
||||||
GetCurrentThread()
|
|
||||||
{
|
|
||||||
return NT_CURRENT_PROCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
WINBASEAPI
|
WINBASEAPI
|
||||||
DWORD
|
DWORD
|
||||||
WINAPI
|
WINAPI
|
||||||
@@ -135,3 +132,5 @@ BOOL FlushInstructionCache(
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@@ -1,123 +0,0 @@
|
|||||||
#include <windows.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <wstring.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
STDCALL
|
|
||||||
lstrcmpA(
|
|
||||||
LPCSTR lpString1,
|
|
||||||
LPCSTR lpString2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return strcmp(lpString1,lpString2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
STDCALL
|
|
||||||
lstrcmpiA(
|
|
||||||
LPCSTR lpString1,
|
|
||||||
LPCSTR lpString2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return stricmp(lpString1,lpString2);
|
|
||||||
}
|
|
||||||
LPSTR
|
|
||||||
STDCALL
|
|
||||||
lstrcpynA(
|
|
||||||
LPSTR lpString1,
|
|
||||||
LPCSTR lpString2,
|
|
||||||
int iMaxLength
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return strncpy(lpString1,lpString2,iMaxLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
LPSTR
|
|
||||||
STDCALL
|
|
||||||
lstrcpyA(
|
|
||||||
LPSTR lpString1,
|
|
||||||
LPCSTR lpString2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return strcpy(lpString1,lpString2);
|
|
||||||
}
|
|
||||||
|
|
||||||
LPSTR
|
|
||||||
STDCALL
|
|
||||||
lstrcatA(
|
|
||||||
LPSTR lpString1,
|
|
||||||
LPCSTR lpString2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return strcat(lpString1,lpString2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
STDCALL
|
|
||||||
lstrlenA(
|
|
||||||
LPCSTR lpString
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return strlen(lpString);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
STDCALL
|
|
||||||
lstrcmpW(
|
|
||||||
LPCWSTR lpString1,
|
|
||||||
LPCWSTR lpString2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return wcscmp(lpString1,lpString2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
STDCALL
|
|
||||||
lstrcmpiW(
|
|
||||||
LPCWSTR lpString1,
|
|
||||||
LPCWSTR lpString2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return wcsicmp(lpString1,lpString2);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
LPWSTR
|
|
||||||
STDCALL
|
|
||||||
lstrcpynW(
|
|
||||||
LPWSTR lpString1,
|
|
||||||
LPCWSTR lpString2,
|
|
||||||
int iMaxLength
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return wcsncpy(lpString1,lpString2,iMaxLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
LPWSTR
|
|
||||||
STDCALL
|
|
||||||
lstrcpyW(
|
|
||||||
LPWSTR lpString1,
|
|
||||||
LPCWSTR lpString2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return wcscpy(lpString1,lpString2);
|
|
||||||
}
|
|
||||||
|
|
||||||
LPWSTR
|
|
||||||
STDCALL
|
|
||||||
lstrcatW(
|
|
||||||
LPWSTR lpString1,
|
|
||||||
LPCWSTR lpString2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return wcscat(lpString1,lpString2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
STDCALL
|
|
||||||
lstrlenW(
|
|
||||||
LPCWSTR lpString
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return wcslen(lpString);
|
|
||||||
}
|
|
@@ -1,12 +0,0 @@
|
|||||||
LIBRARIES = ntdll kernel32
|
|
||||||
|
|
||||||
all: $(LIBRARIES)
|
|
||||||
|
|
||||||
ntdll: dummy
|
|
||||||
make -C ntdll
|
|
||||||
|
|
||||||
kernel32: dummy
|
|
||||||
make -C kernel32
|
|
||||||
|
|
||||||
dummy:
|
|
||||||
|
|
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS version of ntdll
|
|
||||||
* FILE: lib/ntdll/genntdll.c
|
|
||||||
* PURPOSE: Generates the system call stubs in ntdll
|
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDE ******************************************************************/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
|
||||||
|
|
||||||
int process(FILE* in, FILE* out)
|
|
||||||
{
|
|
||||||
char line[255];
|
|
||||||
char* s;
|
|
||||||
char* name;
|
|
||||||
char* value;
|
|
||||||
char* nr_args;
|
|
||||||
|
|
||||||
fprintf(out,"; Machine generated, don't edit\n");
|
|
||||||
fprintf(out,"\n\n");
|
|
||||||
|
|
||||||
while (!feof(in) && fgets(line,255,in)!=NULL)
|
|
||||||
{
|
|
||||||
fgets(line,255,in);
|
|
||||||
if ((s=strchr(line,'\n'))!=NULL)
|
|
||||||
{
|
|
||||||
*s=0;
|
|
||||||
}
|
|
||||||
s=&line[0];
|
|
||||||
if ((*s)!='#')
|
|
||||||
{
|
|
||||||
name = strtok(s," \t");
|
|
||||||
value = strtok(NULL," \t");
|
|
||||||
nr_args = strtok(NULL," \t");
|
|
||||||
|
|
||||||
// printf("name %s value %s\n",name,value);
|
|
||||||
|
|
||||||
fprintf(out,"%s:\n",name);
|
|
||||||
fprintf(out,"\tmov\teax,%s\n",value);
|
|
||||||
fprintf(out,"\tlea\tedx,[esp+4]\n");
|
|
||||||
fprintf(out,"\tint\t2Eh\n");
|
|
||||||
fprintf(out,"\tret\t%s\n\n",nr_args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void usage(void)
|
|
||||||
{
|
|
||||||
printf("Usage: genntdll infile.cll outfile.c\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
FILE* in;
|
|
||||||
FILE* out;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (argc!=3)
|
|
||||||
{
|
|
||||||
usage();
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
in = fopen(argv[1],"rb");
|
|
||||||
if (in==NULL)
|
|
||||||
{
|
|
||||||
perror("Failed to open input file");
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
out = fopen(argv[2],"wb");
|
|
||||||
if (out==NULL)
|
|
||||||
{
|
|
||||||
perror("Failed to open output file");
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = process(in,out);
|
|
||||||
|
|
||||||
fclose(in);
|
|
||||||
fclose(out);
|
|
||||||
|
|
||||||
return(ret);
|
|
||||||
}
|
|
@@ -1,7 +1,10 @@
|
|||||||
all: genntdll$(EXE_POSTFIX)
|
all: ntdll.a
|
||||||
|
|
||||||
genntdll$(EXE_POSTFIX): genntdll.c
|
OBJECTS = napi.o
|
||||||
$(NATIVE_CC) -g genntdll.c -o genntdll$(EXE_POSTFIX)
|
|
||||||
|
ntdll.a: $(OBJECTS)
|
||||||
|
$(AR) vcsr ntdll.a $(OBJECTS)
|
||||||
|
|
||||||
dummy:
|
dummy:
|
||||||
|
|
||||||
include ../../rules.mak
|
include ../../rules.mak
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,9 +0,0 @@
|
|||||||
; Machine generated, don't edit
|
|
||||||
|
|
||||||
|
|
||||||
NtAlertThread:
|
|
||||||
mov eax,4
|
|
||||||
lea edx,[esp+4]
|
|
||||||
int 2Eh
|
|
||||||
ret 14
|
|
||||||
|
|
@@ -1,7 +0,0 @@
|
|||||||
#
|
|
||||||
# This defines the kernel entry points used by ntdll
|
|
||||||
#
|
|
||||||
# They have the following format
|
|
||||||
# <name> <system call number> <size of the parameters in bytes>
|
|
||||||
#
|
|
||||||
NtAlertThread 4 14
|
|
@@ -27,12 +27,9 @@
|
|||||||
;
|
;
|
||||||
; $Logfile: C:/dos-c/src/boot/boot.asv $
|
; $Logfile: C:/dos-c/src/boot/boot.asv $
|
||||||
;
|
;
|
||||||
; $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/loaders/boot/Attic/boot.asm,v 1.3 1998/08/25 04:37:43 rex Exp $
|
; $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/loaders/boot/Attic/boot.asm,v 1.1.1.2 1998/08/25 04:27:38 rex Exp $
|
||||||
;
|
;
|
||||||
; $Log: boot.asm,v $
|
; $Log: boot.asm,v $
|
||||||
; Revision 1.3 1998/08/25 04:37:43 rex
|
|
||||||
; new release cleanup
|
|
||||||
;
|
|
||||||
; Revision 1.1.1.2 1998/08/25 04:27:38 rex
|
; Revision 1.1.1.2 1998/08/25 04:27:38 rex
|
||||||
; A much Needed Update
|
; A much Needed Update
|
||||||
;
|
;
|
||||||
@@ -289,3 +286,6 @@ filename db "KERNEL BIN"
|
|||||||
sign dw 0aa55h
|
sign dw 0aa55h
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
640
reactos/loaders/boot/boot.lst
Normal file
640
reactos/loaders/boot/boot.lst
Normal file
@@ -0,0 +1,640 @@
|
|||||||
|
1 ;
|
||||||
|
2 ; File:
|
||||||
|
3 ; boot.asm
|
||||||
|
4 ; Description:
|
||||||
|
5 ; DOS-C boot
|
||||||
|
6 ;
|
||||||
|
7 ; Copyright (c) 1997;
|
||||||
|
8 ; Svante Frey
|
||||||
|
9 ; All Rights Reserved
|
||||||
|
10 ;
|
||||||
|
11 ; This file is part of DOS-C.
|
||||||
|
12 ;
|
||||||
|
13 ; DOS-C is free software; you can redistribute it and/or
|
||||||
|
14 ; modify it under the terms of the GNU General Public License
|
||||||
|
15 ; as published by the Free Software Foundation; either version
|
||||||
|
16 ; 2, or (at your option) any later version.
|
||||||
|
17 ;
|
||||||
|
18 ; DOS-C is distributed in the hope that it will be useful, but
|
||||||
|
19 ; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
20 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||||
|
21 ; the GNU General Public License for more details.
|
||||||
|
22 ;
|
||||||
|
23 ; You should have received a copy of the GNU General Public
|
||||||
|
24 ; License along with DOS-C; see the file COPYING. If not,
|
||||||
|
25 ; write to the Free Software Foundation, 675 Mass Ave,
|
||||||
|
26 ; Cambridge, MA 02139, USA.
|
||||||
|
27 ;
|
||||||
|
28 ; $Logfile: C:/dos-c/src/boot/boot.asv $
|
||||||
|
29 ;
|
||||||
|
30 ; $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/loaders/boot/Attic/boot.lst,v 1.1.1.2 1998/08/25 04:27:38 rex Exp $
|
||||||
|
31 ;
|
||||||
|
32 ; $Log: boot.lst,v $
|
||||||
|
32 ; Revision 1.1.1.2 1998/08/25 04:27:38 rex
|
||||||
|
32 ; A much Needed Update
|
||||||
|
32 ;
|
||||||
|
33 ;
|
||||||
|
34 ; Rev 1.5 10 Jan 1997 4:58:06 patv
|
||||||
|
35 ; Corrected copyright
|
||||||
|
36 ;
|
||||||
|
37 ; Rev 1.4 10 Jan 1997 4:52:50 patv
|
||||||
|
38 ; Re-written to support C drive and eliminate restrictions on IPL.SYS
|
||||||
|
39 ;
|
||||||
|
40 ; Rev 1.3 29 Aug 1996 13:06:50 patv
|
||||||
|
41 ; Bug fixes for v0.91b
|
||||||
|
42 ;
|
||||||
|
43 ; Rev 1.2 01 Sep 1995 17:56:44 patv
|
||||||
|
44 ; First GPL release.
|
||||||
|
45 ;
|
||||||
|
46 ; Rev 1.1 30 Jul 1995 20:37:38 patv
|
||||||
|
47 ; Initialized stack before use.
|
||||||
|
48 ;
|
||||||
|
49 ; Rev 1.0 02 Jul 1995 10:57:52 patv
|
||||||
|
50 ; Initial revision.
|
||||||
|
51 ;
|
||||||
|
52
|
||||||
|
53 section .text
|
||||||
|
54
|
||||||
|
55 org 0
|
||||||
|
56 00000000 E93D00 Entry: jmp real_start
|
||||||
|
57
|
||||||
|
58 ; bp is initialized to 7c00h
|
||||||
|
59 %define oem [bp+3]
|
||||||
|
60 %define bytesPerSector [bp+0bh]
|
||||||
|
61 %define sectPerCluster [bp+0dh]
|
||||||
|
62 %define resSectors [bp+0eh]
|
||||||
|
63 %define nFats [bp+10h]
|
||||||
|
64 %define nRootDir [bp+11h]
|
||||||
|
65 %define nSectors [bp+13h]
|
||||||
|
66 %define MID [bp+15h]
|
||||||
|
67 %define sectPerFat [bp+16h]
|
||||||
|
68 %define sectPerTrack [bp+18h]
|
||||||
|
69 %define nHeads [bp+1ah]
|
||||||
|
70 %define nHidden [bp+1ch]
|
||||||
|
71 %define nHidden_hi [bp+1eh]
|
||||||
|
72 %define nSectorHuge [bp+20h]
|
||||||
|
73 %define drive [bp+24h]
|
||||||
|
74 %define extBoot [bp+26h]
|
||||||
|
75 %define volid [bp+27h]
|
||||||
|
76 %define vollabel [bp+2bh]
|
||||||
|
77 %define filesys 36h
|
||||||
|
78
|
||||||
|
79 LOADSEG equ 2000h
|
||||||
|
80
|
||||||
|
81 FATBUF equ 4000h ; offset of temporary buffer for FAT
|
||||||
|
82 ; chain
|
||||||
|
83 RETRYCOUNT equ 5 ; number of retries on disk errors
|
||||||
|
84
|
||||||
|
85 ; Some extra variables that are created on the stack frame
|
||||||
|
86
|
||||||
|
87 %define fat_start [bp-4] ; first FAT sector
|
||||||
|
88 %define fat_start_hi [bp-2]
|
||||||
|
89 %define root_dir_start [bp-8] ; first root directory sector
|
||||||
|
90 %define root_dir_start_hi [bp-6]
|
||||||
|
91 %define data_start [bp-12] ; first data sector
|
||||||
|
92 %define data_start_hi [bp-10]
|
||||||
|
93
|
||||||
|
94 ;
|
||||||
|
95 ; Include macros for filesystem access
|
||||||
|
96 ;
|
||||||
|
97 %include "boot.inc"
|
||||||
|
98 <1> ; To save space, functions that are just called once are
|
||||||
|
99 <1> ; implemented as macros instead. Four bytes are saved by
|
||||||
|
100 <1> ; avoiding the call / ret instructions.
|
||||||
|
101 <1>
|
||||||
|
102 <1>
|
||||||
|
103 <1> ; FINDFILE: Searches for the file in the root directory.
|
||||||
|
104 <1> ;
|
||||||
|
105 <1> ; Returns:
|
||||||
|
106 <1> ;
|
||||||
|
107 <1> ; If file not found: CF set
|
||||||
|
108 <1> ;
|
||||||
|
109 <1> ; If file found: CF clear
|
||||||
|
110 <1> ; AX = first cluster of file
|
||||||
|
111 <1>
|
||||||
|
112 <1>
|
||||||
|
113 <1> %macro FINDFILE 0
|
||||||
|
114 <1> ; First, read the whole root directory
|
||||||
|
115 <1> ; into the temporary buffer.
|
||||||
|
116 <1>
|
||||||
|
117 <1> mov ax, word root_dir_start
|
||||||
|
118 <1> mov dx, word root_dir_start_hi
|
||||||
|
119 <1> mov di, nRootDir
|
||||||
|
120 <1> xor bx, bx
|
||||||
|
121 <1> mov es, tempbuf
|
||||||
|
122 <1> call readDisk
|
||||||
|
123 <1> jc ffDone
|
||||||
|
124 <1>
|
||||||
|
125 <1> xor di, di
|
||||||
|
126 <1>
|
||||||
|
127 <1> next_entry: mov cx, 11
|
||||||
|
128 <1> mov si, filename+7c00h
|
||||||
|
129 <1> push di
|
||||||
|
130 <1> repe cmpsb
|
||||||
|
131 <1> pop di
|
||||||
|
132 <1> mov ax, [es:di+1ah] ; get cluster number from directory entry
|
||||||
|
133 <1> clc
|
||||||
|
134 <1> je ffDone
|
||||||
|
135 <1>
|
||||||
|
136 <1> add di, 20h ; go to next directory entry
|
||||||
|
137 <1> cmp byte [es:di], 0 ; if the first byte of the name is 0,
|
||||||
|
138 <1> jnz next_entry ; there is no more files in the directory
|
||||||
|
139 <1>
|
||||||
|
140 <1> stc
|
||||||
|
141 <1> ffDone:
|
||||||
|
142 <1> %endmacro
|
||||||
|
143 <1>
|
||||||
|
144 <1> ; GETDRIVEPARMS: Calculate start of some disk areas.
|
||||||
|
145 <1>
|
||||||
|
146 <1> %macro GETDRIVEPARMS 0
|
||||||
|
147 <1> mov si, word nHidden
|
||||||
|
148 <1> mov di, word nHidden_hi
|
||||||
|
149 <1> add si, word resSectors
|
||||||
|
150 <1> adc di, 0 ; DI:SI = first FAT sector
|
||||||
|
151 <1>
|
||||||
|
152 <1> mov word fat_start, si
|
||||||
|
153 <1> mov word fat_start_hi, di
|
||||||
|
154 <1>
|
||||||
|
155 <1> mov al, nFats
|
||||||
|
156 <1> xor ah, ah
|
||||||
|
157 <1> mul word sectPerFat ; DX:AX = total number of FAT sectors
|
||||||
|
158 <1>
|
||||||
|
159 <1> add si, ax
|
||||||
|
160 <1> adc di, dx ; DI:SI = first root directory sector
|
||||||
|
161 <1> mov word root_dir_start, si
|
||||||
|
162 <1> mov word root_dir_start_hi, di
|
||||||
|
163 <1>
|
||||||
|
164 <1> ; Calculate how many sectors the root directory occupies.
|
||||||
|
165 <1> mov bx, bytesPerSector
|
||||||
|
166 <1> mov cl, 5 ; divide BX by 32
|
||||||
|
167 <1> shr bx, cl ; BX = directory entries per sector
|
||||||
|
168 <1>
|
||||||
|
169 <1> mov ax, nRootDir
|
||||||
|
170 <1> xor dx, dx
|
||||||
|
171 <1> div bx
|
||||||
|
172 <1>
|
||||||
|
173 <1> mov nRootDir, ax ; AX = sectors per root directory
|
||||||
|
174 <1>
|
||||||
|
175 <1> add si, ax
|
||||||
|
176 <1> adc di, 0 ; DI:SI = first data sector
|
||||||
|
177 <1>
|
||||||
|
178 <1> mov data_start, si
|
||||||
|
179 <1> mov data_start_hi, di
|
||||||
|
180 <1> %endmacro
|
||||||
|
181 <1>
|
||||||
|
182 <1> ; GETFATCHAIN:
|
||||||
|
183 <1> ;
|
||||||
|
184 <1> ; Reads the FAT chain and stores it in a temporary buffer in the first
|
||||||
|
185 <1> ; 64 kb. The FAT chain is stored an array of 16-bit cluster numbers,
|
||||||
|
186 <1> ; ending with 0.
|
||||||
|
187 <1> ;
|
||||||
|
188 <1> ; The file must fit in conventional memory, so it can't be larger than
|
||||||
|
189 <1> ; 640 kb. The sector size must be at least 512 bytes, so the FAT chain
|
||||||
|
190 <1> ; can't be larger than around 3 kb.
|
||||||
|
191 <1> ;
|
||||||
|
192 <1> ; Call with: AX = first cluster in chain
|
||||||
|
193 <1> ;
|
||||||
|
194 <1> ; Returns: CF clear on success, set on error
|
||||||
|
195 <1>
|
||||||
|
196 <1> %macro GETFATCHAIN 0
|
||||||
|
197 <1> push ax ; store first cluster number
|
||||||
|
198 <1>
|
||||||
|
199 <1> ; Load the complete FAT into memory. The FAT can't be larger
|
||||||
|
200 <1> ; than 128 kb, so it should fit in the temporary buffer.
|
||||||
|
201 <1>
|
||||||
|
202 <1> mov es, tempbuf
|
||||||
|
203 <1> xor bx, bx
|
||||||
|
204 <1> mov di, sectPerFat
|
||||||
|
205 <1> mov ax, word fat_start
|
||||||
|
206 <1> mov dx, word fat_start_hi
|
||||||
|
207 <1> call readDisk
|
||||||
|
208 <1> pop ax ; restore first cluster number
|
||||||
|
209 <1> jc boot_error
|
||||||
|
210 <1>
|
||||||
|
211 <1> ; Set ES:DI to the temporary storage for the FAT chain.
|
||||||
|
212 <1> push ds
|
||||||
|
213 <1> push es
|
||||||
|
214 <1> pop ds
|
||||||
|
215 <1> pop es
|
||||||
|
216 <1> mov di, FATBUF
|
||||||
|
217 <1>
|
||||||
|
218 <1> next_clust: stosw ; store cluster number
|
||||||
|
219 <1> mov si, ax ; SI = cluster number
|
||||||
|
220 <1> cmp byte extBoot, 29h
|
||||||
|
221 <1> jne fat_12
|
||||||
|
222 <1> cmp byte [bp+filesys+4], '6' ; check for FAT-16 system
|
||||||
|
223 <1> je fat_16
|
||||||
|
224 <1>
|
||||||
|
225 <1> ; This is a FAT-12 disk.
|
||||||
|
226 <1>
|
||||||
|
227 <1> fat_12: add si, si ; multiply cluster number by 3...
|
||||||
|
228 <1> add si, ax
|
||||||
|
229 <1> shr si, 1 ; ...and divide by 2
|
||||||
|
230 <1> lodsw
|
||||||
|
231 <1>
|
||||||
|
232 <1> ; If the cluster number was even, the cluster value is now in
|
||||||
|
233 <1> ; bits 0-11 of AX. If the cluster number was odd, the cluster
|
||||||
|
234 <1> ; value is in bits 4-15, and must be shifted right 4 bits. If
|
||||||
|
235 <1> ; the number was odd, CF was set in the last shift instruction.
|
||||||
|
236 <1>
|
||||||
|
237 <1> jnc fat_even
|
||||||
|
238 <1> mov cl, 4
|
||||||
|
239 <1> shr ax, cl ; shift the cluster number
|
||||||
|
240 <1>
|
||||||
|
241 <1> fat_even: and ah, 0fh ; mask off the highest 4 bits
|
||||||
|
242 <1> cmp ax, 0fffh ; check for EOF
|
||||||
|
243 <1> jmp short next_test
|
||||||
|
244 <1>
|
||||||
|
245 <1> ; This is a FAT-16 disk. The maximal size of a 16-bit FAT
|
||||||
|
246 <1> ; is 128 kb, so it may not fit within a single 64 kb segment.
|
||||||
|
247 <1>
|
||||||
|
248 <1> fat_16: mov dx, tempbuf
|
||||||
|
249 <1> add si, si ; multiply cluster number by two
|
||||||
|
250 <1> jnc first_half ; if overflow...
|
||||||
|
251 <1> add dh, 10h ; ...add 64 kb to segment value
|
||||||
|
252 <1>
|
||||||
|
253 <1> first_half: mov ds, dx ; DS:SI = pointer to next cluster
|
||||||
|
254 <1> lodsw ; AX = next cluster
|
||||||
|
255 <1>
|
||||||
|
256 <1> cmp ax, 0fff8h ; >= FFF8 = 16-bit EOF
|
||||||
|
257 <1> next_test: jb next_clust ; continue if not EOF
|
||||||
|
258 <1>
|
||||||
|
259 <1> finished: ; Mark end of FAT chain with 0, so we have a single
|
||||||
|
260 <1> ; EOF marker for both FAT-12 and FAT-16 systems.
|
||||||
|
261 <1>
|
||||||
|
262 <1> xor ax, ax
|
||||||
|
263 <1> stosw
|
||||||
|
264 <1> fatError:
|
||||||
|
265 <1> %endmacro
|
||||||
|
266 <1>
|
||||||
|
267 <1>
|
||||||
|
268 <1> ; loadFile: Loads the file into memory, one cluster at a time.
|
||||||
|
269 <1>
|
||||||
|
270 <1> %macro LOADFILE 0
|
||||||
|
271 <1> mov es, tempbuf ; set ES:BX to load address
|
||||||
|
272 <1> xor bx, bx
|
||||||
|
273 <1>
|
||||||
|
274 <1> mov si, FATBUF ; set DS:SI to the FAT chain
|
||||||
|
275 <1> push cs
|
||||||
|
276 <1> pop ds
|
||||||
|
277 <1>
|
||||||
|
278 <1> next_cluster: lodsw ; AX = next cluster to read
|
||||||
|
279 <1> or ax, ax ; if EOF...
|
||||||
|
280 <1> je boot_success ; ...boot was successful
|
||||||
|
281 <1>
|
||||||
|
282 <1> dec ax ; cluster numbers start with 2
|
||||||
|
283 <1> dec ax
|
||||||
|
284 <1>
|
||||||
|
285 <1> mov di, word sectPerCluster
|
||||||
|
286 <1> and di, 0ffh ; DI = sectors per cluster
|
||||||
|
287 <1> mul di
|
||||||
|
288 <1> add ax, data_start
|
||||||
|
289 <1> adc dx, data_start_hi ; DX:AX = first sector to read
|
||||||
|
290 <1> call readDisk
|
||||||
|
291 <1> jnc next_cluster
|
||||||
|
292 <1>
|
||||||
|
293 <1> %endmacro
|
||||||
|
294
|
||||||
|
295 ;
|
||||||
|
296 ;
|
||||||
|
297 ;
|
||||||
|
298 00000003 00<rept> TIMES 3eh-($-$$) DB 0
|
||||||
|
299
|
||||||
|
300 %define tempbuf [bp+3eh]
|
||||||
|
301 0000003E 0020 load_seg dw LOADSEG
|
||||||
|
302
|
||||||
|
303 00000040 FA real_start: cli
|
||||||
|
304 00000041 FC cld
|
||||||
|
305 00000042 8CC8 mov ax, cs
|
||||||
|
306 00000044 8ED0 mov ss, ax ; initialize stack
|
||||||
|
307 00000046 BD007C mov bp, 7c00h
|
||||||
|
308 00000049 8D66E0 lea sp, [bp-20h]
|
||||||
|
309 0000004C FB sti
|
||||||
|
310
|
||||||
|
311 0000004D 8EC0 mov es, ax
|
||||||
|
312 0000004F 8ED8 mov ds, ax
|
||||||
|
313 00000051 885624 mov drive, dl ; BIOS passes drive number in DL
|
||||||
|
314
|
||||||
|
315 GETDRIVEPARMS
|
||||||
|
316 00000054 8B761C <1> mov si, word nHidden
|
||||||
|
317 00000057 8B7E1E <1> mov di, word nHidden_hi
|
||||||
|
318 0000005A 03760E <1> add si, word resSectors
|
||||||
|
319 0000005D 81D70000 <1> adc di, 0
|
||||||
|
320 <1>
|
||||||
|
321 00000061 8976FC <1> mov word fat_start, si
|
||||||
|
322 00000064 897EFE <1> mov word fat_start_hi, di
|
||||||
|
323 <1>
|
||||||
|
324 00000067 8A4610 <1> mov al, nFats
|
||||||
|
325 0000006A 30E4 <1> xor ah, ah
|
||||||
|
326 0000006C F76616 <1> mul word sectPerFat
|
||||||
|
327 <1>
|
||||||
|
328 0000006F 01C6 <1> add si, ax
|
||||||
|
329 00000071 11D7 <1> adc di, dx
|
||||||
|
330 00000073 8976F8 <1> mov word root_dir_start, si
|
||||||
|
331 00000076 897EFA <1> mov word root_dir_start_hi, di
|
||||||
|
332 <1>
|
||||||
|
333 <1>
|
||||||
|
334 00000079 8B5E0B <1> mov bx, bytesPerSector
|
||||||
|
335 0000007C B105 <1> mov cl, 5
|
||||||
|
336 0000007E D3EB <1> shr bx, cl
|
||||||
|
337 <1>
|
||||||
|
338 00000080 8B4611 <1> mov ax, nRootDir
|
||||||
|
339 00000083 31D2 <1> xor dx, dx
|
||||||
|
340 00000085 F7F3 <1> div bx
|
||||||
|
341 <1>
|
||||||
|
342 00000087 894611 <1> mov nRootDir, ax
|
||||||
|
343 <1>
|
||||||
|
344 0000008A 01C6 <1> add si, ax
|
||||||
|
345 0000008C 81D70000 <1> adc di, 0
|
||||||
|
346 <1>
|
||||||
|
347 00000090 8976F4 <1> mov data_start, si
|
||||||
|
348 00000093 897EF6 <1> mov data_start_hi, di
|
||||||
|
349
|
||||||
|
350 FINDFILE ; locate file in root directory
|
||||||
|
351 <1>
|
||||||
|
352 <1>
|
||||||
|
353 <1>
|
||||||
|
354 00000096 8B46F8 <1> mov ax, word root_dir_start
|
||||||
|
355 00000099 8B56FA <1> mov dx, word root_dir_start_hi
|
||||||
|
356 0000009C 8B7E11 <1> mov di, nRootDir
|
||||||
|
357 0000009F 31DB <1> xor bx, bx
|
||||||
|
358 000000A1 8E463E <1> mov es, tempbuf
|
||||||
|
359 000000A4 E8B900 <1> call readDisk
|
||||||
|
360 000000A7 721E <1> jc ffDone
|
||||||
|
361 <1>
|
||||||
|
362 000000A9 31FF <1> xor di, di
|
||||||
|
363 <1>
|
||||||
|
364 000000AB B90B00 <1> next_entry: mov cx, 11
|
||||||
|
365 000000AE BE[F17D] <1> mov si, filename+7c00h
|
||||||
|
366 000000B1 57 <1> push di
|
||||||
|
367 000000B2 F3A6 <1> repe cmpsb
|
||||||
|
368 000000B4 5F <1> pop di
|
||||||
|
369 000000B5 268B451A <1> mov ax, [es:di+1ah]
|
||||||
|
370 000000B9 F8 <1> clc
|
||||||
|
371 000000BA 740B <1> je ffDone
|
||||||
|
372 <1>
|
||||||
|
373 000000BC 81C72000 <1> add di, 20h
|
||||||
|
374 000000C0 26803D00 <1> cmp byte [es:di], 0
|
||||||
|
375 000000C4 75E5 <1> jnz next_entry
|
||||||
|
376 <1>
|
||||||
|
377 000000C6 F9 <1> stc
|
||||||
|
378 <1> ffDone:
|
||||||
|
379 000000C7 727A jc boot_error ; fail if not found
|
||||||
|
380
|
||||||
|
381 GETFATCHAIN ; read FAT chain
|
||||||
|
382 000000C9 50 <1> push ax
|
||||||
|
383 <1>
|
||||||
|
384 <1>
|
||||||
|
385 <1>
|
||||||
|
386 <1>
|
||||||
|
387 000000CA 8E463E <1> mov es, tempbuf
|
||||||
|
388 000000CD 31DB <1> xor bx, bx
|
||||||
|
389 000000CF 8B7E16 <1> mov di, sectPerFat
|
||||||
|
390 000000D2 8B46FC <1> mov ax, word fat_start
|
||||||
|
391 000000D5 8B56FE <1> mov dx, word fat_start_hi
|
||||||
|
392 000000D8 E88500 <1> call readDisk
|
||||||
|
393 000000DB 58 <1> pop ax
|
||||||
|
394 000000DC 7265 <1> jc boot_error
|
||||||
|
395 <1>
|
||||||
|
396 <1>
|
||||||
|
397 000000DE 1E <1> push ds
|
||||||
|
398 000000DF 06 <1> push es
|
||||||
|
399 000000E0 1F <1> pop ds
|
||||||
|
400 000000E1 07 <1> pop es
|
||||||
|
401 000000E2 BF0040 <1> mov di, FATBUF
|
||||||
|
402 <1>
|
||||||
|
403 000000E5 AB <1> next_clust: stosw
|
||||||
|
404 000000E6 89C6 <1> mov si, ax
|
||||||
|
405 000000E8 807E2629 <1> cmp byte extBoot, 29h
|
||||||
|
406 000000EC 7506 <1> jne fat_12
|
||||||
|
407 000000EE 807E3A36 <1> cmp byte [bp+filesys+4], '6'
|
||||||
|
408 000000F2 7415 <1> je fat_16
|
||||||
|
409 <1>
|
||||||
|
410 <1>
|
||||||
|
411 <1>
|
||||||
|
412 000000F4 01F6 <1> fat_12: add si, si
|
||||||
|
413 000000F6 01C6 <1> add si, ax
|
||||||
|
414 000000F8 D1EE <1> shr si, 1
|
||||||
|
415 000000FA AD <1> lodsw
|
||||||
|
416 <1>
|
||||||
|
417 <1>
|
||||||
|
418 <1>
|
||||||
|
419 <1>
|
||||||
|
420 <1>
|
||||||
|
421 <1>
|
||||||
|
422 000000FB 7304 <1> jnc fat_even
|
||||||
|
423 000000FD B104 <1> mov cl, 4
|
||||||
|
424 000000FF D3E8 <1> shr ax, cl
|
||||||
|
425 <1>
|
||||||
|
426 00000101 80E40F <1> fat_even: and ah, 0fh
|
||||||
|
427 00000104 3DFF0F <1> cmp ax, 0fffh
|
||||||
|
428 00000107 EB10 <1> jmp short next_test
|
||||||
|
429 <1>
|
||||||
|
430 <1>
|
||||||
|
431 <1>
|
||||||
|
432 <1>
|
||||||
|
433 00000109 8B563E <1> fat_16: mov dx, tempbuf
|
||||||
|
434 0000010C 01F6 <1> add si, si
|
||||||
|
435 0000010E 7303 <1> jnc first_half
|
||||||
|
436 00000110 80C610 <1> add dh, 10h
|
||||||
|
437 <1>
|
||||||
|
438 00000113 8EDA <1> first_half: mov ds, dx
|
||||||
|
439 00000115 AD <1> lodsw
|
||||||
|
440 <1>
|
||||||
|
441 00000116 3DF8FF <1> cmp ax, 0fff8h
|
||||||
|
442 00000119 72CA <1> next_test: jb next_clust
|
||||||
|
443 <1>
|
||||||
|
444 <1> finished:
|
||||||
|
445 <1>
|
||||||
|
446 <1>
|
||||||
|
447 0000011B 31C0 <1> xor ax, ax
|
||||||
|
448 0000011D AB <1> stosw
|
||||||
|
449 <1> fatError:
|
||||||
|
450 LOADFILE ; load file (jumps to boot_sucess if successful)
|
||||||
|
451 0000011E 8E463E <1> mov es, tempbuf
|
||||||
|
452 00000121 31DB <1> xor bx, bx
|
||||||
|
453 <1>
|
||||||
|
454 00000123 BE0040 <1> mov si, FATBUF
|
||||||
|
455 00000126 0E <1> push cs
|
||||||
|
456 00000127 1F <1> pop ds
|
||||||
|
457 <1>
|
||||||
|
458 00000128 AD <1> next_cluster: lodsw
|
||||||
|
459 00000129 09C0 <1> or ax, ax
|
||||||
|
460 0000012B 742B <1> je boot_success
|
||||||
|
461 <1>
|
||||||
|
462 0000012D 48 <1> dec ax
|
||||||
|
463 0000012E 48 <1> dec ax
|
||||||
|
464 <1>
|
||||||
|
465 0000012F 8B7E0D <1> mov di, word sectPerCluster
|
||||||
|
466 00000132 81E7FF00 <1> and di, 0ffh
|
||||||
|
467 00000136 F7E7 <1> mul di
|
||||||
|
468 00000138 0346F4 <1> add ax, data_start
|
||||||
|
469 0000013B 1356F6 <1> adc dx, data_start_hi
|
||||||
|
470 0000013E E81F00 <1> call readDisk
|
||||||
|
471 00000141 73E5 <1> jnc next_cluster
|
||||||
|
472 <1>
|
||||||
|
473
|
||||||
|
474 00000143 B90A00 boot_error: mov cx, ERRMSGLEN
|
||||||
|
475 00000146 BE[E77D] mov si, errmsg+7c00h
|
||||||
|
476
|
||||||
|
477 00000149 AC next_char: lodsb ; print error message
|
||||||
|
478 0000014A B40E mov ah, 0eh
|
||||||
|
479 0000014C 30FF xor bh, bh
|
||||||
|
480 0000014E CD10 int 10h
|
||||||
|
481 00000150 E2F7 loop next_char
|
||||||
|
482
|
||||||
|
483 00000152 30E4 xor ah, ah
|
||||||
|
484 00000154 CD16 int 16h ; wait for keystroke
|
||||||
|
485 00000156 CD19 int 19h ; invoke bootstrap loader
|
||||||
|
486
|
||||||
|
487 00000158 8A5624 boot_success: mov dl, drive
|
||||||
|
488
|
||||||
|
489 0000015B EA db 0eah ; far jump to LOADSEG:0000
|
||||||
|
490 0000015C 0000 dw 0
|
||||||
|
491 0000015E 0020 dw LOADSEG
|
||||||
|
492
|
||||||
|
493
|
||||||
|
494 ; readDisk: Reads a number of sectors into memory.
|
||||||
|
495 ;
|
||||||
|
496 ; Call with: DX:AX = 32-bit DOS sector number
|
||||||
|
497 ; DI = number of sectors to read
|
||||||
|
498 ; ES:BX = destination buffer
|
||||||
|
499 ; ES must be 64k aligned (1000h, 2000h etc).
|
||||||
|
500 ;
|
||||||
|
501 ; Returns: CF set on error
|
||||||
|
502 ; ES:BX points one byte after the last byte read.
|
||||||
|
503
|
||||||
|
504 readDisk:
|
||||||
|
505 00000160 56 push si
|
||||||
|
506 00000161 52 read_next: push dx
|
||||||
|
507 00000162 50 push ax
|
||||||
|
508
|
||||||
|
509 ;
|
||||||
|
510 ; translate sector number to BIOS parameters
|
||||||
|
511 ;
|
||||||
|
512
|
||||||
|
513 ;
|
||||||
|
514 ; abs = sector offset in track
|
||||||
|
515 ; + head * sectPerTrack offset in cylinder
|
||||||
|
516 ; + track * sectPerTrack * nHeads offset in platter
|
||||||
|
517 ;
|
||||||
|
518 ; t1 = abs / sectPerTrack (ax has t1)
|
||||||
|
519 ; sector = abs mod sectPerTrack (cx has sector)
|
||||||
|
520 ;
|
||||||
|
521 00000163 F77618 div word sectPerTrack
|
||||||
|
522 00000166 89D1 mov cx, dx
|
||||||
|
523
|
||||||
|
524 ;
|
||||||
|
525 ; t1 = head + track * nHeads
|
||||||
|
526 ;
|
||||||
|
527 ; track = t1 / nHeads (ax has track)
|
||||||
|
528 ; head = t1 mod nHeads (dl has head)
|
||||||
|
529 ;
|
||||||
|
530 00000168 31D2 xor dx, dx
|
||||||
|
531 0000016A F7761A div word nHeads
|
||||||
|
532
|
||||||
|
533 ; the following manipulations are necessary in order to
|
||||||
|
534 ; properly place parameters into registers.
|
||||||
|
535 ; ch = cylinder number low 8 bits
|
||||||
|
536 ; cl = 7-6: cylinder high two bits
|
||||||
|
537 ; 5-0: sector
|
||||||
|
538 0000016D 88D6 mov dh, dl ; save head into dh for bios
|
||||||
|
539 0000016F D0CC ror ah, 1 ; move track high bits into
|
||||||
|
540 00000171 D0CC ror ah, 1 ; bits 7-6 (assumes top = 0)
|
||||||
|
541 00000173 86C4 xchg al, ah ; swap for later
|
||||||
|
542 00000175 8A5618 mov dl, byte sectPerTrack
|
||||||
|
543 00000178 28CA sub dl, cl
|
||||||
|
544 0000017A FEC1 inc cl ; sector offset from 1
|
||||||
|
545 0000017C 09C1 or cx, ax ; merge cylinder into sector
|
||||||
|
546 0000017E 88D0 mov al, dl ; al has # of sectors left
|
||||||
|
547
|
||||||
|
548 ; Calculate how many sectors can be transfered in this read
|
||||||
|
549 ; due to dma boundary conditions.
|
||||||
|
550 00000180 52 push dx
|
||||||
|
551
|
||||||
|
552 00000181 89FE mov si, di ; temp register save
|
||||||
|
553 ; this computes remaining bytes because of modulo 65536
|
||||||
|
554 ; nature of dma boundary condition
|
||||||
|
555 00000183 89D8 mov ax, bx ; get offset pointer
|
||||||
|
556 00000185 F7D8 neg ax ; and convert to bytes
|
||||||
|
557 00000187 740B jz ax_min_1 ; started at seg:0, skip ahead
|
||||||
|
558
|
||||||
|
559 00000189 31D2 xor dx, dx ; convert to sectors
|
||||||
|
560 0000018B F7760B div word bytesPerSector
|
||||||
|
561
|
||||||
|
562 0000018E 39F8 cmp ax, di ; check remainder vs. asked
|
||||||
|
563 00000190 7202 jb ax_min_1 ; less, skip ahead
|
||||||
|
564 00000192 89C6 mov si, ax ; transfer only what we can
|
||||||
|
565
|
||||||
|
566 00000194 5A ax_min_1: pop dx
|
||||||
|
567
|
||||||
|
568 ; Check that request sectors do not exceed track boundary
|
||||||
|
569 00000195 8B7618 mov si, sectPerTrack
|
||||||
|
570 00000198 46 inc si
|
||||||
|
571 00000199 89C8 mov ax, cx ; get the sector/cyl byte
|
||||||
|
572 0000019B 253F00 and ax, 03fh ; and mask out sector
|
||||||
|
573 0000019E 29C6 sub si, ax ; si has how many we can read
|
||||||
|
574 000001A0 89F8 mov ax, di
|
||||||
|
575 000001A2 39FE cmp si, di ; see if asked <= available
|
||||||
|
576 000001A4 7D02 jge ax_min_2
|
||||||
|
577 000001A6 89F0 mov ax, si ; get what can be xfered
|
||||||
|
578
|
||||||
|
579 000001A8 BE0500 ax_min_2: mov si, RETRYCOUNT
|
||||||
|
580 000001AB B402 mov ah, 2
|
||||||
|
581 000001AD 8A5624 mov dl, drive
|
||||||
|
582
|
||||||
|
583 000001B0 50 retry: push ax
|
||||||
|
584 000001B1 CD13 int 13h
|
||||||
|
585 000001B3 58 pop ax
|
||||||
|
586 000001B4 7310 jnc read_ok
|
||||||
|
587 000001B6 50 push ax
|
||||||
|
588 000001B7 31C0 xor ax, ax ; reset the drive
|
||||||
|
589 000001B9 CD13 int 13h
|
||||||
|
590 000001BB 58 pop ax
|
||||||
|
591 000001BC 4E dec si
|
||||||
|
592 000001BD 75F1 jnz retry
|
||||||
|
593 000001BF F9 stc
|
||||||
|
594 000001C0 58 pop ax
|
||||||
|
595 000001C1 5A pop dx
|
||||||
|
596 000001C2 5E pop si
|
||||||
|
597 000001C3 C3 ret
|
||||||
|
598
|
||||||
|
599 000001C4 EB9B read_next_jmp: jmp short read_next
|
||||||
|
600 000001C6 30E4 read_ok: xor ah, ah
|
||||||
|
601 000001C8 89C6 mov si, ax ; AX = SI = number of sectors read
|
||||||
|
602 000001CA F7660B mul word bytesPerSector ; AX = number of bytes read
|
||||||
|
603 000001CD 01C3 add bx, ax ; add number of bytes read to BX
|
||||||
|
604 000001CF 7307 jnc no_incr_es ; if overflow...
|
||||||
|
605
|
||||||
|
606 000001D1 8CC0 mov ax, es
|
||||||
|
607 000001D3 80C410 add ah, 10h ; ...add 1000h to ES
|
||||||
|
608 000001D6 8EC0 mov es, ax
|
||||||
|
609
|
||||||
|
610 000001D8 58 no_incr_es: pop ax
|
||||||
|
611 000001D9 5A pop dx ; DX:AX = last sector number
|
||||||
|
612
|
||||||
|
613 000001DA 01F0 add ax, si
|
||||||
|
614 000001DC 81D20000 adc dx, 0 ; DX:AX = next sector to read
|
||||||
|
615 000001E0 29F7 sub di, si ; if there is anything left to read,
|
||||||
|
616 000001E2 7FE0 jg read_next_jmp ; continue
|
||||||
|
617
|
||||||
|
618 000001E4 F8 clc
|
||||||
|
619 000001E5 5E pop si
|
||||||
|
620 000001E6 C3 ret
|
||||||
|
621
|
||||||
|
622 000001E7 426F6F74206572726F- errmsg db "Boot error"
|
||||||
|
623 000001F0 72
|
||||||
|
624 ERRMSGLEN equ $ - errmsg
|
||||||
|
625
|
||||||
|
626
|
||||||
|
627 ;filename db "OSLDR BIN"
|
||||||
|
628 000001F1 4B45524E454C202042- filename db "KERNEL BIN"
|
||||||
|
629 000001FA 494E
|
||||||
|
630
|
||||||
|
631 000001FC 00<rept> TIMES 510-($-$$) DB 0
|
||||||
|
632 000001FE 55AA sign dw 0aa55h
|
||||||
|
633
|
||||||
|
634
|
||||||
|
635
|
||||||
|
636
|
||||||
|
637
|
@@ -1,12 +1,9 @@
|
|||||||
#
|
#
|
||||||
# makefile for DOS-C boot
|
# makefile for DOS-C boot
|
||||||
#
|
#
|
||||||
# $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/loaders/boot/Attic/boot.mak,v 1.3 1998/08/25 04:39:40 rex Exp $
|
# $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/loaders/boot/Attic/boot.mak,v 1.1.1.2 1998/08/25 04:27:38 rex Exp $
|
||||||
#
|
#
|
||||||
# $Log: boot.mak,v $
|
# $Log: boot.mak,v $
|
||||||
# Revision 1.3 1998/08/25 04:39:40 rex
|
|
||||||
# Release cleanup
|
|
||||||
#
|
|
||||||
# Revision 1.1.1.2 1998/08/25 04:27:38 rex
|
# Revision 1.1.1.2 1998/08/25 04:27:38 rex
|
||||||
# A much Needed Update
|
# A much Needed Update
|
||||||
#
|
#
|
||||||
@@ -56,4 +53,3 @@ clean:
|
|||||||
del *.las
|
del *.las
|
||||||
del *.obj
|
del *.obj
|
||||||
del *.exe
|
del *.exe
|
||||||
|
|
||||||
|
@@ -27,12 +27,9 @@
|
|||||||
;
|
;
|
||||||
; $Logfile: C:/dos-c/src/boot/boot.asv $
|
; $Logfile: C:/dos-c/src/boot/boot.asv $
|
||||||
;
|
;
|
||||||
; $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/loaders/boot/Attic/bootbk.asm,v 1.3 1998/08/25 04:40:47 rex Exp $
|
; $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/loaders/boot/Attic/bootbk.asm,v 1.1.1.2 1998/08/25 04:27:38 rex Exp $
|
||||||
;
|
;
|
||||||
; $Log: bootbk.asm,v $
|
; $Log: bootbk.asm,v $
|
||||||
; Revision 1.3 1998/08/25 04:40:47 rex
|
|
||||||
; Release cleanup
|
|
||||||
;
|
|
||||||
; Revision 1.1.1.2 1998/08/25 04:27:38 rex
|
; Revision 1.1.1.2 1998/08/25 04:27:38 rex
|
||||||
; A much Needed Update
|
; A much Needed Update
|
||||||
;
|
;
|
||||||
@@ -293,3 +290,5 @@ TEXT ENDS
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -567,10 +567,10 @@ l8:
|
|||||||
dw 0x00eb,0x00eb ; jmp $+2, jmp $+2
|
dw 0x00eb,0x00eb ; jmp $+2, jmp $+2
|
||||||
out 0A0h,al ; and to 8259A-2
|
out 0A0h,al ; and to 8259A-2
|
||||||
dw 0x00eb,0x00eb
|
dw 0x00eb,0x00eb
|
||||||
mov al,020h ; start of hardware int's (0x20)
|
mov al,040h ; start of hardware int's (0x20)
|
||||||
out 021h,al
|
out 021h,al
|
||||||
dw 0x00eb,0x00eb
|
dw 0x00eb,0x00eb
|
||||||
mov al,028h ; start of hardware int's 2 (0x28)
|
mov al,048h ; start of hardware int's 2 (0x28)
|
||||||
out 0A1h,al
|
out 0A1h,al
|
||||||
dw 0x00eb,0x00eb
|
dw 0x00eb,0x00eb
|
||||||
mov al,04h ; 8259-1 is master
|
mov al,04h ; 8259-1 is master
|
||||||
@@ -626,6 +626,7 @@ next:
|
|||||||
mov ss,ax
|
mov ss,ax
|
||||||
mov es,ax
|
mov es,ax
|
||||||
mov fs,ax
|
mov fs,ax
|
||||||
|
mov gs,ax
|
||||||
|
|
||||||
;
|
;
|
||||||
; Initalize eflags
|
; Initalize eflags
|
||||||
@@ -691,4 +692,3 @@ gdt:
|
|||||||
_end:
|
_end:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BIN
reactos/loaders/dos/loadros.com
Normal file
BIN
reactos/loaders/dos/loadros.com
Normal file
Binary file not shown.
@@ -5,60 +5,129 @@
|
|||||||
#
|
#
|
||||||
# Select your host
|
# Select your host
|
||||||
#
|
#
|
||||||
#HOST = djgpp-linux
|
#HOST = djgpp-linux
|
||||||
#HOST = mingw32-linux
|
#HOST = mingw32-linux
|
||||||
HOST = djgpp-msdos
|
HOST = djgpp-msdos
|
||||||
#HOST = mingw32-windows
|
#HOST = mingw32-windows
|
||||||
|
|
||||||
include rules.mak
|
include rules.mak
|
||||||
|
|
||||||
#
|
#
|
||||||
# Required to run the system
|
# Required to run the system
|
||||||
#
|
#
|
||||||
COMPONENTS = kernel lib
|
COMPONENTS = iface_native ntoskrnl kernel32 ntdll crtdll mingw32
|
||||||
|
|
||||||
#
|
#
|
||||||
# Select the loader(s) you want to build
|
# Select the server(s) you want to build
|
||||||
#
|
#
|
||||||
LOADERS = dos
|
SERVERS = win32 posix linux os2
|
||||||
|
|
||||||
#
|
#
|
||||||
# Select the modules you want
|
# Select the loader(s) you want to build
|
||||||
#
|
#
|
||||||
MODULES = parallel keyboard
|
LOADERS = dos
|
||||||
|
|
||||||
all: $(COMPONENTS) $(LOADERS) $(MODULES)
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Device driver rules
|
# Select the device drivers and filesystems you want
|
||||||
#
|
#
|
||||||
|
KERNEL_SERVICES = parallel keyboard null mouse serial sound ide test sdisk \
|
||||||
|
minix vfat
|
||||||
|
|
||||||
|
APPS = hello shell
|
||||||
|
|
||||||
|
all: $(COMPONENTS) $(LOADERS) $(KERNEL_SERVICES) $(APPS)
|
||||||
|
|
||||||
|
clean: dummy
|
||||||
|
make -C iface/native clean
|
||||||
|
|
||||||
|
#
|
||||||
|
# Applications
|
||||||
|
#
|
||||||
|
hello: dummy
|
||||||
|
make -C apps/hello
|
||||||
|
|
||||||
|
cmd: dummy
|
||||||
|
make -C apps/cmd
|
||||||
|
|
||||||
|
shell: dummy
|
||||||
|
make -C apps/shell
|
||||||
|
|
||||||
|
#
|
||||||
|
# Interfaces
|
||||||
|
#
|
||||||
|
iface_native: dummy
|
||||||
|
make -C iface/native
|
||||||
|
|
||||||
|
#
|
||||||
|
# Device driver rules
|
||||||
|
#
|
||||||
|
vfat: dummy
|
||||||
|
make -C services/fs/vfat
|
||||||
|
|
||||||
|
sdisk: dummy
|
||||||
|
make -C services/dd/sdisk
|
||||||
|
|
||||||
|
minix: dummy
|
||||||
|
make -C services/fs/minix
|
||||||
|
|
||||||
|
template: dummy
|
||||||
|
make -C services/fs/template
|
||||||
|
|
||||||
|
|
||||||
|
ide-test: dummy
|
||||||
|
make -C services/dd/ide-test
|
||||||
|
|
||||||
ide: dummy
|
ide: dummy
|
||||||
make -C services/ide
|
make -C services/dd/ide
|
||||||
|
|
||||||
|
test: dummy
|
||||||
|
make -C services/dd/test
|
||||||
|
|
||||||
|
test1: dummy
|
||||||
|
make -C services/dd/test1
|
||||||
|
|
||||||
|
null: dummy
|
||||||
|
make -C services/dd/null
|
||||||
|
|
||||||
parallel: dummy
|
parallel: dummy
|
||||||
make -C services/parallel
|
make -C services/dd/parallel
|
||||||
|
|
||||||
keyboard: dummy
|
keyboard: dummy
|
||||||
make -C services/keyboard
|
make -C services/dd/keyboard
|
||||||
|
|
||||||
mouse: dummy
|
mouse: dummy
|
||||||
make -C services/mouse
|
make -C services/dd/mouse
|
||||||
|
|
||||||
|
serial: dummy
|
||||||
|
make -C services/dd/serial
|
||||||
|
|
||||||
|
sound: dummy
|
||||||
|
make -C services/dd/sound
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kernel loaders
|
# Kernel loaders
|
||||||
#
|
#
|
||||||
|
|
||||||
dos: dummy
|
dos: dummy
|
||||||
make -C loaders/dos
|
make -C loaders/dos
|
||||||
|
|
||||||
#
|
#
|
||||||
# Required system components
|
# Required system components
|
||||||
#
|
#
|
||||||
|
|
||||||
kernel: dummy
|
ntoskrnl: dummy
|
||||||
make -C ntoskrnl
|
make -C ntoskrnl
|
||||||
|
|
||||||
lib: dummy
|
kernel32: dummy
|
||||||
make -C lib
|
make -C lib/kernel32
|
||||||
|
|
||||||
|
ntdll: dummy
|
||||||
|
make -C lib/ntdll
|
||||||
|
|
||||||
|
crtdll: dummy
|
||||||
|
make -C lib/crtdll
|
||||||
|
|
||||||
|
mingw32: dummy
|
||||||
|
make -C lib/mingw32
|
||||||
|
|
||||||
dummy:
|
dummy:
|
||||||
|
@@ -5,9 +5,9 @@
|
|||||||
#
|
#
|
||||||
# Select your host
|
# Select your host
|
||||||
#
|
#
|
||||||
#HOST = djgpp-linux
|
HOST = djgpp-linux
|
||||||
#HOST = mingw32-linux
|
#HOST = mingw32-linux
|
||||||
HOST = djgpp-msdos
|
#HOST = djgpp-msdos
|
||||||
#HOST = mingw32-windows
|
#HOST = mingw32-windows
|
||||||
|
|
||||||
include rules.mak
|
include rules.mak
|
||||||
@@ -15,7 +15,7 @@ include rules.mak
|
|||||||
#
|
#
|
||||||
# Required to run the system
|
# Required to run the system
|
||||||
#
|
#
|
||||||
COMPONENTS = kernel lib
|
COMPONENTS = iface_native ntoskrnl kernel32 ntdll crtdll mingw32
|
||||||
|
|
||||||
#
|
#
|
||||||
# Select the server(s) you want to build
|
# Select the server(s) you want to build
|
||||||
@@ -30,55 +30,79 @@ LOADERS = dos
|
|||||||
#
|
#
|
||||||
# Select the device drivers and filesystems you want
|
# Select the device drivers and filesystems you want
|
||||||
#
|
#
|
||||||
KERNEL_SERVICES = parallel keyboard null mouse serial sound ide test minix
|
KERNEL_SERVICES = parallel keyboard null mouse serial sound ide test sdisk \
|
||||||
|
minix vfat
|
||||||
|
|
||||||
all: $(COMPONENTS) $(LOADERS) $(KERNEL_SERVICES)
|
APPS = hello shell
|
||||||
|
|
||||||
|
all: $(COMPONENTS) $(LOADERS) $(KERNEL_SERVICES) $(APPS)
|
||||||
|
|
||||||
|
clean: dummy
|
||||||
|
make -C iface/native clean
|
||||||
|
|
||||||
|
#
|
||||||
|
# Applications
|
||||||
|
#
|
||||||
|
hello: dummy
|
||||||
|
make -C apps/hello
|
||||||
|
|
||||||
|
cmd: dummy
|
||||||
|
make -C apps/cmd
|
||||||
|
|
||||||
|
shell: dummy
|
||||||
|
make -C apps/shell
|
||||||
|
|
||||||
|
#
|
||||||
|
# Interfaces
|
||||||
|
#
|
||||||
|
iface_native: dummy
|
||||||
|
make -C iface/native
|
||||||
|
|
||||||
#
|
#
|
||||||
# Device driver rules
|
# Device driver rules
|
||||||
#
|
#
|
||||||
|
vfat: dummy
|
||||||
|
make -C services/fs/vfat
|
||||||
|
|
||||||
sdisk: dummy
|
sdisk: dummy
|
||||||
make -C services/sdisk
|
make -C services/dd/sdisk
|
||||||
|
|
||||||
minix: dummy
|
minix: dummy
|
||||||
make -C services/fs/minix
|
make -C services/fs/minix
|
||||||
|
|
||||||
|
template: dummy
|
||||||
|
make -C services/fs/template
|
||||||
|
|
||||||
|
|
||||||
ide-test: dummy
|
ide-test: dummy
|
||||||
make -C services/ide-test
|
make -C services/dd/ide-test
|
||||||
|
|
||||||
ide: dummy
|
ide: dummy
|
||||||
make -C services/ide
|
make -C services/dd/ide
|
||||||
|
|
||||||
test: dummy
|
test: dummy
|
||||||
make -C services/test
|
make -C services/dd/test
|
||||||
|
|
||||||
test1: dummy
|
test1: dummy
|
||||||
make -C services/test1
|
make -C services/dd/test1
|
||||||
|
|
||||||
null: dummy
|
null: dummy
|
||||||
make -C services/null
|
make -C services/dd/null
|
||||||
|
|
||||||
parallel: dummy
|
parallel: dummy
|
||||||
make -C services/parallel
|
make -C services/dd/parallel
|
||||||
|
|
||||||
keyboard: dummy
|
keyboard: dummy
|
||||||
make -C services/keyboard
|
make -C services/dd/keyboard
|
||||||
|
|
||||||
mouse: dummy
|
mouse: dummy
|
||||||
make -C services/mouse
|
make -C services/dd/mouse
|
||||||
|
|
||||||
serial: dummy
|
serial: dummy
|
||||||
make -C services/serial
|
make -C services/dd/serial
|
||||||
|
|
||||||
sound: dummy
|
sound: dummy
|
||||||
make -C services/sound
|
make -C services/dd/sound
|
||||||
|
|
||||||
ide: dummy
|
|
||||||
make -C services/ide
|
|
||||||
|
|
||||||
ide-test: dummy
|
|
||||||
make -C services/ide-test
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kernel loaders
|
# Kernel loaders
|
||||||
@@ -91,10 +115,19 @@ dos: dummy
|
|||||||
# Required system components
|
# Required system components
|
||||||
#
|
#
|
||||||
|
|
||||||
kernel: dummy
|
ntoskrnl: dummy
|
||||||
make -C ntoskrnl
|
make -C ntoskrnl
|
||||||
|
|
||||||
lib: dummy
|
kernel32: dummy
|
||||||
make -C lib
|
make -C lib/kernel32
|
||||||
|
|
||||||
|
ntdll: dummy
|
||||||
|
make -C lib/ntdll
|
||||||
|
|
||||||
|
crtdll: dummy
|
||||||
|
make -C lib/crtdll
|
||||||
|
|
||||||
|
mingw32: dummy
|
||||||
|
make -C lib/mingw32
|
||||||
|
|
||||||
dummy:
|
dummy:
|
||||||
|
@@ -16,6 +16,11 @@
|
|||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS STDCALL NtSystemDebugControl(VOID)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
VOID DbgBreakPoint(VOID)
|
VOID DbgBreakPoint(VOID)
|
||||||
{
|
{
|
||||||
__asm__("int $3\n\t");
|
__asm__("int $3\n\t");
|
||||||
|
@@ -23,9 +23,12 @@ VOID ExCallUserCallBack(PVOID fn)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID NtReturnFromCallBack(VOID)
|
NTSTATUS STDCALL NtCallbackReturn(VOID)
|
||||||
/*
|
|
||||||
* FUNCTION: Returns from a user callback
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL NtW32Call(VOID)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,28 @@
|
|||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS STDCALL NtSetSystemTime(IN PLARGE_INTEGER SystemTime,
|
||||||
|
IN PLARGE_INTEGER NewSystemTime OPTIONAL)
|
||||||
|
{
|
||||||
|
return(ZwSetSystemTime(SystemTime,NewSystemTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL ZwSetSystemTime(IN PLARGE_INTEGER SystemTime,
|
||||||
|
IN PLARGE_INTEGER NewSystemTime OPTIONAL)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL NtQuerySystemTime (OUT TIME *CurrentTime)
|
||||||
|
{
|
||||||
|
return(ZwQuerySystemTime(CurrentTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL ZwQuerySystemTime (OUT TIME *CurrentTime)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
|
VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
|
||||||
PLARGE_INTEGER SystemTime)
|
PLARGE_INTEGER SystemTime)
|
||||||
{
|
{
|
||||||
|
@@ -142,7 +142,7 @@ VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
|
|||||||
ASSERT_IRQL(DISPATCH_LEVEL);
|
ASSERT_IRQL(DISPATCH_LEVEL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Insert the item in the appropiate queue and wake on any thread
|
* Insert the item in the appropiate queue and wake up any thread
|
||||||
* waiting for something to do
|
* waiting for something to do
|
||||||
*/
|
*/
|
||||||
switch(QueueType)
|
switch(QueueType)
|
||||||
@@ -152,5 +152,5 @@ VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
|
|||||||
&normal_work_queue.Lock);
|
&normal_work_queue.Lock);
|
||||||
KeSetEvent(&normal_work_queue.Busy,IO_NO_INCREMENT,FALSE);
|
KeSetEvent(&normal_work_queue.Busy,IO_NO_INCREMENT,FALSE);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
@@ -377,3 +377,10 @@ ZwUnmapViewOfSection
|
|||||||
ZwWriteFile
|
ZwWriteFile
|
||||||
sprintf
|
sprintf
|
||||||
wcschr
|
wcschr
|
||||||
|
wcsncat
|
||||||
|
wcsncpy
|
||||||
|
wtolower
|
||||||
|
wtoupper
|
||||||
|
CbInitDccb
|
||||||
|
CbAcquireForRead
|
||||||
|
CbReleaseFromRead
|
||||||
|
@@ -18,8 +18,8 @@
|
|||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <internal/mm.h>
|
#include <internal/mm.h>
|
||||||
#include <internal/string.h>
|
#include <internal/string.h>
|
||||||
#include <internal/hal/page.h>
|
#include <internal/mmhal.h>
|
||||||
#include <internal/hal/segment.h>
|
#include <internal/i386/segment.h>
|
||||||
|
|
||||||
/* TYPES ******************************************************************/
|
/* TYPES ******************************************************************/
|
||||||
|
|
||||||
|
@@ -13,16 +13,16 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <internal/ntoskrnl.h>
|
#include <internal/ntoskrnl.h>
|
||||||
#include <internal/ke.h>
|
#include <internal/ke.h>
|
||||||
#include <internal/hal/segment.h>
|
#include <internal/i386/segment.h>
|
||||||
#include <internal/hal/page.h>
|
#include <internal/mmhal.h>
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
/* GLOBALS *****************************************************************/
|
/* GLOBALS *****************************************************************/
|
||||||
|
|
||||||
typedef unsigned int (exception_hook)(CONTEXT* c, unsigned int exp);
|
asmlinkage int page_fault_handler(unsigned int cs,
|
||||||
asmlinkage unsigned int ExHookException(exception_hook fn, UINT exp);
|
unsigned int eip);
|
||||||
|
|
||||||
extern descriptor idt[256];
|
extern descriptor idt[256];
|
||||||
static exception_hook* exception_hooks[256]={NULL,};
|
static exception_hook* exception_hooks[256]={NULL,};
|
||||||
@@ -30,43 +30,74 @@ static exception_hook* exception_hooks[256]={NULL,};
|
|||||||
#define _STR(x) #x
|
#define _STR(x) #x
|
||||||
#define STR(x) _STR(x)
|
#define STR(x) _STR(x)
|
||||||
|
|
||||||
|
extern void interrupt_handler2e(void);
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
#define EXCEPTION_HANDLER_WITH_ERROR(x,y) \
|
#define EXCEPTION_HANDLER_WITH_ERROR(x,y) \
|
||||||
void exception_handler##y (void); \
|
void exception_handler##y (void); \
|
||||||
__asm__("\n\t_exception_handler"##x":\n\t" \
|
__asm__("\n\t_exception_handler"##x":\n\t" \
|
||||||
|
"pushl %gs\n\t" \
|
||||||
|
"pushl %fs\n\t" \
|
||||||
|
"pushl %es\n\t" \
|
||||||
"pushl %ds\n\t" \
|
"pushl %ds\n\t" \
|
||||||
"pushl $"##x"\n\t" \
|
"pushl $"##x"\n\t" \
|
||||||
"pusha\n\t" \
|
"pusha\n\t" \
|
||||||
"movw $"STR(KERNEL_DS)",%ax\n\t" \
|
"movw $"STR(KERNEL_DS)",%ax\n\t" \
|
||||||
"movw %ax,%ds\n\t" \
|
"movw %ax,%ds\n\t" \
|
||||||
|
"movw %ax,%es\n\t" \
|
||||||
|
"movw %ax,%fs\n\t" \
|
||||||
|
"movw %ax,%gs\n\t" \
|
||||||
"call _exception_handler\n\t" \
|
"call _exception_handler\n\t" \
|
||||||
"popa\n\t" \
|
"popa\n\t" \
|
||||||
"addl $8,%esp\n\t" \
|
"addl $4,%esp\n\t" \
|
||||||
|
"popl %ds\n\t" \
|
||||||
|
"popl %es\n\t" \
|
||||||
|
"popl %fs\n\t" \
|
||||||
|
"popl %gs\n\t" \
|
||||||
|
"addl $4,%esp\n\t" \
|
||||||
"iret\n\t")
|
"iret\n\t")
|
||||||
|
|
||||||
#define EXCEPTION_HANDLER_WITHOUT_ERROR(x,y) \
|
#define EXCEPTION_HANDLER_WITHOUT_ERROR(x,y) \
|
||||||
asmlinkage void exception_handler##y (void); \
|
asmlinkage void exception_handler##y (void); \
|
||||||
__asm__("\n\t_exception_handler"##x":\n\t" \
|
__asm__("\n\t_exception_handler"##x":\n\t" \
|
||||||
"pushl $0\n\t" \
|
"pushl $0\n\t" \
|
||||||
|
"pushl %gs\n\t" \
|
||||||
|
"pushl %fs\n\t" \
|
||||||
|
"pushl %es\n\t" \
|
||||||
"pushl %ds\n\t" \
|
"pushl %ds\n\t" \
|
||||||
"pushl $"##x"\n\t" \
|
"pushl $"##x"\n\t" \
|
||||||
"pusha\n\t" \
|
"pusha\n\t" \
|
||||||
"movw $"STR(KERNEL_DS)",%ax\n\t" \
|
"movw $"STR(KERNEL_DS)",%ax\n\t" \
|
||||||
"movw %ax,%ds\n\t" \
|
"movw %ax,%ds\n\t" \
|
||||||
|
"movw %ax,%es\n\t" \
|
||||||
|
"movw %ax,%fs\n\t" \
|
||||||
|
"movw %ax,%gs\n\t" \
|
||||||
"call _exception_handler\n\t" \
|
"call _exception_handler\n\t" \
|
||||||
"popa\n\t" \
|
"popa\n\t" \
|
||||||
"addl $8,%esp\n\t" \
|
"addl $4,%esp\n\t" \
|
||||||
|
"popl %ds\n\t" \
|
||||||
|
"popl %es\n\t" \
|
||||||
|
"popl %fs\n\t" \
|
||||||
|
"popl %gs\n\t" \
|
||||||
|
"addl $4,%esp\n\t" \
|
||||||
"iret\n\t")
|
"iret\n\t")
|
||||||
|
|
||||||
asmlinkage void exception_handler_unknown(void);
|
asmlinkage void exception_handler_unknown(void);
|
||||||
__asm__("\n\t_exception_handler_unknown:\n\t"
|
__asm__("\n\t_exception_handler_unknown:\n\t"
|
||||||
"pushl $0\n\t"
|
"pushl $0\n\t"
|
||||||
|
"pushl %gs\n\t"
|
||||||
|
"pushl %fs\n\t"
|
||||||
|
"pushl %es\n\t"
|
||||||
|
"pushl %ds\n\t"
|
||||||
"pushl %ds\n\t"
|
"pushl %ds\n\t"
|
||||||
"pushl $0xff\n\t"
|
"pushl $0xff\n\t"
|
||||||
"pusha\n\t"
|
"pusha\n\t"
|
||||||
"movw $"STR(KERNEL_DS)",%ax\n\t"
|
"movw $"STR(KERNEL_DS)",%ax\n\t"
|
||||||
"movw %ax,%ds\n\t"
|
"movw %ax,%ds\n\t"
|
||||||
|
"movw %ax,%es\n\t"
|
||||||
|
"movw %ax,%fs\n\t"
|
||||||
|
"movw %ax,%gs\n\t"
|
||||||
"call _exception_handler\n\t"
|
"call _exception_handler\n\t"
|
||||||
"popa\n\t"
|
"popa\n\t"
|
||||||
"addl $8,%esp\n\t"
|
"addl $8,%esp\n\t"
|
||||||
@@ -87,14 +118,7 @@ EXCEPTION_HANDLER_WITH_ERROR("10",10);
|
|||||||
EXCEPTION_HANDLER_WITH_ERROR("11",11);
|
EXCEPTION_HANDLER_WITH_ERROR("11",11);
|
||||||
EXCEPTION_HANDLER_WITH_ERROR("12",12);
|
EXCEPTION_HANDLER_WITH_ERROR("12",12);
|
||||||
EXCEPTION_HANDLER_WITH_ERROR("13",13);
|
EXCEPTION_HANDLER_WITH_ERROR("13",13);
|
||||||
|
EXCEPTION_HANDLER_WITH_ERROR("14",14);
|
||||||
/*
|
|
||||||
* The page fault handler is defined by the memory managment because it is
|
|
||||||
* special
|
|
||||||
*/
|
|
||||||
//EXCEPTION_HANDLER_WITH_ERROR("14",14);
|
|
||||||
asmlinkage void exception_handler14(void);
|
|
||||||
|
|
||||||
EXCEPTION_HANDLER_WITH_ERROR("15",15);
|
EXCEPTION_HANDLER_WITH_ERROR("15",15);
|
||||||
EXCEPTION_HANDLER_WITHOUT_ERROR("16",16);
|
EXCEPTION_HANDLER_WITHOUT_ERROR("16",16);
|
||||||
|
|
||||||
@@ -104,9 +128,12 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||||||
unsigned int esi, unsigned int ebp,
|
unsigned int esi, unsigned int ebp,
|
||||||
unsigned int esp, unsigned int ebx,
|
unsigned int esp, unsigned int ebx,
|
||||||
unsigned int edx, unsigned int ecx,
|
unsigned int edx, unsigned int ecx,
|
||||||
unsigned int eax,
|
unsigned int eax,
|
||||||
unsigned int type,
|
unsigned int type,
|
||||||
unsigned int ds,
|
unsigned int ds,
|
||||||
|
unsigned int es,
|
||||||
|
unsigned int fs,
|
||||||
|
unsigned int gs,
|
||||||
unsigned int error_code,
|
unsigned int error_code,
|
||||||
unsigned int eip,
|
unsigned int eip,
|
||||||
unsigned int cs, unsigned int eflags,
|
unsigned int cs, unsigned int eflags,
|
||||||
@@ -124,6 +151,19 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||||||
|
|
||||||
__asm__("cli\n\t");
|
__asm__("cli\n\t");
|
||||||
|
|
||||||
|
if (type==14)
|
||||||
|
{
|
||||||
|
if (page_fault_handler(cs&0xffff,eip))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (type==1)
|
||||||
|
{
|
||||||
|
DbgPrint("Trap at CS:EIP %x:%x\n",cs&0xffff,eip);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Activate any hook for the exception
|
* Activate any hook for the exception
|
||||||
*/
|
*/
|
||||||
@@ -137,6 +177,8 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||||||
*/
|
*/
|
||||||
printk("Exception: %d(%x)\n",type,error_code&0xffff);
|
printk("Exception: %d(%x)\n",type,error_code&0xffff);
|
||||||
printk("CS:EIP %x:%x\n",cs&0xffff,eip);
|
printk("CS:EIP %x:%x\n",cs&0xffff,eip);
|
||||||
|
printk("DS %x ES %x FS %x GS %x\n",ds&0xffff,es&0xffff,fs&0xffff,
|
||||||
|
gs&0xfff);
|
||||||
// for(;;);
|
// for(;;);
|
||||||
printk("EAX: %.8x EBX: %.8x ECX: %.8x\n",eax,ebx,ecx);
|
printk("EAX: %.8x EBX: %.8x ECX: %.8x\n",eax,ebx,ecx);
|
||||||
printk("EDX: %.8x EBP: %.8x ESI: %.8x\n",edx,ebp,esi);
|
printk("EDX: %.8x EBP: %.8x ESI: %.8x\n",edx,ebp,esi);
|
||||||
@@ -145,6 +187,10 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||||||
{
|
{
|
||||||
printk("ESP %.8x\n",esp);
|
printk("ESP %.8x\n",esp);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printk("ESP %.8x\n",esp);
|
||||||
|
}
|
||||||
|
|
||||||
__asm__("movl %%cr2,%0\n\t"
|
__asm__("movl %%cr2,%0\n\t"
|
||||||
: "=d" (cr2));
|
: "=d" (cr2));
|
||||||
@@ -181,6 +227,15 @@ asmlinkage void exception_handler(unsigned int edi,
|
|||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_system_call_gate(unsigned int sel, unsigned int func)
|
||||||
|
{
|
||||||
|
DPRINT("sel %x %d\n",sel,sel);
|
||||||
|
idt[sel].a = (((int)func)&0xffff) +
|
||||||
|
(KERNEL_CS << 16);
|
||||||
|
idt[sel].b = 0xef00 + (((int)func)&0xffff0000);
|
||||||
|
DPRINT("idt[sel].b %x\n",idt[sel].b);
|
||||||
|
}
|
||||||
|
|
||||||
static void set_interrupt_gate(unsigned int sel, unsigned int func)
|
static void set_interrupt_gate(unsigned int sel, unsigned int func)
|
||||||
{
|
{
|
||||||
idt[sel].a = (((int)func)&0xffff) +
|
idt[sel].a = (((int)func)&0xffff) +
|
||||||
@@ -232,4 +287,6 @@ asmlinkage void KeInitExceptions(void)
|
|||||||
{
|
{
|
||||||
set_interrupt_gate(i,(int)exception_handler_unknown);
|
set_interrupt_gate(i,(int)exception_handler_unknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_system_call_gate(0x2e,(int)interrupt_handler2e);
|
||||||
}
|
}
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
#include <internal/linkage.h>
|
#include <internal/linkage.h>
|
||||||
#include <internal/string.h>
|
#include <internal/string.h>
|
||||||
|
|
||||||
#include <internal/hal/segment.h>
|
#include <internal/i386/segment.h>
|
||||||
#include <internal/hal/io.h>
|
#include <internal/hal/io.h>
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
/* GLOBALS *****************************************************************/
|
/* GLOBALS *****************************************************************/
|
||||||
|
|
||||||
#define NR_IRQS (16)
|
#define NR_IRQS (16)
|
||||||
#define IRQ_BASE (0x20)
|
#define IRQ_BASE (0x40)
|
||||||
|
|
||||||
asmlinkage void irq_handler_0(void);
|
asmlinkage void irq_handler_0(void);
|
||||||
asmlinkage void irq_handler_1(void);
|
asmlinkage void irq_handler_1(void);
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: mkernel/hal/irql.c
|
* FILE: ntoskrnl/hal/x86/irql.c
|
||||||
* PURPOSE: Implements IRQLs
|
* PURPOSE: Implements IRQLs
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
* PROGRAMMER: David Welch (welch@mcmail.com)
|
||||||
*/
|
*/
|
||||||
@@ -118,12 +118,12 @@ VOID KeRaiseIrql(KIRQL NewIrql, PKIRQL OldIrql)
|
|||||||
/*
|
/*
|
||||||
* sanity check
|
* sanity check
|
||||||
*/
|
*/
|
||||||
DPRINT("CurrentIrql %x NewIrql %x OldIrql %x\n",CurrentIrql,NewIrql,
|
DPRINT("CurrentIrql %x NewIrql %x OldIrql %x\n",CurrentIrql,NewIrql,
|
||||||
OldIrql);
|
OldIrql);
|
||||||
if (NewIrql < CurrentIrql)
|
if (NewIrql < CurrentIrql)
|
||||||
{
|
{
|
||||||
DbgPrint("%s:%d CurrentIrql %x NewIrql %x OldIrql %x\n",__FILE__,__LINE__,
|
DbgPrint("%s:%d CurrentIrql %x NewIrql %x OldIrql %x\n",
|
||||||
CurrentIrql,NewIrql,OldIrql);
|
__FILE__,__LINE__,CurrentIrql,NewIrql,OldIrql);
|
||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,205 +0,0 @@
|
|||||||
.file "irql.c"
|
|
||||||
gcc2_compiled.:
|
|
||||||
___gnu_compiled_c:
|
|
||||||
.globl _CurrentIrql
|
|
||||||
.data
|
|
||||||
_CurrentIrql:
|
|
||||||
.byte 19
|
|
||||||
.text
|
|
||||||
.p2align 2
|
|
||||||
_pic_get_current_mask:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
/APP
|
|
||||||
inb $33,%al
|
|
||||||
outb %al,$0x80
|
|
||||||
inb $161,%al
|
|
||||||
outb %al,$0x80
|
|
||||||
/NO_APP
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
.p2align 2
|
|
||||||
_pic_set_current_mask:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
movl 8(%ebp),%eax
|
|
||||||
/APP
|
|
||||||
outb %al,$33
|
|
||||||
outb %al,$0x80
|
|
||||||
/NO_APP
|
|
||||||
shrl $8,%eax
|
|
||||||
/APP
|
|
||||||
outb %al,$161
|
|
||||||
outb %al,$0x80
|
|
||||||
/NO_APP
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
.p2align 2
|
|
||||||
_switch_irql:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
subl $4,%esp
|
|
||||||
pushl %ebx
|
|
||||||
movb _CurrentIrql,%al
|
|
||||||
cmpb $19,%al
|
|
||||||
jne L62
|
|
||||||
pushl $65535
|
|
||||||
call _pic_set_current_mask
|
|
||||||
jmp L61
|
|
||||||
.align 2,0x90
|
|
||||||
L62:
|
|
||||||
cmpb $2,%al
|
|
||||||
jbe L71
|
|
||||||
movl $0,-4(%ebp)
|
|
||||||
movzbl _CurrentIrql,%eax
|
|
||||||
leal -2(%eax),%edx
|
|
||||||
cmpl $2,%edx
|
|
||||||
jbe L65
|
|
||||||
movl $16,%ebx
|
|
||||||
leal -4(%ebp),%ecx
|
|
||||||
.align 2,0x90
|
|
||||||
L67:
|
|
||||||
movl %ebx,%eax
|
|
||||||
subl %edx,%eax
|
|
||||||
/APP
|
|
||||||
btsl %eax,(%ecx)
|
|
||||||
sbbl %eax,%eax
|
|
||||||
/NO_APP
|
|
||||||
decl %edx
|
|
||||||
cmpl $2,%edx
|
|
||||||
ja L67
|
|
||||||
L65:
|
|
||||||
pushl -4(%ebp)
|
|
||||||
call _pic_set_current_mask
|
|
||||||
/APP
|
|
||||||
sti
|
|
||||||
|
|
||||||
/NO_APP
|
|
||||||
jmp L61
|
|
||||||
.align 2,0x90
|
|
||||||
L71:
|
|
||||||
pushl $0
|
|
||||||
call _pic_set_current_mask
|
|
||||||
/APP
|
|
||||||
sti
|
|
||||||
|
|
||||||
/NO_APP
|
|
||||||
L61:
|
|
||||||
movl -8(%ebp),%ebx
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
.p2align 2
|
|
||||||
.globl _KeSetCurrentIrql
|
|
||||||
_KeSetCurrentIrql:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
movl 8(%ebp),%eax
|
|
||||||
movb %al,_CurrentIrql
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
.p2align 2
|
|
||||||
.globl _KeGetCurrentIrql
|
|
||||||
_KeGetCurrentIrql:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
movzbl _CurrentIrql,%eax
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
LC0:
|
|
||||||
.ascii "irql.c\0"
|
|
||||||
LC1:
|
|
||||||
.ascii "(%s:%d) \0"
|
|
||||||
LC2:
|
|
||||||
.ascii "NewIrql %x CurrentIrql %x\12\0"
|
|
||||||
LC3:
|
|
||||||
.ascii "Assertion NewIrql <= CurrentIrql failed at %s:%d\12\0"
|
|
||||||
.p2align 2
|
|
||||||
.globl _KeLowerIrql
|
|
||||||
_KeLowerIrql:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
pushl %ebx
|
|
||||||
movb 8(%ebp),%bl
|
|
||||||
/APP
|
|
||||||
cli
|
|
||||||
|
|
||||||
/NO_APP
|
|
||||||
pushl $103
|
|
||||||
pushl $LC0
|
|
||||||
pushl $LC1
|
|
||||||
call _printk
|
|
||||||
movzbl _CurrentIrql,%eax
|
|
||||||
pushl %eax
|
|
||||||
movzbl %bl,%eax
|
|
||||||
pushl %eax
|
|
||||||
pushl $LC2
|
|
||||||
call _printk
|
|
||||||
addl $24,%esp
|
|
||||||
cmpb %bl,_CurrentIrql
|
|
||||||
jae L79
|
|
||||||
pushl $104
|
|
||||||
pushl $LC0
|
|
||||||
pushl $LC3
|
|
||||||
call _printk
|
|
||||||
.align 2,0x90
|
|
||||||
L82:
|
|
||||||
jmp L82
|
|
||||||
.align 2,0x90
|
|
||||||
L79:
|
|
||||||
movb %bl,_CurrentIrql
|
|
||||||
call _switch_irql
|
|
||||||
movl -4(%ebp),%ebx
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
LC4:
|
|
||||||
.ascii "%s:%d\12\0"
|
|
||||||
LC5:
|
|
||||||
.ascii "NewIrql %x OldIrql %x CurrentIrql %x\12\0"
|
|
||||||
.p2align 2
|
|
||||||
.globl _KeRaiseIrql
|
|
||||||
_KeRaiseIrql:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
pushl %esi
|
|
||||||
pushl %ebx
|
|
||||||
movl 12(%ebp),%esi
|
|
||||||
movb 8(%ebp),%al
|
|
||||||
cmpb %al,_CurrentIrql
|
|
||||||
jbe L84
|
|
||||||
pushl $122
|
|
||||||
pushl $LC0
|
|
||||||
pushl $LC4
|
|
||||||
call _printk
|
|
||||||
.align 2,0x90
|
|
||||||
L87:
|
|
||||||
jmp L87
|
|
||||||
.align 2,0x90
|
|
||||||
L84:
|
|
||||||
/APP
|
|
||||||
cli
|
|
||||||
|
|
||||||
/NO_APP
|
|
||||||
movzbl %al,%ebx
|
|
||||||
pushl %ebx
|
|
||||||
pushl $_CurrentIrql
|
|
||||||
call _InterlockedExchange
|
|
||||||
movb %al,(%esi)
|
|
||||||
pushl $129
|
|
||||||
pushl $LC0
|
|
||||||
pushl $LC1
|
|
||||||
call _printk
|
|
||||||
movzbl _CurrentIrql,%eax
|
|
||||||
pushl %eax
|
|
||||||
movzbl (%esi),%eax
|
|
||||||
pushl %eax
|
|
||||||
pushl %ebx
|
|
||||||
pushl $LC5
|
|
||||||
call _printk
|
|
||||||
addl $28,%esp
|
|
||||||
call _switch_irql
|
|
||||||
leal -8(%ebp),%esp
|
|
||||||
popl %ebx
|
|
||||||
popl %esi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
.comm ___ProcessHeap,4
|
|
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
BOOL HalIsaProbe()
|
BOOL HalIsaProbe(VOID)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Probes for an ISA bus
|
* FUNCTION: Probes for an ISA bus
|
||||||
* RETURNS: True if detected
|
* RETURNS: True if detected
|
||||||
@@ -28,5 +28,5 @@ BOOL HalIsaProbe()
|
|||||||
/*
|
/*
|
||||||
* Probe for plug and play support
|
* Probe for plug and play support
|
||||||
*/
|
*/
|
||||||
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
/* INCLUDES ***************************************************************/
|
/* INCLUDES ***************************************************************/
|
||||||
|
|
||||||
#include <internal/hal/page.h>
|
#include <internal/mmhal.h>
|
||||||
#include <internal/mm.h>
|
#include <internal/mm.h>
|
||||||
#include <internal/string.h>
|
#include <internal/string.h>
|
||||||
#include <internal/bitops.h>
|
#include <internal/bitops.h>
|
||||||
@@ -29,6 +29,81 @@
|
|||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
|
static ULONG ProtectToPTE(ULONG flProtect)
|
||||||
|
{
|
||||||
|
ULONG Attributes = 0;
|
||||||
|
|
||||||
|
if (flProtect & PAGE_NOACCESS || flProtect & PAGE_GUARD)
|
||||||
|
{
|
||||||
|
Attributes = 0;
|
||||||
|
}
|
||||||
|
if (flProtect & PAGE_READWRITE || flProtect & PAGE_EXECUTE_READWRITE)
|
||||||
|
{
|
||||||
|
Attributes = PA_WRITE;
|
||||||
|
}
|
||||||
|
if (flProtect & PAGE_READONLY || flProtect & PAGE_EXECUTE ||
|
||||||
|
flProtect & PAGE_EXECUTE_READ)
|
||||||
|
{
|
||||||
|
Attributes = PA_READ;
|
||||||
|
}
|
||||||
|
return(Attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
PULONG MmGetPageEntry(PEPROCESS Process, ULONG Address)
|
||||||
|
{
|
||||||
|
unsigned int page_table;
|
||||||
|
unsigned int* page_tlb;
|
||||||
|
unsigned int* page_dir = linear_to_physical(
|
||||||
|
Process->Pcb.PageTableDirectory);
|
||||||
|
|
||||||
|
DPRINT("vaddr %x ",vaddr);
|
||||||
|
page_tlb = (unsigned int *)physical_to_linear(
|
||||||
|
PAGE_MASK(page_dir[VADDR_TO_PD_OFFSET(Address)]));
|
||||||
|
DPRINT("page_tlb %x\n",page_tlb);
|
||||||
|
|
||||||
|
if (PAGE_MASK(page_dir[VADDR_TO_PD_OFFSET(Address)])==0)
|
||||||
|
{
|
||||||
|
DPRINT("Creating new page directory\n",0);
|
||||||
|
page_table = get_free_page(); // Returns a physical address
|
||||||
|
page_tlb=(unsigned int *)physical_to_linear(page_table);
|
||||||
|
memset(page_tlb,0,PAGESIZE);
|
||||||
|
page_dir[VADDR_TO_PD_OFFSET(Address)]=page_table+0x7;
|
||||||
|
|
||||||
|
}
|
||||||
|
return(&page_tlb[VADDR_TO_PT_OFFSET(Address)/4]);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN MmIsPagePresent(PEPROCESS Process, PVOID Address)
|
||||||
|
{
|
||||||
|
return((*MmGetPageEntry(Process, Address)) & PA_PRESENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID MmSetPage(PEPROCESS Process,
|
||||||
|
PVOID Address,
|
||||||
|
ULONG flProtect,
|
||||||
|
ULONG PhysicalAddress)
|
||||||
|
{
|
||||||
|
|
||||||
|
ULONG Attributes = 0;
|
||||||
|
|
||||||
|
Attributes = ProtectToPTE(flProtect);
|
||||||
|
|
||||||
|
(*MmGetPageEntry(Process, Address)) = PhysicalAddress | Attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID MmSetPageProtect(PEPROCESS Process,
|
||||||
|
PVOID Address,
|
||||||
|
ULONG flProtect)
|
||||||
|
{
|
||||||
|
ULONG Attributes = 0;
|
||||||
|
PULONG PageEntry;
|
||||||
|
|
||||||
|
Attributes = ProtectToPTE(flProtect);
|
||||||
|
|
||||||
|
PageEntry = MmGetPageEntry(Process,Address);
|
||||||
|
(*PageEntry) = PAGE_MASK(*PageEntry) | Attributes;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The mark_page_xxxx manipulate the attributes of a page. Use the
|
* The mark_page_xxxx manipulate the attributes of a page. Use the
|
||||||
* higher level functions for synchronization. These functions only work
|
* higher level functions for synchronization. These functions only work
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: mkernel/hal/eisa.c
|
* FILE: ntoskrnl/hal/x86/pci.c
|
||||||
* PURPOSE: Interfaces to the PCI bus
|
* PURPOSE: Interfaces to the PCI bus
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
* PROGRAMMER: David Welch (welch@mcmail.com)
|
||||||
* UPDATE HISTORY:
|
* UPDATE HISTORY:
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
#include <internal/ntoskrnl.h>
|
#include <internal/ntoskrnl.h>
|
||||||
#include <internal/string.h>
|
#include <internal/string.h>
|
||||||
#include <internal/hal/page.h>
|
#include <internal/mmhal.h>
|
||||||
#include <internal/hal/io.h>
|
#include <internal/hal/io.h>
|
||||||
|
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
@@ -66,6 +66,7 @@ static unsigned char mode03[] = {0x67,0x00,0x03,0x00,0x03,0x00,0x02,
|
|||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
|
|
||||||
void HalSwitchToBlueScreen(void)
|
void HalSwitchToBlueScreen(void)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Switches the monitor to text mode and writes a blue background
|
* FUNCTION: Switches the monitor to text mode and writes a blue background
|
||||||
@@ -94,6 +95,14 @@ void HalSwitchToBlueScreen(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS STDCALL NtDisplayString(IN PUNICODE_STRING DisplayString)
|
||||||
|
{
|
||||||
|
// DbgPrint("DisplayString %x\n",DisplayString);
|
||||||
|
DbgPrint("%s",DisplayString);
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
void HalDisplayString(char* string)
|
void HalDisplayString(char* string)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Switches the screen to HAL console mode (BSOD) if not there
|
* FUNCTION: Switches the screen to HAL console mode (BSOD) if not there
|
||||||
|
@@ -2,4 +2,4 @@ HAL_OBJECTS = hal/x86/head.o hal/x86/irq.o hal/x86/exp.o hal/x86/isa.o \
|
|||||||
hal/x86/pci.o hal/x86/irqhand.o hal/x86/page.o hal/x86/halinit.o \
|
hal/x86/pci.o hal/x86/irqhand.o hal/x86/page.o hal/x86/halinit.o \
|
||||||
hal/x86/irql.o hal/x86/bios32.o hal/x86/thread.o hal/x86/spinlock.o \
|
hal/x86/irql.o hal/x86/bios32.o hal/x86/thread.o hal/x86/spinlock.o \
|
||||||
hal/x86/printk.o hal/x86/mp.o hal/x86/dma.o hal/x86/bus.o hal/x86/mbr.o \
|
hal/x86/printk.o hal/x86/mp.o hal/x86/dma.o hal/x86/bus.o hal/x86/mbr.o \
|
||||||
hal/x86/sysinfo.o
|
hal/x86/sysinfo.o hal/x86/usercall.o
|
||||||
|
@@ -16,8 +16,8 @@
|
|||||||
#include <internal/ps.h>
|
#include <internal/ps.h>
|
||||||
#include <internal/string.h>
|
#include <internal/string.h>
|
||||||
#include <internal/hal.h>
|
#include <internal/hal.h>
|
||||||
#include <internal/hal/segment.h>
|
#include <internal/i386/segment.h>
|
||||||
#include <internal/hal/page.h>
|
#include <internal/mmhal.h>
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
static char null_ldt[8]={0,};
|
static char null_ldt[8]={0,};
|
||||||
static unsigned int null_ldt_sel=0;
|
static unsigned int null_ldt_sel=0;
|
||||||
static PKTHREAD FirstThread=NULL;
|
static PETHREAD FirstThread=NULL;
|
||||||
|
|
||||||
/* FUNCTIONS **************************************************************/
|
/* FUNCTIONS **************************************************************/
|
||||||
|
|
||||||
@@ -42,6 +42,7 @@ void HalTaskSwitch(PKTHREAD thread)
|
|||||||
* again
|
* again
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
|
DPRINT("Scheduling thread %x\n",thread);
|
||||||
DPRINT("Scheduling thread %x\n",thread->Context.nr);
|
DPRINT("Scheduling thread %x\n",thread->Context.nr);
|
||||||
DPRINT("previous task %x reserved1 %x esp0 %x ss0 %x\n",
|
DPRINT("previous task %x reserved1 %x esp0 %x ss0 %x\n",
|
||||||
thread->Context.previous_task,thread->Context.reserved1,
|
thread->Context.previous_task,thread->Context.reserved1,
|
||||||
@@ -75,7 +76,6 @@ void HalTaskSwitch(PKTHREAD thread)
|
|||||||
: /* No outputs */
|
: /* No outputs */
|
||||||
: "m" (*(((unsigned char *)(&(thread->Context.nr)))-4) )
|
: "m" (*(((unsigned char *)(&(thread->Context.nr)))-4) )
|
||||||
: "ax","dx");
|
: "ax","dx");
|
||||||
// set_breakpoint(0,&(FirstThread->Context.gs),HBP_READWRITE,HBP_DWORD);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int allocate_tss_descriptor(void)
|
static unsigned int allocate_tss_descriptor(void)
|
||||||
@@ -114,8 +114,129 @@ static void begin_thread(PKSTART_ROUTINE fn, PVOID start_context)
|
|||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
#define FLAG_NT (1<<14)
|
||||||
PVOID StartContext)
|
#define FLAG_VM (1<<17)
|
||||||
|
#define FLAG_IF (1<<9)
|
||||||
|
#define FLAG_IOPL ((1<<12)+(1<<13))
|
||||||
|
|
||||||
|
NTSTATUS KeValidateUserContext(PCONTEXT Context)
|
||||||
|
/*
|
||||||
|
* FUNCTION: Validates a processor context
|
||||||
|
* ARGUMENTS:
|
||||||
|
* Context = Context to validate
|
||||||
|
* RETURNS: Status
|
||||||
|
* NOTE: This only validates the context as not violating system security, it
|
||||||
|
* doesn't guararantee the thread won't crash at some point
|
||||||
|
* NOTE2: This relies on there only being two selectors which can access
|
||||||
|
* system space
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
if (Context->Eip >= KERNEL_BASE)
|
||||||
|
{
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
if (Context->SegCs == KERNEL_CS)
|
||||||
|
{
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
if (Context->SegDs == KERNEL_DS)
|
||||||
|
{
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
if (Context->SegEs == KERNEL_DS)
|
||||||
|
{
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
if (Context->SegFs == KERNEL_DS)
|
||||||
|
{
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
if (Context->SegGs == KERNEL_DS)
|
||||||
|
{
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
if ((Context->EFlags & FLAG_IOPL) != 0 ||
|
||||||
|
(Context->EFlags & FLAG_NT) ||
|
||||||
|
(Context->EFlags & FLAG_VM) ||
|
||||||
|
(!(Context->EFlags & FLAG_IF)))
|
||||||
|
{
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context)
|
||||||
|
/*
|
||||||
|
* FUNCTION: Initialize a task with a user mode context
|
||||||
|
* ARGUMENTS:
|
||||||
|
* Thread = Thread to initialize
|
||||||
|
* Context = Processor context to initialize it with
|
||||||
|
* RETURNS: Status
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
unsigned int desc;
|
||||||
|
unsigned int length;
|
||||||
|
unsigned int base;
|
||||||
|
unsigned int* kernel_stack;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
DPRINT("HalInitTaskWithContext(Thread %x, Context %x)\n",
|
||||||
|
Thread,Context);
|
||||||
|
|
||||||
|
assert(sizeof(hal_thread_state)>=0x68);
|
||||||
|
|
||||||
|
if ((Status=KeValidateUserContext(Context))!=STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = allocate_tss_descriptor();
|
||||||
|
length = sizeof(hal_thread_state) - 1;
|
||||||
|
base = (unsigned int)(&(Thread->Tcb.Context));
|
||||||
|
kernel_stack = ExAllocatePool(NonPagedPool,PAGESIZE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup a TSS descriptor
|
||||||
|
*/
|
||||||
|
gdt[desc].a = (length & 0xffff) | ((base & 0xffff) << 16);
|
||||||
|
gdt[desc].b = ((base & 0xff0000)>>16) | 0x8900 | (length & 0xf0000)
|
||||||
|
| (base & 0xff000000);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the thread context
|
||||||
|
*/
|
||||||
|
memset(&Thread->Tcb.Context,0,sizeof(hal_thread_state));
|
||||||
|
Thread->Tcb.Context.ldt = null_ldt_sel;
|
||||||
|
Thread->Tcb.Context.eflags = Context->EFlags;
|
||||||
|
Thread->Tcb.Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
|
||||||
|
Thread->Tcb.Context.esp0 = (ULONG)&kernel_stack[1021];
|
||||||
|
Thread->Tcb.Context.ss0 = KERNEL_DS;
|
||||||
|
Thread->Tcb.Context.esp = Context->Esp;
|
||||||
|
Thread->Tcb.Context.ss = Context->SegSs;
|
||||||
|
Thread->Tcb.Context.cs = Context->SegCs;
|
||||||
|
Thread->Tcb.Context.eip = Context->Eip;
|
||||||
|
Thread->Tcb.Context.io_bitmap[0] = 0xff;
|
||||||
|
Thread->Tcb.Context.cr3 =
|
||||||
|
linear_to_physical(Thread->ThreadsProcess->Pcb.PageTableDirectory);
|
||||||
|
Thread->Tcb.Context.ds = Context->SegDs;
|
||||||
|
Thread->Tcb.Context.es = Context->SegEs;
|
||||||
|
Thread->Tcb.Context.fs = Context->SegFs;
|
||||||
|
Thread->Tcb.Context.gs = Context->SegGs;
|
||||||
|
Thread->Tcb.Context.eax = Context->Eax;
|
||||||
|
Thread->Tcb.Context.ebx = Context->Ebx;
|
||||||
|
Thread->Tcb.Context.ecx = Context->Ecx;
|
||||||
|
Thread->Tcb.Context.edx = Context->Edx;
|
||||||
|
Thread->Tcb.Context.edi = Context->Edi;
|
||||||
|
Thread->Tcb.Context.esi = Context->Esi;
|
||||||
|
Thread->Tcb.Context.ebp = Context->Ebp;
|
||||||
|
|
||||||
|
Thread->Tcb.Context.nr = desc * 8;
|
||||||
|
DPRINT("Allocated %x\n",desc*8);
|
||||||
|
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Initializes the HAL portion of a thread object
|
* FUNCTION: Initializes the HAL portion of a thread object
|
||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
@@ -127,12 +248,13 @@ BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
|||||||
{
|
{
|
||||||
unsigned int desc = allocate_tss_descriptor();
|
unsigned int desc = allocate_tss_descriptor();
|
||||||
unsigned int length = sizeof(hal_thread_state) - 1;
|
unsigned int length = sizeof(hal_thread_state) - 1;
|
||||||
unsigned int base = (unsigned int)(&(thread->Context));
|
unsigned int base = (unsigned int)(&(thread->Tcb.Context));
|
||||||
unsigned int* kernel_stack = ExAllocatePool(NonPagedPool,4096);
|
unsigned int* kernel_stack = ExAllocatePool(NonPagedPool,4096);
|
||||||
|
|
||||||
DPRINT("HalInitTask(Thread %x, fn %x, StartContext %x)\n",
|
DPRINT("HalInitTask(Thread %x, fn %x, StartContext %x)\n",
|
||||||
thread,fn,StartContext);
|
thread,fn,StartContext);
|
||||||
|
DPRINT("thread->ThreadsProcess %x\n",thread->ThreadsProcess);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure
|
* Make sure
|
||||||
*/
|
*/
|
||||||
@@ -156,30 +278,31 @@ BOOLEAN HalInitTask(PKTHREAD thread, PKSTART_ROUTINE fn,
|
|||||||
/*
|
/*
|
||||||
* Initialize the thread context
|
* Initialize the thread context
|
||||||
*/
|
*/
|
||||||
memset(&thread->Context,0,sizeof(hal_thread_state));
|
memset(&thread->Tcb.Context,0,sizeof(hal_thread_state));
|
||||||
thread->Context.ldt = null_ldt_sel;
|
thread->Tcb.Context.ldt = null_ldt_sel;
|
||||||
thread->Context.eflags = (1<<1)+(1<<9);
|
thread->Tcb.Context.eflags = (1<<1)+(1<<9);
|
||||||
thread->Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
|
thread->Tcb.Context.iomap_base = FIELD_OFFSET(hal_thread_state,io_bitmap);
|
||||||
thread->Context.esp0 = &kernel_stack[1021];
|
thread->Tcb.Context.esp0 = &kernel_stack[1021];
|
||||||
thread->Context.ss0 = KERNEL_DS;
|
thread->Tcb.Context.ss0 = KERNEL_DS;
|
||||||
thread->Context.esp = &kernel_stack[1021];
|
thread->Tcb.Context.esp = &kernel_stack[1021];
|
||||||
thread->Context.ss = KERNEL_DS;
|
thread->Tcb.Context.ss = KERNEL_DS;
|
||||||
thread->Context.cs = KERNEL_CS;
|
thread->Tcb.Context.cs = KERNEL_CS;
|
||||||
thread->Context.eip = (unsigned long)begin_thread;
|
thread->Tcb.Context.eip = (unsigned long)begin_thread;
|
||||||
thread->Context.io_bitmap[0] = 0xff;
|
thread->Tcb.Context.io_bitmap[0] = 0xff;
|
||||||
thread->Context.cr3 = ((unsigned int)get_page_directory()) - IDMAP_BASE;
|
thread->Tcb.Context.cr3 =
|
||||||
thread->Context.ds = KERNEL_DS;
|
linear_to_physical(thread->ThreadsProcess->Pcb.PageTableDirectory);
|
||||||
thread->Context.es = KERNEL_DS;
|
thread->Tcb.Context.ds = KERNEL_DS;
|
||||||
thread->Context.fs = KERNEL_DS;
|
thread->Tcb.Context.es = KERNEL_DS;
|
||||||
thread->Context.gs = KERNEL_DS;
|
thread->Tcb.Context.fs = KERNEL_DS;
|
||||||
thread->Context.nr = desc * 8;
|
thread->Tcb.Context.gs = KERNEL_DS;
|
||||||
|
thread->Tcb.Context.nr = desc * 8;
|
||||||
DPRINT("Allocated %x\n",desc*8);
|
DPRINT("Allocated %x\n",desc*8);
|
||||||
|
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HalInitFirstTask(PKTHREAD thread)
|
void HalInitFirstTask(PETHREAD thread)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Called to setup the HAL portion of a thread object for the
|
* FUNCTION: Called to setup the HAL portion of a thread object for the
|
||||||
* initial thread
|
* initial thread
|
||||||
@@ -208,6 +331,6 @@ void HalInitFirstTask(PKTHREAD thread)
|
|||||||
*/
|
*/
|
||||||
__asm__("ltr %%ax"
|
__asm__("ltr %%ax"
|
||||||
: /* no output */
|
: /* no output */
|
||||||
: "a" (thread->Context.nr));
|
: "a" (thread->Tcb.Context.nr));
|
||||||
FirstThread = thread;
|
FirstThread = thread;
|
||||||
}
|
}
|
||||||
|
@@ -1,46 +1,35 @@
|
|||||||
;
|
;
|
||||||
;
|
;
|
||||||
|
|
||||||
%include "internal/hal/segment.inc"
|
%include 'internal/hal/segment.inc'
|
||||||
|
|
||||||
bits 32
|
bits 32
|
||||||
section .text
|
section .text
|
||||||
extern _SystemServiceTable
|
extern __SystemServiceTable
|
||||||
|
global _interrupt_handler2e
|
||||||
|
|
||||||
_kernel_mode_call_handler:
|
_interrupt_handler2e:
|
||||||
|
push ds
|
||||||
;
|
push es
|
||||||
; Save some registers
|
push esi
|
||||||
;
|
push edi
|
||||||
push ds
|
|
||||||
push es
|
mov bx,KERNEL_DS
|
||||||
push esi
|
mov es,bx
|
||||||
push edi
|
|
||||||
|
mov esi,edx
|
||||||
;
|
mov ecx,[es:__SystemServiceTable+eax*8]
|
||||||
; Transfer the parameters from user mode
|
sub esp,ecx
|
||||||
;
|
mov edi,esp
|
||||||
push USER_DS
|
rep movsb
|
||||||
pop es
|
|
||||||
|
mov ds,bx
|
||||||
mov edx,esi
|
|
||||||
mov esp,edi
|
mov eax,[__SystemServiceTable+4+eax*8]
|
||||||
mov ecx,_SystemServiceTable[eax*4]
|
call eax
|
||||||
sub esp,ecx
|
|
||||||
cld
|
pop edi
|
||||||
rep movsb
|
pop esi
|
||||||
|
pop es
|
||||||
;
|
pop ds
|
||||||
; Call the actual service routine
|
iret
|
||||||
;
|
|
||||||
mov eax,_SystemServiceTable[eax*4+4]
|
|
||||||
jmp eax
|
|
||||||
|
|
||||||
;
|
|
||||||
; Restore registers and return
|
|
||||||
;
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
pop es
|
|
||||||
pop ds
|
|
||||||
ret
|
|
||||||
|
@@ -17,6 +17,13 @@
|
|||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS IoPrepareIrpBuffer(PIRP Irp,
|
||||||
|
PDEVICE_OBJECT DeviceObject,
|
||||||
|
PVOID Buffer,
|
||||||
|
PVOID Length)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction,
|
PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction,
|
||||||
PDEVICE_OBJECT DeviceObject,
|
PDEVICE_OBJECT DeviceObject,
|
||||||
PKEVENT UserEvent,
|
PKEVENT UserEvent,
|
||||||
@@ -27,6 +34,10 @@ PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction,
|
|||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
* MinorFunction = Type of filesystem control
|
* MinorFunction = Type of filesystem control
|
||||||
* DeviceObject = Device object to send the request to
|
* DeviceObject = Device object to send the request to
|
||||||
|
* UserEvent = Event used to notify the caller of completion
|
||||||
|
* IoStatusBlock (OUT) = Used to return the status of the operation
|
||||||
|
* DeviceToMount = Device to mount (for the IRP_MN_MOUNT_DEVICE
|
||||||
|
* request)
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
@@ -48,9 +59,23 @@ PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction,
|
|||||||
StackPtr->Control = 0;
|
StackPtr->Control = 0;
|
||||||
StackPtr->DeviceObject = DeviceObject;
|
StackPtr->DeviceObject = DeviceObject;
|
||||||
StackPtr->FileObject = NULL;
|
StackPtr->FileObject = NULL;
|
||||||
StackPtr->Parameters.Mount.Vpb = DeviceObject->Vpb;
|
|
||||||
StackPtr->Parameters.Mount.DeviceObject = DeviceToMount;
|
|
||||||
|
|
||||||
|
switch(MinorFunction)
|
||||||
|
{
|
||||||
|
case IRP_MN_USER_FS_REQUEST:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IRP_MN_MOUNT_VOLUME:
|
||||||
|
StackPtr->Parameters.Mount.Vpb = DeviceObject->Vpb;
|
||||||
|
StackPtr->Parameters.Mount.DeviceObject = DeviceToMount;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IRP_MN_VERIFY_VOLUME:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IRP_MN_LOAD_FILE_SYSTEM:
|
||||||
|
break;
|
||||||
|
}
|
||||||
return(Irp);
|
return(Irp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,40 +99,20 @@ PIRP IoBuildAsynchronousFsdRequest(ULONG MajorFunction,
|
|||||||
* NULL on failure
|
* NULL on failure
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PIO_STACK_LOCATION StackPtr;
|
PIO_STACK_LOCATION StackPtr;
|
||||||
|
|
||||||
|
DPRINT("IoBuildAsynchronousFsdRequest(MajorFunction %x, DeviceObject %x, "
|
||||||
|
"Buffer %x, Length %x, StartingOffset %x, "
|
||||||
|
"IoStatusBlock %x\n",MajorFunction,DeviceObject,Buffer,Length,
|
||||||
|
StartingOffset,IoStatusBlock);
|
||||||
|
|
||||||
Irp = IoAllocateIrp(DeviceObject->StackSize,TRUE);
|
Irp = IoAllocateIrp(DeviceObject->StackSize,TRUE);
|
||||||
if (Irp==NULL)
|
if (Irp==NULL)
|
||||||
{
|
{
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
Irp->UserBuffer = (LPVOID)Buffer;
|
|
||||||
if (DeviceObject->Flags&DO_BUFFERED_IO)
|
|
||||||
{
|
|
||||||
DPRINT("Doing buffer i/o\n",0);
|
|
||||||
Irp->AssociatedIrp.SystemBuffer = (PVOID)
|
|
||||||
ExAllocatePool(NonPagedPool,Length);
|
|
||||||
if (Irp->AssociatedIrp.SystemBuffer==NULL)
|
|
||||||
{
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
Irp->UserBuffer = NULL;
|
|
||||||
}
|
|
||||||
if (DeviceObject->Flags&DO_DIRECT_IO)
|
|
||||||
{
|
|
||||||
DPRINT("Doing direct i/o\n",0);
|
|
||||||
|
|
||||||
Irp->MdlAddress = MmCreateMdl(NULL,Buffer,Length);
|
|
||||||
MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess);
|
|
||||||
Irp->UserBuffer = NULL;
|
|
||||||
Irp->AssociatedIrp.SystemBuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Irp->UserIosb = IoStatusBlock;
|
|
||||||
|
|
||||||
StackPtr = IoGetNextIrpStackLocation(Irp);
|
StackPtr = IoGetNextIrpStackLocation(Irp);
|
||||||
StackPtr->MajorFunction = MajorFunction;
|
StackPtr->MajorFunction = MajorFunction;
|
||||||
StackPtr->MinorFunction = 0;
|
StackPtr->MinorFunction = 0;
|
||||||
@@ -116,19 +121,45 @@ PIRP IoBuildAsynchronousFsdRequest(ULONG MajorFunction,
|
|||||||
StackPtr->DeviceObject = DeviceObject;
|
StackPtr->DeviceObject = DeviceObject;
|
||||||
StackPtr->FileObject = NULL;
|
StackPtr->FileObject = NULL;
|
||||||
StackPtr->Parameters.Write.Length = Length;
|
StackPtr->Parameters.Write.Length = Length;
|
||||||
if (StartingOffset!=NULL)
|
|
||||||
{
|
|
||||||
StackPtr->Parameters.Write.ByteOffset.LowPart =
|
|
||||||
StartingOffset->LowPart;
|
|
||||||
StackPtr->Parameters.Write.ByteOffset.HighPart =
|
|
||||||
StartingOffset->HighPart;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
StackPtr->Parameters.Write.ByteOffset.LowPart = 0;
|
|
||||||
StackPtr->Parameters.Write.ByteOffset.HighPart = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (MajorFunction == IRP_MJ_READ || MajorFunction == IRP_MJ_WRITE)
|
||||||
|
{
|
||||||
|
Irp->UserBuffer = (LPVOID)Buffer;
|
||||||
|
if (DeviceObject->Flags&DO_BUFFERED_IO)
|
||||||
|
{
|
||||||
|
DPRINT("Doing buffer i/o\n",0);
|
||||||
|
Irp->AssociatedIrp.SystemBuffer = (PVOID)
|
||||||
|
ExAllocatePool(NonPagedPool,Length);
|
||||||
|
if (Irp->AssociatedIrp.SystemBuffer==NULL)
|
||||||
|
{
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (DeviceObject->Flags&DO_DIRECT_IO)
|
||||||
|
{
|
||||||
|
DPRINT("Doing direct i/o\n",0);
|
||||||
|
|
||||||
|
Irp->MdlAddress = MmCreateMdl(NULL,Buffer,Length);
|
||||||
|
MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess);
|
||||||
|
Irp->UserBuffer = NULL;
|
||||||
|
Irp->AssociatedIrp.SystemBuffer = NULL;
|
||||||
|
}
|
||||||
|
if (StartingOffset!=NULL)
|
||||||
|
{
|
||||||
|
StackPtr->Parameters.Write.ByteOffset.LowPart =
|
||||||
|
StartingOffset->LowPart;
|
||||||
|
StackPtr->Parameters.Write.ByteOffset.HighPart =
|
||||||
|
StartingOffset->HighPart;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StackPtr->Parameters.Write.ByteOffset.LowPart = 0;
|
||||||
|
StackPtr->Parameters.Write.ByteOffset.HighPart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp->UserIosb = IoStatusBlock;
|
||||||
|
|
||||||
return(Irp);
|
return(Irp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,43 +212,7 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction,
|
|||||||
{
|
{
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
Irp->UserBuffer = (LPVOID)Buffer;
|
|
||||||
if (DeviceObject->Flags&DO_BUFFERED_IO)
|
|
||||||
{
|
|
||||||
DPRINT("Doing buffer i/o\n",0);
|
|
||||||
Irp->AssociatedIrp.SystemBuffer = (PVOID)
|
|
||||||
ExAllocatePool(NonPagedPool,Length);
|
|
||||||
if (Irp->AssociatedIrp.SystemBuffer==NULL)
|
|
||||||
{
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
if (MajorFunction == IRP_MJ_WRITE)
|
|
||||||
{
|
|
||||||
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer, Length);
|
|
||||||
}
|
|
||||||
Irp->UserBuffer = NULL;
|
|
||||||
}
|
|
||||||
if (DeviceObject->Flags&DO_DIRECT_IO)
|
|
||||||
{
|
|
||||||
DPRINT("Doing direct i/o\n",0);
|
|
||||||
|
|
||||||
Irp->MdlAddress = MmCreateMdl(NULL,Buffer,Length);
|
|
||||||
if (MajorFunction == IRP_MJ_READ)
|
|
||||||
{
|
|
||||||
MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoReadAccess);
|
|
||||||
}
|
|
||||||
Irp->UserBuffer = NULL;
|
|
||||||
Irp->AssociatedIrp.SystemBuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Irp->UserIosb = IoStatusBlock;
|
|
||||||
Irp->UserEvent = Event;
|
|
||||||
|
|
||||||
StackPtr = IoGetNextIrpStackLocation(Irp);
|
StackPtr = IoGetNextIrpStackLocation(Irp);
|
||||||
StackPtr->MajorFunction = MajorFunction;
|
StackPtr->MajorFunction = MajorFunction;
|
||||||
StackPtr->MinorFunction = 0;
|
StackPtr->MinorFunction = 0;
|
||||||
@@ -226,36 +221,59 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction,
|
|||||||
StackPtr->DeviceObject = DeviceObject;
|
StackPtr->DeviceObject = DeviceObject;
|
||||||
StackPtr->FileObject = NULL;
|
StackPtr->FileObject = NULL;
|
||||||
StackPtr->Parameters.Write.Length = Length;
|
StackPtr->Parameters.Write.Length = Length;
|
||||||
if (MajorFunction == IRP_MJ_READ)
|
|
||||||
|
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
|
||||||
|
|
||||||
|
if (MajorFunction == IRP_MJ_READ || MajorFunction == IRP_MJ_WRITE)
|
||||||
{
|
{
|
||||||
if (StartingOffset!=NULL)
|
Irp->UserBuffer = (LPVOID)Buffer;
|
||||||
{
|
if (DeviceObject->Flags&DO_BUFFERED_IO)
|
||||||
StackPtr->Parameters.Read.ByteOffset.LowPart =
|
{
|
||||||
StartingOffset->LowPart;
|
DPRINT("Doing buffer i/o\n",0);
|
||||||
StackPtr->Parameters.Read.ByteOffset.HighPart =
|
Irp->AssociatedIrp.SystemBuffer = (PVOID)
|
||||||
StartingOffset->HighPart;
|
ExAllocatePool(NonPagedPool,Length);
|
||||||
}
|
if (Irp->AssociatedIrp.SystemBuffer==NULL)
|
||||||
else
|
{
|
||||||
{
|
return(NULL);
|
||||||
StackPtr->Parameters.Read.ByteOffset.LowPart = 0;
|
}
|
||||||
StackPtr->Parameters.Read.ByteOffset.HighPart = 0;
|
if (MajorFunction == IRP_MJ_WRITE)
|
||||||
}
|
{
|
||||||
|
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer,
|
||||||
|
Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (DeviceObject->Flags&DO_DIRECT_IO)
|
||||||
|
{
|
||||||
|
DPRINT("Doing direct i/o\n",0);
|
||||||
|
|
||||||
|
Irp->MdlAddress = MmCreateMdl(NULL,Buffer,Length);
|
||||||
|
Irp->UserBuffer = NULL;
|
||||||
|
if (MajorFunction == IRP_MJ_READ)
|
||||||
|
{
|
||||||
|
MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoReadAccess);
|
||||||
|
}
|
||||||
|
Irp->AssociatedIrp.SystemBuffer = NULL;
|
||||||
|
}
|
||||||
|
if (StartingOffset!=NULL)
|
||||||
|
{
|
||||||
|
StackPtr->Parameters.Write.ByteOffset.LowPart =
|
||||||
|
StartingOffset->LowPart;
|
||||||
|
StackPtr->Parameters.Write.ByteOffset.HighPart =
|
||||||
|
StartingOffset->HighPart;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StackPtr->Parameters.Write.ByteOffset.LowPart = 0;
|
||||||
|
StackPtr->Parameters.Write.ByteOffset.HighPart = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
Irp->UserIosb = IoStatusBlock;
|
||||||
if (StartingOffset!=NULL)
|
Irp->UserEvent = Event;
|
||||||
{
|
|
||||||
StackPtr->Parameters.Write.ByteOffset.LowPart =
|
|
||||||
StartingOffset->LowPart;
|
|
||||||
StackPtr->Parameters.Write.ByteOffset.HighPart =
|
|
||||||
StartingOffset->HighPart;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
StackPtr->Parameters.Write.ByteOffset.LowPart = 0;
|
|
||||||
StackPtr->Parameters.Write.ByteOffset.HighPart = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return(Irp);
|
return(Irp);
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,18 @@ static KSPIN_LOCK CancelSpinLock = {0,};
|
|||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS STDCALL NtCancelIoFile(IN HANDLE FileHandle,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatusBlock)
|
||||||
|
{
|
||||||
|
return(ZwCancelIoFile(FileHandle,IoStatusBlock));
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL ZwCancelIoFile(IN HANDLE FileHandle,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatusBlock)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
BOOLEAN IoCancelIrp(PIRP Irp)
|
BOOLEAN IoCancelIrp(PIRP Irp)
|
||||||
{
|
{
|
||||||
KIRQL oldlvl;
|
KIRQL oldlvl;
|
||||||
|
@@ -22,6 +22,41 @@
|
|||||||
|
|
||||||
/* FUNCTIONS *************************************************************/
|
/* FUNCTIONS *************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS STDCALL NtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes)
|
||||||
|
{
|
||||||
|
return(ZwDeleteFile(ObjectAttributes));
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL ZwDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NtCreateFile(PHANDLE FileHandle,
|
||||||
|
ACCESS_MASK DesiredAccess,
|
||||||
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
|
PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
PLARGE_INTEGER AllocateSize,
|
||||||
|
ULONG FileAttributes,
|
||||||
|
ULONG ShareAccess,
|
||||||
|
ULONG CreateDisposition,
|
||||||
|
ULONG CreateOptions,
|
||||||
|
PVOID EaBuffer,
|
||||||
|
ULONG EaLength)
|
||||||
|
{
|
||||||
|
return(ZwCreateFile(FileHandle,
|
||||||
|
DesiredAccess,
|
||||||
|
ObjectAttributes,
|
||||||
|
IoStatusBlock,
|
||||||
|
AllocateSize,
|
||||||
|
FileAttributes,
|
||||||
|
ShareAccess,
|
||||||
|
CreateDisposition,
|
||||||
|
CreateOptions,
|
||||||
|
EaBuffer,
|
||||||
|
EaLength));
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS ZwCreateFile(PHANDLE FileHandle,
|
NTSTATUS ZwCreateFile(PHANDLE FileHandle,
|
||||||
ACCESS_MASK DesiredAccess,
|
ACCESS_MASK DesiredAccess,
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
@@ -56,7 +91,144 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
|
|||||||
* RETURNS: Status
|
* RETURNS: Status
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PVOID Object;
|
||||||
|
NTSTATUS Status;
|
||||||
|
PIRP Irp;
|
||||||
|
KEVENT Event;
|
||||||
|
PDEVICE_OBJECT DeviceObject;
|
||||||
|
PFILE_OBJECT FileObject;
|
||||||
|
PIO_STACK_LOCATION StackLoc;
|
||||||
|
PWSTR Remainder;
|
||||||
|
|
||||||
|
DPRINT("ZwCreateFile(FileHandle %x, DesiredAccess %x, "
|
||||||
|
"ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %w)\n",
|
||||||
|
FileHandle,DesiredAccess,ObjectAttributes,
|
||||||
|
ObjectAttributes->ObjectName->Buffer);
|
||||||
|
|
||||||
|
assert_irql(PASSIVE_LEVEL);
|
||||||
|
|
||||||
|
*FileHandle=0;
|
||||||
|
|
||||||
|
FileObject = ObGenericCreateObject(FileHandle,DesiredAccess,NULL,IoFileType);
|
||||||
|
memset(FileObject,0,sizeof(FILE_OBJECT));
|
||||||
|
|
||||||
|
Status = ObOpenObjectByName(ObjectAttributes,&Object,&Remainder);
|
||||||
|
|
||||||
|
if (Status != STATUS_SUCCESS && Status != STATUS_FS_QUERY_REQUIRED)
|
||||||
|
{
|
||||||
|
DPRINT("%s() = Failed to find object\n",__FUNCTION__);
|
||||||
|
ZwClose(*FileHandle);
|
||||||
|
*FileHandle=0;
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DeviceObject = (PDEVICE_OBJECT)Object;
|
||||||
|
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
||||||
|
DPRINT("DeviceObject %x\n",DeviceObject);
|
||||||
|
|
||||||
|
if (Status == STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
CHECKPOINT;
|
||||||
|
FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
|
||||||
|
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
|
||||||
|
ObjectAttributes->ObjectName->Length);
|
||||||
|
FileObject->FileName.Length = ObjectAttributes->Length;
|
||||||
|
RtlCopyUnicodeString(&(FileObject->FileName),
|
||||||
|
ObjectAttributes->ObjectName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CHECKPOINT;
|
||||||
|
if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM &&
|
||||||
|
DeviceObject->DeviceType != FILE_DEVICE_DISK)
|
||||||
|
{
|
||||||
|
ZwClose(*FileHandle);
|
||||||
|
*FileHandle=0;
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED))
|
||||||
|
{
|
||||||
|
Status = IoTryToMountStorageDevice(DeviceObject);
|
||||||
|
if (Status!=STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
ZwClose(*FileHandle);
|
||||||
|
*FileHandle=0;
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
||||||
|
}
|
||||||
|
DPRINT("Remainder %w\n",Remainder);
|
||||||
|
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
|
||||||
|
wstrlen(Remainder));
|
||||||
|
RtlInitUnicodeString(&(FileObject->FileName),Remainder);
|
||||||
|
DPRINT("FileObject->FileName.Buffer %x %w\n",
|
||||||
|
FileObject->FileName.Buffer,FileObject->FileName.Buffer);
|
||||||
|
}
|
||||||
|
CHECKPOINT;
|
||||||
|
|
||||||
|
if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT)
|
||||||
|
{
|
||||||
|
FileObject->Flags = FileObject->Flags | FO_ALERTABLE_IO;
|
||||||
|
FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO;
|
||||||
|
}
|
||||||
|
if (CreateOptions & FILE_SYNCHRONOUS_IO_NONALERT)
|
||||||
|
{
|
||||||
|
FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileObject->DeviceObject=DeviceObject;
|
||||||
|
FileObject->Vpb=DeviceObject->Vpb;
|
||||||
|
|
||||||
|
KeInitializeEvent(&Event,NotificationEvent,FALSE);
|
||||||
|
|
||||||
|
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
|
||||||
|
if (Irp==NULL)
|
||||||
|
{
|
||||||
|
ZwClose(*FileHandle);
|
||||||
|
*FileHandle=0;
|
||||||
|
return(STATUS_UNSUCCESSFUL);
|
||||||
|
}
|
||||||
|
|
||||||
|
StackLoc = IoGetNextIrpStackLocation(Irp);
|
||||||
|
StackLoc->MajorFunction = IRP_MJ_CREATE;
|
||||||
|
StackLoc->MinorFunction = 0;
|
||||||
|
StackLoc->Flags = 0;
|
||||||
|
StackLoc->Control = 0;
|
||||||
|
StackLoc->DeviceObject = DeviceObject;
|
||||||
|
StackLoc->FileObject=FileObject;
|
||||||
|
Status = IoCallDriver(DeviceObject,Irp);
|
||||||
|
if (Status==STATUS_PENDING)
|
||||||
|
{
|
||||||
|
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
|
||||||
|
Status = IoStatusBlock->Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Status!=STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
ZwClose(*FileHandle);
|
||||||
|
*FileHandle=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("*FileHandle %x\n",*FileHandle);
|
||||||
|
|
||||||
|
return(Status);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NtOpenFile(PHANDLE FileHandle,
|
||||||
|
ACCESS_MASK DesiredAccess,
|
||||||
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
|
PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
ULONG ShareAccess,
|
||||||
|
ULONG OpenOptions)
|
||||||
|
{
|
||||||
|
return(ZwOpenFile(FileHandle,
|
||||||
|
DesiredAccess,
|
||||||
|
ObjectAttributes,
|
||||||
|
IoStatusBlock,
|
||||||
|
ShareAccess,
|
||||||
|
OpenOptions));
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS ZwOpenFile(PHANDLE FileHandle,
|
NTSTATUS ZwOpenFile(PHANDLE FileHandle,
|
||||||
@@ -79,119 +251,17 @@ NTSTATUS ZwOpenFile(PHANDLE FileHandle,
|
|||||||
* NOTE: Undocumented
|
* NOTE: Undocumented
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
PVOID Object;
|
return(ZwCreateFile(FileHandle,
|
||||||
NTSTATUS Status;
|
DesiredAccess,
|
||||||
PIRP Irp;
|
ObjectAttributes,
|
||||||
KEVENT Event;
|
IoStatusBlock,
|
||||||
PDEVICE_OBJECT DeviceObject;
|
NULL,
|
||||||
PFILE_OBJECT FileObject;
|
0,
|
||||||
PIO_STACK_LOCATION StackLoc;
|
ShareAccess,
|
||||||
PWSTR Remainder;
|
FILE_OPEN,
|
||||||
|
OpenOptions,
|
||||||
DPRINT("ZwOpenFile(FileHandle %x, ObjectAttributes %x, "
|
NULL,
|
||||||
"ObjectAttributes->ObjectName->Buffer %w)\n",FileHandle,
|
0));
|
||||||
ObjectAttributes,ObjectAttributes->ObjectName->Buffer);
|
|
||||||
|
|
||||||
assert_irql(PASSIVE_LEVEL);
|
|
||||||
|
|
||||||
*FileHandle=0;
|
|
||||||
|
|
||||||
FileObject = ObGenericCreateObject(FileHandle,0,NULL,OBJTYP_FILE);
|
|
||||||
memset(FileObject,0,sizeof(FILE_OBJECT));
|
|
||||||
|
|
||||||
Status = ObOpenObjectByName(ObjectAttributes,&Object,&Remainder);
|
|
||||||
|
|
||||||
if (Status != STATUS_SUCCESS && Status != STATUS_FS_QUERY_REQUIRED)
|
|
||||||
{
|
|
||||||
DPRINT("%s() = Failed to find object\n",__FUNCTION__);
|
|
||||||
ObDeleteHandle(*FileHandle);
|
|
||||||
*FileHandle=0;
|
|
||||||
ExFreePool(FileObject);
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DeviceObject = (PDEVICE_OBJECT)Object;
|
|
||||||
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
|
||||||
DPRINT("DeviceObject %x\n",DeviceObject);
|
|
||||||
|
|
||||||
if (Status == STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
CHECKPOINT;
|
|
||||||
FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
|
|
||||||
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
|
|
||||||
ObjectAttributes->Length);
|
|
||||||
RtlCopyUnicodeString(&(FileObject->FileName),
|
|
||||||
ObjectAttributes->ObjectName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CHECKPOINT;
|
|
||||||
if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM &&
|
|
||||||
DeviceObject->DeviceType != FILE_DEVICE_DISK)
|
|
||||||
{
|
|
||||||
ObDeleteHandle(*FileHandle);
|
|
||||||
*FileHandle=0;
|
|
||||||
ExFreePool(FileObject);
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED))
|
|
||||||
{
|
|
||||||
Status = IoTryToMountStorageDevice(DeviceObject);
|
|
||||||
if (Status!=STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
ObDeleteHandle(*FileHandle);
|
|
||||||
*FileHandle=0;
|
|
||||||
ExFreePool(FileObject);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
|
||||||
}
|
|
||||||
DPRINT("Remainder %w\n",Remainder);
|
|
||||||
FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
|
|
||||||
wstrlen(Remainder));
|
|
||||||
RtlInitUnicodeString(&(FileObject->FileName),Remainder);
|
|
||||||
DPRINT("FileObject->FileName.Buffer %x %w\n",
|
|
||||||
FileObject->FileName.Buffer,FileObject->FileName.Buffer);
|
|
||||||
}
|
|
||||||
CHECKPOINT;
|
|
||||||
|
|
||||||
FileObject->DeviceObject=DeviceObject;
|
|
||||||
FileObject->Vpb=DeviceObject->Vpb;
|
|
||||||
|
|
||||||
KeInitializeEvent(&Event,NotificationEvent,FALSE);
|
|
||||||
|
|
||||||
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
|
|
||||||
if (Irp==NULL)
|
|
||||||
{
|
|
||||||
ObDeleteHandle(*FileHandle);
|
|
||||||
*FileHandle=0;
|
|
||||||
ExFreePool(FileObject);
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
StackLoc = IoGetNextIrpStackLocation(Irp);
|
|
||||||
StackLoc->MajorFunction = IRP_MJ_CREATE;
|
|
||||||
StackLoc->MinorFunction = 0;
|
|
||||||
StackLoc->Flags = 0;
|
|
||||||
StackLoc->Control = 0;
|
|
||||||
StackLoc->DeviceObject = DeviceObject;
|
|
||||||
StackLoc->FileObject=FileObject;
|
|
||||||
Status = IoCallDriver(DeviceObject,Irp);
|
|
||||||
if (Status==STATUS_PENDING)
|
|
||||||
{
|
|
||||||
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
|
|
||||||
Status = IoStatusBlock->Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Status!=STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
ObDeleteHandle(*FileHandle);
|
|
||||||
*FileHandle=0;
|
|
||||||
ExFreePool(FileObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(Status);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -21,6 +21,27 @@
|
|||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
NtUnloadDriver(
|
||||||
|
IN PUNICODE_STRING DriverServiceName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
ZwUnloadDriver(
|
||||||
|
IN PUNICODE_STRING DriverServiceName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NtLoadDriver(PUNICODE_STRING DriverServiceName)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS ZwLoadDriver(PUNICODE_STRING DriverServiceName)
|
NTSTATUS ZwLoadDriver(PUNICODE_STRING DriverServiceName)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Loads a driver
|
* FUNCTION: Loads a driver
|
||||||
@@ -187,11 +208,11 @@ NTSTATUS IoCreateDevice(PDRIVER_OBJECT DriverObject,
|
|||||||
if (DeviceName!=NULL)
|
if (DeviceName!=NULL)
|
||||||
{
|
{
|
||||||
InitializeObjectAttributes(&dev_attr,DeviceName,0,NULL,NULL);
|
InitializeObjectAttributes(&dev_attr,DeviceName,0,NULL,NULL);
|
||||||
dev = ObGenericCreateObject(&devh,0,&dev_attr,OBJTYP_DEVICE);
|
dev = ObGenericCreateObject(&devh,0,&dev_attr,IoDeviceType);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dev = ObGenericCreateObject(&devh,0,NULL,OBJTYP_DEVICE);
|
dev = ObGenericCreateObject(&devh,0,NULL,IoDeviceType);
|
||||||
}
|
}
|
||||||
|
|
||||||
*DeviceObject=NULL;
|
*DeviceObject=NULL;
|
||||||
|
@@ -11,38 +11,48 @@
|
|||||||
/* INCLUDES *****************************************************************/
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
|
#include <internal/mm.h>
|
||||||
|
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
VOID MmUnlockPagableImageSection(PVOID ImageSectionHandle)
|
VOID MmUnlockPagableImageSection(PVOID ImageSectionHandle)
|
||||||
|
/*
|
||||||
|
* FUNCTION: Releases a section of driver code or driver data, previously
|
||||||
|
* locked into system space with MmLockPagableCodeSection,
|
||||||
|
* MmLockPagableDataSection or MmLockPagableSectionByHandle
|
||||||
|
* ARGUMENTS:
|
||||||
|
* ImageSectionHandle = Handle returned by MmLockPagableCodeSection or
|
||||||
|
* MmLockPagableDataSection
|
||||||
|
*/
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
MmUnlockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID MmLockPagableSectionByHandle(PVOID ImageSectionHandle)
|
VOID MmLockPagableSectionByHandle(PVOID ImageSectionHandle)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
MmLockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
PVOID MmLockPagableCodeSection(PVOID AddressWithinSection)
|
PVOID MmLockPagableCodeSection(PVOID AddressWithinSection)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PVOID Handle;
|
||||||
|
Handle = MmOpenMemoryAreaByAddress(NULL,AddressWithinSection);
|
||||||
|
MmLockPagableSectionByHandle(Handle);
|
||||||
|
return(Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
PVOID MmLockPagableDataSection(PVOID AddressWithinSection)
|
PVOID MmLockPagableDataSection(PVOID AddressWithinSection)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
return(MmLockPagableCodeSection(AddressWithinSection));
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID MmPageEntireDriver(PVOID AddressWithinSection)
|
VOID MmPageEntireDriver(PVOID AddressWithinSection)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID MmResetDriverPaging(PVOID AddressWithinSection)
|
VOID MmResetDriverPaging(PVOID AddressWithinSection)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -25,6 +25,15 @@ NTSTATUS ZwQueryInformationFile(HANDLE FileHandle,
|
|||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NtQueryInformationFile(HANDLE FileHandle,
|
||||||
|
PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
PVOID FileInformation,
|
||||||
|
ULONG Length,
|
||||||
|
FILE_INFORMATION_CLASS FileInformationClass)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS ZwSetInformationFile(HANDLE FileHandle,
|
NTSTATUS ZwSetInformationFile(HANDLE FileHandle,
|
||||||
PIO_STATUS_BLOCK IoStatusBlock,
|
PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
PVOID FileInformation,
|
PVOID FileInformation,
|
||||||
@@ -34,7 +43,90 @@ NTSTATUS ZwSetInformationFile(HANDLE FileHandle,
|
|||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS NtSetInformationFile(HANDLE FileHandle,
|
||||||
|
PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
PVOID FileInformation,
|
||||||
|
ULONG Length,
|
||||||
|
FILE_INFORMATION_CLASS FileInformationClass)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
PGENERIC_MAPPING IoGetFileObjectGenericMapping()
|
PGENERIC_MAPPING IoGetFileObjectGenericMapping()
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
NtQueryAttributesFile(
|
||||||
|
IN HANDLE FileHandle,
|
||||||
|
IN PVOID Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
ZwQueryAttributesFile(
|
||||||
|
IN HANDLE FileHandle,
|
||||||
|
IN PVOID Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
NtQueryFullAttributesFile(
|
||||||
|
IN HANDLE FileHandle,
|
||||||
|
IN PVOID Attributes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
ZwQueryFullAttributesFile(
|
||||||
|
IN HANDLE FileHandle,
|
||||||
|
IN PVOID Attributes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
NtQueryEaFile(
|
||||||
|
IN HANDLE FileHandle,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
OUT PVOID Buffer,
|
||||||
|
IN ULONG Length,
|
||||||
|
IN BOOLEAN ReturnSingleEntry,
|
||||||
|
IN PVOID EaList OPTIONAL,
|
||||||
|
IN ULONG EaListLength,
|
||||||
|
IN PULONG EaIndex OPTIONAL,
|
||||||
|
IN BOOLEAN RestartScan
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
NtSetEaFile(
|
||||||
|
IN HANDLE FileHandle,
|
||||||
|
IN PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
PVOID EaBuffer,
|
||||||
|
ULONG EaBufferSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
ZwSetEaFile(
|
||||||
|
IN HANDLE FileHandle,
|
||||||
|
IN PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
PVOID EaBuffer,
|
||||||
|
ULONG EaBufferSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
@@ -31,6 +31,51 @@ static LIST_ENTRY FileSystemListHead = {NULL,NULL};
|
|||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
NtFsControlFile(
|
||||||
|
IN HANDLE DeviceHandle,
|
||||||
|
IN HANDLE Event OPTIONAL,
|
||||||
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
||||||
|
IN PVOID ApcContext OPTIONAL,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
IN ULONG IoControlCode,
|
||||||
|
IN PVOID InputBuffer,
|
||||||
|
IN ULONG InputBufferSize,
|
||||||
|
OUT PVOID OutputBuffer,
|
||||||
|
IN ULONG OutputBufferSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return(ZwFsControlFile(DeviceHandle,
|
||||||
|
Event,
|
||||||
|
ApcRoutine,
|
||||||
|
ApcContext,
|
||||||
|
IoStatusBlock,
|
||||||
|
IoControlCode,
|
||||||
|
InputBuffer,
|
||||||
|
InputBufferSize,
|
||||||
|
OutputBuffer,
|
||||||
|
OutputBufferSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
ZwFsControlFile(
|
||||||
|
IN HANDLE DeviceHandle,
|
||||||
|
IN HANDLE Event OPTIONAL,
|
||||||
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
||||||
|
IN PVOID ApcContext OPTIONAL,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
IN ULONG IoControlCode,
|
||||||
|
IN PVOID InputBuffer,
|
||||||
|
IN ULONG InputBufferSize,
|
||||||
|
OUT PVOID OutputBuffer,
|
||||||
|
IN ULONG OutputBufferSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
VOID IoInitFileSystemImplementation(VOID)
|
VOID IoInitFileSystemImplementation(VOID)
|
||||||
{
|
{
|
||||||
InitializeListHead(&FileSystemListHead);
|
InitializeListHead(&FileSystemListHead);
|
||||||
@@ -142,6 +187,7 @@ VOID IoUnregisterFileSystem(PDEVICE_OBJECT DeviceObject)
|
|||||||
if (current->DeviceObject == DeviceObject)
|
if (current->DeviceObject == DeviceObject)
|
||||||
{
|
{
|
||||||
RemoveEntryList(current_entry);
|
RemoveEntryList(current_entry);
|
||||||
|
ExFreePool(current);
|
||||||
KeReleaseSpinLock(&FileSystemListLock,oldlvl);
|
KeReleaseSpinLock(&FileSystemListLock,oldlvl);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -20,3 +20,37 @@ ULONG IoGetFunctionCodeFromCtlCode(ULONG ControlCode)
|
|||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
NtDeviceIoControlFile(
|
||||||
|
IN HANDLE DeviceHandle,
|
||||||
|
IN HANDLE Event OPTIONAL,
|
||||||
|
IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
|
||||||
|
IN PVOID UserApcContext OPTIONAL,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
IN ULONG IoControlCode,
|
||||||
|
IN PVOID InputBuffer,
|
||||||
|
IN ULONG InputBufferSize,
|
||||||
|
OUT PVOID OutputBuffer,
|
||||||
|
IN ULONG OutputBufferSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
ZwDeviceIoControlFile(
|
||||||
|
IN HANDLE DeviceHandle,
|
||||||
|
IN HANDLE Event OPTIONAL,
|
||||||
|
IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
|
||||||
|
IN PVOID UserApcContext OPTIONAL,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
IN ULONG IoControlCode,
|
||||||
|
IN PVOID InputBuffer,
|
||||||
|
IN ULONG InputBufferSize,
|
||||||
|
OUT PVOID OutputBuffer,
|
||||||
|
IN ULONG OutputBufferSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
@@ -13,45 +13,15 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <internal/ob.h>
|
#include <internal/ob.h>
|
||||||
|
#include <internal/io.h>
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
|
||||||
OBJECT_TYPE DeviceObjectType = {{0,0,NULL},
|
POBJECT_TYPE IoDeviceType = NULL;
|
||||||
0,
|
POBJECT_TYPE IoFileType = NULL;
|
||||||
0,
|
|
||||||
ULONG_MAX,
|
|
||||||
ULONG_MAX,
|
|
||||||
sizeof(DEVICE_OBJECT),
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
OBJECT_TYPE FileObjectType = {{0,0,NULL},
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
ULONG_MAX,
|
|
||||||
ULONG_MAX,
|
|
||||||
sizeof(FILE_OBJECT),
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
@@ -60,31 +30,63 @@ VOID IoInit(VOID)
|
|||||||
{
|
{
|
||||||
OBJECT_ATTRIBUTES attr;
|
OBJECT_ATTRIBUTES attr;
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
UNICODE_STRING string;
|
UNICODE_STRING UnicodeString;
|
||||||
ANSI_STRING astring;
|
ANSI_STRING AnsiString;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register iomgr types
|
* Register iomgr types
|
||||||
*/
|
*/
|
||||||
RtlInitAnsiString(&astring,"Device");
|
IoDeviceType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||||
RtlAnsiStringToUnicodeString(&DeviceObjectType.TypeName,&astring,TRUE);
|
|
||||||
ObRegisterType(OBJTYP_DEVICE,&DeviceObjectType);
|
|
||||||
|
|
||||||
RtlInitAnsiString(&astring,"File");
|
|
||||||
RtlAnsiStringToUnicodeString(&FileObjectType.TypeName,&astring,TRUE);
|
|
||||||
ObRegisterType(OBJTYP_FILE,&FileObjectType);
|
|
||||||
|
|
||||||
|
IoDeviceType->TotalObjects = 0;
|
||||||
|
IoDeviceType->TotalHandles = 0;
|
||||||
|
IoDeviceType->MaxObjects = ULONG_MAX;
|
||||||
|
IoDeviceType->MaxHandles = ULONG_MAX;
|
||||||
|
IoDeviceType->PagedPoolCharge = 0;
|
||||||
|
IoDeviceType->NonpagedPoolCharge = sizeof(DEVICE_OBJECT);
|
||||||
|
IoDeviceType->Dump = NULL;
|
||||||
|
IoDeviceType->Open = NULL;
|
||||||
|
IoDeviceType->Close = NULL;
|
||||||
|
IoDeviceType->Delete = NULL;
|
||||||
|
IoDeviceType->Parse = NULL;
|
||||||
|
IoDeviceType->Security = NULL;
|
||||||
|
IoDeviceType->QueryName = NULL;
|
||||||
|
IoDeviceType->OkayToClose = NULL;
|
||||||
|
|
||||||
|
RtlInitAnsiString(&AnsiString,"Device");
|
||||||
|
RtlAnsiStringToUnicodeString(&IoDeviceType->TypeName,&AnsiString,TRUE);
|
||||||
|
|
||||||
|
IoFileType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||||
|
|
||||||
|
IoFileType->TotalObjects = 0;
|
||||||
|
IoFileType->TotalHandles = 0;
|
||||||
|
IoFileType->MaxObjects = ULONG_MAX;
|
||||||
|
IoFileType->MaxHandles = ULONG_MAX;
|
||||||
|
IoFileType->PagedPoolCharge = 0;
|
||||||
|
IoFileType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
|
||||||
|
IoFileType->Dump = NULL;
|
||||||
|
IoFileType->Open = NULL;
|
||||||
|
IoFileType->Close = NULL;
|
||||||
|
IoFileType->Delete = NULL;
|
||||||
|
IoFileType->Parse = NULL;
|
||||||
|
IoFileType->Security = NULL;
|
||||||
|
IoFileType->QueryName = NULL;
|
||||||
|
IoFileType->OkayToClose = NULL;
|
||||||
|
|
||||||
|
RtlInitAnsiString(&AnsiString,"File");
|
||||||
|
RtlAnsiStringToUnicodeString(&IoFileType->TypeName,&AnsiString,TRUE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the device directory
|
* Create the device directory
|
||||||
*/
|
*/
|
||||||
RtlInitAnsiString(&astring,"\\Device");
|
RtlInitAnsiString(&AnsiString,"\\Device");
|
||||||
RtlAnsiStringToUnicodeString(&string,&astring,TRUE);
|
RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
|
||||||
InitializeObjectAttributes(&attr,&string,0,NULL,NULL);
|
InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
|
||||||
ZwCreateDirectoryObject(&handle,0,&attr);
|
ZwCreateDirectoryObject(&handle,0,&attr);
|
||||||
|
|
||||||
RtlInitAnsiString(&astring,"\\??");
|
RtlInitAnsiString(&AnsiString,"\\??");
|
||||||
RtlAnsiStringToUnicodeString(&string,&astring,TRUE);
|
RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
|
||||||
InitializeObjectAttributes(&attr,&string,0,NULL,NULL);
|
InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
|
||||||
ZwCreateDirectoryObject(&handle,0,&attr);
|
ZwCreateDirectoryObject(&handle,0,&attr);
|
||||||
|
|
||||||
IoInitCancelHandling();
|
IoInitCancelHandling();
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user