mirror of
https://github.com/reactos/reactos.git
synced 2025-06-01 15:38:37 +00:00
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. svn path=/trunk/; revision=14396
This commit is contained in:
parent
5b6820630a
commit
7df5d3e7e1
10 changed files with 121 additions and 88 deletions
|
@ -279,6 +279,19 @@ MmGetPhysicalMemoryRanges (
|
||||||
(((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
|
(((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
|
||||||
((Mdl)->MappedSystemVa):(MmMapLockedPages((Mdl),KernelMode)))
|
((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
|
PVOID
|
||||||
STDCALL
|
STDCALL
|
||||||
MmGetSystemRoutineAddress (
|
MmGetSystemRoutineAddress (
|
||||||
|
@ -425,6 +438,13 @@ MmMapLockedPages (
|
||||||
PMDL MemoryDescriptorList,
|
PMDL MemoryDescriptorList,
|
||||||
KPROCESSOR_MODE AccessMode
|
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
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
MmMapMemoryDumpMdl (
|
MmMapMemoryDumpMdl (
|
||||||
|
|
|
@ -1,16 +1,8 @@
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
#include <math.h>
|
||||||
#include <ntos/except.h>
|
#include <ntos/except.h>
|
||||||
|
|
||||||
|
|
||||||
struct _exception {
|
|
||||||
int type;
|
|
||||||
char* name;
|
|
||||||
double arg1;
|
|
||||||
double arg2;
|
|
||||||
double retval;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
|
|
||||||
int _matherr(struct _exception* e)
|
int _matherr(struct _exception* e)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -19,6 +19,13 @@
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
|
KPROCESSOR_MODE
|
||||||
|
RtlpGetMode()
|
||||||
|
{
|
||||||
|
return UserMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PVOID
|
PVOID
|
||||||
STDCALL
|
STDCALL
|
||||||
ExAllocatePool(
|
ExAllocatePool(
|
||||||
|
|
|
@ -948,13 +948,10 @@ RtlDoesFileExists_U(IN PWSTR FileName)
|
||||||
{
|
{
|
||||||
UNICODE_STRING NtFileName;
|
UNICODE_STRING NtFileName;
|
||||||
OBJECT_ATTRIBUTES Attr;
|
OBJECT_ATTRIBUTES Attr;
|
||||||
|
FILE_BASIC_INFORMATION Info;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
CURDIR CurDir;
|
CURDIR CurDir;
|
||||||
PWSTR Buffer;
|
|
||||||
|
|
||||||
/* only used by replacement code */
|
|
||||||
HANDLE FileHandle;
|
|
||||||
IO_STATUS_BLOCK StatusBlock;
|
|
||||||
|
|
||||||
if (!RtlDosPathNameToNtPathName_U (FileName,
|
if (!RtlDosPathNameToNtPathName_U (FileName,
|
||||||
&NtFileName,
|
&NtFileName,
|
||||||
|
@ -962,9 +959,6 @@ RtlDoesFileExists_U(IN PWSTR FileName)
|
||||||
&CurDir))
|
&CurDir))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* don't forget to free it! */
|
|
||||||
Buffer = NtFileName.Buffer;
|
|
||||||
|
|
||||||
if (CurDir.DosPath.Length)
|
if (CurDir.DosPath.Length)
|
||||||
NtFileName = CurDir.DosPath;
|
NtFileName = CurDir.DosPath;
|
||||||
else
|
else
|
||||||
|
@ -976,24 +970,11 @@ RtlDoesFileExists_U(IN PWSTR FileName)
|
||||||
CurDir.Handle,
|
CurDir.Handle,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
/* FIXME: not implemented yet */
|
Status = NtQueryAttributesFile (&Attr, &Info);
|
||||||
// Status = NtQueryAttributesFile (&Attr, NULL);
|
|
||||||
|
|
||||||
/* 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) ||
|
if (NT_SUCCESS(Status) ||
|
||||||
Status == STATUS_SHARING_VIOLATION ||
|
Status == STATUS_SHARING_VIOLATION ||
|
||||||
Status == STATUS_ACCESS_DENIED)
|
Status == STATUS_ACCESS_DENIED)
|
||||||
|
|
|
@ -2256,6 +2256,8 @@ RtlCreateUnicodeString(
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* private
|
* private
|
||||||
|
*
|
||||||
|
* Creates a nullterminated UNICODE_STRING
|
||||||
*/
|
*/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
FASTCALL
|
FASTCALL
|
||||||
|
|
|
@ -285,6 +285,9 @@ HACCEL WINAPI CreateAcceleratorTableW(LPACCEL lpaccl, int cEntries)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
int WINAPI CopyAcceleratorTableA
|
int WINAPI CopyAcceleratorTableA
|
||||||
(
|
(
|
||||||
HACCEL hAccelSrc,
|
HACCEL hAccelSrc,
|
||||||
|
|
|
@ -23,7 +23,6 @@ typedef struct _NOTIFY_ENTRY
|
||||||
LIST_ENTRY ListEntry;
|
LIST_ENTRY ListEntry;
|
||||||
PSTRING FullDirectoryName;
|
PSTRING FullDirectoryName;
|
||||||
BOOLEAN WatchTree;
|
BOOLEAN WatchTree;
|
||||||
BOOLEAN IgnoreBuffer;
|
|
||||||
BOOLEAN PendingChanges;
|
BOOLEAN PendingChanges;
|
||||||
ULONG CompletionFilter;
|
ULONG CompletionFilter;
|
||||||
LIST_ENTRY IrpQueue;
|
LIST_ENTRY IrpQueue;
|
||||||
|
@ -395,7 +394,7 @@ FsRtlNotifyFullChangeDirectory (
|
||||||
IN BOOLEAN WatchTree,
|
IN BOOLEAN WatchTree,
|
||||||
IN BOOLEAN IgnoreBuffer,
|
IN BOOLEAN IgnoreBuffer,
|
||||||
IN ULONG CompletionFilter,
|
IN ULONG CompletionFilter,
|
||||||
IN PIRP NotifyIrp,
|
IN PIRP Irp,
|
||||||
IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,
|
IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,
|
||||||
IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL
|
IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL
|
||||||
)
|
)
|
||||||
|
@ -404,7 +403,7 @@ FsRtlNotifyFullChangeDirectory (
|
||||||
PNOTIFY_ENTRY NotifyEntry;
|
PNOTIFY_ENTRY NotifyEntry;
|
||||||
ULONG IrpBuffLen;
|
ULONG IrpBuffLen;
|
||||||
|
|
||||||
if (!NotifyIrp)
|
if (!Irp)
|
||||||
{
|
{
|
||||||
/* all other params are ignored if NotifyIrp == NULL */
|
/* all other params are ignored if NotifyIrp == NULL */
|
||||||
FsRtlpWatchedDirectoryWasDeleted(NotifySync, NotifyList, FsContext);
|
FsRtlpWatchedDirectoryWasDeleted(NotifySync, NotifyList, FsContext);
|
||||||
|
@ -415,14 +414,14 @@ FsRtlNotifyFullChangeDirectory (
|
||||||
|
|
||||||
ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
|
ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
|
||||||
|
|
||||||
IrpStack = IoGetCurrentIrpStackLocation(NotifyIrp);
|
IrpStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
if (IrpStack->FileObject->Flags & FO_CLEANUP_COMPLETE)
|
if (IrpStack->FileObject->Flags & FO_CLEANUP_COMPLETE)
|
||||||
{
|
{
|
||||||
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
|
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
|
||||||
|
|
||||||
NotifyIrp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
NotifyIrp->IoStatus.Status = STATUS_NOTIFY_CLEANUP;
|
Irp->IoStatus.Status = STATUS_NOTIFY_CLEANUP;
|
||||||
IoCompleteRequest(NotifyIrp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -463,12 +462,13 @@ FsRtlNotifyFullChangeDirectory (
|
||||||
FSRTL_NOTIFY_TAG
|
FSRTL_NOTIFY_TAG
|
||||||
);
|
);
|
||||||
|
|
||||||
NotifyEntry->PrevEntry = NotifyEntry->Buffer;
|
|
||||||
NotifyEntry->BufferSize = IrpBuffLen;
|
NotifyEntry->BufferSize = IrpBuffLen;
|
||||||
}
|
}
|
||||||
_SEH_HANDLE
|
_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;
|
_SEH_END;
|
||||||
}
|
}
|
||||||
|
@ -485,26 +485,29 @@ FsRtlNotifyFullChangeDirectory (
|
||||||
/* No changes are pending. Queue the irp */
|
/* No changes are pending. Queue the irp */
|
||||||
|
|
||||||
/* Irp cancelation boilerplate */
|
/* 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
|
//irp was canceled
|
||||||
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
|
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
|
||||||
|
|
||||||
NotifyIrp->IoStatus.Status = STATUS_CANCELLED;
|
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||||
NotifyIrp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
|
|
||||||
IoCompleteRequest(NotifyIrp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IoMarkIrpPending(NotifyIrp);
|
IoMarkIrpPending(Irp);
|
||||||
|
|
||||||
//FIXME: any point in setting irp status/information before queueing?
|
//FIXME: any point in setting irp status/information before queueing?
|
||||||
|
Irp->IoStatus.Status = STATUS_PENDING;
|
||||||
|
|
||||||
/* save NotifySych for use in the cancel routine */
|
InsertTailList(&NotifyEntry->IrpQueue, &Irp->Tail.Overlay.ListEntry);
|
||||||
NotifyIrp->Tail.Overlay.DriverContext[3] = NotifySync;
|
|
||||||
InsertTailList(&NotifyEntry->IrpQueue, &NotifyIrp->Tail.Overlay.ListEntry);
|
|
||||||
|
|
||||||
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
|
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
|
||||||
return;
|
return;
|
||||||
|
@ -524,24 +527,29 @@ FsRtlNotifyFullChangeDirectory (
|
||||||
-Current irp buff was not large enough
|
-Current irp buff was not large enough
|
||||||
*/
|
*/
|
||||||
|
|
||||||
NotifyIrp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
NotifyIrp->IoStatus.Status = STATUS_NOTIFY_ENUM_DIR;
|
Irp->IoStatus.Status = STATUS_NOTIFY_ENUM_DIR;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* terminate last entry */
|
PVOID Adr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, LowPagePriority);
|
||||||
NotifyEntry->PrevEntry->NextEntryOffset = 0;
|
|
||||||
|
|
||||||
//FIXME: copy data correctly to user
|
|
||||||
memcpy(NotifyIrp->UserBuffer, NotifyEntry->Buffer, NotifyEntry->NextEntryOffset);
|
|
||||||
|
|
||||||
NotifyIrp->IoStatus.Information = NotifyEntry->NextEntryOffset;
|
if (Adr)
|
||||||
NotifyIrp->IoStatus.Status = STATUS_SUCCESS;
|
{
|
||||||
|
memcpy(Adr, NotifyEntry->Buffer, NotifyEntry->NextEntryOffset);
|
||||||
|
Irp->IoStatus.Information = NotifyEntry->NextEntryOffset;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reset buffer */
|
/* reset buffer */
|
||||||
NotifyEntry->PrevEntry = NotifyEntry->Buffer;
|
NotifyEntry->PrevEntry = NULL;
|
||||||
NotifyEntry->NextEntryOffset = 0;
|
NotifyEntry->NextEntryOffset = 0;
|
||||||
NotifyEntry->BufferExhausted = FALSE;
|
NotifyEntry->BufferExhausted = FALSE;
|
||||||
|
|
||||||
|
@ -549,7 +557,9 @@ FsRtlNotifyFullChangeDirectory (
|
||||||
|
|
||||||
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
|
ExReleaseFastMutex((PFAST_MUTEX)NotifySync);
|
||||||
|
|
||||||
IoCompleteRequest(NotifyIrp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
/* caller must return STATUS_PENDING */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -671,13 +681,17 @@ FsRtlNotifyFullReportChange (
|
||||||
LIST_FOR_EACH_SAFE(EnumEntry, NotifyList, NotifyEntry, NOTIFY_ENTRY, ListEntry )
|
LIST_FOR_EACH_SAFE(EnumEntry, NotifyList, NotifyEntry, NOTIFY_ENTRY, ListEntry )
|
||||||
{
|
{
|
||||||
ASSERT(NotifyEntry->Unicode == FsRtlpIsUnicodePath(FullTargetName));
|
ASSERT(NotifyEntry->Unicode == FsRtlpIsUnicodePath(FullTargetName));
|
||||||
|
|
||||||
/* rule out some easy cases */
|
/* 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;
|
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 (FullDirLen < NotifyEntry->FullDirectoryName->Length) continue;
|
||||||
|
|
||||||
|
@ -685,6 +699,7 @@ FsRtlNotifyFullReportChange (
|
||||||
|
|
||||||
DPRINT("NotifyEntry->FullDirectoryName: %wZ\n", NotifyEntry->FullDirectoryName);
|
DPRINT("NotifyEntry->FullDirectoryName: %wZ\n", NotifyEntry->FullDirectoryName);
|
||||||
|
|
||||||
|
/* FIXME: short vs. long names??? lower case/upper case/mixed case? */
|
||||||
if (memcmp(NotifyEntry->FullDirectoryName->Buffer,
|
if (memcmp(NotifyEntry->FullDirectoryName->Buffer,
|
||||||
FullTargetName->Buffer,
|
FullTargetName->Buffer,
|
||||||
NotifyEntry->FullDirectoryName->Length) != 0) continue;
|
NotifyEntry->FullDirectoryName->Length) != 0) continue;
|
||||||
|
@ -751,22 +766,31 @@ FsRtlNotifyFullReportChange (
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//FIXME: copy data to user correctly
|
CurrentEntry = (PFILE_NOTIFY_INFORMATION)
|
||||||
CurrentEntry = (PFILE_NOTIFY_INFORMATION)Irp->UserBuffer;
|
MmGetSystemAddressForMdlSafe(Irp->MdlAddress, LowPagePriority);
|
||||||
|
|
||||||
CurrentEntry->Action = Action;
|
if (CurrentEntry)
|
||||||
CurrentEntry->NameLength = NameLenU;
|
{
|
||||||
CurrentEntry->NextEntryOffset = 0;
|
CurrentEntry->Action = Action;
|
||||||
|
CurrentEntry->NameLength = NameLenU;
|
||||||
|
CurrentEntry->NextEntryOffset = 0;
|
||||||
|
|
||||||
FsRtlpCopyName(
|
FsRtlpCopyName(
|
||||||
CurrentEntry,
|
CurrentEntry,
|
||||||
NotifyEntry->Unicode,
|
NotifyEntry->Unicode,
|
||||||
&RelativeName,
|
&RelativeName,
|
||||||
StreamName
|
StreamName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Irp->IoStatus.Information = RecordLen;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
Irp->IoStatus.Information = RecordLen;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* avoid holding lock while completing irp */
|
/* avoid holding lock while completing irp */
|
||||||
|
@ -803,8 +827,10 @@ FsRtlNotifyFullReportChange (
|
||||||
StreamName
|
StreamName
|
||||||
);
|
);
|
||||||
|
|
||||||
/* adjust buffer */
|
if (NotifyEntry->PrevEntry)
|
||||||
NotifyEntry->PrevEntry->NextEntryOffset = (char*)CurrentEntry - (char*)NotifyEntry->PrevEntry;
|
{
|
||||||
|
NotifyEntry->PrevEntry->NextEntryOffset = (char*)CurrentEntry - (char*)NotifyEntry->PrevEntry;
|
||||||
|
}
|
||||||
NotifyEntry->PrevEntry = CurrentEntry;
|
NotifyEntry->PrevEntry = CurrentEntry;
|
||||||
NotifyEntry->NextEntryOffset += RecordLen;
|
NotifyEntry->NextEntryOffset += RecordLen;
|
||||||
|
|
||||||
|
|
|
@ -34,10 +34,10 @@ ULONG IoOtherOperationCount = 0;
|
||||||
ULONGLONG IoOtherTransferCount = 0;
|
ULONGLONG IoOtherTransferCount = 0;
|
||||||
KSPIN_LOCK EXPORTED IoStatisticsLock = 0;
|
KSPIN_LOCK EXPORTED IoStatisticsLock = 0;
|
||||||
|
|
||||||
static GENERIC_MAPPING IopFileMapping = {STANDARD_RIGHTS_READ | SYNCHRONIZE | FILE_READ_DATA | FILE_READ_PROPERTIES,
|
static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
|
||||||
STANDARD_RIGHTS_WRITE | SYNCHRONIZE | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_PROPERTIES,
|
FILE_GENERIC_WRITE,
|
||||||
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | FILE_EXECUTE | FILE_READ_ATTRIBUTES,
|
FILE_GENERIC_EXECUTE,
|
||||||
FILE_ALL_ACCESS};
|
FILE_ALL_ACCESS};
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -556,8 +556,10 @@ NtGdiExtFloodFill(
|
||||||
COLORREF Color,
|
COLORREF Color,
|
||||||
UINT FillType)
|
UINT FillType)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
DPRINT1("FIXME: NtGdiExtFloodFill is UNIMPLEMENTED\n");
|
||||||
return FALSE;
|
|
||||||
|
/* lie and say we succeded */
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL STDCALL
|
BOOL STDCALL
|
||||||
|
|
|
@ -63,7 +63,7 @@ IntGdiCreatePenIndirect(PLOGPEN LogPen)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED;
|
DPRINT1("FIXME: IntGdiCreatePenIndirect is UNIMPLEMENTED\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
PENOBJ_UnlockPen(hPen);
|
PENOBJ_UnlockPen(hPen);
|
||||||
|
|
Loading…
Reference in a new issue