Compare commits

...

42 Commits

Author SHA1 Message Date
Art Yerkes
7bd6f1e793 Added missing file.
svn path=/branches/powerpc/; revision=29409
2007-10-06 08:33:29 +00:00
Art Yerkes
15d98ae976 Fix build for new rosbe-ppc.
svn path=/branches/powerpc/; revision=29071
2007-09-17 05:32:04 +00:00
Art Yerkes
c1cc61b87a Fix building of libcntpr on ppc.
We now get a proper bootcd image.

svn path=/branches/powerpc/; revision=28803
2007-09-03 06:29:13 +00:00
Art Yerkes
4969e3d34c Added freeldr and hal from PPC branch, along with needed headers and
build changes.

Next ntoskrnl and add ppc dir under libcntptr, which didn't exist when I 
forked.

svn path=/branches/powerpc/; revision=28793
2007-09-03 01:57:36 +00:00
Art Yerkes
b17784fa55 Not in LE mode anymore, toto.
svn path=/branches/powerpc/; revision=27233
2007-06-19 06:13:10 +00:00
Art Yerkes
fe91699e83 Fix getting .idata and .edata addresses.
Keep freeldr linkage up to date.
ldscript -- don't sort .idata$2 so we get modules linked in natural 
order.

svn path=/branches/powerpc/; revision=27219
2007-06-17 22:05:45 +00:00
Art Yerkes
3e2620637d - Some random imports from ntoskrnl (ndis header, bugcodes)
- Lean out ntoskrnl entry point to make it more like the new style in 
  trunk
- Implement loading by imports in freeldr and move import resolution 
  there
- Fix ppcmmu BAT snooping
- We'll remove our serial debug hack in KiSystemService once we verify 
  kdcom/kd serial works

svn path=/branches/powerpc/; revision=27217
2007-06-17 21:18:25 +00:00
Art Yerkes
e19545890e Forgotten during import.
svn path=/branches/powerpc/; revision=27169
2007-06-13 06:48:03 +00:00
Art Yerkes
31b6cbfb8a Update this code for the current mmu API. We now need to review
KiInitializePcr and make it do the right thing for PPC.  Forward toward 
the first thread!

svn path=/branches/powerpc/; revision=27167
2007-06-12 21:35:28 +00:00
Art Yerkes
a62d227e18 Working syscall. Should be good for both usermode and kernel mode.
svn path=/branches/powerpc/; revision=27152
2007-06-12 08:03:54 +00:00
Art Yerkes
4369ecad32 Big import from trunk.
- hal, include, rtl, ntoskrnl affected
 - added mostly not stubbed interlocked functions based on the
   intrinsics (rtl)
 - decided on a syscall mechanism (entry implemented)
 - Syscalls are properly dispatched to KiSystemService, which is still a
   stub, but won't be for long.


svn path=/branches/powerpc/; revision=27131
2007-06-11 00:12:43 +00:00
Art Yerkes
d1ebc9d7cb Fix bug in stack restore.
Mask old H value in recent PTE map.

svn path=/branches/powerpc/; revision=27130
2007-06-10 22:00:05 +00:00
Art Yerkes
218f6238b0 - Fix hash function
- Set 2nd hash bit for secondary reloads
- Use dar for data reloads
- Some debug for when it's needed

svn path=/branches/powerpc/; revision=27114
2007-06-10 11:57:39 +00:00
Art Yerkes
41d1e3c17f - Cleaning up
- Move mmucode init earlier
- Fix remaining reloc bugs
- Alloc vsids
- New mmu api
- Fix memory bounds

svn path=/branches/powerpc/; revision=27113
2007-06-10 11:55:56 +00:00
Art Yerkes
6e09f5904c WIP code for PTE reloading and maintaining reverse and forward maps in
the mmu minikernel.  There's a bug in here that makes the reverse map 
collide with the forward map allocated pages.  Haven't figure it out 
yet.

svn path=/branches/powerpc/; revision=27056
2007-06-07 18:11:13 +00:00
Art Yerkes
abb1072de8 - Fix a last bug in elf code.
- Start cleaning in kernel land for our current environment.
- Fix the build process just a bit (assign common addresses and loosen
  acceptable sections a bit).

svn path=/branches/powerpc/; revision=26818
2007-05-17 07:54:40 +00:00
Art Yerkes
6bfd850c13 Load address bug: offset from the real target, not kernel start.
svn path=/branches/powerpc/; revision=26779
2007-05-14 08:46:34 +00:00
Art Yerkes
4903cf0db8 Subtle bug.
svn path=/branches/powerpc/; revision=26777
2007-05-14 06:29:19 +00:00
Art Yerkes
e625607fb9 Process all boot drivers as elf. This makes things much easier and more
regular in kernel land.

svn path=/branches/powerpc/; revision=26776
2007-05-14 06:00:32 +00:00
Art Yerkes
deba115385 Fixed relocation.
svn path=/branches/powerpc/; revision=26767
2007-05-13 23:57:22 +00:00
Art Yerkes
cb39fd5820 Removed.
svn path=/branches/powerpc/; revision=26745
2007-05-13 07:25:25 +00:00
Art Yerkes
cc130cd0d5 Sizeable work, some WIP
- locore library for working the mmu
- work on prep etc
- we now get to kernel space in BE

svn path=/branches/powerpc/; revision=26744
2007-05-13 07:24:36 +00:00
Art Yerkes
8338983157 Properly filter sections that aren't in memory.
svn path=/branches/powerpc/; revision=26607
2007-05-01 08:52:58 +00:00
Art Yerkes
7a3fc87c74 Filter out dbg sections, handle relocs and symbols more efficiently.
svn path=/branches/powerpc/; revision=26606
2007-05-01 08:19:01 +00:00
Art Yerkes
a7ca02296b Don't replace linker name on that pass.
svn path=/branches/powerpc/; revision=26605
2007-05-01 07:25:44 +00:00
Art Yerkes
6fd8a37cc2 Final commits for elf conversion.
svn path=/branches/powerpc/; revision=26604
2007-05-01 07:20:45 +00:00
Art Yerkes
8fe743e51c Suppress peer warnings about abuse of C++ code (thanks? w3seek)
svn path=/branches/powerpc/; revision=26579
2007-04-29 09:37:17 +00:00
Art Yerkes
54811ff04e Some additions:
- Make sure translations are on after we set the new SDR
- Add some new prep hardware
	Despite its weaknesses, I'm indebted to my thinkpad 860 for
	teaching me about PCI controllers, and giving me confidence
	on PPC hardware

svn path=/branches/powerpc/; revision=26578
2007-04-29 09:12:55 +00:00
Art Yerkes
fc73dbb494 Start of a simple ELF PE augmenter.
svn path=/branches/powerpc/; revision=26574
2007-04-29 04:05:11 +00:00
Art Yerkes
e8c9d41dfe Get back to call into kernel.
svn path=/branches/powerpc/; revision=26573
2007-04-29 03:58:12 +00:00
Art Yerkes
3f8abbe149 Fix selection of CurrentControlSet.
svn path=/branches/powerpc/; revision=26572
2007-04-29 03:35:21 +00:00
Art Yerkes
31f327218a QEMU now gets to RegOpenKey.
svn path=/branches/powerpc/; revision=26571
2007-04-29 03:07:27 +00:00
Art Yerkes
50d2f8119a A perversely delightful hack to make hives of either BE or LE.
svn path=/branches/powerpc/; revision=26531
2007-04-27 05:48:13 +00:00
Art Yerkes
867ac19a73 Load ntoskrnl as elf from disk. This represents a pretty radical
diversion from previous work.

svn path=/branches/powerpc/; revision=26459
2007-04-22 11:05:31 +00:00
Art Yerkes
398ae0efb7 Adapt fat for BE booting.
Add proper port io in mach.c

svn path=/branches/powerpc/; revision=26446
2007-04-21 01:36:56 +00:00
Art Yerkes
256ed98f60 Some stragglers.
svn path=/branches/powerpc/; revision=26415
2007-04-19 05:36:21 +00:00
Art Yerkes
26cf1dcb7f Make disk ident work on qemu.
Revision to bootcd method.

svn path=/branches/powerpc/; revision=26391
2007-04-18 06:55:07 +00:00
Art Yerkes
5b9de03a76 Add the ability to load freeldr in qemu-system-ppc for the first time.
Use '-append bootprep' to force prep mode (not great yet).

svn path=/branches/powerpc/; revision=26369
2007-04-17 11:22:30 +00:00
Art Yerkes
5c69119650 Streamline freeldr now that we're in BE all the way.
svn path=/branches/powerpc/; revision=26364
2007-04-16 13:48:22 +00:00
Art Yerkes
2e7695dcfc Tweaks for gcc 4.
svn path=/branches/powerpc/; revision=26319
2007-04-11 06:23:48 +00:00
Art Yerkes
51360ae1c2 Remove the rest of the LE parts in freeldr.
We get into freeldr proper in BE.

svn path=/branches/powerpc/; revision=26318
2007-04-11 03:52:48 +00:00
Art Yerkes
8eed64e68d Remove boot process LE parts.
svn path=/branches/powerpc/; revision=26313
2007-04-10 20:49:58 +00:00
394 changed files with 100599 additions and 29508 deletions

View File

@@ -32,6 +32,7 @@
<compilerflag>-meabi</compilerflag>
<compilerflag>-O2</compilerflag>
<compilerflag>-Wno-strict-aliasing</compilerflag>
<compilerflag>-Wno-trampolines</compilerflag>
<if property="MP" value="1">
<define name="CONFIG_SMP" value="1" />
</if>

View File

@@ -19,9 +19,6 @@
<directory name="games">
<xi:include href="games/games.rbuild" />
</directory>
<directory name="getfirefox">
<xi:include href="getfirefox/getfirefox.rbuild" />
</directory>
<directory name="hostname">
<xi:include href="hostname/hostname.rbuild" />
</directory>

View File

@@ -4,8 +4,10 @@
<directory name="cmd">
<xi:include href="cmd/cmd.rbuild" />
</directory>
<if property="ARCH" value="x86">
<directory name="explorer">
<xi:include href="explorer/explorer.rbuild" />
</directory>
</if>
</group>
</rbuild>

View File

@@ -18,9 +18,3 @@
<bootstrap base="loader" nameoncd="isoboot.bin" />
<file>isoboot.asm</file>
</module>
<if property="ARCH" value="powerpc">
<module name="ofwldr" type="bootprogram" payload="freeldr">
<bootstrap base="loader" nameoncd="boot/ofwldr" />
<file>ofwboot.s</file>
</module>
</if>

View File

@@ -1,499 +0,0 @@
.section .text
.globl ofw_functions_addr
ofw_functions_addr:
.long ofw_functions
.align 4
call_freeldr:
/* Get the address of the functions list --
* Note:
* Because of little endian switch we must use an even number of
* instructions here.. Pad with a nop if needed. */
mfmsr %r10
ori %r10,%r10,1
nop
mtmsr %r10
/* Note that this is little-endian from here on */
blr
nop
.align 4
call_ofw:
/* R3 has the function offset to call (n * 4)
* Other arg registers are unchanged.
* Note that these 4 instructions are in reverse order due to
* little-endian convention */
stw %r8,24(%r1)
subi %r1,%r1,0x100
stw %r8,0(%r1)
mflr %r8
/* - */
stw %r3,4(%r1)
stw %r4,8(%r1)
stw %r5,12(%r1)
stw %r6,16(%r1)
/* - */
stw %r7,20(%r1)
stw %r9,28(%r1)
stw %r10,32(%r1)
stw %r20,36(%r1)
/* - */
subi %r20,%r20,1
mfmsr %r20
mtmsr %r20
nop
sync
isync
/* BE MODE */
mflr %r8
stw %r8,16(%r1)
lis %r10,0xe00000@ha
addi %r8,%r10,ofw_functions_addr@l
/* - */
lwz %r9,0(%r8)
add %r8,%r3,%r9
lwz %r9,0(%r8)
mtctr %r9
/* - */
mr %r3,%r4
mr %r4,%r5
mr %r5,%r6
mr %r6,%r7
/* - */
mr %r7,%r8
mr %r8,%r9
/* Call ofw proxy function */
bctrl
nop
/* Ok, go back to little endian */
mfmsr %r10
ori %r10,%r10,1
nop
mtmsr %r10
sync
isync
/* LE MODE */
mtlr %r8
lwz %r8,0(%r1)
lwz %r4,8(%r1)
lwz %r5,12(%r1)
/* - */
lwz %r6,16(%r1)
lwz %r7,20(%r1)
lwz %r8,24(%r1)
lwz %r9,28(%r1)
/* - */
lwz %r10,32(%r1)
lwz %r20,36(%r1)
/* - */
blr
addi %r1,%r1,0x100
prim_strlen:
mr %r5,%r3
prim_strlen_loop:
lbz %r4,0(%r3)
cmpi 0,0,%r4,0
beq prim_strlen_done
addi %r3,%r3,1
b prim_strlen_loop
prim_strlen_done:
sub %r3,%r3,%r5
blr
copy_bits:
cmp 0,0,%r3,%r4
bgelr
andi. %r6,%r3,0xfff
beql ofw_dumpregs
mtdec %r3
lwz %r6,0(%r3)
stw %r6,0(%r5)
addi %r3,%r3,4
addi %r5,%r5,4
b copy_bits
ofw_print_string:
/* Reserve some stack space */
subi %r1,%r1,32
/* Save args */
stw %r3,0(%r1)
/* Save the lr, a scratch register */
stw %r8,8(%r1)
mflr %r8
stw %r8,12(%r1)
/* Load the package name */
lis %r3,0xe00000@ha
addi %r3,%r3,ofw_chosen_name - _start
/* Fire */
bl ofw_finddevice
/* Load up for getprop */
stw %r3,16(%r1)
lis %r4,0xe00000@ha
addi %r4,%r4,ofw_stdout_name - _start
addi %r5,%r1,20
li %r6,4
bl ofw_getprop
/* Measure the string and remember the length */
lwz %r3,0(%r1)
bl prim_strlen
mr %r5,%r3
lwz %r3,20(%r1)
lwz %r4,0(%r1)
/* Write the string */
bl ofw_write
/* Return */
lwz %r8,12(%r1)
mtlr %r8
lwz %r8,8(%r1)
addi %r1,%r1,32
blr
/* Print 8 hex digits representing a number in r3 */
ofw_print_number:
subi %r1,%r1,32
stw %r8,0(%r1)
mflr %r8
stw %r8,4(%r1)
stw %r9,8(%r1)
xor %r9,%r9,%r9
stw %r9,12(%r1)
/* Set up and, devide, shift */
mr %r8,%r3
lis %r6,0xf0000000@ha
lis %r7,0x10000000@ha
li %r9,8
ofw_number_loop:
nop
cmpi 0,0,%r9,0
beq ofw_number_return
subi %r9,%r9,1
/* Body: isolate digit, divide, print */
and %r5,%r6,%r8
divwu %r4,%r5,%r7
srwi %r6,%r6,4
srwi %r7,%r7,4
nop
cmpi 0,0,%r4,10
bge ofw_number_letter
addi %r4,%r4,'0'
b ofw_number_digit_out
ofw_number_letter:
addi %r4,%r4,'A' - 10
ofw_number_digit_out:
stb %r4,12(%r1)
addi %r3,%r1,12
stw %r6,16(%r1)
stw %r7,20(%r1)
stw %r8,24(%r1)
stw %r9,28(%r1)
bl ofw_print_string
lwz %r6,16(%r1)
lwz %r7,20(%r1)
lwz %r8,24(%r1)
lwz %r9,28(%r1)
b ofw_number_loop
ofw_number_return:
/* Return */
lwz %r9,8(%r1)
lwz %r8,4(%r1)
mtlr %r8
lwz %r8,0(%r1)
addi %r1,%r1,32
blr
ofw_print_eol:
subi %r1,%r1,16
stw %r8,0(%r1)
mflr %r8
stw %r8,4(%r1)
li %r4,0x0d0a
sth %r4,8(%r1)
xor %r4,%r4,%r4
sth %r4,10(%r1)
addi %r3,%r1,8
bl ofw_print_string
lwz %r8,4(%r1)
mtlr %r8
lwz %r8,0(%r1)
addi %r1,%r1,16
blr
ofw_print_nothing:
subi %r1,%r1,16
stw %r8,0(%r1)
mflr %r8
stw %r8,4(%r1)
li %r4,0
sth %r4,8(%r1)
xor %r4,%r4,%r4
sth %r4,10(%r1)
addi %r3,%r1,8
bl ofw_print_string
lwz %r8,4(%r1)
mtlr %r8
lwz %r8,0(%r1)
addi %r1,%r1,16
blr
ofw_print_space:
subi %r1,%r1,16
stw %r8,0(%r1)
mflr %r8
stw %r8,4(%r1)
li %r4,0x2000
sth %r4,8(%r1)
xor %r4,%r4,%r4
sth %r4,10(%r1)
addi %r3,%r1,8
bl ofw_print_string
lwz %r8,4(%r1)
mtlr %r8
lwz %r8,0(%r1)
addi %r1,%r1,16
blr
ofw_dumpregs:
/* Construct ofw exit call */
subi %r1,%r1,0xa0
stw %r0,0(%r1)
stw %r1,4(%r1)
stw %r2,8(%r1)
stw %r3,12(%r1)
stw %r4,16(%r1)
stw %r5,20(%r1)
stw %r6,24(%r1)
stw %r7,28(%r1)
stw %r8,32(%r1)
stw %r9,36(%r1)
stw %r10,40(%r1)
stw %r11,44(%r1)
stw %r12,48(%r1)
stw %r13,52(%r1)
stw %r14,56(%r1)
stw %r15,60(%r1)
stw %r16,64(%r1)
stw %r17,68(%r1)
stw %r18,72(%r1)
stw %r19,76(%r1)
stw %r20,80(%r1)
stw %r21,84(%r1)
stw %r22,88(%r1)
stw %r23,92(%r1)
stw %r24,96(%r1)
stw %r25,100(%r1)
stw %r26,104(%r1)
stw %r27,108(%r1)
stw %r28,112(%r1)
stw %r29,116(%r1)
stw %r30,120(%r1)
stw %r31,124(%r1)
mflr %r0
stw %r0,128(%r1)
mfcr %r0
stw %r0,132(%r1)
mfctr %r0
stw %r0,136(%r1)
mfmsr %r0
stw %r0,140(%r1)
/* Count at zero */
xor %r0,%r0,%r0
stw %r0,144(%r1)
mr %r3,%r1
stw %r3,148(%r1)
/* Body, print the regname, then the register */
ofw_register_loop:
lwz %r3,144(%r1)
cmpi 0,0,%r3,32
beq ofw_register_special
lis %r3,0xe00000@ha
addi %r3,%r3,freeldr_reg_init - _start
bl ofw_print_string
lwz %r3,144(%r1)
bl ofw_print_number
bl ofw_print_space
lwz %r3,144(%r1)
mulli %r3,%r3,4
add %r3,%r1,%r3
lwz %r3,0(%r3)
stw %r3,152(%r1)
bl ofw_print_number
lwz %r3,144(%r1)
addi %r3,%r3,1
stw %r3,144(%r1)
bl ofw_print_space
lis %r3,0xe00000@ha
addi %r3,%r3,freeldr_reg_init - _start
bl ofw_print_string
lwz %r3,144(%r1)
bl ofw_print_number
bl ofw_print_space
lwz %r3,144(%r1)
mulli %r3,%r3,4
add %r3,%r1,%r3
lwz %r3,0(%r3)
stw %r3,152(%r1)
bl ofw_print_number
lwz %r3,144(%r1)
addi %r3,%r3,1
stw %r3,144(%r1)
b done_dump
dump_optional:
bl ofw_print_space
bl ofw_print_space
lwz %r3,152(%r1)
lwz %r3,0(%r3)
bl ofw_print_number
bl ofw_print_space
lwz %r3,152(%r1)
lwz %r3,4(%r3)
bl ofw_print_number
bl ofw_print_space
lwz %r3,152(%r1)
lwz %r3,8(%r3)
bl ofw_print_number
bl ofw_print_space
lwz %r3,152(%r1)
lwz %r3,12(%r3)
bl ofw_print_number
bl ofw_print_space
done_dump:
bl ofw_print_eol
b ofw_register_loop
ofw_register_special:
/* LR */
lis %r3,0xe00000@ha
addi %r3,%r3,freeldr_reg_lr - _start
bl ofw_print_string
bl ofw_print_space
lwz %r3,128(%r1)
bl ofw_print_number
bl ofw_print_eol
/* CR */
lis %r3,0xe00000@ha
addi %r3,%r3,freeldr_reg_cr - _start
bl ofw_print_string
bl ofw_print_space
lwz %r3,132(%r1)
bl ofw_print_number
bl ofw_print_eol
/* CTR */
lis %r3,0xe00000@ha
addi %r3,%r3,freeldr_reg_ctr - _start
bl ofw_print_string
bl ofw_print_space
lwz %r3,136(%r1)
bl ofw_print_number
bl ofw_print_eol
/* MSR */
lis %r3,0xe00000@ha
addi %r3,%r3,freeldr_reg_msr - _start
bl ofw_print_string
bl ofw_print_space
lwz %r3,140(%r1)
bl ofw_print_number
bl ofw_print_eol
/* Return */
lwz %r0,128(%r1)
mtlr %r0
lwz %r0,0(%r1)
lwz %r2,8(%r1)
lwz %r3,12(%r1)
lwz %r4,16(%r1)
lwz %r5,20(%r1)
lwz %r6,24(%r1)
lwz %r7,28(%r1)
addi %r1,%r1,0xa0
blr
ofw_chosen_name:
.ascii "/chosen\0"
ofw_stdout_name:
.ascii "stdout\0"
ofw_memory_name:
.ascii "/memory@0\0"
ofw_reg_name:
.ascii "reg\0"
freeldr_reg_init:
.ascii "r\0"
freeldr_reg_lr:
.ascii "lr \0"
freeldr_reg_cr:
.ascii "cr \0"
freeldr_reg_ctr:
.ascii "ctr\0"
freeldr_reg_msr:
.ascii "msr\0"

View File

@@ -1,104 +0,0 @@
.section .text
_start:
.long 0xe00000 + 12
.long 0
.long 0
.globl _begin
_begin:
sync
isync
lis %r1,stack@ha
addi %r1,%r1,stack@l
addi %r1,%r1,16384 - 0x10
/* Store ofw call addr */
mr %r21,%r5
lis %r10,0xe00000@ha
stw %r5,ofw_call_addr - _start@l(%r10)
lis %r3,0xe00000@ha
addi %r3,%r3,freeldr_banner - _start
bl ofw_print_string
bl ofw_print_eol
bl zero_registers
/* Zero CTR */
mtcr %r31
lis %r3,0xe17000@ha
addi %r3,%r3,0xe17000@l
mtlr %r3
lis %r3,call_ofw@ha
addi %r3,%r3,call_ofw - _start
b call_freeldr
zero_registers:
xor %r2,%r2,%r2
mr %r0,%r2
mr %r3,%r2
mr %r4,%r2
mr %r5,%r2
mr %r6,%r2
mr %r7,%r2
mr %r8,%r2
mr %r9,%r2
mr %r10,%r2
mr %r11,%r2
mr %r12,%r2
mr %r13,%r2
mr %r14,%r2
mr %r15,%r2
mr %r12,%r2
mr %r13,%r2
mr %r14,%r2
mr %r15,%r2
mr %r16,%r2
mr %r17,%r2
mr %r18,%r2
mr %r19,%r2
mr %r20,%r2
mr %r21,%r2
mr %r22,%r2
mr %r23,%r2
mr %r24,%r2
mr %r25,%r2
mr %r26,%r2
mr %r27,%r2
mr %r28,%r2
mr %r29,%r2
mr %r30,%r2
mr %r31,%r2
blr
freeldr_banner:
.ascii "ReactOS OpenFirmware Boot Program\r\n\0"
freeldr_halt:
.ascii "ReactOS OpenFirmware Boot Program Halting\r\n\0"
ofw_memory_size:
.long 0
.long 0
.long 0
.long 0
.org 0x1000
stack:
.space 0x4000

View File

@@ -1,8 +1,103 @@
.section ".text"
.extern PpcInit
.globl _start
.globl call_ofw
_start:
b PpcInit
sync
isync
lis %r1,stackend@ha
addi %r1,%r1,stackend@l
/* Store ofw call addr */
mr %r21,%r5
lis %r10,ofw_call_addr@ha
stw %r5,ofw_call_addr@l(%r10)
bl zero_registers
/* Zero CTR */
mtcr %r31
lis %r3,PpcInit@ha
addi %r3,%r3,PpcInit@l
mtlr %r3
/* Check for ofw */
lis %r3,ofw_call_addr@ha
lwz %r3,ofw_call_addr@l(%r3)
cmpw %r3,%r31 /* Zero? */
mr %r3,%r31
beq bootme
lis %r3,call_ofw@ha
addi %r3,%r3,call_ofw@l
bootme:
blr
zero_registers:
xor %r2,%r2,%r2
mr %r0,%r2
mr %r3,%r2
mr %r4,%r2
mr %r5,%r2
mr %r6,%r2
mr %r7,%r2
mr %r8,%r2
mr %r9,%r2
mr %r10,%r2
mr %r11,%r2
mr %r12,%r2
mr %r13,%r2
mr %r14,%r2
mr %r15,%r2
mr %r12,%r2
mr %r13,%r2
mr %r14,%r2
mr %r15,%r2
mr %r16,%r2
mr %r17,%r2
mr %r18,%r2
mr %r19,%r2
mr %r20,%r2
mr %r21,%r2
mr %r22,%r2
mr %r23,%r2
mr %r24,%r2
mr %r25,%r2
mr %r26,%r2
mr %r27,%r2
mr %r28,%r2
mr %r29,%r2
mr %r30,%r2
mr %r31,%r2
blr
ofw_memory_size:
.long 0
.long 0
.long 0
.long 0
.align 4
stack:
.space 0x4000
stackend:
.long 0,0,0,0
.globl _bss
.section ".bss"
_bss:
.long 0
.align 4

View File

@@ -18,9 +18,10 @@
*/
#include "freeldr.h"
#include "machine.h"
#include "of.h"
#include "mmu.h"
#include "of.h"
#include "ppcboot.h"
#include "prep.h"
#include "compat.h"
extern void BootMain( LPSTR CmdLine );
@@ -28,37 +29,21 @@ extern PCHAR GetFreeLoaderVersionString();
extern ULONG CacheSizeLimit;
of_proxy ofproxy;
void *PageDirectoryStart, *PageDirectoryEnd;
static int chosen_package, stdin_handle, part_handle = -1, kernel_mem = 0;
static int chosen_package, stdin_handle, stdout_handle,
part_handle = -1, kernel_mem = 0;
int mmu_handle = 0, FixedMemory = 0;
BOOLEAN AcpiPresent = FALSE;
char BootPath[0x100] = { 0 }, BootPart[0x100] = { 0 }, CmdLine[0x100] = { 0 };
char BootPath[0x100] = { 0 }, BootPart[0x100] = { 0 }, CmdLine[0x100] = { "bootprep" };
jmp_buf jmp;
volatile char *video_mem = 0;
boot_infos_t BootInfo;
void le_swap( void *start_addr_v,
void *end_addr_v,
void *target_addr_v ) {
long
*start_addr = (long *)ROUND_DOWN((long)start_addr_v,8),
*end_addr = (long *)ROUND_UP((long)end_addr_v,8),
*target_addr = (long *)ROUND_DOWN((long)target_addr_v,8);
long tmp;
while( start_addr <= end_addr ) {
tmp = start_addr[0];
target_addr[0] = REV(start_addr[1]);
target_addr[1] = REV(tmp);
start_addr += 2;
target_addr += 2;
}
}
void PpcPutChar( int ch ) {
void PpcOfwPutChar( int ch ) {
char buf[3];
if( ch == 0x0a ) { buf[0] = 0x0d; buf[1] = 0x0a; }
else { buf[0] = ch; buf[1] = 0; }
buf[2] = 0;
ofw_print_string( buf );
ofw_write(stdout_handle, buf, strlen(buf));
}
int PpcFindDevice( int depth, int parent, char *devname, int *nth ) {
@@ -80,7 +65,7 @@ int PpcFindDevice( int depth, int parent, char *devname, int *nth ) {
if( !nth && match ) return parent;
for( i = 0; i < depth; i++ ) PpcPutChar( ' ' );
for( i = 0; i < depth; i++ ) PpcOfwPutChar( ' ' );
if( depth == 1 ) {
if( gotname > 0 ) {
@@ -110,21 +95,17 @@ int PpcConsGetCh() {
}
void PpcVideoClearScreen( UCHAR Attr ) {
ofw_print_string("ClearScreen\n");
}
VOID PpcVideoGetDisplaySize( PULONG Width, PULONG Height, PULONG Depth ) {
//ofw_print_string("GetDisplaySize\n");
*Width = 80;
*Height = 25;
*Depth = 16;
//printf("GetDisplaySize(%d,%d,%d)\n", *Width, *Height, *Depth);
}
ULONG PpcVideoGetBufferSize() {
ULONG Width, Height, Depth;
//ofw_print_string("PpcVideoGetBufferSize\n");
PpcVideoGetDisplaySize( &Width, &Height, &Depth );
MachVideoGetDisplaySize( &Width, &Height, &Depth );
return Width * Height * Depth / 8;
}
@@ -154,14 +135,14 @@ VOID PpcVideoCopyOffScreenBufferToVRAM( PVOID Buffer ) {
PCHAR ChBuf = Buffer;
int offset = 0;
PpcVideoGetDisplaySize( &w, &h, &d );
MachVideoGetDisplaySize( &w, &h, &d );
for( i = 0; i < h; i++ ) {
for( j = 0; j < w; j++ ) {
offset = (j * 2) + (i * w * 2);
if( ChBuf[offset] != video_mem[offset] ) {
video_mem[offset] = ChBuf[offset];
PpcVideoPutChar(ChBuf[offset],0,j+1,i+1);
MachVideoPutChar(ChBuf[offset],0,j+1,i+1);
}
}
}
@@ -266,10 +247,10 @@ VOID PpcVideoPrepareForReactOS() {
ofw_getprop(display_package, "linebytes",
(void *)&BootInfo.dispDeviceRowBytes, sizeof(int));
BootInfo.dispDeviceRect[2] = REV(BootInfo.dispDeviceRect[2]);
BootInfo.dispDeviceRect[3] = REV(BootInfo.dispDeviceRect[3]);
BootInfo.dispDeviceDepth = REV(BootInfo.dispDeviceDepth);
BootInfo.dispDeviceRowBytes = REV(BootInfo.dispDeviceRowBytes);
BootInfo.dispDeviceRect[2] = BootInfo.dispDeviceRect[2];
BootInfo.dispDeviceRect[3] = BootInfo.dispDeviceRect[3];
BootInfo.dispDeviceDepth = BootInfo.dispDeviceDepth;
BootInfo.dispDeviceRowBytes = BootInfo.dispDeviceRowBytes;
if(ofw_getprop
(display_package,
@@ -280,7 +261,7 @@ VOID PpcVideoPrepareForReactOS() {
return;
}
BootInfo.dispDeviceBase = (PVOID)(REV(device_address));
BootInfo.dispDeviceBase = (PVOID)(device_address);
display_size = BootInfo.dispDeviceRowBytes * BootInfo.dispDeviceRect[3];
@@ -334,8 +315,8 @@ ULONG PpcGetMemoryMap( PBIOS_MEMORY_MAP BiosMemoryMap,
for( i = 0; i < returned / 2; i++ ) {
BiosMemoryMap[slots].Type = 1/*MEMTYPE_USABLE*/;
BiosMemoryMap[slots].BaseAddress = REV(memdata[i*2]);
BiosMemoryMap[slots].Length = REV(memdata[i*2+1]);
BiosMemoryMap[slots].BaseAddress = memdata[i*2];
BiosMemoryMap[slots].Length = memdata[i*2+1];
printf("MemoryMap[%d] = (%x:%x)\n",
i,
(int)BiosMemoryMap[slots].BaseAddress,
@@ -397,7 +378,7 @@ BOOLEAN PpcDiskGetSystemVolume( char *SystemPath,
RemainingPath[0] = 0;
}
*Device = 0;
return PpcDiskGetBootVolume(DriveNumber, StartSector, SectorCount, FsType);
return MachDiskGetBootVolume(DriveNumber, StartSector, SectorCount, FsType);
}
BOOLEAN PpcDiskGetBootPath( char *OutBootPath, unsigned Size ) {
@@ -510,27 +491,21 @@ BOOLEAN PpcDiskNormalizeSystemPath(char *SystemPath, unsigned Size) {
extern int _bss;
typedef unsigned int uint32_t;
void PpcInit( of_proxy the_ofproxy ) {
int len, stdin_handle_chosen, mmu_handle_chosen;
ofproxy = the_ofproxy;
//SetPhys(0x900, (19 << 26) | (50 << 1));
void PpcOfwInit()
{
chosen_package = ofw_finddevice( "/chosen" );
ofw_getprop(chosen_package, "bootargs",
CmdLine, sizeof(CmdLine));
ofw_getprop( chosen_package, "stdin",
(char *)&stdin_handle_chosen, sizeof(stdin_handle_chosen) );
(char *)&stdin_handle, sizeof(stdin_handle) );
ofw_getprop( chosen_package, "stdout",
(char *)&stdout_handle, sizeof(stdout_handle) );
ofw_getprop( chosen_package, "mmu",
(char *)&mmu_handle_chosen, sizeof(mmu_handle_chosen) );
(char *)&mmu_handle, sizeof(mmu_handle) );
ofw_print_string("Found stdin ");
ofw_print_number(stdin_handle_chosen);
ofw_print_string("\r\n");
stdin_handle = REV(stdin_handle_chosen);
mmu_handle = REV(mmu_handle_chosen);
MachVtbl.ConsPutChar = PpcPutChar;
MachVtbl.ConsPutChar = PpcOfwPutChar;
MachVtbl.ConsKbHit = PpcConsKbHit;
MachVtbl.ConsGetCh = PpcConsGetCh;
@@ -571,21 +546,27 @@ void PpcInit( of_proxy the_ofproxy ) {
MachVtbl.HwDetect = PpcHwDetect;
// Allow forcing prep for broken OFW
if(!strncmp(CmdLine, "bootprep", 8))
{
printf("Going to PREP init...\n");
PpcPrepInit();
return;
}
printf( "FreeLDR version [%s]\n", GetFreeLoaderVersionString() );
len = ofw_getprop(chosen_package, "bootargs",
CmdLine, sizeof(CmdLine));
if( len < 0 ) len = 0;
CmdLine[len] = 0;
printf("bootargs: len %d [%s]\n", len, CmdLine);
BootMain( CmdLine );
}
void PpcInit( of_proxy the_ofproxy ) {
ofproxy = the_ofproxy;
if(ofproxy) PpcOfwInit();
else PpcPrepInit();
}
void MachInit(const char *CmdLine) {
int len, i;
int i, len;
char *sep;
BootPart[0] = 0;
@@ -633,10 +614,11 @@ void beep() {
}
UCHAR NTAPI READ_PORT_UCHAR(PUCHAR Address) {
return 0xff;
return GetPhysByte(((ULONG)Address)+0x80000000);
}
void WRITE_PORT_UCHAR(PUCHAR Address, UCHAR Value) {
SetPhysByte(((ULONG)Address)+0x80000000, Value);
}
void DiskStopFloppyMotor() {

View File

@@ -19,6 +19,8 @@
*/
#include <freeldr.h>
#include <elf/elf.h>
#include <elf/reactos.h>
#include <of_call.h>
#include "ppcboot.h"
#include "mmu.h"
@@ -28,7 +30,7 @@
#define NDEBUG
#include <debug.h>
static PVOID KernelMemory = 0;
PVOID KernelMemory = 0;
extern boot_infos_t BootInfo;
/* Bits to shift to convert a Virtual Address into an Offset in the Page Table */
@@ -38,20 +40,6 @@ extern boot_infos_t BootInfo;
#define PDE_SHIFT 22
#define PDE_SHIFT_PAE 18
/* Converts a Relative Address read from the Kernel into a Physical Address */
ULONG RaToPa(ULONG p) {
return (ULONG)(KernelMemory) + p;
}
/* Converts a Phsyical Address Pointer into a Page Frame Number */
#define PaPtrToPfn(p) \
(((ULONG_PTR)&p) >> PFN_SHIFT)
/* Converts a Phsyical Address into a Page Frame Number */
#define PaToPfn(p) \
((p) >> PFN_SHIFT)
#define STARTUP_BASE 0xC0000000
#define HYPERSPACE_BASE 0xC0400000
#define HYPERSPACE_PAE_BASE 0xC0800000
@@ -72,7 +60,7 @@ ULONG RaToPa(ULONG p) {
#define BAT_GRANULARITY (64 * 1024)
#define KernelMemorySize (16 * 1024 * 1024)
#define KernelMemorySize (8 * 1024 * 1024)
#define KernelEntryPoint (KernelEntry - KERNEL_BASE_PHYS) + KernelBase
#define XROUNDUP(x,n) ((((ULONG)x) + ((n) - 1)) & (~((n) - 1)))
@@ -91,6 +79,18 @@ BOOLEAN PaeModeEnabled;
/* Kernel Entrypoint in Physical Memory */
ULONG_PTR KernelEntry;
/* Dummy to bring in memmove */
PVOID memmove_dummy = memmove;
PLOADER_MODULE
NTAPI
LdrGetModuleObject(PCHAR ModuleName);
NTSTATUS
NTAPI
LdrPEFixupImports(IN PVOID DllBase,
IN PCHAR DllName);
/* FUNCTIONS *****************************************************************/
/*++
@@ -112,78 +112,14 @@ ULONG_PTR KernelEntry;
typedef void (*KernelEntryFn)( void * );
VOID
DrawDigit(boot_infos_t *BootInfo, ULONG Digit, int x, int y)
{
int i,j,k;
for( i = 0; i < 7; i++ ) {
for( j = 0; j < 8; j++ ) {
for( k = 0; k < BootInfo->dispDeviceDepth/8; k++ ) {
SetPhysByte(((ULONG_PTR)BootInfo->dispDeviceBase)+
k +
(((j+x) * (BootInfo->dispDeviceDepth/8)) +
((i+y) * (BootInfo->dispDeviceRowBytes))),
BootInfo->dispFont[Digit][i*8+j] == ' ' ? 0 : 255);
}
}
}
}
VOID
DrawNumber(boot_infos_t *BootInfo, ULONG Number, int x, int y)
int MmuPageMiss(int inst, ppc_trap_frame_t *trap)
{
int i;
for( i = 0; i < 8; i++, Number<<=4 ) {
DrawDigit(BootInfo,(Number>>28)&0xf,x+(i*8),y);
}
}
typedef struct _DIRECTORY_ENTRY {
ULONG Virt, Phys;
} DIRECTORY_ENTRY;
typedef struct _DIRECTORY_HEADER {
UINT NumberOfPages;
UINT DirectoryPage, UsedSpace;
DIRECTORY_ENTRY *Directory[1];
} DIRECTORY_HEADER;
DIRECTORY_ENTRY *
GetPageMapping( DIRECTORY_HEADER *TranslationMap, ULONG Number ) {
if( Number >= (ULONG)TranslationMap->NumberOfPages ) return 0;
else {
int EntriesPerPage = (1<<PFN_SHIFT)/sizeof(DIRECTORY_ENTRY);
return &TranslationMap->Directory
[Number/EntriesPerPage][Number%EntriesPerPage];
}
}
VOID
AddPageMapping( DIRECTORY_HEADER *TranslationMap,
ULONG Virt,
ULONG OldVirt) {
ULONG Phys;
DIRECTORY_ENTRY *Entry;
if( !TranslationMap->DirectoryPage ||
TranslationMap->UsedSpace >= ((1<<PFN_SHIFT)/sizeof(DIRECTORY_ENTRY)) )
{
TranslationMap->Directory
[TranslationMap->DirectoryPage] = MmAllocateMemory(1<<PFN_SHIFT);
TranslationMap->UsedSpace = 0;
TranslationMap->DirectoryPage++;
AddPageMapping
(TranslationMap,
(ULONG)TranslationMap->Directory
[TranslationMap->DirectoryPage-1],0);
}
Phys = PpcVirt2phys(Virt,0);
TranslationMap->NumberOfPages++;
Entry = GetPageMapping(TranslationMap, TranslationMap->NumberOfPages-1);
Entry->Virt = OldVirt ? OldVirt : Virt; Entry->Phys = Phys;
TranslationMap->UsedSpace++;
printf("inst %x\n", inst);
for( i = 0; i < 40; i++ )
printf("r[%d] %x\n", i, trap->gpr[i]);
printf("HALT!\n");
while(1);
}
VOID
@@ -192,70 +128,87 @@ FrLdrStartup(ULONG Magic)
{
KernelEntryFn KernelEntryAddress =
(KernelEntryFn)(KernelEntry + KernelBase);
ULONG_PTR i, j;
DIRECTORY_HEADER *TranslationMap = MmAllocateMemory(4<<PFN_SHIFT);
ULONG_PTR stack = ((ULONG_PTR)TranslationMap)+(4<<PFN_SHIFT);
boot_infos_t *LocalBootInfo = (boot_infos_t *)TranslationMap;
TranslationMap = (DIRECTORY_HEADER *)
(((PCHAR)&LocalBootInfo[1]) + sizeof(BootDigits));
memcpy(&LocalBootInfo[1], BootDigits, sizeof(BootDigits));
*LocalBootInfo = BootInfo;
ULONG_PTR i, j, page, count;
PCHAR ModHeader;
boot_infos_t *LocalBootInfo = &BootInfo;
LocalBootInfo->dispFont = (font_char *)&LocalBootInfo[1];
ULONG_PTR KernelVirtAddr, NewMapSdr =
(ULONG_PTR)MmAllocateMemory(128*1024);
DIRECTORY_ENTRY *Entry;
LoaderBlock.ArchExtra = (ULONG)LocalBootInfo;
ppc_map_info_t *info = MmAllocateMemory(0x80 * sizeof(*info));
printf("Translation map: %x\n", TranslationMap);
NewMapSdr = XROUNDUP(NewMapSdr,64*1024);
printf("New SDR1 value will be %x\n", NewMapSdr);
memset(TranslationMap,0,sizeof(*TranslationMap));
printf("Translation map zeroed\n");
/* Add the page containing the page directory */
for( i = (ULONG_PTR)TranslationMap; i < stack; i += (1<<PFN_SHIFT) ) {
AddPageMapping( TranslationMap, i, 0 );
for(i = 0; i < LoaderBlock.ModsCount; i++)
{
ModHeader = ((PCHAR)reactos_modules[i].ModStart);
if(ModHeader[0] == 'M' && ModHeader[1] == 'Z')
LdrPEFixupImports
((PVOID)reactos_modules[i].ModStart,
(PCHAR)reactos_modules[i].String);
}
/* Map freeldr space 0xe00000 ... 0xe60000 */
for( i = 0xe00000; i < 0xe80000; i += (1<<PFN_SHIFT) ) {
AddPageMapping( TranslationMap, i, 0 );
/* We'll use vsid 1 for freeldr (expendable) */
for(i = 0; i < 8; i++)
{
MmuAllocVsid(16 + i);
}
MmuSetVsid(0, 8, 1);
/* Vsid 0 is reactos kernel */
for(i = 8; i < 16; i++)
{
MmuAllocVsid(i);
}
MmuSetVsid(8, 16, 0);
MmuSetPageCallback(MmuPageMiss);
info = MmAllocateMemory((KernelMemorySize >> PAGE_SHIFT) * sizeof(*info));
/* Map kernel space 0x80000000 ... */
for( i = (ULONG)KernelMemory;
for( i = (ULONG)KernelMemory, page = 0;
i < (ULONG)KernelMemory + KernelMemorySize;
i += (1<<PFN_SHIFT),j++ ) {
KernelVirtAddr = LoaderBlock.KernelBase + (i - (ULONG)KernelMemory);
AddPageMapping( TranslationMap, i, KernelVirtAddr );
i += (1<<PFN_SHIFT), page++ ) {
info[page].proc = 0;
info[page].addr = KernelBase + (page << PAGE_SHIFT);
info[page].phys = i; //PpcVirt2phys(i, 1);
info[page].flags = MMU_ALL_RW;
}
printf("Built map of %d pages\n", TranslationMap->NumberOfPages);
printf("Local boot info at %x\n", LocalBootInfo);
MmuMapPage(info, page);
/*
* Stuff page table entries for the page containing this code,
* The pages containing the page table entries, and finally the kernel
* pages.
*
* When done, we'll be able to flop over to kernel land!
*/
for( i = 0, Entry = GetPageMapping( TranslationMap, i );
Entry;
i++, Entry = GetPageMapping( TranslationMap, i ) ) {
DrawNumber(LocalBootInfo,Entry->Virt,10,90);
DrawNumber(LocalBootInfo,Entry->Phys,100,90);
InsertPageEntry( Entry->Virt, Entry->Phys,
(i & 0x3ff) >> 3, NewMapSdr );
/* Map module name strings */
for( count = 0, i = 0; i < LoaderBlock.ModsCount; i++ )
{
page = ROUND_DOWN(((ULONG)reactos_modules[i].String), (1<<PFN_SHIFT));
for( j = 0; j < count; j++ )
{
if(info[j].addr == page) break;
}
if( j != count )
{
info[count].flags = MMU_ALL_RW;
info[count].proc = 1;
info[count].addr = page;
info[count].phys = page; // PpcVirt2phys(page, 0);
count++;
}
}
/* Tell them we're booting */
DrawNumber(LocalBootInfo,(ULONG)&LoaderBlock,10,100);
DrawNumber(LocalBootInfo,(ULONG)KernelEntryAddress,100,100);
page = ROUND_DOWN((vaddr_t)&LoaderBlock, (1 << PAGE_SHIFT));
for( j = 0; j < count; j++ )
{
if(info[j].addr == page) break;
}
if( j != count )
{
info[count].flags = MMU_ALL_RW;
info[count].proc = 1;
info[count].addr = page;
info[count].phys = page; // PpcVirt2phys(page, 0);
count++;
}
MmuMapPage(info, count);
MmuTurnOn(KernelEntryAddress, (void*)&LoaderBlock);
SetSDR1( NewMapSdr );
KernelEntryAddress( (void*)&LoaderBlock );
/* Nothing more */
while(1);
}
@@ -299,12 +252,15 @@ FrLdrSetupPae(ULONG Magic)
* will be used by the Kernel.
*
*--*/
static VOID
VOID
FASTCALL
FrLdrGetKernelBase(VOID)
{
PCHAR p;
/* Default kernel base at 2GB */
KernelBase = 0x80000000;
/* Set KernelBase */
LoaderBlock.KernelBase = KernelBase;
@@ -373,10 +329,271 @@ FrLdrSetupPageDirectory(VOID)
{
}
ULONG SignExtend24(ULONG Base, ULONG Delta)
/*++
* FrLdrMapModule
* INTERNAL
*
* Loads the indicated elf image as PE. The target will appear to be
* a PE image whose ImageBase has ever been KernelAddr.
*
* Params:
* Image -- File to load
* ImageName -- Name of image for the modules list
* MemLoadAddr -- Freeldr address of module
* KernelAddr -- Kernel address of module
*--*/
#define ELF_SECTION(n) ((Elf32_Shdr*)(sptr + (n * shsize)))
#define COFF_FIRST_SECTION(h) ((PIMAGE_SECTION_HEADER) ((DWORD)h+FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader)+(SWAPW(((PIMAGE_NT_HEADERS)(h))->FileHeader.SizeOfOptionalHeader))))
BOOLEAN
NTAPI
FrLdrMapModule(FILE *KernelImage, PCHAR ImageName, PCHAR MemLoadAddr, ULONG KernelAddr)
{
Delta = (Base & 0xfffffc) + Delta;
return (Base & 0xff000003) | (Delta & 0xfffffc);
PIMAGE_DOS_HEADER ImageHeader = 0;
PIMAGE_NT_HEADERS NtHeader = 0;
PIMAGE_SECTION_HEADER Section;
ULONG SectionCount;
ULONG ImageSize;
INT i, j;
PLOADER_MODULE ModuleData;
int phsize, phnum, shsize, shnum, relsize, SectionAddr = 0;
PCHAR sptr;
Elf32_Ehdr ehdr;
Elf32_Shdr *shdr;
LPSTR TempName;
TempName = strrchr(ImageName, '\\');
if(TempName) TempName++; else TempName = (LPSTR)ImageName;
ModuleData = LdrGetModuleObject(TempName);
if(ModuleData)
{
return TRUE;
}
if(!KernelAddr)
KernelAddr = (ULONG)NextModuleBase - (ULONG)KernelMemory + KernelBase;
if(!MemLoadAddr)
MemLoadAddr = (PCHAR)NextModuleBase;
ModuleData = &reactos_modules[LoaderBlock.ModsCount];
printf("Loading file (elf at %x)\n", KernelAddr);
/* Load the first 1024 bytes of the kernel image so we can read the PE header */
if (!FsReadFile(KernelImage, sizeof(ehdr), NULL, &ehdr)) {
/* Fail if we couldn't read */
printf("Couldn't read the elf header\n");
return FALSE;
}
/* Start by getting elf headers */
phsize = ehdr.e_phentsize;
phnum = ehdr.e_phnum;
shsize = ehdr.e_shentsize;
shnum = ehdr.e_shnum;
sptr = (PCHAR)MmAllocateMemory(shnum * shsize);
/* Read section headers */
FsSetFilePointer(KernelImage, ehdr.e_shoff);
FsReadFile(KernelImage, shsize * shnum, NULL, sptr);
printf("Loaded section headers\n");
/* Now we'll get the PE Header */
for( i = 0; i < shnum; i++ )
{
shdr = ELF_SECTION(i);
shdr->sh_addr = 0;
/* Find the PE Header */
if (shdr->sh_type == TYPE_PEHEADER)
{
FsSetFilePointer(KernelImage, shdr->sh_offset);
FsReadFile(KernelImage, shdr->sh_size, NULL, MemLoadAddr);
ImageHeader = (PIMAGE_DOS_HEADER)MemLoadAddr;
NtHeader = (PIMAGE_NT_HEADERS)((PCHAR)MemLoadAddr + SWAPD(ImageHeader->e_lfanew));
printf("NtHeader at %x\n", SWAPD(ImageHeader->e_lfanew));
printf("SectionAlignment %x\n",
SWAPD(NtHeader->OptionalHeader.SectionAlignment));
SectionAddr = ROUND_UP
(shdr->sh_size, SWAPD(NtHeader->OptionalHeader.SectionAlignment));
printf("Header ends at %x\n", SectionAddr);
break;
}
}
if(i == shnum)
{
printf("No peheader section encountered :-(\n");
return 0;
}
/* Save the Image Base */
NtHeader->OptionalHeader.ImageBase = SWAPD(KernelAddr);
/* Load the file image */
Section = COFF_FIRST_SECTION(NtHeader);
SectionCount = SWAPW(NtHeader->FileHeader.NumberOfSections);
printf("Section headers at %x\n", Section);
/* Walk each section */
for (i=0; i < SectionCount; i++, Section++)
{
shdr = ELF_SECTION((SWAPD(Section->PointerToRawData)+1));
shdr->sh_addr = SectionAddr = SWAPD(Section->VirtualAddress);
shdr->sh_addr += KernelAddr;
Section->PointerToRawData = SWAPD((Section->VirtualAddress - KernelAddr));
if (shdr->sh_type != SHT_NOBITS)
{
/* Content area */
printf("Loading section %d at %x (real: %x:%d)\n", i, KernelAddr + SectionAddr, MemLoadAddr+SectionAddr, shdr->sh_size);
FsSetFilePointer(KernelImage, shdr->sh_offset);
FsReadFile(KernelImage, shdr->sh_size, NULL, MemLoadAddr + SectionAddr);
}
else
{
/* Zero it out */
printf("BSS section %d at %x\n", i, KernelAddr + SectionAddr);
memset(MemLoadAddr + SectionAddr, 0,
ROUND_UP(shdr->sh_size,
SWAPD(NtHeader->OptionalHeader.SectionAlignment)));
}
}
ImageSize = SWAPD(NtHeader->OptionalHeader.SizeOfImage);
KernelEntry = SWAPD(NtHeader->OptionalHeader.AddressOfEntryPoint);
printf("Total image size is %x\n", ImageSize);
/* Handle relocation sections */
for (i = 0; i < shnum; i++) {
Elf32_Rela reloc = { };
ULONG *Target32, x;
USHORT *Target16;
int numreloc, relstart, targetSection;
Elf32_Sym symbol;
PCHAR RelocSection, SymbolSection;
shdr = ELF_SECTION(i);
/* Only relocs here */
if((shdr->sh_type != SHT_REL) &&
(shdr->sh_type != SHT_RELA)) continue;
relstart = shdr->sh_offset;
relsize = shdr->sh_type == SHT_RELA ? 12 : 8;
numreloc = shdr->sh_size / relsize;
targetSection = shdr->sh_info;
if (!ELF_SECTION(targetSection)->sh_addr) continue;
RelocSection = MmAllocateMemory(shdr->sh_size);
FsSetFilePointer(KernelImage, relstart);
FsReadFile(KernelImage, shdr->sh_size, NULL, RelocSection);
/* Get the symbol section */
shdr = ELF_SECTION(shdr->sh_link);
SymbolSection = MmAllocateMemory(shdr->sh_size);
FsSetFilePointer(KernelImage, shdr->sh_offset);
FsReadFile(KernelImage, shdr->sh_size, NULL, SymbolSection);
for(j = 0; j < numreloc; j++)
{
ULONG S,A,P;
/* Get the reloc */
memcpy(&reloc, RelocSection + (j * relsize), sizeof(reloc));
/* Get the symbol */
memcpy(&symbol, SymbolSection + (ELF32_R_SYM(reloc.r_info) * sizeof(symbol)), sizeof(symbol));
/* Compute addends */
S = symbol.st_value + ELF_SECTION(symbol.st_shndx)->sh_addr;
A = reloc.r_addend;
P = reloc.r_offset + ELF_SECTION(targetSection)->sh_addr;
#if 0
printf("Symbol[%d] %d -> %d(%x:%x) -> %x(+%x)@%x\n",
ELF32_R_TYPE(reloc.r_info),
ELF32_R_SYM(reloc.r_info),
symbol.st_shndx,
ELF_SECTION(symbol.st_shndx)->sh_addr,
symbol.st_value,
S,
A,
P);
#endif
Target32 = (ULONG*)(((PCHAR)MemLoadAddr) + (P - KernelAddr));
Target16 = (USHORT *)Target32;
x = *Target32;
switch (ELF32_R_TYPE(reloc.r_info))
{
case R_PPC_NONE:
break;
case R_PPC_ADDR32:
*Target32 = S + A;
break;
case R_PPC_REL32:
*Target32 = S + A - P;
break;
case R_PPC_UADDR32: /* Special: Treat as RVA */
*Target32 = S + A - KernelAddr;
break;
case R_PPC_ADDR24:
*Target32 = (ADDR24_MASK & (S+A)) | (*Target32 & ~ADDR24_MASK);
break;
case R_PPC_REL24:
*Target32 = (ADDR24_MASK & (S+A-P)) | (*Target32 & ~ADDR24_MASK);
break;
case R_PPC_ADDR16_LO:
*Target16 = S + A;
break;
case R_PPC_ADDR16_HA:
*Target16 = (S + A + 0x8000) >> 16;
break;
default:
break;
}
#if 0
printf("reloc[%d:%x]: (type %x sym %d val %d) off %x add %x (old %x new %x)\n",
j,
((ULONG)Target32) - ((ULONG)MemLoadAddr),
ELF32_R_TYPE(reloc.r_info),
ELF32_R_SYM(reloc.r_info),
symbol.st_value,
reloc.r_offset, reloc.r_addend,
x, *Target32);
#endif
}
MmFreeMemory(SymbolSection);
MmFreeMemory(RelocSection);
}
MmFreeMemory(sptr);
ModuleData->ModStart = (ULONG)MemLoadAddr;
/* Increase the next Load Base */
NextModuleBase = ROUND_UP((ULONG)MemLoadAddr + ImageSize, PAGE_SIZE);
ModuleData->ModEnd = NextModuleBase;
ModuleData->String = (ULONG)MmAllocateMemory(strlen(ImageName)+1);
strcpy((PCHAR)ModuleData->String, ImageName);
printf("Module %s (%x-%x) next at %x\n",
ModuleData->String,
ModuleData->ModStart,
ModuleData->ModEnd,
NextModuleBase);
LoaderBlock.ModsCount++;
/* Return Success */
return TRUE;
}
/*++
@@ -400,182 +617,14 @@ BOOLEAN
NTAPI
FrLdrMapKernel(FILE *KernelImage)
{
PIMAGE_DOS_HEADER ImageHeader;
PIMAGE_NT_HEADERS NtHeader;
PIMAGE_SECTION_HEADER Section;
ULONG SectionCount;
ULONG ImageSize;
ULONG_PTR SourceSection;
ULONG_PTR TargetSection;
ULONG SectionSize;
INT i;
PIMAGE_DATA_DIRECTORY RelocationDDir;
PIMAGE_BASE_RELOCATION RelocationDir, RelocationEnd;
ULONG Count;
ULONG_PTR Address, MaxAddress;
PUSHORT TypeOffset;
ULONG_PTR Delta;
PUSHORT ShortPtr;
PULONG LongPtr;
PLOADER_MODULE ModuleData;
/* Allocate 1024 bytes for PE Header */
ImageHeader = (PIMAGE_DOS_HEADER)MmAllocateMemory(1024);
/* Make sure it was succesful */
if (ImageHeader == NULL) {
return FALSE;
}
/* Load the first 1024 bytes of the kernel image so we can read the PE header */
if (!FsReadFile(KernelImage, 1024, NULL, ImageHeader)) {
/* Fail if we couldn't read */
MmFreeMemory(ImageHeader);
return FALSE;
}
/* Now read the MZ header to get the offset to the PE Header */
NtHeader = (PIMAGE_NT_HEADERS)((PCHAR)ImageHeader + ImageHeader->e_lfanew);
/* Get Kernel Base */
KernelBase = NtHeader->OptionalHeader.ImageBase;
FrLdrGetKernelBase();
/* Save the Image Size */
ImageSize = NtHeader->OptionalHeader.SizeOfImage;
/* Free the Header */
MmFreeMemory(ImageHeader);
/* Set the file pointer to zero */
FsSetFilePointer(KernelImage, 0);
/* Allocate kernel memory */
KernelMemory = MmAllocateMemory(KernelMemorySize);
printf("Kernel Memory @%x\n", (int)KernelMemory);
/* Save Entrypoint */
KernelEntry = NtHeader->OptionalHeader.AddressOfEntryPoint;
/* Load the file image */
FsReadFile(KernelImage, ImageSize, NULL, KernelMemory);
/* Reload the NT Header */
NtHeader = (PIMAGE_NT_HEADERS)((PCHAR)KernelMemory + ImageHeader->e_lfanew);
/* Load the first section */
Section = IMAGE_FIRST_SECTION(NtHeader);
SectionCount = NtHeader->FileHeader.NumberOfSections - 1;
/* Now go to the last section */
Section += SectionCount;
/* Walk each section backwards */
for (i=(INT)SectionCount; i >= 0; i--, Section--) {
/* Get the disk location and the memory location, and the size */
SourceSection = RaToPa(Section->PointerToRawData);
TargetSection = RaToPa(Section->VirtualAddress);
SectionSize = Section->SizeOfRawData;
/* If the section is already mapped correctly, go to the next */
if (SourceSection == TargetSection) continue;
/* Load it into memory */
memmove((PVOID)TargetSection, (PVOID)SourceSection, SectionSize);
/* Check for unitilizated data */
if (Section->SizeOfRawData < Section->Misc.VirtualSize) {
/* Zero it out */
memset((PVOID)RaToPa(Section->VirtualAddress + Section->SizeOfRawData),
0,
Section->Misc.VirtualSize - Section->SizeOfRawData);
}
}
/* Get the Relocation Data Directory */
RelocationDDir = &NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
/* Get the Relocation Section Start and End*/
RelocationDir = (PIMAGE_BASE_RELOCATION)(KernelMemory + RelocationDDir->VirtualAddress);
RelocationEnd = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)RelocationDir + RelocationDDir->Size);
/* Calculate Difference between Real Base and Compiled Base*/
Delta = KernelBase - NtHeader->OptionalHeader.ImageBase;
/* Determine how far we shoudl relocate */
MaxAddress = (ULONG)KernelMemory + ImageSize;
/* Relocate until we've processed all the blocks */
while (RelocationDir < RelocationEnd && RelocationDir->SizeOfBlock > 0) {
/* See how many Relocation Blocks we have */
Count = (RelocationDir->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(USHORT);
/* Calculate the Address of this Directory */
Address = (ULONG)KernelMemory + RelocationDir->VirtualAddress;
/* Calculate the Offset of the Type */
TypeOffset = (PUSHORT)(RelocationDir + 1);
for (i = 0; i < (INT)Count; i++) {
ShortPtr = (PUSHORT)(Address + (*TypeOffset & 0xFFF));
switch (*TypeOffset >> 12) {
case IMAGE_REL_BASED_ABSOLUTE:
break;
case IMAGE_REL_BASED_HIGH:
*ShortPtr += HIWORD(Delta);
break;
case IMAGE_REL_BASED_HIGHADJ:
*ShortPtr +=
HIWORD(Delta) + ((LOWORD(Delta) & 0x8000) ? 1 : 0);
break;
case IMAGE_REL_BASED_LOW:
*ShortPtr += LOWORD(Delta);
break;
case IMAGE_REL_BASED_HIGHLOW:
LongPtr = (PULONG)ShortPtr;
*LongPtr += Delta;
break;
case IMAGE_REL_BASED_MIPS_JMPADDR:
LongPtr = (PULONG)ShortPtr;
*LongPtr = SignExtend24(*LongPtr,Delta);
break;
default:
//printf("Unknown relocation %d\n", *TypeOffset >> 12);
break;
}
TypeOffset++;
}
/* Move to the next Relocation Table */
RelocationDir = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)RelocationDir + RelocationDir->SizeOfBlock);
}
ModuleData = &reactos_modules[LoaderBlock.ModsCount];
ModuleData->ModStart = (ULONG)KernelMemory;
/* Increase the next Load Base */
NextModuleBase = ROUND_UP((ULONG)KernelMemory + ImageSize, PAGE_SIZE);
ModuleData->ModEnd = NextModuleBase;
ModuleData->String = (ULONG)"ntoskrnl.exe";
LoaderBlock.ModsCount++;
/* Return Success */
return TRUE;
return FrLdrMapModule(KernelImage, "ntoskrnl.exe", KernelMemory, KernelBase);
}
ULONG_PTR

View File

@@ -18,7 +18,6 @@ __asm__("\t.globl GetPhys\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,4\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"isync\n\t"
@@ -33,12 +32,49 @@ __asm__("\t.globl GetPhys\n"
"blr"
);
__asm__("\t.globl GetPhysHalf\n"
"GetPhysHalf:\t\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"isync\n\t"
"sync\n\t"
"lhz 3,0(3)\n\t" /* Get actual value at phys addr r3 */
"mtmsr 5\n\t"
"isync\n\t"
"sync\n\t"
"lwz 0,0(1)\n\t"
"addi 1,1,16\n\t"
"mtlr 0\n\t"
"blr"
);
__asm__("\t.globl GetPhysByte\n"
"GetPhysByte:\t\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"isync\n\t"
"sync\n\t"
"lbz 3,0(3)\n\t" /* Get actual value at phys addr r3 */
"mtmsr 5\n\t"
"isync\n\t"
"sync\n\t"
"lwz 0,0(1)\n\t"
"addi 1,1,16\n\t"
"mtlr 0\n\t"
"blr"
);
__asm__("\t.globl SetPhys\n"
"SetPhys:\t\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,4\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"sync\n\t"
@@ -55,12 +91,32 @@ __asm__("\t.globl SetPhys\n"
"blr"
);
__asm__("\t.globl SetPhysHalf\n"
"SetPhysHalf:\t\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"sync\n\t"
"eieio\n\t"
"sth 4,0(3)\n\t" /* Set actual value at phys addr r3 */
"dcbst 0,3\n\t"
"mtmsr 5\n\t"
"sync\n\t"
"eieio\n\t"
"mr 3,4\n\t"
"lwz 0,0(1)\n\t"
"addi 1,1,16\n\t"
"mtlr 0\n\t"
"blr"
);
__asm__("\t.globl SetPhysByte\n"
"SetPhysByte:\t\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,7\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"sync\n\t"

View File

@@ -0,0 +1,49 @@
.section .text
.globl ofw_functions
.globl ofw_call_addr
.globl call_ofw
call_ofw:
/* R3 has the function offset to call (n * 4)
* Other arg registers are unchanged. */
subi %r1,%r1,0x100
stw %r8,24(%r1)
mflr %r8
stw %r8,0(%r1)
stw %r3,4(%r1)
stw %r4,8(%r1)
stw %r5,12(%r1)
stw %r6,16(%r1)
stw %r7,20(%r1)
stw %r9,28(%r1)
stw %r10,32(%r1)
stw %r20,36(%r1)
lis %r10,ofw_functions@ha
addi %r8,%r10,ofw_functions@l
add %r8,%r3,%r8
lwz %r9,0(%r8)
mtctr %r9
mr %r3,%r4
mr %r4,%r5
mr %r5,%r6
mr %r6,%r7
mr %r7,%r8
mr %r8,%r9
/* Call ofw proxy function */
bctrl
lwz %r8,0(%r1)
mtlr %r8
lwz %r4,8(%r1)
lwz %r5,12(%r1)
lwz %r6,16(%r1)
lwz %r7,20(%r1)
lwz %r8,24(%r1)
lwz %r9,28(%r1)
lwz %r10,32(%r1)
lwz %r20,36(%r1)
addi %r1,%r1,0x100
blr

View File

@@ -0,0 +1,112 @@
#include "freeldr.h"
#include "machine.h"
#include "mmu.h"
#include "prep.h"
int prep_serial = 0x800003f8;
void sync() { __asm__("eieio\n\tsync"); }
/* Simple serial */
void PpcPrepPutChar( int ch ) {
if( ch == 0x0a ) {
SetPhysByte(prep_serial, 0x0d);
sync();
}
SetPhysByte(prep_serial, ch);
sync();
}
BOOLEAN PpcPrepDiskReadLogicalSectors
( ULONG DriveNumber, ULONGLONG SectorNumber,
ULONG SectorCount, PVOID Buffer ) {
int secct;
for(secct = 0; secct < SectorCount; secct++)
{
ide_seek(&ide1_desc, SectorNumber + secct, 0);
ide_read(&ide1_desc, ((PCHAR)Buffer) + secct * 512, 512);
}
/* Never give up! */
return TRUE;
}
BOOLEAN PpcPrepConsKbHit()
{
return 1;
//return GetPhysByte(prep_serial+5) & 1;
}
int PpcPrepConsGetCh()
{
while(!PpcPrepConsKbHit());
return GetPhysByte(prep_serial);
}
void PpcPrepVideoClearScreen(UCHAR Attr)
{
printf("\033c");
}
VIDEODISPLAYMODE PpcPrepVideoSetDisplayMode( char *DisplayMode, BOOLEAN Init )
{
return VideoTextMode;
}
void PpcPrepVideoGetDisplaySize( PULONG Width, PULONG Height, PULONG Depth )
{
*Width = 80;
*Height = 25;
*Depth = 16;
}
void PpcPrepVideoPrepareForReactOS()
{
pci_setup(&pci1_desc);
}
int mmu_initialized = 0;
ULONG PpcPrepGetMemoryMap( PBIOS_MEMORY_MAP BiosMemoryMap,
ULONG MaxMemoryMapSize )
{
// xxx fixme
BiosMemoryMap[0].Type = 1;
BiosMemoryMap[0].BaseAddress = 0xe80000;
BiosMemoryMap[0].Length = (64 * 1024 * 1024) - BiosMemoryMap[0].BaseAddress;
if(!mmu_initialized)
{
MmuInit();
mmu_initialized = 1;
}
MmuSetMemorySize(BiosMemoryMap[0].Length + BiosMemoryMap[0].BaseAddress);
return 1;
}
void PpcPrepInit()
{
MachVtbl.ConsPutChar = PpcPrepPutChar;
printf("Serial on\n");
ide_setup( &ide1_desc );
MachVtbl.DiskReadLogicalSectors = PpcPrepDiskReadLogicalSectors;
MachVtbl.ConsKbHit = PpcPrepConsKbHit;
MachVtbl.ConsGetCh = PpcPrepConsGetCh;
MachVtbl.VideoClearScreen = PpcPrepVideoClearScreen;
MachVtbl.VideoSetDisplayMode = PpcPrepVideoSetDisplayMode;
MachVtbl.VideoGetDisplaySize = PpcPrepVideoGetDisplaySize;
MachVtbl.VideoPrepareForReactOS = PpcPrepVideoPrepareForReactOS;
MachVtbl.GetMemoryMap = PpcPrepGetMemoryMap;
printf( "FreeLDR version [%s]\n", GetFreeLoaderVersionString() );
BootMain( "" );
}

View File

@@ -0,0 +1,24 @@
#ifndef FREELDR_ARCH_POWERPC_PREP_H
#define FREELDR_ARCH_POWERPC_PREP_H
extern struct _pci_desc pci1_desc;
extern struct _idectl_desc ide1_desc;
extern struct _vga_desc vga1_desc;
struct _pci_bar {
unsigned long data;
};
void sync();
void PpcPrepInit();
void ide_seek( void *extension, int low, int high );
int ide_read( void *extension, char *buffer, int bytes );
void ide_setup( void *extension );
void print_bar( struct _pci_bar *bar );
void pci_setup( struct _pci_desc *pci_desc );
void pci_read_bar( struct _pci_desc *pci_desc, int bus, int dev, int fn, int bar, struct _pci_bar *bar_data );
void vga_setup( struct _pci_desc *pci_desc, struct _vga_desc *vga_desc,
int bus, int dev, int fn );
#endif//FREELDR_ARCH_POWERPC_PREP_H

View File

@@ -0,0 +1,106 @@
#include "freeldr.h"
#include "machine.h"
#include "mmu.h"
#include "prep.h"
#define SWAP_W(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff))
typedef struct _idectl_desc {
int port;
long long seekto;
int seek_cylinder, seek_head, seek_sector;
int cylinders, heads, sectors, bytespersec;
} idectl_desc;
idectl_desc ide1_desc = { 0x800001f0 };
void ide_seek( void *extension, int low, int high ) {
idectl_desc *desc = (idectl_desc *)extension;
long long seekto = ((((long long)high) << 32) | (low & 0xffffffff));
/* order = sector, head, cylinder */
desc->seek_sector = seekto % desc->sectors;
seekto /= desc->sectors;
desc->seek_head = seekto % desc->heads;
seekto /= desc->heads;
desc->seek_cylinder = seekto;
desc->seekto = seekto;
}
/* Thanks chuck moore. This is based on the color forth ide code */
/* Wait for ready */
void ide_rdy( void *extension ) {
idectl_desc *desc = (idectl_desc *)extension;
while( !(GetPhysByte(desc->port+7) & 0x40) ) sync();
}
void ide_drq( void *extension ) {
idectl_desc *desc = (idectl_desc *)extension;
while( !(GetPhysByte(desc->port+7) & 0x08) ) sync();
}
void ide_bsy( void *extension ) {
idectl_desc *desc = (idectl_desc *)extension;
while( GetPhysByte(desc->port+7) & 0x80 )
{
printf("Waiting for not busy\n");
sync();
}
}
int ide_read( void *extension, char *buffer, int bytes ) {
idectl_desc *desc = (idectl_desc *)extension;
short *databuf = (short *)buffer;
int inwords;
ide_bsy( extension );
SetPhysByte(desc->port+2, bytes / desc->bytespersec);
SetPhysByte(desc->port+3, desc->seek_sector + 1);
SetPhysByte(desc->port+4, desc->seek_cylinder);
SetPhysByte(desc->port+5, desc->seek_cylinder >> 8);
SetPhysByte(desc->port+6, desc->seek_head | 0xa0);
SetPhysByte(desc->port+7, 0x20);
for( inwords = 0; inwords < desc->bytespersec / sizeof(short); inwords++ ) {
databuf[inwords] = GetPhysHalf(desc->port);
}
desc->seekto += desc->bytespersec;
ide_seek( extension, desc->seekto, desc->seekto >> 32 );
return bytes - (bytes % desc->bytespersec);
}
void ide_setup( void *extension ) {
idectl_desc *desc = (idectl_desc *)extension;
short identbuffer[256];
char namebuf[41];
short *databuf = (short *)identbuffer, in;
int inwords;
ide_rdy( extension );
ide_bsy( extension );
desc->bytespersec = 512;
SetPhysByte(desc->port+2, 1);
SetPhysByte(desc->port+3, 0);
SetPhysByte(desc->port+4, 0);
SetPhysByte(desc->port+5, 0);
SetPhysByte(desc->port+6, 0);
SetPhysByte(desc->port+7, 0xec);
ide_drq( extension );
for( inwords = 0; inwords < desc->bytespersec / sizeof(short); inwords++ ) {
in = GetPhysHalf(desc->port);
databuf[inwords] = SWAP_W(in);
sync();
}
desc->cylinders = identbuffer[1];
desc->heads = identbuffer[3];
desc->sectors = identbuffer[6];
/* Debug: Write out hard disc model */
strncpy(namebuf, (char *)(identbuffer+0x1b), 41);
printf("HARD DISC MODEL: %s c,h,s %d,%d,%d\n",
namebuf, desc->cylinders, desc->heads, desc->sectors);
}

View File

@@ -0,0 +1,127 @@
#include <freeldr.h>
#include "prep.h"
typedef struct _pci_cfg {
unsigned long addr;
unsigned long data;
} pci_cfg;
typedef struct _pci_desc {
pci_cfg *cfg;
} pci_desc;
pci_desc pci1_desc = { (void *)0x80000cf8 };
#define rev16(x) ((((x)>>8)&0xff)|(((x)&0xff)<<8))
#define rev32(x) ((((x)>>24)&0xff)|(((x)>>8)&0xff00)|(((x)&0xff00)<<8)|(((x)&0xff)<<24))
#define pci_addr(bus,dev,fn,reg) \
(0x80000000 | \
((bus & 0xff) << 16) | \
((dev & 0x1f) << 11) | \
((fn & 7) << 8) | \
(reg & 0xfc))
#if 0
#define pci_cfg_addr(bus,dev,fn,reg) \
((bus == 0) ? \
((1 << (dev + 16)) | \
(dev << 11) | \
(fn << 8) | \
((reg & 0xfc) | 1)) : pci_addr(bus,dev,fn,reg))
#else
#define pci_cfg_addr(bus,dev,fn,reg) pci_addr(bus,dev,fn,reg)
#endif
unsigned long pci_read( pci_desc *desc, int bus, int dev, int fn, int reg, int len ) {
sync();
unsigned long save_state = desc->cfg->addr, ret = 0;
unsigned long addr = pci_cfg_addr(bus,dev,fn,reg);
unsigned long offset = reg & 3;
desc->cfg->addr = rev32(addr);
sync();
switch( len ) {
case 4:
ret = desc->cfg->data;
break;
case 2:
ret = desc->cfg->data;
ret = (ret >> (offset << 3)) & 0xffff;
break;
case 1:
ret = desc->cfg->data;
ret = (ret >> (offset << 3)) & 0xff;
break;
}
desc->cfg->addr = save_state;
sync();
return ret;
}
void pci_read_bar( pci_desc *desc, int bus, int dev, int fn, int bar,
struct _pci_bar *bar_data ) {
bar_data->data = pci_read( desc, bus, dev, fn, 0x10 + (bar * 4), 4 );
}
/*
* Imagine: offset 3, len 1
* let oldval = 0x12345678 and val = 0xabcd1234;
* mask = ((1 << 8) - 1) << 24; // 0xff000000
* oldval = (0x12345678 & 0x00ffffff) | (0xabcd1234 & 0xff000000) = 0xab345678;
*/
void pci_write( pci_desc *desc, int bus, int dev, int fn, int reg, int len, int val ) {
unsigned long save_state = desc->cfg->addr;
unsigned long addr = pci_cfg_addr(bus,dev,fn,reg);
unsigned long offset = reg & 3;
unsigned long oldval = pci_read( desc, bus, dev, fn, reg & ~3, 4 );
unsigned long mask = ((1 << (len * 8)) - 1) << (offset << 3);
oldval = (oldval & ~mask) | ((val << (offset << 3)) & mask);
desc->cfg->addr = rev32(addr);
sync();
desc->cfg->data = rev32(oldval);
sync();
desc->cfg->addr = save_state;
sync();
}
void pci_write_bar( pci_desc *desc, int bus, int dev, int fn, int bar, struct _pci_bar *bar_data ) {
pci_write( desc, bus, dev, fn, 0x10 + (bar * 4), 4, bar_data->data );
}
void print_bar( struct _pci_bar *bar ) {
printf("BAR: %x\n", bar->data);
}
#define PCI_VENDORID 0
#define PCI_DEVICEID 2
#define PCI_HEADER_TYPE 0xe
#define PCI_BASECLASS 0xb
void pci_setup( pci_desc *desc ) {
unsigned char type;
unsigned short vendor, device, devclass;
int funcs, bus, dev, fn;
pci1_desc.cfg = (pci_cfg *)0x80000cf8;
printf("PCI Bus:\n");
for( bus = 0; bus < 1; bus++ ) {
for( dev = 0; dev < 32; dev++ ) {
type = pci_read(desc,bus,dev,0,PCI_HEADER_TYPE,1);
vendor = pci_read(desc,bus,dev,0,PCI_VENDORID,2);
device = pci_read(desc,bus,dev,0,PCI_DEVICEID,2);
if(vendor == 0 || vendor == 0xffff) continue;
if(type & 0x80) funcs = 8; else funcs = 1;
for( fn = 0; fn < funcs; fn++ ) {
devclass = pci_read(desc,bus,dev,fn,PCI_BASECLASS,1);
printf(" %d:%d -> vendor:device:class %x:%x:%x\n",
bus, dev, vendor, device, devclass);
if( devclass == 3 ) {
printf("Setting up vga...\n");
vga_setup(desc,&vga1_desc,bus,dev,fn);
printf("Done with vga\n");
}
}
}
}
printf("^-- end PCI\n");
}

View File

@@ -0,0 +1,30 @@
#include <freeldr.h>
#include "prep.h"
#include "ppcboot.h"
extern boot_infos_t BootInfo;
struct _vga_desc {
char *port;
char *addr;
};
#define VGA_WIDTH 1024
#define VGA_HEIGHT 768
struct _vga_desc vga1_desc = { (char *)0x800003c0 };
void vga_setup( struct _pci_desc *desc, struct _vga_desc *vga_desc,
int bus, int dev, int fn ) {
struct _pci_bar bar_data;
int i;
for( i = 0; i < 6; i++ ) {
pci_read_bar( desc, bus, dev, fn, i, &bar_data );
print_bar( &bar_data );
if( (bar_data.data > 0x10000) || ((bar_data.data&1) == 1) ) {
vga_desc->addr = (char *)(0xc0000000 + (bar_data.data & ~0x7ff));
BootInfo.dispDeviceBase = vga_desc->addr;
break;
}
}
}

View File

@@ -49,6 +49,7 @@
<if property="ARCH" value="powerpc">
<module name="freeldr_arch" type="objectlibrary">
<include base="ReactOS">include/psdk</include>
<include base="ReactOS">include/reactos/ppcmmu</include>
<include base="freeldr_base">include</include>
<include base="freeldr_base">cache</include>
<include base="ntoskrnl">include</include>
@@ -61,15 +62,21 @@
<compilerflag>-fno-builtin</compilerflag>
<compilerflag>-fno-inline</compilerflag>
<compilerflag>-fno-zero-initialized-in-bss</compilerflag>
<compilerflag>-Os</compilerflag>
<compilerflag>-O0</compilerflag>
<compilerflag>-fPIC</compilerflag>
<compilerflag>-mno-toc</compilerflag>
<compilerflag>-meabi</compilerflag>
<!-- <compilerflag>-mno-toc</compilerflag>
<compilerflag>-meabi</compilerflag> -->
<file>boot.s</file>
<file>ofw_calls.s</file>
<file>ofw_util.s</file>
<file>ofw.c</file>
<file>mmu.c</file>
<file>mach.c</file>
<file>prep.c</file>
<file>prep_ide.c</file>
<file>prep_pci.c</file>
<file>prep_vga.c</file>
<file>mboot.c</file>
<file>loader.c</file>
</module>
</if>
</directory>

View File

@@ -5,9 +5,7 @@
<include base="ntoskrnl">include</include>
<include base="cmlib">.</include>
<define name="__USE_W32API" />
<!--
<define name="DEBUG" />
-->
<define name="_NTHAL_" />
<define name="_NTSYSTEM_" />
<compilerflag>-ffreestanding</compilerflag>

View File

@@ -3,9 +3,7 @@
<include base="freeldr_main">include</include>
<include base="ntoskrnl">include</include>
<define name="__USE_W32API" />
<!--
<define name="DEBUG" />
-->
<define name="_NTHAL_" />
<compilerflag>-ffreestanding</compilerflag>
<compilerflag>-fno-builtin</compilerflag>

View File

@@ -19,7 +19,7 @@
#include <freeldr.h>
#define NDEBUG
//#define NDEBUG
#include <debug.h>
ULONG BytesPerSector; /* Number of bytes per sector */
@@ -37,6 +37,84 @@ ULONG DataSectorStart; /* Starting sector of the data area */
ULONG FatType = 0; /* FAT12, FAT16, FAT32, FATX16 or FATX32 */
ULONG FatDriveNumber = 0;
VOID FatSwapFatBootSector(PFAT_BOOTSECTOR Obj)
{
SW(Obj, BytesPerSector);
SW(Obj, ReservedSectors);
SW(Obj, RootDirEntries);
SW(Obj, TotalSectors);
SW(Obj, SectorsPerFat);
SW(Obj, SectorsPerTrack);
SW(Obj, NumberOfHeads);
SD(Obj, HiddenSectors);
SD(Obj, TotalSectorsBig);
SD(Obj, VolumeSerialNumber);
SW(Obj, BootSectorMagic);
}
VOID FatSwapFat32BootSector(PFAT32_BOOTSECTOR Obj)
{
SW(Obj, BytesPerSector);
SW(Obj, ReservedSectors);
SW(Obj, RootDirEntries);
SW(Obj, TotalSectors);
SW(Obj, SectorsPerFat);
SW(Obj, NumberOfHeads);
SD(Obj, HiddenSectors);
SD(Obj, TotalSectorsBig);
SD(Obj, SectorsPerFatBig);
SW(Obj, ExtendedFlags);
SW(Obj, FileSystemVersion);
SD(Obj, RootDirStartCluster);
SW(Obj, FsInfo);
SW(Obj, BackupBootSector);
SD(Obj, VolumeSerialNumber);
SW(Obj, BootSectorMagic);
}
VOID FatSwapFatXBootSector(PFATX_BOOTSECTOR Obj)
{
SD(Obj, VolumeSerialNumber);
SD(Obj, SectorsPerCluster);
SW(Obj, NumberOfFats);
}
VOID FatSwapDirEntry(PDIRENTRY Obj)
{
SW(Obj, CreateTime);
SW(Obj, CreateDate);
SW(Obj, LastAccessDate);
SW(Obj, ClusterHigh);
SW(Obj, Time);
SW(Obj, Date);
SW(Obj, ClusterLow);
SD(Obj, Size);
}
VOID FatSwapLFNDirEntry(PLFN_DIRENTRY Obj)
{
int i;
SW(Obj, StartCluster);
for(i = 0; i < 5; i++)
Obj->Name0_4[i] = SWAPW(Obj->Name0_4[i]);
for(i = 0; i < 6; i++)
Obj->Name5_10[i] = SWAPW(Obj->Name5_10[i]);
for(i = 0; i < 2; i++)
Obj->Name11_12[i] = SWAPW(Obj->Name11_12[i]);
}
VOID FatSwapFatXDirEntry(PFATX_DIRENTRY Obj)
{
SD(Obj, StartCluster);
SD(Obj, Size);
SW(Obj, Time);
SW(Obj, Date);
SW(Obj, CreateTime);
SW(Obj, CreateDate);
SW(Obj, LastAccessTime);
SW(Obj, LastAccessDate);
}
BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG PartitionSectorCount)
{
char ErrMsg[80];
@@ -75,6 +153,7 @@ BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG Partitio
}
RtlCopyMemory(FatVolumeBootSector, (PVOID)DISKREADBUFFER, 512);
// Get the FAT type
FatType = FatDetermineFatType(FatVolumeBootSector, PartitionSectorCount);
@@ -84,6 +163,7 @@ BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG Partitio
if (ISFATX(FatType))
{
FatSwapFatXBootSector(FatXVolumeBootSector);
DbgPrint((DPRINT_FILESYSTEM, "sizeof(FATX_BOOTSECTOR) = 0x%x.\n", sizeof(FATX_BOOTSECTOR)));
DbgPrint((DPRINT_FILESYSTEM, "FileSystemType: %c%c%c%c.\n", FatXVolumeBootSector->FileSystemType[0], FatXVolumeBootSector->FileSystemType[1], FatXVolumeBootSector->FileSystemType[2], FatXVolumeBootSector->FileSystemType[3]));
@@ -97,6 +177,7 @@ BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG Partitio
}
else if (FatType == FAT32)
{
FatSwapFat32BootSector(Fat32VolumeBootSector);
DbgPrint((DPRINT_FILESYSTEM, "sizeof(FAT32_BOOTSECTOR) = 0x%x.\n", sizeof(FAT32_BOOTSECTOR)));
DbgPrint((DPRINT_FILESYSTEM, "JumpBoot: 0x%x 0x%x 0x%x\n", Fat32VolumeBootSector->JumpBoot[0], Fat32VolumeBootSector->JumpBoot[1], Fat32VolumeBootSector->JumpBoot[2]));
@@ -130,6 +211,7 @@ BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG Partitio
}
else
{
FatSwapFatBootSector(FatVolumeBootSector);
DbgPrint((DPRINT_FILESYSTEM, "sizeof(FAT_BOOTSECTOR) = 0x%x.\n", sizeof(FAT_BOOTSECTOR)));
DbgPrint((DPRINT_FILESYSTEM, "JumpBoot: 0x%x 0x%x 0x%x\n", FatVolumeBootSector->JumpBoot[0], FatVolumeBootSector->JumpBoot[1], FatVolumeBootSector->JumpBoot[2]));
@@ -165,7 +247,7 @@ BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG Partitio
//
// Check the boot sector magic
//
if (! ISFATX(FatType) && FatVolumeBootSector->BootSectorMagic != 0xaa55)
if (! ISFATX(FatType) && SWAPW(FatVolumeBootSector->BootSectorMagic) != 0x55aa)
{
sprintf(ErrMsg, "Invalid boot sector magic on drive 0x%x (expected 0xaa55 found 0x%x)",
DriveNumber, FatVolumeBootSector->BootSectorMagic);
@@ -205,7 +287,7 @@ BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG Partitio
if (ISFATX(FatType))
{
BytesPerSector = 512;
SectorsPerCluster = FatXVolumeBootSector->SectorsPerCluster;
SectorsPerCluster = SWAPD(FatXVolumeBootSector->SectorsPerCluster);
FatSectorStart = (4096 / BytesPerSector);
ActiveFatSectorStart = FatSectorStart;
NumberOfFats = 1;
@@ -260,6 +342,7 @@ BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG Partitio
//
// Initialize the disk cache for this drive
//
printf("About to do cache init\n");
if (!CacheInitializeDrive(DriveNumber))
{
return FALSE;
@@ -307,10 +390,10 @@ ULONG FatDetermineFatType(PFAT_BOOTSECTOR FatBootSector, ULONG PartitionSectorCo
}
else
{
RootDirSectors = ((FatBootSector->RootDirEntries * 32) + (FatBootSector->BytesPerSector - 1)) / FatBootSector->BytesPerSector;
SectorsPerFat = FatBootSector->SectorsPerFat ? FatBootSector->SectorsPerFat : Fat32BootSector->SectorsPerFatBig;
TotalSectors = FatBootSector->TotalSectors ? FatBootSector->TotalSectors : FatBootSector->TotalSectorsBig;
DataSectorCount = TotalSectors - (FatBootSector->ReservedSectors + (FatBootSector->NumberOfFats * SectorsPerFat) + RootDirSectors);
RootDirSectors = ((SWAPW(FatBootSector->RootDirEntries) * 32) + (SWAPW(FatBootSector->BytesPerSector) - 1)) / SWAPW(FatBootSector->BytesPerSector);
SectorsPerFat = SWAPW(FatBootSector->SectorsPerFat) ? SWAPW(FatBootSector->SectorsPerFat) : SWAPD(Fat32BootSector->SectorsPerFatBig);
TotalSectors = SWAPW(FatBootSector->TotalSectors) ? SWAPW(FatBootSector->TotalSectors) : SWAPD(FatBootSector->TotalSectorsBig);
DataSectorCount = TotalSectors - (SWAPW(FatBootSector->ReservedSectors) + (FatBootSector->NumberOfFats * SectorsPerFat) + RootDirSectors);
//mjl
if (FatBootSector->SectorsPerCluster == 0)
@@ -402,11 +485,13 @@ BOOLEAN FatSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySi
{
ULONG EntryCount;
ULONG CurrentEntry;
PDIRENTRY DirEntry;
PLFN_DIRENTRY LfnDirEntry;
CHAR LfnNameBuffer[265];
CHAR ShortNameBuffer[20];
ULONG StartCluster;
DIRENTRY OurDirEntry;
LFN_DIRENTRY OurLfnDirEntry;
PDIRENTRY DirEntry = &OurDirEntry;
PLFN_DIRENTRY LfnDirEntry = &OurLfnDirEntry;
EntryCount = DirectorySize / sizeof(DIRENTRY);
@@ -415,10 +500,12 @@ BOOLEAN FatSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySi
memset(ShortNameBuffer, 0, 13 * sizeof(CHAR));
memset(LfnNameBuffer, 0, 261 * sizeof(CHAR));
DirEntry = (PDIRENTRY) DirectoryBuffer;
for (CurrentEntry=0; CurrentEntry<EntryCount; CurrentEntry++, DirEntry++)
for (CurrentEntry=0; CurrentEntry<EntryCount; CurrentEntry++, DirectoryBuffer = ((PDIRENTRY)DirectoryBuffer)+1)
{
LfnDirEntry = (PLFN_DIRENTRY)DirEntry;
OurLfnDirEntry = *((PLFN_DIRENTRY) DirectoryBuffer);
FatSwapLFNDirEntry(LfnDirEntry);
OurDirEntry = *((PDIRENTRY) DirectoryBuffer);
FatSwapDirEntry(DirEntry);
//DbgPrint((DPRINT_FILESYSTEM, "Dumping directory entry %d:\n", CurrentEntry));
//DbgDumpBuffer(DPRINT_FILESYSTEM, DirEntry, sizeof(DIRENTRY));
@@ -613,17 +700,20 @@ static BOOLEAN FatXSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG Dir
{
ULONG EntryCount;
ULONG CurrentEntry;
PFATX_DIRENTRY DirEntry;
ULONG FileNameLen;
FATX_DIRENTRY OurDirEntry;
PFATX_DIRENTRY DirEntry = &OurDirEntry;
EntryCount = DirectorySize / sizeof(FATX_DIRENTRY);
DbgPrint((DPRINT_FILESYSTEM, "FatXSearchDirectoryBufferForFile() DirectoryBuffer = 0x%x EntryCount = %d FileName = %s\n", DirectoryBuffer, EntryCount, FileName));
FileNameLen = strlen(FileName);
DirEntry = (PFATX_DIRENTRY) DirectoryBuffer;
for (CurrentEntry = 0; CurrentEntry < EntryCount; CurrentEntry++, DirEntry++)
for (CurrentEntry = 0; CurrentEntry < EntryCount; CurrentEntry++, DirectoryBuffer = ((PFATX_DIRENTRY)DirectoryBuffer)+1)
{
OurDirEntry = *(PFATX_DIRENTRY) DirectoryBuffer;
FatSwapFatXDirEntry(&OurDirEntry);
if (0xff == DirEntry->FileNameSize)
{
break;
@@ -721,6 +811,7 @@ BOOLEAN FatLookupFile(PCSTR FileName, PFAT_FILE_INFO FatFileInfoPointer)
// Buffer the directory contents
//
DirectoryBuffer = FatBufferDirectory(DirectoryStartCluster, &DirectorySize, (i == 0) );
if (DirectoryBuffer == NULL)
{
return FALSE;
@@ -854,6 +945,7 @@ BOOLEAN FatGetFatEntry(ULONG Cluster, ULONG* ClusterPointer)
}
fat = *((USHORT *) ((ULONG_PTR)FILESYSBUFFER + ThisFatEntOffset));
fat = SWAPW(fat);
if (Cluster & 0x0001)
fat = fat >> 4; /* Cluster number is ODD */
else
@@ -874,6 +966,7 @@ BOOLEAN FatGetFatEntry(ULONG Cluster, ULONG* ClusterPointer)
}
fat = *((USHORT *) ((ULONG_PTR)FILESYSBUFFER + ThisFatEntOffset));
fat = SWAPW(fat);
break;
@@ -891,6 +984,7 @@ BOOLEAN FatGetFatEntry(ULONG Cluster, ULONG* ClusterPointer)
// Get the fat entry
fat = (*((ULONG *) ((ULONG_PTR)FILESYSBUFFER + ThisFatEntOffset))) & 0x0FFFFFFF;
fat = SWAPD(fat);
break;

View File

@@ -86,6 +86,8 @@
#include <reactos/helper.h>
/* Needed if debuging is enabled */
#include <comm.h>
/* endianness utilities */
#include <bytesex.h>
#define Ke386EraseFlags(x) __asm__ __volatile__("pushl $0 ; popfl\n")

View File

@@ -4,8 +4,6 @@
#define OF_FAILED 0
#define ERR_NOT_FOUND 0xc0000010
#define REV(x) (((x)>>24)&0xff)|(((x)>>8)&0xff00)|(((x)<<24)&0xff000000)|(((x)<<8)&0xff0000)
#include "of_call.h"
#include <string.h>
@@ -13,7 +11,6 @@ typedef int (*of_proxy)
( int table_off, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5, void *arg6 );
typedef long jmp_buf[100];
extern of_proxy ofproxy;
extern void le_swap( void *begin, void *end, void *dest );
int setjmp( jmp_buf buf );
int longjmp( jmp_buf buf, int retval );

View File

@@ -62,6 +62,7 @@ VOID FASTCALL FrLdrGetPaeMode(VOID);
BOOLEAN NTAPI FrLdrMapKernel(FILE *KernelImage);
ULONG_PTR NTAPI FrLdrCreateModule(LPCSTR ModuleName);
ULONG_PTR NTAPI FrLdrLoadModule(FILE *ModuleImage, LPCSTR ModuleName, PULONG ModuleSize);
BOOLEAN NTAPI FrLdrMapModule(FILE *ModuleImage, PCHAR ModuleName, PCHAR MemLoadAddr, ULONG KernelAddr);
BOOLEAN NTAPI FrLdrCloseModule(ULONG_PTR ModuleBase, ULONG dwModuleSize);
VOID NTAPI FrLdrStartup(ULONG Magic);
typedef VOID (FASTCALL *ASMCODE)(ULONG Magic, PROS_LOADER_PARAMETER_BLOCK LoaderBlock);

View File

@@ -95,7 +95,7 @@ PVOID MmAllocateMemory(ULONG MemorySize)
ULONG ptr;
printf("Allocating %d bytes directly ...\n", MemorySize);
ptr = ofw_claim(0,MemorySize,MM_PAGE_SIZE);
MemPointer = (PVOID)(REV(ptr));
MemPointer = (PVOID)(ptr);
#endif
if( !MemPointer )
{

View File

@@ -35,6 +35,7 @@ char reactos_arc_strings[32][256];
unsigned long reactos_disk_count = 0;
CHAR szHalName[255];
CHAR szBootPath[255];
CHAR SystemRoot[255];
static CHAR szLoadingMsg[] = "Loading ReactOS...";
BOOLEAN FrLdrBootType;
@@ -199,6 +200,8 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
CHAR szFileName[256];
ULONG BufferSize;
strcpy(SystemRoot, szSystemRoot);
/* open the codepage key */
rc = RegOpenKey(NULL,
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage",
@@ -300,7 +303,7 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
return(TRUE);
}
static BOOLEAN
BOOLEAN
FrLdrLoadDriver(PCHAR szFileName,
INT nPos)
{
@@ -308,9 +311,30 @@ FrLdrLoadDriver(PCHAR szFileName,
CHAR value[256];
LPSTR p;
printf("Loading driver %s\n", szFileName);
/* Open the Driver */
FilePointer = FsOpenFile(szFileName);
/* Try under the system root in the main dir and drivers */
if (FilePointer == NULL)
{
strcpy(value, SystemRoot);
strcat(value, "SYSTEM32\\");
strcat(value, szFileName);
printf("Trying %s\n", value);
FilePointer = FsOpenFile(value);
}
if (FilePointer == NULL)
{
strcpy(value, SystemRoot);
strcat(value, "SYSTEM32\\DRIVERS\\");
strcat(value, szFileName);
printf("Trying %s\n", value);
FilePointer = FsOpenFile(value);
}
/* Make sure we did */
if (FilePointer == NULL) {
@@ -336,7 +360,7 @@ FrLdrLoadDriver(PCHAR szFileName,
UiDrawStatusText(value);
/* Load the driver */
FrLdrLoadModule(FilePointer, szFileName, NULL);
FrLdrMapModule(FilePointer, szFileName, 0, 0);
/* Update status and return */
UiDrawProgressBarCenter(nPos, 100, szLoadingMsg);
@@ -415,6 +439,11 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
rc = RegQueryValue(hOrderKey, GroupName, NULL, (PUCHAR)OrderList, &BufferSize);
if (rc != ERROR_SUCCESS) OrderList[0] = 0;
#ifdef _M_PPC
for (TagIndex = 0; TagIndex < BufferSize / sizeof(OrderList[0]); TagIndex++)
OrderList[TagIndex] = SWAPD(OrderList[TagIndex]);
#endif
/* enumerate all drivers */
for (TagIndex = 1; TagIndex <= OrderList[0]; TagIndex++) {
@@ -453,6 +482,11 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
rc = RegQueryValue(hDriverKey, L"Group", NULL, (PUCHAR)DriverGroup, &DriverGroupSize);
DbgPrint((DPRINT_REACTOS, " Group: '%S' \n", DriverGroup));
#ifdef _M_PPC
StartValue = SWAPD(StartValue);
TagValue = SWAPD(TagValue);
#endif
/* Make sure it should be started */
if ((StartValue == 0) &&
(TagValue == OrderList[TagIndex]) &&

View File

@@ -141,6 +141,10 @@ RegInitCurrentControlSet(BOOLEAN LastKnownGood)
CurrentSet = (LastKnownGood == TRUE) ? LastKnownGoodSet : DefaultSet;
wcscpy(ControlSetKeyName, L"ControlSet");
// Swap this binary value for now. We'll decide on a policy for these later
#ifdef _M_PPC
CurrentSet = SWAPD(CurrentSet);
#endif
switch(CurrentSet)
{
case 1:

View File

@@ -11,8 +11,8 @@
#include <freeldr.h>
#ifdef _M_PPC
#include <ppcmmu/mmu.h>
#include <of.h>
#include <mmu.h>
#endif
//#include <ndk/ldrtypes.h>
@@ -25,21 +25,13 @@
PVOID
VaToPa(PVOID Va)
{
#ifdef _M_IX86
return (PVOID)((ULONG_PTR)Va & ~KSEG0_BASE);
#elif defined(_M_PPC)
return (PVOID)PpcVirt2phys((ULONG_PTR)Va,0);
#endif
}
PVOID
PaToVa(PVOID Pa)
{
#ifdef _M_IX86
return (PVOID)((ULONG_PTR)Pa | KSEG0_BASE);
#elif defined(_M_PPC)
return (PVOID)ofw_phys2virt(mmu_handle,0,(ULONG_PTR)Pa,0);
#endif
}
VOID

View File

@@ -104,8 +104,6 @@ extern ULONG_PTR i386GeneralProtectionFault;
extern ULONG_PTR i386PageFault; // exc 14
extern ULONG_PTR i386CoprocessorError; // exc 16
extern ULONG_PTR i386AlignmentCheck; // exc 17
#else
typedef unsigned long long HARDWARE_PTE, *PHARDWARE_PTE;
#endif
/* GLOBALS ***************************************************************/

View File

@@ -12,7 +12,6 @@
#ifdef _M_PPC
#include <of.h>
#include <mmu.h>
#endif
#define NDEBUG

View File

@@ -0,0 +1,309 @@
#include "precomp.h"
USHORT AT_Initialization[] =
{
0x10 | CMD_STREAM_READ, // Major Command = 0x10. Minor Command = 0x08.
0x3DA, // Index Status 1 Register Port Address
//
// This Stream performs a USHORT Array Indexed Write at port 0x3C0
//
0x20 | 0x01, // Major Command = 0x20. Minor Command = 0x01.
0x3C0, // Attribute Controller Data Register
0x10, // Loop Count = 16 (Number of Pallette Entries)
0x0, // Index to select (Index = 0, palettes)
0x00, // Palette 0
0x01, // Palette 1
0x02, // Palette 2
0x03, // Palette 3
0x04, // Palette 4
0x05, // Palette 5
0x06, // Palette 6
0x07, // Palette 7
0x08, // Palette 8
0x09, // Palette 9
0x0A, // Palette 10
0x0B, // Palette 11
0x0C, // Palette 12
0x0D, // Palette 13
0x0E, // Palette 14
0x0F, // Palette 15
//
// This Stream performs a UCHAR READ of port 0x3DA
//
0x10 | CMD_STREAM_READ, // Major Command = 0x10. Minor Command = 0x08.
0x3DA, // Index Status 1 Register Port Address
//
// This Stream performs a UCHAR WRITE of value 0x20 at port 0x3C0
//
0x10 | CMD_STREAM_WRITE, // Major Command = 0x10. Minor Command = 0x00.
0x3C0, // Attribute Controller Data Register
0x20, // Set Palette Address Source
//
// End of Stream Marker
//
0x0 // End of command stream
};
UCHAR FontData[256 * 13] =
{
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 0
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 13
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 26
0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 39
0x14, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 52
0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 65
0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 78
0x10, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 91
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, // 104
0x14, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 117
0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 130
0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 143
0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 156
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, // 169
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 182
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 195
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 208
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 221
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 234
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 247
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 260
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 273
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 286
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 299
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 312
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 325
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 338
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 351
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 364
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 377
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 390
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 403
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 416
0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, // 429
0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 442
0x00, 0x14, 0x14, 0x14, 0x7F, 0x28, 0xFE, 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, // 455
0x10, 0x3C, 0x50, 0x50, 0x70, 0x38, 0x1C, 0x14, 0x14, 0x78, 0x10, 0x00, 0x00, // 468
0x00, 0x61, 0x92, 0x94, 0x68, 0x18, 0x16, 0x29, 0x49, 0x86, 0x00, 0x00, 0x00, // 481
0x00, 0x18, 0x24, 0x24, 0x38, 0x71, 0x89, 0x8E, 0xC6, 0x7E, 0x00, 0x00, 0x00, // 494
0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 507
0x06, 0x08, 0x10, 0x30, 0x20, 0x20, 0x20, 0x20, 0x30, 0x10, 0x08, 0x06, 0x00, // 520
0x60, 0x10, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x10, 0x60, 0x00, // 533
0x00, 0x10, 0x52, 0x24, 0x3C, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 546
0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, // 559
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x10, 0x20, 0x00, // 572
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 585
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, // 598
0x01, 0x02, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x40, 0x80, 0x00, // 611
0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x3C, 0x00, 0x00, 0x00, // 624
0x00, 0x30, 0xD0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFE, 0x00, 0x00, 0x00, // 637
0x00, 0x78, 0x04, 0x04, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7C, 0x00, 0x00, 0x00, // 650
0x00, 0x78, 0x04, 0x04, 0x08, 0x30, 0x0C, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, // 663
0x00, 0x08, 0x18, 0x28, 0x28, 0x48, 0x88, 0xFC, 0x08, 0x08, 0x00, 0x00, 0x00, // 676
0x00, 0x3C, 0x20, 0x20, 0x38, 0x04, 0x04, 0x04, 0x04, 0x38, 0x00, 0x00, 0x00, // 689
0x00, 0x1C, 0x20, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00, 0x00, // 702
0x00, 0x7E, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, // 715
0x00, 0x3C, 0x42, 0x42, 0x24, 0x3C, 0x46, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 728
0x00, 0x38, 0x44, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x04, 0x38, 0x00, 0x00, 0x00, // 741
0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, // 754
0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x10, 0x20, 0x00, // 767
0x00, 0x00, 0x00, 0x02, 0x0C, 0x10, 0x60, 0x10, 0x0C, 0x02, 0x00, 0x00, 0x00, // 780
0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // 793
0x00, 0x00, 0x00, 0x40, 0x30, 0x08, 0x06, 0x08, 0x30, 0x40, 0x00, 0x00, 0x00, // 806
0x00, 0x7C, 0x42, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, // 819
0x00, 0x3C, 0x62, 0xDE, 0xB2, 0xA2, 0xA6, 0x9B, 0x44, 0x3C, 0x00, 0x00, 0x00, // 832
0x00, 0x00, 0x18, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x81, 0x00, 0x00, 0x00, // 845
0x00, 0x00, 0x7C, 0x42, 0x42, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00, 0x00, // 858
0x00, 0x00, 0x3E, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x3E, 0x00, 0x00, 0x00, // 871
0x00, 0x00, 0x78, 0x44, 0x42, 0x42, 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x00, // 884
0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, // 897
0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x7C, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, // 910
0x00, 0x00, 0x3E, 0x40, 0x80, 0x80, 0x8E, 0x82, 0x42, 0x3E, 0x00, 0x00, 0x00, // 923
0x00, 0x00, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, // 936
0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00, 0x00, // 949
0x00, 0x00, 0x3C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, // 962
0x00, 0x00, 0x42, 0x44, 0x48, 0x70, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, // 975
0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, // 988
0x00, 0x00, 0xC6, 0xC6, 0xAA, 0xAA, 0xAA, 0x92, 0x82, 0x82, 0x00, 0x00, 0x00, // 1001
0x00, 0x00, 0x42, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x46, 0x42, 0x00, 0x00, 0x00, // 1014
0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00, 0x00, // 1027
0x00, 0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, // 1040
0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x06, 0x03, 0x00, // 1053
0x00, 0x00, 0x78, 0x44, 0x44, 0x44, 0x78, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, // 1066
0x00, 0x00, 0x3E, 0x40, 0x40, 0x38, 0x04, 0x02, 0x02, 0x7C, 0x00, 0x00, 0x00, // 1079
0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, // 1092
0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 1105
0x00, 0x00, 0x81, 0x42, 0x42, 0x44, 0x24, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00, // 1118
0x00, 0x00, 0x81, 0x81, 0x92, 0x5A, 0x5A, 0x6A, 0x66, 0x24, 0x00, 0x00, 0x00, // 1131
0x00, 0x00, 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, 0x00, 0x00, 0x00, // 1144
0x00, 0x00, 0x82, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, // 1157
0x00, 0x00, 0xFE, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0xFE, 0x00, 0x00, 0x00, // 1170
0x1E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1E, 0x00, // 1183
0x80, 0x40, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, // 1196
0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0x00, // 1209
0x00, 0x08, 0x08, 0x18, 0x14, 0x24, 0x24, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, // 1222
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, // 1235
0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 1248
0x00, 0x00, 0x00, 0x38, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3E, 0x00, 0x00, 0x00, // 1261
0x40, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x62, 0x5C, 0x00, 0x00, 0x00, // 1274
0x00, 0x00, 0x00, 0x1E, 0x20, 0x40, 0x40, 0x40, 0x20, 0x1E, 0x00, 0x00, 0x00, // 1287
0x02, 0x02, 0x02, 0x3A, 0x46, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, // 1300
0x00, 0x00, 0x00, 0x3C, 0x22, 0x42, 0x7E, 0x40, 0x40, 0x3E, 0x00, 0x00, 0x00, // 1313
0x1E, 0x20, 0x20, 0xFE, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, // 1326
0x00, 0x00, 0x00, 0x3A, 0x46, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x02, 0x3C, // 1339
0x40, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, // 1352
0x18, 0x18, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, // 1365
0x18, 0x18, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x70, // 1378
0x40, 0x40, 0x40, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, 0x00, 0x00, // 1391
0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, // 1404
0x00, 0x00, 0x00, 0xB6, 0xDA, 0x92, 0x92, 0x92, 0x92, 0x92, 0x00, 0x00, 0x00, // 1417
0x00, 0x00, 0x00, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, // 1430
0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 1443
0x00, 0x00, 0x00, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x62, 0x5C, 0x40, 0x40, 0x40, // 1456
0x00, 0x00, 0x00, 0x3A, 0x46, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x02, 0x02, // 1469
0x00, 0x00, 0x00, 0x5C, 0x64, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, // 1482
0x00, 0x00, 0x00, 0x3C, 0x40, 0x60, 0x18, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, // 1495
0x00, 0x00, 0x20, 0xFC, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1C, 0x00, 0x00, 0x00, // 1508
0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, // 1521
0x00, 0x00, 0x00, 0x82, 0x44, 0x44, 0x44, 0x28, 0x28, 0x10, 0x00, 0x00, 0x00, // 1534
0x00, 0x00, 0x00, 0x81, 0x91, 0x5A, 0x5A, 0x6A, 0x24, 0x24, 0x00, 0x00, 0x00, // 1547
0x00, 0x00, 0x00, 0x42, 0x24, 0x18, 0x18, 0x18, 0x24, 0x42, 0x00, 0x00, 0x00, // 1560
0x00, 0x00, 0x00, 0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x10, 0x30, 0xE0, // 1573
0x00, 0x00, 0x00, 0x7E, 0x02, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00, 0x00, // 1586
0x1C, 0x10, 0x10, 0x10, 0x10, 0x60, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x00, // 1599
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // 1612
0x30, 0x08, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x30, 0x00, // 1625
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, // 1638
0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, // 1651
0x00, 0x00, 0x3E, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x3E, 0x04, 0x02, 0x06, // 1664
0x00, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, // 1677
0x08, 0x10, 0x00, 0x3C, 0x22, 0x42, 0x7E, 0x40, 0x40, 0x3E, 0x00, 0x00, 0x00, // 1690
0x18, 0x24, 0x00, 0x38, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3E, 0x00, 0x00, 0x00, // 1703
0x00, 0x24, 0x00, 0x38, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3E, 0x00, 0x00, 0x00, // 1716
0x10, 0x08, 0x00, 0x38, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3E, 0x00, 0x00, 0x00, // 1729
0x10, 0x28, 0x10, 0x38, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3E, 0x00, 0x00, 0x00, // 1742
0x00, 0x00, 0x00, 0x1E, 0x20, 0x40, 0x40, 0x40, 0x20, 0x1E, 0x08, 0x04, 0x0C, // 1755
0x18, 0x24, 0x00, 0x3C, 0x22, 0x42, 0x7E, 0x40, 0x40, 0x3E, 0x00, 0x00, 0x00, // 1768
0x00, 0x12, 0x00, 0x3C, 0x22, 0x42, 0x7E, 0x40, 0x40, 0x3E, 0x00, 0x00, 0x00, // 1781
0x10, 0x08, 0x00, 0x3C, 0x22, 0x42, 0x7E, 0x40, 0x40, 0x3E, 0x00, 0x00, 0x00, // 1794
0x00, 0x24, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, // 1807
0x18, 0x24, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, // 1820
0x10, 0x08, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, // 1833
0x24, 0x00, 0x18, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x81, 0x00, 0x00, 0x00, // 1846
0x10, 0x28, 0x10, 0x28, 0x28, 0x24, 0x44, 0x7E, 0x42, 0x81, 0x00, 0x00, 0x00, // 1859
0x08, 0x10, 0x7E, 0x40, 0x40, 0x40, 0x7C, 0x40, 0x40, 0x7E, 0x00, 0x00, 0x00, // 1872
0x00, 0x00, 0x00, 0xFC, 0x12, 0x12, 0x7E, 0x90, 0x90, 0x6E, 0x00, 0x00, 0x00, // 1885
0x00, 0x00, 0x0F, 0x18, 0x18, 0x28, 0x2E, 0x78, 0x48, 0x8F, 0x00, 0x00, 0x00, // 1898
0x18, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 1911
0x00, 0x24, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 1924
0x20, 0x10, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 1937
0x18, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, // 1950
0x20, 0x10, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, // 1963
0x00, 0x24, 0x00, 0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x10, 0x30, 0xE0, // 1976
0x24, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00, 0x00, // 1989
0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 2002
0x00, 0x08, 0x1C, 0x28, 0x48, 0x48, 0x48, 0x68, 0x1C, 0x08, 0x00, 0x00, 0x00, // 2015
0x00, 0x0E, 0x10, 0x10, 0x10, 0x38, 0x10, 0x10, 0x20, 0x3E, 0x00, 0x00, 0x00, // 2028
0x00, 0x81, 0x42, 0x24, 0x18, 0x7C, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x00, 0x00, // 2041
0x00, 0xE0, 0x90, 0x90, 0xE0, 0x96, 0xBC, 0x94, 0x92, 0x9E, 0x00, 0x00, 0x00, // 2054
0x0E, 0x10, 0x10, 0x3C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xE0, // 2067
0x08, 0x10, 0x00, 0x38, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x3E, 0x00, 0x00, 0x00, // 2080
0x08, 0x10, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, // 2093
0x08, 0x10, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 2106
0x08, 0x10, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x00, 0x00, 0x00, // 2119
0x14, 0x28, 0x00, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, // 2132
0x14, 0x28, 0x42, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x46, 0x42, 0x00, 0x00, 0x00, // 2145
0x00, 0x78, 0x08, 0x38, 0x48, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2158
0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2171
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x42, 0x3E, 0x00, // 2184
0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, // 2197
0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 2210
0x00, 0xC4, 0x48, 0x48, 0x50, 0x37, 0x21, 0x43, 0x44, 0x87, 0x00, 0x00, 0x00, // 2223
0x00, 0xC4, 0x48, 0x48, 0x50, 0x22, 0x26, 0x4A, 0x4F, 0x82, 0x00, 0x00, 0x00, // 2236
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // 2249
0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x48, 0x24, 0x12, 0x00, 0x00, 0x00, 0x00, // 2262
0x00, 0x00, 0x00, 0x00, 0x48, 0x24, 0x12, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, // 2275
0x94, 0x00, 0x00, 0x94, 0x00, 0x94, 0x00, 0x00, 0x94, 0x00, 0x94, 0x00, 0x00, // 2288
0x49, 0x94, 0x00, 0x49, 0x94, 0x49, 0x00, 0x94, 0x49, 0x94, 0x49, 0x00, 0x94, // 2301
0xFF, 0x94, 0x94, 0xFF, 0x94, 0xFF, 0x94, 0x94, 0xFF, 0x94, 0xFF, 0x94, 0x94, // 2314
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 2327
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 2340
0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, // 2353
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // 2366
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // 2379
0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, // 2392
0x14, 0x14, 0x14, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x14, 0x14, 0x14, 0x14, 0x14, // 2405
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // 2418
0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x14, 0x14, 0x14, // 2431
0x14, 0x14, 0x14, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, // 2444
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2457
0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, // 2470
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 2483
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2496
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2509
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 2522
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 2535
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2548
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 2561
0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, // 2574
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x17, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // 2587
0x14, 0x14, 0x14, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, // 2600
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x14, 0x14, 0x14, 0x14, 0x14, // 2613
0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, // 2626
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, // 2639
0x14, 0x14, 0x14, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14, 0x14, 0x14, 0x14, // 2652
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, // 2665
0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, // 2678
0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, // 2691
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2704
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, // 2717
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // 2730
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2743
0x10, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, // 2756
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, // 2769
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // 2782
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // 2795
0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, // 2808
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2821
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 2834
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 2847
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 2860
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, // 2873
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, // 2886
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2899
0x00, 0x00, 0x00, 0x31, 0x49, 0x86, 0x84, 0x84, 0x8A, 0x71, 0x00, 0x00, 0x00, // 2912
0x38, 0x48, 0x48, 0x50, 0x50, 0x58, 0x44, 0x42, 0x42, 0x5C, 0x00, 0x00, 0x00, // 2925
0x00, 0x00, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, // 2938
0x00, 0x00, 0x00, 0x7F, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, // 2951
0x00, 0x00, 0xFF, 0x40, 0x20, 0x10, 0x10, 0x20, 0x40, 0xFF, 0x00, 0x00, 0x00, // 2964
0x00, 0x00, 0x00, 0x7F, 0x84, 0x84, 0x84, 0x84, 0x84, 0x78, 0x00, 0x00, 0x00, // 2977
0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x66, 0x5A, 0x40, 0x40, 0x40, // 2990
0x00, 0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, // 3003
0x00, 0x00, 0x10, 0x7C, 0x92, 0x92, 0x92, 0x92, 0x7C, 0x10, 0x00, 0x00, 0x00, // 3016
0x00, 0x00, 0x38, 0x44, 0x82, 0xBA, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00, 0x00, // 3029
0x00, 0x00, 0x7C, 0xC6, 0x82, 0x82, 0x82, 0x84, 0x44, 0xEE, 0x00, 0x00, 0x00, // 3042
0x38, 0x40, 0x60, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00, // 3055
0x00, 0x00, 0x00, 0x00, 0x66, 0x99, 0x99, 0x99, 0x66, 0x00, 0x00, 0x00, 0x00, // 3068
0x10, 0x10, 0x10, 0x7C, 0x92, 0x91, 0x91, 0x91, 0x92, 0x7C, 0x10, 0x10, 0x10, // 3081
0x00, 0x00, 0x00, 0x1E, 0x20, 0x40, 0x7C, 0x40, 0x60, 0x1E, 0x00, 0x00, 0x00, // 3094
0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00, 0x00, // 3107
0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, // 3120
0x00, 0x00, 0x00, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x00, 0xFE, 0x00, 0x00, 0x00, // 3133
0x00, 0x00, 0x40, 0x30, 0x08, 0x06, 0x08, 0x30, 0x40, 0x00, 0x7E, 0x00, 0x00, // 3146
0x00, 0x00, 0x02, 0x0C, 0x10, 0x60, 0x10, 0x0C, 0x02, 0x00, 0x7E, 0x00, 0x00, // 3159
0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 3172
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x60, // 3185
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, // 3198
0x00, 0x00, 0x00, 0x00, 0x72, 0x4E, 0x00, 0x72, 0x4E, 0x00, 0x00, 0x00, 0x00, // 3211
0x00, 0x10, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 3224
0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // 3237
0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // 3250
0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0xC4, 0x28, 0x28, 0x18, 0x10, 0x00, // 3263
0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 3276
0x00, 0x3C, 0x04, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 3289
0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, // 3302
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // 3315
};

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,12 @@
<module name="bootvid" type="kernelmodedriver" installbase="system32/drivers" installname="bootvid.sys">
<module name="bootvid" type="kernelmodedll" entrypoint="DriverEntry@8" installbase="system32/drivers" installname="bootvid.dll">
<importlibrary definition="bootvid.def"></importlibrary>
<bootstrap base="$(CDOUTPUT)" nameoncd="bootvid.dll" />
<include base="bootvid">.</include>
<define name="__USE_W32API" />
<library>ntoskrnl</library>
<library>hal</library>
<file>bootvid.c</file>
<file>pixelsup_i386.S</file>
<file>bootdata.c</file>
<file>vga.c</file>
<file>bootvid.rc</file>
</module>

View File

@@ -3,10 +3,8 @@
#include "resource.h"
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Boot Video\0"
#define REACTOS_STR_INTERNAL_NAME "bootvid\0"
#define REACTOS_STR_ORIGINAL_FILENAME "bootvid.sys\0"
#define REACTOS_STR_FILE_DESCRIPTION "VGA Boot Driver\0"
#define REACTOS_STR_INTERNAL_NAME "bootvid.dll\0"
#define REACTOS_STR_ORIGINAL_FILENAME "bootvid.dll\0"
#include <reactos/version.rc>
IDB_BOOTIMAGE BITMAP DISCARDABLE "bootimage.bmp"

View File

@@ -0,0 +1,46 @@
#include "ntddk.h"
#include "arc/arc.h"
#include "halfuncs.h"
#include "drivers/bootvid/bootvid.h"
//
// Command Stream Definitions
//
#define CMD_STREAM_WRITE 0x0
#define CMD_STREAM_WRITE_ARRAY 0x2
#define CMD_STREAM_USHORT 0x4
#define CMD_STREAM_READ 0x8
//
// Bitmap Header
//
typedef struct tagBITMAPINFOHEADER
{
ULONG biSize;
LONG biWidth;
LONG biHeight;
USHORT biPlanes;
USHORT biBitCount;
ULONG biCompression;
ULONG biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
ULONG biClrUsed;
ULONG biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
VOID
NTAPI
InitializePalette(
VOID
);
//
// Globals
//
extern USHORT AT_Initialization[];
extern ULONG curr_x;
extern ULONG curr_y;
extern ULONG_PTR VgaRegisterBase;
extern ULONG_PTR VgaBase;
extern UCHAR FontData[256 * 13];

File diff suppressed because it is too large Load Diff

View File

@@ -13,6 +13,9 @@
<directory name="debugout">
<xi:include href="debugout/debugout.rbuild" />
</directory>
<directory name="kdcom">
<xi:include href="kdcom/kdcom.rbuild" />
</directory>
<directory name="null">
<xi:include href="null/null.rbuild" />
</directory>

View File

@@ -0,0 +1,628 @@
/* $Id: kdbg.c 23670 2006-08-23 17:28:39Z ion $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/hal/x86/kdbg.c
* PURPOSE: Serial i/o functions for the kernel debugger.
* PROGRAMMER: Emanuele Aliberti
* Eric Kohl
* UPDATE HISTORY:
* Created 05/09/99
*/
/* INCLUDES *****************************************************************/
#define NOEXTAPI
#include <ntddk.h>
#define NDEBUG
#include <halfuncs.h>
#include <stdio.h>
#include <debug.h>
#include "arc/arc.h"
#include "windbgkd.h"
typedef struct _KD_PORT_INFORMATION
{
ULONG ComPort;
ULONG BaudRate;
ULONG BaseAddress;
} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
#define DEFAULT_BAUD_RATE 19200
/* MACROS *******************************************************************/
#define SER_RBR(x) ((x)+0)
#define SER_THR(x) ((x)+0)
#define SER_DLL(x) ((x)+0)
#define SER_IER(x) ((x)+1)
#define SR_IER_ERDA 0x01
#define SR_IER_ETHRE 0x02
#define SR_IER_ERLSI 0x04
#define SR_IER_EMS 0x08
#define SR_IER_ALL 0x0F
#define SER_DLM(x) ((x)+1)
#define SER_IIR(x) ((x)+2)
#define SER_FCR(x) ((x)+2)
#define SR_FCR_ENABLE_FIFO 0x01
#define SR_FCR_CLEAR_RCVR 0x02
#define SR_FCR_CLEAR_XMIT 0x04
#define SER_LCR(x) ((x)+3)
#define SR_LCR_CS5 0x00
#define SR_LCR_CS6 0x01
#define SR_LCR_CS7 0x02
#define SR_LCR_CS8 0x03
#define SR_LCR_ST1 0x00
#define SR_LCR_ST2 0x04
#define SR_LCR_PNO 0x00
#define SR_LCR_POD 0x08
#define SR_LCR_PEV 0x18
#define SR_LCR_PMK 0x28
#define SR_LCR_PSP 0x38
#define SR_LCR_BRK 0x40
#define SR_LCR_DLAB 0x80
#define SER_MCR(x) ((x)+4)
#define SR_MCR_DTR 0x01
#define SR_MCR_RTS 0x02
#define SR_MCR_OUT1 0x04
#define SR_MCR_OUT2 0x08
#define SR_MCR_LOOP 0x10
#define SER_LSR(x) ((x)+5)
#define SR_LSR_DR 0x01
#define SR_LSR_TBE 0x20
#define SER_MSR(x) ((x)+6)
#define SR_MSR_CTS 0x10
#define SR_MSR_DSR 0x20
#define SER_SCR(x) ((x)+7)
/* GLOBAL VARIABLES *********************************************************/
/* STATIC VARIABLES *********************************************************/
static ULONG ComPort = 0;
static ULONG BaudRate = 0;
static PUCHAR PortBase = (PUCHAR)0;
/* The com port must only be initialized once! */
static BOOLEAN PortInitialized = FALSE;
/* STATIC FUNCTIONS *********************************************************/
static BOOLEAN
KdpDoesComPortExist (PUCHAR BaseAddress)
{
BOOLEAN found;
UCHAR mcr;
UCHAR msr;
found = FALSE;
/* save Modem Control Register (MCR) */
mcr = READ_PORT_UCHAR (SER_MCR(BaseAddress));
/* enable loop mode (set Bit 4 of the MCR) */
WRITE_PORT_UCHAR (SER_MCR(BaseAddress), 0x10);
/* clear all modem output bits */
WRITE_PORT_UCHAR (SER_MCR(BaseAddress), 0x10);
/* read the Modem Status Register */
msr = READ_PORT_UCHAR (SER_MSR(BaseAddress));
/*
* the upper nibble of the MSR (modem output bits) must be
* equal to the lower nibble of the MCR (modem input bits)
*/
if ((msr & 0xF0) == 0x00)
{
/* set all modem output bits */
WRITE_PORT_UCHAR (SER_MCR(BaseAddress), 0x1F);
/* read the Modem Status Register */
msr = READ_PORT_UCHAR (SER_MSR(BaseAddress));
/*
* the upper nibble of the MSR (modem output bits) must be
* equal to the lower nibble of the MCR (modem input bits)
*/
if ((msr & 0xF0) == 0xF0)
{
/*
* setup a resonable state for the port:
* enable fifo and clear recieve/transmit buffers
*/
WRITE_PORT_UCHAR (SER_FCR(BaseAddress),
(SR_FCR_ENABLE_FIFO | SR_FCR_CLEAR_RCVR | SR_FCR_CLEAR_XMIT));
WRITE_PORT_UCHAR (SER_FCR(BaseAddress), 0);
READ_PORT_UCHAR (SER_RBR(BaseAddress));
WRITE_PORT_UCHAR (SER_IER(BaseAddress), 0);
found = TRUE;
}
}
/* restore MCR */
WRITE_PORT_UCHAR (SER_MCR(BaseAddress), mcr);
return (found);
}
/* FUNCTIONS ****************************************************************/
/* HAL.KdPortInitialize */
BOOLEAN
STDCALL
KdPortInitialize (
PKD_PORT_INFORMATION PortInformation,
ULONG Unknown1,
ULONG Unknown2
)
{
ULONG BaseArray[5] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8};
char buffer[80];
ULONG divisor;
UCHAR lcr;
if (PortInitialized == FALSE)
{
if (PortInformation->BaudRate != 0)
{
BaudRate = PortInformation->BaudRate;
}
else
{
BaudRate = DEFAULT_BAUD_RATE;
}
if (PortInformation->ComPort == 0)
{
if (KdpDoesComPortExist ((PUCHAR)BaseArray[2]))
{
PortBase = (PUCHAR)BaseArray[2];
ComPort = 2;
PortInformation->BaseAddress = (ULONG)PortBase;
PortInformation->ComPort = ComPort;
#ifndef NDEBUG
sprintf (buffer,
"\nSerial port COM%ld found at 0x%lx\n",
ComPort,
(ULONG)PortBase);
HalDisplayString (buffer);
#endif /* NDEBUG */
}
else if (KdpDoesComPortExist ((PUCHAR)BaseArray[1]))
{
PortBase = (PUCHAR)BaseArray[1];
ComPort = 1;
PortInformation->BaseAddress = (ULONG)PortBase;
PortInformation->ComPort = ComPort;
#ifndef NDEBUG
sprintf (buffer,
"\nSerial port COM%ld found at 0x%lx\n",
ComPort,
(ULONG)PortBase);
HalDisplayString (buffer);
#endif /* NDEBUG */
}
else
{
sprintf (buffer,
"\nKernel Debugger: No COM port found!!!\n\n");
HalDisplayString (buffer);
return FALSE;
}
}
else
{
if (KdpDoesComPortExist ((PUCHAR)BaseArray[PortInformation->ComPort]))
{
PortBase = (PUCHAR)BaseArray[PortInformation->ComPort];
ComPort = PortInformation->ComPort;
PortInformation->BaseAddress = (ULONG)PortBase;
#ifndef NDEBUG
sprintf (buffer,
"\nSerial port COM%ld found at 0x%lx\n",
ComPort,
(ULONG)PortBase);
HalDisplayString (buffer);
#endif /* NDEBUG */
}
else
{
sprintf (buffer,
"\nKernel Debugger: No serial port found!!!\n\n");
HalDisplayString (buffer);
return FALSE;
}
}
PortInitialized = TRUE;
}
/*
* set baud rate and data format (8N1)
*/
/* turn on DTR and RTS */
WRITE_PORT_UCHAR (SER_MCR(PortBase), SR_MCR_DTR | SR_MCR_RTS);
/* set DLAB */
lcr = READ_PORT_UCHAR (SER_LCR(PortBase)) | SR_LCR_DLAB;
WRITE_PORT_UCHAR (SER_LCR(PortBase), lcr);
/* set baud rate */
divisor = 115200 / BaudRate;
WRITE_PORT_UCHAR (SER_DLL(PortBase), (UCHAR)(divisor & 0xff));
WRITE_PORT_UCHAR (SER_DLM(PortBase), (UCHAR)((divisor >> 8) & 0xff));
/* reset DLAB and set 8N1 format */
WRITE_PORT_UCHAR (SER_LCR(PortBase),
SR_LCR_CS8 | SR_LCR_ST1 | SR_LCR_PNO);
/* read junk out of the RBR */
lcr = READ_PORT_UCHAR (SER_RBR(PortBase));
/*
* set global info
*/
*KdComPortInUse = PortBase;
/*
* print message to blue screen
*/
sprintf (buffer,
"\nKernel Debugger: COM%ld (Port 0x%lx) BaudRate %ld\n\n",
ComPort,
(ULONG)PortBase,
BaudRate);
HalDisplayString (buffer);
return TRUE;
}
/* HAL.KdPortInitializeEx */
BOOLEAN
STDCALL
KdPortInitializeEx (
PKD_PORT_INFORMATION PortInformation,
ULONG Unknown1,
ULONG Unknown2
)
{
ULONG BaseArray[5] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8};
PUCHAR ComPortBase;
char buffer[80];
ULONG divisor;
UCHAR lcr;
if (PortInformation->BaudRate == 0)
{
PortInformation->BaudRate = DEFAULT_BAUD_RATE;
}
if (PortInformation->ComPort == 0)
{
return FALSE;
}
else
{
if (KdpDoesComPortExist ((PUCHAR)BaseArray[PortInformation->ComPort]))
{
ComPortBase = (PUCHAR)BaseArray[PortInformation->ComPort];
PortInformation->BaseAddress = (ULONG)ComPortBase;
#ifndef NDEBUG
sprintf (buffer,
"\nSerial port COM%ld found at 0x%lx\n",
PortInformation->ComPort,
(ULONG)ComPortBase];
HalDisplayString (buffer);
#endif /* NDEBUG */
}
else
{
sprintf (buffer,
"\nKernel Debugger: Serial port not found!!!\n\n");
HalDisplayString (buffer);
return FALSE;
}
}
/*
* set baud rate and data format (8N1)
*/
/* turn on DTR and RTS */
WRITE_PORT_UCHAR (SER_MCR(ComPortBase), SR_MCR_DTR | SR_MCR_RTS);
/* set DLAB */
lcr = READ_PORT_UCHAR (SER_LCR(ComPortBase)) | SR_LCR_DLAB;
WRITE_PORT_UCHAR (SER_LCR(ComPortBase), lcr);
/* set baud rate */
divisor = 115200 / PortInformation->BaudRate;
WRITE_PORT_UCHAR (SER_DLL(ComPortBase), (UCHAR)(divisor & 0xff));
WRITE_PORT_UCHAR (SER_DLM(ComPortBase), (UCHAR)((divisor >> 8) & 0xff));
/* reset DLAB and set 8N1 format */
WRITE_PORT_UCHAR (SER_LCR(ComPortBase),
SR_LCR_CS8 | SR_LCR_ST1 | SR_LCR_PNO);
/* read junk out of the RBR */
lcr = READ_PORT_UCHAR (SER_RBR(ComPortBase));
#ifndef NDEBUG
/*
* print message to blue screen
*/
sprintf (buffer,
"\nKernel Debugger: COM%ld (Port 0x%lx) BaudRate %ld\n\n",
PortInformation->ComPort,
(ULONG)ComPortBase,
PortInformation->BaudRate);
HalDisplayString (buffer);
#endif /* NDEBUG */
return TRUE;
}
/* HAL.KdPortGetByte */
BOOLEAN
STDCALL
KdPortGetByte (
PUCHAR ByteRecieved
)
{
if (PortInitialized == FALSE)
return FALSE;
if ((READ_PORT_UCHAR (SER_LSR(PortBase)) & SR_LSR_DR))
{
*ByteRecieved = READ_PORT_UCHAR (SER_RBR(PortBase));
return TRUE;
}
return FALSE;
}
/* HAL.KdPortGetByteEx */
BOOLEAN
STDCALL
KdPortGetByteEx (
PKD_PORT_INFORMATION PortInformation,
PUCHAR ByteRecieved
)
{
PUCHAR ComPortBase = (PUCHAR)PortInformation->BaseAddress;
if ((READ_PORT_UCHAR (SER_LSR(ComPortBase)) & SR_LSR_DR))
{
*ByteRecieved = READ_PORT_UCHAR (SER_RBR(ComPortBase));
return TRUE;
}
return FALSE;
}
/* HAL.KdPortPollByte */
BOOLEAN
STDCALL
KdPortPollByte (
PUCHAR ByteRecieved
)
{
if (PortInitialized == FALSE)
return FALSE;
while ((READ_PORT_UCHAR (SER_LSR(PortBase)) & SR_LSR_DR) == 0)
;
*ByteRecieved = READ_PORT_UCHAR (SER_RBR(PortBase));
return TRUE;
}
/* HAL.KdPortPollByteEx */
BOOLEAN
STDCALL
KdPortPollByteEx (
PKD_PORT_INFORMATION PortInformation,
PUCHAR ByteRecieved
)
{
PUCHAR ComPortBase = (PUCHAR)PortInformation->BaseAddress;
while ((READ_PORT_UCHAR (SER_LSR(ComPortBase)) & SR_LSR_DR) == 0)
;
*ByteRecieved = READ_PORT_UCHAR (SER_RBR(ComPortBase));
return TRUE;
}
/* HAL.KdPortPutByte */
VOID
STDCALL
KdPortPutByte (
UCHAR ByteToSend
)
{
if (PortInitialized == FALSE)
return;
while ((READ_PORT_UCHAR (SER_LSR(PortBase)) & SR_LSR_TBE) == 0)
;
WRITE_PORT_UCHAR (SER_THR(PortBase), ByteToSend);
}
/* HAL.KdPortPutByteEx */
VOID
STDCALL
KdPortPutByteEx (
PKD_PORT_INFORMATION PortInformation,
UCHAR ByteToSend
)
{
PUCHAR ComPortBase = (PUCHAR)PortInformation->BaseAddress;
while ((READ_PORT_UCHAR (SER_LSR(ComPortBase)) & SR_LSR_TBE) == 0)
;
WRITE_PORT_UCHAR (SER_THR(ComPortBase), ByteToSend);
}
/* HAL.KdPortRestore */
VOID
STDCALL
KdPortRestore (
VOID
)
{
}
/* HAL.KdPortSave */
VOID
STDCALL
KdPortSave (
VOID
)
{
}
/* HAL.KdPortDisableInterrupts */
BOOLEAN
STDCALL
KdPortDisableInterrupts()
{
UCHAR ch;
if (PortInitialized == FALSE)
return FALSE;
ch = READ_PORT_UCHAR (SER_MCR (PortBase));
ch &= (~(SR_MCR_OUT1 | SR_MCR_OUT2));
WRITE_PORT_UCHAR (SER_MCR (PortBase), ch);
ch = READ_PORT_UCHAR (SER_IER (PortBase));
ch &= (~SR_IER_ALL);
WRITE_PORT_UCHAR (SER_IER (PortBase), ch);
return TRUE;
}
/* HAL.KdPortEnableInterrupts */
BOOLEAN
STDCALL
KdPortEnableInterrupts()
{
UCHAR ch;
if (PortInitialized == FALSE)
return FALSE;
ch = READ_PORT_UCHAR (SER_IER (PortBase));
ch &= (~SR_IER_ALL);
ch |= SR_IER_ERDA;
WRITE_PORT_UCHAR (SER_IER (PortBase), ch);
ch = READ_PORT_UCHAR (SER_MCR (PortBase));
ch &= (~SR_MCR_LOOP);
ch |= (SR_MCR_OUT1 | SR_MCR_OUT2);
WRITE_PORT_UCHAR (SER_MCR (PortBase), ch);
return TRUE;
}
/*
* @unimplemented
*/
NTSTATUS
NTAPI
KdDebuggerInitialize0(IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL)
{
/* FIXME: TODO */
return STATUS_UNSUCCESSFUL;
}
/*
* @unimplemented
*/
NTSTATUS
NTAPI
KdDebuggerInitialize1(IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL)
{
/* FIXME: TODO */
return STATUS_UNSUCCESSFUL;
}
/*
* @implemented
*/
NTSTATUS
NTAPI
KdSave(IN BOOLEAN SleepTransition)
{
/* Nothing to do on COM ports */
return STATUS_SUCCESS;
}
/*
* @implemented
*/
NTSTATUS
NTAPI
KdRestore(IN BOOLEAN SleepTransition)
{
/* Nothing to do on COM ports */
return STATUS_SUCCESS;
}
/*
* @unimplemented
*/
VOID
NTAPI
KdSendPacket(IN USHORT PacketType,
IN PSTRING Header,
IN PSTRING Data OPTIONAL,
OUT PKD_CONTEXT Context)
{
/* FIXME: TODO */
return;
}
/*
* @unimplemented
*/
ULONG
NTAPI
KdReceivePacket(IN USHORT PacketType,
OUT PSTRING Header,
OUT PSTRING Data,
OUT PUSHORT DataSize,
OUT PKD_CONTEXT Context OPTIONAL)
{
/* FIXME: TODO */
return 0;
}
/* EOF */

View File

@@ -0,0 +1,24 @@
LIBRARY kdcom.dll
EXPORTS
; Old KD
KdPortGetByte@4
KdPortGetByteEx@8
KdPortInitialize@12
KdPortInitializeEx@12
KdPortPollByte@4
KdPortPollByteEx@8
KdPortPutByte@4
KdPortPutByteEx@8
KdPortRestore@0
KdPortSave@0
KdPortDisableInterrupts@0
KdPortEnableInterrupts@0
; New KD
KdDebuggerInitialize0@4
KdDebuggerInitialize1@4
KdSave@4
KdRestore@4
KdReceivePacket@20
KdSendPacket@16

View File

@@ -0,0 +1,9 @@
<module name="kdcom" type="kernelmodedll" entrypoint="DriverEntry@8" installbase="system32/drivers" installname="kdcom.dll">
<importlibrary definition="kdcom.def"></importlibrary>
<bootstrap base="$(CDOUTPUT)" nameoncd="kdcom.dll" />
<include base="kdcom">.</include>
<define name="__USE_W32API" />
<library>ntoskrnl</library>
<library>hal</library>
<file>kdbg.c</file>
</module>

View File

@@ -0,0 +1,14 @@
/* $Id: bootvid.rc 24464 2006-10-09 04:00:34Z ion $ */
#include "resource.h"
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS KDBG COM Library\0"
#define REACTOS_STR_INTERNAL_NAME "kdcom\0"
#define REACTOS_STR_ORIGINAL_FILENAME "kdcom.sys\0"
#include <reactos/version.rc>
IDB_BOOTIMAGE BITMAP DISCARDABLE "bootimage.bmp"
IDB_BAR BITMAP DISCARDABLE "bar.bmp"

View File

@@ -1,5 +1,4 @@
/* $Id$
*
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: hal/hal.c
@@ -12,10 +11,12 @@
/* INCLUDES ******************************************************************/
#include <ntddk.h>
#include <ntdddisk.h>
#include <arc/arc.h>
#include <intrin.h>
#include <ndk/halfuncs.h>
#include <ndk/iofuncs.h>
#include <ndk/kdfuncs.h>
#include <rosldr.h>
#include <internal/kd.h>
#define NDEBUG
#include <debug.h>
@@ -26,7 +27,7 @@
/* DATA **********************************************************************/
ULONG KdComPortInUse = 0;
ULONG _KdComPortInUse = 0;
/* FUNCTIONS *****************************************************************/
@@ -41,6 +42,38 @@ DriverEntry(
return STATUS_SUCCESS;
}
/*
* @unimplemented
*/
VOID
NTAPI
HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
{
KEBUGCHECK(0);
return;
}
/*
* @unimplemented
*/
VOID
NTAPI
HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
{
KEBUGCHECK(0);
return;
}
/*
* @unimplemented
*/
ULONG_PTR
NTAPI
HalSetProfileInterval(IN ULONG_PTR Interval)
{
KEBUGCHECK(0);
return Interval;
}
VOID
FASTCALL
@@ -131,8 +164,8 @@ HalAllocateCommonBuffer(
PVOID
NTAPI
HalAllocateCrashDumpRegisters(
ULONG Unknown1,
ULONG Unknown2)
PADAPTER_OBJECT AdapterObject,
PULONG NumberOfMapRegisters)
{
UNIMPLEMENTED;
return NULL;
@@ -172,7 +205,8 @@ HalBeginSystemInterrupt (KIRQL Irql,
VOID
NTAPI
HalCalibratePerformanceCounter(
ULONG Count)
volatile LONG *Count,
ULONGLONG NewCount)
{
UNIMPLEMENTED;
}
@@ -293,7 +327,7 @@ HalGetBusDataByOffset(
}
BOOLEAN
ARC_STATUS
NTAPI
HalGetEnvironmentVariable(
PCH Name,
@@ -302,7 +336,7 @@ HalGetEnvironmentVariable(
{
UNIMPLEMENTED;
return FALSE;
return ENOENT;
}
@@ -335,7 +369,7 @@ BOOLEAN
NTAPI
HalInitSystem(
ULONG BootPhase,
PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
PLOADER_PARAMETER_BLOCK LoaderBlock)
{
UNIMPLEMENTED;
@@ -346,7 +380,7 @@ HalInitSystem(
VOID
NTAPI
HalInitializeProcessor(ULONG ProcessorNumber,
PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
PLOADER_PARAMETER_BLOCK LoaderBlock)
{
UNIMPLEMENTED;
}
@@ -446,6 +480,13 @@ HalRequestSoftwareInterrupt(
UNIMPLEMENTED;
}
VOID FASTCALL
HalClearSoftwareInterrupt(
IN KIRQL Request)
{
UNIMPLEMENTED;
}
VOID
NTAPI
@@ -497,7 +538,7 @@ HalSetDisplayParameters(
}
BOOLEAN
ARC_STATUS
NTAPI
HalSetEnvironmentVariable(
PCH Name,
@@ -505,24 +546,36 @@ HalSetEnvironmentVariable(
{
UNIMPLEMENTED;
return TRUE;
}
VOID
NTAPI
HalSetRealTimeClock(
PTIME_FIELDS Time)
{
UNIMPLEMENTED;
return ESUCCESS;
}
BOOLEAN
NTAPI
HalStartNextProcessor(
ULONG Unknown1,
ULONG Unknown2)
HalSetRealTimeClock(
PTIME_FIELDS Time)
{
UNIMPLEMENTED;
return TRUE;
}
ULONG
NTAPI
HalSetTimeIncrement(
ULONG Increment)
{
UNIMPLEMENTED;
return Increment;
}
BOOLEAN
NTAPI
HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN PKPROCESSOR_STATE ProcessorState)
{
UNIMPLEMENTED;
@@ -560,13 +613,60 @@ HalTranslateBusAddress(
VOID
NTAPI
IoAssignDriveLetters(
PROS_LOADER_PARAMETER_BLOCK LoaderBlock,
PSTRING NtDeviceName,
PUCHAR NtSystemPath,
PSTRING NtSystemPathString)
HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
IN PSTRING NtDeviceName,
OUT PUCHAR NtSystemPath,
OUT PSTRING NtSystemPathString)
{
UNIMPLEMENTED;
/* Call the kernel */
IoAssignDriveLetters(LoaderBlock,
NtDeviceName,
NtSystemPath,
NtSystemPathString);
}
NTSTATUS
NTAPI
HalpReadPartitionTable(IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,
IN BOOLEAN ReturnRecognizedPartitions,
IN OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
{
/* Call the kernel */
return IoReadPartitionTable(DeviceObject,
SectorSize,
ReturnRecognizedPartitions,
PartitionBuffer);
}
NTSTATUS
NTAPI
HalpWritePartitionTable(IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,
IN ULONG SectorsPerTrack,
IN ULONG NumberOfHeads,
IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer)
{
/* Call the kernel */
return IoWritePartitionTable(DeviceObject,
SectorSize,
SectorsPerTrack,
NumberOfHeads,
PartitionBuffer);
}
NTSTATUS
NTAPI
HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,
IN ULONG PartitionNumber,
IN ULONG PartitionType)
{
/* Call the kernel */
return IoSetPartitionInformation(DeviceObject,
SectorSize,
PartitionNumber,
PartitionType);
}
@@ -626,132 +726,6 @@ IoMapTransfer(
}
BOOLEAN
NTAPI
KdPortGetByte(
PUCHAR ByteRecieved)
{
UNIMPLEMENTED;
return TRUE;
}
BOOLEAN
NTAPI
KdPortGetByteEx(
PKD_PORT_INFORMATION PortInformation,
PUCHAR ByteRecieved)
{
UNIMPLEMENTED;
return TRUE;
}
BOOLEAN
NTAPI
KdPortInitialize(
PKD_PORT_INFORMATION PortInformation,
ULONG Unknown1,
ULONG Unknown2)
{
UNIMPLEMENTED;
return TRUE;
}
BOOLEAN
NTAPI
KdPortInitializeEx(
PKD_PORT_INFORMATION PortInformation,
ULONG Unknown1,
ULONG Unknown2)
{
UNIMPLEMENTED;
return TRUE;
}
BOOLEAN
NTAPI
KdPortPollByte(
PUCHAR ByteRecieved)
{
UNIMPLEMENTED;
return TRUE;
}
BOOLEAN
NTAPI
KdPortPollByteEx(
PKD_PORT_INFORMATION PortInformation,
PUCHAR ByteRecieved)
{
UNIMPLEMENTED;
return TRUE;
}
VOID
NTAPI
KdPortPutByte(
UCHAR ByteToSend)
{
UNIMPLEMENTED;
}
VOID
NTAPI
KdPortPutByteEx(
PKD_PORT_INFORMATION PortInformation,
UCHAR ByteToSend)
{
UNIMPLEMENTED;
}
VOID
NTAPI
KdPortRestore(VOID)
{
UNIMPLEMENTED;
}
VOID
NTAPI
KdPortSave(VOID)
{
UNIMPLEMENTED;
}
BOOLEAN
NTAPI
KdPortDisableInterrupts()
{
UNIMPLEMENTED;
return FALSE;
}
BOOLEAN
NTAPI
KdPortEnableInterrupts()
{
UNIMPLEMENTED;
return FALSE;
}
#undef KeAcquireSpinLock
VOID
NTAPI
@@ -784,6 +758,15 @@ KeAcquireInStackQueuedSpinLock(
UNIMPLEMENTED;
}
VOID
FASTCALL
KeAcquireInStackQueuedSpinLockRaiseToSynch(
IN PKSPIN_LOCK SpinLock,
IN PKLOCK_QUEUE_HANDLE LockHandle
)
{
UNIMPLEMENTED;
}
VOID
FASTCALL
@@ -836,14 +819,14 @@ KeQueryPerformanceCounter(
}
#undef KeRaiseIrql
NTOSAPI
KIRQL
DDKAPI
NTAPI
KeRaiseIrql(
IN KIRQL NewIrql)
KIRQL NewIrql,
PKIRQL OldIrql)
{
UNIMPLEMENTED;
return 0;
return *OldIrql;
}
@@ -886,6 +869,30 @@ KeStallExecutionProcessor(
}
LOGICAL
FASTCALL
KeTryToAcquireQueuedSpinLock(
KSPIN_LOCK_QUEUE_NUMBER LockNumber,
PKIRQL OldIrql)
{
UNIMPLEMENTED;
return FALSE;
}
BOOLEAN
FASTCALL
KeTryToAcquireQueuedSpinLockRaiseToSynch(
KSPIN_LOCK_QUEUE_NUMBER LockNumber,
PKIRQL OldIrql)
{
UNIMPLEMENTED;
return FALSE;
}
KIRQL
FASTCALL
KfAcquireSpinLock(
@@ -1061,6 +1068,14 @@ KeAcquireQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
return (KIRQL)0;
}
KIRQL
FASTCALL
KeAcquireQueuedSpinLockRaiseToSynch(IN PKLOCK_QUEUE_HANDLE LockHandle)
{
UNIMPLEMENTED;
return (KIRQL)0;
}
VOID
FASTCALL
KeReleaseQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle,

View File

@@ -3,9 +3,26 @@
LIBRARY hal.dll
EXPORTS
@ExAcquireFastMutex@4
@ExReleaseFastMutex@4
@ExTryToAcquireFastMutex@4
@ExAcquireFastMutex@4=@ExiAcquireFastMutex@4
@ExReleaseFastMutex@4=@ExiReleaseFastMutex@4
@ExTryToAcquireFastMutex@4=@ExiTryToAcquireFastMutex@4
@HalClearSoftwareInterrupt@4
@HalRequestSoftwareInterrupt@4
@HalSystemVectorDispatchEntry@12
@KeAcquireInStackQueuedSpinLock@8
@KeAcquireInStackQueuedSpinLockRaiseToSynch@8
@KeAcquireSpinLockRaiseToSynch@4
@KeAcquireQueuedSpinLock@4
@KeAcquireQueuedSpinLockRaiseToSynch@4
@KeReleaseInStackQueuedSpinLock@4
@KeReleaseQueuedSpinLock@8
@KeTryToAcquireQueuedSpinLock@8
@KeTryToAcquireQueuedSpinLockRaiseToSynch@8
@KfAcquireSpinLock@4
@KfLowerIrql@4
@KfRaiseIrql@4
@KfReleaseSpinLock@8
HalReleaseDisplayOwnership@0
HalAcquireDisplayOwnership@4
HalAdjustResourceList@4
HalAllProcessorsStarted@0
@@ -14,8 +31,7 @@ HalAllocateCommonBuffer@16
HalAllocateCrashDumpRegisters@8
HalAssignSlotResources@32
HalBeginSystemInterrupt@12
HalCalibratePerformanceCounter@4
;@HalClearSoftwareInterrupt@4
HalCalibratePerformanceCounter@12
HalDisableSystemInterrupt@8
HalDisplayString@4
HalEnableSystemInterrupt@12
@@ -37,57 +53,37 @@ HalQueryRealTimeClock@4
HalReadDmaCounter@4
HalReportResourceUsage@0
HalRequestIpi@4
@HalRequestSoftwareInterrupt@4
HalReturnToFirmware@4
HalSetBusData@20
HalSetBusDataByOffset@24
HalSetDisplayParameters@8
HalSetEnvironmentVariable@8
;HalSetProfileInterval@4
HalSetProfileInterval@4
HalSetRealTimeClock@4
;HalSetTimeIncrement@4
HalSetTimeIncrement@4
HalStartNextProcessor@8
;HalStartProfileInterrupt@4
;HalStopProfileInterrupt@4
@HalSystemVectorDispatchEntry@12
HalStartProfileInterrupt@4
HalStopProfileInterrupt@4
HalTranslateBusAddress@24
IoAssignDriveLetters@16
IoAssignDriveLetters@16=HalpAssignDriveLetters@16
IoFlushAdapterBuffers@24
IoFreeAdapterChannel@4
IoFreeMapRegisters@12
IoMapTransfer@24
KdComPortInUse DATA
KdPortGetByte@4
KdPortGetByteEx@8
KdPortInitialize@12
KdPortInitializeEx@12
KdPortPollByte@4
KdPortPollByteEx@8
KdPortPutByte@4
KdPortPutByteEx@8
KdPortRestore@0
KdPortSave@0
KdPortDisableInterrupts@0
KdPortEnableInterrupts@0
IoReadPartitionTable@16=HalpReadPartitionTable@16
IoSetPartitionInformation@16=HalpSetPartitionInformation@16
IoWritePartitionTable@20=HalpWritePartitionTable@20
KeAcquireSpinLock@8
@KeAcquireInStackQueuedSpinLock@8
@KeAcquireSpinLockRaiseToSynch@4
@KeAcquireQueuedSpinLock@4
KeGetCurrentIrql@0
KdComPortInUse=_KdComPortInUse
KeFlushWriteBuffer@0
KeGetCurrentIrql@0
KeLowerIrql@4
KeQueryPerformanceCounter@4
KeRaiseIrql@8
KeRaiseIrqlToDpcLevel@0
KeRaiseIrqlToSynchLevel@0
@KeReleaseInStackQueuedSpinLock@4
KeReleaseSpinLock@8
@KeReleaseQueuedSpinLock@8
KeStallExecutionProcessor@4
@KfAcquireSpinLock@4
@KfLowerIrql@4
@KfRaiseIrql@4
@KfReleaseSpinLock@8
READ_PORT_BUFFER_UCHAR@12
READ_PORT_BUFFER_ULONG@12
READ_PORT_BUFFER_USHORT@12
@@ -100,6 +96,3 @@ WRITE_PORT_BUFFER_USHORT@12
WRITE_PORT_UCHAR@8
WRITE_PORT_ULONG@8
WRITE_PORT_USHORT@8
HalReleaseDisplayOwnership@0
HalQueryDisplayOwnership@0

View File

@@ -1,19 +1,12 @@
/* $Id: bus.c 23907 2006-09-04 05:52:23Z arty $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/hal/x86/bus.c
* PURPOSE: Bus functions
* PROGRAMMER: David Welch (welch@mcmail.com)
* UPDATE HISTORY:
* Created 22/05/98
*
*
* TODO:
* - Add bus handler functions for all busses
/*
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/generic/bus.c
* PURPOSE: Bus Support Routines
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES *****************************************************************/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
@@ -21,509 +14,343 @@
/* GLOBALS *******************************************************************/
#define TAG_BUS TAG('B', 'U', 'S', 'H')
KSPIN_LOCK HalpBusHandlerSpinLock = {0,};
LIST_ENTRY HalpBusHandlerList;
/* FUNCTIONS *****************************************************************/
static NTSTATUS STDCALL
HalpNoAdjustResourceList(PBUS_HANDLER BusHandler,
ULONG BusNumber,
PCM_RESOURCE_LIST Resources)
{
return STATUS_UNSUCCESSFUL;
}
static NTSTATUS STDCALL
HalpNoAssignSlotResources(PBUS_HANDLER BusHandler,
ULONG BusNumber,
PUNICODE_STRING RegistryPath,
PUNICODE_STRING DriverClassName,
PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT DeviceObject,
ULONG SlotNumber,
PCM_RESOURCE_LIST *AllocatedResources)
{
return STATUS_NOT_SUPPORTED;
}
static ULONG STDCALL
HalpNoBusData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length)
{
return 0;
}
static ULONG STDCALL
HalpNoGetInterruptVector(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG BusInterruptLevel,
ULONG BusInterruptVector,
PKIRQL Irql,
PKAFFINITY Affinity)
{
return 0;
}
static ULONG STDCALL
HalpNoTranslateBusAddress(PBUS_HANDLER BusHandler,
ULONG BusNumber,
PHYSICAL_ADDRESS BusAddress,
PULONG AddressSpace,
PPHYSICAL_ADDRESS TranslatedAddress)
{
return 0;
}
PBUS_HANDLER
HalpAllocateBusHandler(INTERFACE_TYPE InterfaceType,
BUS_DATA_TYPE BusDataType,
ULONG BusNumber)
{
PBUS_HANDLER BusHandler = NULL;
DPRINT("HalpAllocateBusHandler()\n");
BusHandler = ExAllocatePoolWithTag(NonPagedPool,
sizeof(BUS_HANDLER),
TAG_BUS);
if (BusHandler == NULL)
return NULL;
RtlZeroMemory(BusHandler,
sizeof(BUS_HANDLER));
InsertTailList(&HalpBusHandlerList,
&BusHandler->Entry);
BusHandler->InterfaceType = InterfaceType;
BusHandler->BusDataType = BusDataType;
BusHandler->BusNumber = BusNumber;
/* initialize default bus handler functions */
BusHandler->GetBusData = HalpNoBusData;
BusHandler->SetBusData = HalpNoBusData;
BusHandler->AdjustResourceList = HalpNoAdjustResourceList;
BusHandler->AssignSlotResources = HalpNoAssignSlotResources;
BusHandler->GetInterruptVector = HalpNoGetInterruptVector;
BusHandler->TranslateBusAddress = HalpNoTranslateBusAddress;
/* any more ?? */
DPRINT("HalpAllocateBusHandler() done\n");
return BusHandler;
}
ULONG HalpBusType;
/* PRIVATE FUNCTIONS *********************************************************/
VOID
HalpInitBusHandlers(VOID)
NTAPI
HalpRegisterKdSupportFunctions(VOID)
{
PBUS_HANDLER BusHandler;
/* Register PCI Device Functions */
KdSetupPciDeviceForDebugging = HalpSetupPciDeviceForDebugging;
KdReleasePciDeviceforDebugging = HalpReleasePciDeviceForDebugging;
/* General preparations */
KeInitializeSpinLock(&HalpBusHandlerSpinLock);
InitializeListHead(&HalpBusHandlerList);
/* Register memory functions */
KdMapPhysicalMemory64 = HalpMapPhysicalMemory64;
KdUnmapVirtualAddress = HalpUnmapVirtualAddress;
/* Initialize hal dispatch tables */
#if 0
HalQuerySystemInformation = HalpQuerySystemInformation;
HalSetSystemInformation = HalpSetSystemInformation;
HalQueryBusSlots = HalpQueryBusSlots;
#endif
/* Add system bus handler */
BusHandler = HalpAllocateBusHandler(Internal,
ConfigurationSpaceUndefined,
0);
if (BusHandler == NULL)
return;
BusHandler->GetInterruptVector =
(pGetInterruptVector)HalpGetSystemInterruptVector;
BusHandler->TranslateBusAddress =
(pTranslateBusAddress)HalpTranslateSystemBusAddress;
/* Add cmos bus handler */
BusHandler = HalpAllocateBusHandler(InterfaceTypeUndefined,
Cmos,
0);
if (BusHandler == NULL)
return;
BusHandler->GetBusData = (pGetSetBusData)HalpGetCmosData;
BusHandler->SetBusData = (pGetSetBusData)HalpSetCmosData;
/* Add isa bus handler */
BusHandler = HalpAllocateBusHandler(Isa,
ConfigurationSpaceUndefined,
0);
if (BusHandler == NULL)
return;
BusHandler->GetInterruptVector =
(pGetInterruptVector)HalpGetIsaInterruptVector;
BusHandler->TranslateBusAddress =
(pTranslateBusAddress)HalpTranslateIsaBusAddress;
/* Add MicroChannel bus handler */
BusHandler = HalpAllocateBusHandler(MicroChannel,
Pos,
0);
if (BusHandler == NULL)
return;
BusHandler->GetBusData = (pGetSetBusData)HalpGetMicroChannelData;
/* Register ACPI stub */
KdCheckPowerButton = HalpCheckPowerButton;
}
PBUS_HANDLER FASTCALL
HaliHandlerForBus(INTERFACE_TYPE InterfaceType,
ULONG BusNumber)
NTSTATUS
NTAPI
HalpAssignSlotResources(IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject,
IN INTERFACE_TYPE BusType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN OUT PCM_RESOURCE_LIST *AllocatedResources)
{
PBUS_HANDLER BusHandler;
PLIST_ENTRY CurrentEntry;
KIRQL OldIrql;
BUS_HANDLER BusHandler;
PAGED_CODE();
KeAcquireSpinLock(&HalpBusHandlerSpinLock,
&OldIrql);
/* Only PCI is supported */
if (BusType != PCIBus) return STATUS_NOT_IMPLEMENTED;
CurrentEntry = HalpBusHandlerList.Flink;
while (CurrentEntry != &HalpBusHandlerList)
{
BusHandler = (PBUS_HANDLER)CurrentEntry;
if (BusHandler->InterfaceType == InterfaceType &&
BusHandler->BusNumber == BusNumber)
{
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
return BusHandler;
}
CurrentEntry = CurrentEntry->Flink;
}
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
/* Setup fake PCI Bus handler */
RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
BusHandler.BusNumber = BusNumber;
return NULL;
}
PBUS_HANDLER FASTCALL
HaliHandlerForConfigSpace(BUS_DATA_TYPE BusDataType,
ULONG BusNumber)
{
PBUS_HANDLER BusHandler;
PLIST_ENTRY CurrentEntry;
KIRQL OldIrql;
KeAcquireSpinLock(&HalpBusHandlerSpinLock,
&OldIrql);
CurrentEntry = HalpBusHandlerList.Flink;
while (CurrentEntry != &HalpBusHandlerList)
{
BusHandler = (PBUS_HANDLER)CurrentEntry;
if (BusHandler->BusDataType == BusDataType &&
BusHandler->BusNumber == BusNumber)
{
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
return BusHandler;
}
CurrentEntry = CurrentEntry->Flink;
}
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
return NULL;
}
PBUS_HANDLER FASTCALL
HaliReferenceHandlerForBus(INTERFACE_TYPE InterfaceType,
ULONG BusNumber)
{
PBUS_HANDLER BusHandler;
PLIST_ENTRY CurrentEntry;
KIRQL OldIrql;
KeAcquireSpinLock(&HalpBusHandlerSpinLock,
&OldIrql);
CurrentEntry = HalpBusHandlerList.Flink;
while (CurrentEntry != &HalpBusHandlerList)
{
BusHandler = (PBUS_HANDLER)CurrentEntry;
if (BusHandler->InterfaceType == InterfaceType &&
BusHandler->BusNumber == BusNumber)
{
BusHandler->RefCount++;
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
return BusHandler;
}
CurrentEntry = CurrentEntry->Flink;
}
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
return NULL;
}
PBUS_HANDLER FASTCALL
HaliReferenceHandlerForConfigSpace(BUS_DATA_TYPE BusDataType,
ULONG BusNumber)
{
PBUS_HANDLER BusHandler;
PLIST_ENTRY CurrentEntry;
KIRQL OldIrql;
KeAcquireSpinLock(&HalpBusHandlerSpinLock,
&OldIrql);
CurrentEntry = HalpBusHandlerList.Flink;
while (CurrentEntry != &HalpBusHandlerList)
{
BusHandler = (PBUS_HANDLER)CurrentEntry;
if (BusHandler->BusDataType == BusDataType &&
BusHandler->BusNumber == BusNumber)
{
BusHandler->RefCount++;
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
return BusHandler;
}
CurrentEntry = CurrentEntry->Flink;
}
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
return NULL;
}
VOID FASTCALL
HaliDereferenceBusHandler(PBUS_HANDLER BusHandler)
{
KIRQL OldIrql;
KeAcquireSpinLock(&HalpBusHandlerSpinLock,
&OldIrql);
BusHandler->RefCount--;
KeReleaseSpinLock(&HalpBusHandlerSpinLock,
OldIrql);
}
NTSTATUS STDCALL
HalAdjustResourceList(PCM_RESOURCE_LIST Resources)
{
PBUS_HANDLER BusHandler;
NTSTATUS Status;
BusHandler = HaliReferenceHandlerForBus(Resources->List[0].InterfaceType,
Resources->List[0].BusNumber);
if (BusHandler == NULL)
return STATUS_SUCCESS;
Status = BusHandler->AdjustResourceList(BusHandler,
Resources->List[0].BusNumber,
Resources);
HaliDereferenceBusHandler (BusHandler);
return Status;
}
NTSTATUS STDCALL
HalAssignSlotResources(PUNICODE_STRING RegistryPath,
PUNICODE_STRING DriverClassName,
PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT DeviceObject,
INTERFACE_TYPE BusType,
ULONG BusNumber,
ULONG SlotNumber,
PCM_RESOURCE_LIST *AllocatedResources)
{
PBUS_HANDLER BusHandler;
NTSTATUS Status;
BusHandler = HaliReferenceHandlerForBus(BusType,
BusNumber);
if (BusHandler == NULL)
return STATUS_NOT_FOUND;
Status = BusHandler->AssignSlotResources(BusHandler,
BusNumber,
/* Call the PCI function */
return HalpAssignPCISlotResources(&BusHandler,
&BusHandler,
RegistryPath,
DriverClassName,
DriverObject,
DeviceObject,
SlotNumber,
AllocatedResources);
HaliDereferenceBusHandler(BusHandler);
return Status;
}
ULONG STDCALL
HalGetBusData(BUS_DATA_TYPE BusDataType,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Length)
BOOLEAN
NTAPI
HalpTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress)
{
return (HalGetBusDataByOffset(BusDataType,
/* Translation is easy */
TranslatedAddress->QuadPart = BusAddress.QuadPart;
return TRUE;
}
ULONG
NTAPI
HalpGetSystemInterruptVector(IN ULONG BusNumber,
IN ULONG BusInterruptLevel,
IN ULONG BusInterruptVector,
OUT PKIRQL Irql,
OUT PKAFFINITY Affinity)
{
ULONG Vector = IRQ2VECTOR(BusInterruptLevel);
*Irql = (KIRQL)VECTOR2IRQL(Vector);
*Affinity = 0xFFFFFFFF;
return Vector;
}
BOOLEAN
NTAPI
HalpFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress,
IN OUT PULONG_PTR Context,
IN BOOLEAN NextBus)
{
/* Make sure we have a context */
if (!Context) return FALSE;
/* If we have data in the context, then this shouldn't be a new lookup */
if ((*Context) && (NextBus == TRUE)) return FALSE;
/* Return bus data */
TranslatedAddress->QuadPart = BusAddress.QuadPart;
/* Set context value and return success */
*Context = 1;
return TRUE;
}
VOID
NTAPI
HalpInitNonBusHandler(VOID)
{
/* These should be written by the PCI driver later, but we give defaults */
HalPciTranslateBusAddress = HalpTranslateBusAddress;
HalPciAssignSlotResources = HalpAssignSlotResources;
HalFindBusAddressTranslation = HalpFindBusAddressTranslation;
}
/* PUBLIC FUNCTIONS **********************************************************/
/*
* @implemented
*/
NTSTATUS
NTAPI
HalAdjustResourceList(IN PCM_RESOURCE_LIST Resources)
{
/* Deprecated, return success */
return STATUS_SUCCESS;
}
/*
* @implemented
*/
NTSTATUS
NTAPI
HalAssignSlotResources(IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject,
IN INTERFACE_TYPE BusType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN OUT PCM_RESOURCE_LIST *AllocatedResources)
{
/* Check the bus type */
if (BusType != PCIBus)
{
/* Call our internal handler */
return HalpAssignSlotResources(RegistryPath,
DriverClassName,
DriverObject,
DeviceObject,
BusType,
BusNumber,
SlotNumber,
AllocatedResources);
}
else
{
/* Call the PCI registered function */
return HalPciAssignSlotResources(RegistryPath,
DriverClassName,
DriverObject,
DeviceObject,
PCIBus,
BusNumber,
SlotNumber,
AllocatedResources);
}
}
/*
* @implemented
*/
ULONG
NTAPI
HalGetBusData(IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length)
{
/* Call the extended function */
return HalGetBusDataByOffset(BusDataType,
BusNumber,
SlotNumber,
Buffer,
0,
Length));
Length);
}
ULONG STDCALL
HalGetBusDataByOffset(BUS_DATA_TYPE BusDataType,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length)
/*
* @implemented
*/
ULONG
NTAPI
HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length)
{
PBUS_HANDLER BusHandler;
ULONG Result;
BUS_HANDLER BusHandler;
BusHandler = HaliReferenceHandlerForConfigSpace(BusDataType,
BusNumber);
if (BusHandler == NULL)
return 0;
/* Look as the bus type */
if (BusDataType == Cmos)
{
/* Call CMOS Function */
return HalpGetCmosData(0, SlotNumber, Buffer, Length);
}
else if (BusDataType == EisaConfiguration)
{
/* FIXME: TODO */
KEBUGCHECK(0);
}
else if ((BusDataType == PCIConfiguration) &&
(HalpPCIConfigInitialized) &&
((BusNumber >= HalpMinPciBus) && (BusNumber <= HalpMaxPciBus)))
{
/* Setup fake PCI Bus handler */
RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
BusHandler.BusNumber = BusNumber;
Result = BusHandler->GetBusData(BusHandler,
BusNumber,
SlotNumber,
/* Call PCI function */
return HalpGetPCIData(&BusHandler,
&BusHandler,
*(PPCI_SLOT_NUMBER)&SlotNumber,
Buffer,
Offset,
Length);
HaliDereferenceBusHandler (BusHandler);
return Result;
}
ULONG STDCALL
HalGetInterruptVector(INTERFACE_TYPE InterfaceType,
ULONG BusNumber,
ULONG BusInterruptLevel,
ULONG BusInterruptVector,
PKIRQL Irql,
PKAFFINITY Affinity)
{
PBUS_HANDLER BusHandler;
ULONG Result;
BusHandler = HaliReferenceHandlerForBus(InterfaceType,
BusNumber);
if (BusHandler == NULL)
/* Invalid bus */
return 0;
}
Result = BusHandler->GetInterruptVector(BusHandler,
BusNumber,
/*
* @implemented
*/
ULONG
NTAPI
HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
IN ULONG BusInterruptLevel,
IN ULONG BusInterruptVector,
OUT PKIRQL Irql,
OUT PKAFFINITY Affinity)
{
/* Call the system bus translator */
return HalpGetSystemInterruptVector(BusNumber,
BusInterruptLevel,
BusInterruptVector,
Irql,
Affinity);
HaliDereferenceBusHandler(BusHandler);
return Result;
}
ULONG STDCALL
HalSetBusData(BUS_DATA_TYPE BusDataType,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Length)
/*
* @implemented
*/
ULONG
NTAPI
HalSetBusData(IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length)
{
return (HalSetBusDataByOffset(BusDataType,
/* Call the extended function */
return HalSetBusDataByOffset(BusDataType,
BusNumber,
SlotNumber,
Buffer,
0,
Length));
Length);
}
ULONG STDCALL
HalSetBusDataByOffset(BUS_DATA_TYPE BusDataType,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length)
/*
* @implemented
*/
ULONG
NTAPI
HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length)
{
PBUS_HANDLER BusHandler;
ULONG Result;
BUS_HANDLER BusHandler;
BusHandler = HaliReferenceHandlerForConfigSpace(BusDataType,
BusNumber);
if (BusHandler == NULL)
return 0;
/* Look as the bus type */
if (BusDataType == Cmos)
{
/* Call CMOS Function */
return HalpSetCmosData(0, SlotNumber, Buffer, Length);
}
else if ((BusDataType == PCIConfiguration) && (HalpPCIConfigInitialized))
{
/* Setup fake PCI Bus handler */
RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
BusHandler.BusNumber = BusNumber;
Result = BusHandler->SetBusData(BusHandler,
BusNumber,
SlotNumber,
/* Call PCI function */
return HalpSetPCIData(&BusHandler,
&BusHandler,
*(PPCI_SLOT_NUMBER)&SlotNumber,
Buffer,
Offset,
Length);
HaliDereferenceBusHandler(BusHandler);
return Result;
}
/* Invalid bus */
return 0;
}
BOOLEAN STDCALL
HalTranslateBusAddress(INTERFACE_TYPE InterfaceType,
ULONG BusNumber,
PHYSICAL_ADDRESS BusAddress,
PULONG AddressSpace,
PPHYSICAL_ADDRESS TranslatedAddress)
/*
* @implemented
*/
BOOLEAN
NTAPI
HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress)
{
PBUS_HANDLER BusHandler;
BOOLEAN Result;
BusHandler = HaliReferenceHandlerForBus(InterfaceType,
BusNumber);
if (BusHandler == NULL)
return FALSE;
Result = (BOOLEAN)BusHandler->TranslateBusAddress(BusHandler,
/* Look as the bus type */
if (InterfaceType == PCIBus)
{
/* Call the PCI registered function */
return HalPciTranslateBusAddress(PCIBus,
BusNumber,
BusAddress,
AddressSpace,
TranslatedAddress);
HaliDereferenceBusHandler(BusHandler);
return Result;
}
else
{
/* Translation is easy */
TranslatedAddress->QuadPart = BusAddress.QuadPart;
return TRUE;
}
}
/* EOF */

View File

@@ -0,0 +1,291 @@
/*
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/generic/cmos.c
* PURPOSE: CMOS Access Routines (Real Time Clock and LastKnownGood)
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
* Eric Kohl (ekohl@abo.rhein-zeitung.de)
*/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS *******************************************************************/
KSPIN_LOCK HalpSystemHardwareLock;
/* PRIVATE FUNCTIONS *********************************************************/
UCHAR
FORCEINLINE
HalpReadCmos(IN UCHAR Reg)
{
/* Select the register */
WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, Reg);
/* Query the value */
return READ_PORT_UCHAR(CMOS_DATA_PORT);
}
VOID
FORCEINLINE
HalpWriteCmos(IN UCHAR Reg,
IN UCHAR Value)
{
/* Select the register */
WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, Reg);
/* Write the value */
WRITE_PORT_UCHAR(CMOS_DATA_PORT, Value);
}
ULONG
NTAPI
HalpGetCmosData(IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length)
{
PUCHAR Ptr = (PUCHAR)Buffer;
ULONG Address = SlotNumber;
ULONG Len = Length;
/* FIXME: Acquire CMOS Lock */
/* Do nothing if we don't have a length */
if (!Length) return 0;
/* Check if this is simple CMOS */
if (!BusNumber)
{
/* Loop the buffer up to 0xFF */
while ((Len > 0) && (Address < 0x100))
{
/* Read the data */
*Ptr = HalpReadCmos((UCHAR)Address);
/* Update position and length */
Ptr++;
Address++;
Len--;
}
}
else if (BusNumber == 1)
{
/* Loop the buffer up to 0xFFFF */
while ((Len > 0) && (Address < 0x10000))
{
/* Write the data */
*Ptr = HalpReadCmos((UCHAR)Address);
/* Update position and length */
Ptr++;
Address++;
Len--;
}
}
/* FIXME: Release the CMOS Lock */
/* Return length read */
return Length - Len;
}
ULONG
NTAPI
HalpSetCmosData(IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length)
{
PUCHAR Ptr = (PUCHAR)Buffer;
ULONG Address = SlotNumber;
ULONG Len = Length;
/* FIXME: Acquire CMOS Lock */
/* Do nothing if we don't have a length */
if (!Length) return 0;
/* Check if this is simple CMOS */
if (!BusNumber)
{
/* Loop the buffer up to 0xFF */
while ((Len > 0) && (Address < 0x100))
{
/* Write the data */
HalpWriteCmos((UCHAR)Address, *Ptr);
/* Update position and length */
Ptr++;
Address++;
Len--;
}
}
else if (BusNumber == 1)
{
/* Loop the buffer up to 0xFFFF */
while ((Len > 0) && (Address < 0x10000))
{
/* Write the data */
HalpWriteCmos((UCHAR)Address, *Ptr);
/* Update position and length */
Ptr++;
Address++;
Len--;
}
}
/* FIXME: Release the CMOS Lock */
/* Return length read */
return Length - Len;
}
/* PUBLIC FUNCTIONS **********************************************************/
/*
* @implemented
*/
ARC_STATUS
NTAPI
HalGetEnvironmentVariable(IN PCH Name,
IN USHORT ValueLength,
IN PCH Value)
{
UCHAR Val;
/* Only variable supported on x86 */
if (_stricmp(Name, "LastKnownGood")) return ENOENT;
/* FIXME: Acquire CMOS Lock */
/* Query the current value */
Val = HalpReadCmos(RTC_REGISTER_B) & 0x01;
/* FIXME: Release CMOS lock */
/* Check the flag */
if (Val)
{
/* Return false */
strncpy(Value, "FALSE", ValueLength);
}
else
{
/* Return true */
strncpy(Value, "TRUE", ValueLength);
}
/* Return success */
return ESUCCESS;
}
/*
* @implemented
*/
ARC_STATUS
NTAPI
HalSetEnvironmentVariable(IN PCH Name,
IN PCH Value)
{
UCHAR Val;
/* Only variable supported on x86 */
if (_stricmp(Name, "LastKnownGood")) return ENOMEM;
/* Check if this is true or false */
if (!_stricmp(Value, "TRUE"))
{
/* It's true, acquire CMOS lock (FIXME) */
/* Read the current value and add the flag */
Val = HalpReadCmos(RTC_REGISTER_B) | 1;
}
else if (!_stricmp(Value, "FALSE"))
{
/* It's false, acquire CMOS lock (FIXME) */
/* Read the current value and mask out the flag */
Val = HalpReadCmos(RTC_REGISTER_B) & ~1;
}
else
{
/* Fail */
return ENOMEM;
}
/* Write new value */
HalpWriteCmos(RTC_REGISTER_B, Val);
/* Release the lock and return success */
return ESUCCESS;
}
/*
* @implemented
*/
BOOLEAN
NTAPI
HalQueryRealTimeClock(OUT PTIME_FIELDS Time)
{
/* FIXME: Acquire CMOS Lock */
/* Loop while update is in progress */
while ((HalpReadCmos(RTC_REGISTER_A)) & RTC_REG_A_UIP);
/* Set the time data */
Time->Second = BCD_INT(HalpReadCmos(0));
Time->Minute = BCD_INT(HalpReadCmos(2));
Time->Hour = BCD_INT(HalpReadCmos(4));
Time->Weekday = BCD_INT(HalpReadCmos(6));
Time->Day = BCD_INT(HalpReadCmos(7));
Time->Month = BCD_INT(HalpReadCmos(8));
Time->Year = BCD_INT(HalpReadCmos(9));
Time->Milliseconds = 0;
/* FIXME: Check century byte */
/* Compensate for the century field */
Time->Year += (Time->Year > 80) ? 1900: 2000;
/* FIXME: Release CMOS Lock */
/* Always return TRUE */
return TRUE;
}
/*
* @implemented
*/
BOOLEAN
NTAPI
HalSetRealTimeClock(IN PTIME_FIELDS Time)
{
/* FIXME: Acquire CMOS Lock */
/* Loop while update is in progress */
while ((HalpReadCmos(RTC_REGISTER_A)) & RTC_REG_A_UIP);
/* Write time fields to CMOS RTC */
HalpWriteCmos(0, INT_BCD(Time->Second));
HalpWriteCmos(2, INT_BCD(Time->Minute));
HalpWriteCmos(4, INT_BCD(Time->Hour));
HalpWriteCmos(6, INT_BCD(Time->Weekday));
HalpWriteCmos(7, INT_BCD(Time->Day));
HalpWriteCmos(8, INT_BCD(Time->Month));
HalpWriteCmos(9, INT_BCD(Time->Year % 100));
/* FIXME: Set the century byte */
/* FIXME: Release the CMOS Lock */
/* Always return TRUE */
return TRUE;
}
/* EOF */

View File

@@ -122,6 +122,7 @@
*/
#include <hal.h>
#include <rosldr.h>
#include <ppcboot.h>
#include <ppcdebug.h>
@@ -129,7 +130,6 @@
#include <debug.h>
boot_infos_t PpcEarlybootInfo;
BOOLEAN PPCGetEEBit();
#define SCREEN_SYNCHRONIZATION
@@ -196,6 +196,8 @@ HalScrollDisplay (VOID)
VOID STATIC FASTCALL
HalPutCharacter (CHAR Character)
{
WRITE_PORT_UCHAR((PVOID)0x3f8, Character);
#if 0
int i,j,k;
ULONG Dest =
(GraphVideoBuffer +
@@ -213,6 +215,7 @@ HalPutCharacter (CHAR Character)
}
Dest += PpcEarlybootInfo.dispDeviceRowBytes;
}
#endif
}
/* PRIVATE FUNCTIONS ********************************************************/
@@ -291,7 +294,7 @@ HalDisplayString(IN PCH String)
PCH pch;
//static KSPIN_LOCK Lock;
KIRQL OldIrql;
BOOLEAN InterruptsEnabled = PPCGetEEBit();
BOOLEAN InterruptsEnabled = __readmsr();
/* See comment at top of file */
if (! HalOwnsDisplay || ! DisplayInitialized)
@@ -341,8 +344,7 @@ HalDisplayString(IN PCH String)
pch++;
}
if(InterruptsEnabled)
_enable();
__writemsr(InterruptsEnabled);
//KiReleaseSpinLock(&Lock);
KfLowerIrql(OldIrql);

View File

@@ -1,4 +1,4 @@
/* $Id: dma.c 23907 2006-09-04 05:52:23Z arty $
/* $Id: dma.c 24759 2006-11-14 20:59:48Z ion $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@@ -440,7 +440,7 @@ HalpDmaAllocateChildAdapter(
ZwClose(Handle);
AdapterObject->DmaHeader.Version = DeviceDescription->Version;
AdapterObject->DmaHeader.Version = (USHORT)DeviceDescription->Version;
AdapterObject->DmaHeader.Size = sizeof(ADAPTER_OBJECT);
AdapterObject->DmaHeader.DmaOperations = &HalpDmaOperations;
AdapterObject->MapRegistersPerChannel = 1;
@@ -476,7 +476,7 @@ HalpDmaInitializeEisaAdapter(
AdapterBaseVa = (PVOID)FIELD_OFFSET(EISA_CONTROL, DmaController2);
AdapterObject->AdapterNumber = Controller;
AdapterObject->ChannelNumber = DeviceDescription->DmaChannel & 3;
AdapterObject->ChannelNumber = (UCHAR)(DeviceDescription->DmaChannel & 3);
AdapterObject->PagePort = (PUCHAR)HalpEisaPortPage[DeviceDescription->DmaChannel];
AdapterObject->Width16Bits = FALSE;
AdapterObject->AdapterBaseVa = AdapterBaseVa;
@@ -1565,6 +1565,9 @@ IoFlushAdapterBuffers(
{
BOOLEAN SlaveDma = FALSE;
PROS_MAP_REGISTER_ENTRY RealMapRegisterBase;
PHYSICAL_ADDRESS HighestAcceptableAddress;
PHYSICAL_ADDRESS PhysicalAddress;
PPFN_NUMBER MdlPagesPtr;
ASSERT_IRQL(DISPATCH_LEVEL);
@@ -1601,14 +1604,23 @@ IoFlushAdapterBuffers(
{
if (SlaveDma && !AdapterObject->IgnoreCount)
Length -= HalReadDmaCounter(AdapterObject);
}
HalpCopyBufferMap(Mdl, RealMapRegisterBase, CurrentVa, Length, FALSE);
}
}
else
{
/* FIXME: Unimplemented case */
ASSERT(FALSE);
MdlPagesPtr = MmGetMdlPfnArray(Mdl);
MdlPagesPtr += ((ULONG_PTR)CurrentVa - (ULONG_PTR)Mdl->StartVa) >> PAGE_SHIFT;
PhysicalAddress.QuadPart = *MdlPagesPtr << PAGE_SHIFT;
PhysicalAddress.QuadPart += BYTE_OFFSET(CurrentVa);
HighestAcceptableAddress = HalpGetAdapterMaximumPhysicalAddress(AdapterObject);
if (PhysicalAddress.QuadPart + Length >
HighestAcceptableAddress.QuadPart)
{
HalpCopyBufferMap(Mdl, RealMapRegisterBase, CurrentVa, Length, FALSE);
}
}
}
@@ -1793,11 +1805,12 @@ IoMapTransfer(
HighestAcceptableAddress.QuadPart)
{
UseMapRegisters = TRUE;
PhysicalAddress = RealMapRegisterBase->PhysicalAddress;
PhysicalAddress = RealMapRegisterBase[Counter].PhysicalAddress;
PhysicalAddress.QuadPart += ByteOffset;
if ((ULONG_PTR)MapRegisterBase & MAP_BASE_SW_SG)
{
RealMapRegisterBase->Counter = ~0;
Counter = 0;
}
}
}
@@ -1935,16 +1948,77 @@ IoMapTransfer(
*
* @implemented
*/
BOOLEAN STDCALL
HalFlushCommonBuffer(
ULONG Unknown1,
ULONG Unknown2,
ULONG Unknown3,
ULONG Unknown4,
ULONG Unknown5)
BOOLEAN
NTAPI
HalFlushCommonBuffer(IN PADAPTER_OBJECT AdapterObject,
IN ULONG Length,
IN PHYSICAL_ADDRESS LogicalAddress,
IN PVOID VirtualAddress)
{
/* Function always returns true */
return TRUE;
}
/*
* @implemented
*/
PVOID
NTAPI
HalAllocateCrashDumpRegisters(IN PADAPTER_OBJECT AdapterObject,
IN OUT PULONG NumberOfMapRegisters)
{
PADAPTER_OBJECT MasterAdapter = AdapterObject->MasterAdapter;
ULONG MapRegisterNumber;
/* Check if it needs map registers */
if (AdapterObject->NeedsMapRegisters)
{
/* Check if we have enough */
if (*NumberOfMapRegisters > AdapterObject->MapRegistersPerChannel)
{
/* We don't, fail */
AdapterObject->NumberOfMapRegisters = 0;
return NULL;
}
/* Try to find free map registers */
MapRegisterNumber = -1;
MapRegisterNumber = RtlFindClearBitsAndSet(MasterAdapter->MapRegisters,
*NumberOfMapRegisters,
0);
/* Check if nothing was found */
if (MapRegisterNumber == -1)
{
/* No free registers found, so use the base registers */
RtlSetBits(MasterAdapter->MapRegisters,
0,
*NumberOfMapRegisters);
MapRegisterNumber = 0;
}
/* Calculate the new base */
AdapterObject->MapRegisterBase =
(PROS_MAP_REGISTER_ENTRY)(MasterAdapter->MapRegisterBase +
MapRegisterNumber);
/* Check if scatter gather isn't supported */
if (!AdapterObject->ScatterGather)
{
/* Set the flag */
AdapterObject->MapRegisterBase =
(PROS_MAP_REGISTER_ENTRY)
((ULONG_PTR)AdapterObject->MapRegisterBase | MAP_BASE_SW_SG);
}
}
else
{
AdapterObject->MapRegisterBase = NULL;
AdapterObject->NumberOfMapRegisters = 0;
}
/* Return the base */
return AdapterObject->MapRegisterBase;
}
/* EOF */

View File

@@ -1,15 +1,12 @@
/* $Id: drive.c 23907 2006-09-04 05:52:23Z arty $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: hal/x86/drive.c
* PURPOSE: Drive letter assignment
* PROGRAMMER:
* UPDATE HISTORY:
* 2000-03-25
/*
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/generic/drive.c
* PURPOSE: I/O HAL Routines for Disk Access
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES *****************************************************************/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
@@ -17,17 +14,61 @@
/* FUNCTIONS *****************************************************************/
VOID STDCALL
IoAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
VOID
NTAPI
HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
IN PSTRING NtDeviceName,
OUT PUCHAR NtSystemPath,
OUT PSTRING NtSystemPathString)
{
/* FIXME FIXME FIXME FUCK SOMEONE FIXME*/
HalIoAssignDriveLetters(NULL,
/* Call the kernel */
IoAssignDriveLetters(LoaderBlock,
NtDeviceName,
NtSystemPath,
NtSystemPathString);
}
NTSTATUS
NTAPI
HalpReadPartitionTable(IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,
IN BOOLEAN ReturnRecognizedPartitions,
IN OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
{
/* Call the kernel */
return IoReadPartitionTable(DeviceObject,
SectorSize,
ReturnRecognizedPartitions,
PartitionBuffer);
}
NTSTATUS
NTAPI
HalpWritePartitionTable(IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,
IN ULONG SectorsPerTrack,
IN ULONG NumberOfHeads,
IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer)
{
/* Call the kernel */
return IoWritePartitionTable(DeviceObject,
SectorSize,
SectorsPerTrack,
NumberOfHeads,
PartitionBuffer);
}
NTSTATUS
NTAPI
HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,
IN ULONG PartitionNumber,
IN ULONG PartitionType)
{
/* Call the kernel */
return IoSetPartitionInformation(DeviceObject,
SectorSize,
PartitionNumber,
PartitionType);
}
/* EOF */

View File

@@ -22,7 +22,6 @@
#undef ExAcquireFastMutex
#undef ExReleaseFastMutex
#undef ExTryToAcquireFastMutex
/* FUNCTIONS *****************************************************************/
@@ -75,7 +74,7 @@ ExReleaseFastMutex(PFAST_MUTEX FastMutex)
BOOLEAN
FASTCALL
ExTryToAcquireFastMutex(PFAST_MUTEX FastMutex)
ExiTryToAcquireFastMutex(PFAST_MUTEX FastMutex)
{
KIRQL OldIrql;

View File

@@ -1,11 +1,13 @@
<module name="halppc_generic" type="objectlibrary">
<include base="hal_generic">../include</include>
<include base="halxbox">.</include>
<include base="ntoskrnl">include</include>
<define name="_DISABLE_TIDENTS" />
<define name="__USE_W32API" />
<define name="_NTHAL_" />
<file>beep.c</file>
<file>bus.c</file>
<file>cmos.c</file>
<file>display.c</file>
<file>dma.c</file>
<file>drive.c</file>
@@ -15,16 +17,14 @@
<file>halinit.c</file>
<file>irql.c</file>
<file>isa.c</file>
<file>kdbg.c</file>
<file>mca.c</file>
<file>misc.c</file>
<file>pci.c</file>
<file>portio.c</file>
<file>processor.c</file>
<file>profil.c</file>
<file>reboot.c</file>
<file>sysbus.c</file>
<file>spinlock.c</file>
<file>sysinfo.c</file>
<file>time.c</file>
<file>timer.c</file>
<pch>../include/hal.h</pch>
</module>

View File

@@ -1,69 +1,155 @@
/* $Id: halinit.c 23907 2006-09-04 05:52:23Z arty $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/hal/x86/halinit.c
* PURPOSE: Initalize the x86 hal
* PROGRAMMER: David Welch (welch@cwcom.net)
* UPDATE HISTORY:
* 11/06/98: Created
/*
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/generic/halinit.c
* PURPOSE: HAL Entrypoint and Initialization
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES *****************************************************************/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS *****************************************************************/
/* GLOBALS *******************************************************************/
PVOID HalpZeroPageMapping = NULL;
HALP_HOOKS HalpHooks;
BOOLEAN HalpPciLockSettings;
/* FUNCTIONS ***************************************************************/
/* PRIVATE FUNCTIONS *********************************************************/
NTSTATUS
STDCALL
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
VOID
NTAPI
HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
return STATUS_SUCCESS;
PCHAR CommandLine;
/* Make sure we have a loader block and command line */
if ((LoaderBlock) && (LoaderBlock->LoadOptions))
{
/* Read the command line */
CommandLine = LoaderBlock->LoadOptions;
/* Check if PCI is locked */
if (strstr(CommandLine, "PCILOCK")) HalpPciLockSettings = TRUE;
/* Check for initial breakpoint */
if (strstr(CommandLine, "BREAK")) DbgBreakPoint();
}
}
BOOLEAN STDCALL
HalInitSystem (ULONG BootPhase,
PLOADER_PARAMETER_BLOCK LoaderBlock)
/* FUNCTIONS *****************************************************************/
/*
* @implemented
*/
BOOLEAN
NTAPI
HalInitSystem(IN ULONG BootPhase,
IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
if (BootPhase == 0)
PKPRCB Prcb = KeGetCurrentPrcb();
/* Check the boot phase */
if (!BootPhase)
{
HalInitializeDisplay ((PROS_LOADER_PARAMETER_BLOCK)(LoaderBlock->u.PowerPC.BootInfo));
RtlZeroMemory(&HalpHooks, sizeof(HALP_HOOKS));
HalpInitPhase0((PROS_LOADER_PARAMETER_BLOCK)LoaderBlock);
/* Phase 0... save bus type */
HalpBusType = LoaderBlock->u.I386.MachineType & 0xFF;
/* Get command-line parameters */
HalpGetParameters(LoaderBlock);
/* Checked HAL requires checked kernel */
#if DBG
if (!(Prcb->BuildType & PRCB_BUILD_DEBUG))
{
/* No match, bugcheck */
KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0);
}
#else
/* Release build requires release HAL */
if (Prcb->BuildType & PRCB_BUILD_DEBUG)
{
/* No match, bugcheck */
KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0);
}
#endif
#ifdef CONFIG_SMP
/* SMP HAL requires SMP kernel */
if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR)
{
/* No match, bugcheck */
KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0);
}
#endif
/* Validate the PRCB */
if (Prcb->MajorVersion != PRCB_MAJOR_VERSION)
{
/* Validation failed, bugcheck */
KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0);
}
/* Initialize the PICs */
HalpInitPICs();
/* Force initial PIC state */
KfRaiseIrql(KeGetCurrentIrql());
/* Initialize the clock */
HalpInitializeClock();
/* Setup busy waiting */
//HalpCalibrateStallExecution();
/* Fill out the dispatch tables */
HalQuerySystemInformation = HaliQuerySystemInformation;
HalSetSystemInformation = HaliSetSystemInformation;
HalInitPnpDriver = NULL; // FIXME: TODO
HalGetDmaAdapter = HalpGetDmaAdapter;
HalGetInterruptTranslator = NULL; // FIXME: TODO
/* Initialize the hardware lock (CMOS) */
KeInitializeSpinLock(&HalpSystemHardwareLock);
}
else if (BootPhase == 1)
{
/* Initialize the clock interrupt */
//HalpInitPhase1();
/* Initialize the default HAL stubs for bus handling functions */
HalpInitNonBusHandler();
/* Initialize display and make the screen black */
HalpInitBusHandlers();
#if 0
/* Enable the clock interrupt */
((PKIPCR)KeGetPcr())->IDT[0x30].ExtendedOffset =
(USHORT)(((ULONG_PTR)HalpClockInterrupt >> 16) & 0xFFFF);
((PKIPCR)KeGetPcr())->IDT[0x30].Offset =
(USHORT)((ULONG_PTR)HalpClockInterrupt);
#endif
HalEnableSystemInterrupt(0x30, CLOCK2_LEVEL, Latched);
/* Initialize DMA. NT does this in Phase 0 */
HalpInitDma();
/* Enumerate the devices on the motherboard */
HalpStartEnumerator();
}
else if (BootPhase == 2)
{
PHYSICAL_ADDRESS Null = {{0}};
/* Go to blue screen */
HalClearDisplay (0x17); /* grey on blue */
HalpZeroPageMapping = MmMapIoSpace(Null, PAGE_SIZE, MmNonCached);
}
/* All done, return */
return TRUE;
}
/*
* @unimplemented
*/
VOID
NTAPI
HalReportResourceUsage(VOID)
{
/* Initialize PCI bus. */
HalpInitializePciBus();
/* FIXME: This is done in ReactOS MP HAL only*/
//HaliReconfigurePciInterrupts();
/* FIXME: Report HAL Usage to kernel */
}
/* EOF */

View File

@@ -24,8 +24,8 @@ typedef union
USHORT both;
struct
{
BYTE master;
BYTE slave;
UCHAR master;
UCHAR slave;
};
}
PIC_MASK;
@@ -55,9 +55,16 @@ static ULONG HalpPendingInterruptCount[NR_IRQS];
#define DIRQL_TO_IRQ(x) (PROFILE_LEVEL - x)
#define IRQ_TO_DIRQL(x) (PROFILE_LEVEL - x)
#ifdef _MSC_VER
#define KiInterruptDispatch2(x, y)
#else
VOID STDCALL
KiInterruptDispatch2 (ULONG Irq, KIRQL old_level);
BOOLEAN PPCGetEEBit();
#endif
/* FUNCTIONS ****************************************************************/
@@ -74,6 +81,25 @@ KIRQL STDCALL KeGetCurrentIrql (VOID)
VOID NTAPI HalpInitPICs(VOID)
{
memset(HalpPendingInterruptCount, 0, sizeof(HalpPendingInterruptCount));
/* Initialization sequence */
WRITE_PORT_UCHAR((PUCHAR)0x20, 0x11);
WRITE_PORT_UCHAR((PUCHAR)0xa0, 0x11);
/* Start of hardware irqs (0x24) */
WRITE_PORT_UCHAR((PUCHAR)0x21, IRQ_BASE);
WRITE_PORT_UCHAR((PUCHAR)0xa1, IRQ_BASE + 8);
/* 8259-1 is master */
WRITE_PORT_UCHAR((PUCHAR)0x21, 0x4);
/* 8259-2 is slave */
WRITE_PORT_UCHAR((PUCHAR)0xa1, 0x2);
/* 8086 mode */
WRITE_PORT_UCHAR((PUCHAR)0x21, 0x1);
WRITE_PORT_UCHAR((PUCHAR)0xa1, 0x1);
/* Enable interrupts */
WRITE_PORT_UCHAR((PUCHAR)0x21, 0xFF);
WRITE_PORT_UCHAR((PUCHAR)0xa1, 0xFF);
/* We can now enable interrupts */
_enable();
}
@@ -82,7 +108,6 @@ VOID HalpEndSystemInterrupt(KIRQL Irql)
* FUNCTION: Enable all irqs with higher priority.
*/
{
BOOLEAN InterruptsEnabled = PPCGetEEBit();
const USHORT mask[] =
{
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -98,16 +123,14 @@ VOID HalpEndSystemInterrupt(KIRQL Irql)
WRITE_PORT_UCHAR((PUCHAR)0x21, (UCHAR)(pic_mask.master|pic_mask_intr.master));
WRITE_PORT_UCHAR((PUCHAR)0xa1, (UCHAR)(pic_mask.slave|pic_mask_intr.slave));
/* restore flags */
if(InterruptsEnabled)
/* restore ints */
_enable();
}
VOID STATIC
VOID
HalpExecuteIrqs(KIRQL NewIrql)
{
ULONG IrqLimit, i;
IrqLimit = min(PROFILE_LEVEL - NewIrql, NR_IRQS);
/*
@@ -126,16 +149,16 @@ HalpExecuteIrqs(KIRQL NewIrql)
* For each deferred interrupt execute all the handlers at DIRQL.
*/
HalpPendingInterruptCount[i]--;
KiInterruptDispatch2(i + IRQ_BASE, NewIrql);
//HalpHardwareInt[i]();
}
KeGetPcr()->Irql--;
HalpEndSystemInterrupt(KeGetPcr()->Irql);
//KeGetPcr()->Irql--;
//HalpEndSystemInterrupt(KeGetPcr()->Irql);
}
}
}
VOID STATIC
VOID
HalpLowerIrql(KIRQL NewIrql)
{
if (NewIrql >= PROFILE_LEVEL)
@@ -281,7 +304,7 @@ KeRaiseIrqlToDpcLevel (VOID)
KIRQL STDCALL
KeRaiseIrqlToSynchLevel (VOID)
{
return KfRaiseIrql (CLOCK2_LEVEL);
return KfRaiseIrql (DISPATCH_LEVEL);
}
@@ -310,12 +333,13 @@ HalBeginSystemInterrupt (KIRQL Irql,
WRITE_PORT_UCHAR((PUCHAR)0x20,0x20);
WRITE_PORT_UCHAR((PUCHAR)0xa0,0x20);
}
#if 0
if (KeGetPcr()->Irql >= Irql)
{
HalpPendingInterruptCount[irq]++;
return(FALSE);
}
#endif
*OldIrql = KeGetPcr()->Irql;
KeGetPcr()->Irql = Irql;
@@ -404,4 +428,23 @@ HalRequestSoftwareInterrupt(
}
}
VOID FASTCALL
HalClearSoftwareInterrupt(
IN KIRQL Request)
{
switch (Request)
{
case APC_LEVEL:
((PKIPCR)KeGetPcr())->HalReserved[HAL_APC_REQUEST] = FALSE;
break;
case DISPATCH_LEVEL:
((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST] = FALSE;
break;
default:
KEBUGCHECK(0);
}
}
/* EOF */

View File

@@ -68,9 +68,9 @@
/* GLOBAL VARIABLES *********************************************************/
#define KdComPortInUse _KdComPortInUse
ULONG KdComPortInUse = 0;
/* STATIC VARIABLES *********************************************************/
static ULONG ComPort = 0;

View File

@@ -1,72 +1,105 @@
/* $Id: misc.c 23907 2006-09-04 05:52:23Z arty $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/hal/x86/misc.c
* PURPOSE: Miscellaneous hardware functions
* PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
/*
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/generic/misc.c
* PURPOSE: Miscellanous Routines
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
* Eric Kohl (ekohl@abo.rhein-zeitung.de)
*/
/* INCLUDES *****************************************************************/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
#include <debug.h>
/* PRIVATE FUNCTIONS *********************************************************/
/* FUNCTIONS ****************************************************************/
PVOID STDCALL
HalAllocateCrashDumpRegisters(IN PADAPTER_OBJECT AdapterObject,
IN OUT PULONG NumberOfMapRegisters)
{
UNIMPLEMENTED;
return NULL;
}
VOID STDCALL
HalHandleNMI(PVOID NmiInfo)
{
UCHAR ucStatus;
ucStatus = READ_PORT_UCHAR((PUCHAR) 0x61);
HalDisplayString ("\n*** Hardware Malfunction\n\n");
HalDisplayString ("Call your hardware vendor for support\n\n");
if (ucStatus & 0x80)
HalDisplayString ("NMI: Parity Check / Memory Parity Error\n");
if (ucStatus & 0x40)
HalDisplayString ("NMI: Channel Check / IOCHK\n");
HalDisplayString ("\n*** The system has halted ***\n");
KeEnterKernelDebugger ();
}
VOID STDCALL
HalProcessorIdle(VOID)
{
// XXX Learn to use PSL_POW for this.
}
ULONG FASTCALL
HalSystemVectorDispatchEntry (
ULONG Unknown1,
ULONG Unknown2,
ULONG Unknown3
)
{
return 0;
}
VOID STDCALL
KeFlushWriteBuffer(VOID)
VOID
NTAPI
HalpCheckPowerButton(VOID)
{
/* Nothing to do on non-ACPI */
return;
}
/* EOF */
PVOID
NTAPI
HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberPage)
{
/* Use kernel memory manager I/O map facilities */
return MmMapIoSpace(PhysicalAddress,
NumberPage << PAGE_SHIFT,
MmNonCached);
}
VOID
NTAPI
HalpUnmapVirtualAddress(IN PVOID VirtualAddress,
IN ULONG NumberPages)
{
/* Use kernel memory manager I/O map facilities */
MmUnmapIoSpace(VirtualAddress, NumberPages << PAGE_SHIFT);
}
/* FUNCTIONS *****************************************************************/
/*
* @implemented
*/
VOID
NTAPI
HalHandleNMI(IN PVOID NmiInfo)
{
UCHAR ucStatus;
/* Get the NMI Flag */
ucStatus = READ_PORT_UCHAR((PUCHAR)0x61);
/* Display NMI failure string */
HalDisplayString ("\n*** Hardware Malfunction\n\n");
HalDisplayString ("Call your hardware vendor for support\n\n");
/* Check for parity error */
if (ucStatus & 0x80)
{
/* Display message */
HalDisplayString ("NMI: Parity Check / Memory Parity Error\n");
}
/* Check for I/O failure */
if (ucStatus & 0x40)
{
/* Display message */
HalDisplayString ("NMI: Channel Check / IOCHK\n");
}
/* Halt the system */
HalDisplayString("\n*** The system has halted ***\n");
//KeEnterKernelDebugger();
}
/*
* @implemented
*/
BOOLEAN
FASTCALL
HalSystemVectorDispatchEntry(IN ULONG Vector,
OUT PKINTERRUPT_ROUTINE **FlatDispatch,
OUT PKINTERRUPT_ROUTINE *NoConnection)
{
/* Not implemented on x86 */
return FALSE;
}
/*
* @implemented
*/
VOID
NTAPI
KeFlushWriteBuffer(VOID)
{
/* Not implemented on x86 */
return;
}

File diff suppressed because it is too large Load Diff

View File

@@ -78,7 +78,6 @@ __asm__("\t.globl GetPhys\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,4\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"isync\n\t"
@@ -98,7 +97,6 @@ __asm__("\t.globl GetPhysWord\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,6\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"isync\n\t"
@@ -118,7 +116,6 @@ __asm__("\t.globl GetPhysByte\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,7\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"isync\n\t"
@@ -138,7 +135,6 @@ __asm__("\t.globl SetPhys\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,4\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"sync\n\t"
@@ -160,7 +156,6 @@ __asm__("\t.globl SetPhysWord\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,6\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"sync\n\t"
@@ -182,7 +177,6 @@ __asm__("\t.globl SetPhysByte\n"
"mflr 0\n\t"
"stwu 0,-16(1)\n\t"
"mfmsr 5\n\t"
"xori 3,3,7\n\t" /* Undo effects of LE without swapping */
"andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */
"mtmsr 6\n\t"
"sync\n\t"

View File

@@ -27,8 +27,6 @@ HalInitializeProcessor(ULONG ProcessorNumber,
PLOADER_PARAMETER_BLOCK LoaderBlock)
{
DPRINT("HalInitializeProcessor(%lu %p)\n", ProcessorNumber, LoaderBlock);
/* Do this a bit earlier for the purpose of getting gossip from the kernel */
HalInitializeDisplay ((PROS_LOADER_PARAMETER_BLOCK)(LoaderBlock->u.PowerPC.BootInfo));
KeGetPcr()->StallScaleFactor = INITIAL_STALL_COUNT;
}
@@ -40,13 +38,39 @@ HalAllProcessorsStarted (VOID)
return TRUE;
}
BOOLEAN STDCALL
HalStartNextProcessor(ULONG Unknown1,
ULONG ProcessorStack)
NTHALAPI
BOOLEAN
NTAPI
HalStartNextProcessor(
IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
IN PKPROCESSOR_STATE ProcessorState
)
{
DPRINT("HalStartNextProcessor(0x%lx 0x%lx)\n", Unknown1, ProcessorStack);
DPRINT("HalStartNextProcessor(0x%lx 0x%lx)\n", LoaderBlock, ProcessorState);
return TRUE;
}
/*
* @implemented
*/
VOID
NTAPI
HalProcessorIdle(VOID)
{
/* Enable interrupts and halt the processor */
_enable();
}
/*
* @implemented
*/
VOID
NTAPI
HalRequestIpi(ULONG Reserved)
{
/* Not implemented on NT */
__debugbreak();
}
/* EOF */

View File

@@ -0,0 +1,61 @@
/*
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/generic/profil.c
* PURPOSE: System Profiling
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
#include <debug.h>
/* FUNCTIONS *****************************************************************/
/*
* @unimplemented
*/
VOID
NTAPI
HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
{
KEBUGCHECK(0);
return;
}
/*
* @unimplemented
*/
VOID
NTAPI
HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
{
KEBUGCHECK(0);
return;
}
/*
* @unimplemented
*/
ULONG_PTR
NTAPI
HalSetProfileInterval(IN ULONG_PTR Interval)
{
KEBUGCHECK(0);
return Interval;
}
ULONG HalpDecrementerRoll = 0;
LARGE_INTEGER
KeQueryPerformanceCounter(PLARGE_INTEGER PerformanceFrequency)
{
LARGE_INTEGER Result;
/* for now */
if(PerformanceFrequency) PerformanceFrequency->QuadPart = 100000000;
Result.HighPart = HalpDecrementerRoll;
Result.LowPart = __rdtsc();
return Result;
}

View File

@@ -1,12 +1,12 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/hal/halx86/up/spinlock.c
* PURPOSE: Implements spinlocks
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/up/spinlock.c
* PURPOSE: Spinlock and Queued Spinlock Support
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES ****************************************************************/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
@@ -17,7 +17,7 @@
#undef KeLowerIrql
#undef KeRaiseIrql
/* FUNCTIONS ***************************************************************/
/* FUNCTIONS *****************************************************************/
/*
* @implemented
@@ -105,7 +105,7 @@ KfReleaseSpinLock(PKSPIN_LOCK SpinLock,
*/
KIRQL
FASTCALL
KeAcquireQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
{
/* Simply raise to dispatch */
return KfRaiseIrql(DISPATCH_LEVEL);
@@ -139,7 +139,19 @@ KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock,
*/
VOID
FASTCALL
KeReleaseQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle,
KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock,
IN PKLOCK_QUEUE_HANDLE LockHandle)
{
/* Simply raise to synch */
LockHandle->OldIrql = KfRaiseIrql(SYNCH_LEVEL);
}
/*
* @implemented
*/
VOID
FASTCALL
KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
IN KIRQL OldIrql)
{
/* Simply lower IRQL back */
@@ -162,7 +174,7 @@ KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
*/
BOOLEAN
FASTCALL
KeTryToAcquireQueuedSpinLockRaiseToSynch(IN PKLOCK_QUEUE_HANDLE LockHandle,
KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
IN PKIRQL OldIrql)
{
/* Simply raise to dispatch */
@@ -175,10 +187,10 @@ KeTryToAcquireQueuedSpinLockRaiseToSynch(IN PKLOCK_QUEUE_HANDLE LockHandle,
/*
* @implemented
*/
BOOLEAN
LOGICAL
FASTCALL
KeTryToAcquireQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle,
IN PKIRQL OldIrql)
KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
OUT PKIRQL OldIrql)
{
/* Simply raise to dispatch */
*OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
@@ -187,5 +199,4 @@ KeTryToAcquireQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle,
return TRUE;
}
/* EOF */

View File

@@ -1,74 +1,41 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/hal/x86/sysinfo.c
* PURPOSE: Getting system information
* PROGRAMMER: David Welch (welch@mcmail.com)
* UPDATE HISTORY:
* Created 22/05/98
* PROJECT: ReactOS HA:
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/generic/sysinfo.c
* PURPOSE: HAL Information Routines
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES *****************************************************************/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
#include <debug.h>
#define KdComPortInUse _KdComPortInUse
ULONG KdComPortInUse = 0;
/* FUNCTIONS *****************************************************************/
/* FUNCTIONS ****************************************************************/
NTSTATUS STDCALL
HalpQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass,
NTSTATUS
NTAPI
HaliQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN OUT PVOID Buffer,
OUT PULONG ReturnedLength)
{
ULONG DataLength;
NTSTATUS Status;
DPRINT1("HalpQuerySystemInformation() called\n");
*ReturnedLength = 0;
DataLength = 0;
switch(InformationClass)
{
#if 0
case HalInstalledBusInformation:
Status = HalpQueryBusInformation(BufferSize,
Buffer,
ReturnedLength);
break;
#endif
default:
DataLength = 0;
Status = STATUS_INVALID_LEVEL;
break;
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
if (DataLength != 0)
{
if (DataLength > BufferSize)
DataLength = BufferSize;
// RtlCopyMemory();
*ReturnedLength = DataLength;
}
return(Status);
}
#if 0
NTSTATUS
HalpSetSystemInformation(VOID)
NTAPI
HaliSetSystemInformation(IN HAL_SET_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN OUT PVOID Buffer)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
#endif
/* EOF */

View File

@@ -1,205 +1,146 @@
/*
* ReactOS kernel
* Copyright (C) 2000 David Welch <welch@cwcom.net>
* Copyright (C) 1999 Gareth Owen <gaz@athene.co.uk>, Ramon von Handel
* Copyright (C) 1991, 1992 Linus Torvalds
*
* This software 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 software 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 software; see the file COPYING. If not, write
* to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
* MA 02139, USA.
*
*/
/* $Id: timer.c 23907 2006-09-04 05:52:23Z arty $
*
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/hal/x86/udelay.c
* PURPOSE: Busy waiting
* PROGRAMMER: David Welch (david.welch@seh.ox.ac.uk)
* UPDATE HISTORY:
* 06/11/99 Created
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/generic/timer.c
* PURPOSE: HAL Timer Routines
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES ***************************************************************/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS ******************************************************************/
/* GLOBALS *******************************************************************/
#define TMR_CTRL 0x43 /* I/O for control */
#define TMR_CNT0 0x40 /* I/O for counter 0 */
#define TMR_CNT1 0x41 /* I/O for counter 1 */
#define TMR_CNT2 0x42 /* I/O for counter 2 */
BOOLEAN HalpClockSetMSRate;
ULONG HalpCurrentTimeIncrement;
ULONG HalpCurrentRollOver;
ULONG HalpNextMSRate = 14;
ULONG HalpLargestClockMS = 15;
#define TMR_SC0 0 /* Select channel 0 */
#define TMR_SC1 0x40 /* Select channel 1 */
#define TMR_SC2 0x80 /* Select channel 2 */
#define TMR_LOW 0x10 /* RW low byte only */
#define TMR_HIGH 0x20 /* RW high byte only */
#define TMR_BOTH 0x30 /* RW both bytes */
#define TMR_MD0 0 /* Mode 0 */
#define TMR_MD1 0x2 /* Mode 1 */
#define TMR_MD2 0x4 /* Mode 2 */
#define TMR_MD3 0x6 /* Mode 3 */
#define TMR_MD4 0x8 /* Mode 4 */
#define TMR_MD5 0xA /* Mode 5 */
#define TMR_BCD 1 /* BCD mode */
#define TMR_LATCH 0 /* Latch command */
#define TMR_READ 0xF0 /* Read command */
#define TMR_CNT 0x20 /* CNT bit (Active low, subtract it) */
#define TMR_STAT 0x10 /* Status bit (Active low, subtract it) */
#define TMR_CH2 0x8 /* Channel 2 bit */
#define TMR_CH1 0x4 /* Channel 1 bit */
#define TMR_CH0 0x2 /* Channel 0 bit */
#define MILLISEC 10 /* Number of millisec between interrupts */
#define HZ (1000 / MILLISEC) /* Number of interrupts per second */
#define CLOCK_TICK_RATE 1193182 /* Clock frequency of the timer chip */
#define LATCH (CLOCK_TICK_RATE / HZ) /* Count to program into the timer chip */
#define PRECISION 8 /* Number of bits to calibrate for delay loop */
static BOOLEAN UdelayCalibrated = FALSE;
/* FUNCTIONS **************************************************************/
BOOLEAN PPCGetEEBit()
LARGE_INTEGER HalpRolloverTable[15] =
{
ULONG Msr;
__asm__("mfmsr %0" : "=r" (Msr));
return (Msr & 0x8000) != 0;
{{1197, 10032}},
{{2394, 20064}},
{{3591, 30096}},
{{4767, 39952}},
{{5964, 49984}},
{{7161, 60016}},
{{8358, 70048}},
{{9555, 80080}},
{{10731, 89936}},
{{11949, 100144}},
{{13125, 110000}},
{{14322, 120032}},
{{15519, 130064}},
{{16695, 139920}},
{{17892, 149952}}
};
/* PRIVATE FUNCTIONS *********************************************************/
VOID
NTAPI
HalpInitializeClock(VOID)
{
PKPRCB Prcb = KeGetCurrentPrcb();
ULONG Increment;
USHORT RollOver;
ULONG Flags = 0;
/* Check the CPU Type */
if (Prcb->CpuType <= 4)
{
/* 486's or equal can't go higher then 10ms */
HalpLargestClockMS = 10;
HalpNextMSRate = 9;
}
/* Get increment and rollover for the largest time clock ms possible */
Increment= HalpRolloverTable[HalpLargestClockMS - 1].HighPart;
RollOver = (USHORT)HalpRolloverTable[HalpLargestClockMS - 1].LowPart;
/* Set the maximum and minimum increment with the kernel */
HalpCurrentTimeIncrement = Increment;
KeSetTimeIncrement(Increment, HalpRolloverTable[0].HighPart);
/* Disable interrupts */
Flags = __readmsr();
_disable();
/* Set the rollover */
__outbyte(TIMER_CONTROL_PORT, TIMER_SC0 | TIMER_BOTH | TIMER_MD2);
__outbyte(TIMER_DATA_PORT0, RollOver & 0xFF);
__outbyte(TIMER_DATA_PORT0, RollOver >> 8);
/* Restore interrupts if they were previously enabled */
__writemsr(Flags);
/* Save rollover and return */
HalpCurrentRollOver = RollOver;
}
/* PUBLIC FUNCTIONS ***********************************************************/
/*
* @implemented
*/
VOID
NTAPI
HalCalibratePerformanceCounter(IN volatile PLONG Count,
IN ULONGLONG NewCount)
{
ULONG Flags = 0;
/* Disable interrupts */
Flags = __readmsr();
_disable();
/* Do a decrement for this CPU */
_InterlockedDecrement(Count);
/* Wait for other CPUs */
while (*Count);
/* Restore interrupts if they were previously enabled */
__writemsr(Flags);
}
/*
* NOTE: This function MUST NOT be optimized by the compiler!
* If it is, it obviously will not delay AT ALL, and the system
* will appear completely frozen at boot since
* HalpCalibrateStallExecution will never return.
* There are three options to stop optimization:
* 1. Use a volatile automatic variable. Making it delay quite a bit
* due to memory accesses, and keeping the code portable. However,
* as this involves memory access it depends on both the CPU cache,
* e.g. if the stack used is already in a cache line or not, and
* whether or not we're MP. If MP, another CPU could (probably would)
* also access RAM at the same time - making the delay imprecise.
* 2. Use compiler-specific #pragma's to disable optimization.
* 3. Use inline assembly, making it equally unportable as #2.
* For supported compilers we use inline assembler. For the others,
* portable plain C.
* @implemented
*/
DECLSPEC_NOINLINE VOID STDCALL
__KeStallExecutionProcessor(ULONG Loops)
ULONG
NTAPI
HalSetTimeIncrement(IN ULONG Increment)
{
ULONG DecInit, DecCount;
if (!Loops)
{
return;
}
__asm__("mfdec %0" : "=r" (DecInit));
do {
__asm__("mfdec %0" : "=r" (DecCount));
} while((DecCount - DecInit) < Loops);
/* Round increment to ms */
Increment /= 10000;
/* Normalize between our minimum (1 ms) and maximum (variable) setting */
if (Increment > HalpLargestClockMS) Increment = HalpLargestClockMS;
if (Increment <= 0) Increment = 1;
/* Set the rate and tell HAL we want to change it */
HalpNextMSRate = Increment;
HalpClockSetMSRate = TRUE;
/* Return the increment */
return HalpRolloverTable[Increment - 1].HighPart;
}
VOID
STDCALL
KeStallExecutionProcessor(ULONG Microseconds)
NTHALAPI
KeStallExecutionProcessor(ULONG USec)
{
PKIPCR Pcr = (PKIPCR)KeGetPcr();
LARGE_INTEGER EndCount, CurrentCount;
ULONG NewCount;
__asm__("mfdec %0" : "=r" (NewCount));
EndCount.QuadPart = NewCount + Microseconds * (ULONGLONG)Pcr->Prcb->MHz;
do
{
__asm__("mfdec %0" : "=r" (NewCount));
if(NewCount < CurrentCount.LowPart)
CurrentCount.HighPart++;
CurrentCount.LowPart = NewCount;
}
while (CurrentCount.QuadPart < EndCount.QuadPart);
}
VOID HalpCalibrateStallExecution(VOID)
{
PKIPCR Pcr;
if (UdelayCalibrated)
{
return;
}
UdelayCalibrated = TRUE;
Pcr = (PKIPCR)KeGetPcr();
// XXX arty FIXME
/* Pcr->Prcb.MHz = (ULONG)(EndCount.QuadPart - StartCount.QuadPart) / 10000; */
Pcr->Prcb->MHz = 300;
DPRINT1("%luMHz\n", Pcr->Prcb->MHz);
}
VOID STDCALL
HalCalibratePerformanceCounter(ULONG Count)
{
BOOLEAN InterruptsEnabled = PPCGetEEBit();
/* save flags and disable interrupts */
_disable();
__KeStallExecutionProcessor(Count);
/* restore flags */
if(InterruptsEnabled)
_enable();
}
LARGE_INTEGER
STDCALL
KeQueryPerformanceCounter(PLARGE_INTEGER PerformanceFreq)
/*
* FUNCTION: Queries the finest grained running count available in the system
* ARGUMENTS:
* PerformanceFreq (OUT) = The routine stores the number of
* performance counter ticks per second here
* RETURNS: The number of performance counter ticks since boot
*/
{
PKIPCR Pcr;
LARGE_INTEGER Value;
BOOLEAN InterruptsEnabled = PPCGetEEBit();
_disable();
Pcr = (PKIPCR)KeGetPcr();
if (NULL != PerformanceFreq)
{
PerformanceFreq->QuadPart = Pcr->Prcb->MHz * (ULONGLONG)1000000;
}
__asm__("mfdec %0" : "=r" (Value.LowPart));
if(InterruptsEnabled)
_enable();
return Value;
LARGE_INTEGER Freq, Start = KeQueryPerformanceCounter(&Freq), End;
LARGE_INTEGER Timebase, Remainder;
Timebase.QuadPart = 1000000;
Freq.QuadPart *= USec;
End = RtlLargeIntegerDivide(Freq, Timebase, &Remainder);
End.QuadPart += Start.QuadPart;
while(End.QuadPart > __rdtsc());
}
/* EOF */

View File

@@ -1,133 +1,296 @@
/*
*/
#ifndef __INTERNAL_HAL_BUS_H
#define __INTERNAL_HAL_BUS_H
//
// Helper Macros
//
#define PASTE2(x,y) x ## y
#define POINTER_TO_(x) PASTE2(P,x)
#define READ_FROM(x) PASTE2(READ_PORT_, x)
#define WRITE_TO(x) PASTE2(WRITE_PORT_, x)
typedef NTSTATUS
(STDCALL *pAdjustResourceList)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN OUT PCM_RESOURCE_LIST Resources);
//
// Declares a PCI Register Read/Write Routine
//
#define TYPE_DEFINE(x, y) \
ULONG \
NTAPI \
x( \
IN PPCIPBUSDATA BusData, \
IN y PciCfg, \
IN PUCHAR Buffer, \
IN ULONG Offset \
)
#define TYPE1_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS);
#define TYPE2_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS);
typedef NTSTATUS
(STDCALL *pAssignSlotResources)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject,
IN ULONG SlotNumber,
IN OUT PCM_RESOURCE_LIST *AllocatedResources);
//
// Defines a PCI Register Read/Write Type 1 Routine Prologue and Epilogue
//
#define TYPE1_START(x, y) \
TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS) \
{ \
ULONG i = Offset % sizeof(ULONG); \
PciCfg->u.bits.RegisterNumber = Offset / sizeof(ULONG); \
WRITE_PORT_ULONG(BusData->Config.Type1.Address, PciCfg->u.AsULONG);
#define TYPE1_END(y) \
return sizeof(y); }
#define TYPE2_END TYPE1_END
typedef ULONG
(STDCALL *pGetSetBusData)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN ULONG SlotNumber,
OUT PVOID Buffer,
IN ULONG Offset,
IN ULONG Length);
//
// PCI Register Read Type 1 Routine
//
#define TYPE1_READ(x, y) \
TYPE1_START(x, y) \
*((POINTER_TO_(y))Buffer) = \
READ_FROM(y)((POINTER_TO_(y))(BusData->Config.Type1.Data + i)); \
TYPE1_END(y)
typedef ULONG
(STDCALL *pGetInterruptVector)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN ULONG BusInterruptLevel,
IN ULONG BusInterruptVector,
OUT PKIRQL Irql,
OUT PKAFFINITY Affinity);
//
// PCI Register Write Type 1 Routine
//
#define TYPE1_WRITE(x, y) \
TYPE1_START(x, y) \
WRITE_TO(y)((POINTER_TO_(y))(BusData->Config.Type1.Data + i), \
*((POINTER_TO_(y))Buffer)); \
TYPE1_END(y)
typedef ULONG
(STDCALL *pTranslateBusAddress)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress);
//
// Defines a PCI Register Read/Write Type 2 Routine Prologue and Epilogue
//
#define TYPE2_START(x, y) \
TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS) \
{ \
PciCfg->u.bits.RegisterNumber = (USHORT)Offset;
typedef struct _BUS_HANDLER
//
// PCI Register Read Type 2 Routine
//
#define TYPE2_READ(x, y) \
TYPE2_START(x, y) \
*((POINTER_TO_(y))Buffer) = \
READ_FROM(y)((POINTER_TO_(y))(ULONG)PciCfg->u.AsUSHORT); \
TYPE2_END(y)
//
// PCI Register Write Type 2 Routine
//
#define TYPE2_WRITE(x, y) \
TYPE2_START(x, y) \
WRITE_TO(y)((POINTER_TO_(y))(ULONG)PciCfg->u.AsUSHORT, \
*((POINTER_TO_(y))Buffer)); \
TYPE2_END(y)
typedef struct _PCIPBUSDATA
{
LIST_ENTRY Entry;
INTERFACE_TYPE InterfaceType;
BUS_DATA_TYPE BusDataType;
ULONG BusNumber;
ULONG RefCount;
PCIBUSDATA CommonData;
union
{
struct
{
PULONG Address;
ULONG Data;
} Type1;
struct
{
PUCHAR CSE;
PUCHAR Forward;
ULONG Base;
} Type2;
} Config;
ULONG MaxDevice;
} PCIPBUSDATA, *PPCIPBUSDATA;
pGetSetBusData GetBusData;
pGetSetBusData SetBusData;
pAdjustResourceList AdjustResourceList;
pAssignSlotResources AssignSlotResources;
pGetInterruptVector GetInterruptVector;
pTranslateBusAddress TranslateBusAddress;
} BUS_HANDLER;
typedef ULONG
(NTAPI *FncConfigIO)(
IN PPCIPBUSDATA BusData,
IN PVOID State,
IN PUCHAR Buffer,
IN ULONG Offset
);
typedef VOID
(NTAPI *FncSync)(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PKIRQL Irql,
IN PVOID State
);
typedef VOID
(NTAPI *FncReleaseSync)(
IN PBUS_HANDLER BusHandler,
IN KIRQL Irql
);
typedef struct _PCI_CONFIG_HANDLER
{
FncSync Synchronize;
FncReleaseSync ReleaseSynchronzation;
FncConfigIO ConfigRead[3];
FncConfigIO ConfigWrite[3];
} PCI_CONFIG_HANDLER, *PPCI_CONFIG_HANDLER;
typedef struct _PCI_REGISTRY_INFO_INTERNAL
{
UCHAR MajorRevision;
UCHAR MinorRevision;
UCHAR NoBuses;
UCHAR HardwareMechanism;
ULONG ElementCount;
PCI_CARD_DESCRIPTOR CardList[ANYSIZE_ARRAY];
} PCI_REGISTRY_INFO_INTERNAL, *PPCI_REGISTRY_INFO_INTERNAL;
/* FUNCTIONS *****************************************************************/
/* bus.c */
PBUS_HANDLER
HalpAllocateBusHandler(INTERFACE_TYPE InterfaceType,
BUS_DATA_TYPE BusDataType,
ULONG BusNumber);
VOID
NTAPI
HalpPCISynchronizeType1(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PKIRQL Irql,
IN PPCI_TYPE1_CFG_BITS PciCfg
);
/* sysbus.h */
ULONG STDCALL
HalpGetSystemInterruptVector(PVOID BusHandler,
VOID
NTAPI
HalpPCIReleaseSynchronzationType1(
IN PBUS_HANDLER BusHandler,
IN KIRQL Irql
);
VOID
NTAPI
HalpPCISynchronizeType2(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PKIRQL Irql,
IN PPCI_TYPE2_ADDRESS_BITS PciCfg
);
VOID
NTAPI
HalpPCIReleaseSynchronzationType2(
IN PBUS_HANDLER BusHandler,
IN KIRQL Irql
);
TYPE1_DEFINE(HalpPCIReadUcharType1);
TYPE1_DEFINE(HalpPCIReadUshortType1);
TYPE1_DEFINE(HalpPCIReadUlongType1);
TYPE2_DEFINE(HalpPCIReadUcharType2);
TYPE2_DEFINE(HalpPCIReadUshortType2);
TYPE2_DEFINE(HalpPCIReadUlongType2);
TYPE1_DEFINE(HalpPCIWriteUcharType1);
TYPE1_DEFINE(HalpPCIWriteUshortType1);
TYPE1_DEFINE(HalpPCIWriteUlongType1);
TYPE2_DEFINE(HalpPCIWriteUcharType2);
TYPE2_DEFINE(HalpPCIWriteUshortType2);
TYPE2_DEFINE(HalpPCIWriteUlongType2);
BOOLEAN
NTAPI
HalpValidPCISlot(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot
);
VOID
NTAPI
HalpReadPCIConfig(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
VOID
NTAPI
HalpWritePCIConfig(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
ULONG
NTAPI
HalpGetSystemInterruptVector(
ULONG BusNumber,
ULONG BusInterruptLevel,
ULONG BusInterruptVector,
PKIRQL Irql,
PKAFFINITY Affinity);
PKAFFINITY Affinity
);
BOOLEAN STDCALL
HalpTranslateSystemBusAddress(PBUS_HANDLER BusHandler,
ULONG BusNumber,
PHYSICAL_ADDRESS BusAddress,
PULONG AddressSpace,
PPHYSICAL_ADDRESS TranslatedAddress);
ULONG
NTAPI
HalpGetCmosData(
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length
);
/* isa.c */
ULONG STDCALL
HalpGetIsaInterruptVector(PVOID BusHandler,
ULONG BusNumber,
ULONG BusInterruptLevel,
ULONG BusInterruptVector,
PKIRQL Irql,
PKAFFINITY Affinity);
ULONG
NTAPI
HalpSetCmosData(
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length
);
BOOLEAN STDCALL
HalpTranslateIsaBusAddress(PBUS_HANDLER BusHandler,
ULONG BusNumber,
PHYSICAL_ADDRESS BusAddress,
PULONG AddressSpace,
PPHYSICAL_ADDRESS TranslatedAddress);
ULONG
NTAPI
HalpGetPCIData(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootBusHandler,
IN PCI_SLOT_NUMBER SlotNumber,
IN PUCHAR Buffer,
IN ULONG Offset,
IN ULONG Length
);
/* time.c */
ULONG STDCALL
HalpGetCmosData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length);
ULONG
NTAPI
HalpSetPCIData(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootBusHandler,
IN PCI_SLOT_NUMBER SlotNumber,
IN PUCHAR Buffer,
IN ULONG Offset,
IN ULONG Length
);
ULONG STDCALL
HalpSetCmosData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length);
NTSTATUS
NTAPI
HalpAssignPCISlotResources(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName OPTIONAL,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
IN ULONG Slot,
IN OUT PCM_RESOURCE_LIST *pAllocatedResources
);
/* mca.h */
ULONG STDCALL
HalpGetMicroChannelData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length);
VOID
NTAPI
HalpInitializePciBus(
VOID
);
extern ULONG HalpBusType;
extern BOOLEAN HalpPCIConfigInitialized;
extern BUS_HANDLER HalpFakePciBusHandler;
extern ULONG HalpMinPciBus, HalpMaxPciBus;
#endif /* __INTERNAL_HAL_BUS_H */
/* EOF */

View File

@@ -11,16 +11,32 @@
/* C Headers */
#include <stdio.h>
/* WDK HAL Compilation hack */
#ifdef _MSC_VER
#include <excpt.h>
#include <ntdef.h>
#undef _NTHAL_
#undef DECLSPEC_IMPORT
#define DECLSPEC_IMPORT
#define __declspec(dllimport)
#endif
/* IFS/DDK/NDK Headers */
#include <ntifs.h>
#include <ntddk.h>
#include <bugcodes.h>
#include <ntdddisk.h>
#include <arc/arc.h>
#include <iotypes.h>
#include <kefuncs.h>
#include <intrin.h>
#include <halfuncs.h>
#include <rosldr.h>
#include <iofuncs.h>
#include <ldrtypes.h>
#include <obfuncs.h>
#define KPCR_BASE 0xFF000000 // HACK!
/* Internal kernel headers */
#include "internal/pci.h"
#include "internal/powerpc/intrin_i.h"
/* Internal HAL Headers */
#include "apic.h"

View File

@@ -1,5 +1,5 @@
/*
* $Id: halirq.h 23907 2006-09-04 05:52:23Z arty $
* $Id: halirq.h 23669 2006-08-23 16:58:43Z ion $
*/
#ifndef __INCLUDE_HAL_HALIRQ

View File

@@ -5,87 +5,121 @@
#ifndef __INTERNAL_HAL_HAL_H
#define __INTERNAL_HAL_HAL_H
/* Temporary hack */
#define KPCR_BASE 0xFF000000
/* WDK Hack */
#define KdComPortInUse _KdComPortInUse
#define HAL_APC_REQUEST 0
#define HAL_DPC_REQUEST 1
//
// Kernel Debugger Port Definition
//
typedef struct _KD_PORT_INFORMATION
{
ULONG ComPort;
ULONG BaudRate;
ULONG BaseAddress;
} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
/* CMOS Registers and Ports */
#define CMOS_CONTROL_PORT (PUCHAR)0x70
#define CMOS_DATA_PORT (PUCHAR)0x71
#define RTC_REGISTER_A 0x0A
#define RTC_REGISTER_B 0x0B
#define RTC_REG_A_UIP 0x80
#define RTC_REGISTER_CENTURY 0x32
/* display.c */
VOID FASTCALL HalInitializeDisplay (struct _ROS_LOADER_PARAMETER_BLOCK *LoaderBlock);
VOID FASTCALL HalClearDisplay (UCHAR CharAttribute);
/* Timer Registers and Ports */
#define TIMER_CONTROL_PORT 0x43
#define TIMER_DATA_PORT0 0x40
#define TIMER_SC0 0
#define TIMER_BOTH 0x30
#define TIMER_MD2 0x4
/* Conversion functions */
#define BCD_INT(bcd) \
(((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
#define INT_BCD(int) \
(UCHAR)(((int / 10) << 4) + (int % 10))
/* adapter.c */
PADAPTER_OBJECT STDCALL HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
/* bus.c */
VOID HalpInitBusHandlers (VOID);
VOID NTAPI HalpInitNonBusHandler (VOID);
/* irql.c */
VOID NTAPI HalpInitPICs(VOID);
/* udelay.c */
VOID HalpCalibrateStallExecution(VOID);
VOID NTAPI HalpInitializeClock(VOID);
/* pci.c */
VOID HalpInitPciBus (VOID);
/* enum.c */
VOID HalpStartEnumerator (VOID);
/* dma.c */
VOID HalpInitDma (VOID);
/* mem.c */
PVOID HalpMapPhysMemory(ULONG PhysAddr, ULONG Size);
/* Non-generic initialization */
VOID HalpInitPhase0 (PROS_LOADER_PARAMETER_BLOCK LoaderBlock);
VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock);
VOID HalpInitPhase1(VOID);
VOID NTAPI HalpClockInterrupt(VOID);
//
// KD Support
//
VOID
NTAPI
HalpCheckPowerButton(
VOID
);
VOID
NTAPI
HalpRegisterKdSupportFunctions(
VOID
);
NTSTATUS
NTAPI
HalpSetupPciDeviceForDebugging(
IN PVOID LoaderBlock,
IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
);
NTSTATUS
NTAPI
HalpReleasePciDeviceForDebugging(
IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
);
//
// Memory routines
//
PVOID
NTAPI
HalpMapPhysicalMemory64(
IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberPage
);
VOID
NTAPI
HalpUnmapVirtualAddress(
IN PVOID VirtualAddress,
IN ULONG NumberPages
);
/* sysinfo.c */
NTSTATUS STDCALL
HalpQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass,
NTSTATUS
NTAPI
HaliQuerySystemInformation(
IN HAL_QUERY_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN OUT PVOID Buffer,
OUT PULONG ReturnedLength);
OUT PULONG ReturnedLength
);
/* Non-standard functions */
VOID STDCALL
HalReleaseDisplayOwnership();
BOOLEAN STDCALL
HalQueryDisplayOwnership();
#if defined(__GNUC__)
#define Ki386SaveFlags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
#define Ki386RestoreFlags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
#define Ki386DisableInterrupts() __asm__ __volatile__("cli\n\t")
#define Ki386EnableInterrupts() __asm__ __volatile__("sti\n\t")
#define Ki386HaltProcessor() __asm__ __volatile__("hlt\n\t")
#define Ki386RdTSC(x) __asm__ __volatile__("rdtsc\n\t" : "=A" (x.u.LowPart), "=d" (x.u.HighPart))
#define Ki386Rdmsr(msr,val1,val2) __asm__ __volatile__("rdmsr" : "=a" (val1), "=d" (val2) : "c" (msr))
#define Ki386Wrmsr(msr,val1,val2) __asm__ __volatile__("wrmsr" : /* no outputs */ : "c" (msr), "a" (val1), "d" (val2))
#define Ki386ReadFsByte(offset,x) __asm__ __volatile__("movb %%fs:%c1,%0" : "=q" (x) : "i" (offset))
#define Ki386WriteFsByte(offset,x) __asm__ __volatile__("movb %0,%%fs:%c1" : : "q" ((UCHAR)x), "i" (offset))
#elif defined(_MSC_VER)
#define Ki386SaveFlags(x) __asm pushfd __asm pop x;
#define Ki386RestoreFlags(x) __asm push x __asm popfd;
#define Ki386DisableInterrupts() __asm cli
#define Ki386EnableInterrupts() __asm sti
#define Ki386HaltProcessor() __asm hlt
#else
#error Unknown compiler for inline assembler
#endif
NTSTATUS
NTAPI
HaliSetSystemInformation(
IN HAL_SET_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN OUT PVOID Buffer
);
typedef struct tagHALP_HOOKS
{
@@ -93,5 +127,6 @@ typedef struct tagHALP_HOOKS
} HALP_HOOKS, *PHALP_HOOKS;
extern HALP_HOOKS HalpHooks;
extern KSPIN_LOCK HalpSystemHardwareLock;
#endif /* __INTERNAL_HAL_HAL_H */

View File

@@ -1,4 +1,4 @@
/* $Id: halinit_up.c 23907 2006-09-04 05:52:23Z arty $
/* $Id: halinit_up.c 24964 2006-11-29 08:28:20Z ion $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@@ -18,18 +18,15 @@
/* FUNCTIONS ***************************************************************/
VOID
HalpInitPhase0(PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
HalpInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
HalpInitPICs();
/* Setup busy waiting */
HalpCalibrateStallExecution();
}
VOID
HalpInitPhase1(VOID)
{
/* Nothing for now */
}
/* EOF */

View File

@@ -1,7 +1,7 @@
<module name="halppc_up" type="kernelmodedll">
<importlibrary definition="../../hal/hal.def" />
<bootstrap base="reactos" nameoncd="hal.dll" />
<include base="hal_generic">../include</include>
<include base="halppc_generic">../include</include>
<include base="ntoskrnl">include</include>
<define name="_DISABLE_TIDENTS" />
<define name="__USE_W32API" />

View File

@@ -1,133 +1,296 @@
/*
*/
#ifndef __INTERNAL_HAL_BUS_H
#define __INTERNAL_HAL_BUS_H
//
// Helper Macros
//
#define PASTE2(x,y) x ## y
#define POINTER_TO_(x) PASTE2(P,x)
#define READ_FROM(x) PASTE2(READ_PORT_, x)
#define WRITE_TO(x) PASTE2(WRITE_PORT_, x)
typedef NTSTATUS
(STDCALL *pAdjustResourceList)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN OUT PCM_RESOURCE_LIST Resources);
//
// Declares a PCI Register Read/Write Routine
//
#define TYPE_DEFINE(x, y) \
ULONG \
NTAPI \
x( \
IN PPCIPBUSDATA BusData, \
IN y PciCfg, \
IN PUCHAR Buffer, \
IN ULONG Offset \
)
#define TYPE1_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS);
#define TYPE2_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS);
typedef NTSTATUS
(STDCALL *pAssignSlotResources)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject,
IN ULONG SlotNumber,
IN OUT PCM_RESOURCE_LIST *AllocatedResources);
//
// Defines a PCI Register Read/Write Type 1 Routine Prologue and Epilogue
//
#define TYPE1_START(x, y) \
TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS) \
{ \
ULONG i = Offset % sizeof(ULONG); \
PciCfg->u.bits.RegisterNumber = Offset / sizeof(ULONG); \
WRITE_PORT_ULONG(BusData->Config.Type1.Address, PciCfg->u.AsULONG);
#define TYPE1_END(y) \
return sizeof(y); }
#define TYPE2_END TYPE1_END
typedef ULONG
(STDCALL *pGetSetBusData)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN ULONG SlotNumber,
OUT PVOID Buffer,
IN ULONG Offset,
IN ULONG Length);
//
// PCI Register Read Type 1 Routine
//
#define TYPE1_READ(x, y) \
TYPE1_START(x, y) \
*((POINTER_TO_(y))Buffer) = \
READ_FROM(y)((POINTER_TO_(y))(BusData->Config.Type1.Data + i)); \
TYPE1_END(y)
typedef ULONG
(STDCALL *pGetInterruptVector)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN ULONG BusInterruptLevel,
IN ULONG BusInterruptVector,
OUT PKIRQL Irql,
OUT PKAFFINITY Affinity);
//
// PCI Register Write Type 1 Routine
//
#define TYPE1_WRITE(x, y) \
TYPE1_START(x, y) \
WRITE_TO(y)((POINTER_TO_(y))(BusData->Config.Type1.Data + i), \
*((POINTER_TO_(y))Buffer)); \
TYPE1_END(y)
typedef ULONG
(STDCALL *pTranslateBusAddress)(IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress);
//
// Defines a PCI Register Read/Write Type 2 Routine Prologue and Epilogue
//
#define TYPE2_START(x, y) \
TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS) \
{ \
PciCfg->u.bits.RegisterNumber = (USHORT)Offset;
typedef struct _BUS_HANDLER
//
// PCI Register Read Type 2 Routine
//
#define TYPE2_READ(x, y) \
TYPE2_START(x, y) \
*((POINTER_TO_(y))Buffer) = \
READ_FROM(y)((POINTER_TO_(y))(ULONG)PciCfg->u.AsUSHORT); \
TYPE2_END(y)
//
// PCI Register Write Type 2 Routine
//
#define TYPE2_WRITE(x, y) \
TYPE2_START(x, y) \
WRITE_TO(y)((POINTER_TO_(y))(ULONG)PciCfg->u.AsUSHORT, \
*((POINTER_TO_(y))Buffer)); \
TYPE2_END(y)
typedef struct _PCIPBUSDATA
{
LIST_ENTRY Entry;
INTERFACE_TYPE InterfaceType;
BUS_DATA_TYPE BusDataType;
ULONG BusNumber;
ULONG RefCount;
PCIBUSDATA CommonData;
union
{
struct
{
PULONG Address;
ULONG Data;
} Type1;
struct
{
PUCHAR CSE;
PUCHAR Forward;
ULONG Base;
} Type2;
} Config;
ULONG MaxDevice;
} PCIPBUSDATA, *PPCIPBUSDATA;
pGetSetBusData GetBusData;
pGetSetBusData SetBusData;
pAdjustResourceList AdjustResourceList;
pAssignSlotResources AssignSlotResources;
pGetInterruptVector GetInterruptVector;
pTranslateBusAddress TranslateBusAddress;
} BUS_HANDLER;
typedef ULONG
(NTAPI *FncConfigIO)(
IN PPCIPBUSDATA BusData,
IN PVOID State,
IN PUCHAR Buffer,
IN ULONG Offset
);
typedef VOID
(NTAPI *FncSync)(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PKIRQL Irql,
IN PVOID State
);
typedef VOID
(NTAPI *FncReleaseSync)(
IN PBUS_HANDLER BusHandler,
IN KIRQL Irql
);
typedef struct _PCI_CONFIG_HANDLER
{
FncSync Synchronize;
FncReleaseSync ReleaseSynchronzation;
FncConfigIO ConfigRead[3];
FncConfigIO ConfigWrite[3];
} PCI_CONFIG_HANDLER, *PPCI_CONFIG_HANDLER;
typedef struct _PCI_REGISTRY_INFO_INTERNAL
{
UCHAR MajorRevision;
UCHAR MinorRevision;
UCHAR NoBuses;
UCHAR HardwareMechanism;
ULONG ElementCount;
PCI_CARD_DESCRIPTOR CardList[ANYSIZE_ARRAY];
} PCI_REGISTRY_INFO_INTERNAL, *PPCI_REGISTRY_INFO_INTERNAL;
/* FUNCTIONS *****************************************************************/
/* bus.c */
PBUS_HANDLER
HalpAllocateBusHandler(INTERFACE_TYPE InterfaceType,
BUS_DATA_TYPE BusDataType,
ULONG BusNumber);
VOID
NTAPI
HalpPCISynchronizeType1(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PKIRQL Irql,
IN PPCI_TYPE1_CFG_BITS PciCfg
);
/* sysbus.h */
ULONG STDCALL
HalpGetSystemInterruptVector(PVOID BusHandler,
VOID
NTAPI
HalpPCIReleaseSynchronzationType1(
IN PBUS_HANDLER BusHandler,
IN KIRQL Irql
);
VOID
NTAPI
HalpPCISynchronizeType2(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PKIRQL Irql,
IN PPCI_TYPE2_ADDRESS_BITS PciCfg
);
VOID
NTAPI
HalpPCIReleaseSynchronzationType2(
IN PBUS_HANDLER BusHandler,
IN KIRQL Irql
);
TYPE1_DEFINE(HalpPCIReadUcharType1);
TYPE1_DEFINE(HalpPCIReadUshortType1);
TYPE1_DEFINE(HalpPCIReadUlongType1);
TYPE2_DEFINE(HalpPCIReadUcharType2);
TYPE2_DEFINE(HalpPCIReadUshortType2);
TYPE2_DEFINE(HalpPCIReadUlongType2);
TYPE1_DEFINE(HalpPCIWriteUcharType1);
TYPE1_DEFINE(HalpPCIWriteUshortType1);
TYPE1_DEFINE(HalpPCIWriteUlongType1);
TYPE2_DEFINE(HalpPCIWriteUcharType2);
TYPE2_DEFINE(HalpPCIWriteUshortType2);
TYPE2_DEFINE(HalpPCIWriteUlongType2);
BOOLEAN
NTAPI
HalpValidPCISlot(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot
);
VOID
NTAPI
HalpReadPCIConfig(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
VOID
NTAPI
HalpWritePCIConfig(
IN PBUS_HANDLER BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
ULONG
NTAPI
HalpGetSystemInterruptVector(
ULONG BusNumber,
ULONG BusInterruptLevel,
ULONG BusInterruptVector,
PKIRQL Irql,
PKAFFINITY Affinity);
PKAFFINITY Affinity
);
BOOLEAN STDCALL
HalpTranslateSystemBusAddress(PBUS_HANDLER BusHandler,
ULONG BusNumber,
PHYSICAL_ADDRESS BusAddress,
PULONG AddressSpace,
PPHYSICAL_ADDRESS TranslatedAddress);
ULONG
NTAPI
HalpGetCmosData(
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length
);
/* isa.c */
ULONG STDCALL
HalpGetIsaInterruptVector(PVOID BusHandler,
ULONG BusNumber,
ULONG BusInterruptLevel,
ULONG BusInterruptVector,
PKIRQL Irql,
PKAFFINITY Affinity);
ULONG
NTAPI
HalpSetCmosData(
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length
);
BOOLEAN STDCALL
HalpTranslateIsaBusAddress(PBUS_HANDLER BusHandler,
ULONG BusNumber,
PHYSICAL_ADDRESS BusAddress,
PULONG AddressSpace,
PPHYSICAL_ADDRESS TranslatedAddress);
ULONG
NTAPI
HalpGetPCIData(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootBusHandler,
IN PCI_SLOT_NUMBER SlotNumber,
IN PUCHAR Buffer,
IN ULONG Offset,
IN ULONG Length
);
/* time.c */
ULONG STDCALL
HalpGetCmosData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length);
ULONG
NTAPI
HalpSetPCIData(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootBusHandler,
IN PCI_SLOT_NUMBER SlotNumber,
IN PUCHAR Buffer,
IN ULONG Offset,
IN ULONG Length
);
ULONG STDCALL
HalpSetCmosData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length);
NTSTATUS
NTAPI
HalpAssignPCISlotResources(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName OPTIONAL,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
IN ULONG Slot,
IN OUT PCM_RESOURCE_LIST *pAllocatedResources
);
/* mca.h */
ULONG STDCALL
HalpGetMicroChannelData(PBUS_HANDLER BusHandler,
ULONG BusNumber,
ULONG SlotNumber,
PVOID Buffer,
ULONG Offset,
ULONG Length);
VOID
NTAPI
HalpInitializePciBus(
VOID
);
extern ULONG HalpBusType;
extern BOOLEAN HalpPCIConfigInitialized;
extern BUS_HANDLER HalpFakePciBusHandler;
extern ULONG HalpMinPciBus, HalpMaxPciBus;
#endif /* __INTERNAL_HAL_BUS_H */
/* EOF */

View File

@@ -11,16 +11,32 @@
/* C Headers */
#include <stdio.h>
/* WDK HAL Compilation hack */
#ifdef _MSC_VER
#include <excpt.h>
#include <ntdef.h>
#undef _NTHAL_
#undef DECLSPEC_IMPORT
#define DECLSPEC_IMPORT
#define __declspec(dllimport)
#endif
/* IFS/DDK/NDK Headers */
#include <ntifs.h>
#include <ntddk.h>
#include <bugcodes.h>
#include <ntdddisk.h>
#include <arc/arc.h>
#include <iotypes.h>
#include <kefuncs.h>
#include <intrin.h>
#include <halfuncs.h>
#include <rosldr.h>
#include <iofuncs.h>
#include <ldrtypes.h>
#include <obfuncs.h>
#define KPCR_BASE 0xFF000000 // HACK!
/* Internal kernel headers */
#include "internal/pci.h"
#include "internal/i386/intrin_i.h"
/* Internal HAL Headers */
#include "apic.h"

View File

@@ -5,87 +5,121 @@
#ifndef __INTERNAL_HAL_HAL_H
#define __INTERNAL_HAL_HAL_H
/* Temporary hack */
#define KPCR_BASE 0xFF000000
/* WDK Hack */
#define KdComPortInUse _KdComPortInUse
#define HAL_APC_REQUEST 0
#define HAL_DPC_REQUEST 1
//
// Kernel Debugger Port Definition
//
typedef struct _KD_PORT_INFORMATION
{
ULONG ComPort;
ULONG BaudRate;
ULONG BaseAddress;
} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
/* CMOS Registers and Ports */
#define CMOS_CONTROL_PORT (PUCHAR)0x70
#define CMOS_DATA_PORT (PUCHAR)0x71
#define RTC_REGISTER_A 0x0A
#define RTC_REGISTER_B 0x0B
#define RTC_REG_A_UIP 0x80
#define RTC_REGISTER_CENTURY 0x32
/* display.c */
VOID FASTCALL HalInitializeDisplay (struct _ROS_LOADER_PARAMETER_BLOCK *LoaderBlock);
VOID FASTCALL HalClearDisplay (UCHAR CharAttribute);
/* Timer Registers and Ports */
#define TIMER_CONTROL_PORT 0x43
#define TIMER_DATA_PORT0 0x40
#define TIMER_SC0 0
#define TIMER_BOTH 0x30
#define TIMER_MD2 0x4
/* Conversion functions */
#define BCD_INT(bcd) \
(((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
#define INT_BCD(int) \
(UCHAR)(((int / 10) << 4) + (int % 10))
/* adapter.c */
PADAPTER_OBJECT STDCALL HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
/* bus.c */
VOID HalpInitBusHandlers (VOID);
VOID NTAPI HalpInitNonBusHandler (VOID);
/* irql.c */
VOID NTAPI HalpInitPICs(VOID);
/* udelay.c */
VOID HalpCalibrateStallExecution(VOID);
VOID NTAPI HalpInitializeClock(VOID);
/* pci.c */
VOID HalpInitPciBus (VOID);
/* enum.c */
VOID HalpStartEnumerator (VOID);
/* dma.c */
VOID HalpInitDma (VOID);
/* mem.c */
PVOID HalpMapPhysMemory(ULONG PhysAddr, ULONG Size);
/* Non-generic initialization */
VOID HalpInitPhase0 (PROS_LOADER_PARAMETER_BLOCK LoaderBlock);
VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock);
VOID HalpInitPhase1(VOID);
VOID NTAPI HalpClockInterrupt(VOID);
//
// KD Support
//
VOID
NTAPI
HalpCheckPowerButton(
VOID
);
VOID
NTAPI
HalpRegisterKdSupportFunctions(
VOID
);
NTSTATUS
NTAPI
HalpSetupPciDeviceForDebugging(
IN PVOID LoaderBlock,
IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
);
NTSTATUS
NTAPI
HalpReleasePciDeviceForDebugging(
IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
);
//
// Memory routines
//
PVOID
NTAPI
HalpMapPhysicalMemory64(
IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberPage
);
VOID
NTAPI
HalpUnmapVirtualAddress(
IN PVOID VirtualAddress,
IN ULONG NumberPages
);
/* sysinfo.c */
NTSTATUS STDCALL
HalpQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass,
NTSTATUS
NTAPI
HaliQuerySystemInformation(
IN HAL_QUERY_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN OUT PVOID Buffer,
OUT PULONG ReturnedLength);
OUT PULONG ReturnedLength
);
/* Non-standard functions */
VOID STDCALL
HalReleaseDisplayOwnership();
BOOLEAN STDCALL
HalQueryDisplayOwnership();
#if defined(__GNUC__)
#define Ki386SaveFlags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
#define Ki386RestoreFlags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
#define Ki386DisableInterrupts() __asm__ __volatile__("cli\n\t")
#define Ki386EnableInterrupts() __asm__ __volatile__("sti\n\t")
#define Ki386HaltProcessor() __asm__ __volatile__("hlt\n\t")
#define Ki386RdTSC(x) __asm__ __volatile__("rdtsc\n\t" : "=A" (x.u.LowPart), "=d" (x.u.HighPart))
#define Ki386Rdmsr(msr,val1,val2) __asm__ __volatile__("rdmsr" : "=a" (val1), "=d" (val2) : "c" (msr))
#define Ki386Wrmsr(msr,val1,val2) __asm__ __volatile__("wrmsr" : /* no outputs */ : "c" (msr), "a" (val1), "d" (val2))
#define Ki386ReadFsByte(offset,x) __asm__ __volatile__("movb %%fs:%c1,%0" : "=q" (x) : "i" (offset))
#define Ki386WriteFsByte(offset,x) __asm__ __volatile__("movb %0,%%fs:%c1" : : "q" ((UCHAR)x), "i" (offset))
#elif defined(_MSC_VER)
#define Ki386SaveFlags(x) __asm pushfd __asm pop x;
#define Ki386RestoreFlags(x) __asm push x __asm popfd;
#define Ki386DisableInterrupts() __asm cli
#define Ki386EnableInterrupts() __asm sti
#define Ki386HaltProcessor() __asm hlt
#else
#error Unknown compiler for inline assembler
#endif
NTSTATUS
NTAPI
HaliSetSystemInformation(
IN HAL_SET_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN OUT PVOID Buffer
);
typedef struct tagHALP_HOOKS
{
@@ -93,5 +127,6 @@ typedef struct tagHALP_HOOKS
} HALP_HOOKS, *PHALP_HOOKS;
extern HALP_HOOKS HalpHooks;
extern KSPIN_LOCK HalpSystemHardwareLock;
#endif /* __INTERNAL_HAL_HAL_H */

View File

@@ -1806,7 +1806,7 @@ NdisQueryBufferOffset(
VirtualAddress, \
Length) \
{ \
if (VirtualAddress) \
if (ARGUMENT_PRESENT(VirtualAddress)) \
*((PVOID*)VirtualAddress) = MmGetSystemAddressForMdl(Buffer); \
\
*((PUINT)Length) = MmGetMdlByteCount(Buffer); \
@@ -2022,48 +2022,52 @@ NdisQueryBufferOffset(
* OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
* OUT PUINT TotalPacketLength OPTIONAL);
*/
#define NdisQueryPacket(Packet, \
PhysicalBufferCount, \
BufferCount, \
FirstBuffer, \
TotalPacketLength) \
{ \
if (FirstBuffer) \
*((PNDIS_BUFFER*)FirstBuffer) = (Packet)->Private.Head; \
if ((TotalPacketLength) || (BufferCount) || (PhysicalBufferCount)) \
{ \
if (!(Packet)->Private.ValidCounts) { \
UINT _Offset; \
UINT _PacketLength; \
PNDIS_BUFFER _NdisBuffer; \
UINT _PhysicalBufferCount = 0; \
UINT _TotalPacketLength = 0; \
UINT _Count = 0; \
\
for (_NdisBuffer = (Packet)->Private.Head; \
_NdisBuffer != (PNDIS_BUFFER)NULL; \
_NdisBuffer = _NdisBuffer->Next) \
{ \
_PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(_NdisBuffer); \
NdisQueryBufferOffset(_NdisBuffer, &_Offset, &_PacketLength); \
_TotalPacketLength += _PacketLength; \
_Count++; \
} \
(Packet)->Private.PhysicalCount = _PhysicalBufferCount; \
(Packet)->Private.TotalLength = _TotalPacketLength; \
(Packet)->Private.Count = _Count; \
(Packet)->Private.ValidCounts = TRUE; \
} \
\
if (PhysicalBufferCount) \
*((PUINT)PhysicalBufferCount) = (Packet)->Private.PhysicalCount; \
\
if (BufferCount) \
*((PUINT)BufferCount) = (Packet)->Private.Count; \
\
if (TotalPacketLength) \
*((PUINT)TotalPacketLength) = (Packet)->Private.TotalLength; \
} \
static __inline
VOID
NdisQueryPacket(
IN PNDIS_PACKET Packet,
OUT PUINT PhysicalBufferCount OPTIONAL,
OUT PUINT BufferCount OPTIONAL,
OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
OUT PUINT TotalPacketLength OPTIONAL)
{
if (FirstBuffer)
*FirstBuffer = Packet->Private.Head;
if (TotalPacketLength || BufferCount || PhysicalBufferCount)
{
if (!Packet->Private.ValidCounts)
{
UINT Offset;
UINT PacketLength;
PNDIS_BUFFER NdisBuffer;
UINT PhysicalBufferCount = 0;
UINT TotalPacketLength = 0;
UINT Count = 0;
for (NdisBuffer = Packet->Private.Head;
NdisBuffer != (PNDIS_BUFFER)NULL;
NdisBuffer = NdisBuffer->Next)
{
PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(NdisBuffer);
NdisQueryBufferOffset(NdisBuffer, &Offset, &PacketLength);
TotalPacketLength += PacketLength;
Count++;
}
Packet->Private.PhysicalCount = PhysicalBufferCount;
Packet->Private.TotalLength = TotalPacketLength;
Packet->Private.Count = Count;
Packet->Private.ValidCounts = TRUE;
}
if (PhysicalBufferCount)
*PhysicalBufferCount = Packet->Private.PhysicalCount;
if (BufferCount)
*BufferCount = Packet->Private.Count;
if (TotalPacketLength)
*TotalPacketLength = Packet->Private.TotalLength;
}
}
/*
@@ -2281,7 +2285,7 @@ NdisDestroyLookaheadBufferFromSharedMemory(
#endif
#if defined(_M_IX86) || defined(_M_AMD64)
#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_PPC)
/*
* VOID
@@ -2305,17 +2309,17 @@ NdisDestroyLookaheadBufferFromSharedMemory(
#else
#define NdisMoveMappedMemory(Destination, Source, Length) \
{ \
PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length; \
while (_Dest < _End) \
*_Dest++ = _Src++; \
{
PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length;
while (_Dest < _End)
*_Dest++ = _Src++;
}
#define NdisZeroMappedMemory(Destination, Length) \
{ \
PUCHAR _Dest = Destination, _End = _Dest + Length; \
while (_Dest < _End) \
*_Dest++ = 0; \
{
PUCHAR _Dest = Destination, _End = _Dest + Length;
while (_Dest < _End)
*_Dest++ = 0;
}
#endif /* _M_IX86 or _M_AMD64 */
@@ -4126,6 +4130,7 @@ typedef struct _NDIS_INTERRUPT {
KEVENT DpcsCompletedEvent;
} NDIS_INTERRUPT, *PNDIS_INTERRUPT;
typedef enum _NDIS_WORK_ITEM_TYPE {
NdisWorkItemRequest,
NdisWorkItemSend,
@@ -4255,19 +4260,19 @@ typedef VOID DDKAPI
IN PUCHAR Packet,
IN ULONG PacketSize);
typedef VOID DDKFASTAPI
typedef VOID FASTCALL
(*NDIS_M_DEQUEUE_WORK_ITEM)(
IN PNDIS_MINIPORT_BLOCK Miniport,
IN NDIS_WORK_ITEM_TYPE WorkItemType,
OUT PVOID *WorkItemContext);
typedef NDIS_STATUS DDKFASTAPI
typedef NDIS_STATUS FASTCALL
(*NDIS_M_QUEUE_NEW_WORK_ITEM)(
IN PNDIS_MINIPORT_BLOCK Miniport,
IN NDIS_WORK_ITEM_TYPE WorkItemType,
IN PVOID WorkItemContext);
typedef NDIS_STATUS DDKFASTAPI
typedef NDIS_STATUS FASTCALL
(*NDIS_M_QUEUE_WORK_ITEM)(
IN PNDIS_MINIPORT_BLOCK Miniport,
IN NDIS_WORK_ITEM_TYPE WorkItemType,
@@ -4294,7 +4299,7 @@ typedef VOID DDKAPI
(*NDIS_M_SEND_RESOURCES_HANDLER)(
IN NDIS_HANDLE MiniportAdapterHandle);
typedef BOOLEAN DDKFASTAPI
typedef BOOLEAN FASTCALL
(*NDIS_M_START_SENDS)(
IN PNDIS_MINIPORT_BLOCK Miniport);

View File

@@ -0,0 +1,21 @@
#ifndef _NTDDFT_
#define _NTDDFT_
#ifdef __cplusplus
extern "C" {
#endif
#define FTTYPE ((ULONG)'f')
#define FT_SECONDARY_READ CTL_CODE(FTTYPE, 4, METHOD_OUT_DIRECT, FILE_READ_ACCESS)
#define FT_PRIMARY_READ CTL_CODE(FTTYPE, 5, METHOD_OUT_DIRECT, FILE_READ_ACCESS)
#define FT_BALANCED_READ_MODE CTL_CODE(FTTYPE, 6, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FT_SYNC_REDUNDANT_COPY CTL_CODE(FTTYPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -28,7 +28,12 @@
#pragma GCC system_header
#endif
#ifdef _NTOSKRNL_
/* HACKHACKHACK!!! We shouldn't include this header from ntoskrnl! */
#define NTKERNELAPI
#else
#define NTKERNELAPI DECLSPEC_IMPORT
#endif
#include "ntddk.h"
@@ -39,12 +44,17 @@ extern "C" {
#pragma pack(push,4)
#ifndef VER_PRODUCTBUILD
#define VER_PRODUCTBUILD 10000
#endif
#ifndef NTSYSAPI
#define NTSYSAPI
#endif
#define EX_PUSH_LOCK ULONG_PTR
#define PEX_PUSH_LOCK PULONG_PTR
#include "csq.h"
typedef struct _SE_EXPORTS *PSE_EXPORTS;
@@ -66,6 +76,30 @@ extern LARGE_INTEGER IoReadTransferCount;
extern LARGE_INTEGER IoWriteTransferCount;
extern LARGE_INTEGER IoOtherTransferCount;
typedef STRING LSA_STRING, *PLSA_STRING;
typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE;
typedef enum _SECURITY_LOGON_TYPE
{
UndefinedLogonType = 0,
Interactive = 2,
Network,
Batch,
Service,
Proxy,
Unlock,
NetworkCleartext,
NewCredentials,
#if (_WIN32_WINNT >= 0x0501)
RemoteInteractive,
CachedInteractive,
#endif
#if (_WIN32_WINNT >= 0x0502)
CachedRemoteInteractive,
CachedUnlock
#endif
} SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE;
#define ANSI_DOS_STAR ('<')
#define ANSI_DOS_QM ('>')
#define ANSI_DOS_DOT ('"')
@@ -263,6 +297,11 @@ extern LARGE_INTEGER IoOtherTransferCount;
#ifdef _X86_
#define HARDWARE_PTE HARDWARE_PTE_X86
#define PHARDWARE_PTE PHARDWARE_PTE_X86
#elif defined(_PPC_)
#ifndef HARDWARE_PTE
#define HARDWARE_PTE HARDWARE_PTE_PPC
#define PHARDWARE_PTE PHARDWARE_PTE_PPC
#endif
#else
#define HARDWARE_PTE ULONG
#define PHARDWARE_PTE PULONG
@@ -373,7 +412,9 @@ extern LARGE_INTEGER IoOtherTransferCount;
#define TOKEN_HAS_BACKUP_PRIVILEGE 0x02
#define TOKEN_HAS_RESTORE_PRIVILEGE 0x04
#define TOKEN_HAS_ADMIN_GROUP 0x08
#define TOKEN_WRITE_RESTRICTED 0x08
#define TOKEN_IS_RESTRICTED 0x10
#define SE_BACKUP_PRIVILEGES_CHECKED 0x0100
#define VACB_MAPPING_GRANULARITY (0x40000)
#define VACB_OFFSET_SHIFT (18)
@@ -395,6 +436,21 @@ extern LARGE_INTEGER IoOtherTransferCount;
#define SE_RM_CONTROL_VALID 0x4000
#define SE_SELF_RELATIVE 0x8000
#ifndef _WINNT_H
#define _AUDIT_EVENT_TYPE_HACK 0
#endif
#if (_AUDIT_EVENT_TYPE_HACK == 1)
#else
typedef enum _AUDIT_EVENT_TYPE
{
AuditEventObjectAccess,
AuditEventDirectoryServiceAccess
} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
#endif
#define AUDIT_ALLOW_NO_PRIVILEGE 0x1
#define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
@@ -709,6 +765,36 @@ typedef enum _TOKEN_INFORMATION_CLASS {
TokenSandBoxInert,TokenAuditPolicy,TokenOrigin,
} TOKEN_INFORMATION_CLASS;
#define SYMLINK_FLAG_RELATIVE 1
typedef struct _REPARSE_DATA_BUFFER {
ULONG ReparseTag;
USHORT ReparseDataLength;
USHORT Reserved;
union {
struct {
USHORT SubstituteNameOffset;
USHORT SubstituteNameLength;
USHORT PrintNameOffset;
USHORT PrintNameLength;
ULONG Flags;
WCHAR PathBuffer[1];
} SymbolicLinkReparseBuffer;
struct {
USHORT SubstituteNameOffset;
USHORT SubstituteNameLength;
USHORT PrintNameOffset;
USHORT PrintNameLength;
WCHAR PathBuffer[1];
} MountPointReparseBuffer;
struct {
UCHAR DataBuffer[1];
} GenericReparseBuffer;
};
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
typedef struct _FILE_ACCESS_INFORMATION {
ACCESS_MASK AccessFlags;
} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
@@ -858,6 +944,19 @@ typedef struct _FILE_FS_VOLUME_INFORMATION {
WCHAR VolumeLabel[1];
} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
typedef struct _FILE_FS_OBJECTID_INFORMATION
{
UCHAR ObjectId[16];
UCHAR ExtendedInfo[48];
} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
typedef struct _FILE_FS_DRIVER_PATH_INFORMATION
{
BOOLEAN DriverInPath;
ULONG DriverNameLength;
WCHAR DriverName[1];
} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
typedef struct _FILE_FULL_DIR_INFORMATION {
ULONG NextEntryOffset;
ULONG FileIndex;
@@ -918,6 +1017,20 @@ typedef struct _FILE_LOCK_INFO
LARGE_INTEGER EndingByte;
} FILE_LOCK_INFO, *PFILE_LOCK_INFO;
typedef struct _FILE_REPARSE_POINT_INFORMATION
{
LONGLONG FileReference;
ULONG Tag;
} FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
typedef struct _FILE_MOVE_CLUSTER_INFORMATION
{
ULONG ClusterCount;
HANDLE RootDirectory;
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
/* raw internal file lock struct returned from FsRtlGetNextFileLock */
typedef struct _FILE_SHARED_LOCK_ENTRY {
PVOID Unknown1;
@@ -1329,34 +1442,65 @@ typedef struct _PATHNAME_BUFFER {
WCHAR Name[1];
} PATHNAME_BUFFER, *PPATHNAME_BUFFER;
#if (VER_PRODUCTBUILD >= 2600)
typedef enum _RTL_GENERIC_COMPARE_RESULTS
{
GenericLessThan,
GenericGreaterThan,
GenericEqual
} RTL_GENERIC_COMPARE_RESULTS;
typedef struct _PRIVATE_CACHE_MAP_FLAGS {
ULONG DontUse : 16;
ULONG ReadAheadActive : 1;
ULONG ReadAheadEnabled : 1;
ULONG Available : 14;
} PRIVATE_CACHE_MAP_FLAGS, *PPRIVATE_CACHE_MAP_FLAGS;
typedef enum _TABLE_SEARCH_RESULT
{
TableEmptyTree,
TableFoundNode,
TableInsertAsLeft,
TableInsertAsRight
} TABLE_SEARCH_RESULT;
typedef struct _PRIVATE_CACHE_MAP {
_ANONYMOUS_UNION union {
CSHORT NodeTypeCode;
PRIVATE_CACHE_MAP_FLAGS Flags;
ULONG UlongFlags;
} DUMMYUNIONNAME;
ULONG ReadAheadMask;
PFILE_OBJECT FileObject;
LARGE_INTEGER FileOffset1;
LARGE_INTEGER BeyondLastByte1;
LARGE_INTEGER FileOffset2;
LARGE_INTEGER BeyondLastByte2;
LARGE_INTEGER ReadAheadOffset[2];
ULONG ReadAheadLength[2];
KSPIN_LOCK ReadAheadSpinLock;
LIST_ENTRY PrivateLinks;
} PRIVATE_CACHE_MAP, *PPRIVATE_CACHE_MAP;
typedef NTSTATUS
(NTAPI *PRTL_AVL_MATCH_FUNCTION)(
struct _RTL_AVL_TABLE *Table,
PVOID UserData,
PVOID MatchData
);
#endif
typedef RTL_GENERIC_COMPARE_RESULTS
(NTAPI *PRTL_AVL_COMPARE_ROUTINE) (
struct _RTL_AVL_TABLE *Table,
PVOID FirstStruct,
PVOID SecondStruct
);
typedef RTL_GENERIC_COMPARE_RESULTS
(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) (
struct _RTL_GENERIC_TABLE *Table,
PVOID FirstStruct,
PVOID SecondStruct
);
typedef PVOID
(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) (
struct _RTL_GENERIC_TABLE *Table,
CLONG ByteSize
);
typedef VOID
(NTAPI *PRTL_GENERIC_FREE_ROUTINE) (
struct _RTL_GENERIC_TABLE *Table,
PVOID Buffer
);
typedef PVOID
(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) (
struct _RTL_AVL_TABLE *Table,
CLONG ByteSize
);
typedef VOID
(NTAPI *PRTL_AVL_FREE_ROUTINE) (
struct _RTL_AVL_TABLE *Table,
PVOID Buffer
);
typedef struct _PUBLIC_BCB {
CSHORT NodeTypeCode;
@@ -1390,12 +1534,53 @@ typedef struct _RTL_SPLAY_LINKS {
struct _RTL_SPLAY_LINKS *RightChild;
} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
typedef enum _RTL_GENERIC_COMPARE_RESULTS
typedef struct _RTL_BALANCED_LINKS
{
GenericLessThan,
GenericGreaterThan,
GenericEqual
} RTL_GENERIC_COMPARE_RESULTS;
struct _RTL_BALANCED_LINKS *Parent;
struct _RTL_BALANCED_LINKS *LeftChild;
struct _RTL_BALANCED_LINKS *RightChild;
CHAR Balance;
UCHAR Reserved[3];
} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
typedef struct _RTL_GENERIC_TABLE
{
PRTL_SPLAY_LINKS TableRoot;
LIST_ENTRY InsertOrderList;
PLIST_ENTRY OrderedPointer;
ULONG WhichOrderedElement;
ULONG NumberGenericTableElements;
PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
PVOID TableContext;
} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
typedef struct _RTL_AVL_TABLE
{
RTL_BALANCED_LINKS BalancedRoot;
PVOID OrderedPointer;
ULONG WhichOrderedElement;
ULONG NumberGenericTableElements;
ULONG DepthOfTree;
PRTL_BALANCED_LINKS RestartKey;
ULONG DeleteCount;
PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
PRTL_AVL_FREE_ROUTINE FreeRoutine;
PVOID TableContext;
} RTL_AVL_TABLE, *PRTL_AVL_TABLE;
NTSYSAPI
VOID
NTAPI
RtlInitializeGenericTableAvl(
PRTL_AVL_TABLE Table,
PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
PRTL_AVL_FREE_ROUTINE FreeRoutine,
PVOID TableContext
);
#if defined(USE_LPC6432)
#define LPC_CLIENT_ID CLIENT_ID64
@@ -1442,6 +1627,8 @@ typedef struct _PORT_MESSAGE
};
} PORT_MESSAGE, *PPORT_MESSAGE;
#define LPC_KERNELMODE_MESSAGE (CSHORT)((USHORT)0x8000)
typedef struct _PORT_VIEW
{
ULONG Length;
@@ -1549,16 +1736,6 @@ typedef struct _TUNNEL {
USHORT NumEntries;
} TUNNEL, *PTUNNEL;
typedef struct _VACB {
PVOID BaseAddress;
PSHARED_CACHE_MAP SharedCacheMap;
union {
LARGE_INTEGER FileOffset;
USHORT ActiveCount;
} Overlay;
LIST_ENTRY LruList;
} VACB, *PVACB;
typedef struct _VAD_HEADER {
PVOID StartVPN;
PVOID EndVPN;
@@ -1868,6 +2045,8 @@ CcInitializeCacheMap (
(((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \
)
extern ULONG CcFastMdlReadWait;
NTKERNELAPI
BOOLEAN
NTAPI
@@ -1882,7 +2061,7 @@ CcMapData (
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG Flags,
OUT PVOID *Bcb,
OUT PVOID *Buffer
);
@@ -1915,6 +2094,8 @@ CcMdlWriteComplete (
IN PMDL MdlChain
);
#define MAP_WAIT 1
NTKERNELAPI
BOOLEAN
NTAPI
@@ -1922,11 +2103,7 @@ CcPinMappedData (
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
#if (VER_PRODUCTBUILD >= 2195)
IN ULONG Flags,
#else
IN BOOLEAN Wait,
#endif
IN OUT PVOID *Bcb
);
@@ -1937,11 +2114,7 @@ CcPinRead (
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
#if (VER_PRODUCTBUILD >= 2195)
IN ULONG Flags,
#else
IN BOOLEAN Wait,
#endif
OUT PVOID *Bcb,
OUT PVOID *Buffer
);
@@ -1965,11 +2138,7 @@ CcPreparePinWrite (
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Zero,
#if (VER_PRODUCTBUILD >= 2195)
IN ULONG Flags,
#else
IN BOOLEAN Wait,
#endif
OUT PVOID *Bcb,
OUT PVOID *Buffer
);
@@ -2371,7 +2540,7 @@ FsRtlCopyWrite (
IN PDEVICE_OBJECT DeviceObject
);
NTKERNELAPI
NTSYSAPI
PVOID
NTAPI
RtlCreateHeap (
@@ -2412,7 +2581,7 @@ FsRtlDeregisterUncProvider (
IN HANDLE Handle
);
NTKERNELAPI
NTSYSAPI
PVOID
NTAPI
RtlDestroyHeap(
@@ -2451,6 +2620,11 @@ FsRtlDoesNameContainWildCards (
IN PUNICODE_STRING Name
);
#define FsRtlCompleteRequest(IRP,STATUS) { \
(IRP)->IoStatus.Status = (STATUS); \
IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \
}
#define FsRtlEnterFileSystem KeEnterCriticalRegion
#define FsRtlExitFileSystem KeLeaveCriticalRegion
@@ -2926,11 +3100,12 @@ HalDisplayString (
IN PCHAR String
);
NTHALAPI
VOID
NTKERNELAPI
UCHAR
NTAPI
HalSetRealTimeClock (
IN PTIME_FIELDS TimeFields
KeSetIdealProcessorThread(
IN OUT PKTHREAD Thread,
IN UCHAR Processor
);
NTKERNELAPI
@@ -3274,16 +3449,6 @@ KeInsertQueue (
IN PLIST_ENTRY Entry
);
NTKERNELAPI
BOOLEAN
NTAPI
KeInsertQueueApc (
IN PKAPC Apc,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2,
IN KPRIORITY PriorityBoost
);
NTKERNELAPI
LONG
NTAPI
@@ -3655,6 +3820,14 @@ RtlAllocateHeap (
IN ULONG Size
);
NTSYSAPI
NTSTATUS
NTAPI
RtlAppendStringToString(
PSTRING Destination,
const STRING *Source
);
NTSYSAPI
USHORT
NTAPI
@@ -4419,6 +4592,70 @@ ZwAllocateVirtualMemory (
IN ULONG Protect
);
NTSTATUS
NTAPI
NtAccessCheckByTypeAndAuditAlarm(
IN PUNICODE_STRING SubsystemName,
IN HANDLE HandleId,
IN PUNICODE_STRING ObjectTypeName,
IN PUNICODE_STRING ObjectName,
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN PSID PrincipalSelfSid,
IN ACCESS_MASK DesiredAccess,
IN AUDIT_EVENT_TYPE AuditType,
IN ULONG Flags,
IN POBJECT_TYPE_LIST ObjectTypeList,
IN ULONG ObjectTypeLength,
IN PGENERIC_MAPPING GenericMapping,
IN BOOLEAN ObjectCreation,
OUT PACCESS_MASK GrantedAccess,
OUT PNTSTATUS AccessStatus,
OUT PBOOLEAN GenerateOnClose
);
NTSTATUS
NTAPI
NtAccessCheckByTypeResultListAndAuditAlarm(
IN PUNICODE_STRING SubsystemName,
IN HANDLE HandleId,
IN PUNICODE_STRING ObjectTypeName,
IN PUNICODE_STRING ObjectName,
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN PSID PrincipalSelfSid,
IN ACCESS_MASK DesiredAccess,
IN AUDIT_EVENT_TYPE AuditType,
IN ULONG Flags,
IN POBJECT_TYPE_LIST ObjectTypeList,
IN ULONG ObjectTypeLength,
IN PGENERIC_MAPPING GenericMapping,
IN BOOLEAN ObjectCreation,
OUT PACCESS_MASK GrantedAccess,
OUT PNTSTATUS AccessStatus,
OUT PBOOLEAN GenerateOnClose
);
NTSTATUS
NTAPI
NtAccessCheckByTypeResultListAndAuditAlarmByHandle(
IN PUNICODE_STRING SubsystemName,
IN HANDLE HandleId,
IN HANDLE ClientToken,
IN PUNICODE_STRING ObjectTypeName,
IN PUNICODE_STRING ObjectName,
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN PSID PrincipalSelfSid,
IN ACCESS_MASK DesiredAccess,
IN AUDIT_EVENT_TYPE AuditType,
IN ULONG Flags,
IN POBJECT_TYPE_LIST ObjectTypeList,
IN ULONG ObjectTypeLength,
IN PGENERIC_MAPPING GenericMapping,
IN BOOLEAN ObjectCreation,
OUT PACCESS_MASK GrantedAccess,
OUT PNTSTATUS AccessStatus,
OUT PBOOLEAN GenerateOnClose
);
NTSYSAPI
NTSTATUS
NTAPI
@@ -4550,6 +4787,17 @@ ZwDuplicateToken (
OUT PHANDLE NewTokenHandle
);
NTSTATUS
NTAPI
NtFilterToken(
IN HANDLE ExistingTokenHandle,
IN ULONG Flags,
IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
OUT PHANDLE NewTokenHandle
);
NTSYSAPI
NTSTATUS
NTAPI

View File

@@ -44,7 +44,7 @@ typedef struct _PROCESSOR_IDLE_TIMES {
} PROCESSOR_IDLE_TIMES, *PPROCESSOR_IDLE_TIMES;
typedef BOOLEAN
(DDKFASTAPI*PPROCESSOR_IDLE_HANDLER)(
(FASTCALL*PPROCESSOR_IDLE_HANDLER)(
IN OUT PPROCESSOR_IDLE_TIMES IdleTimes);
typedef struct _PROCESSOR_IDLE_HANDLER_INFO {
@@ -53,11 +53,11 @@ typedef struct _PROCESSOR_IDLE_HANDLER_INFO {
} PROCESSOR_IDLE_HANDLER_INFO, *PPROCESSOR_IDLE_HANDLER_INFO;
typedef VOID
(DDKFASTAPI*PSET_PROCESSOR_THROTTLE)(
(FASTCALL*PSET_PROCESSOR_THROTTLE)(
IN UCHAR Throttle);
typedef NTSTATUS
(DDKFASTAPI*PSET_PROCESSOR_THROTTLE2)(
(FASTCALL*PSET_PROCESSOR_THROTTLE2)(
IN UCHAR Throttle);
#define MAX_IDLE_HANDLERS 3
@@ -82,11 +82,11 @@ typedef enum _POWER_STATE_HANDLER_TYPE {
} POWER_STATE_HANDLER_TYPE, *PPOWER_STATE_HANDLER_TYPE;
typedef NTSTATUS
(DDKAPI*PENTER_STATE_SYSTEM_HANDLER)(
(NTAPI*PENTER_STATE_SYSTEM_HANDLER)(
IN PVOID SystemContext);
typedef NTSTATUS
(DDKAPI*PENTER_STATE_HANDLER)(
(NTAPI*PENTER_STATE_HANDLER)(
IN PVOID Context,
IN PENTER_STATE_SYSTEM_HANDLER SystemHandler OPTIONAL,
IN PVOID SystemContext,
@@ -102,7 +102,7 @@ typedef struct _POWER_STATE_HANDLER {
} POWER_STATE_HANDLER, *PPOWER_STATE_HANDLER;
typedef NTSTATUS
(STDCALL*PENTER_STATE_NOTIFY_HANDLER)(
(NTAPI*PENTER_STATE_NOTIFY_HANDLER)(
IN POWER_STATE_HANDLER_TYPE State,
IN PVOID Context,
IN BOOLEAN Entering);
@@ -112,7 +112,7 @@ typedef struct _POWER_STATE_NOTIFY_HANDLER {
PVOID Context;
} POWER_STATE_NOTIFY_HANDLER, *PPOWER_STATE_NOTIFY_HANDLER;
NTOSAPI
NTSYSCALLAPI
NTSTATUS
DDKAPI
NtPowerInformation(
@@ -154,58 +154,58 @@ typedef struct _PROCESSOR_STATE_HANDLER2 {
PROCESSOR_PERF_LEVEL PerfLevel[1];
} PROCESSOR_STATE_HANDLER2, *PPROCESSOR_STATE_HANDLER2;
NTOSAPI
NTSYSCALLAPI
NTSTATUS
DDKAPI
NTAPI
NtSetThreadExecutionState(
IN EXECUTION_STATE esFlags,
OUT EXECUTION_STATE *PreviousFlags);
NTOSAPI
NTSYSCALLAPI
NTSTATUS
DDKAPI
NTAPI
NtRequestWakeupLatency(
IN LATENCY_TIME latency);
NTOSAPI
NTSYSCALLAPI
NTSTATUS
DDKAPI
NTAPI
NtInitiatePowerAction(
IN POWER_ACTION SystemAction,
IN SYSTEM_POWER_STATE MinSystemState,
IN ULONG Flags,
IN BOOLEAN Asynchronous);
NTOSAPI
NTSYSCALLAPI
NTSTATUS
DDKAPI
NTAPI
NtSetSystemPowerState(
IN POWER_ACTION SystemAction,
IN SYSTEM_POWER_STATE MinSystemState,
IN ULONG Flags);
NTOSAPI
NTSYSCALLAPI
NTSTATUS
DDKAPI
NTAPI
NtGetDevicePowerState(
IN HANDLE Device,
OUT DEVICE_POWER_STATE *State);
NTOSAPI
NTSYSCALLAPI
NTSTATUS
DDKAPI
NTAPI
NtCancelDeviceWakeupRequest(
IN HANDLE Device);
NTOSAPI
NTSYSCALLAPI
BOOLEAN
DDKAPI
NTAPI
NtIsSystemResumeAutomatic(
VOID);
NTOSAPI
NTSYSCALLAPI
NTSTATUS
DDKAPI
NTAPI
NtRequestDeviceWakeup(
IN HANDLE Device);

View File

@@ -52,34 +52,34 @@ typedef enum _BUS_DATA_TYPE {
#pragma pack(pop)
NTOSAPI
NTKERNELAPI
VOID
DDKAPI
ExReleaseResourceForThreadLite(
IN PERESOURCE Resource,
IN ERESOURCE_THREAD ResourceThreadId);
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKFASTAPI
FASTCALL
IoReadPartitionTable(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,
IN BOOLEAN ReturnRecognizedPartitions,
OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKFASTAPI
FASTCALL
IoSetPartitionInformation(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,
IN ULONG PartitionNumber,
IN ULONG PartitionType);
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKFASTAPI
FASTCALL
IoWritePartitionTable(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG SectorSize,

View File

@@ -41,12 +41,6 @@ extern "C" {
#define DDKAPI __stdcall
#define FASTCALL __fastcall
#define DDKCDECLAPI __cdecl
#ifndef DDKFASTAPI
#define DDKFASTAPI
#endif
#ifndef NTOSAPI
#define NTOSAPI
#endif
#ifdef _NTOSKRNL_
/* HACKHACKHACK!!! We shouldn't include this header from ntoskrnl! */
@@ -154,10 +148,20 @@ typedef ULONG WAIT_TYPE;
#define WaitAny 1
typedef HANDLE TRACEHANDLE;
typedef PVOID PWMILIB_CONTEXT;
typedef PVOID PSYSCTL_IRP_DISPOSITION;
typedef ULONG LOGICAL;
#endif
/*
** WmiLib specific structure
*/
typedef enum
{
IrpProcessed, // Irp was processed and possibly completed
IrpNotCompleted, // Irp was process and NOT completed
IrpNotWmi, // Irp is not a WMI irp
IrpForward // Irp is wmi irp, but targeted at another device object
} SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION;
/*
** Routines specific to this DDK
*/
@@ -244,6 +248,8 @@ typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
#define MAXIMUM_SUSPEND_COUNT MAXCHAR
#define MAXIMUM_FILENAME_LENGTH 256
#define FILE_SUPERSEDED 0x00000000
#define FILE_OPENED 0x00000001
#define FILE_CREATED 0x00000002
@@ -401,6 +407,7 @@ extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
extern POBJECT_TYPE NTSYSAPI PsThreadType;
extern POBJECT_TYPE NTSYSAPI LpcPortObjectType;
extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
extern POBJECT_TYPE NTSYSAPI PsProcessType;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
extern volatile CCHAR NTSYSAPI KeNumberProcessors;
@@ -432,6 +439,11 @@ typedef struct _KSYSTEM_TIME
extern volatile KSYSTEM_TIME KeTickCount;
#define NX_SUPPORT_POLICY_ALWAYSOFF 0
#define NX_SUPPORT_POLICY_ALWAYSON 1
#define NX_SUPPORT_POLICY_OPTIN 2
#define NX_SUPPORT_POLICY_OPTOUT 3
typedef struct _KUSER_SHARED_DATA
{
ULONG TickCountLowDeprecated;
@@ -625,6 +637,28 @@ typedef IO_ALLOCATION_ACTION
IN PVOID MapRegisterBase,
IN PVOID Context);
typedef struct _EXCEPTION_RECORD32
{
NTSTATUS ExceptionCode;
ULONG ExceptionFlags;
ULONG ExceptionRecord;
ULONG ExceptionAddress;
ULONG NumberParameters;
ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
typedef struct _EXCEPTION_RECORD64
{
NTSTATUS ExceptionCode;
ULONG ExceptionFlags;
ULONG64 ExceptionRecord;
ULONG64 ExceptionAddress;
ULONG NumberParameters;
ULONG __unusedAlignment;
ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
typedef EXCEPTION_DISPOSITION
(DDKAPI *PEXCEPTION_ROUTINE)(
IN struct _EXCEPTION_RECORD *ExceptionRecord,
@@ -640,20 +674,23 @@ typedef VOID
IN PVOID Context);
typedef NTSTATUS
(DDKAPI *PDRIVER_ADD_DEVICE)(
(DDKAPI DRIVER_ADD_DEVICE)(
IN struct _DRIVER_OBJECT *DriverObject,
IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
typedef NTSTATUS
(DDKAPI *PIO_COMPLETION_ROUTINE)(
(DDKAPI IO_COMPLETION_ROUTINE)(
IN struct _DEVICE_OBJECT *DeviceObject,
IN struct _IRP *Irp,
IN PVOID Context);
typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
typedef VOID
(DDKAPI *PDRIVER_CANCEL)(
(DDKAPI DRIVER_CANCEL)(
IN struct _DEVICE_OBJECT *DeviceObject,
IN struct _IRP *Irp);
typedef DRIVER_CANCEL *PDRIVER_CANCEL;
typedef VOID
(DDKAPI *PKDEFERRED_ROUTINE)(
@@ -663,9 +700,10 @@ typedef VOID
IN PVOID SystemArgument2);
typedef NTSTATUS
(DDKAPI *PDRIVER_DISPATCH)(
(DDKAPI DRIVER_DISPATCH)(
IN struct _DEVICE_OBJECT *DeviceObject,
IN struct _IRP *Irp);
typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
typedef VOID
(DDKAPI *PIO_DPC_ROUTINE)(
@@ -688,14 +726,16 @@ typedef NTSTATUS
IN PUNICODE_STRING RegistryPath);
typedef NTSTATUS
(DDKAPI *PDRIVER_INITIALIZE)(
(DDKAPI DRIVER_INITIALIZE)(
IN struct _DRIVER_OBJECT *DriverObject,
IN PUNICODE_STRING RegistryPath);
typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
typedef BOOLEAN
(DDKAPI *PKSERVICE_ROUTINE)(
(DDKAPI KSERVICE_ROUTINE)(
IN struct _KINTERRUPT *Interrupt,
IN PVOID ServiceContext);
typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
typedef VOID
(DDKAPI *PIO_TIMER_ROUTINE)(
@@ -709,17 +749,19 @@ typedef VOID
IN ULONG Count);
typedef VOID
(DDKAPI *PDRIVER_STARTIO)(
(DDKAPI DRIVER_STARTIO)(
IN struct _DEVICE_OBJECT *DeviceObject,
IN struct _IRP *Irp);
typedef DRIVER_STARTIO *PDRIVER_STARTIO;
typedef BOOLEAN
(DDKAPI *PKSYNCHRONIZE_ROUTINE)(
IN PVOID SynchronizeContext);
typedef VOID
(DDKAPI *PDRIVER_UNLOAD)(
(DDKAPI DRIVER_UNLOAD)(
IN struct _DRIVER_OBJECT *DriverObject);
typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
@@ -1207,8 +1249,8 @@ typedef struct _EX_RUNDOWN_REF
{
union
{
ULONG_PTR Count;
PVOID Ptr;
__volatile ULONG_PTR Count;
__volatile PVOID Ptr;
};
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
@@ -1303,7 +1345,7 @@ typedef struct _IRP {
ULONG Flags;
union {
struct _IRP *MasterIrp;
LONG IrpCount;
__volatile LONG IrpCount;
PVOID SystemBuffer;
} AssociatedIrp;
LIST_ENTRY ThreadListEntry;
@@ -1325,7 +1367,7 @@ typedef struct _IRP {
} AsynchronousParameters;
LARGE_INTEGER AllocationSize;
} Overlay;
PDRIVER_CANCEL CancelRoutine;
__volatile PDRIVER_CANCEL CancelRoutine;
PVOID UserBuffer;
union {
struct {
@@ -2128,7 +2170,7 @@ typedef struct _DEVICE_OBJECT {
PIO_TIMER Timer;
ULONG Flags;
ULONG Characteristics;
PVPB Vpb;
__volatile PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType;
CCHAR StackSize;
@@ -2564,6 +2606,10 @@ typedef struct
DEBUG_MEMORY_REQUIREMENTS Memory;
} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
typedef enum _KD_OPTION {
KD_OPTION_SET_BLOCK_ENABLE,
} KD_OPTION;
/* Function Type Defintions for Dispatch Functions */
typedef VOID
@@ -3084,8 +3130,8 @@ typedef struct _ERESOURCE {
POWNER_ENTRY OwnerTable;
SHORT ActiveCount;
USHORT Flag;
PKSEMAPHORE SharedWaiters;
PKEVENT ExclusiveWaiters;
__volatile PKSEMAPHORE SharedWaiters;
__volatile PKEVENT ExclusiveWaiters;
OWNER_ENTRY OwnerThreads[2];
ULONG ContentionCount;
USHORT NumberOfSharedWaiters;
@@ -3391,10 +3437,10 @@ typedef struct _IO_COMPLETION_CONTEXT {
#define FO_RANDOM_ACCESS 0x00100000
#define FO_FILE_OPEN_CANCELLED 0x00200000
#define FO_VOLUME_OPEN 0x00400000
#define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000
#define FO_REMOTE_ORIGIN 0x01000000
typedef struct _FILE_OBJECT {
typedef struct _FILE_OBJECT
{
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
@@ -3416,12 +3462,15 @@ typedef struct _FILE_OBJECT {
ULONG Flags;
UNICODE_STRING FileName;
LARGE_INTEGER CurrentByteOffset;
ULONG Waiters;
ULONG Busy;
__volatile ULONG Waiters;
__volatile ULONG Busy;
PVOID LastLock;
KEVENT Lock;
KEVENT Event;
PIO_COMPLETION_CONTEXT CompletionContext;
__volatile PIO_COMPLETION_CONTEXT CompletionContext;
KSPIN_LOCK IrpListLock;
LIST_ENTRY IrpList;
__volatile PVOID FileObjectExtension;
} FILE_OBJECT;
typedef struct _FILE_OBJECT *PFILE_OBJECT;
@@ -3772,6 +3821,7 @@ typedef struct _IO_STACK_LOCATION {
/* IO_STACK_LOCATION.Control */
#define SL_PENDING_RETURNED 0x01
#define SL_ERROR_RETURNED 0x02
#define SL_INVOKE_ON_CANCEL 0x20
#define SL_INVOKE_ON_SUCCESS 0x40
#define SL_INVOKE_ON_ERROR 0x80
@@ -4398,7 +4448,7 @@ typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
BOOLEAN Removed;
BOOLEAN Reserved[3];
LONG IoCount;
__volatile LONG IoCount;
KEVENT RemoveEvent;
} IO_REMOVE_LOCK_COMMON_BLOCK;
@@ -4409,7 +4459,7 @@ typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
LONG AllocateTag;
LIST_ENTRY LockList;
KSPIN_LOCK Spin;
LONG LowMemoryCount;
__volatile LONG LowMemoryCount;
ULONG Reserved1[4];
PVOID Reserved2;
PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
@@ -4425,9 +4475,10 @@ typedef struct _IO_REMOVE_LOCK {
typedef struct _IO_WORKITEM *PIO_WORKITEM;
typedef VOID
(DDKAPI *PIO_WORKITEM_ROUTINE)(
(DDKAPI IO_WORKITEM_ROUTINE)(
IN PDEVICE_OBJECT DeviceObject,
IN PVOID Context);
typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
typedef struct _SHARE_ACCESS {
ULONG OpenCount;
@@ -4580,7 +4631,7 @@ typedef VOID
typedef struct _WORK_QUEUE_ITEM {
LIST_ENTRY List;
PWORKER_THREAD_ROUTINE WorkerRoutine;
PVOID Parameter;
__volatile PVOID Parameter;
} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
typedef enum _KBUGCHECK_CALLBACK_REASON {
@@ -5216,6 +5267,109 @@ typedef struct _KFLOATING_SAVE {
ULONG Spare1;
} KFLOATING_SAVE, *PKFLOATING_SAVE;
static __inline
ULONG
DDKAPI
KeGetCurrentProcessorNumber(VOID)
{
#if defined(__GNUC__)
ULONG ret;
__asm__ __volatile__ (
"movl %%fs:%c1, %0\n"
: "=r" (ret)
: "i" (FIELD_OFFSET(KPCR, Number))
);
return ret;
#elif defined(_MSC_VER)
#if _MSC_FULL_VER >= 13012035
return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
#else
__asm { movzx eax, _PCR KPCR.Number }
#endif
#else
#error Unknown compiler
#endif
}
#elif defined(__x86_64__)
typedef struct _KFLOATING_SAVE {
ULONG Dummy;
} KFLOATING_SAVE, *PKFLOATING_SAVE;
#elif defined(__PowerPC__)
typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
#define PASSIVE_LEVEL 0
#define LOW_LEVEL 0
#define APC_LEVEL 1
#define DISPATCH_LEVEL 2
#define PROFILE_LEVEL 27
#define CLOCK1_LEVEL 28
#define CLOCK2_LEVEL 28
#define IPI_LEVEL 29
#define POWER_LEVEL 30
#define HIGH_LEVEL 31
typedef struct _KFLOATING_SAVE {
ULONG Dummy;
} KFLOATING_SAVE, *PKFLOATING_SAVE;
typedef struct _KPCR_TIB {
PVOID ExceptionList; /* 00 */
PVOID StackBase; /* 04 */
PVOID StackLimit; /* 08 */
PVOID SubSystemTib; /* 0C */
_ANONYMOUS_UNION union {
PVOID FiberData; /* 10 */
DWORD Version; /* 10 */
} DUMMYUNIONNAME;
PVOID ArbitraryUserPointer; /* 14 */
struct _KPCR_TIB *Self; /* 18 */
} KPCR_TIB, *PKPCR_TIB; /* 1C */
#define PCR_MINOR_VERSION 1
#define PCR_MAJOR_VERSION 1
typedef struct _KPCR {
KPCR_TIB Tib; /* 00 */
struct _KPCR *Self; /* 1C */
struct _KPRCB *Prcb; /* 20 */
KIRQL Irql; /* 24 */
ULONG IRR; /* 28 */
ULONG IrrActive; /* 2C */
ULONG IDR; /* 30 */
PVOID KdVersionBlock; /* 34 */
PUSHORT IDT; /* 38 */
PUSHORT GDT; /* 3C */
struct _KTSS *TSS; /* 40 */
USHORT MajorVersion; /* 44 */
USHORT MinorVersion; /* 46 */
KAFFINITY SetMember; /* 48 */
ULONG StallScaleFactor; /* 4C */
UCHAR SpareUnused; /* 50 */
UCHAR Number; /* 51 */
} KPCR, *PKPCR; /* 54 */
static __inline
ULONG
DDKAPI
KeGetCurrentProcessorNumber(VOID)
{
ULONG Number;
__asm__ __volatile__ (
"lwz %0, %c1(12)\n"
: "=r" (Number)
: "i" (FIELD_OFFSET(KPCR, Number))
);
return Number;
}
#else
#error Unknown architecture
#endif
#define PAGE_SIZE 0x1000
#define PAGE_SHIFT 12L
@@ -5246,36 +5400,53 @@ typedef enum _INTERLOCKED_RESULT {
ResultPositive = RESULT_POSITIVE
} INTERLOCKED_RESULT;
typedef VOID
(NTAPI *PciPin2Line)(
IN struct _BUS_HANDLER *BusHandler,
IN struct _BUS_HANDLER *RootHandler,
IN PCI_SLOT_NUMBER SlotNumber,
IN PPCI_COMMON_CONFIG PciData
);
typedef VOID
(NTAPI *PciLine2Pin)(
IN struct _BUS_HANDLER *BusHandler,
IN struct _BUS_HANDLER *RootHandler,
IN PCI_SLOT_NUMBER SlotNumber,
IN PPCI_COMMON_CONFIG PciNewData,
IN PPCI_COMMON_CONFIG PciOldData
);
typedef VOID
(NTAPI *PciReadWriteConfig)(
IN struct _BUS_HANDLER *BusHandler,
IN PCI_SLOT_NUMBER Slot,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
#define PCI_DATA_TAG TAG('P', 'C', 'I', ' ')
#define PCI_DATA_VERSION 1
typedef struct _PCIBUSDATA
{
ULONG Tag;
ULONG Version;
PciReadWriteConfig ReadConfig;
PciReadWriteConfig WriteConfig;
PciPin2Line Pin2Line;
PciLine2Pin Line2Pin;
PCI_SLOT_NUMBER ParentSlot;
PVOID Reserved[4];
} PCIBUSDATA, *PPCIBUSDATA;
NTHALAPI
KIRQL
DDKAPI
KeGetCurrentIrql(
VOID);
static __inline
ULONG
DDKAPI
KeGetCurrentProcessorNumber(VOID)
{
#if defined(__GNUC__)
ULONG ret;
__asm__ __volatile__ (
"movl %%fs:%c1, %0\n"
: "=r" (ret)
: "i" (FIELD_OFFSET(KPCR, Number))
);
return ret;
#elif defined(_MSC_VER)
#if _MSC_FULL_VER >= 13012035
return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
#else
__asm { movzx eax, _PCR KPCR.Number }
#endif
#else
#error Unknown compiler
#endif
}
#if !defined(__INTERLOCKED_DECLARED)
#define __INTERLOCKED_DECLARED
@@ -5363,179 +5534,12 @@ KfReleaseSpinLock(
IN PKSPIN_LOCK SpinLock,
IN KIRQL NewIrql);
#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
#define RtlCopyMemoryNonTemporal RtlCopyMemory
#define KeGetDcacheFillSize() 1L
#elif defined(_M_PPC)
#define PAGE_SIZE 0x1000
#define PAGE_SHIFT 12L
typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
#define PASSIVE_LEVEL 0
#define LOW_LEVEL 0
#define APC_LEVEL 1
#define DISPATCH_LEVEL 2
#define PROFILE_LEVEL 27
#define CLOCK1_LEVEL 28
#define CLOCK2_LEVEL 28
#define IPI_LEVEL 29
#define SYNCH_LEVEL (IPI_LEVEL-1)
#define POWER_LEVEL 30
#define HIGH_LEVEL 31
extern NTOSAPI PVOID MmHighestUserAddress;
extern NTOSAPI PVOID MmSystemRangeStart;
extern NTOSAPI ULONG_PTR MmUserProbeAddress;
#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
#define MM_SYSTEM_RANGE_START MmSystemRangeStart
#define MM_USER_PROBE_ADDRESS MmUserProbeAddress
#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
#define KI_USER_SHARED_DATA 0xffdf0000
#define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
#define EFLAG_SIGN 0x8000
#define EFLAG_ZERO 0x4000
#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
typedef struct _KPCR_TIB {
PVOID ExceptionList; /* 00 */
PVOID StackBase; /* 04 */
PVOID StackLimit; /* 08 */
PVOID SubSystemTib; /* 0C */
_ANONYMOUS_UNION union {
PVOID FiberData; /* 10 */
DWORD Version; /* 10 */
} DUMMYUNIONNAME;
PVOID ArbitraryUserPointer; /* 14 */
struct _KPCR_TIB *Self; /* 18 */
} KPCR_TIB, *PKPCR_TIB; /* 1C */
#define PCR_MINOR_VERSION 1
#define PCR_MAJOR_VERSION 1
typedef struct _KPCR {
KPCR_TIB Tib; /* 00 */
struct _KPCR *Self; /* 1C */
struct _KPRCB *Prcb; /* 20 */
KIRQL Irql; /* 24 */
ULONG IRR; /* 28 */
ULONG IrrActive; /* 2C */
ULONG IDR; /* 30 */
PVOID KdVersionBlock; /* 34 */
PUSHORT IDT; /* 38 */
PUSHORT GDT; /* 3C */
struct _KTSS *TSS; /* 40 */
USHORT MajorVersion; /* 44 */
USHORT MinorVersion; /* 46 */
KAFFINITY SetMember; /* 48 */
ULONG StallScaleFactor; /* 4C */
UCHAR SpareUnused; /* 50 */
UCHAR Number; /* 51 */
} KPCR, *PKPCR; /* 54 */
#if !defined(__INTERLOCKED_DECLARED)
#define __INTERLOCKED_DECLARED
NTHALAPI
KIRQL
DDKAPI
KeGetCurrentIrql(
VOID);
NTOSAPI
LONG
DDKFASTAPI
InterlockedIncrement(
IN PLONG VOLATILE Addend);
NTOSAPI
LONG
DDKFASTAPI
InterlockedDecrement(
IN PLONG VOLATILE Addend);
NTOSAPI
LONG
DDKFASTAPI
InterlockedCompareExchange(
IN OUT PLONG VOLATILE Destination,
IN LONG Exchange,
IN LONG Comparand);
NTOSAPI
LONG
DDKFASTAPI
InterlockedExchange(
IN OUT PLONG VOLATILE Target,
IN LONG Value);
NTOSAPI
LONG
DDKFASTAPI
InterlockedExchangeAdd(
IN OUT PLONG VOLATILE Addend,
IN LONG Value);
/*
* PVOID
* InterlockedExchangePointer(
* IN OUT PVOID VOLATILE *Target,
* IN PVOID Value)
*/
#define InterlockedExchangePointer(Target, Value) \
((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
/*
* PVOID
* InterlockedCompareExchangePointer(
* IN OUT PVOID *Destination,
* IN PVOID Exchange,
* IN PVOID Comparand)
*/
#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
#endif /* !__INTERLOCKED_DECLARED */
NTOSAPI
VOID
DDKFASTAPI
KefAcquireSpinLockAtDpcLevel(
IN PKSPIN_LOCK SpinLock);
NTOSAPI
VOID
DDKFASTAPI
KefReleaseSpinLockFromDpcLevel(
IN PKSPIN_LOCK SpinLock);
NTHALAPI
KIRQL
DDKFASTAPI
KfAcquireSpinLock(
IN PKSPIN_LOCK SpinLock);
NTHALAPI
VOID
DDKFASTAPI
KfReleaseSpinLock(
IN PKSPIN_LOCK SpinLock,
IN KIRQL NewIrql);
NTKERNELAPI
BOOLEAN
FASTCALL
KeTryToAcquireSpinLockAtDpcLevel(
IN OUT PKSPIN_LOCK SpinLock
);
#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
@@ -5546,31 +5550,14 @@ KfReleaseSpinLock(
#define KeGetDcacheFillSize() 1L
typedef enum _INTERLOCKED_RESULT {
ResultNegative = -1,
ResultZero = 0,
ResultPositive = 1
} INTERLOCKED_RESULT;
typedef struct _KFLOATING_SAVE {
ULONG Fr[32];
} KFLOATING_SAVE, *PKFLOATING_SAVE;
static __inline
ULONG
DDKAPI
KeGetCurrentProcessorNumber(VOID)
{
return 0; // XXX arty fixme
}
#endif /* _X86_ */
/*
** Utillity functions
*/
#define ARGUMENT_PRESENT(ArgumentPointer) \
((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
/*
* ULONG
@@ -5693,16 +5680,14 @@ extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
/** Runtime library routines **/
VOID
FORCEINLINE
static __inline VOID
InitializeListHead(
IN PLIST_ENTRY ListHead)
{
ListHead->Flink = ListHead->Blink = ListHead;
}
VOID
FORCEINLINE
static __inline VOID
InsertHeadList(
IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY Entry)
@@ -5715,8 +5700,7 @@ InsertHeadList(
ListHead->Flink = Entry;
}
VOID
FORCEINLINE
static __inline VOID
InsertTailList(
IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY Entry)
@@ -5761,8 +5745,7 @@ InsertTailList(
(_Entry)->Next = (_ListHead)->Next; \
(_ListHead)->Next = (_Entry); \
BOOLEAN
FORCEINLINE
static __inline BOOLEAN
RemoveEntryList(
IN PLIST_ENTRY Entry)
{
@@ -5776,8 +5759,7 @@ RemoveEntryList(
return (OldFlink == OldBlink);
}
PLIST_ENTRY
FORCEINLINE
static __inline PLIST_ENTRY
RemoveHeadList(
IN PLIST_ENTRY ListHead)
{
@@ -5791,8 +5773,7 @@ RemoveHeadList(
return Entry;
}
PLIST_ENTRY
FORCEINLINE
static __inline PLIST_ENTRY
RemoveTailList(
IN PLIST_ENTRY ListHead)
{
@@ -6467,8 +6448,8 @@ RtlUlonglongByteSwap(
((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
)
VOID
FORCEINLINE
VOID
RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString,
IN PWSTR Buffer,
IN USHORT BufferSize)
@@ -6478,8 +6459,8 @@ RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString,
UnicodeString->Buffer = Buffer;
}
VOID
FORCEINLINE
VOID
RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
IN PCHAR Buffer,
IN USHORT BufferSize)
@@ -6606,6 +6587,12 @@ RtlxUnicodeStringToAnsiSize(
#define RtlZeroBytes RtlZeroMemory
#endif
NTKERNELAPI
BOOLEAN
NTAPI
KeAreAllApcsDisabled(
VOID
);
/* Guarded Mutex routines */
@@ -6665,6 +6652,22 @@ KeTryToAcquireGuardedMutex(
IN OUT PKGUARDED_MUTEX GuardedMutex
);
NTKERNELAPI
BOOLEAN
FASTCALL
ExAcquireRundownProtectionEx(
IN OUT PEX_RUNDOWN_REF RunRef,
IN ULONG Count
);
NTKERNELAPI
VOID
FASTCALL
ExReleaseRundownProtectionEx(
IN OUT PEX_RUNDOWN_REF RunRef,
IN ULONG Count
);
/* Fast Mutex */
#define ExInitializeFastMutex(_FastMutex) \
{ \
@@ -7196,12 +7199,6 @@ ExSystemTimeToLocalTime(
IN PLARGE_INTEGER SystemTime,
OUT PLARGE_INTEGER LocalTime);
NTKERNELAPI
BOOLEAN
NTAPI
ExTryToAcquireResourceExclusiveLite(
IN PERESOURCE Resource);
NTKERNELAPI
VOID
NTAPI
@@ -8969,15 +8966,6 @@ KeMemoryBarrier(
#endif
}
#elif defined(_PPC_)
static __inline
VOID
KeMemoryBarrier(
VOID)
{
}
#endif
NTKERNELAPI
@@ -9298,7 +9286,7 @@ KeRaiseIrqlToSynchLevel(
#define KeLowerIrql(a) KfLowerIrql(a)
#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
#elif defined(_PPC_)
#elif defined(__PowerPC__)
NTHALAPI
VOID
@@ -9339,7 +9327,8 @@ NTKERNELAPI
KIRQL
NTAPI
KeRaiseIrql(
IN KIRQL NewIrql);
IN KIRQL NewIrql,
OUT PKIRQL OldIrql);
NTKERNELAPI
KIRQL
@@ -9347,9 +9336,11 @@ NTAPI
KeRaiseIrqlToDpcLevel(
VOID);
#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
NTKERNELAPI
KIRQL
DDKAPI
KeRaiseIrqlToSynchLevel(
VOID);
#endif
@@ -9407,19 +9398,6 @@ NTAPI
MmBuildMdlForNonPagedPool(
IN OUT PMDL MemoryDescriptorList);
NTKERNELAPI
NTSTATUS
NTAPI
MmCreateSection(
OUT PVOID *SectionObject,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN PLARGE_INTEGER MaximumSize,
IN ULONG SectionPageProtection,
IN ULONG AllocationAttributes,
IN HANDLE FileHandle OPTIONAL,
IN PFILE_OBJECT File OPTIONAL);
typedef enum _MMFLUSH_TYPE {
MmFlushForDelete,
MmFlushForWrite
@@ -10085,6 +10063,7 @@ NTAPI
PsTerminateSystemThread(
IN NTSTATUS ExitStatus);
extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
/** Security reference monitor routines **/
@@ -10688,7 +10667,6 @@ PoUnregisterSystemState(
/** WMI library support routines **/
NTKERNELAPI
NTSTATUS
NTAPI
WmiCompleteRequest(
@@ -10698,7 +10676,6 @@ WmiCompleteRequest(
IN ULONG BufferUsed,
IN CCHAR PriorityBoost);
NTKERNELAPI
NTSTATUS
NTAPI
WmiFireEvent(
@@ -10718,7 +10695,6 @@ WmiQueryTraceInformation(
OUT PULONG RequiredLength OPTIONAL,
IN PVOID Buffer OPTIONAL);
NTKERNELAPI
NTSTATUS
NTAPI
WmiSystemControl(
@@ -10777,13 +10753,13 @@ DbgBreakPointWithStatus(
IN ULONG Status);
ULONG
__cdecl
DDKCDECLAPI
DbgPrint(
IN PCCH Format,
IN ...);
ULONG
__cdecl
DDKCDECLAPI
DbgPrintEx(
IN ULONG ComponentId,
IN ULONG Level,

File diff suppressed because it is too large Load Diff

View File

@@ -52,9 +52,9 @@ ExAllocateFromZone(
return (PVOID) Zone->FreeList.Next;
}
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKAPI
NTAPI
ExExtendZone(
IN PZONE_HEADER Zone,
IN PVOID Segment,
@@ -70,9 +70,9 @@ ExFreeToZone(
return ((PSINGLE_LIST_ENTRY) Block)->Next;
}
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKAPI
NTAPI
ExInitializeZone(
IN PZONE_HEADER Zone,
IN ULONG BlockSize,
@@ -89,18 +89,18 @@ ExInitializeZone(
Lock) \
((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKAPI
NTAPI
ExInterlockedExtendZone(
IN PZONE_HEADER Zone,
IN PVOID Segment,
IN ULONG SegmentSize,
IN PKSPIN_LOCK Lock);
NTOSAPI
NTKERNELAPI
PVOID
DDKAPI
NTAPI
ExInterlockedFreeToZone(
IN PZONE_HEADER Zone,
IN PVOID Block,
@@ -130,23 +130,23 @@ ExInterlockedFreeToZone(
#define ExIsFullZone(Zone) \
((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
NTOSAPI
NTKERNELAPI
VOID
DDKAPI
NTAPI
ExQueueWorkItem(
IN PWORK_QUEUE_ITEM WorkItem,
IN WORK_QUEUE_TYPE QueueType);
NTOSAPI
NTKERNELAPI
BOOLEAN
DDKAPI
NTAPI
ExIsObjectInFirstZoneSegment(
IN PZONE_HEADER Zone,
IN PVOID Object);
NTOSAPI
NTKERNELAPI
VOID
DDKAPI
NTAPI
ExReleaseResource(
IN PERESOURCE Resource);
@@ -160,37 +160,37 @@ ExReleaseResource(
#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
NTOSAPI
NTKERNELAPI
INTERLOCKED_RESULT
DDKAPI
NTAPI
ExInterlockedDecrementLong(
IN PLONG Addend,
IN PKSPIN_LOCK Lock);
NTOSAPI
NTKERNELAPI
ULONG
DDKAPI
NTAPI
ExInterlockedExchangeUlong(
IN PULONG Target,
IN ULONG Value,
IN PKSPIN_LOCK Lock);
NTOSAPI
NTKERNELAPI
INTERLOCKED_RESULT
DDKAPI
NTAPI
ExInterlockedIncrementLong(
IN PLONG Addend,
IN PKSPIN_LOCK Lock);
NTHALAPI
VOID
DDKAPI
NTAPI
HalAcquireDisplayOwnership(
IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
NTHALAPI
NTSTATUS
DDKAPI
NTAPI
HalAllocateAdapterChannel(
IN PADAPTER_OBJECT AdapterObject,
IN PWAIT_CONTEXT_BLOCK Wcb,
@@ -199,7 +199,7 @@ HalAllocateAdapterChannel(
NTHALAPI
PVOID
DDKAPI
NTAPI
HalAllocateCommonBuffer(
IN PADAPTER_OBJECT AdapterObject,
IN ULONG Length,
@@ -208,7 +208,7 @@ HalAllocateCommonBuffer(
NTHALAPI
NTSTATUS
DDKAPI
NTAPI
HalAssignSlotResources(
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName,
@@ -221,7 +221,7 @@ HalAssignSlotResources(
NTHALAPI
VOID
DDKAPI
NTAPI
HalFreeCommonBuffer(
IN PADAPTER_OBJECT AdapterObject,
IN ULONG Length,
@@ -231,14 +231,14 @@ HalFreeCommonBuffer(
NTHALAPI
PADAPTER_OBJECT
DDKAPI
NTAPI
HalGetAdapter(
IN PDEVICE_DESCRIPTION DeviceDescription,
IN OUT PULONG NumberOfMapRegisters);
NTHALAPI
ULONG
DDKAPI
NTAPI
HalGetBusData(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
@@ -248,7 +248,7 @@ HalGetBusData(
NTHALAPI
ULONG
DDKAPI
NTAPI
HalGetBusDataByOffset(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
@@ -259,13 +259,13 @@ HalGetBusDataByOffset(
NTHALAPI
ULONG
DDKAPI
NTAPI
HalGetDmaAlignmentRequirement(
VOID);
NTHALAPI
ULONG
DDKAPI
NTAPI
HalGetInterruptVector(
IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
@@ -276,13 +276,13 @@ HalGetInterruptVector(
NTHALAPI
ULONG
DDKAPI
NTAPI
HalReadDmaCounter(
IN PADAPTER_OBJECT AdapterObject);
NTHALAPI
ULONG
DDKAPI
NTAPI
HalSetBusData(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
@@ -292,7 +292,7 @@ HalSetBusData(
NTHALAPI
ULONG
DDKAPI
NTAPI
HalSetBusDataByOffset(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
@@ -303,7 +303,7 @@ HalSetBusDataByOffset(
NTHALAPI
BOOLEAN
DDKAPI
NTAPI
HalTranslateBusAddress(
IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
@@ -311,9 +311,9 @@ HalTranslateBusAddress(
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress);
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKAPI
NTAPI
IoAllocateAdapterChannel(
IN PADAPTER_OBJECT AdapterObject,
IN PDEVICE_OBJECT DeviceObject,
@@ -321,9 +321,9 @@ IoAllocateAdapterChannel(
IN PDRIVER_CONTROL ExecutionRoutine,
IN PVOID Context);
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKAPI
NTAPI
IoAssignResources(
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName OPTIONAL,
@@ -332,16 +332,16 @@ IoAssignResources(
IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
IN OUT PCM_RESOURCE_LIST *AllocatedResources);
NTOSAPI
NTKERNELAPI
NTSTATUS
DDKAPI
NTAPI
IoAttachDeviceByPointer(
IN PDEVICE_OBJECT SourceDevice,
IN PDEVICE_OBJECT TargetDevice);
NTHALAPI
BOOLEAN
DDKAPI
NTAPI
IoFlushAdapterBuffers(
IN PADAPTER_OBJECT AdapterObject,
IN PMDL Mdl,
@@ -352,13 +352,13 @@ IoFlushAdapterBuffers(
NTHALAPI
VOID
DDKAPI
NTAPI
IoFreeAdapterChannel(
IN PADAPTER_OBJECT AdapterObject);
NTHALAPI
VOID
DDKAPI
NTAPI
IoFreeMapRegisters(
IN PADAPTER_OBJECT AdapterObject,
IN PVOID MapRegisterBase,
@@ -366,7 +366,7 @@ IoFreeMapRegisters(
NTHALAPI
PHYSICAL_ADDRESS
DDKAPI
NTAPI
IoMapTransfer(
IN PADAPTER_OBJECT AdapterObject,
IN PMDL Mdl,
@@ -375,196 +375,196 @@ IoMapTransfer(
IN OUT PULONG Length,
IN BOOLEAN WriteToDevice);
NTOSAPI
NTKERNELAPI
PMDL
DDKAPI
NTAPI
MmCreateMdl(
IN PMDL MemoryDescriptorList OPTIONAL,
IN PVOID Base,
IN SIZE_T Length);
NTOSAPI
NTKERNELAPI
BOOLEAN
DDKAPI
NTAPI
MmIsNonPagedSystemAddressValid(
IN PVOID VirtualAddress);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlEnlargedIntegerMultiply(
IN LONG Multiplicand,
IN LONG Multiplier);
NTOSAPI
NTSYSAPI
ULONG
DDKAPI
NTAPI
RtlEnlargedUnsignedDivide(
IN ULARGE_INTEGER Dividend,
IN ULONG Divisor,
IN OUT PULONG Remainder);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlEnlargedUnsignedMultiply(
IN ULONG Multiplicand,
IN ULONG Multiplier);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlExtendedIntegerMultiply(
IN LARGE_INTEGER Multiplicand,
IN LONG Multiplier);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlExtendedLargeIntegerDivide(
IN LARGE_INTEGER Dividend,
IN ULONG Divisor,
IN OUT PULONG Remainder);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlExtendedMagicDivide(
IN LARGE_INTEGER Dividend,
IN LARGE_INTEGER MagicDivisor,
IN CCHAR ShiftCount);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlLargeIntegerAdd(
IN LARGE_INTEGER Addend1,
IN LARGE_INTEGER Addend2);
NTOSAPI
NTSYSAPI
VOID
DDKAPI
NTAPI
RtlLargeIntegerAnd(
IN OUT LARGE_INTEGER Result,
IN LARGE_INTEGER Source,
IN LARGE_INTEGER Mask);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlLargeIntegerArithmeticShift(
IN LARGE_INTEGER LargeInteger,
IN CCHAR ShiftCount);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlLargeIntegerDivide(
IN LARGE_INTEGER Dividend,
IN LARGE_INTEGER Divisor,
IN OUT PLARGE_INTEGER Remainder);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerEqualTo(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerEqualToZero(
IN LARGE_INTEGER Operand);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerGreaterOrEqualToZero(
IN LARGE_INTEGER Operand);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerGreaterThan(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerGreaterThanOrEqualTo(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerGreaterThanZero(
IN LARGE_INTEGER Operand);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerLessOrEqualToZero(
IN LARGE_INTEGER Operand);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerLessThan(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerLessThanOrEqualTo(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerLessThanZero(
IN LARGE_INTEGER Operand);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlLargeIntegerNegate(
IN LARGE_INTEGER Subtrahend);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerNotEqualTo(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTOSAPI
NTSYSAPI
BOOLEAN
DDKAPI
NTAPI
RtlLargeIntegerNotEqualToZero(
IN LARGE_INTEGER Operand);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlLargeIntegerShiftLeft(
IN LARGE_INTEGER LargeInteger,
IN CCHAR ShiftCount);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlLargeIntegerShiftRight(
IN LARGE_INTEGER LargeInteger,
IN CCHAR ShiftCount);
NTOSAPI
NTSYSAPI
LARGE_INTEGER
DDKAPI
NTAPI
RtlLargeIntegerSubtract(
IN LARGE_INTEGER Minuend,
IN LARGE_INTEGER Subtrahend);
@@ -587,21 +587,21 @@ RtlLargeIntegerSubtract(
#ifdef _X86_
NTOSAPI
NTKERNELAPI
INTERLOCKED_RESULT
DDKFASTAPI
FASTCALL
Exfi386InterlockedIncrementLong(
IN PLONG Addend);
NTOSAPI
NTKERNELAPI
INTERLOCKED_RESULT
DDKFASTAPI
FASTCALL
Exfi386InterlockedDecrementLong(
IN PLONG Addend);
NTOSAPI
NTKERNELAPI
ULONG
DDKFASTAPI
FASTCALL
Exfi386InterlockedExchangeUlong(
IN PULONG Target,
IN ULONG Value);

View File

@@ -0,0 +1,619 @@
/*
* winnt4.h
*
* Definitions only used in Windows NT 4.0 and earlier versions
*
* This file is part of the w32api package.
*
* Contributors:
* Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* This source code is offered for use in the public domain. You may
* use, modify or distribute it freely.
*
* This code is distributed in the hope that it will be useful but
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
* DISCLAIMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
#ifndef __WINNT4_H
#define __WINNT4_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _ZONE_SEGMENT_HEADER {
SINGLE_LIST_ENTRY SegmentList;
PVOID Reserved;
} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
typedef struct _ZONE_HEADER {
SINGLE_LIST_ENTRY FreeList;
SINGLE_LIST_ENTRY SegmentList;
ULONG BlockSize;
ULONG TotalSegmentSize;
} ZONE_HEADER, *PZONE_HEADER;
static __inline PVOID
ExAllocateFromZone(
IN PZONE_HEADER Zone)
{
if (Zone->FreeList.Next)
Zone->FreeList.Next = Zone->FreeList.Next->Next;
return (PVOID) Zone->FreeList.Next;
}
NTKERNELAPI
NTSTATUS
NTAPI
ExExtendZone(
IN PZONE_HEADER Zone,
IN PVOID Segment,
IN ULONG SegmentSize);
static __inline PVOID
ExFreeToZone(
IN PZONE_HEADER Zone,
IN PVOID Block)
{
((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
return ((PSINGLE_LIST_ENTRY) Block)->Next;
}
NTKERNELAPI
NTSTATUS
NTAPI
ExInitializeZone(
IN PZONE_HEADER Zone,
IN ULONG BlockSize,
IN PVOID InitialSegment,
IN ULONG InitialSegmentSize);
/*
* PVOID
* ExInterlockedAllocateFromZone(
* IN PZONE_HEADER Zone,
* IN PKSPIN_LOCK Lock)
*/
#define ExInterlockedAllocateFromZone(Zone, \
Lock) \
((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
NTKERNELAPI
NTSTATUS
NTAPI
ExInterlockedExtendZone(
IN PZONE_HEADER Zone,
IN PVOID Segment,
IN ULONG SegmentSize,
IN PKSPIN_LOCK Lock);
NTKERNELAPI
PVOID
NTAPI
ExInterlockedFreeToZone(
IN PZONE_HEADER Zone,
IN PVOID Block,
IN PKSPIN_LOCK Lock);
/*
* VOID
* ExInitializeWorkItem(
* IN PWORK_QUEUE_ITEM Item,
* IN PWORKER_THREAD_ROUTINE Routine,
* IN PVOID Context)
*/
#define ExInitializeWorkItem(Item, \
Routine, \
Context) \
{ \
(Item)->WorkerRoutine = Routine; \
(Item)->Parameter = Context; \
(Item)->List.Flink = NULL; \
}
/*
* BOOLEAN
* ExIsFullZone(
* IN PZONE_HEADER Zone)
*/
#define ExIsFullZone(Zone) \
((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
NTKERNELAPI
VOID
NTAPI
ExQueueWorkItem(
IN PWORK_QUEUE_ITEM WorkItem,
IN WORK_QUEUE_TYPE QueueType);
NTKERNELAPI
BOOLEAN
NTAPI
ExIsObjectInFirstZoneSegment(
IN PZONE_HEADER Zone,
IN PVOID Object);
NTKERNELAPI
VOID
NTAPI
ExReleaseResource(
IN PERESOURCE Resource);
#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
#define ExAcquireResourceShared ExAcquireResourceSharedLite
#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
#define ExDeleteResource ExDeleteResourceLite
#define ExInitializeResource ExInitializeResourceLite
#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
NTKERNELAPI
INTERLOCKED_RESULT
NTAPI
ExInterlockedDecrementLong(
IN PLONG Addend,
IN PKSPIN_LOCK Lock);
NTKERNELAPI
ULONG
NTAPI
ExInterlockedExchangeUlong(
IN PULONG Target,
IN ULONG Value,
IN PKSPIN_LOCK Lock);
NTKERNELAPI
INTERLOCKED_RESULT
NTAPI
ExInterlockedIncrementLong(
IN PLONG Addend,
IN PKSPIN_LOCK Lock);
NTHALAPI
VOID
NTAPI
HalAcquireDisplayOwnership(
IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
NTHALAPI
NTSTATUS
NTAPI
HalAllocateAdapterChannel(
IN PADAPTER_OBJECT AdapterObject,
IN PWAIT_CONTEXT_BLOCK Wcb,
IN ULONG NumberOfMapRegisters,
IN PDRIVER_CONTROL ExecutionRoutine);
NTHALAPI
PVOID
NTAPI
HalAllocateCommonBuffer(
IN PADAPTER_OBJECT AdapterObject,
IN ULONG Length,
OUT PPHYSICAL_ADDRESS LogicalAddress,
IN BOOLEAN CacheEnabled);
NTHALAPI
NTSTATUS
NTAPI
HalAssignSlotResources(
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject,
IN INTERFACE_TYPE BusType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN OUT PCM_RESOURCE_LIST *AllocatedResources);
NTHALAPI
VOID
NTAPI
HalFreeCommonBuffer(
IN PADAPTER_OBJECT AdapterObject,
IN ULONG Length,
IN PHYSICAL_ADDRESS LogicalAddress,
IN PVOID VirtualAddress,
IN BOOLEAN CacheEnabled);
NTHALAPI
PADAPTER_OBJECT
NTAPI
HalGetAdapter(
IN PDEVICE_DESCRIPTION DeviceDescription,
IN OUT PULONG NumberOfMapRegisters);
NTHALAPI
ULONG
NTAPI
HalGetBusData(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length);
NTHALAPI
ULONG
NTAPI
HalGetBusDataByOffset(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length);
NTHALAPI
ULONG
NTAPI
HalGetDmaAlignmentRequirement(
VOID);
NTHALAPI
ULONG
NTAPI
HalGetInterruptVector(
IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
IN ULONG BusInterruptLevel,
IN ULONG BusInterruptVector,
OUT PKIRQL Irql,
OUT PKAFFINITY Affinity);
NTHALAPI
ULONG
NTAPI
HalReadDmaCounter(
IN PADAPTER_OBJECT AdapterObject);
NTHALAPI
ULONG
NTAPI
HalSetBusData(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Length);
NTHALAPI
ULONG
NTAPI
HalSetBusDataByOffset(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length);
NTHALAPI
BOOLEAN
NTAPI
HalTranslateBusAddress(
IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress);
NTKERNELAPI
NTSTATUS
NTAPI
IoAllocateAdapterChannel(
IN PADAPTER_OBJECT AdapterObject,
IN PDEVICE_OBJECT DeviceObject,
IN ULONG NumberOfMapRegisters,
IN PDRIVER_CONTROL ExecutionRoutine,
IN PVOID Context);
NTKERNELAPI
NTSTATUS
NTAPI
IoAssignResources(
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName OPTIONAL,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
IN OUT PCM_RESOURCE_LIST *AllocatedResources);
NTKERNELAPI
NTSTATUS
NTAPI
IoAttachDeviceByPointer(
IN PDEVICE_OBJECT SourceDevice,
IN PDEVICE_OBJECT TargetDevice);
NTHALAPI
BOOLEAN
NTAPI
IoFlushAdapterBuffers(
IN PADAPTER_OBJECT AdapterObject,
IN PMDL Mdl,
IN PVOID MapRegisterBase,
IN PVOID CurrentVa,
IN ULONG Length,
IN BOOLEAN WriteToDevice);
NTHALAPI
VOID
NTAPI
IoFreeAdapterChannel(
IN PADAPTER_OBJECT AdapterObject);
NTHALAPI
VOID
NTAPI
IoFreeMapRegisters(
IN PADAPTER_OBJECT AdapterObject,
IN PVOID MapRegisterBase,
IN ULONG NumberOfMapRegisters);
NTHALAPI
PHYSICAL_ADDRESS
NTAPI
IoMapTransfer(
IN PADAPTER_OBJECT AdapterObject,
IN PMDL Mdl,
IN PVOID MapRegisterBase,
IN PVOID CurrentVa,
IN OUT PULONG Length,
IN BOOLEAN WriteToDevice);
NTKERNELAPI
PMDL
NTAPI
MmCreateMdl(
IN PMDL MemoryDescriptorList OPTIONAL,
IN PVOID Base,
IN SIZE_T Length);
NTKERNELAPI
BOOLEAN
NTAPI
MmIsNonPagedSystemAddressValid(
IN PVOID VirtualAddress);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlEnlargedIntegerMultiply(
IN LONG Multiplicand,
IN LONG Multiplier);
NTSYSAPI
ULONG
NTAPI
RtlEnlargedUnsignedDivide(
IN ULARGE_INTEGER Dividend,
IN ULONG Divisor,
IN OUT PULONG Remainder);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlEnlargedUnsignedMultiply(
IN ULONG Multiplicand,
IN ULONG Multiplier);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlExtendedIntegerMultiply(
IN LARGE_INTEGER Multiplicand,
IN LONG Multiplier);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlExtendedLargeIntegerDivide(
IN LARGE_INTEGER Dividend,
IN ULONG Divisor,
IN OUT PULONG Remainder);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlExtendedMagicDivide(
IN LARGE_INTEGER Dividend,
IN LARGE_INTEGER MagicDivisor,
IN CCHAR ShiftCount);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlLargeIntegerAdd(
IN LARGE_INTEGER Addend1,
IN LARGE_INTEGER Addend2);
NTSYSAPI
VOID
NTAPI
RtlLargeIntegerAnd(
IN OUT LARGE_INTEGER Result,
IN LARGE_INTEGER Source,
IN LARGE_INTEGER Mask);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlLargeIntegerArithmeticShift(
IN LARGE_INTEGER LargeInteger,
IN CCHAR ShiftCount);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlLargeIntegerDivide(
IN LARGE_INTEGER Dividend,
IN LARGE_INTEGER Divisor,
IN OUT PLARGE_INTEGER Remainder);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerEqualTo(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerEqualToZero(
IN LARGE_INTEGER Operand);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerGreaterOrEqualToZero(
IN LARGE_INTEGER Operand);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerGreaterThan(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerGreaterThanOrEqualTo(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerGreaterThanZero(
IN LARGE_INTEGER Operand);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerLessOrEqualToZero(
IN LARGE_INTEGER Operand);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerLessThan(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerLessThanOrEqualTo(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerLessThanZero(
IN LARGE_INTEGER Operand);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlLargeIntegerNegate(
IN LARGE_INTEGER Subtrahend);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerNotEqualTo(
IN LARGE_INTEGER Operand1,
IN LARGE_INTEGER Operand2);
NTSYSAPI
BOOLEAN
NTAPI
RtlLargeIntegerNotEqualToZero(
IN LARGE_INTEGER Operand);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlLargeIntegerShiftLeft(
IN LARGE_INTEGER LargeInteger,
IN CCHAR ShiftCount);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlLargeIntegerShiftRight(
IN LARGE_INTEGER LargeInteger,
IN CCHAR ShiftCount);
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlLargeIntegerSubtract(
IN LARGE_INTEGER Minuend,
IN LARGE_INTEGER Subtrahend);
/*
* ULONG
* COMPUTE_PAGES_SPANNED(
* IN PVOID Va,
* IN ULONG Size)
*/
#define COMPUTE_PAGES_SPANNED(Va, \
Size) \
(ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
/*
** Architecture specific structures
*/
#ifdef _X86_
NTKERNELAPI
INTERLOCKED_RESULT
FASTCALL
Exfi386InterlockedIncrementLong(
IN PLONG Addend);
NTKERNELAPI
INTERLOCKED_RESULT
FASTCALL
Exfi386InterlockedDecrementLong(
IN PLONG Addend);
NTKERNELAPI
ULONG
FASTCALL
Exfi386InterlockedExchangeUlong(
IN PULONG Target,
IN ULONG Value);
#define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
#define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
#define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
#endif /* _X86_ */
#ifdef __cplusplus
}
#endif
#endif /* __WINNT4_H */

View File

@@ -20,6 +20,19 @@ Author:
#ifndef _ASM_H
#define _ASM_H
#define NEW_SCHEDULER
//
// PCR Access
//
#ifdef __ASM__
#ifdef CONFIG_SMP
#define PCR fs:
#else
#define PCR ds:[0xFF000000]
#endif
#endif
//
// CPU Modes
//
@@ -90,15 +103,16 @@ Author:
#define KTHREAD_STACK_LIMIT 0x1C
#define KTHREAD_TEB 0x74
#define KTHREAD_KERNEL_STACK 0x20
#define KTHREAD_STATE 0x4C
#define KTHREAD_NPX_STATE 0x4D
#define KTHREAD_ALERTED 0x5E
#define KTHREAD_APCSTATE_PROCESS 0x28 + 0x10
#define KTHREAD_PENDING_USER_APC 0x28 + 0x16
#define KTHREAD_PENDING_KERNEL_APC 0x28 + 0x15
#define KTHREAD_CONTEXT_SWITCHES 0x48
#define KTHREAD_STATE 0x4C
#define KTHREAD_NPX_STATE 0x4D
#define KTHREAD_WAIT_IRQL 0x4E
#define KTHREAD_NEXT_PROCESSOR 0x40
#define KTHREAD_WAIT_REASON 0x5A
#define KTHREAD_SWAP_BUSY 0x5D
#define KTHREAD_SERVICE_TABLE 0x118
#define KTHREAD_PREVIOUS_MODE 0xD7
@@ -125,6 +139,28 @@ Author:
#define KPROCESS_ACTIVE_PROCESSORS 0x34
#define EPROCESS_VDM_OBJECTS 0x144
//
// KTIMER_TABLE Offsets
//
#ifdef __ASM__
#define KTIMER_TABLE_ENTRY 0x00
#define KTIMER_TABLE_TIME 0x08
#define TIMER_ENTRY_SIZE 0x10
#define TIMER_TABLE_SIZE 0x200
#endif
//
// KPRCB Offsets
//
#define KPRCB_DR0 0x2F8
#define KPRCB_DR1 0x2FC
#define KPRCB_DR2 0x300
#define KPRCB_DR3 0x304
#define KPRCB_DR6 0x308
#define KPRCB_DR7 0x30C
#define KPRCB_TIMER_HAND 0x964
#define KPRCB_TIMER_REQUEST 0x968
//
// KPCR Offsets
//
@@ -145,8 +181,10 @@ Author:
#define KPCR_IDT 0x38
#define KPCR_GDT 0x3C
#define KPCR_TSS 0x40
#define KPCR_STALL_SCALE_FACTOR 0x4C
#define KPCR_SET_MEMBER 0x48
#define KPCR_NUMBER 0x51
#define KPCR_VDM_ALERT 0x54
#define KPCR_PRCB_DATA 0x120
#define KPCR_CURRENT_THREAD 0x124
#define KPCR_PRCB_NEXT_THREAD 0x128
@@ -164,6 +202,7 @@ Author:
#define KPCR_PRCB_DEBUG_DPC_TIME 0x654
#define KPCR_PRCB_INTERRUPT_TIME 0x658
#define KPCR_PRCB_ADJUST_DPC_THRESHOLD 0x65C
#define KPCR_PRCB_SKIP_TICK 0x664
#define KPCR_SYSTEM_CALLS 0x6B8
#define KPCR_PRCB_DPC_QUEUE_DEPTH 0xA4C
#define KPCR_PRCB_DPC_COUNT 0xA50
@@ -183,10 +222,12 @@ Author:
//
#define KINTERRUPT_SERVICE_ROUTINE 0x0C
#define KINTERRUPT_SERVICE_CONTEXT 0x10
#define KINTERRUPT_TICK_COUNT 0x18
#define KINTERRUPT_ACTUAL_LOCK 0x1C
#define KINTERRUPT_IRQL 0x20
#define KINTERRUPT_VECTOR 0x24
#define KINTERRUPT_SYNCHRONIZE_IRQL 0x29
#define KINTERRUPT_DISPATCH_COUNT 0x38
//
// KGDTENTRY Offsets
@@ -451,9 +492,14 @@ Author:
#endif
//
// DR7 Values
// DR6 and 7 Masks
//
#define DR6_LEGAL 0xE00F
#define DR7_LEGAL 0xFFFF0155
#define DR7_ACTIVE 0x55
#define DR7_OVERRIDE_V 0x04
#define DR7_RESERVED_MASK 0xDC00
#define DR7_OVERRIDE_MASK 0xF0000
//
// Usermode callout frame definitions
@@ -461,6 +507,7 @@ Author:
#define CBSTACK_STACK 0x0
#define CBSTACK_TRAP_FRAME 0x4
#define CBSTACK_CALLBACK_STACK 0x8
#define CBSTACK_EBP 0x18
#define CBSTACK_RESULT 0x20
#define CBSTACK_RESULT_LENGTH 0x24
@@ -469,6 +516,11 @@ Author:
//
#ifdef __ASM__
#define STATUS_ACCESS_VIOLATION 0xC0000005
#define STATUS_IN_PAGE_ERROR 0xC0000006
#define STATUS_GUARD_PAGE_VIOLATION 0x80000001
#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
#define STATUS_STACK_OVERFLOW 0xC00000FD
#define KI_EXCEPTION_ACCESS_VIOLATION 0x10000004
#define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C
#define STATUS_NO_CALLBACK_ACTIVE 0xC0000258
#define STATUS_CALLBACK_POP_STACK 0xC0000423
@@ -489,11 +541,14 @@ Author:
#define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
#define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
#define APC_INDEX_MISMATCH 0x01
#define IRQL_NOT_GREATER_OR_EQUAL 0x09
#define IRQL_NOT_LESS_OR_EQUAL 0x0A
#define TRAP_CAUSE_UNKNOWN 0x12
#define KMODE_EXCEPTION_NOT_HANDLED 0x13
#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE 0x4A
#define UNEXPECTED_KERNEL_MODE_TRAP 0x7F
#define ATTEMPTED_SWITCH_FROM_DPC 0xB8
#define HARDWARE_INTERRUPT_STORM 0xF2
//
// IRQL Levels
@@ -541,6 +596,11 @@ Author:
// Kernel Feature Bits
//
#define KF_RDTSC 0x00000002
//
// Kernel Stack Size
//
#define KERNEL_STACK_SIZE 0x3000
#endif
//
@@ -550,3 +610,4 @@ Author:
#define MAXIMUM_IDTVECTOR 0xFF
#endif // !_ASM_H

View File

@@ -31,7 +31,107 @@ Author:
//
extern ULONG NTSYSAPI CcFastReadNotPossible;
extern ULONG NTSYSAPI CcFastReadWait;
extern ULONG NTSYSAPI CcFastReadResourceMiss;
extern ULONG NTSYSAPI CcFastReadNoWait;
extern ULONG NTSYSAPI CcFastMdlReadNotPossible;
#endif
#endif // _CCTYPES_H
//
// Virtual Address Control BLock
//
typedef struct _VACB
{
PVOID BaseAddress;
struct _SHARED_CACHE_MAP *SharedCacheMap;
union
{
LARGE_INTEGER FileOffset;
USHORT ActiveCount;
} Overlay;
LIST_ENTRY LruList;
} VACB, *PVACB;
//
// Private Cache Map Structure and Flags
//
typedef struct _PRIVATE_CACHE_MAP_FLAGS
{
ULONG DontUse:16;
ULONG ReadAheadActive:1;
ULONG ReadAheadEnabled:1;
ULONG Available:14;
} PRIVATE_CACHE_MAP_FLAGS;
typedef struct _PRIVATE_CACHE_MAP
{
union
{
CSHORT NodeTypeCode;
PRIVATE_CACHE_MAP_FLAGS Flags;
ULONG UlongFlags;
};
ULONG ReadAheadMask;
PFILE_OBJECT FileObject;
LARGE_INTEGER FileOffset1;
LARGE_INTEGER BeyondLastByte1;
LARGE_INTEGER FileOffset2;
LARGE_INTEGER BeyondLastByte2;
LARGE_INTEGER ReadAheadOffset[2];
ULONG ReadAheadLength[2];
KSPIN_LOCK ReadAheadSpinLock;
LIST_ENTRY PrivateLinks;
} PRIVATE_CACHE_MAP, *PPRIVATE_CACHE_MAP;
#ifdef _NTIFS_INCLUDED_
//
// Shared Cache Map
//
typedef struct _SHARED_CACHE_MAP
{
SHORT NodeTypeCode;
SHORT NodeByteSize;
ULONG OpenCount;
LARGE_INTEGER FileSize;
LIST_ENTRY BcbList;
LARGE_INTEGER SectionSize;
LARGE_INTEGER ValidDataLength;
LARGE_INTEGER ValidDataGoal;
PVACB InitialVacbs[4];
PVACB Vacbs;
PFILE_OBJECT FileObject;
PVACB ActiveVacb;
PVOID NeedToZero;
ULONG ActivePage;
ULONG NeedToZeroPage;
ULONG ActiveVacbSpinLock;
ULONG VacbActiveCount;
ULONG DirtyPages;
LIST_ENTRY SharedCacheMapLinks;
ULONG Flags;
ULONG Status;
PMCB Mbcb;
PVOID Section;
PKEVENT CreateEvent;
PKEVENT WaitOnActiveCount;
ULONG PagesToWrite;
LONGLONG BeyondLastFlush;
PCACHE_MANAGER_CALLBACKS Callbacks;
PVOID LazyWriteContext;
PLIST_ENTRY PrivateList;
PVOID LogHandle;
PVOID FlushToLsnRoutine;
ULONG DirtyPageThreshold;
ULONG LazyWritePassCount;
PCACHE_UNINITIALIZE_EVENT UninitializeEvent;
PVACB NeedToZeroVacb;
ULONG BcbSpinLock;
PVOID Reserved;
KEVENT Event;
PEX_PUSH_LOCK VacbPushLock;
PPRIVATE_CACHE_MAP PrivateCacheMap;
} SHARED_CACHE_MAP;
#endif /* _NTIFS_INCLUDED_ */
#endif /* NTOS_MODE_USER */
#endif /* _CCTYPES_H */

View File

@@ -27,6 +27,19 @@ Author:
//
// Native calls
//
NTSTATUS
NTAPI
NtCompactKeys(
IN ULONG Count,
IN PHANDLE KeyArray
);
NTSTATUS
NTAPI
NtCompressKey(
IN HANDLE Key
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -120,6 +133,31 @@ NtLoadKey2(
IN ULONG Flags
);
NTSTATUS
NTAPI
NtLoadKeyEx(
IN POBJECT_ATTRIBUTES TargetKey,
IN POBJECT_ATTRIBUTES SourceFile,
IN ULONG Flags,
IN HANDLE TrustClassKey,
IN HANDLE Event,
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE RootHandle
);
NTSTATUS
NTAPI
NtLockProductActivationKeys(
IN PULONG pPrivateVer,
IN PULONG pSafeMode
);
NTSTATUS
NTAPI
NtLockRegistryKey(
IN HANDLE KeyHandle
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -136,6 +174,23 @@ NtNotifyChangeKey(
IN BOOLEAN WatchSubtree
);
NTSTATUS
NTAPI
NtNotifyChangeMultipleKeys(
IN HANDLE MasterKeyHandle,
IN ULONG Count,
IN POBJECT_ATTRIBUTES SlaveObjects,
IN HANDLE Event,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG CompletionFilter,
IN BOOLEAN WatchTree,
OUT PVOID Buffer,
IN ULONG Length,
IN BOOLEAN Asynchronous
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -177,6 +232,22 @@ NtQueryMultipleValueKey(
OUT PULONG ReturnLength
);
NTSTATUS
NTAPI
NtQueryOpenSubKeys(
IN POBJECT_ATTRIBUTES TargetKey,
IN ULONG HandleCount
);
NTSTATUS
NTAPI
NtQueryOpenSubKeysEx(
IN POBJECT_ATTRIBUTES TargetKey,
IN ULONG BufferLength,
IN PVOID Buffer,
IN PULONG RequiredSize
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -224,6 +295,15 @@ NtSaveKeyEx(
IN ULONG Flags
);
NTSTATUS
NTAPI
NtSaveMergedKeys(
IN HANDLE HighPrecedenceKeyHandle,
IN HANDLE LowPrecedenceKeyHandle,
IN HANDLE FileHandle
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -253,6 +333,20 @@ NtUnloadKey(
IN POBJECT_ATTRIBUTES KeyObjectAttributes
);
NTSTATUS
NTAPI
NtUnloadKey2(
IN POBJECT_ATTRIBUTES TargetKey,
IN ULONG Flags
);
NTSTATUS
NTAPI
NtUnloadKeyEx(
IN POBJECT_ATTRIBUTES TargetKey,
IN HANDLE Event
);
#ifdef NTOS_MODE_USER
NTSYSAPI
NTSTATUS

View File

@@ -30,6 +30,7 @@ Author:
//
#define DEBUG_OBJECT_WAIT_STATE_CHANGE 0x0001
#define DEBUG_OBJECT_ADD_REMOVE_PROCESS 0x0002
#define DEBUG_OBJECT_SET_INFORMATION 0x0004
#define DEBUG_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x0F)
//
@@ -41,6 +42,22 @@ typedef enum _DEBUGOBJECTINFOCLASS
DebugObjectKillProcessOnExitInformation
} DEBUGOBJECTINFOCLASS, *PDEBUGOBJECTINFOCLASS;
//
// Debug Message API Number
//
typedef enum _DBGKM_APINUMBER
{
DbgKmExceptionApi = 0,
DbgKmCreateThreadApi = 1,
DbgKmCreateProcessApi = 2,
DbgKmExitThreadApi = 3,
DbgKmExitProcessApi = 4,
DbgKmLoadDllApi = 5,
DbgKmUnloadDllApi = 6,
DbgKmErrorReportApi = 7,
DbgKmMaxApiNumber = 8,
} DBGKM_APINUMBER;
//
// Debug Object Information Structures
//
@@ -54,11 +71,11 @@ typedef struct _DEBUG_OBJECT_KILL_PROCESS_ON_EXIT_INFORMATION
//
// Debug Object
//
typedef struct _DBGK_DEBUG_OBJECT
typedef struct _DEBUG_OBJECT
{
KEVENT Event;
KEVENT EventsPresent;
FAST_MUTEX Mutex;
LIST_ENTRY StateEventListEntry;
LIST_ENTRY EventList;
union
{
ULONG Flags;
@@ -68,7 +85,7 @@ typedef struct _DBGK_DEBUG_OBJECT
UCHAR KillProcessOnExit:1;
};
};
} DBGK_DEBUG_OBJECT, *PDBGK_DEBUG_OBJECT;
} DEBUG_OBJECT, *PDEBUG_OBJECT;
#endif
@@ -131,6 +148,7 @@ typedef struct _DBGKM_LOAD_DLL
PVOID BaseOfDll;
ULONG DebugInfoFileOffset;
ULONG DebugInfoSize;
PVOID NamePointer;
} DBGKM_LOAD_DLL, *PDBGKM_LOAD_DLL;
typedef struct _DBGKM_UNLOAD_DLL
@@ -172,8 +190,8 @@ typedef struct _DBGUI_WAIT_STATE_CHANGE
typedef struct _DBGKM_MSG
{
PORT_MESSAGE h;
ULONG Opcode;
ULONG Status;
DBGKM_APINUMBER ApiNumber;
ULONG ReturnedStatus;
union
{
DBGKM_EXCEPTION Exception;
@@ -186,4 +204,25 @@ typedef struct _DBGKM_MSG
};
} DBGKM_MSG, *PDBGKM_MSG;
#ifndef NTOS_MODE_USER
//
// Debug Event
//
typedef struct _DEBUG_EVENT
{
LIST_ENTRY EventList;
KEVENT ContinueEvent;
CLIENT_ID ClientId;
PEPROCESS Process;
PETHREAD Thread;
NTSTATUS Status;
ULONG Flags;
PETHREAD BackoutThread;
DBGKM_MSG ApiMsg;
} DEBUG_EVENT, *PDEBUG_EVENT;
#endif
#endif

View File

@@ -93,6 +93,29 @@ ExfUnblockPushLock(
PVOID CurrentWaitBlock
);
//
// Resource Functions
//
NTKERNELAPI
BOOLEAN
NTAPI
ExTryToAcquireResourceExclusiveLite(
IN PERESOURCE Resource
);
//
// Handle Table Functions
//
NTKERNELAPI
BOOLEAN
NTAPI
ExEnumHandleTable(
IN PHANDLE_TABLE HandleTable,
IN PEX_ENUM_HANDLE_CALLBACK EnumHandleProcedure,
IN OUT PVOID Context,
OUT PHANDLE Handle OPTIONAL
);
#endif
//
@@ -142,6 +165,16 @@ NtCreateEventPair(
IN POBJECT_ATTRIBUTES ObjectAttributes
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtCreateKeyedEvent(
OUT PHANDLE KeyedEventHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN ULONG Flags
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -187,6 +220,15 @@ NtDisplayString(
IN PUNICODE_STRING DisplayString
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtEnumerateSystemEnvironmentValuesEx(
IN ULONG InformationClass,
IN PVOID Buffer,
IN ULONG BufferLength
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -334,6 +376,17 @@ NtQuerySystemEnvironmentValue(
PULONG ReturnLength
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtQuerySystemEnvironmentValueEx(
IN PUNICODE_STRING VariableName,
IN LPGUID VendorGuid,
IN PVOID Value,
IN OUT PULONG ReturnLength,
IN OUT PULONG Attributes
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -475,6 +528,14 @@ NtSetSystemEnvironmentValue(
IN PUNICODE_STRING Value
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtSetSystemEnvironmentValueEx(
IN PUNICODE_STRING VariableName,
IN LPGUID VendorGuid
);
NTSYSCALLAPI
NTSTATUS
NTAPI

View File

@@ -31,6 +31,9 @@ Author:
#include <ketypes.h>
#include <potypes.h>
#include <lpctypes.h>
#ifdef NTOS_MODE_USER
#include <obtypes.h>
#endif
//
// GCC compatibility
@@ -104,6 +107,13 @@ extern ULONG NtBuildNumber;
#define MUTANT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
SYNCHRONIZE | \
MUTANT_QUERY_STATE)
#define TIMER_QUERY_STATE 0x0001
#define TIMER_MODIFY_STATE 0x0002
#define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
SYNCHRONIZE | \
TIMER_QUERY_STATE | \
TIMER_MODIFY_STATE)
#endif
//
@@ -178,7 +188,9 @@ typedef enum _HARDERROR_RESPONSE
ResponseNo,
ResponseOk,
ResponseRetry,
ResponseYes
ResponseYes,
ResponseTryAgain,
ResponseContinue
} HARDERROR_RESPONSE, *PHARDERROR_RESPONSE;
//
@@ -352,6 +364,17 @@ NTSTATUS
#else
//
// Handle Enumeration Callback
//
struct _HANDLE_TABLE_ENTRY;
typedef BOOLEAN
(NTAPI *PEX_ENUM_HANDLE_CALLBACK)(
IN struct _HANDLE_TABLE_ENTRY *HandleTableEntry,
IN HANDLE Handle,
IN PVOID Context
);
//
// Compatibility with Windows XP Drivers using ERESOURCE
//
@@ -479,19 +502,33 @@ typedef __ALIGNED(16) struct _EX_PUSH_LOCK_WAIT_BLOCK
//
typedef struct _CALLBACK_OBJECT
{
ULONG Name;
ULONG Signature;
KSPIN_LOCK Lock;
LIST_ENTRY RegisteredCallbacks;
ULONG AllowMultipleCallbacks;
BOOLEAN AllowMultipleCallbacks;
UCHAR reserved[3];
} CALLBACK_OBJECT, *PCALLBACK_OBJECT;
//
// Callback Handle
//
typedef struct _CALLBACK_REGISTRATION
{
LIST_ENTRY Link;
PCALLBACK_OBJECT CallbackObject;
PCALLBACK_FUNCTION CallbackFunction;
PVOID CallbackContext;
ULONG Busy;
BOOLEAN UnregisterWaiting;
} CALLBACK_REGISTRATION, *PCALLBACK_REGISTRATION;
//
// Internal Callback Object
//
typedef struct _EX_CALLBACK_ROUTINE_BLOCK
{
EX_RUNDOWN_REF RundownProtect;
PVOID Function;
PEX_CALLBACK_FUNCTION Function;
PVOID Context;
} EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK;
@@ -569,14 +606,6 @@ typedef struct _HANDLE_TABLE_ENTRY
};
} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;
//
// FIXME
//
#ifdef _REACTOS_
#undef NTDDI_VERSION
#define NTDDI_VERSION NTDDI_WIN2K
#endif
typedef struct _HANDLE_TABLE
{
#if (NTDDI_VERSION >= NTDDI_WINXP)
@@ -587,7 +616,7 @@ typedef struct _HANDLE_TABLE
PEPROCESS QuotaProcess;
PVOID UniqueProcessId;
#if (NTDDI_VERSION >= NTDDI_WINXP)
EX_PUSH_LOCK HandleLock;
EX_PUSH_LOCK HandleTableLock[4];
LIST_ENTRY HandleTableList;
EX_PUSH_LOCK HandleContentionEvent;
#else

View File

@@ -24,15 +24,41 @@ Author:
//
#include <umtypes.h>
#include <haltypes.h>
#include <ketypes.h>
#ifndef NTOS_MODE_USER
//
// Private HAL Callbacks
//
#define HalHandlerForBus HALPRIVATEDISPATCH->HalHandlerForBus
#define HalHandlerForConfigSpace HALPRIVATEDISPATCH->HalHandlerForConfigSpace
#define HalLocateHiberRanges HALPRIVATEDISPATCH->HalLocateHiberRanges
#define HalRegisterBusHandler HALPRIVATEDISPATCH->HalRegisterBusHandler
#define HalSetWakeEnable HALPRIVATEDISPATCH->HalSetWakeEnable
#define HalSetWakeAlarm HALPRIVATEDISPATCH->HalSetWakeAlarm
#define HalPciTranslateBusAddress HALPRIVATEDISPATCH->HalPciTranslateBusAddress
#define HalPciAssignSlotResources HALPRIVATEDISPATCH->HalPciAssignSlotResources
#define HalHaltSystem HALPRIVATEDISPATCH->HalHaltSystem
#define HalFindBusAddressTranslation HALPRIVATEDISPATCH->HalFindBusAddressTranslation
#define HalResetDisplay HALPRIVATEDISPATCH->HalResetDisplay
#define HalAllocateMapRegisters HALPRIVATEDISPATCH->HalAllocateMapRegisters
#define KdSetupPciDeviceForDebugging HALPRIVATEDISPATCH->KdSetupPciDeviceForDebugging
#define KdReleasePciDeviceforDebugging HALPRIVATEDISPATCH->KdReleasePciDeviceforDebugging
#define KdGetAcpiTablePhase0 HALPRIVATEDISPATCH->KdGetAcpiTablePhase0
#define KdCheckPowerButton HALPRIVATEDISPATCH->KdCheckPowerButton
#define HalVectorToIDTEntry HALPRIVATEDISPATCH->HalVectorToIDTEntry
#define KdMapPhysicalMemory64 HALPRIVATEDISPATCH->KdMapPhysicalMemory64
#define KdUnmapVirtualAddress HALPRIVATEDISPATCH->KdUnmapVirtualAddress
//
// The DDK steals these away from you.
//
#ifdef _MSC_VER
//#pragma intrinsic(_enable)
//#pragma intrinsic(_disable)
//void _enable(void);
//void _disable(void);
#pragma intrinsic(_enable)
#pragma intrinsic(_disable)
#endif
//
@@ -71,6 +97,15 @@ HalInitSystem(
ULONG BootPhase,
struct _LOADER_PARAMETER_BLOCK *LoaderBlock
);
NTHALAPI
BOOLEAN
NTAPI
HalStartNextProcessor(
IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
IN PKPROCESSOR_STATE ProcessorState
);
#endif
NTHALAPI
@@ -80,14 +115,6 @@ HalReturnToFirmware(
FIRMWARE_REENTRY Action
);
NTHALAPI
BOOLEAN
NTAPI
HalStartNextProcessor(
ULONG Unknown1,
ULONG Unknown2
);
//
// CPU Routines
//
@@ -135,15 +162,6 @@ HalEndSystemInterrupt(
ULONG Vector
);
NTHALAPI
BOOLEAN
NTAPI
HalGetEnvironmentVariable(
PCH Variable,
USHORT Length,
PCH Buffer
);
NTHALAPI
VOID
NTAPI
@@ -173,31 +191,27 @@ HalHandleNMI(
);
//
// I/O Functions
// Environment Functions
//
#ifdef _ARC_
NTHALAPI
VOID
NTAPI
IoAssignDriveLetters(
struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
PSTRING NtDeviceName,
PUCHAR NtSystemPath,
PSTRING NtSystemPathString
);
#endif
//
// Environment Functions
//
NTHALAPI
BOOLEAN
ARC_STATUS
NTAPI
HalSetEnvironmentVariable(
IN PCH Name,
IN PCH Value
);
NTHALAPI
ARC_STATUS
NTAPI
HalGetEnvironmentVariable(
IN PCH Variable,
IN USHORT Length,
OUT PCH Buffer
);
#endif
//
// Time Functions
//
@@ -208,5 +222,12 @@ HalQueryRealTimeClock(
IN PTIME_FIELDS RtcTime
);
NTHALAPI
BOOLEAN
NTAPI
HalSetRealTimeClock(
IN PTIME_FIELDS RtcTime
);
#endif
#endif

View File

@@ -44,20 +44,20 @@ typedef enum _FIRMWARE_REENTRY
//
typedef
PBUS_HANDLER
(*pHalHandlerForConfigSpace)(
(NTAPI *pHalHandlerForConfigSpace)(
IN BUS_DATA_TYPE ConfigSpace,
IN ULONG BusNumber
);
typedef
NTSTATUS
(*PINSTALL_BUS_HANDLER)(
(NTAPI *PINSTALL_BUS_HANDLER)(
IN PBUS_HANDLER Bus
);
typedef
NTSTATUS
(*pHalRegisterBusHandler)(
(NTAPI *pHalRegisterBusHandler)(
IN INTERFACE_TYPE InterfaceType,
IN BUS_DATA_TYPE ConfigSpace,
IN ULONG BusNumber,
@@ -70,33 +70,88 @@ NTSTATUS
typedef
VOID
(*pHalSetWakeEnable)(
(NTAPI *pHalSetWakeEnable)(
IN BOOLEAN Enable
);
typedef
VOID
(*pHalSetWakeAlarm)(
(NTAPI *pHalSetWakeAlarm)(
IN ULONGLONG AlartTime,
IN PTIME_FIELDS TimeFields
);
typedef
VOID
(*pHalLocateHiberRanges)(
(NTAPI *pHalLocateHiberRanges)(
IN PVOID MemoryMap
);
typedef
BOOLEAN
(*pHalAllocateMapRegisters)(
(NTAPI *pHalAllocateMapRegisters)(
IN PADAPTER_OBJECT AdapterObject,
IN ULONG Unknown,
IN ULONG Unknown2,
PMAP_REGISTER_ENTRY Registers
);
//
// HAL Bus Handler Callback Types
//
typedef
NTSTATUS
(NTAPI *pAdjustResourceList)(
IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN OUT PCM_RESOURCE_LIST Resources
);
typedef
NTSTATUS
(NTAPI *pAssignSlotResources)(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName,
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject,
IN ULONG SlotNumber,
IN OUT PCM_RESOURCE_LIST *AllocatedResources
);
typedef
ULONG
(NTAPI *pGetSetBusData)(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN PCI_SLOT_NUMBER SlotNumber,
OUT PUCHAR Buffer,
IN ULONG Offset,
IN ULONG Length
);
typedef
ULONG
(NTAPI *pGetInterruptVector)(
IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN ULONG BusInterruptLevel,
IN ULONG BusInterruptVector,
OUT PKIRQL Irql,
OUT PKAFFINITY Affinity
);
typedef
ULONG
(NTAPI *pTranslateBusAddress)(
IN PBUS_HANDLER BusHandler,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress
);
//
// Hal Private dispatch Table
//
@@ -131,22 +186,48 @@ typedef struct _HAL_PRIVATE_DISPATCH
#endif
} HAL_PRIVATE_DISPATCH, *PHAL_PRIVATE_DISPATCH;
//
// HAL Bus Handler
//
typedef struct _BUS_HANDLER
{
ULONG Version;
INTERFACE_TYPE InterfaceType;
BUS_DATA_TYPE ConfigurationType;
ULONG BusNumber;
PDEVICE_OBJECT DeviceObject;
struct _BUS_HANDLER *ParentHandler;
PVOID BusData;
ULONG DeviceControlExtensionSize;
//PSUPPORTED_RANGES BusAddresses;
ULONG Reserved[4];
pGetSetBusData GetBusData;
pGetSetBusData SetBusData;
pAdjustResourceList AdjustResourceList;
pAssignSlotResources AssignSlotResources;
pGetInterruptVector GetInterruptVector;
pTranslateBusAddress TranslateBusAddress;
} BUS_HANDLER;
//
// Kernel Exports
//
#ifndef _NTOSKRNL_
extern PHAL_PRIVATE_DISPATCH HalPrivateDispatchTable;
#if defined(_NTDRIVER_) || defined(_NTHAL_)
extern NTSYSAPI PHAL_PRIVATE_DISPATCH HalPrivateDispatchTable;
#define HALPRIVATEDISPATCH ((PHAL_PRIVATE_DISPATCH)&HalPrivateDispatchTable)
#else
extern HAL_PRIVATE_DISPATCH HalPrivateDispatchTable;
extern NTSYSAPI HAL_PRIVATE_DISPATCH HalPrivateDispatchTable;
#define HALPRIVATEDISPATCH (&HalPrivateDispatchTable)
#endif
//
// HAL Exports
//
#ifndef _NTHAL_
extern PUCHAR NTSYSAPI *KdComPortInUse;
extern PUCHAR *KdComPortInUse;
#endif
#endif
#endif

View File

@@ -38,6 +38,9 @@ typedef struct _RTL_SPLAY_LINKS
struct _RTL_SPLAY_LINKS *RightChild;
} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
typedef struct _RTL_GENERIC_TABLE RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
typedef ULONG TABLE_SEARCH_RESULT;
#if defined(USE_LPC6432)
#define LPC_CLIENT_ID CLIENT_ID64
#define LPC_SIZE_T ULONGLONG

View File

@@ -23,6 +23,7 @@ Author:
// Dependencies
//
#include <umtypes.h>
#include <inbvtypes.h>
#ifndef NTOS_MODE_USER
//
@@ -30,16 +31,20 @@ Author:
//
VOID
NTAPI
InbvAcquireDisplayOwnership(VOID);
InbvAcquireDisplayOwnership(
VOID
);
BOOLEAN
NTAPI
InbvCheckDisplayOwnership(VOID);
InbvCheckDisplayOwnership(
VOID
);
VOID
NTAPI
InbvNotifyDisplayOwnershipLost(
IN PVOID Callback
IN INBV_RESET_DISPLAY_PARAMETERS Callback
);
//
@@ -54,12 +59,14 @@ InbvEnableBootDriver(
VOID
NTAPI
InbvInstallDisplayStringFilter(
IN PVOID DisplayFilter
IN INBV_DISPLAY_STRING_FILTER DisplayFilter
);
BOOLEAN
NTAPI
InbvIsBootDriverInstalled(VOID);
InbvIsBootDriverInstalled(
VOID
);
//
// Display Functions
@@ -78,7 +85,9 @@ InbvEnableDisplayString(
BOOLEAN
NTAPI
InbvResetDisplay(VOID);
InbvResetDisplay(
VOID
);
VOID
NTAPI
@@ -105,5 +114,12 @@ InbvSolidColorFill(
IN ULONG Color
);
VOID
NTAPI
InbvSetProgressBarSubset(
IN ULONG Floor,
IN ULONG Ceiling
);
#endif
#endif

View File

@@ -0,0 +1,55 @@
/*++ NDK Version: 0098
Copyright (c) Alex Ionescu. All rights reserved.
Header Name:
inbvtypes.h
Abstract:
Type definitions for the Boot Video Driver.
Author:
Alex Ionescu (alexi@tinykrnl.org) - Created - 02-Feb-2007
--*/
#ifndef _INBVTYPES_H
#define _INBVTYPES_H
//
// Dependencies
//
#include <umtypes.h>
#ifndef NTOS_MODE_USER
//
// Boot Video Display Ownership Status
//
typedef enum _INBV_DISPLAY_STATE
{
INBV_DISPLAY_STATE_OWNED,
INBV_DISPLAY_STATE_DISABLED,
INBV_DISPLAY_STATE_LOST
} INBV_DISPLAY_STATE;
//
// Function Callbacks
//
typedef
BOOLEAN
(NTAPI *INBV_RESET_DISPLAY_PARAMETERS)(
ULONG Cols,
ULONG Rows
);
typedef
VOID
(NTAPI *INBV_DISPLAY_STRING_FILTER)(
PCHAR *Str
);
#endif
#endif

View File

@@ -25,6 +25,20 @@ Author:
#include <umtypes.h>
#include <iotypes.h>
//
// I/O Functions
//
#ifndef NTOS_MODE_USER
VOID
FASTCALL
IoAssignDriveLetters(
IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
IN PSTRING NtDeviceName,
OUT PUCHAR NtSystemPath,
OUT PSTRING NtSystemPathString
);
#endif
//
// Native calls
//
@@ -32,8 +46,16 @@ NTSYSCALLAPI
NTSTATUS
NTAPI
NtAddBootEntry(
IN PUNICODE_STRING EntryName,
IN PUNICODE_STRING EntryValue
IN PBOOT_ENTRY BootEntry,
IN ULONG Id
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtAddDriverEntry(
IN PEFI_DRIVER_ENTRY BootEntry,
IN ULONG Id
);
NTSYSCALLAPI
@@ -105,12 +127,19 @@ NtCreateNamedPipeFile(
IN PLARGE_INTEGER DefaultTimeOut
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtDeleteDriverEntry(
IN ULONG Id
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtDeleteBootEntry(
IN PUNICODE_STRING EntryName,
IN PUNICODE_STRING EntryValue
IN ULONG Id
);
NTSYSCALLAPI
@@ -144,6 +173,14 @@ NtEnumerateBootEntries(
IN PULONG BufferLength
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtEnumerateDriverEntries(
IN PVOID Buffer,
IN PULONG BufferLength
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -196,6 +233,20 @@ NtLockFile(
IN BOOLEAN ExclusiveLock
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtModifyBootEntry(
IN PBOOT_ENTRY BootEntry
);
NTSYSCALLAPI
NTSTATUS
NTAPI
NtModifyDriverEntry(
IN PEFI_DRIVER_ENTRY DriverEntry
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -240,6 +291,13 @@ NtQueryAttributesFile(
OUT PFILE_BASIC_INFORMATION FileInformation
);
NTSTATUS
NTAPI
NtQueryDriverEntryOrder(
IN PULONG Ids,
IN PULONG Count
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -401,6 +459,13 @@ NtSetBootOptions(
IN ULONG FieldsToChange
);
NTSTATUS
NTAPI
NtSetDriverEntryOrder(
IN PULONG Ids,
IN PULONG Count
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -620,7 +685,6 @@ ZwDeviceIoControlFile(
IN ULONG OutputBufferSize
);
#ifdef NTOS_MODE_USER
NTSYSAPI
NTSTATUS
NTAPI
@@ -628,7 +692,6 @@ ZwFlushBuffersFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock
);
#endif
NTSYSAPI
NTSTATUS
@@ -956,3 +1019,4 @@ ZwWriteFileGather(
#endif

View File

@@ -23,9 +23,7 @@ Author:
// Dependencies
//
#include <umtypes.h>
#if !defined(_NTIFS_)
typedef PVOID PFS_FILTER_CALLBACKS;
#endif
#include <ifssupp.h>
//
// I/O Completion Access Rights
@@ -126,6 +124,11 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
#define FILE_REMOVABLE_MEDIA 0x00000001
#define FILE_REMOTE_DEVICE 0x00000010
//
// File Object Flags
//
#define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000
//
// Device Object Extension Flags
//
@@ -186,6 +189,11 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
#define DNUF_DONT_SHOW_IN_UI 0x0002
#define DNUF_NOT_DISABLEABLE 0x0008
//
// Internal Option Flags
//
#define IO_ATTACH_DEVICE_API 0x80000000
//
// Undocumented WMI Registration Flags
//
@@ -1101,6 +1109,34 @@ typedef struct _BOOT_OPTIONS
WCHAR HeadlessRedirection[1];
} BOOT_OPTIONS, *PBOOT_OPTIONS;
//
// Firmware Boot Entry
//
typedef struct _BOOT_ENTRY
{
ULONG Version;
ULONG Length;
ULONG Id;
ULONG Attributes;
ULONG FriendlyNameOffset;
ULONG BootFilePathOffset;
ULONG OsOptionsLength;
CHAR OsOptions[1];
} BOOT_ENTRY, *PBOOT_ENTRY;
//
// Firmware Driver Entry
//
typedef struct _EFI_DRIVER_ENTRY
{
ULONG Version;
ULONG Length;
ULONG Id;
ULONG Attributes;
ULONG FriendlyNameOffset;
ULONG DriverFilePathOffset;
} EFI_DRIVER_ENTRY, *PEFI_DRIVER_ENTRY;
//
// APC Callback for NtCreateFile
//

View File

@@ -27,29 +27,6 @@ Author:
#ifndef NTOS_MODE_USER
//
// Port Functions
//
UCHAR
NTAPI
KdPollBreakIn(VOID);
NTSTATUS
NTAPI
KdRestore(IN BOOLEAN DisableDbgPorts);
NTSTATUS
NTAPI
KdSave(IN ULONG Unknown);
#ifdef _ARC_
NTSTATUS
NTAPI
KdDebuggerInitialize0(
IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock
);
#endif
//
// Debugger API
//
@@ -65,6 +42,12 @@ KdSystemDebugControl(
KPROCESSOR_MODE PreviousMode
);
BOOLEAN
NTAPI
KdPollBreakIn(
VOID
);
#endif
//

View File

@@ -52,6 +52,7 @@ Author:
#define BREAKPOINT_PROMPT 2
#define BREAKPOINT_LOAD_SYMBOLS 3
#define BREAKPOINT_UNLOAD_SYMBOLS 4
#define BREAKPOINT_COMMAND_STRING 5
//
// Debug Control Codes for NtSystemDebugcontrol
@@ -161,4 +162,15 @@ typedef struct _SYSDBG_TRIAGE_DUMP
PHANDLE Handles;
} SYSDBG_TRIAGE_DUMP, *PSYSDBG_TRIAGE_DUMP;
//
// KD Structures
//
typedef struct _KD_SYMBOLS_INFO
{
PVOID BaseOfDll;
ULONG_PTR ProcessId;
ULONG CheckSum;
ULONG SizeOfImage;
} KD_SYMBOLS_INFO, *PKD_SYMBOLS_INFO;
#endif // _KDTYPES_H

View File

@@ -43,6 +43,15 @@ KeInitializeApc(
IN PVOID Context
);
BOOLEAN
NTAPI
KeInsertQueueApc(
IN PKAPC Apc,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2,
IN KPRIORITY PriorityBoost
);
VOID
NTAPI
KiDeliverApc(
@@ -186,6 +195,12 @@ KeIsExecutingDpc(
VOID
);
VOID
NTAPI
KeFlushQueuedDpcs(
VOID
);
BOOLEAN
NTAPI
KiIpiServiceRoutine(
@@ -348,6 +363,12 @@ NtFlushInstructionCache(
IN ULONG NumberOfBytesToFlush
);
ULONG
NTAPI
NtGetCurrentProcessorNumber(
VOID
);
NTSYSCALLAPI
NTSTATUS
NTAPI

View File

@@ -39,6 +39,11 @@ Author:
//
#define SSDT_MAX_ENTRIES 2
//
// Processor Architectures
//
#define PROCESSOR_ARCHITECTURE_INTEL 0
//
// Object Type Mask for Kernel Dispatcher Objects
//
@@ -87,15 +92,23 @@ Author:
#define KF_3DNOW 0x00004000
#define KF_AMDK6MTRR 0x00008000
#define KF_XMMI64 0x00010000
#define KF_NX_DISABLED 0x00400000
#define KF_NX_ENABLED 0x00800000
#define KF_DTS 0x00020000
#define KF_NX_BIT 0x20000000
#define KF_NX_DISABLED 0x40000000
#define KF_NX_ENABLED 0x80000000
//
// Internal Exception Codes
//
#define KI_EXCEPTION_INTERNAL 0x10000000
#define KI_EXCEPTION_ACCESS_VIOLATION (KI_EXCEPTION_INTERNAL | 0x04)
//
// KPCR Access for non-IA64 builds
//
#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
#define PCR ((volatile KPCR * const)K0IPCR)
#ifdef _WE_USE_THE_SAME_PCR_ADDRESS
#if !defined(CONFIG_SMP) && !defined(NT_BUILD)
#define KeGetPcr() PCR
#else
#define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
@@ -280,6 +293,27 @@ typedef enum _KTHREAD_STATE
#endif
} KTHREAD_STATE, *PKTHREAD_STATE;
//
// Adjust reasons
//
typedef enum _ADJUST_REASON
{
AdjustNone = 0,
AdjustUnwait = 1,
AdjustBoost = 2
} ADJUST_REASON;
//
// Continue Status
//
typedef enum _KCONTINUE_STATUS
{
ContinueError = 0,
ContinueSuccess,
ContinueProcessorReselected,
ContinueNextProcessor
} KCONTINUE_STATUS;
//
// Process States
//
@@ -588,14 +622,14 @@ typedef struct _KINTERRUPT
KSPIN_LOCK SpinLock;
ULONG TickCount;
PKSPIN_LOCK ActualLock;
PVOID DispatchAddress;
PKINTERRUPT_ROUTINE DispatchAddress;
ULONG Vector;
KIRQL Irql;
KIRQL SynchronizeIrql;
BOOLEAN FloatingSave;
BOOLEAN Connected;
CHAR Number;
UCHAR ShareVector;
CCHAR Number;
BOOLEAN ShareVector;
KINTERRUPT_MODE Mode;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
KINTERRUPT_POLARITY Polarity;
@@ -669,7 +703,6 @@ typedef enum _KOBJECTS
//
// Kernel Thread (KTHREAD)
//
#include <pshpack1.h>
typedef struct _KTHREAD
{
DISPATCHER_HEADER DispatcherHeader;
@@ -690,31 +723,31 @@ typedef struct _KTHREAD
{
UCHAR ApcStateFill[23];
UCHAR ApcQueueable;
};
};
volatile UCHAR NextProcessor;
volatile UCHAR DeferredProcessor;
UCHAR AdjustReason;
SCHAR AdjustIncrement;
};
};
KSPIN_LOCK ApcQueueLock;
ULONG ContextSwitches;
volatile UCHAR State;
UCHAR NpxState;
UCHAR WaitIrql;
SCHAR WaitMode;
LONG WaitStatus;
KIRQL WaitIrql;
KPROCESSOR_MODE WaitMode;
LONG_PTR WaitStatus;
union
{
PKWAIT_BLOCK WaitBlockList;
PKGATE GateObject;
};
UCHAR Alertable;
UCHAR WaitNext;
BOOLEAN Alertable;
BOOLEAN WaitNext;
UCHAR WaitReason;
SCHAR Priority;
UCHAR EnableStackSwap;
BOOLEAN EnableStackSwap;
volatile UCHAR SwapBusy;
UCHAR Alerted[2];
BOOLEAN Alerted[MaximumMode];
union
{
LIST_ENTRY WaitListEntry;
@@ -735,8 +768,9 @@ typedef struct _KTHREAD
union
{
KTIMER Timer;
struct
{
UCHAR TimerFill[40];
};
union
{
struct
@@ -754,21 +788,20 @@ typedef struct _KTHREAD
};
LONG ThreadFlags;
};
PVOID Padding;
union
{
KWAIT_BLOCK WaitBlock[4];
};
};
union
{
KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];
struct
{
UCHAR WaitBlockFill0[23];
UCHAR SystemAffinityActive;
BOOLEAN SystemAffinityActive;
};
struct
{
UCHAR WaitBlockFill1[47];
SCHAR PreviousMode;
CCHAR PreviousMode;
};
struct
{
@@ -781,7 +814,6 @@ typedef struct _KTHREAD
UCHAR LargeStack;
};
};
};
LIST_ENTRY QueueListEntry;
PKTRAP_FRAME TrapFrame;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
@@ -791,15 +823,15 @@ typedef struct _KTHREAD
PVOID ServiceTable;
UCHAR ApcStateIndex;
UCHAR IdealProcessor;
UCHAR Preempted;
BOOLEAN Preempted;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
UCHAR CalloutActive;
BOOLEAN CalloutActive;
#else
UCHAR ProcessReadyQueue;
BOOLEAN ProcessReadyQueue;
#endif
UCHAR KernelStackResident;
CHAR BasePriority;
CHAR PriorityDecrement;
BOOLEAN KernelStackResident;
SCHAR BasePriority;
SCHAR PriorityDecrement;
CHAR Saturation;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
ULONG SystemCallNumber;
@@ -823,13 +855,11 @@ typedef struct _KTHREAD
union
{
KAPC_STATE SavedApcState;
union
struct
{
UCHAR SavedApcStateFill[23];
SCHAR FreezeCount;
};
};
SCHAR SuspendCount;
CCHAR FreezeCount;
CCHAR SuspendCount;
UCHAR UserIdealProcessor;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
union
@@ -846,6 +876,8 @@ typedef struct _KTHREAD
UCHAR CalloutActive;
#endif
UCHAR Iopl;
};
};
PVOID Win32Thread;
PVOID StackBase;
union
@@ -884,15 +916,18 @@ typedef struct _KTHREAD
{
UCHAR SuspendApcFill5[47];
UCHAR PowerState;
};
};
ULONG UserTime;
};
};
union
{
KSEMAPHORE SuspendSemaphore;
struct
{
UCHAR SuspendSemaphorefill[20];
};
ULONG SListFaultCount;
};
};
LIST_ENTRY ThreadListEntry;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
LIST_ENTRY MutantListHead;
@@ -902,7 +937,6 @@ typedef struct _KTHREAD
PVOID MdlForLockedteb;
#endif
} KTHREAD;
#include <poppack.h>
#define ASSERT_THREAD(object) \
ASSERT((((object)->DispatcherHeader.Type & KOBJECT_TYPE_MASK) == ThreadObject))
@@ -914,7 +948,12 @@ typedef struct _KPROCESS
{
DISPATCHER_HEADER Header;
LIST_ENTRY ProfileListHead;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
ULONG DirectoryTableBase;
ULONG Unused0;
#else
LARGE_INTEGER DirectoryTableBase;
#endif
#if defined(_M_IX86)
KGDTENTRY LdtDescriptor;
KIDTENTRY Int21Descriptor;

View File

@@ -99,4 +99,12 @@ LdrUnlockLoaderLock(
IN ULONG Cookie OPTIONAL
);
BOOLEAN
NTAPI
LdrVerifyMappedImageMatchesChecksum(
IN PVOID BaseAddress,
IN ULONG NumberOfBytes,
IN ULONG FileLength
);
#endif

View File

@@ -49,7 +49,14 @@ Author:
#define LDRP_IMAGE_NOT_AT_BASE 0x00200000
#define LDRP_COR_IMAGE 0x00400000
#define LDR_COR_OWNS_UNMAP 0x00800000
#define LDRP_SYSTEM_MAPPED 0x01000000
#define LDRP_IMAGE_VERIFYING 0x02000000
#define LDRP_DRIVER_DEPENDENT_DLL 0x04000000
#define LDRP_ENTRY_NATIVE 0x08800000
#define LDRP_REDIRECTED 0x10000000
#define LDRP_NON_PAGED_DEBUG_INFO 0x20000000
#define LDRP_MM_LOADED 0x40000000
#define LDRP_COMPAT_DATABASE_PROCESSED 0x80000000
//
// Dll Characteristics for LdrLoadDll
@@ -67,6 +74,11 @@ Author:
#define LDR_LOCK_LOADER_LOCK_FLAG_RAISE_STATUS 0x00000001
#define LDR_LOCK_LOADER_LOCK_FLAG_TRY_ONLY 0x00000002
//
// FIXME: THIS SHOULD *NOT* BE USED!
//
#define IMAGE_SCN_TYPE_NOLOAD 0x00000002
//
// Loader Data stored in the PEB
//
@@ -112,6 +124,15 @@ typedef struct _LDR_DATA_TABLE_ENTRY
PVOID PatchInformation;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
//
// Loaded Imports Reference Counting in Kernel
//
typedef struct _LOAD_IMPORTS
{
SIZE_T Count;
PLDR_DATA_TABLE_ENTRY Entry[1];
} LOAD_IMPORTS, *PLOAD_IMPORTS;
//
// Loader Resource Information
//

View File

@@ -24,6 +24,27 @@ Author:
//
#include <umtypes.h>
//
// LPC Exports
//
#ifndef NTOS_MODE_USER
NTKERNELAPI
NTSTATUS
NTAPI
LpcRequestWaitReplyPort(
IN PVOID Port,
IN PPORT_MESSAGE LpcMessageRequest,
OUT PPORT_MESSAGE LpcMessageReply
);
NTSTATUS
NTAPI
LpcRequestPort(
IN PVOID Port,
IN PPORT_MESSAGE LpcMessage
);
#endif
//
// Native calls
//
@@ -109,6 +130,12 @@ NtQueryInformationPort(
PULONG ReturnLength
);
NTSTATUS
NTAPI
NtQueryPortInformationProcess(
VOID
);
NTSYSCALLAPI
NTSTATUS
NTAPI

View File

@@ -23,7 +23,7 @@ Author:
// Dependencies
//
#include <umtypes.h>
#include <pstypes.h>
//#include <pstypes.h>
//
// Internal helper macro
@@ -39,8 +39,22 @@ Author:
//
// Port Object Access Masks
//
#define PORT_CONNECT 0x1
#define PORT_ALL_ACCESS 0x1
//
// Port Object Flags
//
#define LPCP_CONNECTION_PORT 0x00000001
#define LPCP_UNCONNECTED_PORT 0x00000002
#define LPCP_COMMUNICATION_PORT 0x00000003
#define LPCP_CLIENT_PORT 0x00000004
#define LPCP_PORT_TYPE_MASK 0x0000000F
#define LPCP_PORT_DELETED 0x10000000
#define LPCP_WAITABLE_PORT 0x20000000
#define LPCP_NAME_DELETED 0x40000000
#define LPCP_SECURITY_DYNAMIC 0x80000000
//
// LPC Message Types
//
@@ -170,7 +184,7 @@ typedef struct _LPCP_NONPAGED_PORT_QUEUE
typedef struct _LPCP_PORT_QUEUE
{
PLPCP_NONPAGED_PORT_QUEUE NonPagedPortQueue;
KSEMAPHORE Semaphore;
PKSEMAPHORE Semaphore;
LIST_ENTRY ReceiveHead;
} LPCP_PORT_QUEUE, *PLPCP_PORT_QUEUE;
@@ -179,8 +193,6 @@ typedef struct _LPCP_PORT_QUEUE
//
typedef struct _LPCP_PORT_OBJECT
{
ULONG Length;
ULONG Flags;
struct _LPCP_PORT_OBJECT *ConnectionPort;
struct _LPCP_PORT_OBJECT *ConnectedPort;
LPCP_PORT_QUEUE MsgQueue;
@@ -188,13 +200,17 @@ typedef struct _LPCP_PORT_OBJECT
PVOID ClientSectionBase;
PVOID ServerSectionBase;
PVOID PortContext;
ULONG MaxMessageLength;
ULONG MaxConnectionInfoLength;
PETHREAD ClientThread;
SECURITY_QUALITY_OF_SERVICE SecurityQos;
SECURITY_CLIENT_CONTEXT StaticSecurity;
LIST_ENTRY LpcReplyChainHead;
LIST_ENTRY LpcDataInfoChainHead;
PEPROCESS ServerProcess;
PEPROCESS MappingProcess;
ULONG MaxMessageLength;
ULONG MaxConnectionInfoLength;
ULONG Flags;
KEVENT WaitEvent;
} LPCP_PORT_OBJECT, *PLPCP_PORT_OBJECT;
//

View File

@@ -29,6 +29,19 @@ Author:
//
// Section Functions
//
NTSTATUS
NTAPI
MmCreateSection(
OUT PVOID *SectionObject,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN PLARGE_INTEGER MaximumSize,
IN ULONG SectionPageProtection,
IN ULONG AllocationAttributes,
IN HANDLE FileHandle OPTIONAL,
IN PFILE_OBJECT File OPTIONAL
);
NTSTATUS
NTAPI
MmMapViewOfSection(
@@ -64,6 +77,14 @@ NtAreMappedFilesTheSame(
IN PVOID File2MappedAsFile
);
NTSTATUS
NTAPI
NtAllocateUserPhysicalPages(
IN HANDLE ProcessHandle,
IN OUT PULONG NumberOfPages,
IN OUT PULONG UserPfnArray
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -117,6 +138,14 @@ NtFlushVirtualMemory(
OUT PULONG NumberOfBytesFlushed OPTIONAL
);
NTSTATUS
NTAPI
NtFreeUserPhysicalPages(
IN HANDLE ProcessHandle,
IN OUT PULONG NumberOfPages,
IN OUT PULONG UserPfnArray
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -127,6 +156,19 @@ NtFreeVirtualMemory(
IN ULONG FreeType
);
NTSTATUS
NTAPI
NtGetWriteWatch(
IN HANDLE ProcessHandle,
IN ULONG Flags,
IN PVOID BaseAddress,
IN ULONG RegionSize,
IN PVOID *UserAddressArray,
OUT PULONG EntriesInUserAddressArray,
OUT PULONG Granularity
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -137,6 +179,22 @@ NtLockVirtualMemory(
PULONG NumberOfBytesLocked
);
NTSTATUS
NTAPI
NtMapUserPhysicalPages(
IN PVOID *VirtualAddresses,
IN ULONG NumberOfPages,
IN OUT PULONG UserPfnArray
);
NTSTATUS
NTAPI
NtMapUserPhysicalPagesScatter(
IN PVOID *VirtualAddresses,
IN ULONG NumberOfPages,
IN OUT PULONG UserPfnArray
);
NTSYSCALLAPI
NTSTATUS
NTAPI
@@ -207,6 +265,14 @@ NtReadVirtualMemory(
OUT PULONG NumberOfBytesRead
);
NTSTATUS
NTAPI
NtResetWriteWatch(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN ULONG RegionSize
);
NTSYSCALLAPI
NTSTATUS
NTAPI

Some files were not shown because too many files have changed in this diff Show More