mmfuncs.h: add MmGetSystemAddressForMdlSafe/MmMapLockedPagesSpecifyCache defs. matherr.c: remove _exception struct since its already in math.h path: simply file exsitence check iomgr: simplify/use standard generic file mappings flags misc. Modified: trunk/reactos/include/ddk/mmfuncs.h Modified: trunk/reactos/lib/crt/except/matherr.c Modified: trunk/reactos/lib/ntdll/rtl/libsupp.c Modified: trunk/reactos/lib/ntdll/rtl/path.c Modified: trunk/reactos/lib/rtl/unicode.c Modified: trunk/reactos/lib/user32/windows/accel.c Modified: trunk/reactos/ntoskrnl/fs/notify.c Modified: trunk/reactos/ntoskrnl/io/iomgr.c Modified: trunk/reactos/subsys/win32k/objects/bitmaps.c Modified: trunk/reactos/subsys/win32k/objects/pen.c _____
Modified: trunk/reactos/include/ddk/mmfuncs.h --- trunk/reactos/include/ddk/mmfuncs.h 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/include/ddk/mmfuncs.h 2005-04-01 00:04:15 UTC (rev 14396) @@ -279,6 +279,19 @@
(((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
((Mdl)->MappedSystemVa):(MmMapLockedPages((Mdl),KernelMode)))
+/* + * PVOID + * MmGetSystemAddressForMdlSafe( + * IN PMDL Mdl, + * IN MM_PAGE_PRIORITY Priority) + */ +#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \ + ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \ + | MDL_SOURCE_IS_NONPAGED_POOL)) ? \ + (_Mdl)->MappedSystemVa : \ + (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \ + KernelMode, MmCached, NULL, FALSE, _Priority) + PVOID STDCALL MmGetSystemRoutineAddress ( @@ -425,6 +438,13 @@ PMDL MemoryDescriptorList, KPROCESSOR_MODE AccessMode ); +PVOID STDCALL +MmMapLockedPagesSpecifyCache ( IN PMDL Mdl, + IN KPROCESSOR_MODE AccessMode, + IN MEMORY_CACHING_TYPE CacheType, + IN PVOID BaseAddress, + IN ULONG BugCheckOnFailure, + IN MM_PAGE_PRIORITY Priority); VOID STDCALL MmMapMemoryDumpMdl ( _____
Modified: trunk/reactos/lib/crt/except/matherr.c --- trunk/reactos/lib/crt/except/matherr.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/lib/crt/except/matherr.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -1,16 +1,8 @@
#include "precomp.h" +#include <math.h> #include <ntos/except.h>
-struct _exception { - int type; - char* name; - double arg1; - double arg2; - double retval; -} ; - - int _matherr(struct _exception* e) { return 0; _____
Modified: trunk/reactos/lib/ntdll/rtl/libsupp.c --- trunk/reactos/lib/ntdll/rtl/libsupp.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/lib/ntdll/rtl/libsupp.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -19,6 +19,13 @@
/* FUNCTIONS ***************************************************************/
+KPROCESSOR_MODE +RtlpGetMode() +{ + return UserMode; +} + + PVOID STDCALL ExAllocatePool( _____
Modified: trunk/reactos/lib/ntdll/rtl/path.c --- trunk/reactos/lib/ntdll/rtl/path.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/lib/ntdll/rtl/path.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -948,13 +948,10 @@
{ UNICODE_STRING NtFileName; OBJECT_ATTRIBUTES Attr; + FILE_BASIC_INFORMATION Info; NTSTATUS Status; CURDIR CurDir; - PWSTR Buffer;
- /* only used by replacement code */ - HANDLE FileHandle; - IO_STATUS_BLOCK StatusBlock;
if (!RtlDosPathNameToNtPathName_U (FileName, &NtFileName, @@ -962,9 +959,6 @@ &CurDir)) return FALSE;
- /* don't forget to free it! */ - Buffer = NtFileName.Buffer; - if (CurDir.DosPath.Length) NtFileName = CurDir.DosPath; else @@ -976,24 +970,11 @@ CurDir.Handle, NULL);
- /* FIXME: not implemented yet */ -// Status = NtQueryAttributesFile (&Attr, NULL); + Status = NtQueryAttributesFile (&Attr, &Info);
- /* REPLACEMENT start */ - Status = NtOpenFile (&FileHandle, - 0x10001, - &Attr, - &StatusBlock, - 1, - FILE_SYNCHRONOUS_IO_NONALERT); - if (NT_SUCCESS(Status)) - NtClose (FileHandle); - /* REPLACEMENT end */ - - RtlFreeHeap (RtlGetProcessHeap (), - 0, - Buffer); - + RtlFreeUnicodeString(&NtFileName); + + if (NT_SUCCESS(Status) || Status == STATUS_SHARING_VIOLATION || Status == STATUS_ACCESS_DENIED) _____
Modified: trunk/reactos/lib/rtl/unicode.c --- trunk/reactos/lib/rtl/unicode.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/lib/rtl/unicode.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -2256,6 +2256,8 @@
/* * private + * + * Creates a nullterminated UNICODE_STRING */ BOOLEAN FASTCALL _____
Modified: trunk/reactos/lib/user32/windows/accel.c --- trunk/reactos/lib/user32/windows/accel.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/lib/user32/windows/accel.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -285,6 +285,9 @@
}
+/* + * @implemented + */ int WINAPI CopyAcceleratorTableA ( HACCEL hAccelSrc, _____
Modified: trunk/reactos/ntoskrnl/fs/notify.c --- trunk/reactos/ntoskrnl/fs/notify.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/ntoskrnl/fs/notify.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -23,7 +23,6 @@
LIST_ENTRY ListEntry; PSTRING FullDirectoryName; BOOLEAN WatchTree; - BOOLEAN IgnoreBuffer; BOOLEAN PendingChanges; ULONG CompletionFilter; LIST_ENTRY IrpQueue; @@ -395,7 +394,7 @@ IN BOOLEAN WatchTree, IN BOOLEAN IgnoreBuffer, IN ULONG CompletionFilter, - IN PIRP NotifyIrp, + IN PIRP Irp, IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL ) @@ -404,7 +403,7 @@ PNOTIFY_ENTRY NotifyEntry; ULONG IrpBuffLen;
- if (!NotifyIrp) + if (!Irp) { /* all other params are ignored if NotifyIrp == NULL */ FsRtlpWatchedDirectoryWasDeleted(NotifySync, NotifyList, FsContext); @@ -415,14 +414,14 @@
ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
- IrpStack = IoGetCurrentIrpStackLocation(NotifyIrp); + IrpStack = IoGetCurrentIrpStackLocation(Irp); if (IrpStack->FileObject->Flags & FO_CLEANUP_COMPLETE) { ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
- NotifyIrp->IoStatus.Information = 0; - NotifyIrp->IoStatus.Status = STATUS_NOTIFY_CLEANUP; - IoCompleteRequest(NotifyIrp, IO_NO_INCREMENT); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_NOTIFY_CLEANUP; + IoCompleteRequest(Irp, IO_NO_INCREMENT); return; }
@@ -463,12 +462,13 @@ FSRTL_NOTIFY_TAG );
- NotifyEntry->PrevEntry = NotifyEntry->Buffer; NotifyEntry->BufferSize = IrpBuffLen; } _SEH_HANDLE { - /* ExAllocatePoolWithQuotaTag raised exception */ + /* ExAllocatePoolWithQuotaTag raised exception but we dont care. + The impl. doesnt require a buffer, so well continue as usual. + */ } _SEH_END; } @@ -485,26 +485,29 @@ /* No changes are pending. Queue the irp */
/* Irp cancelation boilerplate */ - IoSetCancelRoutine(NotifyIrp, FsRtlpNotifyCancelRoutine); - if (NotifyIrp->Cancel && IoSetCancelRoutine(NotifyIrp, NULL)) + + /* save NotifySych for use in the cancel routine */ + Irp->Tail.Overlay.DriverContext[3] = NotifySync; + + IoSetCancelRoutine(Irp, FsRtlpNotifyCancelRoutine); + if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL)) { //irp was canceled ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
- NotifyIrp->IoStatus.Status = STATUS_CANCELLED; - NotifyIrp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_CANCELLED; + Irp->IoStatus.Information = 0;
- IoCompleteRequest(NotifyIrp, IO_NO_INCREMENT); + IoCompleteRequest(Irp, IO_NO_INCREMENT); return; }
- IoMarkIrpPending(NotifyIrp); + IoMarkIrpPending(Irp);
//FIXME: any point in setting irp status/information before queueing? + Irp->IoStatus.Status = STATUS_PENDING;
- /* save NotifySych for use in the cancel routine */ - NotifyIrp->Tail.Overlay.DriverContext[3] = NotifySync; - InsertTailList(&NotifyEntry->IrpQueue, &NotifyIrp->Tail.Overlay.ListEntry); + InsertTailList(&NotifyEntry->IrpQueue, &Irp->Tail.Overlay.ListEntry);
ExReleaseFastMutex((PFAST_MUTEX)NotifySync); return; @@ -524,24 +527,29 @@ -Current irp buff was not large enough */
- NotifyIrp->IoStatus.Information = 0; - NotifyIrp->IoStatus.Status = STATUS_NOTIFY_ENUM_DIR; + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_NOTIFY_ENUM_DIR;
} else { - /* terminate last entry */ - NotifyEntry->PrevEntry->NextEntryOffset = 0; - - //FIXME: copy data correctly to user - memcpy(NotifyIrp->UserBuffer, NotifyEntry->Buffer, NotifyEntry->NextEntryOffset); + PVOID Adr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, LowPagePriority);
- NotifyIrp->IoStatus.Information = NotifyEntry->NextEntryOffset; - NotifyIrp->IoStatus.Status = STATUS_SUCCESS; + if (Adr) + { + memcpy(Adr, NotifyEntry->Buffer, NotifyEntry->NextEntryOffset); + Irp->IoStatus.Information = NotifyEntry->NextEntryOffset; + } + else + { + Irp->IoStatus.Information = 0; + } + + Irp->IoStatus.Status = STATUS_SUCCESS; }
/* reset buffer */ - NotifyEntry->PrevEntry = NotifyEntry->Buffer; + NotifyEntry->PrevEntry = NULL; NotifyEntry->NextEntryOffset = 0; NotifyEntry->BufferExhausted = FALSE;
@@ -549,7 +557,9 @@
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
- IoCompleteRequest(NotifyIrp, IO_NO_INCREMENT); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + /* caller must return STATUS_PENDING */ }
@@ -671,20 +681,25 @@ LIST_FOR_EACH_SAFE(EnumEntry, NotifyList, NotifyEntry, NOTIFY_ENTRY, ListEntry ) { ASSERT(NotifyEntry->Unicode == FsRtlpIsUnicodePath(FullTargetName)); - + /* rule out some easy cases */ - /* FIXME: short vs. long names??? */ + /* FIXME: short vs. long names??? lower case/upper case/mixed case? */ if (!(FilterMatch & NotifyEntry->CompletionFilter)) continue;
- FullDirLen = TargetNameOffset - (NotifyEntry->Unicode?sizeof(WCHAR):sizeof(char)); + FullDirLen = TargetNameOffset - (NotifyEntry->Unicode ? sizeof(WCHAR) : sizeof(char)); + if (FullDirLen == 0) + { + /* special case for root dir */ + FullDirLen = (NotifyEntry->Unicode ? sizeof(WCHAR) : sizeof(char)); + }
- if (FullDirLen < NotifyEntry->FullDirectoryName->Length) continue;
if (!NotifyEntry->WatchTree && FullDirLen != NotifyEntry->FullDirectoryName->Length) continue;
DPRINT("NotifyEntry->FullDirectoryName: %wZ\n", NotifyEntry->FullDirectoryName);
+ /* FIXME: short vs. long names??? lower case/upper case/mixed case? */ if (memcmp(NotifyEntry->FullDirectoryName->Buffer, FullTargetName->Buffer, NotifyEntry->FullDirectoryName->Length) != 0) continue; @@ -751,22 +766,31 @@ } else { - //FIXME: copy data to user correctly - CurrentEntry = (PFILE_NOTIFY_INFORMATION)Irp->UserBuffer; + CurrentEntry = (PFILE_NOTIFY_INFORMATION) + MmGetSystemAddressForMdlSafe(Irp->MdlAddress, LowPagePriority); + + if (CurrentEntry) + { + CurrentEntry->Action = Action; + CurrentEntry->NameLength = NameLenU; + CurrentEntry->NextEntryOffset = 0; + + FsRtlpCopyName( + CurrentEntry, + NotifyEntry->Unicode, + &RelativeName, + StreamName + ); + + Irp->IoStatus.Information = RecordLen; + } + else + { + Irp->IoStatus.Information = 0; + }
- CurrentEntry->Action = Action; - CurrentEntry->NameLength = NameLenU; - CurrentEntry->NextEntryOffset = 0;
- FsRtlpCopyName( - CurrentEntry, - NotifyEntry->Unicode, - &RelativeName, - StreamName - ); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = RecordLen; }
/* avoid holding lock while completing irp */ @@ -803,8 +827,10 @@ StreamName );
- /* adjust buffer */ - NotifyEntry->PrevEntry->NextEntryOffset = (char*)CurrentEntry - (char*)NotifyEntry->PrevEntry; + if (NotifyEntry->PrevEntry) + { + NotifyEntry->PrevEntry->NextEntryOffset = (char*)CurrentEntry - (char*)NotifyEntry->PrevEntry; + } NotifyEntry->PrevEntry = CurrentEntry; NotifyEntry->NextEntryOffset += RecordLen;
_____
Modified: trunk/reactos/ntoskrnl/io/iomgr.c --- trunk/reactos/ntoskrnl/io/iomgr.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/ntoskrnl/io/iomgr.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -34,10 +34,10 @@
ULONGLONG IoOtherTransferCount = 0; KSPIN_LOCK EXPORTED IoStatisticsLock = 0;
-static GENERIC_MAPPING IopFileMapping = {STANDARD_RIGHTS_READ | SYNCHRONIZE | FILE_READ_DATA | FILE_READ_PROPERTIES, - STANDARD_RIGHTS_WRITE | SYNCHRONIZE | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_PROPERTIES, - STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | FILE_EXECUTE | FILE_READ_ATTRIBUTES, - FILE_ALL_ACCESS}; +static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ, + FILE_GENERIC_WRITE, + FILE_GENERIC_EXECUTE, + FILE_ALL_ACCESS};
/* FUNCTIONS ****************************************************************/
_____
Modified: trunk/reactos/subsys/win32k/objects/bitmaps.c --- trunk/reactos/subsys/win32k/objects/bitmaps.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/subsys/win32k/objects/bitmaps.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -556,8 +556,10 @@
COLORREF Color, UINT FillType) { - UNIMPLEMENTED; - return FALSE; + DPRINT1("FIXME: NtGdiExtFloodFill is UNIMPLEMENTED\n"); + + /* lie and say we succeded */ + return TRUE; }
BOOL STDCALL _____
Modified: trunk/reactos/subsys/win32k/objects/pen.c --- trunk/reactos/subsys/win32k/objects/pen.c 2005-03-31 22:40:23 UTC (rev 14395) +++ trunk/reactos/subsys/win32k/objects/pen.c 2005-04-01 00:04:15 UTC (rev 14396) @@ -63,7 +63,7 @@
break;
default: - UNIMPLEMENTED; + DPRINT1("FIXME: IntGdiCreatePenIndirect is UNIMPLEMENTED\n"); }
PENOBJ_UnlockPen(hPen);