- Fix bootlog/debug to file problem -- Steven. 3GB now works (Thanks to Filip) but a bug remains in ntoskrnl. - Basic beginning of Vector Exception Handling implementation -- Thomas - Merge with 13793:13838 Modified: branches/alex_devel_branch/reactos/bootdata/packages/reactos.dff Modified: branches/alex_devel_branch/reactos/drivers/fs/np/create.c Modified: branches/alex_devel_branch/reactos/drivers/fs/np/fsctrl.c Modified: branches/alex_devel_branch/reactos/drivers/fs/np/npfs.h Modified: branches/alex_devel_branch/reactos/drivers/fs/np/rw.c Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/select.h Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/socketvar.h Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/systm.h Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/in_pcb. c Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/interfa ce.c Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/route.c Modified: branches/alex_devel_branch/reactos/drivers/storage/atapi/atapi.c Modified: branches/alex_devel_branch/reactos/drivers/storage/atapi/atapi.h Modified: branches/alex_devel_branch/reactos/include/ntdll/rtl.h Modified: branches/alex_devel_branch/reactos/lib/adns/Makefile Modified: branches/alex_devel_branch/reactos/lib/adns/src/event.c Modified: branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def Modified: branches/alex_devel_branch/reactos/lib/ntdll/ldr/startup.c Modified: branches/alex_devel_branch/reactos/lib/ntdll/rtl/exception.c Modified: branches/alex_devel_branch/reactos/lib/rpcrt4/rpc_message.c Modified: branches/alex_devel_branch/reactos/lib/user32/resources/oic_reactos.ico Modified: branches/alex_devel_branch/reactos/ntoskrnl/Makefile Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/io.h Modified: branches/alex_devel_branch/reactos/ntoskrnl/include/internal/kd.h Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/cancel.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/iomgr.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/io/irp.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/kd/dlog.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/kd/kdebug.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ob/handle.c Modified: branches/alex_devel_branch/reactos/ntoskrnl/ps/kill.c Modified: branches/alex_devel_branch/reactos/subsys/system/explorer/res/logov.bmp Modified: branches/alex_devel_branch/reactos/subsys/system/explorer/res/reactos.ic o Modified: branches/alex_devel_branch/reactos/subsys/system/explorer/res/ros-big.ic o Modified: branches/alex_devel_branch/reactos/subsys/system/explorer/res/startmenu. ico Modified: branches/alex_devel_branch/reactos/subsys/system/explorer/taskbar/startm enu.cpp Modified: branches/alex_devel_branch/reactos/subsys/system/explorer/utility/xmlsto rage.cpp Modified: branches/alex_devel_branch/reactos/subsys/system/explorer/utility/xmlsto rage.h Modified: branches/alex_devel_branch/reactos/subsys/system/ibrowser/Makefile _____
Modified: branches/alex_devel_branch/reactos/bootdata/packages/reactos.dff --- branches/alex_devel_branch/reactos/bootdata/packages/reactos.dff 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/bootdata/packages/reactos.dff 2005-03-05 23:19:42 UTC (rev 13839) @@ -146,6 +146,7 @@
subsys\system\explorer\explorer.exe 4 subsys\system\explorer\explorer-cfg-template.xml 4 subsys\system\explorer\notifyhook\notifyhook.dll 1 +subsys\system\ibrowser\ibrowser.exe 1 subsys\system\format\format.exe 1 subsys\system\notepad\notepad.exe 1 subsys\system\regedit\regedit.exe 4 _____
Modified: branches/alex_devel_branch/reactos/drivers/fs/np/create.c --- branches/alex_devel_branch/reactos/drivers/fs/np/create.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/fs/np/create.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -48,17 +48,18 @@
NpfsFindListeningServerInstance(PNPFS_PIPE Pipe) { PLIST_ENTRY CurrentEntry; - PNPFS_FCB ServerFcb; + PNPFS_WAITER_ENTRY Waiter;
- CurrentEntry = Pipe->ServerFcbListHead.Flink; - while (CurrentEntry != &Pipe->ServerFcbListHead) + CurrentEntry = Pipe->WaiterListHead.Flink; + while (CurrentEntry != &Pipe->WaiterListHead) { - ServerFcb = CONTAINING_RECORD(CurrentEntry, NPFS_FCB, FcbListEntry); - if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE) + Waiter = CONTAINING_RECORD(CurrentEntry, NPFS_WAITER_ENTRY, Entry); + if (Waiter->Fcb->PipeState == FILE_PIPE_LISTENING_STATE) { - DPRINT("Server found! Fcb %p\n", ServerFcb); - return ServerFcb; + DPRINT("Server found! Fcb %p\n", Waiter->Fcb); + return Waiter->Fcb; } + CurrentEntry = CurrentEntry->Flink; }
@@ -66,6 +67,35 @@ }
+static VOID +NpfsSignalAndRemoveListeningServerInstance(PNPFS_PIPE Pipe, + PNPFS_FCB Fcb) +{ + PLIST_ENTRY CurrentEntry; + PNPFS_WAITER_ENTRY Waiter; + + CurrentEntry = Pipe->WaiterListHead.Flink; + while (CurrentEntry != &Pipe->WaiterListHead) + { + Waiter = CONTAINING_RECORD(CurrentEntry, NPFS_WAITER_ENTRY, Entry); + if (Waiter->Fcb == Fcb) + { + DPRINT("Server found! Fcb %p\n", Waiter->Fcb); + + KeSetEvent(Waiter->Irp->UserEvent, 0, FALSE); + Waiter->Irp->UserIosb->Status = FILE_PIPE_CONNECTED_STATE; + Waiter->Irp->UserIosb->Information = 0; + IoCompleteRequest(Waiter->Irp, IO_NO_INCREMENT); + + RemoveEntryList(&Waiter->Entry); + ExFreePool(Waiter); + return; + } + CurrentEntry = CurrentEntry->Flink; + } +} + + NTSTATUS STDCALL NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -206,9 +236,8 @@ ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE; ServerFcb->PipeState = FILE_PIPE_CONNECTED_STATE;
- /* Wake server thread */ - DPRINT("Setting the ConnectEvent for %x\n", ServerFcb); - KeSetEvent(&ServerFcb->ConnectEvent, 0, FALSE); + /* Signal the server thread and remove it from the waiter list */ + NpfsSignalAndRemoveListeningServerInstance(Pipe, ServerFcb); }
KeUnlockMutex(&Pipe->FcbListLock); @@ -318,6 +347,7 @@
InitializeListHead(&Pipe->ServerFcbListHead); InitializeListHead(&Pipe->ClientFcbListHead); + InitializeListHead(&Pipe->WaiterListHead); KeInitializeMutex(&Pipe->FcbListLock, 0);
Pipe->PipeType = Buffer->NamedPipeType; _____
Modified: branches/alex_devel_branch/reactos/drivers/fs/np/fsctrl.c --- branches/alex_devel_branch/reactos/drivers/fs/np/fsctrl.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/fs/np/fsctrl.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -18,9 +18,67 @@
/* FUNCTIONS *****************************************************************/
+static VOID +NpfsListeningCancelRoutine(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PNPFS_WAITER_ENTRY Waiter; + + DPRINT1("NpfsListeningCancelRoutine() called\n"); + /* FIXME: Not tested. */ + + Waiter = Irp->Tail.Overlay.DriverContext[0]; + + RemoveEntryList(&Waiter->Entry); + ExFreePool(Waiter); + + IoReleaseCancelSpinLock(Irp->CancelIrql); + + Irp->IoStatus.Status = STATUS_CANCELLED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); +} + + static NTSTATUS -NpfsConnectPipe(PNPFS_FCB Fcb) +NpfsAddListeningServerInstance(PIRP Irp, + PNPFS_FCB Fcb) { + PNPFS_WAITER_ENTRY Entry; + KIRQL OldIrql; + + Entry = ExAllocatePool(NonPagedPool, sizeof(NPFS_WAITER_ENTRY)); + if (Entry == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + Entry->Irp = Irp; + Entry->Fcb = Fcb; + InsertTailList(&Fcb->Pipe->WaiterListHead, &Entry->Entry); + + IoAcquireCancelSpinLock(&OldIrql); + if (!Irp->Cancel) + { + Irp->Tail.Overlay.DriverContext[0] = Entry; + IoMarkIrpPending(Irp); + IoSetCancelRoutine(Irp, NpfsListeningCancelRoutine); + IoReleaseCancelSpinLock(OldIrql); + return STATUS_PENDING; + } + /* IRP has already been cancelled */ + IoReleaseCancelSpinLock(OldIrql); + + DPRINT1("FIXME: Remove waiter entry!\n"); + RemoveEntryList(&Entry->Entry); + ExFreePool(Entry); + + return STATUS_CANCELLED; +} + + +static NTSTATUS +NpfsConnectPipe(PIRP Irp, + PNPFS_FCB Fcb) +{ PNPFS_PIPE Pipe; PLIST_ENTRY current_entry; PNPFS_FCB ClientFcb; @@ -88,29 +146,18 @@ current_entry = current_entry->Flink; }
- KeUnlockMutex(&Pipe->FcbListLock); - /* no listening client fcb found */ DPRINT("No listening client fcb found -- waiting for client\n");
Fcb->PipeState = FILE_PIPE_LISTENING_STATE;
- Status = KeWaitForSingleObject(&Fcb->ConnectEvent, - UserRequest, - KernelMode, - FALSE, - NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT("KeWaitForSingleObject() failed (Status %lx)\n", Status); - return Status; - } + Status = NpfsAddListeningServerInstance(Irp, Fcb);
- Fcb->PipeState = FILE_PIPE_CONNECTED_STATE; + KeUnlockMutex(&Pipe->FcbListLock);
- DPRINT("Client Fcb: %p\n", Fcb->OtherSide); + DPRINT("NpfsConnectPipe() done (Status %lx)\n", Status);
- return STATUS_PIPE_CONNECTED; + return Status; }
@@ -327,7 +374,6 @@ }
- NTSTATUS STDCALL NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -366,7 +412,7 @@
case FSCTL_PIPE_LISTEN: DPRINT("Connecting pipe %wZ\n", &Pipe->PipeName); - Status = NpfsConnectPipe(Fcb); + Status = NpfsConnectPipe(Irp, Fcb); break;
case FSCTL_PIPE_PEEK: @@ -439,12 +485,15 @@ Status = STATUS_UNSUCCESSFUL; }
- Irp->IoStatus.Status = Status; - Irp->IoStatus.Information = 0; + if (Status != STATUS_PENDING) + { + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + }
- IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(Status); + return Status; }
_____
Modified: branches/alex_devel_branch/reactos/drivers/fs/np/npfs.h --- branches/alex_devel_branch/reactos/drivers/fs/np/npfs.h 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/fs/np/npfs.h 2005-03-05 23:19:42 UTC (rev 13839) @@ -19,6 +19,7 @@
KMUTEX FcbListLock; LIST_ENTRY ServerFcbListHead; LIST_ENTRY ClientFcbListHead; + LIST_ENTRY WaiterListHead; ULONG PipeType; ULONG ReadMode; ULONG WriteMode; @@ -52,7 +53,15 @@ KSPIN_LOCK DataListLock; /* Data queue lock */ } NPFS_FCB, *PNPFS_FCB;
+typedef struct _NPFS_WAITER_ENTRY +{ + LIST_ENTRY Entry; + PIRP Irp; + PNPFS_PIPE Pipe; + PNPFS_FCB Fcb; +} NPFS_WAITER_ENTRY, *PNPFS_WAITER_ENTRY;
+ extern NPAGED_LOOKASIDE_LIST NpfsPipeDataLookasideList;
_____
Modified: branches/alex_devel_branch/reactos/drivers/fs/np/rw.c --- branches/alex_devel_branch/reactos/drivers/fs/np/rw.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/fs/np/rw.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -101,7 +101,6 @@
/* FIXME: check if in blocking mode */ if (Fcb->ReadDataAvailable == 0) { - KeResetEvent(&Fcb->Event); if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE) { KeSetEvent(&WriterFcb->Event, IO_NO_INCREMENT, FALSE); @@ -167,6 +166,7 @@ if (Length == 0) { KeSetEvent(&WriterFcb->Event, IO_NO_INCREMENT, FALSE); + KeResetEvent(&Fcb->Event); break; } } @@ -187,8 +187,19 @@ #endif
Information = CopyLength; - Fcb->ReadDataAvailable = 0; - Fcb->WriteQuotaAvailable = Fcb->MaxDataLength; + + if (Fcb->ReadDataAvailable > Length) + { + memmove(Fcb->Data, Fcb->Data + Length, + Fcb->ReadDataAvailable - Length); + Fcb->ReadDataAvailable -= Length; + Status = STATUS_MORE_ENTRIES; + } + else + { + Fcb->ReadDataAvailable = 0; + Fcb->WriteQuotaAvailable = Fcb->MaxDataLength; + } }
if (Information > 0) @@ -197,6 +208,7 @@ { KeSetEvent(&WriterFcb->Event, IO_NO_INCREMENT, FALSE); } + KeResetEvent(&Fcb->Event); break; } } @@ -291,7 +303,6 @@ { if (ReaderFcb->WriteQuotaAvailable == 0) { - KeResetEvent(&Fcb->Event); KeSetEvent(&ReaderFcb->Event, IO_NO_INCREMENT, FALSE); KeReleaseSpinLock(&ReaderFcb->DataListLock, OldIrql); if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE) @@ -355,6 +366,7 @@ if (Length == 0) { KeSetEvent(&ReaderFcb->Event, IO_NO_INCREMENT, FALSE); + KeResetEvent(&Fcb->Event); break; } } @@ -374,6 +386,7 @@ if (Information > 0) { KeSetEvent(&ReaderFcb->Event, IO_NO_INCREMENT, FALSE); + KeResetEvent(&Fcb->Event); break; } } _____
Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/select.h --- branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/select.h 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/select.h 2005-03-05 23:19:42 UTC (rev 13839) @@ -40,19 +40,14 @@
struct listener_mgr; #endif
-/* - * Used to maintain information about processes that wish to be - * notified when I/O becomes possible. - */ -struct selinfo { -#if defined(OSKIT) - struct listener_mgr *si_sel; -#endif /* OSKIT */ - pid_t si_pid; /* process to be notified */ - short si_flags; /* see below */ -}; -#define SI_COLL 0x0001 /* collision occurred */ +/* Included to suppress warnings about struct socket being declared in the + * parameter list. Selinfo reoredered with struct socket. */
+struct selinfo; +struct socket; + +#include <sys/socketvar.h> + #ifdef KERNEL struct proc;
_____
Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/socketvar.h --- branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/socketvar.h 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/socketvar.h 2005-03-05 23:19:42 UTC (rev 13839) @@ -40,7 +40,26 @@
#include <sys/filedesc.h> /* for struct filedesc */ #include <sys/select.h> /* for struct selinfo */
+/* Warning suppression */ +struct sockaddr; + /* + * Used to maintain information about processes that wish to be + * notified when I/O becomes possible. + * + * Moved from sys/select.h and replaced with an #include. + */ +struct selinfo { +#if defined(OSKIT) + struct listener_mgr *si_sel; +#endif /* OSKIT */ + pid_t si_pid; /* process to be notified */ + short si_flags; /* see below */ +}; +#define SI_COLL 0x0001 /* collision occurred */ + + +/* * Kernel structure per socket. * Contains send and receive buffer queues, * handle on protocol and pointer to protocol _____
Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/systm.h --- branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/systm.h 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/lib/oskittcp/include/freebsd/ src/sys/sys/systm.h 2005-03-05 23:19:42 UTC (rev 13839) @@ -125,9 +125,11 @@
#include <oskitfreebsd.h> #include <oskitdebug.h>
+ int __cdecl vprintf(const char *, va_list);
-static inline int log ( int blah, const char* fmt, ... ) +#define log bsd_log +static inline int bsd_log ( int blah, const char* fmt, ... ) { va_list arg; int i; _____
Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/in_pcb. c --- branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/in_pcb. c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/in_pcb. c 2005-03-05 23:19:42 UTC (rev 13839) @@ -312,7 +312,7 @@
* Don't do pcblookup call here; return interface in plocal_sin * and exit to caller, that will do the lookup. */ - *plocal_sin = ia->ia_ifa.ifa_addr; + *plocal_sin = (struct sockaddr_in *)ia->ia_ifa.ifa_addr; OS_DbgPrint(OSK_MID_TRACE,("plocal sin %x\n",
(*plocal_sin)->sin_addr.s_addr));
_____
Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/interfa ce.c --- branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/interfa ce.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/interfa ce.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -365,7 +365,7 @@
*/ so = head->so_q;
- inp = so ? so->so_pcb : 0; + inp = so ? (struct inpcb *)so->so_pcb : NULL; if( inp ) { ((struct sockaddr_in *)AddrOut)->sin_addr.s_addr = inp->inp_faddr.s_addr; @@ -381,7 +381,7 @@ /*so->so_state &= ~SS_COMP;*/
- mnam.m_data = &sa; + mnam.m_data = (char *)&sa; mnam.m_len = sizeof(sa); (void) soaccept(so, &mnam); @@ -452,7 +452,7 @@ OSK_UINT RemoteAddress, OSK_UI16 RemotePort ) { struct socket *so = socket; - struct inpcb *inp = so->so_pcb; + struct inpcb *inp = (struct inpcb *)so->so_pcb; inp->inp_laddr.s_addr = LocalAddress; inp->inp_lport = LocalPort; inp->inp_faddr.s_addr = RemoteAddress; @@ -465,7 +465,7 @@ OSK_UINT *RemoteAddress, OSK_UI16 *RemotePort ) { struct socket *so = socket; - struct inpcb *inp = so ? so->so_pcb : 0; + struct inpcb *inp = so ? (struct inpcb *)so->so_pcb : NULL; if( inp ) { *LocalAddress = inp->inp_laddr.s_addr; *LocalPort = inp->inp_lport; @@ -589,7 +589,7 @@
if( ifaddr ) { - sin = (struct sockaddr *)&ifaddr->ifa_addr; + sin = (struct sockaddr_in *)&ifaddr->ifa_addr;
OS_DbgPrint(OSK_MID_TRACE,("ifaddr->addr = %x\n", sin->sin_addr.s_addr)); _____
Modified: branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/route.c --- branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/route.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/lib/oskittcp/oskittcp/route.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -314,8 +314,8 @@
register struct ifaddr *ifa;
OS_DbgPrint(OSK_MID_TRACE,("Called: flags %\n", flags)); - OskitDumpBuffer( dst, sizeof(*dst) ); - OskitDumpBuffer( gateway, sizeof(*gateway) ); + OskitDumpBuffer( (void *)dst, sizeof(*dst) ); + OskitDumpBuffer( (void *)gateway, sizeof(*gateway) );
if ((flags & RTF_GATEWAY) == 0) { /* _____
Modified: branches/alex_devel_branch/reactos/drivers/storage/atapi/atapi.c --- branches/alex_devel_branch/reactos/drivers/storage/atapi/atapi.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/storage/atapi/atapi.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -1327,6 +1327,8 @@
DrvParms->TMSectorCountHi, DrvParms->TMSectorCountLo, (ULONG)((DrvParms->TMSectorCountHi << 16) + DrvParms->TMSectorCountLo)); + DPRINT("SupportedFeatures83: %x, EnabledFeatures86 %x\n", DrvParms->SupportedFeatures83, DrvParms->EnabledFeatures86); + DPRINT("Max48BitAddress: %I64d\n", *(PULONGLONG)DrvParms->Max48BitAddress); if (DrvParms->TMFieldsValid & 0x0004) { if ((DrvParms->UltraDmaModes >> 8) && (DrvParms->UltraDmaModes & 0xff)) @@ -1952,7 +1954,7 @@ { PREAD_CAPACITY_DATA CapacityData; PIDE_DRIVE_IDENTIFY DeviceParams; - ULONG LastSector; + LARGE_INTEGER LastSector;
DPRINT("SCSIOP_READ_CAPACITY: TargetId: %lu\n", Srb->TargetId); CapacityData = (PREAD_CAPACITY_DATA)Srb->DataBuffer; @@ -1964,15 +1966,34 @@ /* Calculate last sector (big-endian). */ if (DeviceParams->Capabilities & IDE_DRID_LBA_SUPPORTED) { - LastSector = (ULONG)((DeviceParams->TMSectorCountHi << 16) + - DeviceParams->TMSectorCountLo) - 1; + if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_48BIT_ADDRESS) + { + ((PUSHORT)&LastSector)[0] = DeviceParams->Max48BitAddress[0]; + ((PUSHORT)&LastSector)[1] = DeviceParams->Max48BitAddress[1]; + ((PUSHORT)&LastSector)[2] = DeviceParams->Max48BitAddress[2]; + ((PUSHORT)&LastSector)[3] = DeviceParams->Max48BitAddress[3]; + LastSector.QuadPart -= 1; + + } + else + { + LastSector.u.HighPart = 0; + LastSector.u.LowPart = (ULONG)((DeviceParams->TMSectorCountHi << 16) + + DeviceParams->TMSectorCountLo)-1; + } } else { - LastSector = (ULONG)(DeviceParams->LogicalCyls * - DeviceParams->LogicalHeads * - DeviceParams->SectorsPerTrack)-1; + LastSector.u.HighPart = 0; + LastSector.u.LowPart = (ULONG)(DeviceParams->LogicalCyls * + DeviceParams->LogicalHeads * + DeviceParams->SectorsPerTrack)-1; } + if (LastSector.u.HighPart) + { + DPRINT1("Disk is too large for our implementation (%I64d sectors\n", LastSector.QuadPart); + KEBUGCHECK(0); + }
CapacityData->LogicalBlockAddress = (((PUCHAR)&LastSector)[0] << 24) | (((PUCHAR)&LastSector)[1] << 16) | @@ -1996,10 +2017,10 @@ PIDE_DRIVE_IDENTIFY DeviceParams; ULONG StartingSector; ULONG SectorCount; - UCHAR CylinderHigh; - UCHAR CylinderLow; + UCHAR CylinderHigh[2]; + UCHAR CylinderLow[2]; UCHAR DrvHead; - UCHAR SectorNumber; + UCHAR SectorNumber[2]; UCHAR Command; ULONG Retries; UCHAR Status; @@ -2025,47 +2046,61 @@ Srb->DataTransferLength, SectorCount);
- if (DeviceParams->Capabilities & IDE_DRID_LBA_SUPPORTED) + if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_48BIT_ADDRESS) { - SectorNumber = StartingSector & 0xff; - CylinderLow = (StartingSector >> 8) & 0xff; - CylinderHigh = (StartingSector >> 16) & 0xff; - DrvHead = ((StartingSector >> 24) & 0x0f) | - (Srb->TargetId ? IDE_DH_DRV1 : 0) | - IDE_DH_LBA; + SectorNumber[0] = StartingSector & 0xff; + CylinderLow[0] = (StartingSector >> 8) & 0xff; + CylinderHigh[0] = (StartingSector >> 16) & 0xff; + SectorNumber[1] = (StartingSector >> 24) & 0xff; + CylinderLow[1] = 0; + CylinderHigh[1] = 0; + DrvHead = (Srb->TargetId ? IDE_DH_DRV1 : 0) | IDE_DH_LBA; + + DPRINT("%s:BUS=%04x:DRV=%d:LBA48=1:BLK=%08d:SC=%02x:CM=%02x\n", + (Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? "READ" : "WRITE", + DeviceExtension->CommandPortBase, + DrvHead & IDE_DH_DRV1 ? 1 : 0, + (SectorNumber[1] << 24) + + (CylinderHigh[0] << 16) + (CylinderLow[0] << 8) + DectorNumberLow[0], + SectorCount, + Command); } - else + else if (DeviceParams->Capabilities & IDE_DRID_LBA_SUPPORTED) { - SectorNumber = (StartingSector % DeviceParams->SectorsPerTrack) + 1; - StartingSector /= DeviceParams->SectorsPerTrack; - DrvHead = (StartingSector % DeviceParams->LogicalHeads) | - (Srb->TargetId ? IDE_DH_DRV1 : 0); - StartingSector /= DeviceParams->LogicalHeads; - CylinderLow = StartingSector & 0xff; - CylinderHigh = StartingSector >> 8; - } + SectorNumber[0] = StartingSector & 0xff; + CylinderLow[0] = (StartingSector >> 8) & 0xff; + CylinderHigh[0] = (StartingSector >> 16) & 0xff; + DrvHead = ((StartingSector >> 24) & 0x0f) | + (Srb->TargetId ? IDE_DH_DRV1 : 0) | + IDE_DH_LBA;
- if (DrvHead & IDE_DH_LBA) - { DPRINT("%s:BUS=%04x:DRV=%d:LBA=1:BLK=%08d:SC=%02x:CM=%02x\n", (Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? "READ" : "WRITE", DeviceExtension->CommandPortBase, DrvHead & IDE_DH_DRV1 ? 1 : 0, ((DrvHead & 0x0f) << 24) + - (CylinderHigh << 16) + (CylinderLow << 8) + SectorNumber, + (CylinderHigh[0] << 16) + (CylinderLow[0] << 8) + SectorNumber[0], SectorCount, Command); } else { + SectorNumber[0] = (StartingSector % DeviceParams->SectorsPerTrack) + 1; + StartingSector /= DeviceParams->SectorsPerTrack; + DrvHead = (StartingSector % DeviceParams->LogicalHeads) | + (Srb->TargetId ? IDE_DH_DRV1 : 0); + StartingSector /= DeviceParams->LogicalHeads; + CylinderLow[0] = StartingSector & 0xff; + CylinderHigh[0] = StartingSector >> 8; +
DPRINT("%s:BUS=%04x:DRV=%d:LBA=0:CH=%02x:CL=%02x:HD=%01x:SN=%02x:SC=%02x :CM=%02x\n", (Srb->SrbFlags & SRB_FLAGS_DATA_IN) ? "READ" : "WRITE", DeviceExtension->CommandPortBase, DrvHead & IDE_DH_DRV1 ? 1 : 0, - CylinderHigh, - CylinderLow, + CylinderHigh[0], + CylinderLow[0], DrvHead & 0x0f, - SectorNumber, + SectorNumber[0], SectorCount, Command); } @@ -2119,11 +2154,21 @@ #endif
/* Setup command parameters */ + if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_48BIT_ADDRESS) + { + IDEWritePrecomp(DeviceExtension->CommandPortBase, 0); + IDEWriteSectorCount(DeviceExtension->CommandPortBase, SectorCount
8);
+ IDEWriteSectorNum(DeviceExtension->CommandPortBase, SectorNumber[1]); + IDEWriteCylinderLow(DeviceExtension->CommandPortBase, CylinderLow[1]); + IDEWriteCylinderHigh(DeviceExtension->CommandPortBase, CylinderHigh[1]); + } + IDEWritePrecomp(DeviceExtension->CommandPortBase, 0); - IDEWriteSectorCount(DeviceExtension->CommandPortBase, SectorCount); - IDEWriteSectorNum(DeviceExtension->CommandPortBase, SectorNumber); - IDEWriteCylinderHigh(DeviceExtension->CommandPortBase, CylinderHigh); - IDEWriteCylinderLow(DeviceExtension->CommandPortBase, CylinderLow); + IDEWriteSectorCount(DeviceExtension->CommandPortBase, SectorCount & 0xff); + IDEWriteSectorNum(DeviceExtension->CommandPortBase, SectorNumber[0]); + IDEWriteCylinderLow(DeviceExtension->CommandPortBase, CylinderLow[0]); + IDEWriteCylinderHigh(DeviceExtension->CommandPortBase, CylinderHigh[0]); + IDEWriteDriveHead(DeviceExtension->CommandPortBase, IDE_DH_FIXED | DrvHead);
#ifdef ENABLE_DMA @@ -2135,7 +2180,14 @@ if (DeviceExtension->UseDma) { Handler = AtapiDmaInterrupt; - Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_DMA : IDE_CMD_WRITE_DMA; + if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_48BIT_ADDRESS) + { + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_DMA_EXT : IDE_CMD_WRITE_DMA_EXT; + } + else + { + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_DMA : IDE_CMD_WRITE_DMA; + } } else #endif @@ -2143,11 +2195,25 @@ Handler = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? AtapiReadInterrupt : AtapiWriteInterrupt; if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_MULTI_SECTOR_CMD) { - Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_MULTIPLE : IDE_CMD_WRITE_MULTIPLE; + if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_48BIT_ADDRESS) + { + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_MULTIPLE_EXT : IDE_CMD_WRITE_MULTIPLE_EXT; + } + else + { + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_MULTIPLE : IDE_CMD_WRITE_MULTIPLE; + } } else { - Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ : IDE_CMD_WRITE; + if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_48BIT_ADDRESS) + { + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_EXT : IDE_CMD_WRITE_EXT; + } + else + { + Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ : IDE_CMD_WRITE; + } } }
@@ -2274,7 +2340,9 @@ ScsiPortStallExecution(10);
/* Issue command to drive */ - AtapiExecuteCommand(DeviceExtension, IDE_CMD_FLUSH_CACHE, AtapiNoDataInterrupt); + AtapiExecuteCommand(DeviceExtension, + DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_48BIT_ADDRESS ? IDE_CMD_FLUSH_CACHE_EXT : IDE_CMD_FLUSH_CACHE, + AtapiNoDataInterrupt);
/* Wait for controller ready */ for (Retries = 0; Retries < IDE_MAX_WRITE_RETRIES; Retries++) _____
Modified: branches/alex_devel_branch/reactos/drivers/storage/atapi/atapi.h --- branches/alex_devel_branch/reactos/drivers/storage/atapi/atapi.h 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/drivers/storage/atapi/atapi.h 2005-03-05 23:19:42 UTC (rev 13839) @@ -64,21 +64,27 @@
#define IDE_REG_COMMAND 0x0007
/* IDE/ATA commands */ -#define IDE_CMD_RESET 0x08 -#define IDE_CMD_READ 0x20 -#define IDE_CMD_READ_RETRY 0x21 -#define IDE_CMD_WRITE 0x30 -#define IDE_CMD_WRITE_RETRY 0x31 -#define IDE_CMD_PACKET 0xA0 -#define IDE_CMD_READ_MULTIPLE 0xC4 -#define IDE_CMD_WRITE_MULTIPLE 0xC5 -#define IDE_CMD_READ_DMA 0xC8 -#define IDE_CMD_WRITE_DMA 0xCA -#define IDE_CMD_FLUSH_CACHE 0xE7 -#define IDE_CMD_FLUSH_CACHE_EXT 0xEA -#define IDE_CMD_IDENT_ATA_DRV 0xEC -#define IDE_CMD_IDENT_ATAPI_DRV 0xA1 -#define IDE_CMD_GET_MEDIA_STATUS 0xDA +#define IDE_CMD_RESET 0x08 +#define IDE_CMD_READ 0x20 +#define IDE_CMD_READ_ONCE 0x21 +#define IDE_CMD_READ_EXT 0x24 /* 48 bit */ +#define IDE_CMD_READ_DMA_EXT 0x25 /* 48 bit */ +#define IDE_CMD_READ_MULTIPLE_EXT 0x29 /* 48 bit */ +#define IDE_CMD_WRITE 0x30 +#define IDE_CMD_WRITE_ONCE 0x31 +#define IDE_CMD_WRITE_EXT 0x34 /* 48 bit */ +#define IDE_CMD_WRITE_DMA_EXT 0x35 /* 48 bit */ +#define IDE_CMD_WRITE_MULTIPLE_EXT 0x39 /* 48 bit */ +#define IDE_CMD_PACKET 0xA0 +#define IDE_CMD_READ_MULTIPLE 0xC4 +#define IDE_CMD_WRITE_MULTIPLE 0xC5 +#define IDE_CMD_READ_DMA 0xC8 +#define IDE_CMD_WRITE_DMA 0xCA +#define IDE_CMD_FLUSH_CACHE 0xE7 +#define IDE_CMD_FLUSH_CACHE_EXT 0xEA /* 48 bit */ +#define IDE_CMD_IDENT_ATA_DRV 0xEC +#define IDE_CMD_IDENT_ATAPI_DRV 0xA1 +#define IDE_CMD_GET_MEDIA_STATUS 0xDA
// // Access macros for command registers _____
Modified: branches/alex_devel_branch/reactos/include/ntdll/rtl.h --- branches/alex_devel_branch/reactos/include/ntdll/rtl.h 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/include/ntdll/rtl.h 2005-03-05 23:19:42 UTC (rev 13839) @@ -770,7 +770,14 @@
STDCALL RtlDeleteTimerQueue(HANDLE TimerQueue);
+PVOID +STDCALL +RtlEncodePointer(IN PVOID Pointer);
+PVOID +STDCALL +RtlDecodePointer(IN PVOID Pointer); + #ifndef __NTDRIVER__
#ifndef __INTERLOCKED_DECLARED _____
Modified: branches/alex_devel_branch/reactos/lib/adns/Makefile --- branches/alex_devel_branch/reactos/lib/adns/Makefile 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/lib/adns/Makefile 2005-03-05 23:19:42 UTC (rev 13839) @@ -7,8 +7,8 @@
TARGET_NAME = adns
TARGET_CFLAGS = \ - -O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ - -Wstrict-prototypes -Wmissing-prototypes -Wall -DADNS_JGAA_WIN32 + -O3 -Wall -Wwrite-strings -Wpointer-arith \ + -Wstrict-prototypes -Wmissing-prototypes -Wall -DADNS_JGAA_WIN32 -D__USE_W32API -D__REACTOS__
# require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -Isrc -Iadns_win32 _____
Modified: branches/alex_devel_branch/reactos/lib/adns/src/event.c --- branches/alex_devel_branch/reactos/lib/adns/src/event.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/lib/adns/src/event.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -52,7 +52,7 @@
serv= ads->tcpserver; adns_socket_close(ads->tcpsocket); - ads->tcpsocket= -1; + ads->tcpsocket= INVALID_SOCKET; ads->tcprecv.used= ads->tcprecv_skip= ads->tcpsend.used= 0; }
_____
Modified: branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def --- branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/lib/ntdll/def/ntdll.def 2005-03-05 23:19:42 UTC (rev 13839) @@ -296,6 +296,7 @@
RtlAddAuditAccessAceEx@28 ;RtlAddCompoundAce RtlAddRange@36 +RtlAddVectoredExceptionHandler@8 RtlAdjustPrivilege@16 RtlAllocateAndInitializeSid@44 RtlAllocateHandle@8 @@ -593,6 +594,7 @@ RtlReleasePebLock@0 RtlReleaseResource@4 ;RtlRemoteCall +RtlRemoveVectoredExceptionHandler@4 RtlResetRtlTranslations@4 RtlRestoreLastWin32Error@4=RtlSetLastWin32Error@4 RtlRunDecodeUnicodeString@8 _____
Modified: branches/alex_devel_branch/reactos/lib/ntdll/ldr/startup.c --- branches/alex_devel_branch/reactos/lib/ntdll/ldr/startup.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/lib/ntdll/ldr/startup.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -39,7 +39,9 @@
NTSTATUS LdrpAttachThread (VOID);
+VOID RtlpInitializeVectoredExceptionHandling(VOID);
+ #define VALUE_BUFFER_SIZE 256
BOOLEAN FASTCALL @@ -306,6 +308,9 @@ ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL); }
+ /* initialized vectored exception handling */ + RtlpInitializeVectoredExceptionHandling(); + /* initalize peb lock support */ RtlInitializeCriticalSection (&PebLock); Peb->FastPebLock = &PebLock; _____
Modified: branches/alex_devel_branch/reactos/lib/ntdll/rtl/exception.c --- branches/alex_devel_branch/reactos/lib/ntdll/rtl/exception.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/lib/ntdll/rtl/exception.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -22,6 +22,15 @@
#define NDEBUG #include <debug.h>
+static CRITICAL_SECTION RtlpVectoredExceptionLock; +static LIST_ENTRY RtlpVectoredExceptionHead; + +typedef struct _RTL_VECTORED_EXCEPTION_HANDLER +{ + LIST_ENTRY ListEntry; + PVECTORED_EXCEPTION_HANDLER VectoredHandler; +} RTL_VECTORED_EXCEPTION_HANDLER, *PRTL_VECTORED_EXCEPTION_HANDLER; + /* FUNCTIONS ***************************************************************/
VOID STDCALL @@ -87,4 +96,83 @@ NtTerminateProcess(NtCurrentProcess(), ExitStatus); }
+ +VOID +RtlpInitializeVectoredExceptionHandling(VOID) +{ + InitializeListHead(&RtlpVectoredExceptionHead); + RtlInitializeCriticalSection(&RtlpVectoredExceptionLock); +} + + +/* + * @implemented + */ +PVOID STDCALL +RtlAddVectoredExceptionHandler(IN ULONG FirstHandler, + IN PVECTORED_EXCEPTION_HANDLER VectoredHandler) +{ + PRTL_VECTORED_EXCEPTION_HANDLER veh; + + veh = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + sizeof(RTL_VECTORED_EXCEPTION_HANDLER)); + if(veh != NULL) + { + veh->VectoredHandler = RtlEncodePointer(VectoredHandler); + RtlEnterCriticalSection(&RtlpVectoredExceptionLock); + if(FirstHandler != 0) + { + InsertHeadList(&RtlpVectoredExceptionHead, + &veh->ListEntry); + } + else + { + InsertTailList(&RtlpVectoredExceptionHead, + &veh->ListEntry); + } + RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); + } + + return veh; +} + + +/* + * @implemented + */ +ULONG STDCALL +RtlRemoveVectoredExceptionHandler(IN PVOID VectoredHandlerHandle) +{ + PLIST_ENTRY CurrentEntry; + PRTL_VECTORED_EXCEPTION_HANDLER veh = NULL; + ULONG Removed = FALSE; + + RtlEnterCriticalSection(&RtlpVectoredExceptionLock); + for(CurrentEntry = RtlpVectoredExceptionHead.Flink; + CurrentEntry != &RtlpVectoredExceptionHead; + CurrentEntry = CurrentEntry->Flink) + { + veh = CONTAINING_RECORD(CurrentEntry, + RTL_VECTORED_EXCEPTION_HANDLER, + ListEntry); + if(veh == VectoredHandlerHandle) + { + RemoveEntryList(&veh->ListEntry); + Removed = TRUE; + break; + } + } + RtlLeaveCriticalSection(&RtlpVectoredExceptionLock); + + if(Removed) + { + RtlFreeHeap(RtlGetProcessHeap(), + 0, + veh); + } + + return Removed; +} + /* EOF */ _____
Modified: branches/alex_devel_branch/reactos/lib/rpcrt4/rpc_message.c --- branches/alex_devel_branch/reactos/lib/rpcrt4/rpc_message.c 2005-03-05 22:20:15 UTC (rev 13838) +++ branches/alex_devel_branch/reactos/lib/rpcrt4/rpc_message.c 2005-03-05 23:19:42 UTC (rev 13839) @@ -265,10 +265,15 @@
}
/* transmit packet header */ - if (!WriteFile(Connection->conn, Header, hdr_size, &count, NULL)) { + ResetEvent(Connection->ovl.hEvent); + if (!WriteFile(Connection->conn, Header, hdr_size, &count, &Connection->ovl)) { WARN("WriteFile failed with error %ld\n", GetLastError()); return GetLastError(); } + if (!GetOverlappedResult(Connection->conn, &Connection->ovl, &count, TRUE)) { + WARN("GetOverlappedResult failed with error %ld\n", GetLastError()); [truncated at 1000 lines; 755 more skipped]