mirror of
https://github.com/reactos/reactos.git
synced 2024-07-02 10:45:24 +00:00
some __stdcall fixes in ntoskrnl and ntdll
svn path=/trunk/; revision=629
This commit is contained in:
parent
5aaaad5c93
commit
fa3a5c2c71
|
@ -1,16 +1,53 @@
|
||||||
|
#ifndef _NTOS_EXFUNCS_H
|
||||||
|
#define _NTOS_EXFUNCS_H
|
||||||
|
|
||||||
/* EXECUTIVE ROUTINES ******************************************************/
|
/* EXECUTIVE ROUTINES ******************************************************/
|
||||||
|
|
||||||
VOID ExAcquireFastMutex(PFAST_MUTEX FastMutex);
|
VOID
|
||||||
VOID ExAcquireFastMutexUnsafe(PFAST_MUTEX FastMutex);
|
ExAcquireFastMutex (
|
||||||
|
PFAST_MUTEX FastMutex
|
||||||
BOOLEAN ExAcquireResourceExclusive(PERESOURCE Resource, BOOLEAN Wait);
|
);
|
||||||
BOOLEAN ExAcquireResourceExclusiveLite(PERESOURCE Resource, BOOLEAN Wait);
|
VOID
|
||||||
BOOLEAN ExAcquireResourceSharedLite(PERESOURCE Resource, BOOLEAN Wait);
|
ExAcquireFastMutexUnsafe (
|
||||||
BOOLEAN ExAcquireSharedStarveExclusive(PERESOURCE Resource, BOOLEAN Wait);
|
PFAST_MUTEX FastMutex
|
||||||
BOOLEAN ExAcquireSharedWaitForExclusive(PERESOURCE Resource, BOOLEAN Wait);
|
);
|
||||||
PVOID ExAllocateFromNPagedLookasideList(PNPAGED_LOOKASIDE_LIST LookSide);
|
BOOLEAN
|
||||||
PVOID ExAllocateFromPagedLookasideList(PPAGED_LOOKASIDE_LIST LookSide);
|
ExAcquireResourceExclusive (
|
||||||
PVOID ExAllocateFromZone(PZONE_HEADER Zone);
|
PERESOURCE Resource,
|
||||||
|
BOOLEAN Wait
|
||||||
|
);
|
||||||
|
BOOLEAN
|
||||||
|
ExAcquireResourceExclusiveLite (
|
||||||
|
PERESOURCE Resource,
|
||||||
|
BOOLEAN Wait
|
||||||
|
);
|
||||||
|
BOOLEAN
|
||||||
|
ExAcquireResourceSharedLite (
|
||||||
|
PERESOURCE Resource,
|
||||||
|
BOOLEAN Wait
|
||||||
|
);
|
||||||
|
BOOLEAN
|
||||||
|
ExAcquireSharedStarveExclusive (
|
||||||
|
PERESOURCE Resource,
|
||||||
|
BOOLEAN Wait
|
||||||
|
);
|
||||||
|
BOOLEAN
|
||||||
|
ExAcquireSharedWaitForExclusive (
|
||||||
|
PERESOURCE Resource,
|
||||||
|
BOOLEAN Wait
|
||||||
|
);
|
||||||
|
PVOID
|
||||||
|
ExAllocateFromNPagedLookasideList (
|
||||||
|
PNPAGED_LOOKASIDE_LIST LookSide
|
||||||
|
);
|
||||||
|
PVOID
|
||||||
|
ExAllocateFromPagedLookasideList (
|
||||||
|
PPAGED_LOOKASIDE_LIST LookSide
|
||||||
|
);
|
||||||
|
PVOID
|
||||||
|
ExAllocateFromZone (
|
||||||
|
PZONE_HEADER Zone
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Allocates memory from the nonpaged pool
|
* FUNCTION: Allocates memory from the nonpaged pool
|
||||||
|
@ -20,133 +57,371 @@ PVOID ExAllocateFromZone(PZONE_HEADER Zone);
|
||||||
* RETURNS:
|
* RETURNS:
|
||||||
* the address of the block if it succeeds
|
* the address of the block if it succeeds
|
||||||
*/
|
*/
|
||||||
PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG size);
|
PVOID
|
||||||
|
ExAllocatePool (
|
||||||
|
POOL_TYPE PoolType,
|
||||||
|
ULONG size
|
||||||
|
);
|
||||||
|
|
||||||
PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes);
|
PVOID
|
||||||
PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
|
ExAllocatePoolWithQuota (
|
||||||
ULONG Tag);
|
POOL_TYPE PoolType,
|
||||||
PVOID ExAllocatePoolWithTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
|
ULONG NumberOfBytes
|
||||||
ULONG Tag);
|
);
|
||||||
VOID ExConvertExclusiveToSharedLite(PERESOURCE Resource);
|
PVOID
|
||||||
VOID ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside);
|
ExAllocatePoolWithQuotaTag (
|
||||||
VOID ExDeletePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside);
|
POOL_TYPE PoolType,
|
||||||
NTSTATUS ExDeleteResource(PERESOURCE Resource);
|
ULONG NumberOfBytes,
|
||||||
NTSTATUS ExDeleteResourceLite(PERESOURCE Resource);
|
ULONG Tag
|
||||||
NTSTATUS ExExtendZone(PZONE_HEADER Zone, PVOID Segment, ULONG SegmentSize);
|
);
|
||||||
|
PVOID
|
||||||
|
ExAllocatePoolWithTag (
|
||||||
|
POOL_TYPE PoolType,
|
||||||
|
ULONG NumberOfBytes,
|
||||||
|
ULONG Tag
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
ExConvertExclusiveToSharedLite (
|
||||||
|
PERESOURCE Resource
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
ExDeleteNPagedLookasideList (
|
||||||
|
PNPAGED_LOOKASIDE_LIST Lookaside
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
ExDeletePagedLookasideList (
|
||||||
|
PPAGED_LOOKASIDE_LIST Lookaside
|
||||||
|
);
|
||||||
|
NTSTATUS
|
||||||
|
ExDeleteResource (
|
||||||
|
PERESOURCE Resource
|
||||||
|
);
|
||||||
|
NTSTATUS
|
||||||
|
ExDeleteResourceLite (
|
||||||
|
PERESOURCE Resource
|
||||||
|
);
|
||||||
|
NTSTATUS
|
||||||
|
ExExtendZone (
|
||||||
|
PZONE_HEADER Zone,
|
||||||
|
PVOID Segment,
|
||||||
|
ULONG SegmentSize
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Releases previously allocated memory
|
* FUNCTION: Releases previously allocated memory
|
||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
* block = block to free
|
* block = block to free
|
||||||
*/
|
*/
|
||||||
VOID ExFreePool(PVOID block);
|
VOID
|
||||||
|
ExFreePool (
|
||||||
|
PVOID block
|
||||||
|
);
|
||||||
|
|
||||||
VOID ExFreeToNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside,
|
VOID
|
||||||
PVOID Entry);
|
ExFreeToNPagedLookasideList (
|
||||||
VOID ExFreeToPagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside,
|
PNPAGED_LOOKASIDE_LIST Lookaside,
|
||||||
PVOID Entry);
|
PVOID Entry
|
||||||
PVOID ExFreeToZone(PZONE_HEADER Zone, PVOID Block);
|
);
|
||||||
ERESOURCE_THREAD ExGetCurrentResourceThread(VOID);
|
VOID
|
||||||
ULONG ExGetExclusiveWaiterCount(PERESOURCE Resource);
|
ExFreeToPagedLookasideList (
|
||||||
ULONG ExGetSharedWaiterCount(PERESOURCE Resource);
|
PPAGED_LOOKASIDE_LIST Lookaside,
|
||||||
VOID ExInitializeFastMutex(PFAST_MUTEX FastMutex);
|
PVOID Entry
|
||||||
VOID ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST Lookaside,
|
);
|
||||||
PALLOCATE_FUNCTION Allocate,
|
PVOID
|
||||||
PFREE_FUNCTION Free,
|
ExFreeToZone (
|
||||||
ULONG Flags,
|
PZONE_HEADER Zone,
|
||||||
ULONG Size,
|
PVOID Block
|
||||||
ULONG Tag,
|
);
|
||||||
USHORT Depth);
|
ERESOURCE_THREAD
|
||||||
VOID ExInitializePagedLookasideList(PPAGED_LOOKASIDE_LIST Lookaside,
|
ExGetCurrentResourceThread (
|
||||||
PALLOCATE_FUNCTION Allocate,
|
VOID
|
||||||
PFREE_FUNCTION Free,
|
);
|
||||||
ULONG Flags,
|
ULONG
|
||||||
ULONG Size,
|
ExGetExclusiveWaiterCount (
|
||||||
ULONG Tag,
|
PERESOURCE Resource
|
||||||
USHORT Depth);
|
);
|
||||||
NTSTATUS ExInitializeResource(PERESOURCE Resource);
|
ULONG
|
||||||
NTSTATUS ExInitializeResourceLite(PERESOURCE Resource);
|
ExGetSharedWaiterCount (
|
||||||
VOID ExInitializeSListHead(PSLIST_HEADER SListHead);
|
PERESOURCE Resource
|
||||||
VOID ExInitializeWorkItem(PWORK_QUEUE_ITEM Item,
|
);
|
||||||
PWORKER_THREAD_ROUTINE Routine,
|
VOID
|
||||||
PVOID Context);
|
ExInitializeFastMutex (
|
||||||
NTSTATUS ExInitializeZone(PZONE_HEADER Zone,
|
PFAST_MUTEX FastMutex
|
||||||
ULONG BlockSize,
|
);
|
||||||
PVOID InitialSegment,
|
VOID
|
||||||
ULONG InitialSegmentSize);
|
ExInitializeNPagedLookasideList (
|
||||||
LARGE_INTEGER ExInterlockedAddLargeInteger(PLARGE_INTEGER Addend,
|
PNPAGED_LOOKASIDE_LIST Lookaside,
|
||||||
LARGE_INTEGER Increment,
|
PALLOCATE_FUNCTION Allocate,
|
||||||
PKSPIN_LOCK Lock);
|
PFREE_FUNCTION Free,
|
||||||
ULONG ExInterlockedAddUlong(PULONG Addend, ULONG Increment, PKSPIN_LOCK Lock);
|
ULONG Flags,
|
||||||
|
ULONG Size,
|
||||||
|
ULONG Tag,
|
||||||
|
USHORT Depth
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
ExInitializePagedLookasideList (
|
||||||
|
PPAGED_LOOKASIDE_LIST Lookaside,
|
||||||
|
PALLOCATE_FUNCTION Allocate,
|
||||||
|
PFREE_FUNCTION Free,
|
||||||
|
ULONG Flags,
|
||||||
|
ULONG Size,
|
||||||
|
ULONG Tag,
|
||||||
|
USHORT Depth
|
||||||
|
);
|
||||||
|
NTSTATUS
|
||||||
|
ExInitializeResource (
|
||||||
|
PERESOURCE Resource
|
||||||
|
);
|
||||||
|
NTSTATUS
|
||||||
|
ExInitializeResourceLite (
|
||||||
|
PERESOURCE Resource
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
ExInitializeSListHead (
|
||||||
|
PSLIST_HEADER SListHead
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
ExInitializeWorkItem (
|
||||||
|
PWORK_QUEUE_ITEM Item,
|
||||||
|
PWORKER_THREAD_ROUTINE Routine,
|
||||||
|
PVOID Context
|
||||||
|
);
|
||||||
|
NTSTATUS
|
||||||
|
ExInitializeZone (
|
||||||
|
PZONE_HEADER Zone,
|
||||||
|
ULONG BlockSize,
|
||||||
|
PVOID InitialSegment,
|
||||||
|
ULONG InitialSegmentSize
|
||||||
|
);
|
||||||
|
LARGE_INTEGER
|
||||||
|
ExInterlockedAddLargeInteger (
|
||||||
|
PLARGE_INTEGER Addend,
|
||||||
|
LARGE_INTEGER Increment,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
ULONG
|
||||||
|
ExInterlockedAddUlong (
|
||||||
|
PULONG Addend,
|
||||||
|
ULONG Increment,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
|
||||||
VOID ExInterlockedRemoveEntryList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry,
|
VOID
|
||||||
PKSPIN_LOCK Lock);
|
ExInterlockedRemoveEntryList (
|
||||||
VOID RemoveEntryFromList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry);
|
PLIST_ENTRY ListHead,
|
||||||
PLIST_ENTRY ExInterlockedRemoveHeadList(PLIST_ENTRY Head, PKSPIN_LOCK Lock);
|
PLIST_ENTRY Entry,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
PLIST_ENTRY ExInterlockedInsertTailList(PLIST_ENTRY ListHead,
|
);
|
||||||
PLIST_ENTRY ListEntry,
|
VOID
|
||||||
PKSPIN_LOCK Lock);
|
RemoveEntryFromList (
|
||||||
|
PLIST_ENTRY ListHead,
|
||||||
PLIST_ENTRY ExInterlockedInsertHeadList(PLIST_ENTRY ListHead,
|
PLIST_ENTRY Entry
|
||||||
PLIST_ENTRY ListEntry,
|
);
|
||||||
PKSPIN_LOCK Lock);
|
PLIST_ENTRY
|
||||||
|
ExInterlockedRemoveHeadList (
|
||||||
VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,
|
PLIST_ENTRY Head,
|
||||||
WORK_QUEUE_TYPE QueueType);
|
PKSPIN_LOCK Lock
|
||||||
VOID ExRaiseStatus(NTSTATUS Status);
|
);
|
||||||
VOID ExReinitializeResourceLite(PERESOURCE Resource);
|
PLIST_ENTRY
|
||||||
VOID ExReleaseFastMutex(PFAST_MUTEX Mutex);
|
ExInterlockedInsertTailList (
|
||||||
VOID ExReleaseFastMutexUnsafe(PFAST_MUTEX Mutex);
|
PLIST_ENTRY ListHead,
|
||||||
VOID ExReleaseResource(PERESOURCE Resource);
|
PLIST_ENTRY ListEntry,
|
||||||
VOID ExReleaseResourceForThread(PERESOURCE Resource,
|
PKSPIN_LOCK Lock
|
||||||
ERESOURCE_THREAD ResourceThreadId);
|
);
|
||||||
VOID ExReleaseResourceForThreadLite(PERESOURCE Resource,
|
PLIST_ENTRY
|
||||||
ERESOURCE_THREAD ResourceThreadId);
|
ExInterlockedInsertHeadList (
|
||||||
VOID ExSystemTimeToLocalTime(PLARGE_INTEGER SystemTime,
|
PLIST_ENTRY ListHead,
|
||||||
PLARGE_INTEGER LocalTime);
|
PLIST_ENTRY ListEntry,
|
||||||
BOOLEAN ExTryToAcquireFastMutex(PFAST_MUTEX FastMutex);
|
PKSPIN_LOCK Lock
|
||||||
BOOLEAN ExTryToAcquireResourceExclusiveLite(PERESOURCE Resource);
|
);
|
||||||
PVOID InterlockedCompareExchange(PVOID* Destination,
|
VOID
|
||||||
PVOID Exchange,
|
ExQueueWorkItem (
|
||||||
PVOID Comperand);
|
PWORK_QUEUE_ITEM WorkItem,
|
||||||
LONG InterlockedDecrement(PLONG Addend);
|
WORK_QUEUE_TYPE QueueType
|
||||||
LONG InterlockedExchange(PLONG Target, LONG Value);
|
);
|
||||||
LONG InterlockedExchangeAdd(PLONG Addend, LONG Value);
|
VOID
|
||||||
LONG InterlockedIncrement(PLONG Addend);
|
ExRaiseStatus (
|
||||||
|
NTSTATUS Status
|
||||||
PVOID ExInterlockedAllocateFromZone(PZONE_HEADER Zone, PKSPIN_LOCK Lock);
|
);
|
||||||
PVOID ExInterlockedFreeToZone(PZONE_HEADER Zone, PVOID Block,
|
VOID
|
||||||
PKSPIN_LOCK Lock);
|
ExReinitializeResourceLite (
|
||||||
NTSTATUS ExInterlockedExtendZone(PZONE_HEADER Zone, PVOID Segment,
|
PERESOURCE Resource
|
||||||
ULONG SegmentSize, PKSPIN_LOCK Lock);
|
);
|
||||||
PSINGLE_LIST_ENTRY ExInterlockedPopEntryList(PSINGLE_LIST_ENTRY ListHead,
|
VOID
|
||||||
PKSPIN_LOCK Lock);
|
ExReleaseFastMutex (
|
||||||
PSINGLE_LIST_ENTRY ExInterlockedPushEntryList(PSINGLE_LIST_ENTRY ListHead,
|
PFAST_MUTEX Mutex
|
||||||
PSINGLE_LIST_ENTRY ListEntry,
|
);
|
||||||
PKSPIN_LOCK Lock);
|
VOID
|
||||||
PSINGLE_LIST_ENTRY ExInterlockedPushEntrySList(PSLIST_HEADER ListHead,
|
ExReleaseFastMutexUnsafe (
|
||||||
PSINGLE_LIST_ENTRY ListEntry,
|
PFAST_MUTEX Mutex
|
||||||
PKSPIN_LOCK Lock);
|
);
|
||||||
PSINGLE_LIST_ENTRY ExInterlockedPopEntrySList(PSLIST_HEADER ListHead,
|
VOID
|
||||||
PKSPIN_LOCK Lock);
|
ExReleaseResource (
|
||||||
BOOLEAN ExIsFullZone(PZONE_HEADER Zone);
|
PERESOURCE Resource
|
||||||
BOOLEAN ExIsObjectInFirstZoneSegment(PZONE_HEADER Zone, PVOID Object);
|
);
|
||||||
VOID ExLocalTimeToSystemTime(PLARGE_INTEGER LocalTime,
|
VOID
|
||||||
PLARGE_INTEGER SystemTime);
|
ExReleaseResourceForThread (
|
||||||
|
PERESOURCE Resource,
|
||||||
typedef unsigned int (exception_hook)(CONTEXT* c, unsigned int exp);
|
ERESOURCE_THREAD ResourceThreadId
|
||||||
unsigned int ExHookException(exception_hook fn, unsigned int exp);
|
);
|
||||||
|
VOID
|
||||||
INTERLOCKED_RESULT ExInterlockedDecrementLong(PLONG Addend,
|
ExReleaseResourceForThreadLite (
|
||||||
PKSPIN_LOCK Lock);
|
PERESOURCE Resource,
|
||||||
ULONG ExInterlockedExchangeUlong(PULONG Target,
|
ERESOURCE_THREAD ResourceThreadId
|
||||||
ULONG Value,
|
);
|
||||||
PKSPIN_LOCK Lock);
|
VOID
|
||||||
INTERLOCKED_RESULT ExInterlockedIncrementLong(PLONG Addend,
|
ExSystemTimeToLocalTime (
|
||||||
PKSPIN_LOCK Lock);
|
PLARGE_INTEGER SystemTime,
|
||||||
BOOLEAN ExIsResourceAcquiredExclusiveLite(PERESOURCE Resource);
|
PLARGE_INTEGER LocalTime
|
||||||
ULONG ExIsResourceAcquiredSharedLite(PERESOURCE Resource);
|
);
|
||||||
USHORT ExQueryDepthSListHead(PSLIST_HEADER SListHead);
|
BOOLEAN
|
||||||
|
ExTryToAcquireFastMutex (
|
||||||
|
PFAST_MUTEX FastMutex
|
||||||
|
);
|
||||||
|
BOOLEAN
|
||||||
|
ExTryToAcquireResourceExclusiveLite (
|
||||||
|
PERESOURCE Resource
|
||||||
|
);
|
||||||
|
/*
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedCompareExchange (
|
||||||
|
PLONG Target,
|
||||||
|
LONG Value,
|
||||||
|
LONG Reference
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
PVOID
|
||||||
|
FASTCALL
|
||||||
|
InterlockedCompareExchange (
|
||||||
|
PVOID * Destination,
|
||||||
|
PVOID Exchange,
|
||||||
|
PVOID Comperand
|
||||||
|
);
|
||||||
|
#ifdef _GNU_H_WINDOWS_H
|
||||||
|
#ifdef InterlockedDecrement
|
||||||
|
#undef InterlockedDecrement
|
||||||
|
#undef InterlockedExchange
|
||||||
|
#undef InterlockedExchangeAdd
|
||||||
|
#undef InterlockedIncrement
|
||||||
|
#endif /* def InterlockedDecrement */
|
||||||
|
#endif /* def _GNU_H_WINDOWS_H */
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedDecrement (
|
||||||
|
PLONG Addend
|
||||||
|
);
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedExchange (
|
||||||
|
PLONG Target,
|
||||||
|
LONG Value
|
||||||
|
);
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedExchangeAdd (
|
||||||
|
PLONG Addend,
|
||||||
|
LONG Value
|
||||||
|
);
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedIncrement (
|
||||||
|
PLONG Addend
|
||||||
|
);
|
||||||
|
/*---*/
|
||||||
|
PVOID
|
||||||
|
ExInterlockedAllocateFromZone (
|
||||||
|
PZONE_HEADER Zone,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
PVOID
|
||||||
|
ExInterlockedFreeToZone (
|
||||||
|
PZONE_HEADER Zone,
|
||||||
|
PVOID Block,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
NTSTATUS
|
||||||
|
ExInterlockedExtendZone (
|
||||||
|
PZONE_HEADER Zone,
|
||||||
|
PVOID Segment,
|
||||||
|
ULONG SegmentSize,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
PSINGLE_LIST_ENTRY
|
||||||
|
ExInterlockedPopEntryList (
|
||||||
|
PSINGLE_LIST_ENTRY ListHead,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
PSINGLE_LIST_ENTRY
|
||||||
|
ExInterlockedPushEntryList (
|
||||||
|
PSINGLE_LIST_ENTRY ListHead,
|
||||||
|
PSINGLE_LIST_ENTRY ListEntry,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
PSINGLE_LIST_ENTRY
|
||||||
|
ExInterlockedPushEntrySList (
|
||||||
|
PSLIST_HEADER ListHead,
|
||||||
|
PSINGLE_LIST_ENTRY ListEntry,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
PSINGLE_LIST_ENTRY
|
||||||
|
ExInterlockedPopEntrySList (
|
||||||
|
PSLIST_HEADER ListHead,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
BOOLEAN
|
||||||
|
ExIsFullZone (
|
||||||
|
PZONE_HEADER Zone
|
||||||
|
);
|
||||||
|
BOOLEAN
|
||||||
|
ExIsObjectInFirstZoneSegment (
|
||||||
|
PZONE_HEADER Zone,
|
||||||
|
PVOID Object
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
ExLocalTimeToSystemTime (
|
||||||
|
PLARGE_INTEGER LocalTime,
|
||||||
|
PLARGE_INTEGER SystemTime
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
unsigned int
|
||||||
|
(exception_hook) (
|
||||||
|
CONTEXT * c,
|
||||||
|
unsigned int exp
|
||||||
|
);
|
||||||
|
unsigned int
|
||||||
|
ExHookException (
|
||||||
|
exception_hook fn,
|
||||||
|
unsigned int exp
|
||||||
|
);
|
||||||
|
INTERLOCKED_RESULT
|
||||||
|
ExInterlockedDecrementLong (
|
||||||
|
PLONG Addend,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
ULONG
|
||||||
|
ExInterlockedExchangeUlong (
|
||||||
|
PULONG Target,
|
||||||
|
ULONG Value,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
INTERLOCKED_RESULT
|
||||||
|
ExInterlockedIncrementLong (
|
||||||
|
PLONG Addend,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
);
|
||||||
|
BOOLEAN
|
||||||
|
ExIsResourceAcquiredExclusiveLite (
|
||||||
|
PERESOURCE Resource
|
||||||
|
);
|
||||||
|
ULONG
|
||||||
|
ExIsResourceAcquiredSharedLite (
|
||||||
|
PERESOURCE Resource
|
||||||
|
);
|
||||||
|
USHORT
|
||||||
|
ExQueryDepthSListHead (
|
||||||
|
PSLIST_HEADER SListHead
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif /* ndef _NTOS_EXFUNCS_H */
|
||||||
|
|
|
@ -370,6 +370,7 @@ IoCreateNotificationEvent (
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
IoCreateSymbolicLink (
|
IoCreateSymbolicLink (
|
||||||
PUNICODE_STRING SymbolicLinkName,
|
PUNICODE_STRING SymbolicLinkName,
|
||||||
PUNICODE_STRING DeviceName
|
PUNICODE_STRING DeviceName
|
||||||
|
@ -382,6 +383,7 @@ IoCreateSynchronizationEvent (
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
IoCreateUnprotectedSymbolicLink (
|
IoCreateUnprotectedSymbolicLink (
|
||||||
PUNICODE_STRING SymbolicLinkName,
|
PUNICODE_STRING SymbolicLinkName,
|
||||||
PUNICODE_STRING DeviceName
|
PUNICODE_STRING DeviceName
|
||||||
|
@ -404,6 +406,7 @@ IoDeleteDevice (
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
IoDeleteSymbolicLink (
|
IoDeleteSymbolicLink (
|
||||||
PUNICODE_STRING SymbolicLinkName
|
PUNICODE_STRING SymbolicLinkName
|
||||||
);
|
);
|
||||||
|
|
|
@ -20,6 +20,11 @@ extern "C"
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
/* GCC can not handle __fastcall */
|
||||||
|
#ifndef FASTCALL
|
||||||
|
#define FASTCALL STDCALL
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <internal/id.h>
|
#include <internal/id.h>
|
||||||
#include <ddk/status.h>
|
#include <ddk/status.h>
|
||||||
#include <ddk/ntdef.h>
|
#include <ddk/ntdef.h>
|
||||||
|
|
|
@ -200,6 +200,7 @@ RtlCharToInteger (
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlCheckRegistryKey (
|
RtlCheckRegistryKey (
|
||||||
ULONG RelativeTo,
|
ULONG RelativeTo,
|
||||||
PWSTR Path
|
PWSTR Path
|
||||||
|
@ -263,6 +264,7 @@ RtlCopyUnicodeString (
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlCreateRegistryKey (
|
RtlCreateRegistryKey (
|
||||||
ULONG RelativeTo,
|
ULONG RelativeTo,
|
||||||
PWSTR Path
|
PWSTR Path
|
||||||
|
@ -275,6 +277,7 @@ RtlCreateSecurityDescriptor (
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlDeleteRegistryValue (
|
RtlDeleteRegistryValue (
|
||||||
ULONG RelativeTo,
|
ULONG RelativeTo,
|
||||||
PWSTR Path,
|
PWSTR Path,
|
||||||
|
@ -575,6 +578,7 @@ RtlMoveMemory (
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlQueryRegistryValues (
|
RtlQueryRegistryValues (
|
||||||
ULONG RelativeTo,
|
ULONG RelativeTo,
|
||||||
PWSTR Path,
|
PWSTR Path,
|
||||||
|
@ -713,6 +717,7 @@ RtlValidSecurityDescriptor (
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlWriteRegistryValue (
|
RtlWriteRegistryValue (
|
||||||
ULONG RelativeTo,
|
ULONG RelativeTo,
|
||||||
PWSTR Path,
|
PWSTR Path,
|
||||||
|
@ -768,6 +773,7 @@ RtlUnlockHeap (
|
||||||
);
|
);
|
||||||
|
|
||||||
UINT
|
UINT
|
||||||
|
STDCALL
|
||||||
RtlCompactHeap (
|
RtlCompactHeap (
|
||||||
HANDLE hheap,
|
HANDLE hheap,
|
||||||
DWORD flags
|
DWORD flags
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: zw.h,v 1.17 1999/07/22 21:29:46 ekohl Exp $
|
/* $Id: zw.h,v 1.18 1999/08/29 06:58:59 ea Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -4143,21 +4143,21 @@ ZwSetHighWaitLowEventPair(
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
NtSetInformationFile(
|
NtSetInformationFile(
|
||||||
IN HANDLE FileHandle,
|
IN HANDLE FileHandle,
|
||||||
IN PIO_STATUS_BLOCK IoStatusBlock,
|
IN PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
IN PVOID FileInformation,
|
IN PVOID FileInformation,
|
||||||
IN ULONG Length,
|
IN ULONG Length,
|
||||||
IN FILE_INFORMATION_CLASS FileInformationClass
|
IN FILE_INFORMATION_CLASS FileInformationClass
|
||||||
);
|
);
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
ZwSetInformationFile(
|
ZwSetInformationFile(
|
||||||
IN HANDLE FileHandle,
|
IN HANDLE FileHandle,
|
||||||
IN PIO_STATUS_BLOCK IoStatusBlock,
|
IN PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
IN PVOID FileInformation,
|
IN PVOID FileInformation,
|
||||||
IN ULONG Length,
|
IN ULONG Length,
|
||||||
IN FILE_INFORMATION_CLASS FileInformationClass
|
IN FILE_INFORMATION_CLASS FileInformationClass
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,36 @@
|
||||||
VOID WINAPI __RtlInitHeap(PVOID base, ULONG minsize, ULONG maxsize);
|
VOID
|
||||||
|
WINAPI
|
||||||
|
__RtlInitHeap (
|
||||||
|
PVOID base,
|
||||||
|
ULONG minsize,
|
||||||
|
ULONG maxsize
|
||||||
|
);
|
||||||
|
|
||||||
#define HEAP_BASE (0xa0000000)
|
#define HEAP_BASE (0xa0000000)
|
||||||
|
|
||||||
VOID RtlDeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
VOID
|
||||||
VOID RtlEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
RtlDeleteCriticalSection (
|
||||||
VOID RtlInitializeCriticalSection(LPCRITICAL_SECTION pcritical);
|
LPCRITICAL_SECTION lpCriticalSection
|
||||||
VOID RtlLeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
);
|
||||||
WINBOOL RtlTryEntryCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
|
VOID
|
||||||
DWORD WINAPI RtlCompactHeap( HANDLE heap, DWORD flags );
|
RtlEnterCriticalSection (
|
||||||
|
LPCRITICAL_SECTION lpCriticalSection
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
RtlInitializeCriticalSection (
|
||||||
|
LPCRITICAL_SECTION pcritical
|
||||||
|
);
|
||||||
|
VOID
|
||||||
|
RtlLeaveCriticalSection (
|
||||||
|
LPCRITICAL_SECTION lpCriticalSection
|
||||||
|
);
|
||||||
|
WINBOOL
|
||||||
|
RtlTryEntryCriticalSection (
|
||||||
|
LPCRITICAL_SECTION lpCriticalSection
|
||||||
|
);
|
||||||
|
UINT
|
||||||
|
STDCALL
|
||||||
|
RtlCompactHeap (
|
||||||
|
HANDLE heap,
|
||||||
|
DWORD flags
|
||||||
|
);
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#define RES_UINT_FV_MINOR 0
|
#define RES_UINT_FV_MINOR 0
|
||||||
#define RES_UINT_FV_REVISION 14
|
#define RES_UINT_FV_REVISION 14
|
||||||
/* Build number as YYYYMMDD */
|
/* Build number as YYYYMMDD */
|
||||||
#define RES_UINT_FV_BUILD 19990717
|
#define RES_UINT_FV_BUILD 19990828
|
||||||
|
|
||||||
/* ReactOS Product Version UINTs */
|
/* ReactOS Product Version UINTs */
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: find.c,v 1.21 1999/08/29 06:59:01 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
* FILE: lib/kernel32/file/find.c
|
* FILE: lib/kernel32/file/find.c
|
||||||
|
@ -178,7 +179,10 @@ HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName,
|
||||||
return(IData);
|
return(IData);
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE FindFirstFileA(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData)
|
|
||||||
|
HANDLE
|
||||||
|
STDCALL
|
||||||
|
FindFirstFileA(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData)
|
||||||
{
|
{
|
||||||
WCHAR lpFileNameW[MAX_PATH];
|
WCHAR lpFileNameW[MAX_PATH];
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
@ -227,7 +231,10 @@ HANDLE FindFirstFileA(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData)
|
||||||
return(IData);
|
return(IData);
|
||||||
}
|
}
|
||||||
|
|
||||||
WINBOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
|
||||||
{
|
{
|
||||||
PWIN32_FIND_DATA_ASCII Ret;
|
PWIN32_FIND_DATA_ASCII Ret;
|
||||||
PKERNEL32_FIND_FILE_DATA IData;
|
PKERNEL32_FIND_FILE_DATA IData;
|
||||||
|
@ -265,7 +272,10 @@ WINBOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL FindClose(HANDLE hFindFile)
|
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
FindClose(HANDLE hFindFile)
|
||||||
{
|
{
|
||||||
PKERNEL32_FIND_FILE_DATA IData;
|
PKERNEL32_FIND_FILE_DATA IData;
|
||||||
|
|
||||||
|
@ -282,8 +292,13 @@ BOOL FindClose(HANDLE hFindFile)
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE STDCALL FindFirstFileW(LPCWSTR lpFileName,
|
|
||||||
LPWIN32_FIND_DATA lpFindFileData)
|
HANDLE
|
||||||
|
STDCALL
|
||||||
|
FindFirstFileW (
|
||||||
|
LPCWSTR lpFileName,
|
||||||
|
LPWIN32_FIND_DATA lpFindFileData
|
||||||
|
)
|
||||||
{
|
{
|
||||||
PWIN32_FIND_DATA_UNICODE Ret;
|
PWIN32_FIND_DATA_UNICODE Ret;
|
||||||
PKERNEL32_FIND_FILE_DATA IData;
|
PKERNEL32_FIND_FILE_DATA IData;
|
||||||
|
@ -299,8 +314,13 @@ HANDLE STDCALL FindFirstFileW(LPCWSTR lpFileName,
|
||||||
return(IData);
|
return(IData);
|
||||||
}
|
}
|
||||||
|
|
||||||
WINBOOL STDCALL FindNextFileW(HANDLE hFindFile,
|
|
||||||
LPWIN32_FIND_DATA lpFindFileData)
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
FindNextFileW (
|
||||||
|
HANDLE hFindFile,
|
||||||
|
LPWIN32_FIND_DATA lpFindFileData
|
||||||
|
)
|
||||||
{
|
{
|
||||||
PWIN32_FIND_DATA_UNICODE Ret;
|
PWIN32_FIND_DATA_UNICODE Ret;
|
||||||
PKERNEL32_FIND_FILE_DATA IData;
|
PKERNEL32_FIND_FILE_DATA IData;
|
||||||
|
@ -320,3 +340,6 @@ WINBOOL STDCALL FindNextFileW(HANDLE hFindFile,
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: lfile.c,v 1.4 1999/08/29 06:59:01 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
* FILE: lib/kernel32/file/lfile.c
|
* FILE: lib/kernel32/file/lfile.c
|
||||||
|
@ -16,67 +17,104 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
long _hread(
|
long
|
||||||
HFILE hFile,
|
STDCALL
|
||||||
LPVOID lpBuffer,
|
_hread(
|
||||||
long lBytes
|
HFILE hFile,
|
||||||
)
|
LPVOID lpBuffer,
|
||||||
|
long lBytes
|
||||||
|
)
|
||||||
{
|
{
|
||||||
DWORD NumberOfBytesRead;
|
DWORD NumberOfBytesRead;
|
||||||
if ( ReadFile((HANDLE)hFile,(LPVOID)lpBuffer,(DWORD)lBytes,&NumberOfBytesRead, NULL) == FALSE )
|
|
||||||
|
if (ReadFile(
|
||||||
|
(HANDLE) hFile,
|
||||||
|
(LPVOID) lpBuffer,
|
||||||
|
(DWORD) lBytes,
|
||||||
|
& NumberOfBytesRead,
|
||||||
|
NULL
|
||||||
|
) == FALSE)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
else
|
|
||||||
return NumberOfBytesRead;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT STDCALL _lread(HFILE fd,LPVOID buffer,UINT count)
|
|
||||||
{
|
|
||||||
return _hread(fd,buffer, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
long _hwrite(
|
|
||||||
HFILE hFile,
|
|
||||||
LPCSTR lpBuffer,
|
|
||||||
long lBytes
|
|
||||||
)
|
|
||||||
{
|
|
||||||
|
|
||||||
DWORD NumberOfBytesWritten;
|
|
||||||
if ( lBytes == 0 ) {
|
|
||||||
if ( SetEndOfFile((HANDLE) hFile ) == FALSE )
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
if ( WriteFile((HANDLE)hFile,(LPVOID)lpBuffer,(DWORD)lBytes, &NumberOfBytesWritten,NULL) == FALSE )
|
return NumberOfBytesRead;
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
return NumberOfBytesWritten;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
//19990828.EA: aliased in DEF
|
||||||
|
UINT
|
||||||
|
STDCALL
|
||||||
|
_lread (
|
||||||
|
HFILE fd,
|
||||||
|
LPVOID buffer,
|
||||||
|
UINT count
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return _hread(
|
||||||
|
fd,
|
||||||
|
buffer,
|
||||||
|
count
|
||||||
|
);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
long
|
||||||
|
STDCALL
|
||||||
|
_hwrite (
|
||||||
|
HFILE hFile,
|
||||||
|
LPCSTR lpBuffer,
|
||||||
|
long lBytes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DWORD NumberOfBytesWritten;
|
||||||
|
|
||||||
|
if (lBytes == 0)
|
||||||
|
{
|
||||||
|
if ( SetEndOfFile((HANDLE) hFile ) == FALSE )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ( WriteFile(
|
||||||
|
(HANDLE) hFile,
|
||||||
|
(LPVOID) lpBuffer,
|
||||||
|
(DWORD) lBytes,
|
||||||
|
& NumberOfBytesWritten,
|
||||||
|
NULL
|
||||||
|
) == FALSE )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return NumberOfBytesWritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
//19990828.EA: aliased in DEF
|
||||||
|
|
||||||
UINT
|
UINT
|
||||||
STDCALL
|
STDCALL
|
||||||
_lwrite(
|
_lwrite(
|
||||||
HFILE hFile,
|
HFILE hFile,
|
||||||
LPCSTR lpBuffer,
|
LPCSTR lpBuffer,
|
||||||
UINT uBytes
|
UINT uBytes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return _hwrite(hFile,lpBuffer,uBytes);
|
return _hwrite(hFile,lpBuffer,uBytes);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
HFILE
|
||||||
|
STDCALL
|
||||||
|
_lopen (
|
||||||
HFILE _lopen( LPCSTR lpPathName, int iReadWrite )
|
LPCSTR lpPathName,
|
||||||
|
int iReadWrite
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DWORD dwAccessMask = 0;
|
DWORD dwAccessMask = 0;
|
||||||
DWORD dwShareMode = 0;
|
DWORD dwShareMode = 0;
|
||||||
|
|
||||||
|
@ -87,31 +125,39 @@ HFILE _lopen( LPCSTR lpPathName, int iReadWrite )
|
||||||
else if ( (iReadWrite & OF_WRITE ) == OF_WRITE )
|
else if ( (iReadWrite & OF_WRITE ) == OF_WRITE )
|
||||||
dwAccessMask = GENERIC_WRITE;
|
dwAccessMask = GENERIC_WRITE;
|
||||||
|
|
||||||
|
if ((iReadWrite & OF_SHARE_COMPAT) == OF_SHARE_COMPAT )
|
||||||
|
dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE;
|
||||||
|
else if ((iReadWrite & OF_SHARE_DENY_NONE) == OF_SHARE_DENY_NONE)
|
||||||
|
dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE;
|
||||||
if ((iReadWrite & OF_SHARE_COMPAT) == OF_SHARE_COMPAT )
|
else if ((iReadWrite & OF_SHARE_DENY_READ) == OF_SHARE_DENY_READ)
|
||||||
dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE;
|
dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_DELETE;
|
||||||
else if ((iReadWrite & OF_SHARE_DENY_NONE) == OF_SHARE_DENY_NONE)
|
else if ((iReadWrite & OF_SHARE_DENY_WRITE) == OF_SHARE_DENY_WRITE )
|
||||||
dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE;
|
dwShareMode = FILE_SHARE_READ | FILE_SHARE_DELETE;
|
||||||
else if ((iReadWrite & OF_SHARE_DENY_READ) == OF_SHARE_DENY_READ)
|
else if ((iReadWrite & OF_SHARE_EXCLUSIVE) == OF_SHARE_EXCLUSIVE)
|
||||||
dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_DELETE;
|
dwShareMode = 0;
|
||||||
else if ((iReadWrite & OF_SHARE_DENY_WRITE) == OF_SHARE_DENY_WRITE )
|
|
||||||
dwShareMode = FILE_SHARE_READ | FILE_SHARE_DELETE;
|
|
||||||
else if ((iReadWrite & OF_SHARE_EXCLUSIVE) == OF_SHARE_EXCLUSIVE)
|
|
||||||
dwShareMode = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SetLastError(0);
|
SetLastError(0);
|
||||||
return (HFILE) CreateFileA( lpPathName,dwAccessMask,dwShareMode,
|
return (HFILE) CreateFileA(
|
||||||
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
|
lpPathName,
|
||||||
|
dwAccessMask,
|
||||||
|
dwShareMode,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HFILE _lcreat( LPCSTR lpPathName, int iAttribute )
|
HFILE
|
||||||
|
STDCALL
|
||||||
|
_lcreat (
|
||||||
|
LPCSTR lpPathName,
|
||||||
|
int iAttribute
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
DWORD FileAttributes = 0;
|
DWORD FileAttributes = 0;
|
||||||
|
@ -125,28 +171,47 @@ HFILE _lcreat( LPCSTR lpPathName, int iAttribute )
|
||||||
else if ( iAttribute == 4 )
|
else if ( iAttribute == 4 )
|
||||||
FileAttributes |= FILE_ATTRIBUTE_SYSTEM;
|
FileAttributes |= FILE_ATTRIBUTE_SYSTEM;
|
||||||
|
|
||||||
return(HFILE) CreateFileA( lpPathName,GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,
|
return (HFILE) CreateFileA(
|
||||||
NULL,CREATE_ALWAYS,iAttribute ,NULL);
|
lpPathName,
|
||||||
|
GENERIC_ALL,
|
||||||
|
(FILE_SHARE_READ | FILE_SHARE_WRITE),
|
||||||
|
NULL,
|
||||||
|
CREATE_ALWAYS,
|
||||||
|
iAttribute,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int _lclose(
|
int
|
||||||
HFILE hFile
|
STDCALL
|
||||||
)
|
_lclose (
|
||||||
|
HFILE hFile
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if ( CloseHandle((HANDLE)hFile) )
|
if ( CloseHandle((HANDLE)hFile) )
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
else
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LONG _llseek(
|
|
||||||
HFILE hFile,
|
LONG
|
||||||
LONG lOffset,
|
STDCALL
|
||||||
int iOrigin
|
_llseek(
|
||||||
)
|
HFILE hFile,
|
||||||
|
LONG lOffset,
|
||||||
|
int iOrigin
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return SetFilePointer((HANDLE) hFile, lOffset, NULL,(DWORD)iOrigin );
|
return SetFilePointer(
|
||||||
|
(HANDLE) hFile,
|
||||||
|
lOffset,
|
||||||
|
NULL,
|
||||||
|
(DWORD) iOrigin
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: kernel32.edf,v 1.1 1999/07/17 23:10:20 ea Exp $
|
; $Id: kernel32.edf,v 1.2 1999/08/29 06:59:01 ea Exp $
|
||||||
;
|
;
|
||||||
; kernel32.edf
|
; kernel32.edf
|
||||||
;
|
;
|
||||||
|
@ -649,8 +649,8 @@ _lclose=_lclose@4
|
||||||
_lcreat=_lcreat@8
|
_lcreat=_lcreat@8
|
||||||
_llseek=_llseek@12
|
_llseek=_llseek@12
|
||||||
_lopen=_lopen@8
|
_lopen=_lopen@8
|
||||||
_lread=_lread@12
|
_lread=_hread@12
|
||||||
_lwrite=_lwrite@12
|
_lwrite=_hwrite@12
|
||||||
lstrcat=lstrcatA@8
|
lstrcat=lstrcatA@8
|
||||||
lstrcatA=lstrcatA@8
|
lstrcatA=lstrcatA@8
|
||||||
lstrcatW=lstrcatW@8
|
lstrcatW=lstrcatW@8
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: heap.c,v 1.15 1999/08/29 06:59:01 ea Exp $
|
||||||
|
*
|
||||||
* kernel/heap.c
|
* kernel/heap.c
|
||||||
* Copyright (C) 1996, Onno Hovers, All rights reserved
|
* Copyright (C) 1996, Onno Hovers, All rights reserved
|
||||||
*
|
*
|
||||||
|
@ -117,9 +118,17 @@ BOOL WINAPI HeapUnlock(HANDLE hheap)
|
||||||
* NT uses this function to compact moveable blocks and other things *
|
* NT uses this function to compact moveable blocks and other things *
|
||||||
* Here it does not compact, but it finds the largest free region *
|
* Here it does not compact, but it finds the largest free region *
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
UINT HeapCompact(HANDLE hheap, DWORD flags)
|
UINT
|
||||||
|
STDCALL
|
||||||
|
HeapCompact (
|
||||||
|
HANDLE hheap,
|
||||||
|
DWORD flags
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return(RtlCompactHeap(hheap, flags));
|
return RtlCompactHeap(
|
||||||
|
hheap,
|
||||||
|
flags
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
|
@ -140,3 +149,5 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem)
|
||||||
return(RtlValidateHeap(hheap, flags, (PVOID)pmem));
|
return(RtlValidateHeap(hheap, flags, (PVOID)pmem));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
/* $Id: error.c,v 1.11 1999/08/29 06:59:02 ea Exp $
|
||||||
|
*
|
||||||
|
* reactos/lib/kernel32/misc/error.c
|
||||||
|
*
|
||||||
|
*/
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <ddk/ntddbeep.h>
|
#include <ddk/ntddbeep.h>
|
||||||
|
@ -9,26 +14,39 @@
|
||||||
static DWORD LastError=0;
|
static DWORD LastError=0;
|
||||||
|
|
||||||
|
|
||||||
VOID SetLastError(DWORD dwErrorCode)
|
VOID
|
||||||
|
STDCALL
|
||||||
|
SetLastError (
|
||||||
|
DWORD dwErrorCode
|
||||||
|
)
|
||||||
{
|
{
|
||||||
LastError = dwErrorCode;
|
/* FIXME: it is per thread */
|
||||||
|
LastError = dwErrorCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD GetLastError(VOID)
|
DWORD
|
||||||
|
STDCALL
|
||||||
|
GetLastError (VOID)
|
||||||
{
|
{
|
||||||
return(LastError);
|
/* FIXME: it is per thread */
|
||||||
|
return LastError;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL __ErrorReturnFalse(ULONG ErrorCode)
|
|
||||||
|
BOOL
|
||||||
|
__ErrorReturnFalse (ULONG ErrorCode)
|
||||||
{
|
{
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
PVOID __ErrorReturnNull(ULONG ErrorCode)
|
|
||||||
|
PVOID
|
||||||
|
__ErrorReturnNull (ULONG ErrorCode)
|
||||||
{
|
{
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WINBOOL
|
WINBOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
Beep (DWORD dwFreq, DWORD dwDuration)
|
Beep (DWORD dwFreq, DWORD dwDuration)
|
||||||
|
@ -65,3 +83,5 @@ Beep (DWORD dwFreq, DWORD dwDuration)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/* $Id: stubs.c,v 1.2 1999/07/17 23:10:20 ea Exp $
|
/* $Id: stubs.c,v 1.3 1999/08/29 06:59:03 ea Exp $
|
||||||
|
*
|
||||||
* KERNEL32.DLL stubs (unimplemented functions)
|
* KERNEL32.DLL stubs (unimplemented functions)
|
||||||
* Remove from this file, if you implement them.
|
* Remove from this file, if you implement them.
|
||||||
*/
|
*/
|
||||||
|
@ -3443,17 +3444,6 @@ RegisterConsoleVDM (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WINBOOL
|
|
||||||
STDCALL
|
|
||||||
RegisterWaitForInputIdle (
|
|
||||||
DWORD Unknown0
|
|
||||||
)
|
|
||||||
{
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
WINBOOL
|
WINBOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
RegisterWowBaseHandlers (
|
RegisterWowBaseHandlers (
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: lib.c,v 1.3 1999/08/29 06:59:03 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
* FILE: lib/kernel32/proc/proc.c
|
* FILE: lib/kernel32/proc/proc.c
|
||||||
|
@ -23,20 +24,37 @@
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
HINSTANCE LoadLibraryW(LPCWSTR lpLibFileName)
|
HINSTANCE
|
||||||
|
STDCALL
|
||||||
|
LoadLibraryW (
|
||||||
|
LPCWSTR lpLibFileName
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
HINSTANCE LoadLibraryA(LPCSTR lpLibFileName)
|
|
||||||
|
HINSTANCE
|
||||||
|
STDCALL
|
||||||
|
LoadLibraryA (
|
||||||
|
LPCSTR lpLibFileName
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL STDCALL FreeLibrary(HMODULE hLibModule)
|
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
FreeLibrary (
|
||||||
|
HMODULE hLibModule
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: proc.c,v 1.19 1999/08/29 06:59:03 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
* FILE: lib/kernel32/proc/proc.c
|
* FILE: lib/kernel32/proc/proc.c
|
||||||
|
@ -49,44 +50,79 @@ typedef struct _WSTARTUPINFO {
|
||||||
|
|
||||||
WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle;
|
WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle;
|
||||||
|
|
||||||
VOID RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle);
|
VOID
|
||||||
|
STDCALL
|
||||||
|
RegisterWaitForInputIdle (
|
||||||
|
WaitForInputIdleType lpfnRegisterWaitForInputIdle
|
||||||
|
);
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
WINBOOL STDCALL GetProcessId(HANDLE hProcess, LPDWORD lpProcessId);
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
GetProcessId (
|
||||||
|
HANDLE hProcess,
|
||||||
|
LPDWORD lpProcessId
|
||||||
|
);
|
||||||
|
|
||||||
FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName)
|
|
||||||
|
FARPROC
|
||||||
|
STDCALL
|
||||||
|
GetProcAddress (
|
||||||
|
HMODULE hModule,
|
||||||
|
LPCSTR lpProcName
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return(NULL);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
WINBOOL STDCALL GetProcessTimes(HANDLE hProcess,
|
|
||||||
LPFILETIME lpCreationTime,
|
WINBOOL
|
||||||
LPFILETIME lpExitTime,
|
STDCALL
|
||||||
LPFILETIME lpKernelTime,
|
GetProcessTimes (
|
||||||
LPFILETIME lpUserTime)
|
HANDLE hProcess,
|
||||||
|
LPFILETIME lpCreationTime,
|
||||||
|
LPFILETIME lpExitTime,
|
||||||
|
LPFILETIME lpKernelTime,
|
||||||
|
LPFILETIME lpUserTime
|
||||||
|
)
|
||||||
{
|
{
|
||||||
dprintf("GetProcessTimes is unimplemented\n");
|
dprintf("GetProcessTimes is unimplemented\n");
|
||||||
return(FALSE);
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE STDCALL GetCurrentProcess(VOID)
|
|
||||||
|
HANDLE
|
||||||
|
STDCALL
|
||||||
|
GetCurrentProcess (VOID)
|
||||||
{
|
{
|
||||||
return (HANDLE)NtCurrentProcess();
|
return (HANDLE) NtCurrentProcess();
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE STDCALL GetCurrentThread(VOID)
|
|
||||||
|
HANDLE
|
||||||
|
STDCALL
|
||||||
|
GetCurrentThread (VOID)
|
||||||
{
|
{
|
||||||
return (HANDLE)NtCurrentThread();
|
return (HANDLE) NtCurrentThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD STDCALL GetCurrentProcessId(VOID)
|
|
||||||
|
DWORD
|
||||||
|
STDCALL
|
||||||
|
GetCurrentProcessId (VOID)
|
||||||
{
|
{
|
||||||
return (DWORD)(GetTeb()->Cid).UniqueProcess;
|
return (DWORD) (GetTeb()->Cid).UniqueProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
WINBOOL STDCALL GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode)
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
GetExitCodeProcess (
|
||||||
|
HANDLE hProcess,
|
||||||
|
LPDWORD lpExitCode
|
||||||
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS errCode;
|
NTSTATUS errCode;
|
||||||
PROCESS_BASIC_INFORMATION ProcessBasic;
|
PROCESS_BASIC_INFORMATION ProcessBasic;
|
||||||
|
@ -106,7 +142,13 @@ WINBOOL STDCALL GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
WINBOOL STDCALL GetProcessId(HANDLE hProcess, LPDWORD lpProcessId )
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
GetProcessId (
|
||||||
|
HANDLE hProcess,
|
||||||
|
LPDWORD lpProcessId
|
||||||
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS errCode;
|
NTSTATUS errCode;
|
||||||
PROCESS_BASIC_INFORMATION ProcessBasic;
|
PROCESS_BASIC_INFORMATION ProcessBasic;
|
||||||
|
@ -126,7 +168,13 @@ WINBOOL STDCALL GetProcessId(HANDLE hProcess, LPDWORD lpProcessId )
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
PWSTR InternalAnsiToUnicode(PWSTR Out, LPCSTR In, ULONG MaxLength)
|
|
||||||
|
PWSTR
|
||||||
|
InternalAnsiToUnicode (
|
||||||
|
PWSTR Out,
|
||||||
|
LPCSTR In,
|
||||||
|
ULONG MaxLength
|
||||||
|
)
|
||||||
{
|
{
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
|
||||||
|
@ -148,9 +196,14 @@ PWSTR InternalAnsiToUnicode(PWSTR Out, LPCSTR In, ULONG MaxLength)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE STDCALL OpenProcess(DWORD dwDesiredAccess,
|
|
||||||
WINBOOL bInheritHandle,
|
HANDLE
|
||||||
DWORD dwProcessId)
|
STDCALL
|
||||||
|
OpenProcess (
|
||||||
|
DWORD dwDesiredAccess,
|
||||||
|
WINBOOL bInheritHandle,
|
||||||
|
DWORD dwProcessId
|
||||||
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS errCode;
|
NTSTATUS errCode;
|
||||||
HANDLE ProcessHandle;
|
HANDLE ProcessHandle;
|
||||||
|
@ -183,7 +236,13 @@ HANDLE STDCALL OpenProcess(DWORD dwDesiredAccess,
|
||||||
return ProcessHandle;
|
return ProcessHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT WinExec (LPCSTR lpCmdLine, UINT uCmdShow)
|
|
||||||
|
UINT
|
||||||
|
STDCALL
|
||||||
|
WinExec (
|
||||||
|
LPCSTR lpCmdLine,
|
||||||
|
UINT uCmdShow
|
||||||
|
)
|
||||||
{
|
{
|
||||||
STARTUPINFO StartupInfo;
|
STARTUPINFO StartupInfo;
|
||||||
PROCESS_INFORMATION ProcessInformation;
|
PROCESS_INFORMATION ProcessInformation;
|
||||||
|
@ -217,27 +276,45 @@ UINT WinExec (LPCSTR lpCmdLine, UINT uCmdShow)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VOID
|
||||||
VOID RegisterWaitForInputIdle(WaitForInputIdleType
|
STDCALL
|
||||||
lpfnRegisterWaitForInputIdle)
|
RegisterWaitForInputIdle (
|
||||||
|
WaitForInputIdleType lpfnRegisterWaitForInputIdle
|
||||||
|
)
|
||||||
{
|
{
|
||||||
lpfnGlobalRegisterWaitForInputIdle = lpfnRegisterWaitForInputIdle;
|
lpfnGlobalRegisterWaitForInputIdle = lpfnRegisterWaitForInputIdle;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD STDCALL WaitForInputIdle(HANDLE hProcess,
|
|
||||||
DWORD dwMilliseconds)
|
DWORD
|
||||||
|
STDCALL
|
||||||
|
WaitForInputIdle (
|
||||||
|
HANDLE hProcess,
|
||||||
|
DWORD dwMilliseconds
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID STDCALL Sleep(DWORD dwMilliseconds)
|
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
Sleep (
|
||||||
|
DWORD dwMilliseconds
|
||||||
|
)
|
||||||
{
|
{
|
||||||
SleepEx(dwMilliseconds,FALSE);
|
SleepEx (dwMilliseconds, FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD STDCALL SleepEx(DWORD dwMilliseconds, BOOL bAlertable)
|
|
||||||
|
DWORD
|
||||||
|
STDCALL
|
||||||
|
SleepEx (
|
||||||
|
DWORD dwMilliseconds,
|
||||||
|
BOOL bAlertable
|
||||||
|
)
|
||||||
{
|
{
|
||||||
TIME Interval;
|
TIME Interval;
|
||||||
NTSTATUS errCode;
|
NTSTATUS errCode;
|
||||||
|
@ -245,14 +322,20 @@ DWORD STDCALL SleepEx(DWORD dwMilliseconds, BOOL bAlertable)
|
||||||
Interval.QuadPart = dwMilliseconds * 1000;
|
Interval.QuadPart = dwMilliseconds * 1000;
|
||||||
|
|
||||||
errCode = NtDelayExecution(bAlertable,&Interval);
|
errCode = NtDelayExecution(bAlertable,&Interval);
|
||||||
if ( !NT_SUCCESS(errCode) ) {
|
if ( !NT_SUCCESS(errCode) )
|
||||||
|
{
|
||||||
SetLastError(RtlNtStatusToDosError(errCode));
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID STDCALL GetStartupInfoW(LPSTARTUPINFO _lpStartupInfo)
|
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
GetStartupInfoW (
|
||||||
|
LPSTARTUPINFO _lpStartupInfo
|
||||||
|
)
|
||||||
{
|
{
|
||||||
NT_PEB *pPeb = NtCurrentPeb();
|
NT_PEB *pPeb = NtCurrentPeb();
|
||||||
LPWSTARTUPINFO lpStartupInfo = (LPWSTARTUPINFO)_lpStartupInfo;
|
LPWSTARTUPINFO lpStartupInfo = (LPWSTARTUPINFO)_lpStartupInfo;
|
||||||
|
@ -305,7 +388,11 @@ VOID STDCALL GetStartupInfoW(LPSTARTUPINFO _lpStartupInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID STDCALL GetStartupInfoA(LPSTARTUPINFO lpStartupInfo)
|
VOID
|
||||||
|
STDCALL
|
||||||
|
GetStartupInfoA (
|
||||||
|
LPSTARTUPINFO lpStartupInfo
|
||||||
|
)
|
||||||
{
|
{
|
||||||
NT_PEB *pPeb = NtCurrentPeb();
|
NT_PEB *pPeb = NtCurrentPeb();
|
||||||
ULONG i = 0;
|
ULONG i = 0;
|
||||||
|
@ -355,26 +442,50 @@ VOID STDCALL GetStartupInfoA(LPSTARTUPINFO lpStartupInfo)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL STDCALL FlushInstructionCache(HANDLE hProcess,
|
|
||||||
LPCVOID lpBaseAddress,
|
BOOL
|
||||||
DWORD dwSize)
|
STDCALL
|
||||||
|
FlushInstructionCache (
|
||||||
|
HANDLE hProcess,
|
||||||
|
LPCVOID lpBaseAddress,
|
||||||
|
DWORD dwSize
|
||||||
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS errCode;
|
NTSTATUS errCode;
|
||||||
errCode = NtFlushInstructionCache(hProcess,(PVOID)lpBaseAddress,dwSize);
|
|
||||||
if (!NT_SUCCESS(errCode))
|
errCode = NtFlushInstructionCache(
|
||||||
{
|
hProcess,
|
||||||
SetLastError(RtlNtStatusToDosError(errCode));
|
(PVOID) lpBaseAddress,
|
||||||
return FALSE;
|
dwSize
|
||||||
}
|
);
|
||||||
return TRUE;
|
if (!NT_SUCCESS(errCode))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID STDCALL ExitProcess(UINT uExitCode)
|
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
ExitProcess (
|
||||||
|
UINT uExitCode
|
||||||
|
)
|
||||||
{
|
{
|
||||||
NtTerminateProcess(NtCurrentProcess(), uExitCode);
|
NtTerminateProcess(
|
||||||
|
NtCurrentProcess(),
|
||||||
|
uExitCode
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
WINBOOL STDCALL TerminateProcess(HANDLE hProcess, UINT uExitCode)
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
TerminateProcess (
|
||||||
|
HANDLE hProcess,
|
||||||
|
UINT uExitCode
|
||||||
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS errCode;
|
NTSTATUS errCode;
|
||||||
errCode = NtTerminateProcess(hProcess, uExitCode);
|
errCode = NtTerminateProcess(hProcess, uExitCode);
|
||||||
|
@ -386,7 +497,12 @@ WINBOOL STDCALL TerminateProcess(HANDLE hProcess, UINT uExitCode)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID STDCALL FatalAppExitA(UINT uAction, LPCSTR lpMessageText)
|
VOID
|
||||||
|
STDCALL
|
||||||
|
FatalAppExitA (
|
||||||
|
UINT uAction,
|
||||||
|
LPCSTR lpMessageText
|
||||||
|
)
|
||||||
{
|
{
|
||||||
WCHAR MessageTextW[MAX_PATH];
|
WCHAR MessageTextW[MAX_PATH];
|
||||||
UINT i;
|
UINT i;
|
||||||
|
@ -404,7 +520,15 @@ VOID STDCALL FatalAppExitA(UINT uAction, LPCSTR lpMessageText)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VOID STDCALL FatalAppExitW(UINT uAction, LPCWSTR lpMessageText)
|
VOID
|
||||||
|
STDCALL
|
||||||
|
FatalAppExitW (
|
||||||
|
UINT uAction,
|
||||||
|
LPCWSTR lpMessageText
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: critical.c,v 1.5 1999/08/29 06:59:03 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
* FILE: lib/kernel32/sync/critical.c
|
* FILE: lib/kernel32/sync/critical.c
|
||||||
|
@ -15,29 +16,46 @@
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID InitializeCriticalSection(LPCRITICAL_SECTION pcritical)
|
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
InitializeCriticalSection(LPCRITICAL_SECTION pcritical)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
WINBOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
; $Id: ntdll.def,v 1.13 1999/08/29 06:59:04 ea Exp $
|
||||||
|
;
|
||||||
|
; ReactOS Operating System
|
||||||
|
;
|
||||||
EXPORTS
|
EXPORTS
|
||||||
InitializeObjectAttributes
|
InitializeObjectAttributes
|
||||||
NtAcceptConnectPort@24
|
NtAcceptConnectPort@24
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
; $Id: ntdll.edf,v 1.4 1999/08/29 06:59:04 ea Exp $
|
||||||
|
;
|
||||||
|
; ReactOS Operating System
|
||||||
|
;
|
||||||
EXPORTS
|
EXPORTS
|
||||||
InitializeObjectAttributes
|
InitializeObjectAttributes
|
||||||
NtAcceptConnectPort=NtAcceptConnectPort@24
|
NtAcceptConnectPort=NtAcceptConnectPort@24
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: startup.c,v 1.9 1999/08/29 06:59:04 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: lib/ntdll/ldr/startup.c
|
* FILE: lib/ntdll/ldr/startup.c
|
||||||
|
@ -9,6 +10,7 @@
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
|
#include <reactos/config.h>
|
||||||
#define WIN32_NO_PEHDR
|
#define WIN32_NO_PEHDR
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
|
@ -18,7 +20,9 @@
|
||||||
#include <ntdll/ldr.h>
|
#include <ntdll/ldr.h>
|
||||||
#include <ntdll/rtl.h>
|
#include <ntdll/rtl.h>
|
||||||
|
|
||||||
|
#ifndef DBG_NTDLL_LDR_STARTUP
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
|
#endif
|
||||||
#include <ntdll/ntdll.h>
|
#include <ntdll/ntdll.h>
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
@ -30,8 +34,11 @@ extern HANDLE __ProcessHeap;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
NTSTATUS LdrMapNTDllForProcess(HANDLE ProcessHandle,
|
NTSTATUS
|
||||||
PHANDLE PtrNTDllSectionHandle)
|
LdrMapNTDllForProcess (
|
||||||
|
HANDLE ProcessHandle,
|
||||||
|
PHANDLE PtrNTDllSectionHandle
|
||||||
|
)
|
||||||
{
|
{
|
||||||
ULONG InitialViewSize;
|
ULONG InitialViewSize;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -125,3 +132,6 @@ VOID LdrStartup(HANDLE SectionHandle,
|
||||||
Status = EntryPoint();
|
Status = EntryPoint();
|
||||||
ZwTerminateProcess(NtCurrentProcess(),Status);
|
ZwTerminateProcess(NtCurrentProcess(),Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: registry.c,v 1.18 1999/08/29 06:59:05 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/cm/registry.c
|
* FILE: ntoskrnl/cm/registry.c
|
||||||
|
@ -363,13 +364,16 @@ CHECKPOINT;
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NtCreateKey(OUT PHANDLE KeyHandle,
|
STDCALL
|
||||||
IN ACCESS_MASK DesiredAccess,
|
NtCreateKey (
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
OUT PHANDLE KeyHandle,
|
||||||
IN ULONG TitleIndex,
|
IN ACCESS_MASK DesiredAccess,
|
||||||
IN PUNICODE_STRING Class,
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
IN ULONG CreateOptions,
|
IN ULONG TitleIndex,
|
||||||
OUT PULONG Disposition)
|
IN PUNICODE_STRING Class,
|
||||||
|
IN ULONG CreateOptions,
|
||||||
|
OUT PULONG Disposition
|
||||||
|
)
|
||||||
{
|
{
|
||||||
#if PROTO_REG
|
#if PROTO_REG
|
||||||
PWSTR KeyNameBuf;
|
PWSTR KeyNameBuf;
|
||||||
|
@ -455,7 +459,10 @@ NtCreateKey(OUT PHANDLE KeyHandle,
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NtDeleteKey(IN HANDLE KeyHandle)
|
STDCALL
|
||||||
|
NtDeleteKey (
|
||||||
|
IN HANDLE KeyHandle
|
||||||
|
)
|
||||||
{
|
{
|
||||||
#ifdef PROTO_REG
|
#ifdef PROTO_REG
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -489,12 +496,15 @@ NtDeleteKey(IN HANDLE KeyHandle)
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NtEnumerateKey(IN HANDLE KeyHandle,
|
STDCALL
|
||||||
IN ULONG Index,
|
NtEnumerateKey (
|
||||||
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
IN HANDLE KeyHandle,
|
||||||
OUT PVOID KeyInformation,
|
IN ULONG Index,
|
||||||
IN ULONG Length,
|
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
||||||
OUT PULONG ResultLength)
|
OUT PVOID KeyInformation,
|
||||||
|
IN ULONG Length,
|
||||||
|
OUT PULONG ResultLength
|
||||||
|
)
|
||||||
{
|
{
|
||||||
#ifdef PROTO_REG
|
#ifdef PROTO_REG
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -637,7 +647,9 @@ NtEnumerateKey(IN HANDLE KeyHandle,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtEnumerateValueKey (
|
NtEnumerateValueKey (
|
||||||
IN HANDLE KeyHandle,
|
IN HANDLE KeyHandle,
|
||||||
IN ULONG Index,
|
IN ULONG Index,
|
||||||
|
@ -654,8 +666,12 @@ NtEnumerateValueKey (
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NtFlushKey(IN HANDLE KeyHandle)
|
STDCALL
|
||||||
|
NtFlushKey (
|
||||||
|
IN HANDLE KeyHandle
|
||||||
|
)
|
||||||
{
|
{
|
||||||
#ifdef PROTO_REG
|
#ifdef PROTO_REG
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
@ -664,10 +680,14 @@ NtFlushKey(IN HANDLE KeyHandle)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NtOpenKey(OUT PHANDLE KeyHandle,
|
STDCALL
|
||||||
IN ACCESS_MASK DesiredAccess,
|
NtOpenKey (
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
OUT PHANDLE KeyHandle,
|
||||||
|
IN ACCESS_MASK DesiredAccess,
|
||||||
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
||||||
|
)
|
||||||
{
|
{
|
||||||
#ifdef PROTO_REG
|
#ifdef PROTO_REG
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -757,7 +777,9 @@ NtOpenKey(OUT PHANDLE KeyHandle,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtQueryKey (
|
NtQueryKey (
|
||||||
IN HANDLE KeyHandle,
|
IN HANDLE KeyHandle,
|
||||||
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
||||||
|
@ -895,7 +917,9 @@ NtQueryKey (
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtQueryValueKey (
|
NtQueryValueKey (
|
||||||
IN HANDLE KeyHandle,
|
IN HANDLE KeyHandle,
|
||||||
IN PUNICODE_STRING ValueName,
|
IN PUNICODE_STRING ValueName,
|
||||||
|
@ -1024,7 +1048,9 @@ NtQueryValueKey (
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtSetValueKey (
|
NtSetValueKey (
|
||||||
IN HANDLE KeyHandle,
|
IN HANDLE KeyHandle,
|
||||||
IN PUNICODE_STRING ValueName,
|
IN PUNICODE_STRING ValueName,
|
||||||
|
@ -1088,7 +1114,8 @@ NtSetValueKey (
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtDeleteValueKey (
|
NtDeleteValueKey (
|
||||||
IN HANDLE KeyHandle,
|
IN HANDLE KeyHandle,
|
||||||
IN PUNICODE_STRING ValueName
|
IN PUNICODE_STRING ValueName
|
||||||
|
@ -1246,6 +1273,7 @@ NtInitializeRegistry (
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlCheckRegistryKey (
|
RtlCheckRegistryKey (
|
||||||
ULONG RelativeTo,
|
ULONG RelativeTo,
|
||||||
PWSTR Path
|
PWSTR Path
|
||||||
|
@ -1256,6 +1284,7 @@ RtlCheckRegistryKey (
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlCreateRegistryKey (
|
RtlCreateRegistryKey (
|
||||||
IN ULONG RelativeTo,
|
IN ULONG RelativeTo,
|
||||||
IN PWSTR Path
|
IN PWSTR Path
|
||||||
|
@ -1266,6 +1295,7 @@ RtlCreateRegistryKey (
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlDeleteRegistryValue (
|
RtlDeleteRegistryValue (
|
||||||
IN ULONG RelativeTo,
|
IN ULONG RelativeTo,
|
||||||
IN PWSTR Path,
|
IN PWSTR Path,
|
||||||
|
@ -1277,6 +1307,7 @@ RtlDeleteRegistryValue (
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlQueryRegistryValues (
|
RtlQueryRegistryValues (
|
||||||
IN ULONG RelativeTo,
|
IN ULONG RelativeTo,
|
||||||
IN PWSTR Path,
|
IN PWSTR Path,
|
||||||
|
@ -1290,6 +1321,7 @@ RtlQueryRegistryValues (
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
RtlWriteRegistryValue (
|
RtlWriteRegistryValue (
|
||||||
ULONG RelativeTo,
|
ULONG RelativeTo,
|
||||||
PWSTR Path,
|
PWSTR Path,
|
||||||
|
@ -2690,4 +2722,4 @@ CmiReleaseBlock(PREGISTRY_FILE RegistryFile,
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: interlck.c,v 1.2 1999/08/29 06:59:06 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ex/interlck.c
|
* FILE: ntoskrnl/ex/interlck.c
|
||||||
|
@ -16,28 +17,46 @@
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
INTERLOCKED_RESULT ExInterlockedDecrementLong(PLONG Addend,
|
INTERLOCKED_RESULT
|
||||||
PKSPIN_LOCK Lock)
|
ExInterlockedDecrementLong (
|
||||||
|
PLONG Addend,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG ExInterlockedExchangeUlong(PULONG Target,
|
|
||||||
ULONG Value,
|
ULONG
|
||||||
PKSPIN_LOCK Lock)
|
ExInterlockedExchangeUlong (
|
||||||
|
PULONG Target,
|
||||||
|
ULONG Value,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG ExInterlockedAddUlong(PULONG Addend,
|
|
||||||
ULONG Increment,
|
ULONG
|
||||||
PKSPIN_LOCK Lock)
|
ExInterlockedAddUlong (
|
||||||
|
PULONG Addend,
|
||||||
|
ULONG Increment,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERLOCKED_RESULT ExInterlockedIncrementLong(PLONG Addend,
|
|
||||||
PKSPIN_LOCK Lock)
|
INTERLOCKED_RESULT
|
||||||
|
ExInterlockedIncrementLong (
|
||||||
|
PLONG Addend,
|
||||||
|
PKSPIN_LOCK Lock
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: device.c,v 1.10 1999/08/29 06:59:06 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/io/device.c
|
* FILE: ntoskrnl/io/device.c
|
||||||
|
@ -33,20 +34,32 @@ NtUnloadDriver (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtLoadDriver
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* Loads a device driver.
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* DriverServiceName
|
||||||
|
* Name of the service to load (registry key).
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* Status.
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtLoadDriver (
|
NtLoadDriver (
|
||||||
PUNICODE_STRING DriverServiceName
|
PUNICODE_STRING DriverServiceName
|
||||||
)
|
)
|
||||||
/*
|
|
||||||
* FUNCTION: Loads a driver
|
|
||||||
* ARGUMENTS:
|
|
||||||
* DriverServiceName = Name of the service to load (registry key)
|
|
||||||
* RETURNS: Status
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
IoAttachDeviceByPointer (
|
IoAttachDeviceByPointer (
|
||||||
PDEVICE_OBJECT SourceDevice,
|
PDEVICE_OBJECT SourceDevice,
|
||||||
|
@ -307,3 +320,6 @@ NTSTATUS IoCreateDevice(PDRIVER_OBJECT DriverObject,
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: file.c,v 1.9 1999/08/29 06:59:06 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/io/file.c
|
* FILE: ntoskrnl/io/file.c
|
||||||
|
@ -89,7 +90,9 @@ NtQueryInformationFile (
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtSetInformationFile (
|
NtSetInformationFile (
|
||||||
HANDLE FileHandle,
|
HANDLE FileHandle,
|
||||||
PIO_STATUS_BLOCK IoStatusBlock,
|
PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
|
@ -98,65 +101,100 @@ NtSetInformationFile (
|
||||||
FILE_INFORMATION_CLASS FileInformationClass
|
FILE_INFORMATION_CLASS FileInformationClass
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PIO_STACK_LOCATION StackPtr;
|
PIO_STACK_LOCATION StackPtr;
|
||||||
KEVENT Event;
|
KEVENT Event;
|
||||||
|
|
||||||
DPRINT("NtSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
|
DPRINT(
|
||||||
FileHandle,
|
"NtSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
|
||||||
IoStatusBlock,
|
FileHandle,
|
||||||
FileInformation,
|
IoStatusBlock,
|
||||||
Length,
|
FileInformation,
|
||||||
FileInformationClass);
|
Length,
|
||||||
|
FileInformationClass
|
||||||
|
);
|
||||||
|
|
||||||
/* Get the file object from the file handle */
|
/* Get the file object from the file handle */
|
||||||
Status = ObReferenceObjectByHandle(FileHandle,
|
Status = ObReferenceObjectByHandle(
|
||||||
FILE_WRITE_ATTRIBUTES,
|
FileHandle,
|
||||||
IoFileType,
|
FILE_WRITE_ATTRIBUTES,
|
||||||
UserMode,
|
IoFileType,
|
||||||
(PVOID *) &FileObject,
|
UserMode,
|
||||||
NULL);
|
(PVOID *) & FileObject,
|
||||||
if (!NT_SUCCESS(Status))
|
NULL
|
||||||
{
|
);
|
||||||
return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
}
|
{
|
||||||
DPRINT("FileObject %x\n", FileObject);
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("FileObject %x\n", FileObject);
|
||||||
|
|
||||||
/* initialize an event object to wait on for the request */
|
/*
|
||||||
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
* Initialize an event object to wait
|
||||||
|
* on for the request.
|
||||||
|
*/
|
||||||
|
KeInitializeEvent(
|
||||||
|
& Event,
|
||||||
|
NotificationEvent,
|
||||||
|
FALSE
|
||||||
|
);
|
||||||
|
/*
|
||||||
|
* Build the IRP to be sent to the driver
|
||||||
|
* for the request.
|
||||||
|
*/
|
||||||
|
Irp = IoBuildSynchronousFsdRequest(
|
||||||
|
IRP_MJ_SET_INFORMATION,
|
||||||
|
FileObject->DeviceObject,
|
||||||
|
FileInformation,
|
||||||
|
Length,
|
||||||
|
0,
|
||||||
|
& Event,
|
||||||
|
IoStatusBlock
|
||||||
|
);
|
||||||
|
|
||||||
/* build the IRP to be sent to the driver for the request */
|
StackPtr = IoGetNextIrpStackLocation(Irp);
|
||||||
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SET_INFORMATION,
|
StackPtr->FileObject = FileObject;
|
||||||
FileObject->DeviceObject,
|
StackPtr->Parameters.SetFile.Length = Length;
|
||||||
FileInformation,
|
StackPtr->Parameters.SetFile.FileInformationClass =
|
||||||
Length,
|
FileInformationClass;
|
||||||
0,
|
|
||||||
&Event,
|
|
||||||
IoStatusBlock);
|
|
||||||
StackPtr = IoGetNextIrpStackLocation(Irp);
|
|
||||||
StackPtr->FileObject = FileObject;
|
|
||||||
StackPtr->Parameters.SetFile.Length = Length;
|
|
||||||
StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;
|
|
||||||
|
|
||||||
/* Pass the IRP to the FSD (and wait for it if required) */
|
/*
|
||||||
DPRINT("FileObject->DeviceObject %x\n", FileObject->DeviceObject);
|
* Pass the IRP to the FSD (and wait for
|
||||||
Status = IoCallDriver(FileObject->DeviceObject, Irp);
|
* it if required)
|
||||||
if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
|
*/
|
||||||
{
|
DPRINT("FileObject->DeviceObject %x\n", FileObject->DeviceObject);
|
||||||
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
|
Status = IoCallDriver(
|
||||||
Status = Irp->IoStatus.Status;
|
FileObject->DeviceObject,
|
||||||
}
|
Irp
|
||||||
|
);
|
||||||
|
if ( (Status == STATUS_PENDING)
|
||||||
|
&& (FileObject->Flags & FO_SYNCHRONOUS_IO)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
KeWaitForSingleObject(
|
||||||
|
& Event,
|
||||||
|
Executive,
|
||||||
|
KernelMode,
|
||||||
|
FALSE,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
Status = Irp->IoStatus.Status;
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
PGENERIC_MAPPING IoGetFileObjectGenericMapping(VOID)
|
|
||||||
|
PGENERIC_MAPPING
|
||||||
|
IoGetFileObjectGenericMapping(VOID)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
NtQueryAttributesFile (
|
NtQueryAttributesFile (
|
||||||
|
@ -210,3 +248,4 @@ NtSetEaFile (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: rw.c,v 1.26 1999/08/29 06:59:06 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/io/rw.c
|
* FILE: ntoskrnl/io/rw.c
|
||||||
|
@ -21,7 +22,22 @@
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtReadFile
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtReadFile (
|
NtReadFile (
|
||||||
HANDLE FileHandle,
|
HANDLE FileHandle,
|
||||||
HANDLE EventHandle,
|
HANDLE EventHandle,
|
||||||
|
@ -34,94 +50,142 @@ NtReadFile (
|
||||||
PULONG Key
|
PULONG Key
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PIO_STACK_LOCATION StackPtr;
|
PIO_STACK_LOCATION StackPtr;
|
||||||
PKEVENT ptrEvent = NULL;
|
PKEVENT ptrEvent = NULL;
|
||||||
KEVENT Event;
|
KEVENT Event;
|
||||||
|
|
||||||
DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
|
DPRINT(
|
||||||
"IoStatusBlock %x)\n",
|
"NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
|
||||||
FileHandle,Buffer,Length,ByteOffset,IoStatusBlock);
|
"IoStatusBlock %x)\n",
|
||||||
|
FileHandle,
|
||||||
|
Buffer,
|
||||||
|
Length,
|
||||||
|
ByteOffset,
|
||||||
|
IoStatusBlock
|
||||||
|
);
|
||||||
|
|
||||||
assert_irql(PASSIVE_LEVEL);
|
assert_irql(PASSIVE_LEVEL);
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(FileHandle,
|
Status = ObReferenceObjectByHandle(
|
||||||
FILE_READ_DATA,
|
FileHandle,
|
||||||
IoFileType,
|
FILE_READ_DATA,
|
||||||
UserMode,
|
IoFileType,
|
||||||
(PVOID *) &FileObject,
|
UserMode,
|
||||||
NULL);
|
(PVOID *) & FileObject,
|
||||||
if (!NT_SUCCESS(Status))
|
NULL
|
||||||
{
|
);
|
||||||
DPRINT("NtReadFile() = %x\n",Status);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("ByteOffset %x FileObject->CurrentByteOffset %d\n",
|
|
||||||
ByteOffset,
|
|
||||||
FileObject->CurrentByteOffset.LowPart);
|
|
||||||
if (ByteOffset==NULL)
|
|
||||||
{
|
|
||||||
ByteOffset = &(FileObject->CurrentByteOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (EventHandle != NULL)
|
|
||||||
{
|
|
||||||
Status = ObReferenceObjectByHandle(EventHandle,
|
|
||||||
SYNCHRONIZE,
|
|
||||||
ExEventType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID *)ptrEvent,
|
|
||||||
NULL);
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
return(Status);
|
DPRINT("NtReadFile() = %x\n",Status);
|
||||||
}
|
return Status;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
DPRINT(
|
||||||
KeInitializeEvent(&Event,NotificationEvent,FALSE);
|
"ByteOffset %x FileObject->CurrentByteOffset %d\n",
|
||||||
ptrEvent = &Event;
|
ByteOffset,
|
||||||
}
|
FileObject->CurrentByteOffset.LowPart
|
||||||
|
);
|
||||||
|
if (ByteOffset == NULL)
|
||||||
|
{
|
||||||
|
ByteOffset = & (FileObject->CurrentByteOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EventHandle != NULL)
|
||||||
|
{
|
||||||
|
Status = ObReferenceObjectByHandle(
|
||||||
|
EventHandle,
|
||||||
|
SYNCHRONIZE,
|
||||||
|
ExEventType,
|
||||||
|
UserMode,
|
||||||
|
(PVOID *) ptrEvent,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KeInitializeEvent(
|
||||||
|
& Event,
|
||||||
|
NotificationEvent,
|
||||||
|
FALSE
|
||||||
|
);
|
||||||
|
ptrEvent = & Event;
|
||||||
|
}
|
||||||
|
|
||||||
DPRINT("FileObject %x\n",FileObject);
|
DPRINT("FileObject %x\n",FileObject);
|
||||||
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
|
|
||||||
FileObject->DeviceObject,
|
Irp = IoBuildSynchronousFsdRequest(
|
||||||
Buffer,
|
IRP_MJ_READ,
|
||||||
Length,
|
FileObject->DeviceObject,
|
||||||
ByteOffset,
|
Buffer,
|
||||||
ptrEvent,
|
Length,
|
||||||
IoStatusBlock);
|
ByteOffset,
|
||||||
|
ptrEvent,
|
||||||
|
IoStatusBlock
|
||||||
|
);
|
||||||
|
|
||||||
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
|
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
|
||||||
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
|
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
|
||||||
|
|
||||||
StackPtr = IoGetNextIrpStackLocation(Irp);
|
StackPtr = IoGetNextIrpStackLocation(Irp);
|
||||||
StackPtr->FileObject = FileObject;
|
StackPtr->FileObject = FileObject;
|
||||||
if (Key!=NULL)
|
if (Key != NULL)
|
||||||
{
|
{
|
||||||
StackPtr->Parameters.Read.Key = *Key;
|
StackPtr->Parameters.Read.Key = *Key;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
StackPtr->Parameters.Read.Key = 0;
|
StackPtr->Parameters.Read.Key = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = IoCallDriver(FileObject->DeviceObject, Irp);
|
Status = IoCallDriver(
|
||||||
if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
|
FileObject->DeviceObject,
|
||||||
{
|
Irp
|
||||||
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
|
);
|
||||||
Status = IoStatusBlock->Status;
|
if (
|
||||||
}
|
(Status == STATUS_PENDING)
|
||||||
DPRINT("NtReadFile() = %x\n",Status);
|
&& (FileObject->Flags & FO_SYNCHRONOUS_IO)
|
||||||
assert_irql(PASSIVE_LEVEL);
|
)
|
||||||
return(Status);
|
{
|
||||||
|
KeWaitForSingleObject(
|
||||||
|
& Event,
|
||||||
|
Executive,
|
||||||
|
KernelMode,
|
||||||
|
FALSE,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
Status = IoStatusBlock->Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("NtReadFile() = %x\n",Status);
|
||||||
|
|
||||||
|
assert_irql(PASSIVE_LEVEL);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtWriteFile
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtWriteFile (
|
NtWriteFile (
|
||||||
HANDLE FileHandle,
|
HANDLE FileHandle,
|
||||||
HANDLE EventHandle,
|
HANDLE EventHandle,
|
||||||
|
@ -134,63 +198,101 @@ NtWriteFile (
|
||||||
PULONG Key
|
PULONG Key
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
PIO_STACK_LOCATION StackPtr;
|
PIO_STACK_LOCATION StackPtr;
|
||||||
KEVENT Event;
|
KEVENT Event;
|
||||||
|
|
||||||
DPRINT("NtWriteFile(FileHandle %x, Buffer %x, Length %d)\n",
|
DPRINT(
|
||||||
FileHandle,Buffer,Length);
|
"NtWriteFile(FileHandle %x, Buffer %x, Length %d)\n",
|
||||||
|
FileHandle,
|
||||||
|
Buffer,
|
||||||
|
Length
|
||||||
|
);
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(FileHandle,
|
Status = ObReferenceObjectByHandle(
|
||||||
FILE_WRITE_DATA,
|
FileHandle,
|
||||||
IoFileType,
|
FILE_WRITE_DATA,
|
||||||
UserMode,
|
IoFileType,
|
||||||
(PVOID *) &FileObject,
|
UserMode,
|
||||||
NULL);
|
(PVOID *) & FileObject,
|
||||||
if (!NT_SUCCESS(Status))
|
NULL
|
||||||
{
|
);
|
||||||
return(Status);
|
if (!NT_SUCCESS(Status))
|
||||||
}
|
{
|
||||||
if (ByteOffset==NULL)
|
return Status;
|
||||||
{
|
}
|
||||||
ByteOffset = &(FileObject->CurrentByteOffset);
|
if (ByteOffset == NULL)
|
||||||
}
|
{
|
||||||
|
ByteOffset = & (FileObject->CurrentByteOffset);
|
||||||
|
}
|
||||||
|
|
||||||
KeInitializeEvent(&Event,NotificationEvent,FALSE);
|
KeInitializeEvent(
|
||||||
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
|
& Event,
|
||||||
FileObject->DeviceObject,
|
NotificationEvent,
|
||||||
Buffer,
|
FALSE
|
||||||
Length,
|
);
|
||||||
ByteOffset,
|
Irp = IoBuildSynchronousFsdRequest(
|
||||||
&Event,
|
IRP_MJ_WRITE,
|
||||||
IoStatusBlock);
|
FileObject->DeviceObject,
|
||||||
|
Buffer,
|
||||||
|
Length,
|
||||||
|
ByteOffset,
|
||||||
|
& Event,
|
||||||
|
IoStatusBlock
|
||||||
|
);
|
||||||
|
|
||||||
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
|
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
|
||||||
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
|
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
|
||||||
|
|
||||||
DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject);
|
DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject);
|
||||||
StackPtr = IoGetNextIrpStackLocation(Irp);
|
|
||||||
StackPtr->FileObject = FileObject;
|
StackPtr = IoGetNextIrpStackLocation(Irp);
|
||||||
if (Key!=NULL)
|
StackPtr->FileObject = FileObject;
|
||||||
{
|
if (Key != NULL)
|
||||||
StackPtr->Parameters.Write.Key = *Key;
|
{
|
||||||
}
|
StackPtr->Parameters.Write.Key = *Key;
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
StackPtr->Parameters.Write.Key = 0;
|
{
|
||||||
}
|
StackPtr->Parameters.Write.Key = 0;
|
||||||
Status = IoCallDriver(FileObject->DeviceObject,Irp);
|
}
|
||||||
if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
|
Status = IoCallDriver(
|
||||||
{
|
FileObject->DeviceObject,
|
||||||
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
|
Irp
|
||||||
Status = Irp->IoStatus.Status;
|
);
|
||||||
}
|
if (
|
||||||
return(Status);
|
(Status == STATUS_PENDING)
|
||||||
|
&& (FileObject->Flags & FO_SYNCHRONOUS_IO)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
KeWaitForSingleObject(
|
||||||
|
& Event,
|
||||||
|
Executive,
|
||||||
|
KernelMode,
|
||||||
|
FALSE,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
Status = Irp->IoStatus.Status;
|
||||||
|
}
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtReadFileScatter
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
NtReadFileScatter (
|
NtReadFileScatter (
|
||||||
|
@ -209,6 +311,19 @@ NtReadFileScatter (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtWriteFileGather
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
NtWriteFileGather (
|
NtWriteFileGather (
|
||||||
|
@ -225,3 +340,6 @@ NtWriteFileGather (
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: symlink.c,v 1.9 1999/08/29 06:59:08 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/io/symlink.c
|
* FILE: ntoskrnl/io/symlink.c
|
||||||
|
@ -19,197 +20,400 @@
|
||||||
|
|
||||||
/* GLOBALS ******************************************************************/
|
/* GLOBALS ******************************************************************/
|
||||||
|
|
||||||
typedef struct
|
typedef
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
CSHORT Type;
|
CSHORT Type;
|
||||||
CSHORT Size;
|
CSHORT Size;
|
||||||
UNICODE_STRING TargetName;
|
UNICODE_STRING TargetName;
|
||||||
OBJECT_ATTRIBUTES Target;
|
OBJECT_ATTRIBUTES Target;
|
||||||
|
|
||||||
} SYMLNK_OBJECT, *PSYMLNK_OBJECT;
|
} SYMLNK_OBJECT, *PSYMLNK_OBJECT;
|
||||||
|
|
||||||
POBJECT_TYPE IoSymbolicLinkType = NULL;
|
|
||||||
|
POBJECT_TYPE
|
||||||
|
IoSymbolicLinkType = NULL;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
NTSTATUS IopCreateSymbolicLink(PVOID Object,
|
|
||||||
PVOID Parent,
|
|
||||||
PWSTR RemainingPath,
|
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
|
||||||
{
|
|
||||||
if (Parent != NULL && RemainingPath != NULL)
|
|
||||||
{
|
|
||||||
ObAddEntryDirectory(Parent, Object, RemainingPath+1);
|
|
||||||
}
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
PVOID IopParseSymbolicLink(PVOID Object,
|
|
||||||
PWSTR* RemainingPath)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
PSYMLNK_OBJECT SymlinkObject = (PSYMLNK_OBJECT)Object;
|
|
||||||
PVOID ReturnedObject;
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByName(SymlinkObject->Target.ObjectName,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
STANDARD_RIGHTS_REQUIRED,
|
|
||||||
NULL,
|
|
||||||
UserMode,
|
|
||||||
NULL,
|
|
||||||
&ReturnedObject);
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(ReturnedObject);
|
|
||||||
}
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID IoInitSymbolicLinkImplementation(VOID)
|
|
||||||
{
|
|
||||||
ANSI_STRING AnsiString;
|
|
||||||
|
|
||||||
IoSymbolicLinkType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
|
||||||
|
|
||||||
IoSymbolicLinkType->TotalObjects = 0;
|
|
||||||
IoSymbolicLinkType->TotalHandles = 0;
|
|
||||||
IoSymbolicLinkType->MaxObjects = ULONG_MAX;
|
|
||||||
IoSymbolicLinkType->MaxHandles = ULONG_MAX;
|
|
||||||
IoSymbolicLinkType->PagedPoolCharge = 0;
|
|
||||||
IoSymbolicLinkType->NonpagedPoolCharge = sizeof(SYMLNK_OBJECT);
|
|
||||||
IoSymbolicLinkType->Dump = NULL;
|
|
||||||
IoSymbolicLinkType->Open = NULL;
|
|
||||||
IoSymbolicLinkType->Close = NULL;
|
|
||||||
IoSymbolicLinkType->Delete = NULL;
|
|
||||||
IoSymbolicLinkType->Parse = IopParseSymbolicLink;
|
|
||||||
IoSymbolicLinkType->Security = NULL;
|
|
||||||
IoSymbolicLinkType->QueryName = NULL;
|
|
||||||
IoSymbolicLinkType->OkayToClose = NULL;
|
|
||||||
IoSymbolicLinkType->Create = IopCreateSymbolicLink;
|
|
||||||
|
|
||||||
RtlInitAnsiString(&AnsiString,"Symbolic Link");
|
|
||||||
RtlAnsiStringToUnicodeString(&IoSymbolicLinkType->TypeName,
|
|
||||||
&AnsiString,TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME INTERNAL
|
||||||
|
* IopCreateSymbolicLink
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURNN VALUE
|
||||||
|
* Status.
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
IopCreateSymbolicLink (
|
||||||
|
PVOID Object,
|
||||||
|
PVOID Parent,
|
||||||
|
PWSTR RemainingPath,
|
||||||
|
POBJECT_ATTRIBUTES ObjectAttributes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if ( (Parent != NULL)
|
||||||
|
&& (RemainingPath != NULL)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ObAddEntryDirectory(
|
||||||
|
Parent,
|
||||||
|
Object,
|
||||||
|
RemainingPath + 1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME INTERNAL
|
||||||
|
* IopParseSymbolicLink
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURNN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*/
|
||||||
|
PVOID
|
||||||
|
IopParseSymbolicLink (
|
||||||
|
PVOID Object,
|
||||||
|
PWSTR * RemainingPath
|
||||||
|
)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
PSYMLNK_OBJECT SymlinkObject = (PSYMLNK_OBJECT) Object;
|
||||||
|
PVOID ReturnedObject;
|
||||||
|
|
||||||
|
Status = ObReferenceObjectByName(
|
||||||
|
SymlinkObject->Target.ObjectName,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
STANDARD_RIGHTS_REQUIRED,
|
||||||
|
NULL,
|
||||||
|
UserMode,
|
||||||
|
NULL,
|
||||||
|
& ReturnedObject
|
||||||
|
);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return ReturnedObject;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME INTERNAL
|
||||||
|
* IoInitSymbolicLinkImplementation
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* None.
|
||||||
|
*
|
||||||
|
* RETURNN VALUE
|
||||||
|
* None.
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
IoInitSymbolicLinkImplementation (VOID)
|
||||||
|
{
|
||||||
|
ANSI_STRING AnsiString;
|
||||||
|
|
||||||
|
IoSymbolicLinkType = ExAllocatePool(
|
||||||
|
NonPagedPool,
|
||||||
|
sizeof (OBJECT_TYPE)
|
||||||
|
);
|
||||||
|
|
||||||
|
IoSymbolicLinkType->TotalObjects = 0;
|
||||||
|
IoSymbolicLinkType->TotalHandles = 0;
|
||||||
|
IoSymbolicLinkType->MaxObjects = ULONG_MAX;
|
||||||
|
IoSymbolicLinkType->MaxHandles = ULONG_MAX;
|
||||||
|
IoSymbolicLinkType->PagedPoolCharge = 0;
|
||||||
|
IoSymbolicLinkType->NonpagedPoolCharge = sizeof (SYMLNK_OBJECT);
|
||||||
|
IoSymbolicLinkType->Dump = NULL;
|
||||||
|
IoSymbolicLinkType->Open = NULL;
|
||||||
|
IoSymbolicLinkType->Close = NULL;
|
||||||
|
IoSymbolicLinkType->Delete = NULL;
|
||||||
|
IoSymbolicLinkType->Parse = IopParseSymbolicLink;
|
||||||
|
IoSymbolicLinkType->Security = NULL;
|
||||||
|
IoSymbolicLinkType->QueryName = NULL;
|
||||||
|
IoSymbolicLinkType->OkayToClose = NULL;
|
||||||
|
IoSymbolicLinkType->Create = IopCreateSymbolicLink;
|
||||||
|
|
||||||
|
RtlInitAnsiString(
|
||||||
|
& AnsiString,
|
||||||
|
"Symbolic Link"
|
||||||
|
);
|
||||||
|
RtlAnsiStringToUnicodeString(
|
||||||
|
& IoSymbolicLinkType->TypeName,
|
||||||
|
& AnsiString,
|
||||||
|
TRUE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtOpenSymbolicLinkObject
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtOpenSymbolicLinkObject (
|
NtOpenSymbolicLinkObject (
|
||||||
OUT PHANDLE LinkHandle,
|
OUT PHANDLE LinkHandle,
|
||||||
IN ACCESS_MASK DesiredAccess,
|
IN ACCESS_MASK DesiredAccess,
|
||||||
IN POBJECT_ATTRIBUTES ObjectAttributes
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PVOID Object;
|
PVOID Object;
|
||||||
|
|
||||||
Status = ObReferenceObjectByName(ObjectAttributes->ObjectName,
|
Status = ObReferenceObjectByName(
|
||||||
ObjectAttributes->Attributes,
|
ObjectAttributes->ObjectName,
|
||||||
NULL,
|
ObjectAttributes->Attributes,
|
||||||
DesiredAccess,
|
NULL,
|
||||||
NULL,
|
DesiredAccess,
|
||||||
UserMode,
|
NULL,
|
||||||
NULL,
|
UserMode,
|
||||||
&Object);
|
NULL,
|
||||||
if (!NT_SUCCESS(Status))
|
& Object
|
||||||
{
|
);
|
||||||
return(Status);
|
if (!NT_SUCCESS(Status))
|
||||||
}
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
Status = ObCreateHandle(PsGetCurrentProcess(),
|
Status = ObCreateHandle(
|
||||||
Object,
|
PsGetCurrentProcess(),
|
||||||
DesiredAccess,
|
Object,
|
||||||
FALSE,
|
DesiredAccess,
|
||||||
LinkHandle);
|
FALSE,
|
||||||
if (!NT_SUCCESS(Status))
|
LinkHandle
|
||||||
{
|
);
|
||||||
return(Status);
|
if (!NT_SUCCESS(Status))
|
||||||
}
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtQuerySymbolicLinkObject
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtQuerySymbolicLinkObject (
|
NtQuerySymbolicLinkObject (
|
||||||
IN HANDLE LinkHandle,
|
IN HANDLE LinkHandle,
|
||||||
IN OUT PUNICODE_STRING LinkTarget,
|
IN OUT PUNICODE_STRING LinkTarget,
|
||||||
OUT PULONG ReturnedLength OPTIONAL
|
OUT PULONG ReturnedLength OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PSYMLNK_OBJECT SymlinkObject;
|
PSYMLNK_OBJECT SymlinkObject;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(LinkHandle,
|
Status = ObReferenceObjectByHandle(
|
||||||
SYMBOLIC_LINK_QUERY,
|
LinkHandle,
|
||||||
IoSymbolicLinkType,
|
SYMBOLIC_LINK_QUERY,
|
||||||
UserMode,
|
IoSymbolicLinkType,
|
||||||
(PVOID*)&SymlinkObject,
|
UserMode,
|
||||||
NULL);
|
(PVOID *) & SymlinkObject,
|
||||||
if (Status != STATUS_SUCCESS)
|
NULL
|
||||||
{
|
);
|
||||||
return(Status);
|
if (Status != STATUS_SUCCESS)
|
||||||
}
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
RtlCopyUnicodeString(LinkTarget,SymlinkObject->Target.ObjectName);
|
RtlCopyUnicodeString(
|
||||||
if (ReturnedLength!=NULL)
|
LinkTarget,
|
||||||
{
|
SymlinkObject->Target.ObjectName
|
||||||
*ReturnedLength=SymlinkObject->Target.Length;
|
);
|
||||||
}
|
if (ReturnedLength != NULL)
|
||||||
ObDereferenceObject(SymlinkObject);
|
{
|
||||||
return(STATUS_SUCCESS);
|
*ReturnedLength = SymlinkObject->Target.Length;
|
||||||
}
|
}
|
||||||
|
ObDereferenceObject(SymlinkObject);
|
||||||
NTSTATUS IoCreateUnprotectedSymbolicLink(PUNICODE_STRING SymbolicLinkName,
|
|
||||||
PUNICODE_STRING DeviceName)
|
return STATUS_SUCCESS;
|
||||||
{
|
|
||||||
return(IoCreateSymbolicLink(SymbolicLinkName,DeviceName));
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS IoCreateSymbolicLink(PUNICODE_STRING SymbolicLinkName,
|
|
||||||
PUNICODE_STRING DeviceName)
|
|
||||||
{
|
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
||||||
HANDLE SymbolicLinkHandle;
|
|
||||||
PSYMLNK_OBJECT SymbolicLink;
|
|
||||||
|
|
||||||
assert_irql(PASSIVE_LEVEL);
|
|
||||||
|
|
||||||
DPRINT("IoCreateSymbolicLink(SymbolicLinkName %w, DeviceName %w)\n",
|
|
||||||
SymbolicLinkName->Buffer,DeviceName->Buffer);
|
|
||||||
|
|
||||||
InitializeObjectAttributes(&ObjectAttributes,SymbolicLinkName,0,NULL,NULL);
|
|
||||||
SymbolicLink = ObCreateObject(&SymbolicLinkHandle,
|
|
||||||
SYMBOLIC_LINK_ALL_ACCESS,
|
|
||||||
&ObjectAttributes,
|
|
||||||
IoSymbolicLinkType);
|
|
||||||
if (SymbolicLink == NULL)
|
|
||||||
{
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
ZwClose(SymbolicLinkHandle);
|
|
||||||
SymbolicLink->TargetName.Length = 0;
|
|
||||||
SymbolicLink->TargetName.MaximumLength =
|
|
||||||
((wcslen(DeviceName->Buffer) + 1) * sizeof(WCHAR));
|
|
||||||
SymbolicLink->TargetName.Buffer = ExAllocatePool(NonPagedPool,
|
|
||||||
SymbolicLink->TargetName.MaximumLength);
|
|
||||||
RtlCopyUnicodeString(&(SymbolicLink->TargetName), DeviceName);
|
|
||||||
DPRINT("DeviceName %w\n", SymbolicLink->TargetName.Buffer);
|
|
||||||
InitializeObjectAttributes(&(SymbolicLink->Target),
|
|
||||||
&(SymbolicLink->TargetName),0,NULL,NULL);
|
|
||||||
DPRINT("%s() = STATUS_SUCCESS\n",__FUNCTION__);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* IoCreateUnprotectedSymbolicLink
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
IoDeleteSymbolicLink(PUNICODE_STRING DeviceName)
|
STDCALL
|
||||||
|
IoCreateUnprotectedSymbolicLink (
|
||||||
|
PUNICODE_STRING SymbolicLinkName,
|
||||||
|
PUNICODE_STRING DeviceName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return IoCreateSymbolicLink(
|
||||||
|
SymbolicLinkName,
|
||||||
|
DeviceName
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* IoCreateSymbolicLink
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
IoCreateSymbolicLink (
|
||||||
|
PUNICODE_STRING SymbolicLinkName,
|
||||||
|
PUNICODE_STRING DeviceName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
HANDLE SymbolicLinkHandle;
|
||||||
|
PSYMLNK_OBJECT SymbolicLink;
|
||||||
|
|
||||||
|
assert_irql(PASSIVE_LEVEL);
|
||||||
|
|
||||||
|
DPRINT(
|
||||||
|
"IoCreateSymbolicLink(SymbolicLinkName %w, DeviceName %w)\n",
|
||||||
|
SymbolicLinkName->Buffer,
|
||||||
|
DeviceName->Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
InitializeObjectAttributes(
|
||||||
|
& ObjectAttributes,
|
||||||
|
SymbolicLinkName,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
SymbolicLink = ObCreateObject(
|
||||||
|
& SymbolicLinkHandle,
|
||||||
|
SYMBOLIC_LINK_ALL_ACCESS,
|
||||||
|
& ObjectAttributes,
|
||||||
|
IoSymbolicLinkType
|
||||||
|
);
|
||||||
|
if (SymbolicLink == NULL)
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZwClose(SymbolicLinkHandle);
|
||||||
|
|
||||||
|
SymbolicLink->TargetName.Length = 0;
|
||||||
|
SymbolicLink->TargetName.MaximumLength =
|
||||||
|
((wcslen(DeviceName->Buffer) + 1) * sizeof(WCHAR));
|
||||||
|
SymbolicLink->TargetName.Buffer =
|
||||||
|
ExAllocatePool(
|
||||||
|
NonPagedPool,
|
||||||
|
SymbolicLink->TargetName.MaximumLength
|
||||||
|
);
|
||||||
|
RtlCopyUnicodeString(
|
||||||
|
& (SymbolicLink->TargetName),
|
||||||
|
DeviceName
|
||||||
|
);
|
||||||
|
|
||||||
|
DPRINT("DeviceName %w\n", SymbolicLink->TargetName.Buffer);
|
||||||
|
|
||||||
|
InitializeObjectAttributes(
|
||||||
|
& (SymbolicLink->Target),
|
||||||
|
& (SymbolicLink->TargetName),
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
DPRINT("%s() = STATUS_SUCCESS\n",__FUNCTION__);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* IoDeleteSymbolicLink
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
IoDeleteSymbolicLink (
|
||||||
|
PUNICODE_STRING DeviceName
|
||||||
|
)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME (EXPORTED as Zw)
|
||||||
|
* NtCreateSymbolicLinkObject
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
NtCreateSymbolicLinkObject (
|
NtCreateSymbolicLinkObject (
|
||||||
|
@ -222,3 +426,5 @@ NtCreateSymbolicLinkObject (
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: main.c,v 1.22 1999/08/29 06:59:10 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ke/main.c
|
* FILE: ntoskrnl/ke/main.c
|
||||||
|
@ -107,13 +108,13 @@ extern int edata;
|
||||||
extern int end;
|
extern int end;
|
||||||
|
|
||||||
static char * INIData =
|
static char * INIData =
|
||||||
"[HKEY_LOCAL_MACHINE\HARDWARE]\r\n"
|
"[HKEY_LOCAL_MACHINE\\HARDWARE]\r\n"
|
||||||
"\r\n"
|
"\r\n"
|
||||||
"[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP]\r\n"
|
"[HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP]\r\n"
|
||||||
"\r\n"
|
"\r\n"
|
||||||
"[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\AtDisk]\r\n"
|
"[HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\AtDisk]\r\n"
|
||||||
"\r\n"
|
"\r\n"
|
||||||
"[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\AtDisk\Controller 0]\r\n"
|
"[HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\AtDisk\\Controller 0]\r\n"
|
||||||
"Controller Address=dword:000001f0\r\n"
|
"Controller Address=dword:000001f0\r\n"
|
||||||
"Controller Interrupt=dword:0000000e\r\n"
|
"Controller Interrupt=dword:0000000e\r\n"
|
||||||
"\r\n"
|
"\r\n"
|
||||||
|
@ -148,7 +149,7 @@ asmlinkage void _main(boot_param* _bp)
|
||||||
*/
|
*/
|
||||||
HalInitConsole(&bp);
|
HalInitConsole(&bp);
|
||||||
|
|
||||||
DbgPrint("Starting ReactOS "KERNEL_VERSION"\n");
|
DbgPrint("Starting ReactOS "KERNEL_VERSION" (Build "__DATE__", "__TIME__")\n");
|
||||||
|
|
||||||
start = KERNEL_BASE + PAGE_ROUND_UP(bp.module_length[0]);
|
start = KERNEL_BASE + PAGE_ROUND_UP(bp.module_length[0]);
|
||||||
if (start < ((int)&end))
|
if (start < ((int)&end))
|
||||||
|
@ -214,3 +215,5 @@ asmlinkage void _main(boot_param* _bp)
|
||||||
PsTerminateSystemThread(STATUS_SUCCESS);
|
PsTerminateSystemThread(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: section.c,v 1.14 1999/08/29 06:59:10 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/mm/section.c
|
* FILE: ntoskrnl/mm/section.c
|
||||||
|
@ -179,39 +180,110 @@ NtCreateSection (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME
|
||||||
|
* NtOpenSection
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* SectionHandle
|
||||||
|
*
|
||||||
|
* DesiredAccess
|
||||||
|
*
|
||||||
|
* ObjectAttributes
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtOpenSection (
|
NtOpenSection (
|
||||||
PHANDLE SectionHandle,
|
PHANDLE SectionHandle,
|
||||||
ACCESS_MASK DesiredAccess,
|
ACCESS_MASK DesiredAccess,
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes
|
POBJECT_ATTRIBUTES ObjectAttributes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PVOID Object;
|
PVOID Object;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
*SectionHandle = 0;
|
*SectionHandle = 0;
|
||||||
|
|
||||||
Status = ObReferenceObjectByName(ObjectAttributes->ObjectName,
|
Status = ObReferenceObjectByName(
|
||||||
ObjectAttributes->Attributes,
|
ObjectAttributes->ObjectName,
|
||||||
NULL,
|
ObjectAttributes->Attributes,
|
||||||
DesiredAccess,
|
NULL,
|
||||||
MmSectionType,
|
DesiredAccess,
|
||||||
UserMode,
|
MmSectionType,
|
||||||
NULL,
|
UserMode,
|
||||||
&Object);
|
NULL,
|
||||||
if (!NT_SUCCESS(Status))
|
& Object
|
||||||
{
|
);
|
||||||
return(Status);
|
if (!NT_SUCCESS(Status))
|
||||||
}
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
Status = ObCreateHandle(PsGetCurrentProcess(),
|
Status = ObCreateHandle(
|
||||||
Object,
|
PsGetCurrentProcess(),
|
||||||
DesiredAccess,
|
Object,
|
||||||
FALSE,
|
DesiredAccess,
|
||||||
SectionHandle);
|
FALSE,
|
||||||
return(Status);
|
SectionHandle
|
||||||
|
);
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtMapViewOfSection
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* Maps a view of a section into the virtual address space of a
|
||||||
|
* process.
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* SectionHandle
|
||||||
|
* Handle of the section.
|
||||||
|
*
|
||||||
|
* ProcessHandle
|
||||||
|
* Handle of the process.
|
||||||
|
*
|
||||||
|
* BaseAddress
|
||||||
|
* Desired base address (or NULL) on entry;
|
||||||
|
* Actual base address of the view on exit.
|
||||||
|
*
|
||||||
|
* ZeroBits
|
||||||
|
* Number of high order address bits that must be zero.
|
||||||
|
*
|
||||||
|
* CommitSize
|
||||||
|
* Size in bytes of the initially committed section of
|
||||||
|
* the view.
|
||||||
|
*
|
||||||
|
* SectionOffset
|
||||||
|
* Offset in bytes from the beginning of the section
|
||||||
|
* to the beginning of the view.
|
||||||
|
*
|
||||||
|
* ViewSize
|
||||||
|
* Desired length of map (or zero to map all) on entry
|
||||||
|
* Actual length mapped on exit.
|
||||||
|
*
|
||||||
|
* InheritDisposition
|
||||||
|
* Specified how the view is to be shared with
|
||||||
|
* child processes.
|
||||||
|
*
|
||||||
|
* AllocateType
|
||||||
|
* Type of allocation for the pages.
|
||||||
|
*
|
||||||
|
* Protect
|
||||||
|
* Protection for the committed region of the view.
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* Status.
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
NtMapViewOfSection (
|
NtMapViewOfSection (
|
||||||
|
@ -226,137 +298,158 @@ NtMapViewOfSection (
|
||||||
ULONG AllocationType,
|
ULONG AllocationType,
|
||||||
ULONG Protect
|
ULONG Protect
|
||||||
)
|
)
|
||||||
/*
|
|
||||||
* FUNCTION: Maps a view of a section into the virtual address space of a
|
|
||||||
* process
|
|
||||||
* ARGUMENTS:
|
|
||||||
* SectionHandle = Handle of the section
|
|
||||||
* ProcessHandle = Handle of the process
|
|
||||||
* BaseAddress = Desired base address (or NULL) on entry
|
|
||||||
* Actual base address of the view on exit
|
|
||||||
* ZeroBits = Number of high order address bits that must be zero
|
|
||||||
* CommitSize = Size in bytes of the initially committed section of
|
|
||||||
* the view
|
|
||||||
* SectionOffset = Offset in bytes from the beginning of the section
|
|
||||||
* to the beginning of the view
|
|
||||||
* ViewSize = Desired length of map (or zero to map all) on entry
|
|
||||||
* Actual length mapped on exit
|
|
||||||
* InheritDisposition = Specified how the view is to be shared with
|
|
||||||
* child processes
|
|
||||||
* AllocateType = Type of allocation for the pages
|
|
||||||
* Protect = Protection for the committed region of the view
|
|
||||||
* RETURNS: Status
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
PSECTION_OBJECT Section;
|
PSECTION_OBJECT Section;
|
||||||
PEPROCESS Process;
|
PEPROCESS Process;
|
||||||
MEMORY_AREA* Result;
|
MEMORY_AREA * Result;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("NtMapViewOfSection(Section:%08lx, Process:%08lx,\n"
|
DPRINT(
|
||||||
" Base:%08lx, ZeroBits:%08lx, CommitSize:%08lx,\n"
|
"NtMapViewOfSection(Section:%08lx, Process:%08lx,\n"
|
||||||
" SectionOffs:%08lx, *ViewSize:%08lx, InheritDisp:%08lx,\n"
|
" Base:%08lx, ZeroBits:%08lx, CommitSize:%08lx,\n"
|
||||||
" AllocType:%08lx, Protect:%08lx)\n",
|
" SectionOffs:%08lx, *ViewSize:%08lx, InheritDisp:%08lx,\n"
|
||||||
SectionHandle,
|
" AllocType:%08lx, Protect:%08lx)\n",
|
||||||
ProcessHandle,
|
SectionHandle,
|
||||||
BaseAddress,
|
ProcessHandle,
|
||||||
ZeroBits,
|
BaseAddress,
|
||||||
CommitSize,
|
ZeroBits,
|
||||||
SectionOffset,
|
CommitSize,
|
||||||
*ViewSize,
|
SectionOffset,
|
||||||
InheritDisposition,
|
*ViewSize,
|
||||||
AllocationType,
|
InheritDisposition,
|
||||||
Protect);
|
AllocationType,
|
||||||
DPRINT(" *Base:%08lx\n", *BaseAddress);
|
Protect
|
||||||
|
);
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(SectionHandle,
|
DPRINT(" *Base:%08lx\n", *BaseAddress);
|
||||||
SECTION_MAP_READ,
|
|
||||||
MmSectionType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&Section,
|
|
||||||
NULL);
|
|
||||||
if (Status != STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
DPRINT("ObReference failed rc=%x\n",Status);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("Section %x\n",Section);
|
Status = ObReferenceObjectByHandle(
|
||||||
|
SectionHandle,
|
||||||
|
SECTION_MAP_READ,
|
||||||
|
MmSectionType,
|
||||||
|
UserMode,
|
||||||
|
(PVOID *) & Section,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (Status != STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT("ObReference failed rc=%x\n",Status);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
DPRINT("Section %x\n",Section);
|
||||||
PROCESS_VM_OPERATION,
|
|
||||||
PsProcessType,
|
Status = ObReferenceObjectByHandle(
|
||||||
UserMode,
|
ProcessHandle,
|
||||||
(PVOID*)&Process,
|
PROCESS_VM_OPERATION,
|
||||||
NULL);
|
PsProcessType,
|
||||||
if (Status != STATUS_SUCCESS)
|
UserMode,
|
||||||
{
|
(PVOID *) & Process,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (Status != STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
ObDereferenceObject(Section);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("ViewSize %x\n",ViewSize);
|
||||||
|
|
||||||
|
if ((*ViewSize) > Section->MaximumSize.u.LowPart)
|
||||||
|
{
|
||||||
|
(*ViewSize) = Section->MaximumSize.u.LowPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = MmCreateMemoryArea(
|
||||||
|
UserMode,
|
||||||
|
Process,
|
||||||
|
MEMORY_AREA_SECTION_VIEW_COMMIT,
|
||||||
|
BaseAddress,
|
||||||
|
* ViewSize,
|
||||||
|
Protect,
|
||||||
|
& Result
|
||||||
|
);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT("NtMapViewOfSection() = %x\n",Status);
|
||||||
|
|
||||||
|
ObDereferenceObject(Process);
|
||||||
|
ObDereferenceObject(Section);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
Result->Data.SectionData.Section = Section;
|
||||||
|
|
||||||
|
DPRINT("SectionOffset %x\n",SectionOffset);
|
||||||
|
|
||||||
|
if (SectionOffset == NULL)
|
||||||
|
{
|
||||||
|
Result->Data.SectionData.ViewOffset = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Result->Data.SectionData.ViewOffset =
|
||||||
|
SectionOffset->u.LowPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("*BaseAddress %x\n",*BaseAddress);
|
||||||
|
ObDereferenceObject(Process);
|
||||||
ObDereferenceObject(Section);
|
ObDereferenceObject(Section);
|
||||||
return(Status);
|
|
||||||
}
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
DPRINT("ViewSize %x\n",ViewSize);
|
|
||||||
if ((*ViewSize) > Section->MaximumSize.u.LowPart)
|
|
||||||
{
|
|
||||||
(*ViewSize) = Section->MaximumSize.u.LowPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = MmCreateMemoryArea(UserMode,
|
|
||||||
Process,
|
|
||||||
MEMORY_AREA_SECTION_VIEW_COMMIT,
|
|
||||||
BaseAddress,
|
|
||||||
*ViewSize,
|
|
||||||
Protect,
|
|
||||||
&Result);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT("NtMapViewOfSection() = %x\n",Status);
|
|
||||||
ObDereferenceObject(Process);
|
|
||||||
ObDereferenceObject(Section);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
Result->Data.SectionData.Section = Section;
|
|
||||||
|
|
||||||
DPRINT("SectionOffset %x\n",SectionOffset);
|
|
||||||
|
|
||||||
if (SectionOffset == NULL)
|
|
||||||
{
|
|
||||||
Result->Data.SectionData.ViewOffset = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Result->Data.SectionData.ViewOffset = SectionOffset->u.LowPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("*BaseAddress %x\n",*BaseAddress);
|
|
||||||
ObDereferenceObject(Process);
|
|
||||||
ObDereferenceObject(Section);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtUnmapViewOfSection
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* ProcessHandle
|
||||||
|
*
|
||||||
|
* BaseAddress
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* Status.
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtUnmapViewOfSection (
|
NtUnmapViewOfSection (
|
||||||
HANDLE ProcessHandle,
|
HANDLE ProcessHandle,
|
||||||
PVOID BaseAddress
|
PVOID BaseAddress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PEPROCESS Process;
|
PEPROCESS Process;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
Status = ObReferenceObjectByHandle(
|
||||||
PROCESS_VM_OPERATION,
|
ProcessHandle,
|
||||||
PsProcessType,
|
PROCESS_VM_OPERATION,
|
||||||
UserMode,
|
PsProcessType,
|
||||||
(PVOID*)&Process,
|
UserMode,
|
||||||
NULL);
|
(PVOID *) & Process,
|
||||||
if (Status != STATUS_SUCCESS)
|
NULL
|
||||||
{
|
);
|
||||||
return(Status);
|
if (Status != STATUS_SUCCESS)
|
||||||
}
|
{
|
||||||
Status = MmFreeMemoryArea(Process,BaseAddress,0,TRUE);
|
return Status;
|
||||||
ObDereferenceObject(Process);
|
}
|
||||||
return(Status);
|
Status = MmFreeMemoryArea(
|
||||||
|
Process,
|
||||||
|
BaseAddress,
|
||||||
|
0,
|
||||||
|
TRUE
|
||||||
|
);
|
||||||
|
ObDereferenceObject(Process);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -395,3 +488,6 @@ NtExtendSection (
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntoskrnl.def,v 1.15 1999/08/17 12:01:38 ekohl Exp $
|
; $Id: ntoskrnl.def,v 1.16 1999/08/29 06:59:05 ea Exp $
|
||||||
;
|
;
|
||||||
; reactos/ntoskrnl/ntoskrnl.def
|
; reactos/ntoskrnl/ntoskrnl.def
|
||||||
;
|
;
|
||||||
|
@ -104,7 +104,7 @@ IoConnectInterrupt
|
||||||
IoCreateController
|
IoCreateController
|
||||||
IoCreateDevice
|
IoCreateDevice
|
||||||
IoCreateStreamFileObject
|
IoCreateStreamFileObject
|
||||||
IoCreateSymbolicLink
|
IoCreateSymbolicLink@8
|
||||||
IoDeleteController
|
IoDeleteController
|
||||||
IoDeleteDevice
|
IoDeleteDevice
|
||||||
IoDisconnectInterrupt
|
IoDisconnectInterrupt
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntoskrnl.edf,v 1.3 1999/08/17 12:01:39 ekohl Exp $
|
; $Id: ntoskrnl.edf,v 1.4 1999/08/29 06:59:05 ea Exp $
|
||||||
;
|
;
|
||||||
; reactos/ntoskrnl/ntoskrnl.def
|
; reactos/ntoskrnl/ntoskrnl.def
|
||||||
;
|
;
|
||||||
|
@ -104,7 +104,7 @@ IoConnectInterrupt
|
||||||
IoCreateController
|
IoCreateController
|
||||||
IoCreateDevice
|
IoCreateDevice
|
||||||
IoCreateStreamFileObject
|
IoCreateStreamFileObject
|
||||||
IoCreateSymbolicLink
|
IoCreateSymbolicLink=IoCreateSymbolicLink@8
|
||||||
IoDeleteController
|
IoDeleteController
|
||||||
IoDeleteDevice
|
IoDeleteDevice
|
||||||
IoDisconnectInterrupt
|
IoDisconnectInterrupt
|
||||||
|
@ -129,7 +129,7 @@ NtAllocateUuids=NtAllocateUuids@12
|
||||||
NtAllocateVirtualMemory=NtAllocateVirtualMemory@24
|
NtAllocateVirtualMemory=NtAllocateVirtualMemory@24
|
||||||
;NtBuildNumber <--- variable?
|
;NtBuildNumber <--- variable?
|
||||||
NtClose=NtClose@4
|
NtClose=NtClose@4
|
||||||
;NtConnectPort=;NtConnectPort@32
|
;NtConnectPort@32
|
||||||
NtConnectPort=NtConnectPort@8
|
NtConnectPort=NtConnectPort@8
|
||||||
NtCreateEvent=NtCreateEvent@20
|
NtCreateEvent=NtCreateEvent@20
|
||||||
NtCreateFile=NtCreateFile@44
|
NtCreateFile=NtCreateFile@44
|
||||||
|
@ -155,13 +155,13 @@ NtQueryEaFile=NtQueryEaFile@36
|
||||||
NtQueryInformationFile=NtQueryInformationFile@20
|
NtQueryInformationFile=NtQueryInformationFile@20
|
||||||
NtQueryInformationProcess=NtQueryInformationProcess@20
|
NtQueryInformationProcess=NtQueryInformationProcess@20
|
||||||
NtQueryInformationToken=NtQueryInformationToken@20
|
NtQueryInformationToken=NtQueryInformationToken@20
|
||||||
;NtQueryOleDirectoryFile=;NtQueryOleDirectoryFile@ <--- ?
|
;NtQueryOleDirectoryFile@ <--- ?
|
||||||
NtQuerySecurityObject=NtQuerySecurityObject@20
|
NtQuerySecurityObject=NtQuerySecurityObject@20
|
||||||
NtQueryVolumeInformationFile=NtQueryVolumeInformationFile@20
|
NtQueryVolumeInformationFile=NtQueryVolumeInformationFile@20
|
||||||
NtReadFile=NtReadFile@36
|
NtReadFile=NtReadFile@36
|
||||||
;NtRequestPort=;NtRequestPort@8
|
;NtRequestPort@8
|
||||||
NtRequestPort=NtRequestPort@20
|
NtRequestPort=NtRequestPort@20
|
||||||
;NtRequestWaitReplyPort=;NtRequestWaitReplyPort@8
|
;NtRequestWaitReplyPort@8
|
||||||
NtRequestWaitReplyPort=NtRequestWaitReplyPort@0
|
NtRequestWaitReplyPort=NtRequestWaitReplyPort@0
|
||||||
NtSetEvent=NtSetEvent@8
|
NtSetEvent=NtSetEvent@8
|
||||||
NtSetInformationFile=NtSetInformationFile@20
|
NtSetInformationFile=NtSetInformationFile@20
|
||||||
|
@ -169,7 +169,7 @@ NtSetInformationProcess=NtSetInformationProcess@16
|
||||||
NtSetInformationThread=NtSetInformationThread@16
|
NtSetInformationThread=NtSetInformationThread@16
|
||||||
NtSetSecurityObject=NtSetSecurityObject@12
|
NtSetSecurityObject=NtSetSecurityObject@12
|
||||||
NtUnlockFile=NtUnlockFile@20
|
NtUnlockFile=NtUnlockFile@20
|
||||||
;NtVdmControl=;NtVdmControl@8 <--- ?
|
;NtVdmControl@8 <--- ?
|
||||||
NtWaitForSingleObject=NtWaitForSingleObject@12
|
NtWaitForSingleObject=NtWaitForSingleObject@12
|
||||||
NtWriteFile=NtWriteFile@36
|
NtWriteFile=NtWriteFile@36
|
||||||
RtlAnsiStringToUnicodeString
|
RtlAnsiStringToUnicodeString
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: dirobj.c,v 1.5 1999/08/29 06:59:10 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ob/dirobj.c
|
* FILE: ntoskrnl/ob/dirobj.c
|
||||||
|
@ -22,50 +23,107 @@
|
||||||
|
|
||||||
/* FUNCTIONS **************************************************************/
|
/* FUNCTIONS **************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtOpenDirectoryObject
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* Opens a namespace directory object.
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* DirectoryHandle (OUT)
|
||||||
|
* Variable which receives the directory handle.
|
||||||
|
*
|
||||||
|
* DesiredAccess
|
||||||
|
* Desired access to the directory.
|
||||||
|
*
|
||||||
|
* ObjectAttributes
|
||||||
|
* Structure describing the directory.
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* Status.
|
||||||
|
*
|
||||||
|
* NOTES
|
||||||
|
* Undocumented.
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtOpenDirectoryObject (
|
NtOpenDirectoryObject (
|
||||||
PHANDLE DirectoryHandle,
|
PHANDLE DirectoryHandle,
|
||||||
ACCESS_MASK DesiredAccess,
|
ACCESS_MASK DesiredAccess,
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes
|
POBJECT_ATTRIBUTES ObjectAttributes
|
||||||
)
|
)
|
||||||
/*
|
|
||||||
* FUNCTION: Opens a namespace directory object
|
|
||||||
* ARGUMENTS:
|
|
||||||
* DirectoryHandle (OUT) = Variable which receives the directory handle
|
|
||||||
* DesiredAccess = Desired access to the directory
|
|
||||||
* ObjectAttributes = Structure describing the directory
|
|
||||||
* RETURNS: Status
|
|
||||||
* NOTES: Undocumented
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
PVOID Object;
|
PVOID Object;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
*DirectoryHandle = 0;
|
*DirectoryHandle = 0;
|
||||||
|
|
||||||
Status = ObReferenceObjectByName(ObjectAttributes->ObjectName,
|
Status = ObReferenceObjectByName(
|
||||||
ObjectAttributes->Attributes,
|
ObjectAttributes->ObjectName,
|
||||||
NULL,
|
ObjectAttributes->Attributes,
|
||||||
DesiredAccess,
|
NULL,
|
||||||
ObDirectoryType,
|
DesiredAccess,
|
||||||
UserMode,
|
ObDirectoryType,
|
||||||
NULL,
|
UserMode,
|
||||||
&Object);
|
NULL,
|
||||||
if (!NT_SUCCESS(Status))
|
& Object
|
||||||
{
|
);
|
||||||
return(Status);
|
if (!NT_SUCCESS(Status))
|
||||||
}
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
Status = ObCreateHandle(PsGetCurrentProcess(),
|
Status = ObCreateHandle(
|
||||||
Object,
|
PsGetCurrentProcess(),
|
||||||
DesiredAccess,
|
Object,
|
||||||
FALSE,
|
DesiredAccess,
|
||||||
DirectoryHandle);
|
FALSE,
|
||||||
return(STATUS_SUCCESS);
|
DirectoryHandle
|
||||||
|
);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtQueryDirectoryObject
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* Reads information from a namespace directory.
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* DirObjInformation (OUT)
|
||||||
|
* Buffer to hold the data read.
|
||||||
|
*
|
||||||
|
* BufferLength
|
||||||
|
* Size of the buffer in bytes.
|
||||||
|
*
|
||||||
|
* GetNextIndex
|
||||||
|
* If TRUE then set ObjectIndex to the index of the
|
||||||
|
* next object.
|
||||||
|
* If FALSE then set ObjectIndex to the number of
|
||||||
|
* objects in the directory.
|
||||||
|
*
|
||||||
|
* IgnoreInputIndex
|
||||||
|
* If TRUE start reading at index 0.
|
||||||
|
* If FALSE start reading at the index specified
|
||||||
|
* by object index.
|
||||||
|
*
|
||||||
|
* ObjectIndex
|
||||||
|
* Zero based index into the directory, interpretation
|
||||||
|
* depends on IgnoreInputIndex and GetNextIndex.
|
||||||
|
*
|
||||||
|
* DataWritten (OUT)
|
||||||
|
* Caller supplied storage for the number of bytes
|
||||||
|
* written (or NULL).
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* Status.
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtQueryDirectoryObject (
|
NtQueryDirectoryObject (
|
||||||
IN HANDLE DirObjHandle,
|
IN HANDLE DirObjHandle,
|
||||||
OUT POBJDIR_INFORMATION DirObjInformation,
|
OUT POBJDIR_INFORMATION DirObjInformation,
|
||||||
|
@ -75,114 +133,149 @@ NtQueryDirectoryObject (
|
||||||
IN OUT PULONG ObjectIndex,
|
IN OUT PULONG ObjectIndex,
|
||||||
OUT PULONG DataWritten OPTIONAL
|
OUT PULONG DataWritten OPTIONAL
|
||||||
)
|
)
|
||||||
/*
|
|
||||||
* FUNCTION: Reads information from a namespace directory
|
|
||||||
* ARGUMENTS:
|
|
||||||
* DirObjInformation (OUT) = Buffer to hold the data read
|
|
||||||
* BufferLength = Size of the buffer in bytes
|
|
||||||
* GetNextIndex = If TRUE then set ObjectIndex to the index of the
|
|
||||||
* next object
|
|
||||||
* If FALSE then set ObjectIndex to the number of
|
|
||||||
* objects in the directory
|
|
||||||
* IgnoreInputIndex = If TRUE start reading at index 0
|
|
||||||
* If FALSE start reading at the index specified
|
|
||||||
* by object index
|
|
||||||
* ObjectIndex = Zero based index into the directory, interpretation
|
|
||||||
* depends on IgnoreInputIndex and GetNextIndex
|
|
||||||
* DataWritten (OUT) = Caller supplied storage for the number of bytes
|
|
||||||
* written (or NULL)
|
|
||||||
* RETURNS: Status
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
PDIRECTORY_OBJECT dir = NULL;
|
PDIRECTORY_OBJECT dir = NULL;
|
||||||
ULONG EntriesToRead;
|
ULONG EntriesToRead;
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
POBJECT_HEADER current;
|
POBJECT_HEADER current;
|
||||||
ULONG i=0;
|
ULONG i=0;
|
||||||
ULONG EntriesToSkip;
|
ULONG EntriesToSkip;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
|
||||||
|
DPRINT(
|
||||||
|
"NtQueryDirectoryObject(DirObjHandle %x)\n",
|
||||||
|
DirObjHandle
|
||||||
|
);
|
||||||
|
DPRINT(
|
||||||
|
"dir %x namespc_root %x\n",
|
||||||
|
dir,
|
||||||
|
HEADER_TO_BODY(&(namespc_root.hdr))
|
||||||
|
);
|
||||||
|
|
||||||
DPRINT("NtQueryDirectoryObject(DirObjHandle %x)\n",DirObjHandle);
|
// assert_irql(PASSIVE_LEVEL);
|
||||||
DPRINT("dir %x namespc_root %x\n",dir,HEADER_TO_BODY(&(namespc_root.hdr)));
|
|
||||||
|
|
||||||
// assert_irql(PASSIVE_LEVEL);
|
Status = ObReferenceObjectByHandle(
|
||||||
|
DirObjHandle,
|
||||||
|
DIRECTORY_QUERY,
|
||||||
|
ObDirectoryType,
|
||||||
|
UserMode,
|
||||||
|
(PVOID *) & dir,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (Status != STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntriesToRead = BufferLength / sizeof (OBJDIR_INFORMATION);
|
||||||
|
*DataWritten = 0;
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(DirObjHandle,
|
DPRINT("EntriesToRead %d\n",EntriesToRead);
|
||||||
DIRECTORY_QUERY,
|
|
||||||
ObDirectoryType,
|
|
||||||
UserMode,
|
|
||||||
(PVOID*)&dir,
|
|
||||||
NULL);
|
|
||||||
if (Status != STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
EntriesToRead = BufferLength / sizeof(OBJDIR_INFORMATION);
|
current_entry = dir->head.Flink;
|
||||||
*DataWritten = 0;
|
|
||||||
|
|
||||||
DPRINT("EntriesToRead %d\n",EntriesToRead);
|
/*
|
||||||
|
* Optionally, skip over some entries at the start of the directory
|
||||||
current_entry = dir->head.Flink;
|
*/
|
||||||
|
if (!IgnoreInputIndex)
|
||||||
/*
|
{
|
||||||
* Optionally, skip over some entries at the start of the directory
|
CHECKPOINT;
|
||||||
*/
|
|
||||||
if (!IgnoreInputIndex)
|
|
||||||
{
|
|
||||||
CHECKPOINT;
|
|
||||||
|
|
||||||
EntriesToSkip = *ObjectIndex;
|
EntriesToSkip = *ObjectIndex;
|
||||||
while ( i<EntriesToSkip && current_entry!=NULL)
|
while ( (i < EntriesToSkip) && (current_entry != NULL))
|
||||||
{
|
{
|
||||||
current_entry = current_entry->Flink;
|
current_entry = current_entry->Flink;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINT("DirObjInformation %x\n",DirObjInformation);
|
DPRINT("DirObjInformation %x\n",DirObjInformation);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read the maximum entries possible into the buffer
|
* Read the maximum entries possible into the buffer
|
||||||
*/
|
*/
|
||||||
while ( i<EntriesToRead && current_entry!=(&(dir->head)))
|
while ( (i < EntriesToRead) && (current_entry != (&(dir->head))))
|
||||||
{
|
{
|
||||||
current = CONTAINING_RECORD(current_entry,OBJECT_HEADER,Entry);
|
current = CONTAINING_RECORD(
|
||||||
DPRINT("Scanning %w\n",current->Name.Buffer);
|
current_entry,
|
||||||
DirObjInformation[i].ObjectName.Buffer =
|
OBJECT_HEADER,
|
||||||
ExAllocatePool(NonPagedPool,(current->Name.Length+1)*2);
|
Entry
|
||||||
DirObjInformation[i].ObjectName.Length = current->Name.Length;
|
);
|
||||||
DirObjInformation[i].ObjectName.MaximumLength = current->Name.Length;
|
DPRINT(
|
||||||
DPRINT("DirObjInformation[i].ObjectName.Buffer %x\n",
|
"Scanning %w\n",
|
||||||
DirObjInformation[i].ObjectName.Buffer);
|
current->Name.Buffer
|
||||||
RtlCopyUnicodeString(&DirObjInformation[i].ObjectName,
|
);
|
||||||
&(current->Name));
|
|
||||||
i++;
|
DirObjInformation[i].ObjectName.Buffer =
|
||||||
current_entry = current_entry->Flink;
|
ExAllocatePool(
|
||||||
(*DataWritten) = (*DataWritten) + sizeof(OBJDIR_INFORMATION);
|
NonPagedPool,
|
||||||
|
(current->Name.Length + 1) * 2
|
||||||
|
);
|
||||||
|
DirObjInformation[i].ObjectName.Length =
|
||||||
|
current->Name.Length;
|
||||||
|
DirObjInformation[i].ObjectName.MaximumLength =
|
||||||
|
current->Name.Length;
|
||||||
|
|
||||||
|
DPRINT(
|
||||||
|
"DirObjInformation[i].ObjectName.Buffer %x\n",
|
||||||
|
DirObjInformation[i].ObjectName.Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
RtlCopyUnicodeString(
|
||||||
|
& DirObjInformation[i].ObjectName,
|
||||||
|
& (current->Name)
|
||||||
|
);
|
||||||
|
i++;
|
||||||
|
current_entry = current_entry->Flink;
|
||||||
|
(*DataWritten) = (*DataWritten) + sizeof (OBJDIR_INFORMATION);
|
||||||
|
|
||||||
|
CHECKPOINT;
|
||||||
|
}
|
||||||
CHECKPOINT;
|
CHECKPOINT;
|
||||||
}
|
|
||||||
CHECKPOINT;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Optionally, count the number of entries in the directory
|
* Optionally, count the number of entries in the directory
|
||||||
*/
|
*/
|
||||||
if (GetNextIndex)
|
if (GetNextIndex)
|
||||||
{
|
{
|
||||||
*ObjectIndex=i;
|
*ObjectIndex = i;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while ( current_entry!=(&(dir->head)) )
|
while ( current_entry != (&(dir->head)) )
|
||||||
{
|
{
|
||||||
current_entry=current_entry->Flink;
|
current_entry = current_entry->Flink;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
*ObjectIndex=i;
|
*ObjectIndex = i;
|
||||||
}
|
}
|
||||||
return(STATUS_SUCCESS);
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME (EXPORTED as Zw)
|
||||||
|
* NtCreateDirectoryObject
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* Creates or opens a directory object (a container for other
|
||||||
|
* objects).
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* DirectoryHandle (OUT)
|
||||||
|
* Caller supplied storage for the handle of the
|
||||||
|
* directory.
|
||||||
|
*
|
||||||
|
* DesiredAccess
|
||||||
|
* Access desired to the directory.
|
||||||
|
*
|
||||||
|
* ObjectAttributes
|
||||||
|
* Object attributes initialized with
|
||||||
|
* InitializeObjectAttributes.
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* Status.
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
NtCreateDirectoryObject (
|
NtCreateDirectoryObject (
|
||||||
|
@ -190,56 +283,77 @@ NtCreateDirectoryObject (
|
||||||
ACCESS_MASK DesiredAccess,
|
ACCESS_MASK DesiredAccess,
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes
|
POBJECT_ATTRIBUTES ObjectAttributes
|
||||||
)
|
)
|
||||||
/*
|
|
||||||
* FUNCTION: Creates or opens a directory object (a container for other
|
|
||||||
* objects)
|
|
||||||
* ARGUMENTS:
|
|
||||||
* DirectoryHandle (OUT) = Caller supplied storage for the handle
|
|
||||||
* of the directory
|
|
||||||
* DesiredAccess = Access desired to the directory
|
|
||||||
* ObjectAttributes = Object attributes initialized with
|
|
||||||
* InitializeObjectAttributes
|
|
||||||
* RETURNS: Status
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
PDIRECTORY_OBJECT dir;
|
PDIRECTORY_OBJECT dir;
|
||||||
|
|
||||||
dir = ObCreateObject(DirectoryHandle,
|
dir = ObCreateObject(
|
||||||
DesiredAccess,
|
DirectoryHandle,
|
||||||
ObjectAttributes,
|
DesiredAccess,
|
||||||
ObDirectoryType);
|
ObjectAttributes,
|
||||||
return(STATUS_SUCCESS);
|
ObDirectoryType
|
||||||
|
);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID InitializeObjectAttributes(POBJECT_ATTRIBUTES InitializedAttributes,
|
|
||||||
PUNICODE_STRING ObjectName,
|
/**********************************************************************
|
||||||
ULONG Attributes,
|
* NAME (MACRO in DDK)
|
||||||
HANDLE RootDirectory,
|
* InitializeObjectAttributes
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor)
|
*
|
||||||
/*
|
* DESCRIPTION
|
||||||
* FUNCTION: Sets up a parameter of type OBJECT_ATTRIBUTES for a
|
* Sets up a parameter of type OBJECT_ATTRIBUTES for a
|
||||||
* subsequent call to ZwCreateXXX or ZwOpenXXX
|
* subsequent call to ZwCreateXXX or ZwOpenXXX.
|
||||||
* ARGUMENTS:
|
*
|
||||||
* InitializedAttributes (OUT) = Caller supplied storage for the
|
* ARGUMENTS
|
||||||
* object attributes
|
* InitializedAttributes (OUT)
|
||||||
* ObjectName = Full path name for object
|
* Caller supplied storage for the object attributes.
|
||||||
* Attributes = Attributes for the object
|
*
|
||||||
* RootDirectory = Where the object should be placed or NULL
|
* ObjectName
|
||||||
* SecurityDescriptor = Ignored
|
* Full path name for object.
|
||||||
|
*
|
||||||
|
* Attributes
|
||||||
|
* Attributes for the object.
|
||||||
|
*
|
||||||
|
* RootDirectory
|
||||||
|
* Where the object should be placed or NULL.
|
||||||
|
*
|
||||||
|
* SecurityDescriptor
|
||||||
|
* Ignored.
|
||||||
*
|
*
|
||||||
* NOTE:
|
* NOTE
|
||||||
* Either ObjectName is a fully qualified pathname or a path relative
|
* Either ObjectName is a fully qualified pathname or a path
|
||||||
* to RootDirectory
|
* relative to RootDirectory.
|
||||||
*/
|
*/
|
||||||
|
VOID
|
||||||
|
InitializeObjectAttributes (
|
||||||
|
POBJECT_ATTRIBUTES InitializedAttributes,
|
||||||
|
PUNICODE_STRING ObjectName,
|
||||||
|
ULONG Attributes,
|
||||||
|
HANDLE RootDirectory,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor
|
||||||
|
)
|
||||||
{
|
{
|
||||||
DPRINT("InitializeObjectAttributes(InitializedAttributes %x "
|
DPRINT(
|
||||||
"ObjectName %x Attributes %x RootDirectory %x)\n",
|
"InitializeObjectAttributes(InitializedAttributes %x "
|
||||||
InitializedAttributes,ObjectName,Attributes,RootDirectory);
|
"ObjectName %x Attributes %x RootDirectory %x)\n",
|
||||||
InitializedAttributes->Length=sizeof(OBJECT_ATTRIBUTES);
|
InitializedAttributes,
|
||||||
InitializedAttributes->RootDirectory=RootDirectory;
|
ObjectName,
|
||||||
InitializedAttributes->ObjectName=ObjectName;
|
Attributes,
|
||||||
InitializedAttributes->Attributes=Attributes;
|
RootDirectory
|
||||||
InitializedAttributes->SecurityDescriptor=SecurityDescriptor;
|
);
|
||||||
InitializedAttributes->SecurityQualityOfService=NULL;
|
InitializedAttributes->Length =
|
||||||
|
sizeof (OBJECT_ATTRIBUTES);
|
||||||
|
InitializedAttributes->RootDirectory =
|
||||||
|
RootDirectory;
|
||||||
|
InitializedAttributes->ObjectName =
|
||||||
|
ObjectName;
|
||||||
|
InitializedAttributes->Attributes =
|
||||||
|
Attributes;
|
||||||
|
InitializedAttributes->SecurityDescriptor =
|
||||||
|
SecurityDescriptor;
|
||||||
|
InitializedAttributes->SecurityQualityOfService =
|
||||||
|
NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: handle.c,v 1.11 1999/08/29 06:59:11 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ob/handle.c
|
* FILE: ntoskrnl/ob/handle.c
|
||||||
|
@ -35,7 +36,10 @@ typedef struct
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
static PHANDLE_REP ObpGetObjectByHandle(PEPROCESS Process,
|
|
||||||
|
static
|
||||||
|
PHANDLE_REP
|
||||||
|
ObpGetObjectByHandle(PEPROCESS Process,
|
||||||
HANDLE h)
|
HANDLE h)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Get the data structure for a handle
|
* FUNCTION: Get the data structure for a handle
|
||||||
|
@ -70,6 +74,7 @@ static PHANDLE_REP ObpGetObjectByHandle(PEPROCESS Process,
|
||||||
return(&(blk->handles[handle%HANDLE_BLOCK_ENTRIES]));
|
return(&(blk->handles[handle%HANDLE_BLOCK_ENTRIES]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
NtDuplicateObject (
|
NtDuplicateObject (
|
||||||
|
@ -150,7 +155,9 @@ NtDuplicateObject (
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID ObDeleteHandleTable(PEPROCESS Process)
|
|
||||||
|
VOID
|
||||||
|
ObDeleteHandleTable(PEPROCESS Process)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Deletes the handle table associated with a process
|
* FUNCTION: Deletes the handle table associated with a process
|
||||||
*/
|
*/
|
||||||
|
@ -185,7 +192,9 @@ VOID ObDeleteHandleTable(PEPROCESS Process)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID ObCreateHandleTable(PEPROCESS Parent,
|
|
||||||
|
VOID
|
||||||
|
ObCreateHandleTable(PEPROCESS Parent,
|
||||||
BOOLEAN Inherit,
|
BOOLEAN Inherit,
|
||||||
PEPROCESS Process)
|
PEPROCESS Process)
|
||||||
/*
|
/*
|
||||||
|
@ -207,7 +216,9 @@ VOID ObCreateHandleTable(PEPROCESS Parent,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID ObDeleteHandle(HANDLE Handle)
|
|
||||||
|
VOID
|
||||||
|
ObDeleteHandle(HANDLE Handle)
|
||||||
{
|
{
|
||||||
PHANDLE_REP Rep;
|
PHANDLE_REP Rep;
|
||||||
|
|
||||||
|
@ -218,7 +229,9 @@ VOID ObDeleteHandle(HANDLE Handle)
|
||||||
DPRINT("Finished ObDeleteHandle()\n");
|
DPRINT("Finished ObDeleteHandle()\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS ObCreateHandle(PEPROCESS Process,
|
|
||||||
|
NTSTATUS
|
||||||
|
ObCreateHandle(PEPROCESS Process,
|
||||||
PVOID ObjectBody,
|
PVOID ObjectBody,
|
||||||
ACCESS_MASK GrantedAccess,
|
ACCESS_MASK GrantedAccess,
|
||||||
BOOLEAN Inherit,
|
BOOLEAN Inherit,
|
||||||
|
@ -289,7 +302,8 @@ NTSTATUS ObCreateHandle(PEPROCESS Process,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS ObReferenceObjectByHandle(HANDLE Handle,
|
NTSTATUS
|
||||||
|
ObReferenceObjectByHandle(HANDLE Handle,
|
||||||
ACCESS_MASK DesiredAccess,
|
ACCESS_MASK DesiredAccess,
|
||||||
POBJECT_TYPE ObjectType,
|
POBJECT_TYPE ObjectType,
|
||||||
KPROCESSOR_MODE AccessMode,
|
KPROCESSOR_MODE AccessMode,
|
||||||
|
@ -378,46 +392,66 @@ NTSTATUS ObReferenceObjectByHandle(HANDLE Handle,
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS NtClose(HANDLE Handle)
|
|
||||||
/*
|
/**********************************************************************
|
||||||
* FUNCTION: Closes a handle reference to an object
|
* NAME EXPORTED
|
||||||
* ARGUMENTS:
|
* NtClose
|
||||||
* Handle = handle to close
|
*
|
||||||
* RETURNS: Status
|
* DESCRIPTION
|
||||||
|
* Closes a handle reference to an object.
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* Handle
|
||||||
|
* Handle to close.
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* Status.
|
||||||
*/
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
NtClose(HANDLE Handle)
|
||||||
{
|
{
|
||||||
PVOID ObjectBody;
|
PVOID ObjectBody;
|
||||||
POBJECT_HEADER Header;
|
POBJECT_HEADER Header;
|
||||||
PHANDLE_REP HandleRep;
|
PHANDLE_REP HandleRep;
|
||||||
|
|
||||||
assert_irql(PASSIVE_LEVEL);
|
assert_irql(PASSIVE_LEVEL);
|
||||||
|
|
||||||
DPRINT("NtClose(Handle %x)\n",Handle);
|
DPRINT("NtClose(Handle %x)\n",Handle);
|
||||||
|
|
||||||
HandleRep = ObpGetObjectByHandle(PsGetCurrentProcess(),
|
HandleRep = ObpGetObjectByHandle(
|
||||||
Handle);
|
PsGetCurrentProcess(),
|
||||||
if (HandleRep == NULL)
|
Handle
|
||||||
{
|
);
|
||||||
return(STATUS_INVALID_HANDLE);
|
if (HandleRep == NULL)
|
||||||
}
|
{
|
||||||
ObjectBody = HandleRep->ObjectBody;
|
return STATUS_INVALID_HANDLE;
|
||||||
|
}
|
||||||
|
ObjectBody = HandleRep->ObjectBody;
|
||||||
|
|
||||||
HandleRep->ObjectBody = NULL;
|
HandleRep->ObjectBody = NULL;
|
||||||
|
|
||||||
Header = BODY_TO_HEADER(ObjectBody);
|
Header = BODY_TO_HEADER(ObjectBody);
|
||||||
|
|
||||||
Header->RefCount++;
|
Header->RefCount++;
|
||||||
Header->HandleCount--;
|
Header->HandleCount--;
|
||||||
|
|
||||||
if (Header->ObjectType != NULL &&
|
if ( (Header->ObjectType != NULL)
|
||||||
Header->ObjectType->Close != NULL)
|
&& (Header->ObjectType->Close != NULL)
|
||||||
{
|
)
|
||||||
Header->ObjectType->Close(ObjectBody, Header->HandleCount);
|
{
|
||||||
}
|
Header->ObjectType->Close(
|
||||||
|
ObjectBody,
|
||||||
|
Header->HandleCount
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Header->RefCount--;
|
Header->RefCount--;
|
||||||
|
|
||||||
ObPerformRetentionChecks(Header);
|
ObPerformRetentionChecks(Header);
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: ntobj.c,v 1.5 1999/08/29 06:59:11 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ob/ntobj.c
|
* FILE: ntoskrnl/ob/ntobj.c
|
||||||
|
@ -47,39 +48,60 @@ NtQueryObject (
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID ObMakeTemporaryObject(PVOID ObjectBody)
|
VOID
|
||||||
|
ObMakeTemporaryObject (
|
||||||
|
PVOID ObjectBody
|
||||||
|
)
|
||||||
{
|
{
|
||||||
POBJECT_HEADER ObjectHeader;
|
POBJECT_HEADER ObjectHeader;
|
||||||
|
|
||||||
ObjectHeader = BODY_TO_HEADER(ObjectBody);
|
ObjectHeader = BODY_TO_HEADER(ObjectBody);
|
||||||
ObjectHeader->Permanent = FALSE;
|
ObjectHeader->Permanent = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME EXPORTED
|
||||||
|
* NtMakeTemporaryObject
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
*
|
||||||
|
* REVISIONS
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtMakeTemporaryObject (
|
NtMakeTemporaryObject (
|
||||||
HANDLE Handle
|
HANDLE Handle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PVOID Object;
|
PVOID Object;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
POBJECT_HEADER ObjectHeader;
|
POBJECT_HEADER ObjectHeader;
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(Handle,
|
Status = ObReferenceObjectByHandle(
|
||||||
0,
|
Handle,
|
||||||
NULL,
|
0,
|
||||||
KernelMode,
|
NULL,
|
||||||
&Object,
|
KernelMode,
|
||||||
NULL);
|
& Object,
|
||||||
if (Status != STATUS_SUCCESS)
|
NULL
|
||||||
{
|
);
|
||||||
return(Status);
|
if (Status != STATUS_SUCCESS)
|
||||||
}
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
ObjectHeader = BODY_TO_HEADER(Object);
|
ObjectHeader = BODY_TO_HEADER(Object);
|
||||||
ObjectHeader->Permanent = FALSE;
|
ObjectHeader->Permanent = FALSE;
|
||||||
|
|
||||||
ObDereferenceObject(Object);
|
ObDereferenceObject(Object);
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* $Id: thread.c,v 1.25 1999/08/29 06:59:11 ea Exp $
|
||||||
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ps/thread.c
|
* FILE: ntoskrnl/ps/thread.c
|
||||||
|
@ -117,100 +118,129 @@ VOID PsBeginThread(PKSTART_ROUTINE StartRoutine, PVOID StartContext)
|
||||||
KeBugCheck(0);
|
KeBugCheck(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PETHREAD PsScanThreadList(KPRIORITY Priority)
|
static
|
||||||
|
PETHREAD
|
||||||
|
PsScanThreadList (
|
||||||
|
KPRIORITY Priority
|
||||||
|
)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PETHREAD current;
|
PETHREAD current;
|
||||||
PETHREAD oldest = NULL;
|
PETHREAD oldest = NULL;
|
||||||
ULONG oldest_time = 0;
|
ULONG oldest_time = 0;
|
||||||
|
|
||||||
// DPRINT("PsScanThreadList(Priority %d)\n",Priority);
|
// DPRINT("PsScanThreadList(Priority %d)\n",Priority);
|
||||||
|
|
||||||
current_entry = PriorityListHead[THREAD_PRIORITY_MAX+Priority].Flink;
|
current_entry =
|
||||||
while (current_entry != &PriorityListHead[THREAD_PRIORITY_MAX+Priority])
|
PriorityListHead[THREAD_PRIORITY_MAX + Priority].Flink;
|
||||||
{
|
|
||||||
current = CONTAINING_RECORD(current_entry,ETHREAD,Tcb.Entry);
|
|
||||||
|
|
||||||
if (current->Tcb.State == THREAD_STATE_TERMINATED &&
|
while (current_entry != &PriorityListHead[THREAD_PRIORITY_MAX+Priority])
|
||||||
current != CurrentThread)
|
{
|
||||||
{
|
current = CONTAINING_RECORD(
|
||||||
PsReleaseThread(current);
|
current_entry,
|
||||||
}
|
ETHREAD,
|
||||||
|
Tcb.Entry
|
||||||
|
);
|
||||||
|
|
||||||
if (current->Tcb.State == THREAD_STATE_RUNNABLE)
|
if ( (current->Tcb.State == THREAD_STATE_TERMINATED)
|
||||||
{
|
&& (current != CurrentThread)
|
||||||
if (oldest == NULL || oldest_time > current->Tcb.LastTick)
|
)
|
||||||
{
|
{
|
||||||
oldest = current;
|
PsReleaseThread(current);
|
||||||
oldest_time = current->Tcb.LastTick;
|
}
|
||||||
}
|
|
||||||
}
|
if (current->Tcb.State == THREAD_STATE_RUNNABLE)
|
||||||
current_entry = current_entry->Flink;
|
{
|
||||||
}
|
if ( (oldest == NULL)
|
||||||
// DPRINT("PsScanThreadList() = %x\n",oldest);
|
|| (oldest_time > current->Tcb.LastTick)
|
||||||
return(oldest);
|
)
|
||||||
|
{
|
||||||
|
oldest = current;
|
||||||
|
oldest_time = current->Tcb.LastTick;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
current_entry = current_entry->Flink;
|
||||||
|
}
|
||||||
|
// DPRINT("PsScanThreadList() = %x\n",oldest);
|
||||||
|
return oldest;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID PsDispatchThread(VOID)
|
|
||||||
|
VOID
|
||||||
|
PsDispatchThread (VOID)
|
||||||
{
|
{
|
||||||
KPRIORITY CurrentPriority;
|
KPRIORITY CurrentPriority;
|
||||||
PETHREAD Candidate;
|
PETHREAD Candidate;
|
||||||
KIRQL irql;
|
KIRQL irql;
|
||||||
LARGE_INTEGER TickCount;
|
LARGE_INTEGER TickCount;
|
||||||
|
|
||||||
|
if (!DoneInitYet)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!DoneInitYet)
|
KeAcquireSpinLock(
|
||||||
{
|
& ThreadListLock,
|
||||||
return;
|
& irql
|
||||||
}
|
);
|
||||||
|
|
||||||
KeAcquireSpinLock(&ThreadListLock, &irql);
|
DPRINT("PsDispatchThread() Current %x\n",CurrentThread);
|
||||||
|
|
||||||
DPRINT("PsDispatchThread() Current %x\n",CurrentThread);
|
|
||||||
|
|
||||||
if (CurrentThread->Tcb.State==THREAD_STATE_RUNNING)
|
if (CurrentThread->Tcb.State == THREAD_STATE_RUNNING)
|
||||||
{
|
{
|
||||||
CurrentThread->Tcb.State=THREAD_STATE_RUNNABLE;
|
CurrentThread->Tcb.State = THREAD_STATE_RUNNABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (CurrentPriority=THREAD_PRIORITY_TIME_CRITICAL;
|
for ( CurrentPriority = THREAD_PRIORITY_TIME_CRITICAL;
|
||||||
CurrentPriority>=THREAD_PRIORITY_IDLE;
|
(CurrentPriority >= THREAD_PRIORITY_IDLE);
|
||||||
CurrentPriority--)
|
CurrentPriority--
|
||||||
{
|
)
|
||||||
Candidate = PsScanThreadList(CurrentPriority);
|
{
|
||||||
if (Candidate == CurrentThread)
|
Candidate = PsScanThreadList(CurrentPriority);
|
||||||
{
|
if (Candidate == CurrentThread)
|
||||||
DPRINT("Scheduling current thread\n");
|
{
|
||||||
KeQueryTickCount(&TickCount);
|
DPRINT("Scheduling current thread\n");
|
||||||
CurrentThread->Tcb.LastTick = TickCount.u.LowPart;
|
KeQueryTickCount(&TickCount);
|
||||||
CurrentThread->Tcb.State = THREAD_STATE_RUNNING;
|
CurrentThread->Tcb.LastTick = TickCount.u.LowPart;
|
||||||
KeReleaseSpinLock(&ThreadListLock,irql);
|
CurrentThread->Tcb.State = THREAD_STATE_RUNNING;
|
||||||
return;
|
KeReleaseSpinLock(
|
||||||
}
|
& ThreadListLock,
|
||||||
if (Candidate != NULL)
|
irql
|
||||||
{
|
);
|
||||||
DPRINT("Scheduling %x\n",Candidate);
|
return;
|
||||||
|
}
|
||||||
|
if (Candidate != NULL)
|
||||||
|
{
|
||||||
|
DPRINT("Scheduling %x\n",Candidate);
|
||||||
|
|
||||||
|
Candidate->Tcb.State = THREAD_STATE_RUNNING;
|
||||||
|
|
||||||
Candidate->Tcb.State = THREAD_STATE_RUNNING;
|
KeQueryTickCount(&TickCount);
|
||||||
|
CurrentThread->Tcb.LastTick = TickCount.u.LowPart;
|
||||||
|
|
||||||
KeQueryTickCount(&TickCount);
|
CurrentThread = Candidate;
|
||||||
CurrentThread->Tcb.LastTick = TickCount.u.LowPart;
|
|
||||||
|
|
||||||
CurrentThread = Candidate;
|
HalTaskSwitch(&CurrentThread->Tcb);
|
||||||
|
KeReleaseSpinLock(
|
||||||
HalTaskSwitch(&CurrentThread->Tcb);
|
& ThreadListLock,
|
||||||
KeReleaseSpinLock(&ThreadListLock, irql);
|
irql
|
||||||
return;
|
);
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
DbgPrint("CRITICAL: No threads are runnable\n");
|
}
|
||||||
KeBugCheck(0);
|
DbgPrint("CRITICAL: No threads are runnable\n");
|
||||||
|
KeBugCheck(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
|
|
||||||
PETHREAD* ThreadPtr,
|
NTSTATUS
|
||||||
PHANDLE ThreadHandle,
|
PsInitializeThread (
|
||||||
ACCESS_MASK DesiredAccess,
|
HANDLE ProcessHandle,
|
||||||
POBJECT_ATTRIBUTES ThreadAttributes)
|
PETHREAD * ThreadPtr,
|
||||||
|
PHANDLE ThreadHandle,
|
||||||
|
ACCESS_MASK DesiredAccess,
|
||||||
|
POBJECT_ATTRIBUTES ThreadAttributes
|
||||||
|
)
|
||||||
{
|
{
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -273,7 +303,9 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID PsResumeThread(PETHREAD Thread)
|
|
||||||
|
VOID
|
||||||
|
PsResumeThread(PETHREAD Thread)
|
||||||
{
|
{
|
||||||
DPRINT("PsResumeThread(Thread %x)\n",Thread);
|
DPRINT("PsResumeThread(Thread %x)\n",Thread);
|
||||||
Thread->Tcb.SuspendCount--;
|
Thread->Tcb.SuspendCount--;
|
||||||
|
@ -286,7 +318,9 @@ VOID PsResumeThread(PETHREAD Thread)
|
||||||
DPRINT("Finished PsResumeThread()\n");
|
DPRINT("Finished PsResumeThread()\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID PsSuspendThread(PETHREAD Thread)
|
|
||||||
|
VOID
|
||||||
|
PsSuspendThread(PETHREAD Thread)
|
||||||
{
|
{
|
||||||
DPRINT("PsSuspendThread(Thread %x)\n",Thread);
|
DPRINT("PsSuspendThread(Thread %x)\n",Thread);
|
||||||
Thread->Tcb.SuspendCount++;
|
Thread->Tcb.SuspendCount++;
|
||||||
|
@ -300,12 +334,16 @@ VOID PsSuspendThread(PETHREAD Thread)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID PiDeleteThread(PVOID ObjectBody)
|
|
||||||
|
VOID
|
||||||
|
PiDeleteThread(PVOID ObjectBody)
|
||||||
{
|
{
|
||||||
DbgPrint("PiDeleteThread(ObjectBody %x)\n",ObjectBody);
|
DbgPrint("PiDeleteThread(ObjectBody %x)\n",ObjectBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID PsInitThreadManagment(VOID)
|
|
||||||
|
VOID
|
||||||
|
PsInitThreadManagment(VOID)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Initialize thread managment
|
* FUNCTION: Initialize thread managment
|
||||||
*/
|
*/
|
||||||
|
@ -354,7 +392,9 @@ VOID PsInitThreadManagment(VOID)
|
||||||
DoneInitYet = TRUE;
|
DoneInitYet = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
NtCreateThread (
|
NtCreateThread (
|
||||||
PHANDLE ThreadHandle,
|
PHANDLE ThreadHandle,
|
||||||
ACCESS_MASK DesiredAccess,
|
ACCESS_MASK DesiredAccess,
|
||||||
|
@ -400,7 +440,9 @@ NtCreateThread (
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
|
|
||||||
|
NTSTATUS
|
||||||
|
PsCreateSystemThread(PHANDLE ThreadHandle,
|
||||||
ACCESS_MASK DesiredAccess,
|
ACCESS_MASK DesiredAccess,
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes,
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
HANDLE ProcessHandle,
|
HANDLE ProcessHandle,
|
||||||
|
@ -454,12 +496,16 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle,
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment)
|
|
||||||
|
LONG
|
||||||
|
KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
KPRIORITY KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority)
|
|
||||||
|
KPRIORITY
|
||||||
|
KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority)
|
||||||
{
|
{
|
||||||
KPRIORITY OldPriority;
|
KPRIORITY OldPriority;
|
||||||
OldPriority = Thread->BasePriority;
|
OldPriority = Thread->BasePriority;
|
||||||
|
@ -638,3 +684,6 @@ NtYieldExecution(VOID)
|
||||||
PsDispatchThread();
|
PsDispatchThread();
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,58 +1,210 @@
|
||||||
|
/* $Id: interlck.c,v 1.3 1999/08/29 06:59:11 ea Exp $
|
||||||
|
*
|
||||||
|
* reactos/ntoskrnl/rtl/interlck.c
|
||||||
|
*
|
||||||
|
* FIXME: change decorated names when __fastcall will be available
|
||||||
|
* (for both egcs 1.1.2 and gcc 2.95 FASTCALL == STDCALL).
|
||||||
|
*/
|
||||||
|
#include <reactos/config.h>
|
||||||
|
#include <ntos.h>
|
||||||
|
#include <internal/debug.h>
|
||||||
|
|
||||||
void InterlockedIncrement(void);
|
|
||||||
__asm__("\n\t.global _InterlockedIncrement\n\t"
|
/**********************************************************************
|
||||||
"_InterlockedIncrement:\n\t"
|
* FASTCALL: @InterlockedIncrement@0
|
||||||
"pushl %ebp\n\t"
|
* STDCALL : _InterlockedIncrement@4
|
||||||
"movl %esp,%ebp\n\t"
|
*/
|
||||||
"pushl %ebx\n\t"
|
LONG
|
||||||
"movl $1,%eax\n\t"
|
FASTCALL
|
||||||
"movl 8(%ebp),%ebx\n\t"
|
InterlockedIncrement (
|
||||||
"xaddl %eax,(%ebx)\n\t"
|
PLONG Addend
|
||||||
"popl %ebx\n\t"
|
);
|
||||||
"movl %ebp,%esp\n\t"
|
__asm__(
|
||||||
"popl %ebp\n\t"
|
"\n\t.global _InterlockedIncrement@4\n\t"
|
||||||
"ret\n\t");
|
"_InterlockedIncrement@4:\n\t"
|
||||||
|
"pushl %ebp\n\t"
|
||||||
|
"movl %esp,%ebp\n\t"
|
||||||
|
"pushl %ebx\n\t"
|
||||||
|
"movl $1,%eax\n\t"
|
||||||
|
"movl 8(%ebp),%ebx\n\t"
|
||||||
|
"xaddl %eax,(%ebx)\n\t"
|
||||||
|
"popl %ebx\n\t"
|
||||||
|
"movl %ebp,%esp\n\t"
|
||||||
|
"popl %ebp\n\t"
|
||||||
|
"ret $4\n\t"
|
||||||
|
);
|
||||||
|
/*
|
||||||
|
__asm__(
|
||||||
|
#ifndef CONFIG_USE_FASTCALL
|
||||||
|
".global _InterlockedIncrement@4\n"
|
||||||
|
"\t_InterlockedIncrement@4:\n"
|
||||||
|
"\tmovl 4(%esp), %ecx\n"
|
||||||
|
#else
|
||||||
|
".global @InterlockedIncrement@0\n"
|
||||||
|
"\t@InterlockedIncrement@0:\n"
|
||||||
|
#endif
|
||||||
|
"\tmov $1, %eax\n"
|
||||||
|
"\txadd %ecx, %eax\n"
|
||||||
|
"\tinc %eax\n\n"
|
||||||
|
#ifndef CONFIG_USE_FASTCALL
|
||||||
|
"\tret $4\n"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
void InterlockedDecrement(void);
|
/**********************************************************************
|
||||||
__asm__("\n\t.global _InterlockedDecrement\n\t"
|
* FASTCALL: @InterlockedDecrement@0
|
||||||
"_InterlockedDecrement:\n\t"
|
* STDCALL : _InterlockedDecrement@4
|
||||||
"movl $0xffffffff,%eax\n\t"
|
*/
|
||||||
"movl 4(%esp),%ebx\n\t"
|
LONG
|
||||||
"xaddl %eax,(%ebx)\n\t"
|
FASTCALL
|
||||||
"decl %eax\n\t"
|
InterlockedDecrement (
|
||||||
"ret\n\t");
|
PLONG Addend
|
||||||
|
);
|
||||||
void InterlockedExchange(void);
|
__asm__(
|
||||||
__asm__("\n\t.global _InterlockedExchange\n\t"
|
"\n\t.global _InterlockedDecrement@4\n\t"
|
||||||
"_InterlockedExchange:\n\t"
|
"_InterlockedDecrement@4:\n\t"
|
||||||
"pushl %ebp\n\t"
|
"movl $0xffffffff,%eax\n\t"
|
||||||
"movl %esp,%ebp\n\t"
|
"movl 4(%esp),%ebx\n\t"
|
||||||
"pushl %eax\n\t"
|
"xaddl %eax,(%ebx)\n\t"
|
||||||
"pushl %ebx\n\t"
|
"decl %eax\n\t"
|
||||||
"movl 12(%ebp),%eax\n\t"
|
"ret $4\n\t"
|
||||||
"movl 8(%ebp),%ebx\n\t"
|
);
|
||||||
"xchgl %eax,(%ebx)\n\t"
|
|
||||||
"popl %ebx\n\t"
|
/**********************************************************************
|
||||||
"popl %eax\n\t"
|
* FASTCALL: @InterlockedExchange@0
|
||||||
"movl %ebp,%esp\n\t"
|
* STDCALL : _InterlockedExchange@8
|
||||||
"popl %ebp\n\t"
|
*/
|
||||||
"ret\n\t");
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedExchange (
|
||||||
|
PLONG Target,
|
||||||
|
LONG Value
|
||||||
|
);
|
||||||
|
__asm__(
|
||||||
|
"\n\t.global _InterlockedExchange@8\n\t"
|
||||||
|
"_InterlockedExchange@8:\n\t"
|
||||||
|
"pushl %ebp\n\t"
|
||||||
|
"movl %esp,%ebp\n\t"
|
||||||
|
"pushl %eax\n\t"
|
||||||
|
"pushl %ebx\n\t"
|
||||||
|
"movl 12(%ebp),%eax\n\t"
|
||||||
|
"movl 8(%ebp),%ebx\n\t"
|
||||||
|
"xchgl %eax,(%ebx)\n\t"
|
||||||
|
"popl %ebx\n\t"
|
||||||
|
"popl %eax\n\t"
|
||||||
|
"movl %ebp,%esp\n\t"
|
||||||
|
"popl %ebp\n\t"
|
||||||
|
"ret $8\n\t"
|
||||||
|
);
|
||||||
|
/*
|
||||||
|
__asm__(
|
||||||
|
#ifndef CONFIG_USE_FASTCALL
|
||||||
|
".global _InterlockedExchange@8\n"
|
||||||
|
"_InterlockedExchange@8:\n"
|
||||||
|
"\tmovl 4(%esp), %ecx\n"
|
||||||
|
"\tmovl 8(%esp), %edx\n"
|
||||||
|
#else
|
||||||
|
".global @InterlockedExchange@0\n"
|
||||||
|
"@InterlockedExchange@0:\n"
|
||||||
|
#endif
|
||||||
|
"\tmovl %ecx, %eax\n"
|
||||||
|
"__InterlockedExchange_Loop:\n"
|
||||||
|
"\tlock\n"
|
||||||
|
"\tcmpxchg %ecx, %edx\n"
|
||||||
|
"\tjne __InterlockedExchange_Loop\n"
|
||||||
|
#ifndef CONFIG_USE_FASTCALL
|
||||||
|
"\tmovl %ecx, 4(%esp)\n"
|
||||||
|
"\tret $8\n"
|
||||||
|
#else
|
||||||
|
"\tret\n"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
void InterlockedExchangeAdd(void);
|
|
||||||
__asm__("\n\t.global _InterlockedExchangeAdd\n\t"
|
|
||||||
"_InterlockedExchangeAdd:\n\t"
|
|
||||||
"movl 8(%esp),%eax\n\t"
|
|
||||||
"movl 4(%esp),%ebx\n\t"
|
|
||||||
"xaddl %eax,(%ebx)\n\t"
|
|
||||||
"ret\n\t");
|
|
||||||
|
|
||||||
void InterlockedCompareExchange(void);
|
/**********************************************************************
|
||||||
__asm__("\n\t.global _InterlockedCompareExchange\n\t"
|
* FASTCALL: @InterlockedExchangeAdd@0
|
||||||
"_InterlockedCompareExchange:\n\t"
|
* STDCALL : _InterlockedExchangeAdd@8
|
||||||
"movl 12(%esp),%eax\n\t"
|
*/
|
||||||
"movl 8(%esp),%edx\n\t"
|
LONG
|
||||||
"movl 4(%esp),%ebx\n\t"
|
FASTCALL
|
||||||
"cmpxchg %edx,(%ebx)\n\t"
|
InterlockedExchangeAdd (
|
||||||
"movl %edx,%eax\n\t"
|
PLONG Addend,
|
||||||
"ret\n\t");
|
LONG Value
|
||||||
|
);
|
||||||
|
__asm__(
|
||||||
|
"\n\t.global _InterlockedExchangeAdd@8\n\t"
|
||||||
|
"_InterlockedExchangeAdd@8:\n\t"
|
||||||
|
"movl 8(%esp),%eax\n\t"
|
||||||
|
"movl 4(%esp),%ebx\n\t"
|
||||||
|
"xaddl %eax,(%ebx)\n\t"
|
||||||
|
"ret $8\n\t"
|
||||||
|
);
|
||||||
|
/*
|
||||||
|
__asm__(
|
||||||
|
#ifndef CONFIG_USE_FASTCALL
|
||||||
|
".global _InterlockedExchangeAdd@8\n"
|
||||||
|
"\t_InterlockedExchangeAdd@8:\n"
|
||||||
|
"\tmovl 4(%esp), %ecx\n"
|
||||||
|
"\tmovl 8(%esp), %edx\n"
|
||||||
|
#else
|
||||||
|
".global @InterlockedExchangeAdd@0\n"
|
||||||
|
"\t@InterlockedExchangeAdd@0:\n"
|
||||||
|
#endif
|
||||||
|
"\txadd %edx, %ecx\n"
|
||||||
|
"\tmovl %edx, %eax\n"
|
||||||
|
#ifndef CONFIG_USE_FASTCALL
|
||||||
|
"\tret $8\n"
|
||||||
|
#else
|
||||||
|
"\tret\n"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* FASTCALL: @InterlockedCompareExchange@4
|
||||||
|
* STDCALL : _InterlockedCompareExchange@12
|
||||||
|
*/
|
||||||
|
PVOID
|
||||||
|
FASTCALL
|
||||||
|
InterlockedCompareExchange (
|
||||||
|
PVOID * Destination,
|
||||||
|
PVOID Exchange,
|
||||||
|
PVOID Comperand
|
||||||
|
);
|
||||||
|
__asm__(
|
||||||
|
"\n\t.global _InterlockedCompareExchange@12\n\t"
|
||||||
|
"_InterlockedCompareExchange@12:\n\t"
|
||||||
|
"movl 12(%esp),%eax\n\t"
|
||||||
|
"movl 8(%esp),%edx\n\t"
|
||||||
|
"movl 4(%esp),%ebx\n\t"
|
||||||
|
"cmpxchg %edx,(%ebx)\n\t"
|
||||||
|
"movl %edx,%eax\n\t"
|
||||||
|
"ret $12\n\t"
|
||||||
|
);
|
||||||
|
/*
|
||||||
|
__asm__(
|
||||||
|
#ifndef CONFIG_USE_FASTCALL
|
||||||
|
".global _InterlockedCompareExchange@12\n"
|
||||||
|
"\t_InterlockedCompareExchange@12:\n"
|
||||||
|
"\tmovl 4(%esp), %ecx\n"
|
||||||
|
"\tmovl 8(%esp), %edx\n"
|
||||||
|
"\tmovl 12(%esp), %eax\n"
|
||||||
|
#else
|
||||||
|
".global @InterlockedCompareExchange@4\n"
|
||||||
|
"\t@InterlockedCompareExchange@4:\n"
|
||||||
|
"\tmovl 4(%esp), %eax\n"
|
||||||
|
#endif
|
||||||
|
"\tcmpxchg %ecx, %edx\n"
|
||||||
|
#ifndef CONFIG_USE_FASTCALL
|
||||||
|
"\tret $12\n"
|
||||||
|
#else
|
||||||
|
"\tret $4\n"
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
Loading…
Reference in a new issue