- Create \wmi directory and put wmi.c, since it's the start of a large chunk of the XP+ kernel dedicated to WMI support.
- Separate \io into \iomgr and \pnpmgr
svn path=/trunk/; revision=22747
- I/O Packet APIs improvements Part 2:
- Implement IoSetStartIoAttributes
- Obey StartIo Flags set by IoSetStartIoAttributes and change Packet functions to Windows XP/2003 semantics by supporting non-cancelable packets and deferred Start I/O calling.
svn path=/trunk/; revision=22746
- I/O Packet APIs fixes Part 1:
- Clear the current IRP before parsing the Device Queues
- Respect Cancelable parameter in IoStartNextPacket(ByKey) instead of ignoring it (acquire the cancel lock when it's requested)
- Raise IRQL to DISPATCH_LEVEL in IoStartPacket instead of expecting the caller to do it and crashing. Also only use Cancel Lock if a Cancel Function was specified.
- Actually handle the case where the IRP Was cancelled right after insert and the Cancel Routine has to be called.
svn path=/trunk/; revision=22744
- Modify IoUnregisterShudownNotification to loop both lists now.
- Used the lock in IoShutdownREgisteredDevices when looping the list, and changed it to send IRP_MJ_SHUTDOWN to the attached DO. Also fixed a memory leak where the shutdown entry wasn't being freed, and optimized the function only to initialize the event once (And simply clear it each time).
- Moved IoSynchronousInvalidateDeviceRelations to PnP
svn path=/trunk/; revision=22743
- Fix some bugs in IoGetRelatedDeviceObject: We should make sure that FO_DIRECT_DEVICE_OPEN isn't set when reading from the VPB's DO, otherwise we return the FO's DO directly. Also check for attachment before trying to get any attached device.
svn path=/trunk/; revision=22741
- Implement device unloading through IopUnloadDevice and device referencing through IopReferenceDeviceObject and IopDereferenceDeviceObject, and make IoDeleteDevice and IoDetachDevice unload the device on 0 reference count. Doesn't fully work yet.
- Simplify IoGetAttachedDEvice/IoGetAttachedDeviceReference not to use an extra stack variable.
svn path=/trunk/; revision=22740
- IoAttachDevice/IoAttachDeviceByPointer: Fail with STATUS_NO_SUCH_DEVICE if we couldn't attach.
- IoAttachDEviceTodEviceStackSafe: VPBs don't get inherited.
- IoCreateDevice: Only set OBJ_PERMAMENT if the caller requested it.
- IoCreateDevice: Return a NULL Device object if we failed to create it.
- IoCreateDevice: Set alignment requirement to 0, x86 doesn't need it.
svn path=/trunk/; revision=22736
- Fix IoSetThreadHardErrorMode... it was reading the TEB instead of the PETHREAD.
- Optimize Error Logging: Use a static work item instead of allocating one each time, and don't use a spinlock for the buffer count, when we can use interlocked functions instead.
- Log Entries can have Device AND/OR Driver Objects, not just a single one. They must also be referenced/dereferenced on allocation/free.
- Rewrite IopLogWorker to properly deal with Device/Driver objects and querying their names, as well as with additional strings that the caller might be sending.
svn path=/trunk/; revision=22734
1. Do not try todo HeapFree when pointer is NULL in cleanup:
2. Remove goto cleanup code
3. Rewrote the code so it does not need goto
svn path=/trunk/; revision=22732
- Remlock's code was written by Filip Navara and is clean. My additions are based on wdm.h and only add size checks and fix two visible bugs.
- Add basic support/detection for debug I/O remove blocks (we bugcheck if we identify one though).
- Simplify IoReleaseRemoveLockAndWaitEx
- Remove locks are SYNCH events, not Notification events!
- Make sure IoConnectInterrupt returns NULL to the caller on failure.
svn path=/trunk/; revision=22724
- Use DELETE instead of SYMBOLIC_LINK_ALL_ACCESS when deleting.
- Fix formatting in timer.c
- Clear the IO_TIMER structure when creating it.
svn path=/trunk/; revision=22722
- Use only one SEH block in NtRemoveIoCompletion
- Get the completion status from the IRP, not from the Mini-Packet, if the completion came from an IRP and not a Mini-Packet.
svn path=/trunk/; revision=22721
1. Remove goto in the code, goto is slow and should be avoid.
2. reformat for adding {} around some code.
3. remove some NULL check after I did remove goto that is not longer need it.
svn path=/trunk/; revision=22718
- Rewrite I/O MDl support to use lookaside lists for allocations below 23 pages (same as on NT). This is is an incredible performance optimization because MDLs are often allocated and de-allocated during I/O operations, and using the lookaside list decreases pool fragmentation and slowdown.
- Rewrite IoBuildPartialMdl. It did not work like documented in the DDK and also had a bug documented by Microsoft as being in XP.
svn path=/trunk/; revision=22717
- Handle cases where we ran out of memory while trying to allocate the IRP
- Make sure the IRP can be re-used in IoReuseIrp.
svn path=/trunk/; revision=22707
- Bugcheck if cancelling and IRP that's already been completed.
- Bugcheck if attempting to call a driver with an IRP that's already past its maximum stack size.
- Make sure that when we free an IRP, it's not associated to a thread anymore, nor having any drivers that think it's valid.
svn path=/trunk/; revision=22706
- Don't handle IRP_MJ_POWER in IoBuildAsyncronousFsdRequest.
- Use IoAllocateMdl instead of being a cowboy and using MmCreateMdl.
- Handle failure/out-of-memory cases in IoBuildAsyncronousFsdRequest
- Free the input buffer on failure in IoBuildDeviceIoControlRequest
- Handle failure in IoBuildSyncronousFsdREquest.
svn path=/trunk/; revision=22705
- Don't read pointers from the file object or IRP before they are actually used, because in some parts of the code, these pointers could change before we actually use them.
- Get rid of the #if 1/#if 0 nonsense hbirr had added.
- Properly check for success/warning/failure cases (thanks to Filip for checking this out with me last year)
- Handle scenarios when the IRP is marked IRP_CREATE_OPERATION
- Bugcheck if IofCompleteRequest is called twice on the same IRP
- Copy the master IRP's thread to the associated IRP
- Free the Auxiliary Buffer if there is one.
- Some formatting fixes, and majorly recomment the code to make it a lot clearer and more verbose on some of the more intricate details.
- Remove some hacks which I don't think are needed anymore. If you notice regressions due to this patch let me know ASAP.
svn path=/trunk/; revision=22704
- Fix irp.c file header
- IopRemoveThreadIrp:
- Get the DeviceObject and I/O Stack *before* going back to dispatch, otherwise race conditions will happen.
- Don't complete and IRP if it's already been through two stacks.
- Remove the IRP from the thread's IRP list before re-initializing the list, or else the IRP was lost.
- Make sure we have an error log entry before writing to it.
svn path=/trunk/; revision=22703
[AUDIT] - The routines in this file mostly come from documented information in "NT File System Internals" by Rajeev Nagar which has pseudo-code for a lot of them, and other WDM Books and information.
svn path=/trunk/; revision=22702