Preparations for checked/free like builds (CPRINT == DbgPrint when DBG is defined).

Modified loadros to support loading symbol files early at startup.
Modified loadros to convey BIOS memory map to the kernel if available.
Began building PnP manager device tree.
Added shutdown command to shell.exe

svn path=/trunk/; revision=1852
This commit is contained in:
Casper Hornstrup 2001-05-01 23:08:21 +00:00
parent 58e60b3092
commit 87589daf4e
50 changed files with 2281 additions and 628 deletions

View file

@ -16,6 +16,7 @@ include rules.mak
# Required to run the system # Required to run the system
# #
COMPONENTS = iface_native iface_additional ntoskrnl COMPONENTS = iface_native iface_additional ntoskrnl
BUS = acpi isapnp
DLLS = ntdll kernel32 crtdll advapi32 fmifs gdi32 secur32 user32 ws2_32 msafd msvcrt DLLS = ntdll kernel32 crtdll advapi32 fmifs gdi32 secur32 user32 ws2_32 msafd msvcrt
SUBSYS = smss win32k csrss SUBSYS = smss win32k csrss
@ -66,11 +67,11 @@ NET_APPS = ping
KERNEL_SERVICES = $(DEVICE_DRIVERS) $(INPUT_DRIVERS) $(FS_DRIVERS) $(NET_DRIVERS) $(NET_DEVICE_DRIVERS) KERNEL_SERVICES = $(DEVICE_DRIVERS) $(INPUT_DRIVERS) $(FS_DRIVERS) $(NET_DRIVERS) $(NET_DEVICE_DRIVERS)
all: buildno $(COMPONENTS) $(DLLS) $(SUBSYS) $(LOADERS) $(KERNEL_SERVICES) $(SYS_APPS) $(APPS) $(NET_APPS) all: buildno $(COMPONENTS) $(BUS) $(DLLS) $(SUBSYS) $(LOADERS) $(KERNEL_SERVICES) $(SYS_APPS) $(APPS) $(NET_APPS)
.PHONY: all .PHONY: all
clean: buildno_clean $(COMPONENTS:%=%_clean) $(DLLS:%=%_clean) $(LOADERS:%=%_clean) \ clean: buildno_clean $(COMPONENTS:%=%_clean) $(BUS:%=%_clean) $(DLLS:%=%_clean) $(LOADERS:%=%_clean) \
$(KERNEL_SERVICES:%=%_clean) $(SUBSYS:%=%_clean) $(SYS_APPS:%=%_clean) $(APPS:%=%_clean) $(KERNEL_SERVICES:%=%_clean) $(SUBSYS:%=%_clean) $(SYS_APPS:%=%_clean) $(APPS:%=%_clean)
.PHONY: clean .PHONY: clean
@ -94,12 +95,14 @@ rmkdir$(EXE_POSTFIX): rmkdir.c
endif endif
install: rcopy$(EXE_POSTFIX) rmkdir$(EXE_POSTFIX) make_install_dirs autoexec_install $(COMPONENTS:%=%_install) \ install: rcopy$(EXE_POSTFIX) rmkdir$(EXE_POSTFIX) make_install_dirs autoexec_install \
$(COMPONENTS:%=%_install) $(BUS:%=%_install) \
$(DLLS:%=%_install) $(LOADERS:%=%_install) \ $(DLLS:%=%_install) $(LOADERS:%=%_install) \
$(KERNEL_SERVICES:%=%_install) $(SUBSYS:%=%_install) \ $(KERNEL_SERVICES:%=%_install) $(SUBSYS:%=%_install) \
$(SYS_APPS:%=%_install) $(APPS:%=%_install) $(SYS_APPS:%=%_install) $(APPS:%=%_install)
dist: rcopy$(EXE_POSTFIX) clean_dist_dir make_dist_dirs $(COMPONENTS:%=%_dist) $(DLLS:%=%_dist) \ dist: rcopy$(EXE_POSTFIX) clean_dist_dir make_dist_dirs $(COMPONENTS:%=%_dist) \
$(BUS:%=%_dist) $(DLLS:%=%_dist) \
$(LOADERS:%=%_dist) $(KERNEL_SERVICES:%=%_dist) $(SUBSYS:%=%_dist) \ $(LOADERS:%=%_dist) $(KERNEL_SERVICES:%=%_dist) $(SUBSYS:%=%_dist) \
$(SYS_APPS:%=%_dist) $(APPS:%=%_dist) $(SYS_APPS:%=%_dist) $(APPS:%=%_dist)
@ -197,6 +200,24 @@ iface_additional_dist:
iface_additional iface_additional_clean iface_additional_install \ iface_additional iface_additional_clean iface_additional_install \
iface_additional_dist iface_additional_dist
#
# Bus driver rules
#
$(BUS): %:
make -C services/bus/$*
$(BUS:%=%_clean): %_clean:
make -C services/bus/$* clean
$(BUS:%=%_install): %_install:
make -C services/bus/$* install
$(BUS:%=%_dist): %_dist:
make -C services/bus/$* dist
.PHONY: $(BUS) $(BUS:%=%_clean) \
$(BUS:%=%_install) $(BUS:%=%_dist)
# #
# Device driver rules # Device driver rules
# #

View file

@ -1,4 +1,4 @@
/* $Id: ping.c,v 1.3 2001/01/27 22:38:42 ea Exp $ /* $Id: ping.c,v 1.4 2001/05/01 23:08:17 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS ping utility * PROJECT: ReactOS ping utility
@ -21,7 +21,9 @@
/* Should be in the header files somewhere (exported by ntdll.dll) */ /* Should be in the header files somewhere (exported by ntdll.dll) */
long atol(const char *str); long atol(const char *str);
#ifndef __int64
typedef long long __int64; typedef long long __int64;
#endif
char * _i64toa(__int64 value, char *string, int radix); char * _i64toa(__int64 value, char *string, int radix);
@ -126,8 +128,8 @@ VOID Reset(VOID)
if (UsePerformanceCounter) { if (UsePerformanceCounter) {
/* Performance counters may return incorrect results on some multiprocessor /* Performance counters may return incorrect results on some multiprocessor
platforms so we restrict execution on the first processor. This may fail on platforms so we restrict execution on the first processor. This may fail
Windows NT so we fall back to GetCurrentTick() for timing */ on Windows NT so we fall back to GetCurrentTick() for timing */
if (SetThreadAffinityMask (GetCurrentThread(), 1) == 0) { if (SetThreadAffinityMask (GetCurrentThread(), 1) == 0) {
UsePerformanceCounter = FALSE; UsePerformanceCounter = FALSE;
} }
@ -187,7 +189,11 @@ BOOL ParseCmdline(int argc, char* argv[])
INT i; INT i;
BOOL ShowUsage; BOOL ShowUsage;
BOOL FoundTarget; BOOL FoundTarget;
#if 0
lstrcpy(TargetName, "127.0.0.1");
PingCount = 1;
return TRUE;
#endif
if (argc < 2) { if (argc < 2) {
ShowUsage = TRUE; ShowUsage = TRUE;
} else { } else {
@ -213,7 +219,7 @@ BOOL ParseCmdline(int argc, char* argv[])
case 'f': DontFragment = TRUE; break; case 'f': DontFragment = TRUE; break;
case 'i': TTLValue = GetULONG2(&argv[i][2], argv[i + 1], &i); break; case 'i': TTLValue = GetULONG2(&argv[i][2], argv[i + 1], &i); break;
case 'v': TOSValue = GetULONG2(&argv[i][2], argv[i + 1], &i); break; case 'v': TOSValue = GetULONG2(&argv[i][2], argv[i + 1], &i); break;
case 'w': Timeout = GetULONG2(&argv[i][2], argv[i + 1], &i); break; case 'w': Timeout = GetULONG2(&argv[i][2], argv[i + 1], &i); break;
default: default:
printf("Bad option %s.\n", argv[i]); printf("Bad option %s.\n", argv[i]);
Usage(); Usage();
@ -228,7 +234,7 @@ BOOL ParseCmdline(int argc, char* argv[])
printf("Bad parameter %s.\n", argv[i]); printf("Bad parameter %s.\n", argv[i]);
return FALSE; return FALSE;
} else { } else {
strcpy(TargetName, argv[i]); lstrcpy(TargetName, argv[i]);
FoundTarget = TRUE; FoundTarget = TRUE;
} }
} }
@ -268,11 +274,11 @@ WORD Checksum(PUSHORT data, UINT size)
/* Prepare to ping target */ /* Prepare to ping target */
BOOL Setup(VOID) BOOL Setup(VOID)
{ {
WORD wVersionRequested; WORD wVersionRequested;
WSADATA WsaData; WSADATA WsaData;
INT Status; INT Status;
ULONG Addr; ULONG Addr;
PHOSTENT phe; PHOSTENT phe;
wVersionRequested = MAKEWORD(2, 2); wVersionRequested = MAKEWORD(2, 2);
@ -311,14 +317,14 @@ BOOL Setup(VOID)
Target.sin_family = AF_INET; Target.sin_family = AF_INET;
} }
TargetIP = inet_ntoa(Target.sin_addr); TargetIP = inet_ntoa(Target.sin_addr);
CurrentSeqNum = 0; CurrentSeqNum = 0;
SentCount = 0; SentCount = 0;
LostCount = 0; LostCount = 0;
MinRTT.QuadPart = 0; MinRTT.QuadPart = 0;
MaxRTT.QuadPart = 0; MaxRTT.QuadPart = 0;
SumRTT.QuadPart = 0; SumRTT.QuadPart = 0;
MinRTTSet = FALSE; MinRTTSet = FALSE;
return TRUE; return TRUE;
} }
@ -443,11 +449,11 @@ BOOL Ping(VOID)
Packet = (PICMP_ECHO_PACKET)Buffer; Packet = (PICMP_ECHO_PACKET)Buffer;
/* Assemble ICMP echo request packet */ /* Assemble ICMP echo request packet */
Packet->Icmp.Type = ICMPMSG_ECHOREQUEST; Packet->Icmp.Type = ICMPMSG_ECHOREQUEST;
Packet->Icmp.Code = 0; Packet->Icmp.Code = 0;
Packet->Icmp.Id = (USHORT)GetCurrentProcessId(); Packet->Icmp.Id = (USHORT)GetCurrentProcessId();
Packet->Icmp.SeqNum = (USHORT)CurrentSeqNum; Packet->Icmp.SeqNum = (USHORT)CurrentSeqNum;
Packet->Icmp.Checksum = 0; Packet->Icmp.Checksum = 0;
/* Timestamp is part of data area */ /* Timestamp is part of data area */
QueryTime(&Packet->Timestamp); QueryTime(&Packet->Timestamp);
@ -502,11 +508,13 @@ BOOL Ping(VOID)
if (Status == 0) { if (Status == 0) {
printf("Request timed out.\n"); printf("Request timed out.\n");
LostCount++;
GlobalFree(Buffer); GlobalFree(Buffer);
return TRUE; return TRUE;
} }
if (!DecodeResponse(Buffer, Status, (PSOCKADDR_IN)&From)) { if (!DecodeResponse(Buffer, Status, (PSOCKADDR_IN)&From)) {
/* FIXME: Wait again as it could be another ICMP message type */
printf("Request timed out.\n"); printf("Request timed out.\n");
LostCount++; LostCount++;
} }
@ -520,9 +528,9 @@ BOOL Ping(VOID)
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
UINT Count; UINT Count;
CHAR MinTime[20]; CHAR MinTime[20];
CHAR MaxTime[20]; CHAR MaxTime[20];
CHAR AvgTime[20]; CHAR AvgTime[20];
Reset(); Reset();

View file

@ -1,4 +1,4 @@
/* $Id: shutdown.c,v 1.3 2001/01/14 15:28:50 ekohl Exp $ /* $Id: shutdown.c,v 1.4 2001/05/01 23:08:21 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -11,7 +11,7 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
//#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
#include "vfat.h" #include "vfat.h"

View file

@ -53,18 +53,21 @@ enum
{ {
IRP_NOCACHE = 0x1, IRP_NOCACHE = 0x1,
IRP_PAGING_IO = 0x2, IRP_PAGING_IO = 0x2,
IRP_MOUNT_COMPLETION = 0x4, IRP_MOUNT_COMPLETION = 0x2,
IRP_SYNCHRONOUS_API = 0x8, IRP_SYNCHRONOUS_API = 0x4,
IRP_ASSOCIATED_IRP = 0x10, IRP_ASSOCIATED_IRP = 0x8,
IRP_BUFFERED_IO = 0x20, IRP_BUFFERED_IO = 0x10,
IRP_DEALLOCATE_BUFFER = 0x40, IRP_DEALLOCATE_BUFFER = 0x20,
IRP_INPUT_OPERATION = 0x80, IRP_INPUT_OPERATION = 0x40,
IRP_SYNCHRONOUS_PAGING_IO = 0x100, IRP_SYNCHRONOUS_PAGING_IO = 0x40,
IRP_CREATE_OPERATION = 0x200, IRP_CREATE_OPERATION = 0x80,
IRP_READ_OPERATION = 0x400, IRP_READ_OPERATION = 0x100,
IRP_WRITE_OPERATION = 0x800, IRP_WRITE_OPERATION = 0x200,
IRP_CLOSE_OPERATION = 0x1000, IRP_CLOSE_OPERATION = 0x400,
IRP_DEFER_IO_COMPLETION = 0x2000, IRP_DEFER_IO_COMPLETION = 0x800,
IRP_OB_QUERY_NAME = 0x1000,
IRP_HOLD_DEVICE_QUEUE = 0x2000,
IRP_RETRY_IO_COMPLETION = 0x4000
}; };
#define SL_FORCE_ACCESS_CHECK (0x1) #define SL_FORCE_ACCESS_CHECK (0x1)
@ -96,74 +99,93 @@ enum
/* /*
* Possible flags for the device object flags * Possible flags for the device object flags
*/ */
#define DO_UNLOAD_PENDING 0x00000001 #define DO_UNLOAD_PENDING 0x00000001
#define DO_VERIFY_VOLUME 0x00000002 #define DO_VERIFY_VOLUME 0x00000002
#define DO_BUFFERED_IO 0x00000004 #define DO_BUFFERED_IO 0x00000004
#define DO_EXCLUSIVE 0x00000008 #define DO_EXCLUSIVE 0x00000008
#define DO_DIRECT_IO 0x00000010 #define DO_DIRECT_IO 0x00000010
#define DO_MAP_IO_BUFFER 0x00000020 #define DO_MAP_IO_BUFFER 0x00000020
#define DO_DEVICE_HAS_NAME 0x00000040 #define DO_DEVICE_HAS_NAME 0x00000040
#define DO_DEVICE_INITIALIZING 0x00000080 #define DO_DEVICE_INITIALIZING 0x00000080
#define DO_SYSTEM_BOOT_PARTITION 0x00000100 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
#define DO_LONG_TERM_REQUESTS 0x00000200 #define DO_LONG_TERM_REQUESTS 0x00000200
#define DO_NEVER_LAST_DEVICE 0x00000400 #define DO_NEVER_LAST_DEVICE 0x00000400
#define DO_SHUTDOWN_REGISTERED 0x00000800 #define DO_SHUTDOWN_REGISTERED 0x00000800
#define DO_BUS_ENUMERATED_DEVICE 0x00001000
#define DO_POWER_PAGABLE 0x00002000
#define DO_POWER_INRUSH 0x00004000
#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
/* /*
* Possible device types * Possible device types
*/ */
#define FILE_DEVICE_BEEP 0x00000001 #define FILE_DEVICE_BEEP 0x00000001
#define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM 0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
#define FILE_DEVICE_CONTROLLER 0x00000004 #define FILE_DEVICE_CONTROLLER 0x00000004
#define FILE_DEVICE_DATALINK 0x00000005 #define FILE_DEVICE_DATALINK 0x00000005
#define FILE_DEVICE_DFS 0x00000006 #define FILE_DEVICE_DFS 0x00000006
#define FILE_DEVICE_DISK 0x00000007 #define FILE_DEVICE_DISK 0x00000007
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
#define FILE_DEVICE_FILE_SYSTEM 0x00000009 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
#define FILE_DEVICE_INPORT_PORT 0x0000000a #define FILE_DEVICE_INPORT_PORT 0x0000000a
#define FILE_DEVICE_KEYBOARD 0x0000000b #define FILE_DEVICE_KEYBOARD 0x0000000b
#define FILE_DEVICE_MAILSLOT 0x0000000c #define FILE_DEVICE_MAILSLOT 0x0000000c
#define FILE_DEVICE_MIDI_IN 0x0000000d #define FILE_DEVICE_MIDI_IN 0x0000000d
#define FILE_DEVICE_MIDI_OUT 0x0000000e #define FILE_DEVICE_MIDI_OUT 0x0000000e
#define FILE_DEVICE_MOUSE 0x0000000f #define FILE_DEVICE_MOUSE 0x0000000f
#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
#define FILE_DEVICE_NAMED_PIPE 0x00000011 #define FILE_DEVICE_NAMED_PIPE 0x00000011
#define FILE_DEVICE_NETWORK 0x00000012 #define FILE_DEVICE_NETWORK 0x00000012
#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
#define FILE_DEVICE_NULL 0x00000015 #define FILE_DEVICE_NULL 0x00000015
#define FILE_DEVICE_PARALLEL_PORT 0x00000016 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
#define FILE_DEVICE_PRINTER 0x00000018 #define FILE_DEVICE_PRINTER 0x00000018
#define FILE_DEVICE_SCANNER 0x00000019 #define FILE_DEVICE_SCANNER 0x00000019
#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
#define FILE_DEVICE_SERIAL_PORT 0x0000001b #define FILE_DEVICE_SERIAL_PORT 0x0000001b
#define FILE_DEVICE_SCREEN 0x0000001c #define FILE_DEVICE_SCREEN 0x0000001c
#define FILE_DEVICE_SOUND 0x0000001d #define FILE_DEVICE_SOUND 0x0000001d
#define FILE_DEVICE_STREAMS 0x0000001e #define FILE_DEVICE_STREAMS 0x0000001e
#define FILE_DEVICE_TAPE 0x0000001f #define FILE_DEVICE_TAPE 0x0000001f
#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
#define FILE_DEVICE_TRANSPORT 0x00000021 #define FILE_DEVICE_TRANSPORT 0x00000021
#define FILE_DEVICE_UNKNOWN 0x00000022 #define FILE_DEVICE_UNKNOWN 0x00000022
#define FILE_DEVICE_VIDEO 0x00000023 #define FILE_DEVICE_VIDEO 0x00000023
#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
#define FILE_DEVICE_WAVE_IN 0x00000025 #define FILE_DEVICE_WAVE_IN 0x00000025
#define FILE_DEVICE_WAVE_OUT 0x00000026 #define FILE_DEVICE_WAVE_OUT 0x00000026
#define FILE_DEVICE_8042_PORT 0x00000027 #define FILE_DEVICE_8042_PORT 0x00000027
#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
#define FILE_DEVICE_BATTERY 0x00000029 #define FILE_DEVICE_BATTERY 0x00000029
#define FILE_DEVICE_BUS_EXTENDER 0x0000002a #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
#define FILE_DEVICE_MODEM 0x0000002b #define FILE_DEVICE_MODEM 0x0000002b
#define FILE_DEVICE_VDM 0x0000002c #define FILE_DEVICE_VDM 0x0000002c
#define FILE_DEVICE_MASS_STORAGE 0x0000002d
#define FILE_DEVICE_SMB 0x0000002e
#define FILE_DEVICE_KS 0x0000002f
#define FILE_DEVICE_CHANGER 0x00000030
#define FILE_DEVICE_SMARTCARD 0x00000031
#define FILE_DEVICE_ACPI 0x00000032
#define FILE_DEVICE_DVD 0x00000033
#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
#define FILE_DEVICE_DFS_VOLUME 0x00000036
#define FILE_DEVICE_SERENUM 0x00000037
#define FILE_DEVICE_TERMSRV 0x00000038
#define FILE_DEVICE_KSEC 0x00000039
#define FILE_REMOVABLE_MEDIA 0x00000001 #define FILE_REMOVABLE_MEDIA 0x00000001
#define FILE_READ_ONLY_DEVICE 0x00000002 #define FILE_READ_ONLY_DEVICE 0x00000002
#define FILE_FLOPPY_DISKETTE 0x00000004 #define FILE_FLOPPY_DISKETTE 0x00000004
#define FILE_WRITE_ONCE_MEDIA 0x00000008 #define FILE_WRITE_ONCE_MEDIA 0x00000008
#define FILE_REMOTE_DEVICE 0x00000010 #define FILE_REMOTE_DEVICE 0x00000010
#define FILE_DEVICE_IS_MOUNTED 0x00000020 #define FILE_DEVICE_IS_MOUNTED 0x00000020
#define FILE_VIRTUAL_VOLUME 0x00000040 #define FILE_VIRTUAL_VOLUME 0x00000040
#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
#define FILE_DEVICE_SECURE_OPEN 0x00000100
/* /*

View file

@ -1,6 +1,6 @@
#ifndef _INCLUDE_DDK_IOFUNCS_H #ifndef _INCLUDE_DDK_IOFUNCS_H
#define _INCLUDE_DDK_IOFUNCS_H #define _INCLUDE_DDK_IOFUNCS_H
/* $Id: iofuncs.h,v 1.22 2000/12/23 02:37:36 dwelch Exp $ */ /* $Id: iofuncs.h,v 1.23 2001/05/01 23:08:17 chorns Exp $ */
/* --- EXPORTED BY NTOSKRNL --- */ /* --- EXPORTED BY NTOSKRNL --- */
@ -429,6 +429,7 @@ IoConnectInterrupt (
KAFFINITY ProcessorEnableMask, KAFFINITY ProcessorEnableMask,
BOOLEAN FloatingSave BOOLEAN FloatingSave
); );
PCONTROLLER_OBJECT PCONTROLLER_OBJECT
STDCALL STDCALL
IoCreateController ( IoCreateController (
@ -590,6 +591,11 @@ IoGetAttachedDevice (
); );
PDEVICE_OBJECT PDEVICE_OBJECT
STDCALL STDCALL
IoGetAttachedDeviceReference (
PDEVICE_OBJECT DeviceObject
);
PDEVICE_OBJECT
STDCALL
IoGetBaseFileSystemDeviceObject ( IoGetBaseFileSystemDeviceObject (
IN PFILE_OBJECT FileObject IN PFILE_OBJECT FileObject
); );
@ -618,6 +624,16 @@ IoGetConfigurationInformation (
#define IoGetCurrentIrpStackLocation(Irp) \ #define IoGetCurrentIrpStackLocation(Irp) \
((Irp)->Tail.Overlay.CurrentStackLocation) ((Irp)->Tail.Overlay.CurrentStackLocation)
*/ */
#define IoCopyCurrentIrpStackLocationToNext(Irp) { \
PIO_STACK_LOCATION IrpSp; \
PIO_STACK_LOCATION NextIrpSp; \
IrpSp = IoGetCurrentIrpStackLocation((Irp)); \
NextIrpSp = IoGetNextIrpStackLocation((Irp)); \
RtlCopyMemory(NextIrpSp, IrpSp, \
FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
NextIrpSp->Control = 0; }
struct _EPROCESS* struct _EPROCESS*
STDCALL STDCALL
IoGetCurrentProcess ( IoGetCurrentProcess (

View file

@ -1,4 +1,4 @@
/* $Id: iotypes.h,v 1.27 2001/05/01 11:04:52 ekohl Exp $ /* $Id: iotypes.h,v 1.28 2001/05/01 23:08:17 chorns Exp $
* *
*/ */
@ -104,6 +104,147 @@ typedef struct _IO_SECURITY_CONTEXT
ULONG FullCreateOptions; ULONG FullCreateOptions;
} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT; } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
typedef struct _IO_RESOURCE_DESCRIPTOR
{
UCHAR Option;
UCHAR Type;
UCHAR ShareDisposition;
/*
* Reserved for system use
*/
UCHAR Spare1;
USHORT Flags;
/*
* Reserved for system use
*/
UCHAR Spare2;
union
{
struct
{
ULONG Length;
ULONG Alignment;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Port;
struct
{
ULONG Length;
ULONG Alignment;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Memory;
struct
{
ULONG MinimumVector;
ULONG MaximumVector;
} Interrupt;
struct
{
ULONG MinimumChannel;
ULONG MaximumChannel;
} Dma;
} u;
} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
// IO_RESOURCE_DESCRIPTOR Options
#define IO_RESOURCE_REQUIRED 0x00
#define IO_RESOURCE_PREFERRED 0x01
#define IO_RESOURCE_DEFAULT 0x02
#define IO_RESOURCE_ALTERNATIVE 0x08
typedef struct _IO_RESOURCE_LIST
{
USHORT Version;
USHORT Revision;
ULONG Count;
IO_RESOURCE_DESCRIPTOR Descriptors[1];
} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
/*
* List size in bytes
*/
ULONG ListSize;
/*
* System defined enum for the bus
*/
INTERFACE_TYPE InterfaceType;
ULONG BusNumber;
ULONG SlotNumber;
ULONG Reserved[3];
ULONG AlternativeLists;
IO_RESOURCE_LIST List[1];
} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
typedef struct
{
UCHAR Type;
UCHAR ShareDisposition;
USHORT Flags;
union
{
struct
{
PHYSICAL_ADDRESS Start;
ULONG Length;
} Port;
struct
{
ULONG Level;
ULONG Vector;
ULONG Affinity;
} Interrupt;
struct
{
PHYSICAL_ADDRESS Start;
ULONG Length;
} Memory;
struct
{
ULONG Channel;
ULONG Port;
ULONG Reserved1;
} Dma;
struct
{
ULONG DataSize;
ULONG Reserved1;
ULONG Reserved2;
} DeviceSpecificData;
} u;
} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
typedef struct
{
USHORT Version;
USHORT Revision;
ULONG Count;
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
} CM_PARTIAL_RESOURCE_LIST;
typedef struct
{
INTERFACE_TYPE InterfaceType;
ULONG BusNumber;
CM_PARTIAL_RESOURCE_LIST PartialResourceList;
} CM_FULL_RESOURCE_DESCRIPTOR;
typedef struct
{
ULONG Count;
CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
/* /*
* PURPOSE: IRP stack location * PURPOSE: IRP stack location
*/ */
@ -193,7 +334,84 @@ typedef struct _IO_STACK_LOCATION
FILE_INFORMATION_CLASS FileInformationClass; FILE_INFORMATION_CLASS FileInformationClass;
ULONG FileIndex; ULONG FileIndex;
} QueryDirectory; } QueryDirectory;
} Parameters; /*
struct
{
ULONG CreateDisposition;
ULONG CreateOptions;
ULONG ShareAccess;
BOOLEAN WriteModeMessage;
BOOLEAN ReadModeMessage;
BOOLEAN NonBlocking;
ULONG MaxInstances;
ULONG InBufferSize;
ULONG OutBufferSize;
LARGE_INTEGER TimeOut;
} CreateNamedPipe;
*/
// Parameters for IRP_MN_QUERY_DEVICE_RELATIONS
struct {
DEVICE_RELATION_TYPE Type;
} QueryDeviceRelations;
// Parameters for IRP_MN_QUERY_INTERFACE
struct {
CONST GUID *InterfaceType;
USHORT Size;
USHORT Version;
PINTERFACE Interface;
PVOID InterfaceSpecificData;
} QueryInterface;
// Parameters for IRP_MN_QUERY_CAPABILITIES
struct {
PDEVICE_CAPABILITIES Capabilities;
} DeviceCapabilities;
// Parameters for IRP_MN_QUERY_ID
struct {
BUS_QUERY_ID_TYPE IdType;
} QueryId;
// Parameters for IRP_MN_QUERY_DEVICE_TEXT
struct {
DEVICE_TEXT_TYPE DeviceTextType;
LCID LocaleId;
} QueryDeviceText;
// Parameters for IRP_MN_DEVICE_USAGE_NOTIFICATION
struct {
BOOLEAN InPath;
BOOLEAN Reserved[3];
DEVICE_USAGE_NOTIFICATION_TYPE Type;
} UsageNotification;
// Parameters for IRP_MN_WAIT_WAKE
struct {
SYSTEM_POWER_STATE PowerState;
} WaitWake;
// Parameter for IRP_MN_POWER_SEQUENCE
struct {
PPOWER_SEQUENCE PowerSequence;
} PowerSequence;
// Parameters for IRP_MN_SET_POWER and IRP_MN_QUERY_POWER
struct {
ULONG SystemContext;
POWER_STATE_TYPE Type;
POWER_STATE State;
POWER_ACTION ShutdownType;
} Power;
// Parameters for IRP_MN_START_DEVICE
struct {
PCM_RESOURCE_LIST AllocatedResources;
PCM_RESOURCE_LIST AllocatedResourcesTranslated;
} StartDevice;
} Parameters;
struct _DEVICE_OBJECT* DeviceObject; struct _DEVICE_OBJECT* DeviceObject;
struct _FILE_OBJECT* FileObject; struct _FILE_OBJECT* FileObject;
@ -580,143 +798,6 @@ typedef struct _DRIVER_LAYOUT_INFORMATION
} DRIVER_LAYOUT_INFORMATION, *PDRIVER_LAYOUT_INFORMATION; } DRIVER_LAYOUT_INFORMATION, *PDRIVER_LAYOUT_INFORMATION;
typedef struct _IO_RESOURCE_DESCRIPTOR
{
UCHAR Option;
UCHAR Type;
UCHAR SharedDisposition;
/*
* Reserved for system use
*/
UCHAR Spare1;
USHORT Flags;
/*
* Reserved for system use
*/
UCHAR Spare2;
union
{
struct
{
ULONG Length;
ULONG Alignment;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Port;
struct
{
ULONG Length;
ULONG Alignment;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Memory;
struct
{
ULONG MinimumVector;
ULONG MaximumVector;
} Interrupt;
struct
{
ULONG MinimumChannel;
ULONG MaximumChannel;
} Dma;
} u;
} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
typedef struct _IO_RESOURCE_LIST
{
USHORT Version;
USHORT Revision;
ULONG Count;
IO_RESOURCE_DESCRIPTOR Descriptors[1];
} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
typedef struct _IO_RESOURCES_REQUIREMENTS_LIST
{
/*
* List size in bytes
*/
ULONG ListSize;
/*
* System defined enum for the bus
*/
INTERFACE_TYPE InterfaceType;
ULONG BusNumber;
ULONG SlotNumber;
ULONG Reserved[3];
ULONG AlternativeLists;
IO_RESOURCE_LIST List[1];
} IO_RESOURCES_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
typedef struct
{
UCHAR Type;
UCHAR ShareDisposition;
USHORT Flags;
union
{
struct
{
PHYSICAL_ADDRESS Start;
ULONG Length;
} Port;
struct
{
ULONG Level;
ULONG Vector;
ULONG Affinity;
} Interrupt;
struct
{
PHYSICAL_ADDRESS Start;
ULONG Length;
} Memory;
struct
{
ULONG Channel;
ULONG Port;
ULONG Reserved1;
} Dma;
struct
{
ULONG DataSize;
ULONG Reserved1;
ULONG Reserved2;
} DeviceSpecificData;
} u;
} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
typedef struct
{
USHORT Version;
USHORT Revision;
ULONG Count;
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
} CM_PARTIAL_RESOURCE_LIST;
typedef struct
{
INTERFACE_TYPE InterfaceType;
ULONG BusNumber;
CM_PARTIAL_RESOURCE_LIST PartialResourceList;
} CM_FULL_RESOURCE_DESCRIPTOR;
typedef struct
{
ULONG Count;
CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
typedef typedef
IO_ALLOCATION_ACTION IO_ALLOCATION_ACTION
(*PDRIVER_CONTROL) ( (*PDRIVER_CONTROL) (

View file

@ -24,6 +24,15 @@ typedef struct _LOADER_MODULE
ULONG Reserved; ULONG Reserved;
} LOADER_MODULE, *PLOADER_MODULE; } LOADER_MODULE, *PLOADER_MODULE;
typedef struct _ADDRESS_RANGE
{
ULONG BaseAddrLow;
ULONG BaseAddrHigh;
ULONG LengthLow;
ULONG LengthHigh;
ULONG Type;
} ADDRESS_RANGE, *PADDRESS_RANGE;
typedef struct _LOADER_PARAMETER_BLOCK typedef struct _LOADER_PARAMETER_BLOCK
{ {
ULONG Flags; ULONG Flags;

View file

@ -1,4 +1,4 @@
/* $Id: ntddk.h,v 1.20 2001/04/16 00:44:54 chorns Exp $ /* $Id: ntddk.h,v 1.21 2001/05/01 23:08:17 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -43,9 +43,9 @@ extern "C"
#include <ddk/obtypes.h> #include <ddk/obtypes.h>
#include <ddk/setypes.h> #include <ddk/setypes.h>
#include <ddk/mmtypes.h> #include <ddk/mmtypes.h>
#include <ddk/iotypes.h>
#include <ddk/potypes.h> #include <ddk/potypes.h>
#include <ddk/pnptypes.h> #include <ddk/pnptypes.h>
#include <ddk/iotypes.h>
#include <ddk/extypes.h> #include <ddk/extypes.h>
#include <ddk/pstypes.h> #include <ddk/pstypes.h>
#include <ddk/zwtypes.h> #include <ddk/zwtypes.h>
@ -59,9 +59,9 @@ extern "C"
#include <ddk/mmfuncs.h> #include <ddk/mmfuncs.h>
#include <ddk/kdfuncs.h> #include <ddk/kdfuncs.h>
#include <ddk/kefuncs.h> #include <ddk/kefuncs.h>
#include <ddk/iofuncs.h>
#include <ddk/pofuncs.h> #include <ddk/pofuncs.h>
#include <ddk/pnpfuncs.h> #include <ddk/pnpfuncs.h>
#include <ddk/iofuncs.h>
#include <ddk/psfuncs.h> #include <ddk/psfuncs.h>
#include <ddk/obfuncs.h> #include <ddk/obfuncs.h>
#include <ddk/dbgfuncs.h> #include <ddk/dbgfuncs.h>

View file

@ -5,15 +5,23 @@ PVOID STDCALL ObCreateObject(PHANDLE Handle,
POBJECT_ATTRIBUTES ObjectAttributes, POBJECT_ATTRIBUTES ObjectAttributes,
POBJECT_TYPE Type); POBJECT_TYPE Type);
/* VOID
* FUNCTION: Decrements the object's reference count and performs retention FASTCALL
* checks ObfDereferenceObject(IN PVOID Object);
* ARGUMENTS:
* Object = Object's body
*/
VOID STDCALL ObDereferenceObject(PVOID Object);
VOID STDCALL ObMakeTemporaryObject(PVOID ObjectBody); VOID
FASTCALL
ObfReferenceObject(IN PVOID Object);
#define ObDereferenceObject(Object) \
ObfDereferenceObject(Object)
#define ObReferenceObject(Object) \
ObfReferenceObject(Object)
VOID
STDCALL
ObMakeTemporaryObject(PVOID ObjectBody);
NTSTATUS STDCALL ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, NTSTATUS STDCALL ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
IN POBJECT_TYPE ObjectType, IN POBJECT_TYPE ObjectType,

View file

@ -1,6 +1,9 @@
#ifndef __INCLUDE_DDK_PNPTYPES_H #ifndef __INCLUDE_DDK_PNPTYPES_H
#define __INCLUDE_DDK_PNPTYPES_H #define __INCLUDE_DDK_PNPTYPES_H
struct _DEVICE_OBJECT;
struct _FILE_OBJECT;
// windows.h may be included before // windows.h may be included before
#ifndef GUID_DEFINED #ifndef GUID_DEFINED
#define GUID_DEFINED #define GUID_DEFINED
@ -14,6 +17,12 @@ typedef struct _GUID {
#endif #endif
typedef struct _PNP_BUS_INFORMATION {
GUID BusTypeGuid;
INTERFACE_TYPE LegacyBusType;
ULONG BusNumber;
} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
typedef struct _DEVICE_CAPABILITIES { typedef struct _DEVICE_CAPABILITIES {
USHORT Size; USHORT Size;
USHORT Version; USHORT Version;
@ -73,6 +82,13 @@ typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE; typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
#define PNP_DEVICE_DISABLED 0x00000001
#define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
#define PNP_DEVICE_FAILED 0x00000004
#define PNP_DEVICE_REMOVED 0x00000008
#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
#define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION { typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
USHORT Version; USHORT Version;
USHORT Size; USHORT Size;
@ -80,7 +96,7 @@ typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
// //
// Event-specific data // Event-specific data
// //
PFILE_OBJECT FileObject; struct _FILE_OBJECT *FileObject;
LONG NameBufferOffset; LONG NameBufferOffset;
UCHAR CustomDataBuffer[1]; UCHAR CustomDataBuffer[1];
} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION; } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
@ -92,7 +108,7 @@ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
// //
// Event-specific data // Event-specific data
// //
PFILE_OBJECT FileObject; struct _FILE_OBJECT *FileObject;
} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
@ -155,7 +171,7 @@ typedef enum _DEVICE_RELATION_TYPE {
typedef struct _DEVICE_RELATIONS { typedef struct _DEVICE_RELATIONS {
ULONG Count; ULONG Count;
PDEVICE_OBJECT Objects[1]; // variable length struct _DEVICE_OBJECT *Objects[1];
} DEVICE_RELATIONS, *PDEVICE_RELATIONS; } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {

View file

@ -1,6 +1,9 @@
#ifndef __INCLUDE_DDK_POTYPES_H #ifndef __INCLUDE_DDK_POTYPES_H
#define __INCLUDE_DDK_POTYPES_H #define __INCLUDE_DDK_POTYPES_H
struct _DEVICE_OBJECT;
struct _IO_STATUS_BLOCK;
// Flags for PoSetSystemState // Flags for PoSetSystemState
typedef ULONG EXECUTION_STATE; typedef ULONG EXECUTION_STATE;
@ -59,10 +62,41 @@ typedef enum _POWER_STATE_TYPE {
typedef typedef
VOID VOID
(*PREQUEST_POWER_COMPLETE) ( (*PREQUEST_POWER_COMPLETE) (
IN PDEVICE_OBJECT DeviceObject, IN struct _DEVICE_OBJECT *DeviceObject,
IN UCHAR MinorFunction, IN UCHAR MinorFunction,
IN POWER_STATE PowerState, IN POWER_STATE PowerState,
IN PVOID Context, IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus); IN struct _IO_STATUS_BLOCK *IoStatus);
typedef struct _POWER_SEQUENCE {
ULONG SequenceD1;
ULONG SequenceD2;
ULONG SequenceD3;
} POWER_SEQUENCE, *PPOWER_SEQUENCE;
typedef VOID (*PINTERFACE_REFERENCE)(PVOID Context);
typedef VOID (*PINTERFACE_DEREFERENCE)(PVOID Context);
typedef struct _INTERFACE {
USHORT Size;
USHORT Version;
PVOID Context;
PINTERFACE_REFERENCE InterfaceReference;
PINTERFACE_DEREFERENCE InterfaceDereference;
} INTERFACE, *PINTERFACE;
typedef enum {
BusQueryDeviceID = 0,
BusQueryHardwareIDs = 1,
BusQueryCompatibleIDs = 2,
BusQueryInstanceID = 3,
BusQueryDeviceSerialNumber = 4
} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
typedef enum {
DeviceTextDescription = 0,
DeviceTextLocationInformation = 1
} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
#endif /* __INCLUDE_DDK_POTYPES_H */ #endif /* __INCLUDE_DDK_POTYPES_H */

View file

@ -8,6 +8,8 @@ copy boot.bat c:\reactos
copy loaders\dos\loadros.com c:\reactos copy loaders\dos\loadros.com c:\reactos
copy ntoskrnl\ntoskrnl.exe c:\reactos copy ntoskrnl\ntoskrnl.exe c:\reactos
copy services\fs\vfat\vfatfs.sys c:\reactos copy services\fs\vfat\vfatfs.sys c:\reactos
copy services\bus\acpi\acpi.sys c:\reactos
copy services\bus\isapnp\isapnp.sys c:\reactos
copy services\dd\ide\ide.sys c:\reactos copy services\dd\ide\ide.sys c:\reactos
copy services\dd\floppy\floppy.sys c:\reactos\system32\drivers copy services\dd\floppy\floppy.sys c:\reactos\system32\drivers
copy services\input\keyboard\keyboard.sys c:\reactos\system32\drivers copy services\input\keyboard\keyboard.sys c:\reactos\system32\drivers

View file

@ -3,6 +3,8 @@ mkdir -p $1/reactos/system32
mkdir -p $1/reactos/system32/drivers mkdir -p $1/reactos/system32/drivers
mkdir -p $1/reactos/bin mkdir -p $1/reactos/bin
./install-system.sh $1 ./install-system.sh $1
cp services/bus/acpi/acpi.sys $1/reactos/system32/drivers
cp services/bus/isapnp/isapnp.sys $1/reactos/system32/drivers
cp services/dd/floppy/floppy.sys $1/reactos/system32/drivers/ cp services/dd/floppy/floppy.sys $1/reactos/system32/drivers/
cp services/input/keyboard/keyboard.sys $1/reactos/system32/drivers cp services/input/keyboard/keyboard.sys $1/reactos/system32/drivers
cp services/dd/blue/blue.sys $1/reactos/system32/drivers cp services/dd/blue/blue.sys $1/reactos/system32/drivers

View file

@ -23,6 +23,15 @@ mbm_string: resd 1
mbm_reserved: resd 1 mbm_reserved: resd 1
endstruc endstruc
struc multiboot_address_range
mar_baselow: resd 1
mar_basehigh: resd 1
mar_lengthlow: resd 1
mar_lengthhigh: resd 1
mar_type: resd 1
mar_reserved: resd 3
endstruc
; ;
; We are a .com program ; We are a .com program
; ;
@ -179,7 +188,9 @@ entry:
;; Process the arguments ;; Process the arguments
;; ;;
cmp byte [di], '/' cmp byte [di], '/'
je .next_module jne .no_next_module
jmp .next_module
.no_next_module:
;; ;;
;; Display a message saying we are loading the module ;; Display a message saying we are loading the module
@ -221,7 +232,22 @@ entry:
;; ;;
push di push di
mov dx, di mov dx, di
call pe_load_module
; Check if it is a symbol file
cmp byte [bx-5],'.'
jne .pe_copy
cmp byte [bx-4],'s'
jne .pe_copy
cmp byte [bx-3],'y'
jne .pe_copy
cmp byte [bx-2],'m'
jne .pe_copy
call sym_load_module
jmp .after_copy
.pe_copy:
call pe_load_module
.after_copy:
pop di pop di
cmp eax, 0 cmp eax, 0
jne .load_success jne .load_success
@ -262,7 +288,7 @@ entry:
add dword [_multiboot_info_base], _multiboot_info add dword [_multiboot_info_base], _multiboot_info
mov dword [_multiboot_flags], 0xc mov dword [_multiboot_flags], 0xc
mov [_multiboot_cmdline], eax mov [_multiboot_cmdline], eax
add dword [_multiboot_cmdline], _multiboot_kernel_cmdline add dword [_multiboot_cmdline], _multiboot_kernel_cmdline
@ -333,6 +359,50 @@ entry:
add [_multiboot_mem_lower],eax add [_multiboot_mem_lower],eax
.done_mem: .done_mem:
;;
;; Retrieve BIOS memory map if available
;;
xor ebx,ebx
mov edi, _multiboot_address_ranges
.mmap_next:
mov edx, 'PAMS'
mov ecx, multiboot_address_range_size
mov eax, 0E820h
int 15h
jc .done_mmap
cmp eax, 'PAMS'
jne .done_mmap
add edi, multiboot_address_range_size
cmp ebx, 0
jne .mmap_next
;;
;; Prepare multiboot memory map structures
;;
;; Fill in the address descriptor size field
mov dword [_multiboot_address_range_descriptor_size], multiboot_address_range_size
;; Set flag and base address and length of memory map
or dword [_multiboot_flags], 40h
mov eax, edi
sub eax, _multiboot_address_ranges
mov dword [_multiboot_mmap_length], eax
xor eax, eax
mov ax, ds
shl eax, 4
mov [_multiboot_mmap_addr], eax
add dword [_multiboot_mmap_addr], _multiboot_address_ranges
.done_mmap:
pop ebx pop ebx
;; ;;
@ -625,12 +695,107 @@ _current_filehandle:
dw 0 dw 0
_current_size: _current_size:
dd 0 dd 0
_current_file_size:
dd 0
;;
;; Load a SYM file
;; DS:DX = Filename
;;
sym_load_module:
call load_module1
call load_module2
mov edi, [next_load_base]
add edi, [_current_file_size]
mov eax, edi
test di, 0xfff
jz .sym_no_round
and di, 0xf000
add edi, 0x1000
;;
;; Clear unused space in the last page
;;
mov esi, edi
mov ecx, edi
sub ecx, eax
.sym_clear:
mov byte [esi],0
inc esi
loop .sym_clear
.sym_no_round:
call load_module3
ret
;; ;;
;; Load a PE file ;; Load a PE file
;; DS:DX = Filename ;; DS:DX = Filename
;; ;;
pe_load_module: pe_load_module:
call load_module1
;;
;; Read in the DOS EXE header
;;
mov ah, 0x3f
mov bx, [_current_filehandle]
mov cx, pe_doshdr_size
mov dx, _cpe_doshdr
int 0x21
jnc .header_read
mov dx, error_file_read_failed
jmp error
.header_read
;;
;; Check the DOS EXE magic
;;
mov ax, word [_cpe_doshdr + e_magic]
cmp ax, 'MZ'
je .mz_hdr_good
mov dx, error_bad_mz
jmp error
.mz_hdr_good
;;
;; Find the BSS size
;;
mov ebx, dword [_multiboot_mods_count]
cmp ebx, 0
jne .not_first
mov edx, 0
mov ax, 0x4200
mov cx, 0
mov dx, 0x1004
mov bx, [_current_filehandle]
int 0x21
jnc .start_seek1
mov dx, error_file_seek_failed
jmp error
.start_seek1:
mov ah, 0x3F
mov bx, [_current_filehandle]
mov cx, 32
mov dx, _mb_magic
int 0x21
jnc .mb_header_read
mov dx, error_file_read_failed
jmp error
.mb_header_read:
jmp .first
.not_first:
mov dword [_mb_bss_end_addr], 0
.first:
call load_module2
call load_module3
ret
load_module1:
;; ;;
;; Open file ;; Open file
;; ;;
@ -638,7 +803,7 @@ pe_load_module:
int 0x21 int 0x21
jnc .file_opened jnc .file_opened
mov dx, error_file_open_failed mov dx, error_file_open_failed
jmp .error jmp error
.file_opened: .file_opened:
;; ;;
@ -663,64 +828,11 @@ pe_load_module:
int 0x21 int 0x21
jnc .seek_start jnc .seek_start
mov dx, error_file_seek_failed mov dx, error_file_seek_failed
jmp .error jmp error
.seek_start: .seek_start:
ret
;; load_module2:
;; Read in the DOS EXE header
;;
mov ah, 0x3f
mov bx, [_current_filehandle]
mov cx, pe_doshdr_size
mov dx, _cpe_doshdr
int 0x21
jnc .header_read
mov dx, error_file_read_failed
jmp .error
.header_read
;;
;; Check the DOS EXE magic
;;
mov ax, word [_cpe_doshdr + e_magic]
cmp ax, 'MZ'
je .mz_hdr_good
mov dx, error_bad_mz
jmp .error
.mz_hdr_good
;;
;; Find the BSS size
;;
mov ebx, dword [_multiboot_mods_count]
cmp ebx, 0
jne .not_first
mov edx, 0
mov ax, 0x4200
mov cx, 0
mov dx, 0x1004
mov bx, [_current_filehandle]
int 0x21
jnc .start_seek1
mov dx, error_file_seek_failed
jmp .error
.start_seek1:
mov ah, 0x3F
mov bx, [_current_filehandle]
mov cx, 32
mov dx, _mb_magic
int 0x21
jnc .mb_header_read
mov dx, error_file_read_failed
jmp .error
.mb_header_read:
jmp .first
.not_first:
mov dword [_mb_bss_end_addr], 0
.first:
;; ;;
;; Seek to the end of the file to get the file size ;; Seek to the end of the file to get the file size
;; ;;
@ -732,11 +844,12 @@ pe_load_module:
int 0x21 int 0x21
jnc .start_end jnc .start_end
mov dx, error_file_seek_failed mov dx, error_file_seek_failed
jmp .error jmp error
.start_end .start_end
shl edx, 16 shl edx, 16
mov dx, ax mov dx, ax
mov [_current_size], edx mov [_current_size], edx
mov [_current_file_size], edx
mov edx, 0 mov edx, 0
mov ax, 0x4200 mov ax, 0x4200
@ -746,7 +859,7 @@ pe_load_module:
int 0x21 int 0x21
jnc .start_seek jnc .start_seek
mov dx, error_file_seek_failed mov dx, error_file_seek_failed
jmp .error jmp error
.start_seek .start_seek
mov edi, [next_load_base] mov edi, [next_load_base]
@ -769,7 +882,7 @@ pe_load_module:
jnc .read_data_succeeded jnc .read_data_succeeded
pop ds pop ds
mov dx, error_file_read_failed mov dx, error_file_read_failed
jmp .error jmp error
.read_data_succeeded: .read_data_succeeded:
%ifndef NDEBUG %ifndef NDEBUG
mov ah,02h mov ah,02h
@ -813,7 +926,7 @@ pe_load_module:
jnc .read_last_data_succeeded jnc .read_last_data_succeeded
pop ds pop ds
mov dx, error_file_read_failed mov dx, error_file_read_failed
jmp .error jmp error
.read_last_data_succeeded: .read_last_data_succeeded:
%ifndef NDEBUG %ifndef NDEBUG
mov ah,02h mov ah,02h
@ -848,7 +961,9 @@ pe_load_module:
and di, 0xf000 and di, 0xf000
add edi, 0x1000 add edi, 0x1000
.no_round: .no_round:
ret
load_module3:
mov bx, [_multiboot_mods_count] mov bx, [_multiboot_mods_count]
imul bx, bx, multiboot_module_size imul bx, bx, multiboot_module_size
add bx, _multiboot_modules add bx, _multiboot_modules
@ -868,7 +983,7 @@ pe_load_module:
;; ;;
;; On error print a message and return zero ;; On error print a message and return zero
;; ;;
.error: error:
mov ah, 0x9 mov ah, 0x9
int 0x21 int 0x21
mov eax, 0 mov eax, 0
@ -1010,7 +1125,12 @@ _multiboot_modules:
times (64*multiboot_module_size) db 0 times (64*multiboot_module_size) db 0
_multiboot_module_strings: _multiboot_module_strings:
times (64*256) db 0 times (64*256) db 0
_multiboot_address_range_descriptor_size dd 0
_multiboot_address_ranges:
times (64*multiboot_address_range_size) db 0
_multiboot_kernel_cmdline: _multiboot_kernel_cmdline:
times 255 db 0 times 255 db 0
@ -1067,4 +1187,3 @@ error_coff_load_failed:
error_bad_mz: error_bad_mz:
db 'Error: Bad DOS EXE magic' db 'Error: Bad DOS EXE magic'
db 0xa, 0xd, '$' db 0xa, 0xd, '$'

View file

@ -1,4 +1,4 @@
# $Id: Makefile,v 1.38 2001/04/28 22:59:16 dwelch Exp $ # $Id: Makefile,v 1.39 2001/05/01 23:08:17 chorns Exp $
# #
# ReactOS Operating System # ReactOS Operating System
# #
@ -43,6 +43,12 @@ else
CONFIG += UP CONFIG += UP
endif endif
ifeq ($(ACPI), 1)
CONFIG += ACPI
else
CONFIG +=
endif
TARGETNAME := ntoskrnl TARGETNAME := ntoskrnl
OBJECTS_PATH = objects OBJECTS_PATH = objects
@ -179,6 +185,7 @@ OBJECTS_IO = \
io/npipe.o \ io/npipe.o \
io/page.o \ io/page.o \
io/pnpmgr.o \ io/pnpmgr.o \
io/pnproot.o \
io/process.o \ io/process.o \
io/queue.o \ io/queue.o \
io/resource.o \ io/resource.o \

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: view.c,v 1.24 2001/04/09 02:45:03 dwelch Exp $ /* $Id: view.c,v 1.25 2001/05/01 23:08:18 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -197,6 +197,8 @@ CcRequestCacheSegment(PBCB Bcb,
if ((FileOffset % Bcb->CacheSegmentSize) != 0) if ((FileOffset % Bcb->CacheSegmentSize) != 0)
{ {
CPRINT("Bad fileoffset %x should be multiple of %x",
FileOffset, Bcb->CacheSegmentSize);
KeBugCheck(0); KeBugCheck(0);
} }

View file

@ -1,4 +1,4 @@
/* $Id: registry.c,v 1.56 2001/04/07 15:06:17 jean Exp $ /* $Id: registry.c,v 1.57 2001/05/01 23:08:18 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -13,6 +13,7 @@
#include <windows.h> #include <windows.h>
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/config.h>
#include <internal/ob.h> #include <internal/ob.h>
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
@ -475,7 +476,7 @@ CmInitializeRegistry2(VOID)
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* FIXME : search SYSTEM.alt, or create new */ /* FIXME : search SYSTEM.alt, or create new */
DbgPrint(" warning : registry file %S not found\n",SYSTEM_REG_FILE); CPRINT(" warning : registry file %S not found\n",SYSTEM_REG_FILE);
} }
/* connect the SOFTWARE Hive */ /* connect the SOFTWARE Hive */
Status=CmConnectHive(SOFTWARE_REG_FILE,REG_SOFTWARE_KEY_NAME Status=CmConnectHive(SOFTWARE_REG_FILE,REG_SOFTWARE_KEY_NAME
@ -483,7 +484,7 @@ CmInitializeRegistry2(VOID)
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* FIXME : search SOFTWARE.alt, or create new */ /* FIXME : search SOFTWARE.alt, or create new */
DbgPrint(" warning : registry file %S not found\n",SOFTWARE_REG_FILE); CPRINT(" warning : registry file %S not found\n",SOFTWARE_REG_FILE);
} }
/* connect the SAM Hive */ /* connect the SAM Hive */
Status=CmConnectHive(SAM_REG_FILE,REG_SAM_KEY_NAME Status=CmConnectHive(SAM_REG_FILE,REG_SAM_KEY_NAME
@ -491,7 +492,7 @@ CmInitializeRegistry2(VOID)
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* FIXME : search SAM.alt, or create new */ /* FIXME : search SAM.alt, or create new */
DbgPrint(" warning : registry file %S not found\n",SAM_REG_FILE); CPRINT(" warning : registry file %S not found\n",SAM_REG_FILE);
} }
/* connect the SECURITY Hive */ /* connect the SECURITY Hive */
Status=CmConnectHive(SEC_REG_FILE,REG_SEC_KEY_NAME Status=CmConnectHive(SEC_REG_FILE,REG_SEC_KEY_NAME
@ -499,7 +500,7 @@ CmInitializeRegistry2(VOID)
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* FIXME : search SECURITY.alt, or create new */ /* FIXME : search SECURITY.alt, or create new */
DbgPrint(" warning : registry file %S not found\n",SEC_REG_FILE); CPRINT(" warning : registry file %S not found\n",SEC_REG_FILE);
} }
/* connect the DEFAULT Hive */ /* connect the DEFAULT Hive */
Status=CmConnectHive(USER_REG_FILE,REG_USER_KEY_NAME Status=CmConnectHive(USER_REG_FILE,REG_USER_KEY_NAME
@ -507,7 +508,7 @@ CmInitializeRegistry2(VOID)
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* FIXME : search DEFAULT.alt, or create new */ /* FIXME : search DEFAULT.alt, or create new */
DbgPrint(" warning : registry file %S not found\n",USER_REG_FILE); CPRINT(" warning : registry file %S not found\n",USER_REG_FILE);
} }
/* FIXME : initialize standards symbolic links */ /* FIXME : initialize standards symbolic links */
/* /*
@ -528,7 +529,7 @@ CmImportHive(PCHAR Chunk)
VOID VOID
CmShutdownRegistry(VOID) CmShutdownRegistry(VOID)
{ {
DPRINT1("CmShutdownRegistry()...\n"); DPRINT("CmShutdownRegistry()...\n");
} }
NTSTATUS NTSTATUS

View file

@ -17,3 +17,8 @@ DBG := 1
# Whether to compile a multiprocessor or single processor version # Whether to compile a multiprocessor or single processor version
# #
MP := 0 MP := 0
#
# Whether to compile for ACPI compliant systems
#
ACPI := 0

View file

@ -12,9 +12,11 @@
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/config.h>
#include <internal/ps.h> #include <internal/ps.h>
#include <internal/io.h> #include <internal/io.h>
#include <internal/mm.h> #include <internal/mm.h>
#include <internal/po.h>
#include <internal/debug.h> #include <internal/debug.h>
@ -44,6 +46,8 @@ NtShutdownSystem(IN SHUTDOWN_ACTION Action)
#if 0 #if 0
/* Switch off */ /* Switch off */
HalReturnToFirmware (FIRMWARE_OFF); HalReturnToFirmware (FIRMWARE_OFF);
#else
PopSetSystemPowerState(PowerSystemShutdown);
#endif #endif
} }
else if (Action == ShutdownReboot) else if (Action == ShutdownReboot)

View file

@ -0,0 +1,34 @@
/* $Id: enum.c,v 1.1 2001/05/01 23:08:18 chorns Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/hal/x86/enum.c
* PURPOSE: Motherboard device enumerator
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
* UPDATE HISTORY:
* Created 01/05/2001
*/
/* INCLUDES *****************************************************************/
#include <ddk/ntddk.h>
#include <internal/config.h>
#define NDEBUG
#include <internal/debug.h>
VOID
HalpStartEnumerator (VOID)
{
#ifdef ACPI
UNICODE_STRING DriverName;
RtlInitUnicodeString(&DriverName,
L"\\SystemRoot\\system32\\drivers\\acpi.sys");
NtLoadDriver(&DriverName);
#endif /* ACPI */
}
/* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: halinit.c,v 1.21 2001/04/26 14:26:22 phreak Exp $ /* $Id: halinit.c,v 1.22 2001/05/01 23:08:18 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -48,10 +48,15 @@ HalInitSystem (ULONG BootPhase,
#endif /* MP */ #endif /* MP */
} }
else else if (BootPhase == 1)
{ {
HalpInitBusHandlers (); HalpInitBusHandlers ();
} }
else
{
/* Enumerate the devices on the motherboard */
HalpStartEnumerator();
}
return TRUE; return TRUE;
} }

View file

@ -6,6 +6,7 @@ OBJECTS_HAL_COMMON = \
hal/x86/display.o \ hal/x86/display.o \
hal/x86/dma.o \ hal/x86/dma.o \
hal/x86/drive.o \ hal/x86/drive.o \
hal/x86/enum.o \
hal/x86/fmutex.o \ hal/x86/fmutex.o \
hal/x86/halinit.o \ hal/x86/halinit.o \
hal/x86/isa.o \ hal/x86/isa.o \

View file

@ -9,14 +9,17 @@
*/ */
/* /*
* NOTE: Define NDEBUG before including this header to disable debugging * NOTES: Define DBG in configuration file for "checked" version
* macros * Define NDEBUG before including this header to disable debugging
* macros
* Define NASSERT before including this header to disable assertions
*/ */
#ifndef __INTERNAL_DEBUG #ifndef __INTERNAL_DEBUG
#define __INTERNAL_DEBUG #define __INTERNAL_DEBUG
#include <internal/ntoskrnl.h> #include <internal/ntoskrnl.h>
#include <internal/config.h>
#define UNIMPLEMENTED do {DbgPrint("%s at %s:%d is unimplemented, have a nice day\n",__FUNCTION__,__FILE__,__LINE__); for(;;); } while(0); #define UNIMPLEMENTED do {DbgPrint("%s at %s:%d is unimplemented, have a nice day\n",__FUNCTION__,__FILE__,__LINE__); for(;;); } while(0);
@ -25,12 +28,25 @@
#define CHECKED #define CHECKED
#endif #endif
#ifdef DBG
/* Assert only on "checked" version */
#ifndef NASSERT #ifndef NASSERT
#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); KeBugCheck(0); } #define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); KeBugCheck(0); }
#else #else
#define assert(x) #define assert(x)
#endif #endif
/* Print if using a "checked" version */
#define CPRINT(args...) do { DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0);
#else /* DBG */
#define CPRINT(args...)
#define assert(x)
#endif /* DBG */
#define DPRINT1(args...) do { DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0); #define DPRINT1(args...) do { DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0);
#define CHECKPOINT1 do { DbgPrint("%s:%d\n",__FILE__,__LINE__); } while(0); #define CHECKPOINT1 do { DbgPrint("%s:%d\n",__FILE__,__LINE__); } while(0);

View file

@ -32,6 +32,9 @@ VOID HalpCalibrateStallExecution(VOID);
/* pci.c */ /* pci.c */
VOID HalpInitPciBus (VOID); VOID HalpInitPciBus (VOID);
/* enum.c */
VOID HalpStartEnumerator (VOID);
struct _ADAPTER_OBJECT { struct _ADAPTER_OBJECT {
int Channel; int Channel;
PVOID PagePort; PVOID PagePort;

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: io.h,v 1.9 2001/04/03 17:25:49 dwelch Exp $ /* $Id: io.h,v 1.10 2001/05/01 23:08:19 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -33,17 +33,85 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/ob.h> #include <internal/ob.h>
extern POBJECT_TYPE IoSymbolicLinkType; typedef struct _DEVICE_NODE
{
struct _DEVICE_NODE *Parent;
struct _DEVICE_NODE *PrevSibling;
struct _DEVICE_NODE *NextSibling;
struct _DEVICE_NODE *Child;
PDEVICE_OBJECT Pdo;
UNICODE_STRING InstancePath;
UNICODE_STRING ServiceName;
//TargetDeviceNotifyList?
DEVICE_CAPABILITIES CapabilityFlags;
ULONG Flags;
ULONG UserFlags;
ULONG DisableableDepends;
ULONG Problem;
PCM_RESOURCE_LIST CmResourceList;
PCM_RESOURCE_LIST BootResourcesList;
PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList;
} DEVICE_NODE, *PDEVICE_NODE;
/* /* For Flags field */
* FUNCTION: Called to initalize a loaded driver #define DNF_MADEUP 0x0001
* ARGUMENTS: #define DNF_HAL_NODE 0x0002
* entry = pointer to the driver initialization routine #define DNF_PROCESSED 0x0004
* RETURNS: Success or failure #define DNF_ENUMERATED 0x0008
*/ #define DNF_ADDED 0x0010
NTSTATUS #define DNF_HAS_BOOT_CONFIG 0x0020
IoInitializeDriver(PDRIVER_INITIALIZE DriverEntry); #define DNF_BOOT_CONFIG_RESERVED 0x0040
#define DNF_RESOURCE_ASSIGNED 0x0080
#define DNF_NO_RESOURCE_REQUIRED 0x0100
#define DNF_STARTED 0x0200
#define DNF_LEGACY_DRIVER 0x0400
#define DNF_RESOURCE_REQUIREMENTS_NEED_FILTERED 0x0800
#define DNF_HAS_PROBLEM 0x1000
/* For UserFlags field */
#define DNUF_DONT_SHOW_IN_UI 0x0002
#define DNUF_NOT_DISABLEABLE 0x0008
/* For Problem field */
#define CM_PROB_FAILED_INSTALL 0x0001
extern PDEVICE_NODE IopRootDeviceNode;
extern POBJECT_TYPE IoSymbolicLinkType;
VOID
PnpInit(VOID);
NTSTATUS
STDCALL
PnpRootDriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath);
NTSTATUS
PnpRootCreateDevice(
PDEVICE_OBJECT *PhysicalDeviceObject);
NTSTATUS
IopGetSystemPowerDeviceObject(PDEVICE_OBJECT *DeviceObject);
NTSTATUS
IopCreateDeviceNode(PDEVICE_NODE ParentNode,
PDEVICE_OBJECT PhysicalDeviceObject,
PDEVICE_NODE *DeviceNode);
NTSTATUS
IopFreeDeviceNode(PDEVICE_NODE DeviceNode);
NTSTATUS
IopInterrogateBusExtender(PDEVICE_NODE DeviceNode,
PDEVICE_OBJECT FunctionDeviceObject,
BOOLEAN BootDriversOnly);
VOID
IopLoadBootStartDrivers(VOID);
NTSTATUS
IopCreateDriverObject(PDRIVER_OBJECT *DriverObject);
NTSTATUS
IopInitializeDriver(PDRIVER_INITIALIZE DriverEntry,
PDEVICE_NODE ParentDeviceNode,
BOOLEAN BootDriversOnly);
VOID VOID
IoInitCancelHandling(VOID); IoInitCancelHandling(VOID);
VOID VOID

View file

@ -9,10 +9,13 @@
#define __INCLUDE_INTERNAL_LDR_H #define __INCLUDE_INTERNAL_LDR_H
#include <pe.h> #include <pe.h>
#include <internal/io.h>
NTSTATUS NTSTATUS
LdrLoadDriver ( LdrLoadDriver (
IN PUNICODE_STRING Filename PUNICODE_STRING Filename,
PDEVICE_NODE DeviceNode,
BOOLEAN BootDriversOnly
); );
NTSTATUS NTSTATUS
LdrLoadInitialProcess ( LdrLoadInitialProcess (
@ -29,7 +32,8 @@ LdrInitModuleManagement (
NTSTATUS NTSTATUS
LdrProcessDriver ( LdrProcessDriver (
IN PVOID ModuleLoadBase, IN PVOID ModuleLoadBase,
IN PCHAR FileName IN PCHAR FileName,
IN ULONG ModuleLength
); );
NTSTATUS NTSTATUS
LdrpMapSystemDll ( LdrpMapSystemDll (

View file

@ -204,7 +204,9 @@ PMEMORY_AREA MmSplitMemoryArea(struct _EPROCESS* Process,
PVOID MmInitializePageList(PVOID FirstPhysKernelAddress, PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
PVOID LastPhysKernelAddress, PVOID LastPhysKernelAddress,
ULONG MemorySizeInPages, ULONG MemorySizeInPages,
ULONG LastKernelBase); ULONG LastKernelBase,
PADDRESS_RANGE BIOSMemoryMap,
ULONG AddressRangeCount);
PVOID MmAllocPage(SWAPENTRY SavedSwapEntry); PVOID MmAllocPage(SWAPENTRY SavedSwapEntry);
VOID MmDereferencePage(PVOID PhysicalAddress); VOID MmDereferencePage(PVOID PhysicalAddress);
@ -311,7 +313,9 @@ VOID MmFreeSwapPage(SWAPENTRY Entry);
VOID MmInit1(ULONG FirstKernelPhysAddress, VOID MmInit1(ULONG FirstKernelPhysAddress,
ULONG LastKernelPhysAddress, ULONG LastKernelPhysAddress,
ULONG LastKernelAddress); ULONG LastKernelAddress,
PADDRESS_RANGE BIOSMemoryMap,
ULONG AddressRangeCount);
VOID MmInit2(VOID); VOID MmInit2(VOID);
VOID MmInit3(VOID); VOID MmInit3(VOID);
NTSTATUS MmInitPagerThread(VOID); NTSTATUS MmInitPagerThread(VOID);

View file

@ -35,7 +35,7 @@ typedef struct _MODULE_TEXT_SECTION
#endif /* KDBG */ #endif /* KDBG */
PVOID SymbolsBase; PVOID SymbolsBase;
ULONG SymbolsLength; ULONG SymbolsLength;
} MODULE_TEXT_SECTION; } MODULE_TEXT_SECTION, *PMODULE_TEXT_SECTION;
typedef struct _MODULE_OBJECT typedef struct _MODULE_OBJECT
{ {
@ -48,6 +48,7 @@ typedef struct _MODULE_OBJECT
LIST_ENTRY ListEntry; LIST_ENTRY ListEntry;
UNICODE_STRING FullName; UNICODE_STRING FullName;
UNICODE_STRING BaseName; UNICODE_STRING BaseName;
PMODULE_TEXT_SECTION TextSection;
union union
{ {
struct struct

View file

@ -0,0 +1,27 @@
/* $Id: po.h,v 1.1 2001/05/01 23:08:19 chorns Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: include/internal/po.h
* PURPOSE: Internal power manager declarations
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
* UPDATE HISTORY:
* 01/05/2001 Created
*/
#ifndef __NTOSKRNL_INCLUDE_INTERNAL_PO_H
#define __NTOSKRNL_INCLUDE_INTERNAL_PO_H
#include <ddk/ntddk.h>
#include <internal/io.h>
extern PDEVICE_NODE PopSystemPowerDeviceNode;
VOID
PoInit(VOID);
NTSTATUS
PopSetSystemPowerState(
SYSTEM_POWER_STATE PowerState);
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_PO_H */

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.39 2001/05/01 11:05:42 ekohl Exp $ /* $Id: create.c,v 1.40 2001/05/01 23:08:19 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -78,12 +78,16 @@ IopCreateFile (PVOID ObjectBody,
if (NULL == DeviceObject) if (NULL == DeviceObject)
{ {
/* This is probably an attempt to create a meta fileobject (eg. for FAT)
for the cache manager, so return STATUS_SUCCESS */
DPRINT("DeviceObject was NULL\n"); DPRINT("DeviceObject was NULL\n");
return (STATUS_SUCCESS); return (STATUS_SUCCESS);
} }
if (IoDeviceObjectType != BODY_TO_HEADER(Parent)->ObjectType) if (IoDeviceObjectType != BODY_TO_HEADER(Parent)->ObjectType)
{ {
DPRINT("Parent is not a device type\n"); CPRINT("Parent is a %S which not a device type\n",
BODY_TO_HEADER(Parent)->ObjectType->TypeName.Buffer);
assert(FALSE);
return (STATUS_UNSUCCESSFUL); return (STATUS_UNSUCCESSFUL);
} }
Status = ObReferenceObjectByPointer (DeviceObject, Status = ObReferenceObjectByPointer (DeviceObject,
@ -121,7 +125,8 @@ IopCreateFile (PVOID ObjectBody,
&& (DeviceObject->DeviceType != FILE_DEVICE_NAMED_PIPE) && (DeviceObject->DeviceType != FILE_DEVICE_NAMED_PIPE)
&& (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT)) && (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT))
{ {
DPRINT("Device was wrong type\n"); CPRINT ("Device was wrong type\n");
assert(FALSE);
return (STATUS_UNSUCCESSFUL); return (STATUS_UNSUCCESSFUL);
} }
@ -136,7 +141,7 @@ IopCreateFile (PVOID ObjectBody,
DPRINT("Status %x\n", Status); DPRINT("Status %x\n", Status);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT("Failed to mount storage device (statux %x)\n", CPRINT("Failed to mount storage device (statux %x)\n",
Status); Status);
return (Status); return (Status);
} }
@ -185,18 +190,19 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject,
{ {
HANDLE FileHandle; HANDLE FileHandle;
PFILE_OBJECT CreatedFileObject; PFILE_OBJECT CreatedFileObject;
DbgPrint("IoCreateStreamFileObject(FileObject %x, DeviceObject %x)\n", DPRINT("IoCreateStreamFileObject(FileObject %x, DeviceObject %x)\n",
FileObject, DeviceObject); FileObject, DeviceObject);
assert_irql (PASSIVE_LEVEL); assert_irql (PASSIVE_LEVEL);
CreatedFileObject = ObCreateObject (&FileHandle, CreatedFileObject = ObCreateObject (&FileHandle,
STANDARD_RIGHTS_REQUIRED, STANDARD_RIGHTS_REQUIRED,
NULL, NULL,
IoFileObjectType); IoFileObjectType);
if (NULL == CreatedFileObject) if (NULL == CreatedFileObject)
{ {
DPRINT("Could not create FileObject\n");
return (NULL); return (NULL);
} }
@ -205,6 +211,9 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject,
DeviceObject = FileObject->DeviceObject; DeviceObject = FileObject->DeviceObject;
} }
DeviceObject = IoGetAttachedDevice(DeviceObject); DeviceObject = IoGetAttachedDevice(DeviceObject);
DPRINT("DeviceObject %x\n", DeviceObject);
CreatedFileObject->DeviceObject = DeviceObject; CreatedFileObject->DeviceObject = DeviceObject;
CreatedFileObject->Vpb = DeviceObject->Vpb; CreatedFileObject->Vpb = DeviceObject->Vpb;
CreatedFileObject->Type = InternalFileType; CreatedFileObject->Type = InternalFileType;
@ -327,13 +336,10 @@ IoCreateFile(
} }
if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT) if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT)
{ {
//FileObject->Flags = FileObject->Flags | FO_ALERTABLE_IO;
//FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO;
FileObject->Flags |= (FO_ALERTABLE_IO | FO_SYNCHRONOUS_IO); FileObject->Flags |= (FO_ALERTABLE_IO | FO_SYNCHRONOUS_IO);
} }
if (CreateOptions & FILE_SYNCHRONOUS_IO_NONALERT) if (CreateOptions & FILE_SYNCHRONOUS_IO_NONALERT)
{ {
//FileObject->Flags |= FileObject->Flags | FO_SYNCHRONOUS_IO;
FileObject->Flags |= FO_SYNCHRONOUS_IO; FileObject->Flags |= FO_SYNCHRONOUS_IO;
} }
KeInitializeEvent(&FileObject->Lock, NotificationEvent, TRUE); KeInitializeEvent(&FileObject->Lock, NotificationEvent, TRUE);

View file

@ -1,4 +1,4 @@
/* $Id: device.c,v 1.26 2001/03/07 16:48:41 dwelch Exp $ /* $Id: device.c,v 1.27 2001/05/01 23:08:19 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -13,11 +13,13 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/io.h> #include <internal/io.h>
#include <internal/po.h>
#include <internal/ob.h> #include <internal/ob.h>
#include <internal/ldr.h> #include <internal/ldr.h>
#include <internal/id.h> #include <internal/id.h>
#include <internal/ps.h> #include <internal/ps.h>
#include <internal/pool.h> #include <internal/pool.h>
#include <internal/config.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
@ -25,6 +27,7 @@
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
#define TAG_DRIVER TAG('D', 'R', 'V', 'R') #define TAG_DRIVER TAG('D', 'R', 'V', 'R')
#define TAG_DRIVER_EXTENSION TAG('D', 'R', 'V', 'E')
#define TAG_DEVICE_EXTENSION TAG('D', 'E', 'X', 'T') #define TAG_DEVICE_EXTENSION TAG('D', 'E', 'X', 'T')
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
@ -58,8 +61,26 @@ NtLoadDriver (
PUNICODE_STRING DriverServiceName PUNICODE_STRING DriverServiceName
) )
{ {
PDEVICE_NODE DeviceNode;
NTSTATUS Status;
/* FIXME: this should lookup the filename from the registry and then call LdrLoadDriver */ /* FIXME: this should lookup the filename from the registry and then call LdrLoadDriver */
return LdrLoadDriver (DriverServiceName);
/* Use IopRootDeviceNode for now */
Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode);
if (!NT_SUCCESS(Status))
{
return(Status);
}
Status = LdrLoadDriver (DriverServiceName, DeviceNode, FALSE);
if (!NT_SUCCESS(Status))
{
IopFreeDeviceNode(DeviceNode);
DPRINT("Driver load failed, status (%x)\n", Status);
}
return Status;
} }
@ -210,6 +231,21 @@ IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject)
return(Current); return(Current);
} }
PDEVICE_OBJECT
STDCALL
IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
{
PDEVICE_OBJECT Current = DeviceObject;
while (Current->AttachedDevice!=NULL)
{
Current = Current->AttachedDevice;
}
ObReferenceObject(Current);
return(Current);
}
PDEVICE_OBJECT STDCALL PDEVICE_OBJECT STDCALL
IoAttachDeviceToDeviceStack(PDEVICE_OBJECT SourceDevice, IoAttachDeviceToDeviceStack(PDEVICE_OBJECT SourceDevice,
PDEVICE_OBJECT TargetDevice) PDEVICE_OBJECT TargetDevice)
@ -247,40 +283,176 @@ IopDefaultDispatchFunction(PDEVICE_OBJECT DeviceObject,
} }
NTSTATUS NTSTATUS
IoInitializeDriver(PDRIVER_INITIALIZE DriverEntry) IopCreateDriverObject(PDRIVER_OBJECT *DriverObject)
{
PDRIVER_OBJECT Object;
ULONG i;
Object = ExAllocatePoolWithTag(NonPagedPool,
sizeof(DRIVER_OBJECT),
TAG_DRIVER);
if (Object == NULL)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlZeroMemory(Object, sizeof(DRIVER_OBJECT));
Object->DriverExtension = (PDRIVER_EXTENSION)
ExAllocatePoolWithTag(NonPagedPool,
sizeof(DRIVER_EXTENSION),
TAG_DRIVER_EXTENSION);
if (Object->DriverExtension == NULL)
{
ExFreePool(Object);
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlZeroMemory(Object->DriverExtension, sizeof(DRIVER_EXTENSION));
Object->Type = InternalDriverType;
for (i=0; i<=IRP_MJ_MAXIMUM_FUNCTION; i++)
{
Object->MajorFunction[i] = IopDefaultDispatchFunction;
}
*DriverObject = Object;
return STATUS_SUCCESS;
}
NTSTATUS
IopInitializeDriver(PDRIVER_INITIALIZE DriverEntry,
PDEVICE_NODE DeviceNode,
BOOLEAN BootDriversOnly)
/* /*
* FUNCTION: Called to initalize a loaded driver * FUNCTION: Called to initalize a loaded driver
* ARGUMENTS: * ARGUMENTS:
*/ */
{ {
NTSTATUS Status; IO_STATUS_BLOCK IoStatusBlock;
PDRIVER_OBJECT DriverObject; PDRIVER_OBJECT DriverObject;
ULONG i; PIO_STACK_LOCATION IrpSp;
PDEVICE_OBJECT Fdo;
DriverObject = NTSTATUS Status;
ExAllocatePoolWithTag(NonPagedPool, sizeof(DRIVER_OBJECT), TAG_DRIVER); KEVENT Event;
if (DriverObject == NULL) PIRP Irp;
{
return STATUS_INSUFFICIENT_RESOURCES;
}
memset(DriverObject, 0, sizeof(DRIVER_OBJECT));
DriverObject->Type = InternalDriverType;
for (i=0; i<=IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[i] = IopDefaultDispatchFunction;
}
DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry); DPRINT("IopInitializeDriver (DriverEntry %08lx, DeviceNode %08lx, "
Status = DriverEntry(DriverObject, NULL); "BootDriversOnly %d)\n", DriverEntry, DeviceNode, BootDriversOnly);
if (!NT_SUCCESS(Status))
{ Status = IopCreateDriverObject(&DriverObject);
if (!NT_SUCCESS(Status))
{
return(Status);
}
DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry);
Status = DriverEntry(DriverObject, NULL);
if (!NT_SUCCESS(Status))
{
ExFreePool(DriverObject->DriverExtension);
ExFreePool(DriverObject); ExFreePool(DriverObject);
return(Status); return(Status);
} }
return(Status); if (DriverObject->DriverExtension->AddDevice)
{
/* This is a Plug and Play driver */
DPRINT("Plug and Play driver found\n");
assert(DeviceNode->Pdo);
DPRINT("Calling driver AddDevice entrypoint at %08lx\n",
DriverObject->DriverExtension->AddDevice);
Status = DriverObject->DriverExtension->AddDevice(
DriverObject, DeviceNode->Pdo);
if (!NT_SUCCESS(Status))
{
ExFreePool(DriverObject->DriverExtension);
ExFreePool(DriverObject);
return(Status);
}
DPRINT("Sending IRP_MN_START_DEVICE to driver\n");
Fdo = IoGetAttachedDeviceReference(DeviceNode->Pdo);
if (Fdo == DeviceNode->Pdo)
{
/* FIXME: What do we do? Unload the driver? */
DbgPrint("An FDO was not attached\n");
KeBugCheck(0);
}
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
Fdo,
NULL,
0,
NULL,
&Event,
&IoStatusBlock);
IrpSp = IoGetNextIrpStackLocation(Irp);
IrpSp->MinorFunction = IRP_MN_START_DEVICE;
/* FIXME: Put some resources in the IRP for the device */
Status = IoCallDriver(Fdo, Irp);
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
NULL);
Status = IoStatusBlock.Status;
}
if (!NT_SUCCESS(Status))
{
ObDereferenceObject(Fdo);
ExFreePool(DriverObject->DriverExtension);
ExFreePool(DriverObject);
return(Status);
}
if (Fdo->DeviceType == FILE_DEVICE_BUS_EXTENDER)
{
DPRINT("Bus extender found\n");
Status = IopInterrogateBusExtender(
DeviceNode, Fdo, BootDriversOnly);
if (!NT_SUCCESS(Status))
{
ObDereferenceObject(Fdo);
ExFreePool(DriverObject->DriverExtension);
ExFreePool(DriverObject);
return(Status);
}
else
{
#ifdef ACPI
static BOOLEAN SystemPowerDeviceNodeCreated = FALSE;
/* The system power device node is the first bus enumerator
device node created after the root device node */
if (!SystemPowerDeviceNodeCreated)
{
PopSystemPowerDeviceNode = DeviceNode;
SystemPowerDeviceNodeCreated = TRUE;
}
#endif /* ACPI */
}
}
ObDereferenceObject(Fdo);
}
return(Status);
} }
NTSTATUS STDCALL NTSTATUS STDCALL
@ -411,7 +583,13 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject,
ExFreePool(CreatedDeviceObject); ExFreePool(CreatedDeviceObject);
return(STATUS_INSUFFICIENT_RESOURCES); return(STATUS_INSUFFICIENT_RESOURCES);
} }
if (DeviceExtensionSize > 0)
{
RtlZeroMemory(CreatedDeviceObject->DeviceExtension,
DeviceExtensionSize);
}
CreatedDeviceObject->AttachedDevice = NULL; CreatedDeviceObject->AttachedDevice = NULL;
CreatedDeviceObject->DeviceType = DeviceType; CreatedDeviceObject->DeviceType = DeviceType;
CreatedDeviceObject->StackSize = 1; CreatedDeviceObject->StackSize = 1;

View file

@ -1,4 +1,4 @@
/* $Id: iomgr.c,v 1.18 2001/03/07 16:48:42 dwelch Exp $ /* $Id: iomgr.c,v 1.19 2001/05/01 23:08:19 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -254,6 +254,11 @@ VOID IoInit (VOID)
L"\\??"); L"\\??");
IoCreateSymbolicLink (&UnicodeString, IoCreateSymbolicLink (&UnicodeString,
&DeviceName); &DeviceName);
/*
* Initialize PnP manager
*/
PnpInit();
} }

View file

@ -1,4 +1,4 @@
/* $Id: irp.c,v 1.36 2001/04/09 02:45:04 dwelch Exp $ /* $Id: irp.c,v 1.37 2001/05/01 23:08:19 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -104,17 +104,25 @@ IofCallDriver (PDEVICE_OBJECT DeviceObject, PIRP Irp)
PDRIVER_OBJECT DriverObject; PDRIVER_OBJECT DriverObject;
PIO_STACK_LOCATION Param; PIO_STACK_LOCATION Param;
// DPRINT("IoCallDriver(DeviceObject %x, Irp %x)\n",DeviceObject,Irp); DPRINT("IofCallDriver(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
assert(Irp);
assert(DeviceObject);
DriverObject = DeviceObject->DriverObject; DriverObject = DeviceObject->DriverObject;
assert(DriverObject);
Param = IoGetNextIrpStackLocation(Irp); Param = IoGetNextIrpStackLocation(Irp);
DPRINT("IrpSp 0x%X\n", Param);
Irp->Tail.Overlay.CurrentStackLocation--; Irp->Tail.Overlay.CurrentStackLocation--;
Irp->CurrentLocation--; Irp->CurrentLocation--;
// DPRINT("MajorFunction %d\n", Param->MajorFunction); DPRINT("MajorFunction %d\n", Param->MajorFunction);
// DPRINT("DriverObject->MajorFunction[Param->MajorFunction] %x\n", DPRINT("DriverObject->MajorFunction[Param->MajorFunction] %x\n",
// DriverObject->MajorFunction[Param->MajorFunction]); DriverObject->MajorFunction[Param->MajorFunction]);
Status = DriverObject->MajorFunction[Param->MajorFunction](DeviceObject, Status = DriverObject->MajorFunction[Param->MajorFunction](DeviceObject,
Irp); Irp);
return Status; return Status;

View file

@ -1,4 +1,4 @@
/* $Id: pnpmgr.c,v 1.1 2001/04/16 00:51:19 chorns Exp $ /* $Id: pnpmgr.c,v 1.2 2001/05/01 23:08:19 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -12,14 +12,23 @@
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/io.h>
#include <internal/po.h>
#include <internal/ldr.h>
#include <internal/module.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
PDEVICE_NODE IopRootDeviceNode;
KSPIN_LOCK IopDeviceTreeLock;
/* DATA **********************************************************************/ /* DATA **********************************************************************/
PDRIVER_OBJECT IopRootDriverObject;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
VOID VOID
@ -238,8 +247,234 @@ IoUnregisterPlugPlayNotification(
return STATUS_NOT_IMPLEMENTED; return STATUS_NOT_IMPLEMENTED;
} }
NTSTATUS
IopGetSystemPowerDeviceObject(PDEVICE_OBJECT *DeviceObject)
{
KIRQL OldIrql;
assert(PopSystemPowerDeviceNode);
KeAcquireSpinLock(&IopDeviceTreeLock, &OldIrql);
*DeviceObject = PopSystemPowerDeviceNode->Pdo;
KeReleaseSpinLock(&IopDeviceTreeLock, OldIrql);
return STATUS_SUCCESS;
}
/**********************************************************************
* DESCRIPTION
* Creates a device node
*
* ARGUMENTS
* ParentNode = Pointer to parent device node
* PhysicalDeviceObject = Pointer to PDO for device object. Pass NULL
* to have the root device node create one
* (eg. for legacy drivers)
* DeviceNode = Pointer to storage for created device node
*
* RETURN VALUE
* Status
*/
NTSTATUS
IopCreateDeviceNode(PDEVICE_NODE ParentNode,
PDEVICE_OBJECT PhysicalDeviceObject,
PDEVICE_NODE *DeviceNode)
/* */
{
PDEVICE_NODE Node;
NTSTATUS Status;
KIRQL OldIrql;
DPRINT("ParentNode %x PhysicalDeviceObject %x\n");
Node = (PDEVICE_NODE)ExAllocatePool(PagedPool, sizeof(DEVICE_NODE));
if (!Node)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlZeroMemory(Node, sizeof(DEVICE_NODE));
if (!PhysicalDeviceObject)
{
Status = PnpRootCreateDevice(&PhysicalDeviceObject);
if (!NT_SUCCESS(Status))
{
ExFreePool(Node);
return Status;
}
}
Node->Pdo = PhysicalDeviceObject;
if (ParentNode)
{
KeAcquireSpinLock(&IopDeviceTreeLock, &OldIrql);
Node->Parent = ParentNode;
Node->NextSibling = ParentNode->Child;
ParentNode->Child->PrevSibling = Node;
ParentNode->Child = Node;
KeReleaseSpinLock(&IopDeviceTreeLock, OldIrql);
}
*DeviceNode = Node;
return STATUS_SUCCESS;
}
NTSTATUS
IopFreeDeviceNode(PDEVICE_NODE DeviceNode)
{
KIRQL OldIrql;
/* All children must be deleted before a parent is deleted */
assert(!DeviceNode->Child);
KeAcquireSpinLock(&IopDeviceTreeLock, &OldIrql);
assert(DeviceNode->Pdo);
ObDereferenceObject(DeviceNode->Pdo);
/* Unlink from parent if it exists */
if ((DeviceNode->Parent) && (DeviceNode->Parent->Child == DeviceNode))
{
DeviceNode->Parent->Child = DeviceNode->NextSibling;
}
/* Unlink from sibling list */
if (DeviceNode->PrevSibling)
{
DeviceNode->PrevSibling->NextSibling = DeviceNode->NextSibling;
}
if (DeviceNode->NextSibling)
{
DeviceNode->NextSibling->PrevSibling = DeviceNode->PrevSibling;
}
KeReleaseSpinLock(&IopDeviceTreeLock, OldIrql);
ExFreePool(DeviceNode);
return STATUS_SUCCESS;
}
NTSTATUS
IopInterrogateBusExtender(PDEVICE_NODE DeviceNode,
PDEVICE_OBJECT FunctionDeviceObject,
BOOLEAN BootDriversOnly)
{
IO_STATUS_BLOCK IoStatusBlock;
PIO_STACK_LOCATION IrpSp;
NTSTATUS Status;
KEVENT Event;
PIRP Irp;
DPRINT("Sending IRP_MN_QUERY_DEVICE_RELATIONS to bus driver\n");
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
FunctionDeviceObject,
NULL,
0,
NULL,
&Event,
&IoStatusBlock);
IrpSp = IoGetNextIrpStackLocation(Irp);
IrpSp->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
IrpSp->Parameters.QueryDeviceRelations.Type = BusRelations;
Status = IoCallDriver(FunctionDeviceObject, Irp);
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
NULL);
Status = IoStatusBlock.Status;
}
if (!NT_SUCCESS(Status))
{
CPRINT("IoCallDriver() failed\n");
}
return Status;
}
VOID IopLoadBootStartDrivers(VOID)
{
UNICODE_STRING DriverName;
PDEVICE_NODE DeviceNode;
NTSTATUS Status;
DPRINT("Loading boot start drivers\n");
return;
/* FIXME: Get these from registry */
/* Use IopRootDeviceNode for now */
Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode);
if (!NT_SUCCESS(Status))
{
return;
}
/*
* ISA Plug and Play driver
*/
RtlInitUnicodeString(&DriverName,
L"\\SystemRoot\\system32\\drivers\\isapnp.sys");
Status = LdrLoadDriver(&DriverName, DeviceNode, TRUE);
if (!NT_SUCCESS(Status))
{
IopFreeDeviceNode(DeviceNode);
/* FIXME: Write an entry in the system error log */
DbgPrint("Could not load boot start driver: %wZ, status 0x%X\n",
&DriverName, Status);
return;
}
}
VOID PnpInit(VOID) VOID PnpInit(VOID)
{ {
NTSTATUS Status;
DPRINT("Called\n");
KeInitializeSpinLock(&IopDeviceTreeLock);
Status = IopCreateDriverObject(&IopRootDriverObject);
if (!NT_SUCCESS(Status))
{
DbgPrint("IoCreateDriverObject() failed\n");
KeBugCheck(0);
}
PnpRootDriverEntry(IopRootDriverObject, NULL);
Status = IoCreateDevice(IopRootDriverObject, 0, NULL,
FILE_DEVICE_CONTROLLER, 0, FALSE, &IopRootDeviceNode->Pdo);
if (!NT_SUCCESS(Status))
{
DbgPrint("IoCreateDevice() failed\n");
KeBugCheck(0);
}
IopRootDeviceNode->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
IopRootDriverObject->DriverExtension->AddDevice(
IopRootDriverObject, IopRootDeviceNode->Pdo);
} }
/* EOF */ /* EOF */

View file

@ -0,0 +1,290 @@
/* $Id: pnproot.c,v 1.1 2001/05/01 23:08:19 chorns Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/io/pnproot.c
* PURPOSE: PnP manager root device
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
* UPDATE HISTORY:
* 16/04/2001 CSH Created
*/
/* INCLUDES ******************************************************************/
#include <ddk/ntddk.h>
#include <internal/io.h>
#define NDEBUG
#include <internal/debug.h>
/* GLOBALS *******************************************************************/
/* DATA **********************************************************************/
typedef struct _PNPROOT_DEVICE {
LIST_ENTRY ListEntry;
PDEVICE_OBJECT Pdo;
} PNPROOT_DEVICE, *PPNPROOT_DEVICE;
PDEVICE_OBJECT PnpRootDeviceObject;
LIST_ENTRY PnpRootDeviceListHead;
ULONG PnpRootDeviceListCount;
KSPIN_LOCK PnpRootDeviceListLock;
/* FUNCTIONS *****************************************************************/
NTSTATUS
PnpRootCreateDevice(
PDEVICE_OBJECT *PhysicalDeviceObject)
{
PPNPROOT_DEVICE Device;
NTSTATUS Status;
DPRINT("Called\n");
Device = (PPNPROOT_DEVICE)ExAllocatePool(PagedPool, sizeof(PNPROOT_DEVICE));
if (!Device)
return STATUS_INSUFFICIENT_RESOURCES;
Status = IoCreateDevice(PnpRootDeviceObject->DriverObject, 0,
NULL, FILE_DEVICE_CONTROLLER, 0, FALSE, &Device->Pdo);
if (!NT_SUCCESS(Status))
{
DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
ExFreePool(Device);
return Status;
}
Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
ObReferenceObject(Device->Pdo);
ExInterlockedInsertTailList(&PnpRootDeviceListHead,
&Device->ListEntry,
&PnpRootDeviceListLock);
*PhysicalDeviceObject = Device->Pdo;
return STATUS_SUCCESS;
}
NTSTATUS
PnpRootQueryBusRelations(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp)
{
PDEVICE_RELATIONS Relations;
PLIST_ENTRY CurrentEntry;
PPNPROOT_DEVICE Device;
NTSTATUS Status;
ULONG Size;
ULONG i;
DPRINT("Called\n");
Size = sizeof(DEVICE_RELATIONS) + sizeof(Relations->Objects) *
(PnpRootDeviceListCount - 1);
Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size);
if (!Relations)
return STATUS_INSUFFICIENT_RESOURCES;
Relations->Count = PnpRootDeviceListCount;
i = 0;
CurrentEntry = PnpRootDeviceListHead.Flink;
while (CurrentEntry != &PnpRootDeviceListHead)
{
Device = CONTAINING_RECORD(
CurrentEntry, PNPROOT_DEVICE, ListEntry);
if (!Device->Pdo) {
/* Create a physical device object for the
device as it does not already have one */
Status = IoCreateDevice(DeviceObject->DriverObject, 0,
NULL, FILE_DEVICE_CONTROLLER, 0, FALSE, &Device->Pdo);
if (!NT_SUCCESS(Status)) {
DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
ExFreePool(Relations);
return Status;
}
Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
}
/* Reference the physical device object. The PnP manager
will dereference it again when it is no longer needed */
ObReferenceObject(Device->Pdo);
Relations->Objects[i] = Device->Pdo;
i++;
CurrentEntry = CurrentEntry->Flink;
}
Irp->IoStatus.Information = (ULONG)Relations;
return Status;
}
NTSTATUS
PnpRootQueryDeviceRelations(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp)
{
NTSTATUS Status;
DPRINT("Called\n");
switch (IrpSp->Parameters.QueryDeviceRelations.Type)
{
case BusRelations:
Status = PnpRootQueryBusRelations(DeviceObject, Irp, IrpSp);
break;
default:
Status = STATUS_NOT_IMPLEMENTED;
}
return Status;
}
NTSTATUS
STDCALL
PnpRootPnpControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PIO_STACK_LOCATION IrpSp;
NTSTATUS Status;
DPRINT("Called\n");
IrpSp = IoGetCurrentIrpStackLocation(Irp);
switch (IrpSp->MinorFunction)
{
case IRP_MN_QUERY_DEVICE_RELATIONS:
Status = PnpRootQueryDeviceRelations(DeviceObject, Irp, IrpSp);
break;
case IRP_MN_START_DEVICE:
PnpRootDeviceListCount = 0;
Status = STATUS_SUCCESS;
break;
case IRP_MN_STOP_DEVICE:
/* Root device cannot be stopped */
Status = STATUS_UNSUCCESSFUL;
break;
default:
DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
Status = STATUS_NOT_IMPLEMENTED;
break;
}
if (Status != STATUS_PENDING)
{
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
DPRINT("Leaving. Status 0x%X\n", Status);
return Status;
}
NTSTATUS
STDCALL
PnpRootPowerControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PIO_STACK_LOCATION IrpSp;
NTSTATUS Status;
DPRINT("Called\n");
IrpSp = IoGetCurrentIrpStackLocation(Irp);
switch (IrpSp->MinorFunction)
{
default:
DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
Status = STATUS_NOT_IMPLEMENTED;
break;
}
if (Status != STATUS_PENDING)
{
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
DPRINT("Leaving. Status 0x%X\n", Status);
return Status;
}
NTSTATUS
PnpRootAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject)
{
PDEVICE_OBJECT Ldo;
NTSTATUS Status;
DPRINT("Called\n");
Status = IoCreateDevice(DriverObject, 0, NULL, FILE_DEVICE_BUS_EXTENDER,
FILE_DEVICE_SECURE_OPEN, TRUE, &PnpRootDeviceObject);
if (!NT_SUCCESS(Status))
{
DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
KeBugCheck(0);
return Status;
}
Ldo = IoAttachDeviceToDeviceStack(PnpRootDeviceObject, PhysicalDeviceObject);
if (!PnpRootDeviceObject)
{
DbgPrint("PnpRootDeviceObject 0x%X\n", PnpRootDeviceObject);
KeBugCheck(0);
}
if (!PhysicalDeviceObject)
{
DbgPrint("PhysicalDeviceObject 0x%X\n", PhysicalDeviceObject);
KeBugCheck(0);
}
InitializeListHead(&PnpRootDeviceListHead);
PnpRootDeviceListCount = 0;
KeInitializeSpinLock(&PnpRootDeviceListLock);
PnpRootDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
DPRINT("Done\n");
return STATUS_SUCCESS;
}
NTSTATUS
STDCALL
PnpRootDriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
DPRINT("Called\n");
DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl;
DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
DriverObject->DriverExtension->AddDevice = PnpRootAddDevice;
return STATUS_SUCCESS;
}
/* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: shutdown.c,v 1.4 2001/03/07 16:48:42 dwelch Exp $ /* $Id: shutdown.c,v 1.5 2001/05/01 23:08:19 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -14,6 +14,7 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/pool.h> #include <internal/pool.h>
#define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
/* LOCAL DATA ***************************************************************/ /* LOCAL DATA ***************************************************************/

View file

@ -1,4 +1,4 @@
/* $Id: dlog.c,v 1.2 2001/03/25 18:56:12 dwelch Exp $ /* $Id: dlog.c,v 1.3 2001/05/01 23:08:19 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -13,6 +13,7 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/ntoskrnl.h> #include <internal/ntoskrnl.h>
#include <internal/config.h>
#include <internal/kd.h> #include <internal/kd.h>
#include <ntos/minmax.h> #include <ntos/minmax.h>

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: main.c,v 1.94 2001/04/26 03:58:32 phreak Exp $ /* $Id: main.c,v 1.95 2001/05/01 23:08:19 chorns Exp $
* *
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/main.c * FILE: ntoskrnl/ke/main.c
@ -38,6 +38,7 @@
#include <internal/ps.h> #include <internal/ps.h>
#include <internal/ke.h> #include <internal/ke.h>
#include <internal/io.h> #include <internal/io.h>
#include <internal/po.h>
#include <napi/shared_data.h> #include <napi/shared_data.h>
#include <internal/v86m.h> #include <internal/v86m.h>
#include <internal/kd.h> #include <internal/kd.h>
@ -56,6 +57,8 @@ LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock;
static LOADER_MODULE KeLoaderModules[64]; static LOADER_MODULE KeLoaderModules[64];
static UCHAR KeLoaderModuleStrings[64][256]; static UCHAR KeLoaderModuleStrings[64][256];
static UCHAR KeLoaderCommandLine[256]; static UCHAR KeLoaderCommandLine[256];
static ADDRESS_RANGE KeMemoryMap[64];
static ULONG KeMemoryMapRangeCount;
static ULONG FirstKrnlPhysAddr; static ULONG FirstKrnlPhysAddr;
static ULONG LastKrnlPhysAddr; static ULONG LastKrnlPhysAddr;
static ULONG LastKernelAddress; static ULONG LastKernelAddress;
@ -134,7 +137,7 @@ CreateSystemRootLink (PCSZ ParameterLine)
{ {
RtlFreeUnicodeString (&BootPath); RtlFreeUnicodeString (&BootPath);
RtlFreeUnicodeString (&DeviceName); RtlFreeUnicodeString (&DeviceName);
DbgPrint("NtOpenSymbolicLinkObject() '%wZ' failed (Status %x)\n", DPRINT("NtOpenSymbolicLinkObject() '%wZ' failed (Status %x)\n",
&ArcName, &ArcName,
Status); Status);
RtlFreeUnicodeString (&ArcName); RtlFreeUnicodeString (&ArcName);
@ -382,11 +385,34 @@ InitSystemSharedUserPage (PCSZ ParameterLine)
} }
} }
#ifndef NDEBUG
VOID DumpBIOSMemoryMap(VOID)
{
ULONG i;
DbgPrint("Dumping BIOS memory map:\n");
DbgPrint("Memory map base: %d\n", KeLoaderBlock.MmapAddr);
DbgPrint("Memory map size: %d\n", KeLoaderBlock.MmapLength);
DbgPrint("Address range count: %d\n", KeMemoryMapRangeCount);
for (i = 0; i < KeMemoryMapRangeCount; i++)
{
DbgPrint("Range: Base (%08X) Length (%08X) Type (%02X)\n",
KeMemoryMap[i].BaseAddrLow,
KeMemoryMap[i].LengthLow,
KeMemoryMap[i].Type);
}
for (;;);
}
#endif /* !NDEBUG */
VOID VOID
ExpInitializeExecutive(VOID) ExpInitializeExecutive(VOID)
{ {
ULONG i; ULONG i;
ULONG start; ULONG start;
ULONG length;
PCHAR name; PCHAR name;
CHAR str[50]; CHAR str[50];
@ -416,7 +442,11 @@ ExpInitializeExecutive(VOID)
NtEarlyInitVdm(); NtEarlyInitVdm();
MmInit1(FirstKrnlPhysAddr, LastKrnlPhysAddr, LastKernelAddress); MmInit1(FirstKrnlPhysAddr,
LastKrnlPhysAddr,
LastKernelAddress,
(PADDRESS_RANGE)&KeMemoryMap,
KeMemoryMapRangeCount);
/* /*
* Initialize the kernel debugger * Initialize the kernel debugger
@ -480,6 +510,7 @@ ExpInitializeExecutive(VOID)
ExInit(); ExInit();
IoInit(); IoInit();
PoInit();
LdrInitModuleManagement(); LdrInitModuleManagement();
CmInitializeRegistry(); CmInitializeRegistry();
NtInit(); NtInit();
@ -487,7 +518,7 @@ ExpInitializeExecutive(VOID)
/* Report all resources used by hal */ /* Report all resources used by hal */
HalReportResourceUsage (); HalReportResourceUsage ();
/* /*
* Enter the kernel debugger before starting up the boot drivers * Enter the kernel debugger before starting up the boot drivers
*/ */
@ -501,7 +532,7 @@ ExpInitializeExecutive(VOID)
DPRINT1("%d files loaded\n",KeLoaderBlock.ModsCount); DPRINT1("%d files loaded\n",KeLoaderBlock.ModsCount);
for (i=0; i < KeLoaderBlock.ModsCount; i++) for (i=0; i < KeLoaderBlock.ModsCount; i++)
{ {
DPRINT1("module: %s\n", KeLoaderModules[i].String); CPRINT("Module: %s\n", KeLoaderModules[i].String);
} }
/* Pass 1: load registry chunks passed in */ /* Pass 1: load registry chunks passed in */
@ -510,7 +541,7 @@ ExpInitializeExecutive(VOID)
start = KeLoaderModules[i].ModStart; start = KeLoaderModules[i].ModStart;
if (strcmp ((PCHAR) start, "REGEDIT4") == 0) if (strcmp ((PCHAR) start, "REGEDIT4") == 0)
{ {
DPRINT1("process registry chunk at %08lx\n", start); CPRINT("Process registry chunk at %08lx\n", start);
CmImportHive((PCHAR) start); CmImportHive((PCHAR) start);
} }
} }
@ -519,16 +550,18 @@ ExpInitializeExecutive(VOID)
for (i=1; i < KeLoaderBlock.ModsCount; i++) for (i=1; i < KeLoaderBlock.ModsCount; i++)
{ {
start = KeLoaderModules[i].ModStart; start = KeLoaderModules[i].ModStart;
length = KeLoaderModules[i].ModEnd - start;
name = (PCHAR)KeLoaderModules[i].String; name = (PCHAR)KeLoaderModules[i].String;
if (strcmp ((PCHAR) start, "REGEDIT4") != 0) if (strcmp ((PCHAR) start, "REGEDIT4") != 0)
{ {
DPRINT1("process module '%s' at %08lx\n", name, start); CPRINT("Processing module '%s' at %08lx, length 0x%08lx\n",
LdrProcessDriver((PVOID)start, name); name, start, length);
LdrProcessDriver((PVOID)start, name, length);
} }
} }
/* Create the SystemRoot symbolic link */ /* Create the SystemRoot symbolic link */
DbgPrint("CommandLine: %s\n", (PUCHAR)KeLoaderBlock.CommandLine); CPRINT("CommandLine: %s\n", (PUCHAR)KeLoaderBlock.CommandLine);
CreateSystemRootLink ((PUCHAR)KeLoaderBlock.CommandLine); CreateSystemRootLink ((PUCHAR)KeLoaderBlock.CommandLine);
@ -541,6 +574,16 @@ ExpInitializeExecutive(VOID)
CmInitializeRegistry2(); CmInitializeRegistry2();
/*
* Start the motherboard enumerator (the HAL)
*/
HalInitSystem (2, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
/*
* Load boot start drivers
*/
IopLoadBootStartDrivers();
/* /*
* Load Auto configured drivers * Load Auto configured drivers
*/ */
@ -599,6 +642,7 @@ _main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock)
*/ */
{ {
ULONG i; ULONG i;
ULONG size;
ULONG last_kernel_address; ULONG last_kernel_address;
extern ULONG _bss_end__; extern ULONG _bss_end__;
@ -640,6 +684,22 @@ _main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock)
LastKrnlPhysAddr = last_kernel_address - 0xc0000000 + 0x200000; LastKrnlPhysAddr = last_kernel_address - 0xc0000000 + 0x200000;
LastKernelAddress = last_kernel_address; LastKernelAddress = last_kernel_address;
KeMemoryMapRangeCount = 0;
if (KeLoaderBlock.Flags & MB_FLAGS_MMAP_INFO)
{
/* We have a memory map from the nice BIOS */
size = *((PULONG)(KeLoaderBlock.MmapAddr - sizeof(ULONG)));
i = 0;
while (i < KeLoaderBlock.MmapLength)
{
memcpy (&KeMemoryMap[KeMemoryMapRangeCount],
(PVOID)(KeLoaderBlock.MmapAddr + i),
sizeof(ADDRESS_RANGE));
KeMemoryMapRangeCount++;
i += size;
}
}
KeInit1(); KeInit1();
KiSystemStartup(1); KiSystemStartup(1);

View file

@ -1,4 +1,4 @@
/* $Id: loader.c,v 1.76 2001/04/26 14:26:22 phreak Exp $ /* $Id: loader.c,v 1.77 2001/05/01 23:08:20 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -28,6 +28,7 @@
#include <internal/config.h> #include <internal/config.h>
#include <internal/module.h> #include <internal/module.h>
#include <internal/ntoskrnl.h> #include <internal/ntoskrnl.h>
#include <internal/io.h>
#include <internal/mm.h> #include <internal/mm.h>
#include <internal/ob.h> #include <internal/ob.h>
#include <internal/ps.h> #include <internal/ps.h>
@ -38,9 +39,6 @@
#include <internal/debug.h> #include <internal/debug.h>
/* FIXME: this should appear in a kernel header file */
NTSTATUS IoInitializeDriver(PDRIVER_INITIALIZE DriverEntry);
/* MACROS ********************************************************************/ /* MACROS ********************************************************************/
#define MODULE_ROOT_NAME L"\\Modules\\" #define MODULE_ROOT_NAME L"\\Modules\\"
@ -222,9 +220,9 @@ VOID LdrInitModuleManagement(VOID)
ModuleObject->Image.PE.OptionalHeader->AddressOfEntryPoint); ModuleObject->Image.PE.OptionalHeader->AddressOfEntryPoint);
DPRINT("ModuleObject:%08x entrypoint at %x\n", ModuleObject, ModuleObject->EntryPoint); DPRINT("ModuleObject:%08x entrypoint at %x\n", ModuleObject, ModuleObject->EntryPoint);
ModuleObject->Length = ModuleObject->Image.PE.OptionalHeader->SizeOfImage; ModuleObject->Length = ModuleObject->Image.PE.OptionalHeader->SizeOfImage;
ModuleObject->TextSection = &NtoskrnlTextSection;
/* FIXME: Add fake module entry for HAL */ /* FIXME: Add fake module entry for HAL */
} }
/* /*
@ -232,48 +230,64 @@ VOID LdrInitModuleManagement(VOID)
*/ */
static VOID LdrLoadAutoConfigDriver (LPWSTR RelativeDriverName) static VOID LdrLoadAutoConfigDriver (LPWSTR RelativeDriverName)
{ {
WCHAR TmpFileName [MAX_PATH]; WCHAR TmpFileName [MAX_PATH];
NTSTATUS Status;
UNICODE_STRING DriverName; UNICODE_STRING DriverName;
PDEVICE_NODE DeviceNode;
NTSTATUS Status;
DbgPrint("Loading %S\n",RelativeDriverName); CPRINT("Loading %S\n",RelativeDriverName);
wcscpy(TmpFileName, L"\\SystemRoot\\system32\\drivers\\"); wcscpy(TmpFileName, L"\\SystemRoot\\system32\\drivers\\");
wcscat(TmpFileName, RelativeDriverName); wcscat(TmpFileName, RelativeDriverName);
RtlInitUnicodeString (&DriverName, TmpFileName); RtlInitUnicodeString (&DriverName, TmpFileName);
Status = LdrLoadDriver(&DriverName); /* Use IopRootDeviceNode for now */
Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("driver load failed, status (%x)\n", Status); return;
// KeBugCheck(0); }
Status = LdrLoadDriver(&DriverName, DeviceNode, FALSE);
if (!NT_SUCCESS(Status))
{
IopFreeDeviceNode(DeviceNode);
DPRINT1("Driver load failed, status (%x)\n", Status);
} }
} }
#ifdef KDBG #ifdef KDBG
BOOLEAN LdrReadLine(PCHAR Line, BOOLEAN LdrpReadLine(PCHAR Line,
PVOID *Buffer, ULONG LineSize,
PULONG Size) PVOID *Buffer,
PULONG Size)
{ {
CHAR ch; CHAR ch;
PCHAR Block; PCHAR Block;
ULONG Count;
if (*Size == 0) if (*Size == 0)
return FALSE; return FALSE;
ch = ' ';
Count = 0;
Block = *Buffer; Block = *Buffer;
while ((*Size > 0) && ((ch = *Block) != (CHAR)13)) while ((*Size > 0) && (Count < LineSize) && ((ch = *Block) != (CHAR)13))
{ {
*Line = ch; *Line = ch;
Line++; Line++;
Block++; Block++;
Count++;
*Size -= 1; *Size -= 1;
} }
*Line = (CHAR)0; *Line = (CHAR)0;
Block++; if (ch == (CHAR)13)
*Size -= 1; {
Block++;
*Size -= 1;
}
if ((*Size > 0) && (*Block == (CHAR)10)) if ((*Size > 0) && (*Block == (CHAR)10))
{ {
@ -310,9 +324,10 @@ ULONG HexL(PCHAR Buffer)
return Value; return Value;
} }
PSYMBOL LdrParseLine(PCHAR Line, PSYMBOL LdrpParseLine(PCHAR Line,
PULONG ImageBase, PULONG TextBase,
PBOOLEAN ImageBaseValid) PBOOLEAN TextBaseValid,
PULONG FileAlignment)
/* /*
Line format: [ADDRESS] <TYPE> <NAME> Line format: [ADDRESS] <TYPE> <NAME>
TYPE: TYPE:
@ -334,8 +349,6 @@ PSYMBOL LdrParseLine(PCHAR Line,
PCHAR Str; PCHAR Str;
CHAR Type; CHAR Type;
*ImageBaseValid = FALSE;
if ((Line[0] == (CHAR)0) || (Line[0] == ' ')) if ((Line[0] == (CHAR)0) || (Line[0] == ' '))
return NULL; return NULL;
@ -359,13 +372,19 @@ PSYMBOL LdrParseLine(PCHAR Line,
else else
strncpy((char*)&Buffer, Line, Str - Line); strncpy((char*)&Buffer, Line, Str - Line);
if ((Type == 'A') && (strcmp((char*)&Buffer, "__image_base__")) == 0) if ((Type == 'A') && (strcmp((char*)&Buffer, "__file_alignment__")) == 0)
{ {
*ImageBase = Address; *FileAlignment = Address;
*ImageBaseValid = TRUE;
return NULL; return NULL;
} }
/* if ((Type == 'A') && (strcmp((char*)&Buffer, "__image_base__")) == 0)
{
*TextBase = Address;
*TextBaseValid = TRUE;
return NULL;
}*/
/* We only want symbols in the .text segment */ /* We only want symbols in the .text segment */
if ((Type != 't') && (Type != 'T')) if ((Type != 't') && (Type != 'T'))
return NULL; return NULL;
@ -385,29 +404,86 @@ PSYMBOL LdrParseLine(PCHAR Line,
RtlInitAnsiString(&AnsiString, (PCSZ)&Buffer); RtlInitAnsiString(&AnsiString, (PCSZ)&Buffer);
RtlAnsiStringToUnicodeString(&Symbol->Name, &AnsiString, TRUE); RtlAnsiStringToUnicodeString(&Symbol->Name, &AnsiString, TRUE);
if (!(*TextBaseValid))
{
*TextBase = Address - *FileAlignment;
*TextBaseValid = TRUE;
}
return Symbol; return Symbol;
} }
VOID LdrLoadModuleSymbols(PMODULE_OBJECT ModuleObject, VOID LdrpLoadModuleSymbolsFromBuffer(
MODULE_TEXT_SECTION* ModuleTextSection) PMODULE_OBJECT ModuleObject,
PVOID Buffer,
ULONG Length)
/* /*
Symbols must be sorted by address, e.g. Symbols must be sorted by address, e.g.
"nm --numeric-sort module.sys > module.sym" "nm --numeric-sort module.sys > module.sym"
*/ */
{ {
WCHAR TmpFileName[MAX_PATH];
LPWSTR Start, Ext;
ULONG Length, Tmp;
UNICODE_STRING Filename;
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
HANDLE FileHandle;
PVOID FileBuffer, FilePtr;
CHAR Line[256];
FILE_STANDARD_INFORMATION FileStdInfo;
BOOLEAN ImageBaseValid;
ULONG ImageBase = 0;
PSYMBOL Symbol, CurrentSymbol = NULL; PSYMBOL Symbol, CurrentSymbol = NULL;
BOOLEAN TextBaseValid;
BOOLEAN Valid;
ULONG TextBase = 0;
ULONG FileAlignment = 0;
CHAR Line[256];
ULONG Tmp;
assert(ModuleObject);
if (ModuleObject->TextSection == NULL)
{
ModuleObject->TextSection = &NtoskrnlTextSection;
}
if (ModuleObject->TextSection->Symbols.SymbolCount > 0)
{
CPRINT("Symbols are already loaded for %wZ\n", &ModuleObject->BaseName);
return;
}
ModuleObject->TextSection->Symbols.SymbolCount = 0;
ModuleObject->TextSection->Symbols.Symbols = NULL;
TextBaseValid = FALSE;
Valid = FALSE;
while (LdrpReadLine((PCHAR)&Line, 256, &Buffer, &Length))
{
Symbol = LdrpParseLine((PCHAR)&Line, &Tmp, &Valid, &FileAlignment);
if ((Valid) && (!TextBaseValid))
{
TextBase = Tmp;
TextBaseValid = TRUE;
}
if (Symbol != NULL)
{
Symbol->RelativeAddress -= TextBase;
if (ModuleObject->TextSection->Symbols.Symbols == NULL)
ModuleObject->TextSection->Symbols.Symbols = Symbol;
else
CurrentSymbol->Next = Symbol;
CurrentSymbol = Symbol;
ModuleObject->TextSection->Symbols.SymbolCount++;
}
}
}
VOID LdrpLoadModuleSymbols(PMODULE_OBJECT ModuleObject)
{
FILE_STANDARD_INFORMATION FileStdInfo;
OBJECT_ATTRIBUTES ObjectAttributes;
WCHAR TmpFileName[MAX_PATH];
UNICODE_STRING Filename;
LPWSTR Start, Ext;
HANDLE FileHandle;
PVOID FileBuffer;
NTSTATUS Status;
ULONG Length;
/* Get the path to the symbol store */ /* Get the path to the symbol store */
wcscpy(TmpFileName, L"\\SystemRoot\\symbols\\"); wcscpy(TmpFileName, L"\\SystemRoot\\symbols\\");
@ -446,7 +522,7 @@ VOID LdrLoadModuleSymbols(PMODULE_OBJECT ModuleObject,
return; return;
} }
DbgPrint("Loading symbols from %wZ...\n", &Filename); CPRINT("Loading symbols from %wZ...\n", &Filename);
/* Get the size of the file */ /* Get the size of the file */
Status = ZwQueryInformationFile(FileHandle, Status = ZwQueryInformationFile(FileHandle,
@ -485,37 +561,50 @@ VOID LdrLoadModuleSymbols(PMODULE_OBJECT ModuleObject,
ZwClose(FileHandle); ZwClose(FileHandle);
ModuleTextSection->Symbols.SymbolCount = 0; LdrpLoadModuleSymbolsFromBuffer(ModuleObject,
ModuleTextSection->Symbols.Symbols = NULL; FileBuffer,
FileStdInfo.EndOfFile.u.LowPart);
FilePtr = FileBuffer;
Length = FileStdInfo.EndOfFile.u.LowPart;
while (LdrReadLine((PCHAR)&Line, &FilePtr, &Length))
{
Symbol = LdrParseLine((PCHAR)&Line, &Tmp, &ImageBaseValid);
if (ImageBaseValid)
ImageBase = Tmp;
if (Symbol != NULL)
{
Symbol->RelativeAddress -= ImageBase;
if (ModuleTextSection->Symbols.Symbols == NULL)
ModuleTextSection->Symbols.Symbols = Symbol;
else
CurrentSymbol->Next = Symbol;
CurrentSymbol = Symbol;
ModuleTextSection->Symbols.SymbolCount++;
}
}
ExFreePool(FileBuffer); ExFreePool(FileBuffer);
} }
NTSTATUS LdrpFindModuleObject(
PUNICODE_STRING ModuleName,
PMODULE_OBJECT *ModuleObject)
{
NTSTATUS Status;
WCHAR NameBuffer[MAX_PATH];
UNICODE_STRING Name;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING RemainingPath;
wcscpy(NameBuffer, MODULE_ROOT_NAME);
wcscat(NameBuffer, ModuleName->Buffer);
RtlInitUnicodeString(&Name, NameBuffer);
InitializeObjectAttributes(&ObjectAttributes,
&Name,
0,
NULL,
NULL);
Status = ObFindObject(&ObjectAttributes,
(PVOID*)ModuleObject,
&RemainingPath,
NULL);
if (!NT_SUCCESS(Status))
{
return Status;
}
if ((RemainingPath.Buffer != NULL) || (*ModuleObject == NULL))
{
RtlFreeUnicodeString(&RemainingPath);
return STATUS_UNSUCCESSFUL;
}
return STATUS_SUCCESS;
}
#endif /* KDBG */ #endif /* KDBG */
VOID LdrLoadAutoConfigDrivers (VOID) VOID LdrLoadAutoConfigDrivers (VOID)
@ -524,33 +613,17 @@ VOID LdrLoadAutoConfigDrivers (VOID)
#ifdef KDBG #ifdef KDBG
NTSTATUS Status; NTSTATUS Status;
WCHAR NameBuffer[60];
UNICODE_STRING ModuleName; UNICODE_STRING ModuleName;
PMODULE_OBJECT ModuleObject; PMODULE_OBJECT ModuleObject;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING RemainingPath;
/* Load symbols for ntoskrnl.exe and hal.dll because \SystemRoot /* Load symbols for ntoskrnl.exe and hal.dll because \SystemRoot
is created after their module entries */ is created after their module entries */
wcscpy(NameBuffer, MODULE_ROOT_NAME); RtlInitUnicodeString(&ModuleName, L"ntoskrnl.exe");
wcscat(NameBuffer, L"ntoskrnl.exe");
RtlInitUnicodeString(&ModuleName, NameBuffer);
InitializeObjectAttributes(&ObjectAttributes, Status = LdrpFindModuleObject(&ModuleName, &ModuleObject);
&ModuleName,
0,
NULL,
NULL);
Status = ObFindObject(&ObjectAttributes,
(PVOID*)&ModuleObject,
&RemainingPath,
NULL);
if (NT_SUCCESS(Status)) { if (NT_SUCCESS(Status)) {
RtlFreeUnicodeString(&RemainingPath); LdrpLoadModuleSymbols(ModuleObject);
LdrLoadModuleSymbols(ModuleObject, &NtoskrnlTextSection);
} }
/* FIXME: Load symbols for hal.dll */ /* FIXME: Load symbols for hal.dll */
@ -643,19 +716,27 @@ LdrCreateModule(PVOID ObjectBody,
* RETURNS: Status * RETURNS: Status
*/ */
NTSTATUS LdrLoadDriver(PUNICODE_STRING Filename) NTSTATUS LdrLoadDriver(PUNICODE_STRING Filename,
PDEVICE_NODE DeviceNode,
BOOLEAN BootDriversOnly)
{ {
PMODULE_OBJECT ModuleObject; PMODULE_OBJECT ModuleObject;
NTSTATUS Status;
ModuleObject = LdrLoadModule(Filename); ModuleObject = LdrLoadModule(Filename);
if (ModuleObject == 0) if (!ModuleObject)
{ {
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
/* FIXME: should we dereference the ModuleObject here? */ Status = IopInitializeDriver(ModuleObject->EntryPoint,
DeviceNode, BootDriversOnly);
if (!NT_SUCCESS(Status))
{
ObDereferenceObject(ModuleObject);
}
return IoInitializeDriver(ModuleObject->EntryPoint); return Status;
} }
NTSTATUS LdrLoadGdiDriver (PUNICODE_STRING DriverName, NTSTATUS LdrLoadGdiDriver (PUNICODE_STRING DriverName,
@ -720,8 +801,8 @@ LdrLoadModule(PUNICODE_STRING Filename)
CHECKPOINT; CHECKPOINT;
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("Could not open module file: %wZ\n", Filename); CPRINT("Could not open module file: %wZ\n", Filename);
return 0; return NULL;
} }
CHECKPOINT; CHECKPOINT;
@ -733,8 +814,8 @@ LdrLoadModule(PUNICODE_STRING Filename)
FileStandardInformation); FileStandardInformation);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("Could not get file size\n"); CPRINT("Could not get file size\n");
return 0; return NULL;
} }
CHECKPOINT; CHECKPOINT;
@ -745,8 +826,8 @@ LdrLoadModule(PUNICODE_STRING Filename)
if (ModuleLoadBase == NULL) if (ModuleLoadBase == NULL)
{ {
DbgPrint("could not allocate memory for module"); CPRINT("Could not allocate memory for module");
return 0; return NULL;
} }
CHECKPOINT; CHECKPOINT;
@ -758,10 +839,9 @@ LdrLoadModule(PUNICODE_STRING Filename)
0, 0); 0, 0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("could not read module file into memory"); CPRINT("Could not read module file into memory");
ExFreePool(ModuleLoadBase); ExFreePool(ModuleLoadBase);
return NULL;
return 0;
} }
CHECKPOINT; CHECKPOINT;
@ -772,14 +852,88 @@ LdrLoadModule(PUNICODE_STRING Filename)
/* Cleanup */ /* Cleanup */
ExFreePool(ModuleLoadBase); ExFreePool(ModuleLoadBase);
#ifdef KDBG
/* Load symbols for module if available */
LdrpLoadModuleSymbols(ModuleObject);
#endif /* KDBG */
return ModuleObject; return ModuleObject;
} }
NTSTATUS NTSTATUS
LdrProcessDriver(PVOID ModuleLoadBase, PCHAR FileName) LdrProcessDriver(PVOID ModuleLoadBase, PCHAR FileName, ULONG ModuleLength)
{ {
PMODULE_OBJECT ModuleObject; PMODULE_OBJECT ModuleObject;
UNICODE_STRING ModuleName; UNICODE_STRING ModuleName;
PDEVICE_NODE DeviceNode;
NTSTATUS Status;
#ifdef KDBG
CHAR TmpBaseName[MAX_PATH];
CHAR TmpFileName[MAX_PATH];
ANSI_STRING AnsiString;
ULONG Length;
PCHAR Ext;
/* Split the filename into base name and extension */
Ext = strrchr(FileName, '.');
if (Ext != NULL)
Length = Ext - FileName;
else
Length = strlen(FileName);
if ((Ext != NULL) && (strcmp(Ext, ".sym") == 0))
{
DPRINT("Module %s is a symbol file\n", FileName);
strncpy(TmpBaseName, FileName, Length);
TmpBaseName[Length] = '\0';
DPRINT("base: %s (Length %d)\n", TmpBaseName, Length);
strcpy(TmpFileName, TmpBaseName);
strcat(TmpFileName, ".sys");
RtlInitAnsiString(&AnsiString, TmpFileName);
DPRINT("dasdsad: %s\n", TmpFileName);
RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
Status = LdrpFindModuleObject(&ModuleName, &ModuleObject);
RtlFreeUnicodeString(&ModuleName);
if (!NT_SUCCESS(Status))
{
strcpy(TmpFileName, TmpBaseName);
strcat(TmpFileName, ".exe");
RtlInitAnsiString(&AnsiString, TmpFileName);
RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
Status = LdrpFindModuleObject(&ModuleName, &ModuleObject);
RtlFreeUnicodeString(&ModuleName);
}
if (NT_SUCCESS(Status))
{
LdrpLoadModuleSymbolsFromBuffer(
ModuleObject,
ModuleLoadBase,
ModuleLength);
}
return(STATUS_SUCCESS);
}
else
{
DPRINT("Module %s is executable\n", FileName);
}
#endif /* KDBG */
/* Use IopRootDeviceNode for now */
Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode);
if (!NT_SUCCESS(Status))
{
CPRINT("Driver load failed, status (%x)\n", Status);
return(Status);
}
RtlCreateUnicodeStringFromAsciiz(&ModuleName, RtlCreateUnicodeStringFromAsciiz(&ModuleName,
FileName); FileName);
@ -788,13 +942,19 @@ LdrProcessDriver(PVOID ModuleLoadBase, PCHAR FileName)
RtlFreeUnicodeString(&ModuleName); RtlFreeUnicodeString(&ModuleName);
if (ModuleObject == NULL) if (ModuleObject == NULL)
{ {
DPRINT1("Driver load was unsuccessful\n"); IopFreeDeviceNode(DeviceNode);
return(STATUS_UNSUCCESSFUL); CPRINT("Driver load failed, status (%x)\n", Status);
return(STATUS_UNSUCCESSFUL);
} }
/* FIXME: should we dereference the ModuleObject here? */ Status = IopInitializeDriver(ModuleObject->EntryPoint, DeviceNode, FALSE);
if (!NT_SUCCESS(Status))
{
IopFreeDeviceNode(DeviceNode);
CPRINT("Driver load failed, status (%x)\n", Status);
}
return(IoInitializeDriver(ModuleObject->EntryPoint)); return(Status);
} }
PMODULE_OBJECT PMODULE_OBJECT
@ -809,7 +969,7 @@ LdrProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING ModuleName)
return LdrPEProcessModule(ModuleLoadBase, ModuleName); return LdrPEProcessModule(ModuleLoadBase, ModuleName);
} }
DPRINT1("Module wasn't PE\n"); CPRINT("Module wasn't PE\n");
return 0; return 0;
} }
@ -1035,23 +1195,23 @@ LdrPEProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING FileName)
/* Check file magic numbers */ /* Check file magic numbers */
if (PEDosHeader->e_magic != IMAGE_DOS_MAGIC) if (PEDosHeader->e_magic != IMAGE_DOS_MAGIC)
{ {
DbgPrint("Incorrect MZ magic: %04x\n", PEDosHeader->e_magic); CPRINT("Incorrect MZ magic: %04x\n", PEDosHeader->e_magic);
return 0; return 0;
} }
if (PEDosHeader->e_lfanew == 0) if (PEDosHeader->e_lfanew == 0)
{ {
DbgPrint("Invalid lfanew offset: %08x\n", PEDosHeader->e_lfanew); CPRINT("Invalid lfanew offset: %08x\n", PEDosHeader->e_lfanew);
return 0; return NULL;
} }
if (*PEMagic != IMAGE_PE_MAGIC) if (*PEMagic != IMAGE_PE_MAGIC)
{ {
DbgPrint("Incorrect PE magic: %08x\n", *PEMagic); CPRINT("Incorrect PE magic: %08x\n", *PEMagic);
return 0; return NULL;
} }
if (PEFileHeader->Machine != IMAGE_FILE_MACHINE_I386) if (PEFileHeader->Machine != IMAGE_FILE_MACHINE_I386)
{ {
DbgPrint("Incorrect Architechture: %04x\n", PEFileHeader->Machine); CPRINT("Incorrect Architechture: %04x\n", PEFileHeader->Machine);
return 0; return NULL;
} }
CHECKPOINT; CHECKPOINT;
@ -1074,10 +1234,10 @@ LdrPEProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING FileName)
DriverBase = MmAllocateSection(DriverSize); DriverBase = MmAllocateSection(DriverSize);
if (DriverBase == 0) if (DriverBase == 0)
{ {
DbgPrint("Failed to allocate a virtual section for driver\n"); CPRINT("Failed to allocate a virtual section for driver\n");
return 0; return 0;
} }
DbgPrint("DriverBase: %x\n", DriverBase); CPRINT("DriverBase: %x\n", DriverBase);
CHECKPOINT; CHECKPOINT;
/* Copy headers over */ /* Copy headers over */
memcpy(DriverBase, ModuleLoadBase, PEOptionalHeader->SizeOfHeaders); memcpy(DriverBase, ModuleLoadBase, PEOptionalHeader->SizeOfHeaders);
@ -1174,8 +1334,8 @@ LdrPEProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING FileName)
} }
else if (Type != 0) else if (Type != 0)
{ {
DbgPrint("Unknown relocation type %x at %x\n",Type, &Type); CPRINT("Unknown relocation type %x at %x\n",Type, &Type);
return 0; return NULL;
} }
} }
TotalRelocs += RelocDir->SizeOfBlock; TotalRelocs += RelocDir->SizeOfBlock;
@ -1218,7 +1378,7 @@ LdrPEProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING FileName)
LibraryModuleObject = LdrLoadModule(&ModuleName); LibraryModuleObject = LdrLoadModule(&ModuleName);
if (LibraryModuleObject == 0) if (LibraryModuleObject == 0)
{ {
DbgPrint("Unknown import module: %wZ\n", &ModuleName); CPRINT("Unknown import module: %wZ\n", &ModuleName);
} }
/* Get the import address list */ /* Get the import address list */
ImportAddressList = (PVOID *) ((DWORD)DriverBase + ImportAddressList = (PVOID *) ((DWORD)DriverBase +
@ -1262,8 +1422,8 @@ LdrPEProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING FileName)
} }
else else
{ {
DbgPrint("Unresolved kernel symbol: %s\n", pName); CPRINT("Unresolved kernel symbol: %s\n", pName);
return(NULL); return(NULL);
} }
ImportAddressList++; ImportAddressList++;
FunctionNameList++; FunctionNameList++;
@ -1285,7 +1445,7 @@ LdrPEProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING FileName)
wcscat(NameBuffer, FileName->Buffer); wcscat(NameBuffer, FileName->Buffer);
} }
RtlInitUnicodeString (&ModuleName, NameBuffer); RtlInitUnicodeString (&ModuleName, NameBuffer);
DbgPrint("Module name is: %wZ\n", &ModuleName); CPRINT("Module name is: %wZ\n", &ModuleName);
/* Initialize ObjectAttributes for ModuleObject */ /* Initialize ObjectAttributes for ModuleObject */
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
@ -1341,12 +1501,7 @@ LdrPEProcessModule(PVOID ModuleLoadBase, PUNICODE_STRING FileName)
wcscpy(ModuleTextSection->Name, NameBuffer); wcscpy(ModuleTextSection->Name, NameBuffer);
InsertTailList(&ModuleTextListHead, &ModuleTextSection->ListEntry); InsertTailList(&ModuleTextListHead, &ModuleTextSection->ListEntry);
#ifdef KDBG ModuleObject->TextSection = ModuleTextSection;
/* Load symbols for module if available */
LdrLoadModuleSymbols(ModuleObject, ModuleTextSection);
#endif /* KDBG */
return ModuleObject; return ModuleObject;
} }
@ -1374,7 +1529,6 @@ LdrPEGetExportAddress(PMODULE_OBJECT ModuleObject,
return NULL; return NULL;
} }
FunctionList = (PDWORD)((DWORD)ExportDir->AddressOfFunctions + ModuleObject->Base); FunctionList = (PDWORD)((DWORD)ExportDir->AddressOfFunctions + ModuleObject->Base);
NameList = (PDWORD)((DWORD)ExportDir->AddressOfNames + ModuleObject->Base); NameList = (PDWORD)((DWORD)ExportDir->AddressOfNames + ModuleObject->Base);
OrdinalList = (PWORD)((DWORD)ExportDir->AddressOfNameOrdinals + ModuleObject->Base); OrdinalList = (PWORD)((DWORD)ExportDir->AddressOfNameOrdinals + ModuleObject->Base);
@ -1416,10 +1570,10 @@ LdrPEGetExportAddress(PMODULE_OBJECT ModuleObject,
if (ExportAddress == 0) if (ExportAddress == 0)
{ {
DbgPrint("Export not found for %d:%s\n", CPRINT("Export not found for %d:%s\n",
Hint, Hint,
Name != NULL ? Name : "(Ordinal)"); Name != NULL ? Name : "(Ordinal)");
KeBugCheck(0); return NULL;
} }
return ExportAddress; return ExportAddress;
@ -1454,7 +1608,7 @@ LdrPEGetModuleObject(PUNICODE_STRING ModuleName)
Entry = Entry->Flink; Entry = Entry->Flink;
} }
DbgPrint("LdrPEGetModuleObject: Failed to find dll %wZ\n", ModuleName); CPRINT("LdrPEGetModuleObject: Failed to find dll %wZ\n", ModuleName);
return NULL; return NULL;
} }
@ -1490,12 +1644,11 @@ LdrPEFixupForward(PCHAR ForwardName)
if (ModuleObject == NULL) if (ModuleObject == NULL)
{ {
DbgPrint("LdrPEFixupForward: failed to find module %s\n", NameBuffer); CPRINT("LdrPEFixupForward: failed to find module %s\n", NameBuffer);
return NULL; return NULL;
} }
return LdrPEGetExportAddress(ModuleObject, p+1, 0); return LdrPEGetExportAddress(ModuleObject, p+1, 0);
} }
/* EOF */ /* EOF */

View file

@ -117,10 +117,96 @@ MmGetContinuousPages(ULONG NumberOfBytes,
return((PVOID)(start * 4096)); return((PVOID)(start * 4096));
} }
VOID MiParseRangeToFreeList(
PADDRESS_RANGE Range)
{
ULONG i, first, last;
/* FIXME: Not 64-bit ready */
DPRINT("Range going to free list (Base 0x%X, Length 0x%X, Type 0x%X)\n",
Range->BaseAddrLow,
Range->LengthLow,
Range->Type);
first = (Range->BaseAddrLow + PAGESIZE - 1) / PAGESIZE;
last = first + ((Range->LengthLow + PAGESIZE - 1) / PAGESIZE) + 1;
for (i = first; i < last; i++)
{
if (MmPageArray[i].Flags == 0)
{
MmPageArray[i].Flags = MM_PHYSICAL_PAGE_FREE;
MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreePageListHead,
&MmPageArray[i].ListEntry);
}
}
}
VOID MiParseRangeToBiosList(
PADDRESS_RANGE Range)
{
ULONG i, first, last;
/* FIXME: Not 64-bit ready */
DPRINT("Range going to bios list (Base 0x%X, Length 0x%X, Type 0x%X)\n",
Range->BaseAddrLow,
Range->LengthLow,
Range->Type);
first = (Range->BaseAddrLow + PAGESIZE - 1) / PAGESIZE;
last = first + ((Range->LengthLow + PAGESIZE - 1) / PAGESIZE) + 1;
for (i = first; i < last; i++)
{
/* Remove the page from the free list if it is there */
if (MmPageArray[i].Flags == MM_PHYSICAL_PAGE_FREE)
{
RemoveEntryList(&MmPageArray[i].ListEntry);
}
if (MmPageArray[i].Flags != MM_PHYSICAL_PAGE_BIOS)
{
MmPageArray[i].Flags = MM_PHYSICAL_PAGE_BIOS;
MmPageArray[i].ReferenceCount = 1;
InsertTailList(&BiosPageListHead,
&MmPageArray[i].ListEntry);
}
}
}
VOID MiParseBIOSMemoryMap(
ULONG MemorySizeInPages,
PADDRESS_RANGE BIOSMemoryMap,
ULONG AddressRangeCount)
{
PADDRESS_RANGE p;
ULONG i;
p = BIOSMemoryMap;
for (i = 0; i < AddressRangeCount; i++)
{
if (((p->BaseAddrLow + PAGESIZE - 1) / PAGESIZE) < MemorySizeInPages)
{
if (p->Type == 1)
{
MiParseRangeToFreeList(p);
}
else
{
MiParseRangeToBiosList(p);
}
}
p += 1;
}
}
PVOID MmInitializePageList(PVOID FirstPhysKernelAddress, PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
PVOID LastPhysKernelAddress, PVOID LastPhysKernelAddress,
ULONG MemorySizeInPages, ULONG MemorySizeInPages,
ULONG LastKernelAddress) ULONG LastKernelAddress,
PADDRESS_RANGE BIOSMemoryMap,
ULONG AddressRangeCount)
/* /*
* FUNCTION: Initializes the page list with all pages free * FUNCTION: Initializes the page list with all pages free
* except those known to be reserved and those used by the kernel * except those known to be reserved and those used by the kernel
@ -141,7 +227,7 @@ PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
LastPhysKernelAddress, LastPhysKernelAddress,
MemorySizeInPages, MemorySizeInPages,
LastKernelAddress); LastKernelAddress);
InitializeListHead(&UsedPageListHead); InitializeListHead(&UsedPageListHead);
KeInitializeSpinLock(&PageListLock); KeInitializeSpinLock(&PageListLock);
InitializeListHead(&FreePageListHead); InitializeListHead(&FreePageListHead);
@ -282,7 +368,16 @@ PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
MmPageArray[i].ReferenceCount = 0; MmPageArray[i].ReferenceCount = 0;
InsertTailList(&FreePageListHead, InsertTailList(&FreePageListHead,
&MmPageArray[i].ListEntry); &MmPageArray[i].ListEntry);
} }
if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0))
{
MiParseBIOSMemoryMap(
MemorySizeInPages,
BIOSMemoryMap,
AddressRangeCount);
}
MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages + MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages +
MmStats.NrReservedPages + MmStats.NrUserPages; MmStats.NrReservedPages + MmStats.NrUserPages;
return((PVOID)LastKernelAddress); return((PVOID)LastKernelAddress);
@ -423,7 +518,7 @@ MmIsUsablePage(PVOID PhysicalAddress)
{ {
KeBugCheck(0); KeBugCheck(0);
} }
if (MM_PTYPE(MmPageArray[Start].Flags) != MM_PHYSICAL_PAGE_USED && if (MM_PTYPE(MmPageArray[Start].Flags) != MM_PHYSICAL_PAGE_USED &&
MM_PTYPE(MmPageArray[Start].Flags) != MM_PHYSICAL_PAGE_BIOS) MM_PTYPE(MmPageArray[Start].Flags) != MM_PHYSICAL_PAGE_BIOS)
{ {

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: iospace.c,v 1.10 2001/04/09 02:45:04 dwelch Exp $ /* $Id: iospace.c,v 1.11 2001/05/01 23:08:20 chorns Exp $
* *
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/mm/iospace.c * FILE: ntoskrnl/mm/iospace.c
@ -93,11 +93,11 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
{ {
Attributes |= (PAGE_NOCACHE | PAGE_WRITETHROUGH); Attributes |= (PAGE_NOCACHE | PAGE_WRITETHROUGH);
} }
for (i = 0; (i <= (NumberOfBytes / PAGESIZE)); i++) for (i = 0; (i < ((NumberOfBytes + PAGESIZE - 1) / PAGESIZE)); i++)
{ {
Status = Status =
MmCreateVirtualMapping (NULL, MmCreateVirtualMappingForKernel (
(Result + (i * PAGESIZE)), (Result + (i * PAGESIZE)),
Attributes, Attributes,
PhysicalAddress.u.LowPart + (i * PAGESIZE)); PhysicalAddress.u.LowPart + (i * PAGESIZE));
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -106,7 +106,7 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
KeBugCheck(0); KeBugCheck(0);
} }
} }
return ((PVOID)Result); return ((PVOID)(Result + PhysicalAddress.QuadPart % PAGESIZE));
} }
@ -138,7 +138,7 @@ MmUnmapIoSpace (IN PVOID BaseAddress,
IN ULONG NumberOfBytes) IN ULONG NumberOfBytes)
{ {
(VOID)MmFreeMemoryArea(&PsGetCurrentProcess()->AddressSpace, (VOID)MmFreeMemoryArea(&PsGetCurrentProcess()->AddressSpace,
BaseAddress, (PVOID)(((ULONG)BaseAddress / PAGESIZE) * PAGESIZE),
NumberOfBytes, NumberOfBytes,
NULL, NULL,
NULL); NULL);

View file

@ -308,6 +308,9 @@ MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace,
BaseAddress); BaseAddress);
if (MemoryArea == NULL) if (MemoryArea == NULL)
{ {
DPRINT1("AddressSpace 0x%X - KASpace 0x%X\n", AddressSpace, MmGetKernelAddressSpace());
DPRINT1("Memory area is NULL\n");
KeBugCheck(0); KeBugCheck(0);
return(STATUS_UNSUCCESSFUL); return(STATUS_UNSUCCESSFUL);
} }

View file

@ -1,4 +1,4 @@
/* $Id: mminit.c,v 1.20 2001/04/26 14:26:23 phreak Exp $ /* $Id: mminit.c,v 1.21 2001/05/01 23:08:20 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top directory * COPYRIGHT: See COPYING in the top directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -79,6 +79,7 @@ VOID MmInitVirtualMemory(ULONG LastKernelAddress,
ULONG Length; ULONG Length;
ULONG ParamLength = KernelLength; ULONG ParamLength = KernelLength;
NTSTATUS Status; NTSTATUS Status;
//ULONG i;
DPRINT("MmInitVirtualMemory(%x, %x)\n",LastKernelAddress, KernelLength); DPRINT("MmInitVirtualMemory(%x, %x)\n",LastKernelAddress, KernelLength);
@ -163,14 +164,29 @@ VOID MmInitVirtualMemory(ULONG LastKernelAddress,
KeBugCheck(0); KeBugCheck(0);
} }
((PKUSER_SHARED_DATA)KERNEL_SHARED_DATA_BASE)->TickCountLow = 0xdeadbeef; ((PKUSER_SHARED_DATA)KERNEL_SHARED_DATA_BASE)->TickCountLow = 0xdeadbeef;
#if 0
for (i = 0; i < 0x100; i++)
{
Status = MmCreateVirtualMapping(NULL,
(PVOID)(i*PAGESIZE),
PAGE_READWRITE,
(ULONG)(i*PAGESIZE));
if (!NT_SUCCESS(Status))
{
DbgPrint("Unable to create virtual mapping\n");
KeBugCheck(0);
}
}
#endif
// MmDumpMemoryAreas(); // MmDumpMemoryAreas();
DPRINT("MmInitVirtualMemory() done\n"); DPRINT("MmInitVirtualMemory() done\n");
} }
VOID MmInit1(ULONG FirstKrnlPhysAddr, VOID MmInit1(ULONG FirstKrnlPhysAddr,
ULONG LastKrnlPhysAddr, ULONG LastKrnlPhysAddr,
ULONG LastKernelAddress) ULONG LastKernelAddress,
PADDRESS_RANGE BIOSMemoryMap,
ULONG AddressRangeCount)
/* /*
* FUNCTION: Initalize memory managment * FUNCTION: Initalize memory managment
*/ */
@ -216,7 +232,7 @@ VOID MmInit1(ULONG FirstKrnlPhysAddr,
*/ */
#ifndef MP #ifndef MP
/* FIXME: This is broken in SMP mode */ /* FIXME: This is broken in SMP mode */
MmDeletePageTable(NULL, 0); //MmDeletePageTable(NULL, 0);
#endif #endif
/* /*
* Free all pages not used for kernel memory * Free all pages not used for kernel memory
@ -240,13 +256,18 @@ VOID MmInit1(ULONG FirstKrnlPhysAddr,
/* add 1MB for standard memory (not extended) */ /* add 1MB for standard memory (not extended) */
MmStats.NrTotalPages += 256; MmStats.NrTotalPages += 256;
} }
#if 1
MmStats.NrTotalPages += 16;
#endif
DbgPrint("Used memory %dKb\n", (MmStats.NrTotalPages * PAGESIZE) / 1024); DbgPrint("Used memory %dKb\n", (MmStats.NrTotalPages * PAGESIZE) / 1024);
LastKernelAddress = (ULONG)MmInitializePageList( LastKernelAddress = (ULONG)MmInitializePageList(
(PVOID)FirstKrnlPhysAddr, (PVOID)FirstKrnlPhysAddr,
(PVOID)LastKrnlPhysAddr, (PVOID)LastKrnlPhysAddr,
MmStats.NrTotalPages, MmStats.NrTotalPages,
PAGE_ROUND_UP(LastKernelAddress)); PAGE_ROUND_UP(LastKernelAddress),
BIOSMemoryMap,
AddressRangeCount);
kernel_len = LastKrnlPhysAddr - FirstKrnlPhysAddr; kernel_len = LastKrnlPhysAddr - FirstKrnlPhysAddr;
/* /*

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.def,v 1.104 2001/04/21 12:39:33 ekohl Exp $ ; $Id: ntoskrnl.def,v 1.105 2001/05/01 23:08:17 chorns Exp $
; ;
; reactos/ntoskrnl/ntoskrnl.def ; reactos/ntoskrnl/ntoskrnl.def
; ;
@ -244,6 +244,7 @@ IoFreeController@4
IoFreeIrp@4 IoFreeIrp@4
IoFreeMdl@4 IoFreeMdl@4
IoGetAttachedDevice@4 IoGetAttachedDevice@4
IoGetAttachedDeviceReference@4
IoGetBaseFileSystemDeviceObject@4 IoGetBaseFileSystemDeviceObject@4
IoGetConfigurationInformation@0 IoGetConfigurationInformation@0
IoGetCurrentProcess@0 IoGetCurrentProcess@0
@ -550,7 +551,6 @@ NtWriteFile@36
;ObCheckObjectAccess@20 ;ObCheckObjectAccess@20
;ObCreateObject@36 ;ObCreateObject@36
ObCreateObject@16 ObCreateObject@16
ObDereferenceObject@4
;ObFindHandleForObject@20 ;ObFindHandleForObject@20
;ObGetObjectPointerCount@4 ;ObGetObjectPointerCount@4
;ObGetObjectSecurity@12 ;ObGetObjectSecurity@12
@ -560,15 +560,13 @@ ObOpenObjectByName@28
ObOpenObjectByPointer@28 ObOpenObjectByPointer@28
;ObQueryNameString@16 ;ObQueryNameString@16
;ObQueryObjectAuditingByHandle@8 ;ObQueryObjectAuditingByHandle@8
ObfDereferenceObject@4
ObfReferenceObject@4
ObReferenceObjectByHandle@24 ObReferenceObjectByHandle@24
ObReferenceObjectByName@32 ObReferenceObjectByName@32
ObReferenceObjectByPointer@16 ObReferenceObjectByPointer@16
;ObReleaseObjectSecurity@8 ;ObReleaseObjectSecurity@8
;ObSetSecurityDescriptorInfo@24 ;ObSetSecurityDescriptorInfo@24
;@ObfDereferenceObject@4
ObfDereferenceObject@4
;@ObfReferenceObject@4
ObfReferenceObject@4
ObAddEntryDirectory@12 ObAddEntryDirectory@12
;PfxFindPrefix ;PfxFindPrefix
;PfxInitialize ;PfxInitialize

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.edf,v 1.91 2001/04/21 12:39:33 ekohl Exp $ ; $Id: ntoskrnl.edf,v 1.92 2001/05/01 23:08:18 chorns Exp $
; ;
; reactos/ntoskrnl/ntoskrnl.def ; reactos/ntoskrnl/ntoskrnl.def
; ;
@ -244,6 +244,7 @@ IoFreeController=IoFreeController@4
IoFreeIrp=IoFreeIrp@4 IoFreeIrp=IoFreeIrp@4
IoFreeMdl=IoFreeMdl@4 IoFreeMdl=IoFreeMdl@4
IoGetAttachedDevice=IoGetAttachedDevice@4 IoGetAttachedDevice=IoGetAttachedDevice@4
IoGetAttachedDeviceReference=IoGetAttachedDeviceReference@4
IoGetBaseFileSystemDeviceObject=IoGetBaseFileSystemDeviceObject@4 IoGetBaseFileSystemDeviceObject=IoGetBaseFileSystemDeviceObject@4
IoGetConfigurationInformation=IoGetConfigurationInformation@0 IoGetConfigurationInformation=IoGetConfigurationInformation@0
IoGetCurrentProcess=IoGetCurrentProcess@0 IoGetCurrentProcess=IoGetCurrentProcess@0
@ -550,7 +551,6 @@ NtWriteFile=NtWriteFile@36
;ObCheckObjectAccess=ObCheckObjectAccess@20 ;ObCheckObjectAccess=ObCheckObjectAccess@20
;ObCreateObject=ObCreateObject@36 ;ObCreateObject=ObCreateObject@36
ObCreateObject=ObCreateObject@16 ObCreateObject=ObCreateObject@16
ObDereferenceObject=ObDereferenceObject@4
;ObFindHandleForObject=ObFindHandleForObject@20 ;ObFindHandleForObject=ObFindHandleForObject@20
;ObGetObjectPointerCount=ObGetObjectPointerCount@4 ;ObGetObjectPointerCount=ObGetObjectPointerCount@4
;ObGetObjectSecurity=ObGetObjectSecurity@12 ;ObGetObjectSecurity=ObGetObjectSecurity@12
@ -560,15 +560,13 @@ ObOpenObjectByName=ObOpenObjectByName@28
ObOpenObjectByPointer=ObOpenObjectByPointer@28 ObOpenObjectByPointer=ObOpenObjectByPointer@28
;ObQueryNameString=ObQueryNameString@16 ;ObQueryNameString=ObQueryNameString@16
;ObQueryObjectAuditingByHandle=ObQueryObjectAuditingByHandle@8 ;ObQueryObjectAuditingByHandle=ObQueryObjectAuditingByHandle@8
ObfDereferenceObject=ObfDereferenceObject@4
ObfReferenceObject=ObfReferenceObject@4
ObReferenceObjectByHandle=ObReferenceObjectByHandle@24 ObReferenceObjectByHandle=ObReferenceObjectByHandle@24
ObReferenceObjectByName=ObReferenceObjectByName@32 ObReferenceObjectByName=ObReferenceObjectByName@32
ObReferenceObjectByPointer=ObReferenceObjectByPointer@16 ObReferenceObjectByPointer=ObReferenceObjectByPointer@16
;ObReleaseObjectSecurity=ObReleaseObjectSecurity@8 ;ObReleaseObjectSecurity=ObReleaseObjectSecurity@8
;ObSetSecurityDescriptorInfo=ObSetSecurityDescriptorInfo@24 ;ObSetSecurityDescriptorInfo=ObSetSecurityDescriptorInfo@24
;ObfDereferenceObject=@ObfDereferenceObject@4
ObfDereferenceObject=ObfDereferenceObject@4
;ObfReferenceObject=@ObfReferenceObject@4
ObfReferenceObject=ObfReferenceObject@4
ObAddEntryDirectory=ObAddEntryDirectory@12 ObAddEntryDirectory=ObAddEntryDirectory@12
;PfxFindPrefix ;PfxFindPrefix
;PfxInitialize ;PfxInitialize

View file

@ -1,4 +1,4 @@
/* $Id: object.c,v 1.35 2001/05/01 11:06:24 ekohl Exp $ /* $Id: object.c,v 1.36 2001/05/01 23:08:20 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -12,6 +12,7 @@
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/config.h>
#include <internal/ob.h> #include <internal/ob.h>
#include <internal/ps.h> #include <internal/ps.h>
#include <internal/id.h> #include <internal/id.h>
@ -113,8 +114,8 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
DPRINT("ObFindObject(ObjectAttributes %x, ReturnedObject %x, " DPRINT("ObFindObject(ObjectAttributes %x, ReturnedObject %x, "
"RemainingPath %x)\n",ObjectAttributes,ReturnedObject,RemainingPath); "RemainingPath %x)\n",ObjectAttributes,ReturnedObject,RemainingPath);
DPRINT("ObjectAttributes->ObjectName->Buffer %x\n", DPRINT("ObjectAttributes->ObjectName %wZ\n",
ObjectAttributes->ObjectName->Buffer); ObjectAttributes->ObjectName);
RtlInitUnicodeString (RemainingPath, NULL); RtlInitUnicodeString (RemainingPath, NULL);
@ -171,6 +172,10 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
{ {
DPRINT("current %S\n",current); DPRINT("current %S\n",current);
CurrentHeader = BODY_TO_HEADER(CurrentObject); CurrentHeader = BODY_TO_HEADER(CurrentObject);
DPRINT("Current ObjectType %wZ\n",
&CurrentHeader->ObjectType->TypeName);
if (CurrentHeader->ObjectType->Parse == NULL) if (CurrentHeader->ObjectType->Parse == NULL)
{ {
DPRINT("Current object can't parse\n"); DPRINT("Current object can't parse\n");
@ -273,7 +278,6 @@ ObCreateObject(PHANDLE Handle,
if ((Header->ObjectType != NULL) && if ((Header->ObjectType != NULL) &&
(Header->ObjectType->Create != NULL)) (Header->ObjectType->Create != NULL))
{ {
DPRINT("Calling %x\n", Header->ObjectType);
DPRINT("Calling %x\n", Header->ObjectType->Create); DPRINT("Calling %x\n", Header->ObjectType->Create);
Status = Header->ObjectType->Create(HEADER_TO_BODY(Header), Status = Header->ObjectType->Create(HEADER_TO_BODY(Header),
Parent, Parent,
@ -281,7 +285,10 @@ ObCreateObject(PHANDLE Handle,
ObjectAttributes); ObjectAttributes);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ObDereferenceObject( Parent ); if (Parent)
{
ObDereferenceObject( Parent );
}
RtlFreeUnicodeString( &Header->Name ); RtlFreeUnicodeString( &Header->Name );
RtlFreeUnicodeString( &RemainingPath ); RtlFreeUnicodeString( &RemainingPath );
ExFreePool( Header ); ExFreePool( Header );
@ -431,57 +438,58 @@ ULONG ObGetHandleCount(PVOID ObjectBody)
/********************************************************************** /**********************************************************************
* NAME EXPORTED * NAME EXPORTED
* @ObfReferenceObject@0 * ObfReferenceObject@4
* *
* DESCRIPTION * DESCRIPTION
* Increments a given object's reference count and performs * Increments a given object's reference count and performs
* retention checks. * retention checks.
* *
* ARGUMENTS * ARGUMENTS
* ObjectBody * ObjectBody = Body of the object.
* Body of the object.
* *
* RETURN VALUE * RETURN VALUE
* The current value of the reference counter. * None.
*/ */
ULONG FASTCALL ObfReferenceObject(PVOID ObjectBody) VOID FASTCALL ObfReferenceObject(PVOID Object)
{ {
POBJECT_HEADER Header = BODY_TO_HEADER(ObjectBody); POBJECT_HEADER Header;
ULONG ReferenceCount;
assert (Object);
ReferenceCount = Header->RefCount++;
Header = BODY_TO_HEADER(Object);
Header->RefCount++;
ObPerformRetentionChecks (Header); ObPerformRetentionChecks (Header);
return(ReferenceCount);
} }
VOID FASTCALL ObfDereferenceObject (PVOID ObjectBody) VOID FASTCALL ObfDereferenceObject (PVOID Object)
/* /*
* FUNCTION: Decrements a given object's reference count and performs * FUNCTION: Decrements a given object's reference count and performs
* retention checks * retention checks
* ARGUMENTS: * ARGUMENTS:
* ObjectBody = Body of the object * Object = Body of the object
*/ */
{ {
POBJECT_HEADER Header = BODY_TO_HEADER(ObjectBody); POBJECT_HEADER Header;
extern POBJECT_TYPE PsProcessType; extern POBJECT_TYPE PsProcessType;
// DPRINT("ObDeferenceObject(ObjectBody %x) RefCount %d\n",ObjectBody, assert (Object);
// Header->RefCount);
Header = BODY_TO_HEADER(Object);
if (Header->ObjectType == PsProcessType) if (Header->ObjectType == PsProcessType)
{ {
DPRINT("Deref p 0x%x with refcount %d type %x ", DPRINT("Deref p 0x%x with refcount %d type %x ",
ObjectBody, Header->RefCount, PsProcessType); Object, Header->RefCount, PsProcessType);
DPRINT("eip %x\n", ((PULONG)&ObjectBody)[-1]); DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
} }
if (Header->ObjectType == PsThreadType) if (Header->ObjectType == PsThreadType)
{ {
DPRINT("Deref t 0x%x with refcount %d type %x ", DPRINT("Deref t 0x%x with refcount %d type %x ",
ObjectBody, Header->RefCount, PsThreadType); Object, Header->RefCount, PsThreadType);
DPRINT("eip %x\n", ((PULONG)&ObjectBody)[-1]); DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
} }
Header->RefCount--; Header->RefCount--;
@ -489,21 +497,4 @@ VOID FASTCALL ObfDereferenceObject (PVOID ObjectBody)
ObPerformRetentionChecks(Header); ObPerformRetentionChecks(Header);
} }
VOID STDCALL ObDereferenceObject (PVOID ObjectBody)
{
POBJECT_HEADER Header = BODY_TO_HEADER(ObjectBody);
extern POBJECT_TYPE PsProcessType;
if (Header->ObjectType == PsProcessType)
{
DPRINT("Deref p 0x%x with refcount %d type %x ",
ObjectBody, Header->RefCount, PsProcessType);
DPRINT("eip %x\n", ((PULONG)&ObjectBody)[-1]);
}
ObfDereferenceObject (ObjectBody);
}
/* EOF */ /* EOF */

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: power.c,v 1.2 2001/04/16 00:48:04 chorns Exp $ /* $Id: power.c,v 1.3 2001/05/01 23:08:20 chorns Exp $
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/po/power.c * FILE: ntoskrnl/po/power.c
* PURPOSE: Power Manager * PURPOSE: Power Manager
@ -26,6 +26,16 @@
* 16/04/2001 CSH Stubs added * 16/04/2001 CSH Stubs added
*/ */
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/config.h>
#include <internal/io.h>
#include <internal/po.h>
#define NDEBUG
#include <internal/debug.h>
PDEVICE_NODE PopSystemPowerDeviceNode = NULL;
NTSTATUS NTSTATUS
STDCALL STDCALL
@ -33,7 +43,11 @@ PoCallDriver(
IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp) IN OUT PIRP Irp)
{ {
return STATUS_NOT_IMPLEMENTED; NTSTATUS Status;
Status = IoCallDriver(DeviceObject, Irp);
return Status;
} }
PULONG PULONG
@ -112,4 +126,75 @@ PoUnregisterSystemState(
{ {
} }
NTSTATUS
PopSetSystemPowerState(
SYSTEM_POWER_STATE PowerState)
{
#ifdef ACPI
IO_STATUS_BLOCK IoStatusBlock;
PDEVICE_OBJECT DeviceObject;
PIO_STACK_LOCATION IrpSp;
PDEVICE_OBJECT Fdo;
NTSTATUS Status;
KEVENT Event;
PIRP Irp;
Status = IopGetSystemPowerDeviceObject(&DeviceObject);
if (!NT_SUCCESS(Status)) {
CPRINT("No system power driver available\n");
return STATUS_UNSUCCESSFUL;
}
Fdo = IoGetAttachedDeviceReference(DeviceObject);
if (Fdo == DeviceObject)
{
DPRINT("An FDO was not attached\n");
return STATUS_UNSUCCESSFUL;
}
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_POWER,
Fdo,
NULL,
0,
NULL,
&Event,
&IoStatusBlock);
IrpSp = IoGetNextIrpStackLocation(Irp);
IrpSp->MinorFunction = IRP_MN_SET_POWER;
IrpSp->Parameters.Power.Type = SystemPowerState;
IrpSp->Parameters.Power.State.SystemState = PowerState;
Status = PoCallDriver(Fdo, Irp);
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
NULL);
Status = IoStatusBlock.Status;
}
ObDereferenceObject(Fdo);
return Status;
#endif /* ACPI */
return STATUS_NOT_IMPLEMENTED;
}
VOID
PoInit(VOID)
{
}
/* EOF */ /* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: psmgr.c,v 1.9 2001/04/16 02:02:07 dwelch Exp $ /* $Id: psmgr.c,v 1.10 2001/05/01 23:08:20 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -14,6 +14,7 @@
#include <internal/ps.h> #include <internal/ps.h>
#include <reactos/version.h> #include <reactos/version.h>
#define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/

View file

@ -43,7 +43,7 @@ EXE_POSTFIX := .exe
#CP = copy /B #CP = copy /B
CP = $(PATH_TO_TOP)/rcopy CP = $(PATH_TO_TOP)/rcopy
DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as DLLTOOL = $(PREFIX)dlltool --as=$(PREFIX)as
NASM_CMD = nasm NASM_CMD = nasmw
RM = del RM = del
RMDIR = rmdir RMDIR = rmdir
#KM_SPECS = specs #KM_SPECS = specs
@ -115,6 +115,7 @@ OBJCOPY = $(PREFIX)objcopy
-o $@.unstripped \ -o $@.unstripped \
$^ $^
- $(RM) temp.exp - $(RM) temp.exp
- $(NM) --numeric-sort $@.unstripped > $@.sym
$(STRIP) --strip-debug $< $(STRIP) --strip-debug $<
$(CC) \ $(CC) \
-nostartfiles -nostdlib -e _DriverEntry@8 \ -nostartfiles -nostdlib -e _DriverEntry@8 \
@ -144,11 +145,3 @@ OBJCOPY = $(PREFIX)objcopy
- $(RM) temp.exp - $(RM) temp.exp
RULES_MAK_INCLUDED = 1 RULES_MAK_INCLUDED = 1

View file

@ -1,4 +1,4 @@
/* $Id: shell.c,v 1.4 2001/02/28 23:51:58 phreak Exp $ /* $Id: shell.c,v 1.5 2001/05/01 23:08:17 chorns Exp $
* *
* PROJECT : ReactOS Operating System * PROJECT : ReactOS Operating System
* DESCRIPTION: ReactOS' Native Shell * DESCRIPTION: ReactOS' Native Shell
@ -99,6 +99,12 @@ void ExecuteReboot(char* cmdline)
} }
void ExecuteShutdown(char* cmdline)
{
NtShutdownSystem (ShutdownNoReboot);
}
void ExecuteType(char* cmdline) void ExecuteType(char* cmdline)
{ {
HANDLE FileHandle; HANDLE FileHandle;
@ -358,6 +364,11 @@ void ExecuteCommand(char* line)
ExecuteReboot(tail); ExecuteReboot(tail);
return; return;
} }
if (strcmp(cmd,"shutdown")==0)
{
ExecuteShutdown(tail);
return;
}
if (strcmp(cmd,"type")==0) if (strcmp(cmd,"type")==0)
{ {
ExecuteType(tail); ExecuteType(tail);