mirror of
https://github.com/reactos/reactos.git
synced 2024-07-14 00:25:05 +00:00
* Sync up to trunk head (r64959).
svn path=/branches/shell-experiments/; revision=64961
This commit is contained in:
commit
8069b8c90d
|
@ -108,8 +108,7 @@ i386PrintExceptionText(ULONG TrapIndex, PKTRAP_FRAME TrapFrame, PKSPECIAL_REGIST
|
||||||
i386_ScreenPosX = 0;
|
i386_ScreenPosX = 0;
|
||||||
i386_ScreenPosY = 0;
|
i386_ScreenPosY = 0;
|
||||||
|
|
||||||
PrintText("An error occured in FreeLoader\n"
|
PrintText("An error occured in " VERSION "\n"
|
||||||
VERSION"\n"
|
|
||||||
"Report this error to the ReactOS Development mailing list <ros-dev@reactos.org>\n\n"
|
"Report this error to the ReactOS Development mailing list <ros-dev@reactos.org>\n\n"
|
||||||
"0x%02lx: %s\n", TrapIndex, i386ExceptionDescriptionText[TrapIndex]);
|
"0x%02lx: %s\n", TrapIndex, i386ExceptionDescriptionText[TrapIndex]);
|
||||||
#ifdef _M_IX86
|
#ifdef _M_IX86
|
||||||
|
|
|
@ -32,7 +32,6 @@ DBG_DEFAULT_CHANNEL(MEMORY);
|
||||||
#define STACK_BASE_PAGE (STACKLOW / PAGE_SIZE)
|
#define STACK_BASE_PAGE (STACKLOW / PAGE_SIZE)
|
||||||
#define FREELDR_BASE_PAGE (FREELDR_BASE / PAGE_SIZE)
|
#define FREELDR_BASE_PAGE (FREELDR_BASE / PAGE_SIZE)
|
||||||
#define DISKBUF_BASE_PAGE (DISKREADBUFFER / PAGE_SIZE)
|
#define DISKBUF_BASE_PAGE (DISKREADBUFFER / PAGE_SIZE)
|
||||||
#define BIOSBUF_BASE_PAGE (BIOSCALLBUFFER / PAGE_SIZE)
|
|
||||||
|
|
||||||
#define STACK_PAGE_COUNT (FREELDR_BASE_PAGE - STACK_BASE_PAGE)
|
#define STACK_PAGE_COUNT (FREELDR_BASE_PAGE - STACK_BASE_PAGE)
|
||||||
#define FREELDR_PAGE_COUNT (DISKBUF_BASE_PAGE - FREELDR_BASE_PAGE)
|
#define FREELDR_PAGE_COUNT (DISKBUF_BASE_PAGE - FREELDR_BASE_PAGE)
|
||||||
|
@ -45,11 +44,10 @@ ULONG PcBiosMapCount;
|
||||||
FREELDR_MEMORY_DESCRIPTOR PcMemoryMap[MAX_BIOS_DESCRIPTORS + 1] =
|
FREELDR_MEMORY_DESCRIPTOR PcMemoryMap[MAX_BIOS_DESCRIPTORS + 1] =
|
||||||
{
|
{
|
||||||
{ LoaderFirmwarePermanent, 0x00, 1 }, // realmode int vectors
|
{ LoaderFirmwarePermanent, 0x00, 1 }, // realmode int vectors
|
||||||
{ LoaderFirmwareTemporary, 0x01, STACK_BASE_PAGE - 1 }, // freeldr stack + cmdline
|
{ LoaderFirmwareTemporary, 0x01, STACK_BASE_PAGE - 1 }, // freeldr stack, cmdline, BIOS call buffer
|
||||||
{ LoaderOsloaderStack, STACK_BASE_PAGE, FREELDR_BASE_PAGE - STACK_BASE_PAGE }, // prot mode stack.
|
{ LoaderOsloaderStack, STACK_BASE_PAGE, FREELDR_BASE_PAGE - STACK_BASE_PAGE }, // prot mode stack.
|
||||||
{ LoaderLoadedProgram, FREELDR_BASE_PAGE, FREELDR_PAGE_COUNT }, // freeldr image
|
{ LoaderLoadedProgram, FREELDR_BASE_PAGE, FREELDR_PAGE_COUNT }, // freeldr image
|
||||||
{ LoaderFirmwareTemporary, DISKBUF_BASE_PAGE, DISKBUF_PAGE_COUNT }, // Disk read buffer for int 13h. DISKREADBUFFER
|
{ LoaderFirmwareTemporary, DISKBUF_BASE_PAGE, DISKBUF_PAGE_COUNT }, // Disk read buffer for int 13h. DISKREADBUFFER
|
||||||
{ LoaderFirmwareTemporary, BIOSBUF_BASE_PAGE, BIOSBUF_PAGE_COUNT }, // BIOSCALLBUFFER
|
|
||||||
{ LoaderFirmwarePermanent, 0x9F, 0x1 }, // EBDA
|
{ LoaderFirmwarePermanent, 0x9F, 0x1 }, // EBDA
|
||||||
{ LoaderFirmwarePermanent, 0xA0, 0x50 }, // ROM / Video
|
{ LoaderFirmwarePermanent, 0xA0, 0x50 }, // ROM / Video
|
||||||
{ LoaderSpecialMemory, 0xF0, 0x10 }, // ROM / Video
|
{ LoaderSpecialMemory, 0xF0, 0x10 }, // ROM / Video
|
||||||
|
@ -203,13 +201,14 @@ PcMemGetBiosMemoryMap(PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG MaxMemoryMapSi
|
||||||
bit value at address 0x413 inside the BDA, which gives us the usable size
|
bit value at address 0x413 inside the BDA, which gives us the usable size
|
||||||
in KB */
|
in KB */
|
||||||
Size = (*(PUSHORT)(ULONG_PTR)0x413) * 1024;
|
Size = (*(PUSHORT)(ULONG_PTR)0x413) * 1024;
|
||||||
if (Size < 0x9F000)
|
if (Size < MEMORY_MARGIN)
|
||||||
{
|
{
|
||||||
FrLdrBugCheckWithMessage(
|
FrLdrBugCheckWithMessage(
|
||||||
MEMORY_INIT_FAILURE,
|
MEMORY_INIT_FAILURE,
|
||||||
__FILE__,
|
__FILE__,
|
||||||
__LINE__,
|
__LINE__,
|
||||||
"The BIOS reported a usable memory range up to 0x%x, which is too small!\n",
|
"The BIOS reported a usable memory range up to 0x%x, which is too small!\n\n"
|
||||||
|
"If you see this, please report to the ReactOS team!",
|
||||||
Size);
|
Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,13 +229,13 @@ PcMemGetBiosMemoryMap(PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG MaxMemoryMapSi
|
||||||
{
|
{
|
||||||
/* Check if this is high enough */
|
/* Check if this is high enough */
|
||||||
ULONG EbdaBase = (ULONG)Regs.w.es << 4;
|
ULONG EbdaBase = (ULONG)Regs.w.es << 4;
|
||||||
if (EbdaBase < 0x9F000)
|
if (EbdaBase < MEMORY_MARGIN)
|
||||||
{
|
{
|
||||||
FrLdrBugCheckWithMessage(
|
FrLdrBugCheckWithMessage(
|
||||||
MEMORY_INIT_FAILURE,
|
MEMORY_INIT_FAILURE,
|
||||||
__FILE__,
|
__FILE__,
|
||||||
__LINE__,
|
__LINE__,
|
||||||
"The location of your EBDA is 0x%lx, which is too low!\n"
|
"The location of your EBDA is 0x%lx, which is too low!\n\n"
|
||||||
"If you see this, please report to the ReactOS team!",
|
"If you see this, please report to the ReactOS team!",
|
||||||
EbdaBase);
|
EbdaBase);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#define PDP_ADDRESS HEX(2000) /* One page PDP page table */
|
#define PDP_ADDRESS HEX(2000) /* One page PDP page table */
|
||||||
#define PD_ADDRESS HEX(3000) /* One page PD page table */
|
#define PD_ADDRESS HEX(3000) /* One page PD page table */
|
||||||
//#endif
|
//#endif
|
||||||
|
#define BIOSCALLBUFFER HEX(4000) /* Buffer to store temporary data for any Int386() call */
|
||||||
#define STACK16ADDR HEX(6F00) /* The 16-bit stack top will be at 0000:6F00 */
|
#define STACK16ADDR HEX(6F00) /* The 16-bit stack top will be at 0000:6F00 */
|
||||||
#define BSS_START HEX(6F00)
|
#define BSS_START HEX(6F00)
|
||||||
#define STACKLOW HEX(7000)
|
#define STACKLOW HEX(7000)
|
||||||
|
@ -16,7 +17,7 @@
|
||||||
#define FREELDR_BASE HEX(F800)
|
#define FREELDR_BASE HEX(F800)
|
||||||
#define FREELDR_PE_BASE HEX(10000)
|
#define FREELDR_PE_BASE HEX(10000)
|
||||||
#define DISKREADBUFFER HEX(8E000) /* Buffer to store data read in from the disk via the BIOS */
|
#define DISKREADBUFFER HEX(8E000) /* Buffer to store data read in from the disk via the BIOS */
|
||||||
#define BIOSCALLBUFFER HEX(9E000) /* Buffer to store temporary data for any Int386() call */
|
#define MEMORY_MARGIN HEX(9E000) /* Highest usable address */
|
||||||
/* 9F000- 9FFFF is reserved for the EBDA */
|
/* 9F000- 9FFFF is reserved for the EBDA */
|
||||||
#define DISKREADBUFFER_SIZE HEX(10000)
|
#define DISKREADBUFFER_SIZE HEX(10000)
|
||||||
|
|
||||||
|
|
|
@ -28,22 +28,21 @@ list(APPEND SOURCE
|
||||||
reg/reg.c
|
reg/reg.c
|
||||||
sec/ac.c
|
sec/ac.c
|
||||||
sec/audit.c
|
sec/audit.c
|
||||||
sec/cred.c
|
|
||||||
sec/lsa.c
|
sec/lsa.c
|
||||||
sec/misc.c
|
sec/misc.c
|
||||||
sec/safer.c
|
sec/safer.c
|
||||||
sec/sec.c
|
sec/sec.c
|
||||||
sec/sid.c
|
|
||||||
sec/trustee.c
|
sec/trustee.c
|
||||||
service/eventlog.c
|
service/eventlog.c
|
||||||
service/rpc.c
|
service/rpc.c
|
||||||
service/scm.c
|
service/scm.c
|
||||||
service/sctrl.c
|
service/sctrl.c
|
||||||
token/privilege.c
|
|
||||||
token/token.c
|
token/token.c
|
||||||
|
wine/cred.c
|
||||||
wine/crypt.c
|
wine/crypt.c
|
||||||
wine/crypt_des.c
|
wine/crypt_des.c
|
||||||
wine/crypt_lmhash.c
|
wine/crypt_lmhash.c
|
||||||
|
wine/security.c
|
||||||
advapi32.h)
|
advapi32.h)
|
||||||
|
|
||||||
add_library(advapi32 SHARED
|
add_library(advapi32 SHARED
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS system libraries
|
|
||||||
* FILE: lib/advapi32/token/privilege.c
|
|
||||||
* PURPOSE: advapi32.dll token's privilege handling
|
|
||||||
* PROGRAMMER: E.Aliberti
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* 20010317 ea stubs
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <advapi32.h>
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* PrivilegeCheck EXPORTED
|
|
||||||
*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
BOOL WINAPI
|
|
||||||
PrivilegeCheck(HANDLE ClientToken,
|
|
||||||
PPRIVILEGE_SET RequiredPrivileges,
|
|
||||||
LPBOOL pfResult)
|
|
||||||
{
|
|
||||||
BOOLEAN Result;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
Status = NtPrivilegeCheck(ClientToken,
|
|
||||||
RequiredPrivileges,
|
|
||||||
&Result);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
SetLastError(RtlNtStatusToDosError(Status));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*pfResult = (BOOL)Result;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
File diff suppressed because it is too large
Load diff
|
@ -256,11 +256,11 @@ check Wine current souces first as it may already be fixed.
|
||||||
reactos/lib/3rdparty/strmbase # Synced to Wine-1.7.27
|
reactos/lib/3rdparty/strmbase # Synced to Wine-1.7.27
|
||||||
|
|
||||||
advapi32 -
|
advapi32 -
|
||||||
|
reactos/dll/win32/advapi32/wine/cred.c # Synced to Wine-1.7.27
|
||||||
reactos/dll/win32/advapi32/wine/crypt.c # Synced to Wine-1.7.27
|
reactos/dll/win32/advapi32/wine/crypt.c # Synced to Wine-1.7.27
|
||||||
reactos/dll/win32/advapi32/wine/crypt_des.c # Synced to Wine-1.7.27
|
reactos/dll/win32/advapi32/wine/crypt_des.c # Synced to Wine-1.7.27
|
||||||
reactos/dll/win32/advapi32/wine/crypt_lmhash.c # Synced to Wine-1.7.27
|
reactos/dll/win32/advapi32/wine/crypt_lmhash.c # Synced to Wine-1.7.27
|
||||||
reactos/dll/win32/advapi32/sec/cred.c # Synced to Wine-1.7.27
|
reactos/dll/win32/advapi32/wine/security.c # Out of Sync
|
||||||
reactos/dll/win32/advapi32/sec/sid.c # Out of Sync
|
|
||||||
|
|
||||||
gdi32 -
|
gdi32 -
|
||||||
reactos/dll/win32/gdi32/objects/linedda.c # Synced at 20090410
|
reactos/dll/win32/gdi32/objects/linedda.c # Synced at 20090410
|
||||||
|
|
|
@ -1277,6 +1277,8 @@ extern ULONG IopNumTriageDumpDataBlocks;
|
||||||
extern PVOID IopTriageDumpDataBlocks[64];
|
extern PVOID IopTriageDumpDataBlocks[64];
|
||||||
extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList;
|
extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList;
|
||||||
extern PDRIVER_OBJECT IopRootDriverObject;
|
extern PDRIVER_OBJECT IopRootDriverObject;
|
||||||
|
extern KSPIN_LOCK IopDeviceRelationsSpinLock;
|
||||||
|
extern LIST_ENTRY IopDeviceRelationsRequestList;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Inlined Functions
|
// Inlined Functions
|
||||||
|
|
|
@ -81,6 +81,9 @@
|
||||||
/* formerly located in io/mdl.c */
|
/* formerly located in io/mdl.c */
|
||||||
#define TAG_MDL ' LDM'
|
#define TAG_MDL ' LDM'
|
||||||
|
|
||||||
|
/* formerly located in io/pnpmgr.c */
|
||||||
|
#define TAG_IO_DEVNODE 'donD'
|
||||||
|
|
||||||
/* formerly located in io/pnpnotify.c */
|
/* formerly located in io/pnpnotify.c */
|
||||||
#define TAG_PNP_NOTIFY 'NPnP'
|
#define TAG_PNP_NOTIFY 'NPnP'
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
/* GLOBALS ********************************************************************/
|
/* GLOBALS ********************************************************************/
|
||||||
|
|
||||||
|
ERESOURCE IopDriverLoadResource;
|
||||||
|
|
||||||
LIST_ENTRY DriverReinitListHead;
|
LIST_ENTRY DriverReinitListHead;
|
||||||
KSPIN_LOCK DriverReinitListLock;
|
KSPIN_LOCK DriverReinitListLock;
|
||||||
PLIST_ENTRY DriverReinitTailEntry;
|
PLIST_ENTRY DriverReinitTailEntry;
|
||||||
|
@ -113,6 +115,7 @@ IopGetDriverObject(
|
||||||
DPRINT("IopGetDriverObject(%p '%wZ' %x)\n",
|
DPRINT("IopGetDriverObject(%p '%wZ' %x)\n",
|
||||||
DriverObject, ServiceName, FileSystem);
|
DriverObject, ServiceName, FileSystem);
|
||||||
|
|
||||||
|
ASSERT(ExIsResourceAcquiredExclusiveLite(&IopDriverLoadResource));
|
||||||
*DriverObject = NULL;
|
*DriverObject = NULL;
|
||||||
|
|
||||||
/* Create ModuleName string */
|
/* Create ModuleName string */
|
||||||
|
@ -239,39 +242,44 @@ IopNormalizeImagePath(
|
||||||
PUNICODE_STRING ImagePath,
|
PUNICODE_STRING ImagePath,
|
||||||
_In_ PUNICODE_STRING ServiceName)
|
_In_ PUNICODE_STRING ServiceName)
|
||||||
{
|
{
|
||||||
|
UNICODE_STRING SystemRootString = RTL_CONSTANT_STRING(L"\\SystemRoot\\");
|
||||||
|
UNICODE_STRING DriversPathString = RTL_CONSTANT_STRING(L"\\SystemRoot\\system32\\drivers\\");
|
||||||
|
UNICODE_STRING DotSysString = RTL_CONSTANT_STRING(L".sys");
|
||||||
UNICODE_STRING InputImagePath;
|
UNICODE_STRING InputImagePath;
|
||||||
|
|
||||||
DPRINT("Normalizing image path '%wZ' for service '%wZ'\n", ImagePath, ServiceName);
|
DPRINT("Normalizing image path '%wZ' for service '%wZ'\n", ImagePath, ServiceName);
|
||||||
|
|
||||||
RtlCopyMemory(&InputImagePath,
|
InputImagePath = *ImagePath;
|
||||||
ImagePath,
|
|
||||||
sizeof(UNICODE_STRING));
|
|
||||||
|
|
||||||
if (InputImagePath.Length == 0)
|
if (InputImagePath.Length == 0)
|
||||||
{
|
{
|
||||||
ImagePath->Length = 0;
|
ImagePath->Length = 0;
|
||||||
ImagePath->MaximumLength =
|
ImagePath->MaximumLength = DriversPathString.Length +
|
||||||
(33 * sizeof(WCHAR)) + ServiceName->Length + sizeof(UNICODE_NULL);
|
ServiceName->Length +
|
||||||
ImagePath->Buffer = ExAllocatePool(NonPagedPool,
|
DotSysString.Length +
|
||||||
ImagePath->MaximumLength);
|
sizeof(UNICODE_NULL);
|
||||||
|
ImagePath->Buffer = ExAllocatePoolWithTag(NonPagedPool,
|
||||||
|
ImagePath->MaximumLength,
|
||||||
|
TAG_IO);
|
||||||
if (ImagePath->Buffer == NULL)
|
if (ImagePath->Buffer == NULL)
|
||||||
return STATUS_NO_MEMORY;
|
return STATUS_NO_MEMORY;
|
||||||
|
|
||||||
RtlAppendUnicodeToString(ImagePath, L"\\SystemRoot\\system32\\drivers\\");
|
RtlCopyUnicodeString(ImagePath, &DriversPathString);
|
||||||
RtlAppendUnicodeStringToString(ImagePath, ServiceName);
|
RtlAppendUnicodeStringToString(ImagePath, ServiceName);
|
||||||
RtlAppendUnicodeToString(ImagePath, L".sys");
|
RtlAppendUnicodeStringToString(ImagePath, &DotSysString);
|
||||||
}
|
}
|
||||||
else if (InputImagePath.Buffer[0] != L'\\')
|
else if (InputImagePath.Buffer[0] != L'\\')
|
||||||
{
|
{
|
||||||
ImagePath->Length = 0;
|
ImagePath->Length = 0;
|
||||||
ImagePath->MaximumLength =
|
ImagePath->MaximumLength = SystemRootString.Length +
|
||||||
12 * sizeof(WCHAR) + InputImagePath.Length + sizeof(UNICODE_NULL);
|
InputImagePath.Length +
|
||||||
ImagePath->Buffer = ExAllocatePool(NonPagedPool,
|
sizeof(UNICODE_NULL);
|
||||||
ImagePath->MaximumLength);
|
ImagePath->Buffer = ExAllocatePoolWithTag(NonPagedPool,
|
||||||
|
ImagePath->MaximumLength,
|
||||||
|
TAG_IO);
|
||||||
if (ImagePath->Buffer == NULL)
|
if (ImagePath->Buffer == NULL)
|
||||||
return STATUS_NO_MEMORY;
|
return STATUS_NO_MEMORY;
|
||||||
|
|
||||||
RtlAppendUnicodeToString(ImagePath, L"\\SystemRoot\\");
|
RtlCopyUnicodeString(ImagePath, &SystemRootString);
|
||||||
RtlAppendUnicodeStringToString(ImagePath, &InputImagePath);
|
RtlAppendUnicodeStringToString(ImagePath, &InputImagePath);
|
||||||
|
|
||||||
/* Free caller's string */
|
/* Free caller's string */
|
||||||
|
@ -308,6 +316,7 @@ IopLoadServiceModule(
|
||||||
HANDLE CCSKey, ServiceKey;
|
HANDLE CCSKey, ServiceKey;
|
||||||
PVOID BaseAddress;
|
PVOID BaseAddress;
|
||||||
|
|
||||||
|
ASSERT(ExIsResourceAcquiredExclusiveLite(&IopDriverLoadResource));
|
||||||
ASSERT(ServiceName->Length);
|
ASSERT(ServiceName->Length);
|
||||||
DPRINT("IopLoadServiceModule(%wZ, 0x%p)\n", ServiceName, ModuleObject);
|
DPRINT("IopLoadServiceModule(%wZ, 0x%p)\n", ServiceName, ModuleObject);
|
||||||
|
|
||||||
|
@ -319,8 +328,7 @@ IopLoadServiceModule(
|
||||||
ServiceStart = 0;
|
ServiceStart = 0;
|
||||||
|
|
||||||
/* IopNormalizeImagePath will do all of the work for us if we give it an empty string */
|
/* IopNormalizeImagePath will do all of the work for us if we give it an empty string */
|
||||||
ServiceImagePath.Length = ServiceImagePath.MaximumLength = 0;
|
RtlInitEmptyUnicodeString(&ServiceImagePath, NULL, 0);
|
||||||
ServiceImagePath.Buffer = NULL;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -563,6 +571,8 @@ IopAttachFilterDriversCallback(
|
||||||
ServiceName.MaximumLength =
|
ServiceName.MaximumLength =
|
||||||
ServiceName.Length = (USHORT)wcslen(Filters) * sizeof(WCHAR);
|
ServiceName.Length = (USHORT)wcslen(Filters) * sizeof(WCHAR);
|
||||||
|
|
||||||
|
KeEnterCriticalRegion();
|
||||||
|
ExAcquireResourceExclusiveLite(&IopDriverLoadResource, TRUE);
|
||||||
Status = IopGetDriverObject(&DriverObject,
|
Status = IopGetDriverObject(&DriverObject,
|
||||||
&ServiceName,
|
&ServiceName,
|
||||||
FALSE);
|
FALSE);
|
||||||
|
@ -571,7 +581,11 @@ IopAttachFilterDriversCallback(
|
||||||
/* Load and initialize the filter driver */
|
/* Load and initialize the filter driver */
|
||||||
Status = IopLoadServiceModule(&ServiceName, &ModuleObject);
|
Status = IopLoadServiceModule(&ServiceName, &ModuleObject);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
return Status;
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
Status = IopInitializeDriverModule(DeviceNode,
|
Status = IopInitializeDriverModule(DeviceNode,
|
||||||
ModuleObject,
|
ModuleObject,
|
||||||
|
@ -579,8 +593,15 @@ IopAttachFilterDriversCallback(
|
||||||
FALSE,
|
FALSE,
|
||||||
&DriverObject);
|
&DriverObject);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
|
|
||||||
Status = IopInitializeDevice(DeviceNode, DriverObject);
|
Status = IopInitializeDevice(DeviceNode, DriverObject);
|
||||||
|
|
||||||
|
@ -926,7 +947,6 @@ IopInitializeBuiltinDriver(IN PLDR_DATA_TABLE_ENTRY BootLdrEntry)
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
IopFreeDeviceNode(DeviceNode);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -990,7 +1010,6 @@ IopInitializeBootDrivers(VOID)
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Fail */
|
/* Fail */
|
||||||
IopFreeDeviceNode(DeviceNode);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -999,7 +1018,6 @@ IopInitializeBootDrivers(VOID)
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Fail */
|
/* Fail */
|
||||||
IopFreeDeviceNode(DeviceNode);
|
|
||||||
ObDereferenceObject(DriverObject);
|
ObDereferenceObject(DriverObject);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1009,7 +1027,6 @@ IopInitializeBootDrivers(VOID)
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Fail */
|
/* Fail */
|
||||||
IopFreeDeviceNode(DeviceNode);
|
|
||||||
ObDereferenceObject(DriverObject);
|
ObDereferenceObject(DriverObject);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1971,6 +1988,8 @@ IopLoadUnloadDriver(
|
||||||
DPRINT("FullImagePath: '%wZ'\n", &ImagePath);
|
DPRINT("FullImagePath: '%wZ'\n", &ImagePath);
|
||||||
DPRINT("Type: %lx\n", Type);
|
DPRINT("Type: %lx\n", Type);
|
||||||
|
|
||||||
|
KeEnterCriticalRegion();
|
||||||
|
ExAcquireResourceExclusiveLite(&IopDriverLoadResource, TRUE);
|
||||||
/*
|
/*
|
||||||
* Get existing DriverObject pointer (in case the driver
|
* Get existing DriverObject pointer (in case the driver
|
||||||
* has already been loaded and initialized).
|
* has already been loaded and initialized).
|
||||||
|
@ -1990,6 +2009,8 @@ IopLoadUnloadDriver(
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("MmLoadSystemImage() failed (Status %lx)\n", Status);
|
DPRINT("MmLoadSystemImage() failed (Status %lx)\n", Status);
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2000,6 +2021,8 @@ IopLoadUnloadDriver(
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("IopCreateDeviceNode() failed (Status %lx)\n", Status);
|
DPRINT1("IopCreateDeviceNode() failed (Status %lx)\n", Status);
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
MmUnloadSystemImage(ModuleObject);
|
MmUnloadSystemImage(ModuleObject);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -2015,17 +2038,24 @@ IopLoadUnloadDriver(
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("IopInitializeDriverModule() failed (Status %lx)\n", Status);
|
DPRINT1("IopInitializeDriverModule() failed (Status %lx)\n", Status);
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
MmUnloadSystemImage(ModuleObject);
|
MmUnloadSystemImage(ModuleObject);
|
||||||
IopFreeDeviceNode(DeviceNode);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
|
|
||||||
/* Initialize and start device */
|
/* Initialize and start device */
|
||||||
IopInitializeDevice(DeviceNode, *DriverObject);
|
IopInitializeDevice(DeviceNode, *DriverObject);
|
||||||
Status = IopStartDevice(DeviceNode);
|
Status = IopStartDevice(DeviceNode);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
|
|
||||||
DPRINT("DriverObject already exist in ObjectManager\n");
|
DPRINT("DriverObject already exist in ObjectManager\n");
|
||||||
Status = STATUS_IMAGE_ALREADY_LOADED;
|
Status = STATUS_IMAGE_ALREADY_LOADED;
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@ extern KSPIN_LOCK ShutdownListLock;
|
||||||
extern POBJECT_TYPE IoAdapterObjectType;
|
extern POBJECT_TYPE IoAdapterObjectType;
|
||||||
extern ERESOURCE IopDatabaseResource;
|
extern ERESOURCE IopDatabaseResource;
|
||||||
ERESOURCE IopSecurityResource;
|
ERESOURCE IopSecurityResource;
|
||||||
|
extern ERESOURCE IopDriverLoadResource;
|
||||||
extern KGUARDED_MUTEX PnpNotifyListLock;
|
extern KGUARDED_MUTEX PnpNotifyListLock;
|
||||||
extern LIST_ENTRY IopDiskFileSystemQueueHead;
|
extern LIST_ENTRY IopDiskFileSystemQueueHead;
|
||||||
extern LIST_ENTRY IopCdRomFileSystemQueueHead;
|
extern LIST_ENTRY IopCdRomFileSystemQueueHead;
|
||||||
|
@ -476,8 +477,9 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
IopInitLookasideLists();
|
IopInitLookasideLists();
|
||||||
|
|
||||||
/* Initialize all locks and lists */
|
/* Initialize all locks and lists */
|
||||||
ExInitializeResource(&IopDatabaseResource);
|
ExInitializeResourceLite(&IopDatabaseResource);
|
||||||
ExInitializeResource(&IopSecurityResource);
|
ExInitializeResourceLite(&IopSecurityResource);
|
||||||
|
ExInitializeResourceLite(&IopDriverLoadResource);
|
||||||
KeInitializeGuardedMutex(&PnpNotifyListLock);
|
KeInitializeGuardedMutex(&PnpNotifyListLock);
|
||||||
InitializeListHead(&IopDiskFileSystemQueueHead);
|
InitializeListHead(&IopDiskFileSystemQueueHead);
|
||||||
InitializeListHead(&IopCdRomFileSystemQueueHead);
|
InitializeListHead(&IopCdRomFileSystemQueueHead);
|
||||||
|
|
|
@ -324,6 +324,9 @@ IopCompleteRequest(IN PKAPC Apc,
|
||||||
Key = FileObject->CompletionContext->Key;
|
Key = FileObject->CompletionContext->Key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check for UserIos */
|
||||||
|
if (Irp->UserIosb != NULL)
|
||||||
|
{
|
||||||
/* Use SEH to make sure we don't write somewhere invalid */
|
/* Use SEH to make sure we don't write somewhere invalid */
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
|
@ -335,6 +338,7 @@ IopCompleteRequest(IN PKAPC Apc,
|
||||||
/* Ignore any error */
|
/* Ignore any error */
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if we have an event or a file object */
|
/* Check if we have an event or a file object */
|
||||||
if (Irp->UserEvent)
|
if (Irp->UserEvent)
|
||||||
|
|
|
@ -385,6 +385,8 @@ IopInitializePlugPlayServices(VOID)
|
||||||
|
|
||||||
/* Initialize locks and such */
|
/* Initialize locks and such */
|
||||||
KeInitializeSpinLock(&IopDeviceTreeLock);
|
KeInitializeSpinLock(&IopDeviceTreeLock);
|
||||||
|
KeInitializeSpinLock(&IopDeviceRelationsSpinLock);
|
||||||
|
InitializeListHead(&IopDeviceRelationsRequestList);
|
||||||
|
|
||||||
/* Get the default interface */
|
/* Get the default interface */
|
||||||
PnpDefaultInterfaceType = IopDetermineDefaultInterfaceType();
|
PnpDefaultInterfaceType = IopDetermineDefaultInterfaceType();
|
||||||
|
|
|
@ -21,6 +21,7 @@ ERESOURCE PpRegistryDeviceResource;
|
||||||
KGUARDED_MUTEX PpDeviceReferenceTableLock;
|
KGUARDED_MUTEX PpDeviceReferenceTableLock;
|
||||||
RTL_AVL_TABLE PpDeviceReferenceTable;
|
RTL_AVL_TABLE PpDeviceReferenceTable;
|
||||||
|
|
||||||
|
extern ERESOURCE IopDriverLoadResource;
|
||||||
extern ULONG ExpInitializationPhase;
|
extern ULONG ExpInitializationPhase;
|
||||||
extern BOOLEAN ExpInTextModeSetup;
|
extern BOOLEAN ExpInTextModeSetup;
|
||||||
extern BOOLEAN PnpSystemInit;
|
extern BOOLEAN PnpSystemInit;
|
||||||
|
@ -29,12 +30,16 @@ extern BOOLEAN PnpSystemInit;
|
||||||
|
|
||||||
PDRIVER_OBJECT IopRootDriverObject;
|
PDRIVER_OBJECT IopRootDriverObject;
|
||||||
PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList = NULL;
|
PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList = NULL;
|
||||||
|
LIST_ENTRY IopDeviceRelationsRequestList;
|
||||||
|
WORK_QUEUE_ITEM IopDeviceRelationsWorkItem;
|
||||||
|
BOOLEAN IopDeviceRelationsRequestInProgress;
|
||||||
|
KSPIN_LOCK IopDeviceRelationsSpinLock;
|
||||||
|
|
||||||
typedef struct _INVALIDATE_DEVICE_RELATION_DATA
|
typedef struct _INVALIDATE_DEVICE_RELATION_DATA
|
||||||
{
|
{
|
||||||
|
LIST_ENTRY RequestListEntry;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
DEVICE_RELATION_TYPE Type;
|
DEVICE_RELATION_TYPE Type;
|
||||||
PIO_WORKITEM WorkItem;
|
|
||||||
} INVALIDATE_DEVICE_RELATION_DATA, *PINVALIDATE_DEVICE_RELATION_DATA;
|
} INVALIDATE_DEVICE_RELATION_DATA, *PINVALIDATE_DEVICE_RELATION_DATA;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
@ -889,20 +894,34 @@ IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID NTAPI
|
static
|
||||||
IopAsynchronousInvalidateDeviceRelations(
|
VOID
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
NTAPI
|
||||||
IN PVOID InvalidateContext)
|
IopDeviceRelationsWorker(
|
||||||
|
_In_ PVOID Context)
|
||||||
{
|
{
|
||||||
PINVALIDATE_DEVICE_RELATION_DATA Data = InvalidateContext;
|
PLIST_ENTRY ListEntry;
|
||||||
|
PINVALIDATE_DEVICE_RELATION_DATA Data;
|
||||||
|
KIRQL OldIrql;
|
||||||
|
|
||||||
IoSynchronousInvalidateDeviceRelations(
|
KeAcquireSpinLock(&IopDeviceRelationsSpinLock, &OldIrql);
|
||||||
Data->DeviceObject,
|
while (!IsListEmpty(&IopDeviceRelationsRequestList))
|
||||||
|
{
|
||||||
|
ListEntry = RemoveHeadList(&IopDeviceRelationsRequestList);
|
||||||
|
KeReleaseSpinLock(&IopDeviceRelationsSpinLock, OldIrql);
|
||||||
|
Data = CONTAINING_RECORD(ListEntry,
|
||||||
|
INVALIDATE_DEVICE_RELATION_DATA,
|
||||||
|
RequestListEntry);
|
||||||
|
|
||||||
|
IoSynchronousInvalidateDeviceRelations(Data->DeviceObject,
|
||||||
Data->Type);
|
Data->Type);
|
||||||
|
|
||||||
ObDereferenceObject(Data->DeviceObject);
|
ObDereferenceObject(Data->DeviceObject);
|
||||||
IoFreeWorkItem(Data->WorkItem);
|
|
||||||
ExFreePool(Data);
|
ExFreePool(Data);
|
||||||
|
KeAcquireSpinLock(&IopDeviceRelationsSpinLock, &OldIrql);
|
||||||
|
}
|
||||||
|
IopDeviceRelationsRequestInProgress = FALSE;
|
||||||
|
KeReleaseSpinLock(&IopDeviceRelationsSpinLock, OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -1024,7 +1043,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
|
||||||
DPRINT("ParentNode 0x%p PhysicalDeviceObject 0x%p ServiceName %wZ\n",
|
DPRINT("ParentNode 0x%p PhysicalDeviceObject 0x%p ServiceName %wZ\n",
|
||||||
ParentNode, PhysicalDeviceObject, ServiceName);
|
ParentNode, PhysicalDeviceObject, ServiceName);
|
||||||
|
|
||||||
Node = (PDEVICE_NODE)ExAllocatePool(NonPagedPool, sizeof(DEVICE_NODE));
|
Node = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_NODE), TAG_IO_DEVNODE);
|
||||||
if (!Node)
|
if (!Node)
|
||||||
{
|
{
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
@ -1044,7 +1063,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
|
||||||
FullServiceName.Buffer = ExAllocatePool(PagedPool, FullServiceName.MaximumLength);
|
FullServiceName.Buffer = ExAllocatePool(PagedPool, FullServiceName.MaximumLength);
|
||||||
if (!FullServiceName.Buffer)
|
if (!FullServiceName.Buffer)
|
||||||
{
|
{
|
||||||
ExFreePool(Node);
|
ExFreePoolWithTag(Node, TAG_IO_DEVNODE);
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1055,7 +1074,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("PnpRootCreateDevice() failed with status 0x%08X\n", Status);
|
DPRINT1("PnpRootCreateDevice() failed with status 0x%08X\n", Status);
|
||||||
ExFreePool(Node);
|
ExFreePoolWithTag(Node, TAG_IO_DEVNODE);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,7 +1083,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
ZwClose(InstanceHandle);
|
ZwClose(InstanceHandle);
|
||||||
ExFreePool(Node);
|
ExFreePoolWithTag(Node, TAG_IO_DEVNODE);
|
||||||
ExFreePool(FullServiceName.Buffer);
|
ExFreePool(FullServiceName.Buffer);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -1073,7 +1092,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
|
||||||
if (!Node->ServiceName.Buffer)
|
if (!Node->ServiceName.Buffer)
|
||||||
{
|
{
|
||||||
ZwClose(InstanceHandle);
|
ZwClose(InstanceHandle);
|
||||||
ExFreePool(Node);
|
ExFreePoolWithTag(Node, TAG_IO_DEVNODE);
|
||||||
ExFreePool(FullServiceName.Buffer);
|
ExFreePool(FullServiceName.Buffer);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -1122,7 +1141,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
ExFreePool(Node);
|
ExFreePoolWithTag(Node, TAG_IO_DEVNODE);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1225,7 +1244,8 @@ IopFreeDeviceNode(PDEVICE_NODE DeviceNode)
|
||||||
ExFreePool(DeviceNode->BootResources);
|
ExFreePool(DeviceNode->BootResources);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExFreePool(DeviceNode);
|
((PEXTENDED_DEVOBJ_EXTENSION)DeviceNode->PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode = NULL;
|
||||||
|
ExFreePoolWithTag(DeviceNode, TAG_IO_DEVNODE);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -2560,7 +2580,7 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode,
|
||||||
|
|
||||||
DPRINT("IopActionInitChildServices(%p, %p)\n", DeviceNode, Context);
|
DPRINT("IopActionInitChildServices(%p, %p)\n", DeviceNode, Context);
|
||||||
|
|
||||||
ParentDeviceNode = (PDEVICE_NODE)Context;
|
ParentDeviceNode = Context;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We are called for the parent too, but we don't need to do special
|
* We are called for the parent too, but we don't need to do special
|
||||||
|
@ -2610,6 +2630,8 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode,
|
||||||
PLDR_DATA_TABLE_ENTRY ModuleObject;
|
PLDR_DATA_TABLE_ENTRY ModuleObject;
|
||||||
PDRIVER_OBJECT DriverObject;
|
PDRIVER_OBJECT DriverObject;
|
||||||
|
|
||||||
|
KeEnterCriticalRegion();
|
||||||
|
ExAcquireResourceExclusiveLite(&IopDriverLoadResource, TRUE);
|
||||||
/* Get existing DriverObject pointer (in case the driver has
|
/* Get existing DriverObject pointer (in case the driver has
|
||||||
already been loaded and initialized) */
|
already been loaded and initialized) */
|
||||||
Status = IopGetDriverObject(
|
Status = IopGetDriverObject(
|
||||||
|
@ -2641,6 +2663,8 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode,
|
||||||
if (!BootDrivers) DeviceNode->Problem = CM_PROB_DRIVER_FAILED_LOAD;
|
if (!BootDrivers) DeviceNode->Problem = CM_PROB_DRIVER_FAILED_LOAD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ExReleaseResourceLite(&IopDriverLoadResource);
|
||||||
|
KeLeaveCriticalRegion();
|
||||||
|
|
||||||
/* Driver is loaded and initialized at this point */
|
/* Driver is loaded and initialized at this point */
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
|
@ -3545,7 +3569,7 @@ PipAllocateDeviceNode(IN PDEVICE_OBJECT PhysicalDeviceObject)
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Allocate it */
|
/* Allocate it */
|
||||||
DeviceNode = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_NODE), 'donD');
|
DeviceNode = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_NODE), TAG_IO_DEVNODE);
|
||||||
if (!DeviceNode) return DeviceNode;
|
if (!DeviceNode) return DeviceNode;
|
||||||
|
|
||||||
/* Statistics */
|
/* Statistics */
|
||||||
|
@ -4664,29 +4688,32 @@ IoInvalidateDeviceRelations(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN DEVICE_RELATION_TYPE Type)
|
IN DEVICE_RELATION_TYPE Type)
|
||||||
{
|
{
|
||||||
PIO_WORKITEM WorkItem;
|
|
||||||
PINVALIDATE_DEVICE_RELATION_DATA Data;
|
PINVALIDATE_DEVICE_RELATION_DATA Data;
|
||||||
|
KIRQL OldIrql;
|
||||||
|
|
||||||
Data = ExAllocatePool(NonPagedPool, sizeof(INVALIDATE_DEVICE_RELATION_DATA));
|
Data = ExAllocatePool(NonPagedPool, sizeof(INVALIDATE_DEVICE_RELATION_DATA));
|
||||||
if (!Data)
|
if (!Data)
|
||||||
return;
|
return;
|
||||||
WorkItem = IoAllocateWorkItem(DeviceObject);
|
|
||||||
if (!WorkItem)
|
|
||||||
{
|
|
||||||
ExFreePool(Data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ObReferenceObject(DeviceObject);
|
ObReferenceObject(DeviceObject);
|
||||||
Data->DeviceObject = DeviceObject;
|
Data->DeviceObject = DeviceObject;
|
||||||
Data->Type = Type;
|
Data->Type = Type;
|
||||||
Data->WorkItem = WorkItem;
|
|
||||||
|
|
||||||
IoQueueWorkItem(
|
KeAcquireSpinLock(&IopDeviceRelationsSpinLock, &OldIrql);
|
||||||
WorkItem,
|
InsertTailList(&IopDeviceRelationsRequestList, &Data->RequestListEntry);
|
||||||
IopAsynchronousInvalidateDeviceRelations,
|
if (IopDeviceRelationsRequestInProgress)
|
||||||
DelayedWorkQueue,
|
{
|
||||||
Data);
|
KeReleaseSpinLock(&IopDeviceRelationsSpinLock, OldIrql);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IopDeviceRelationsRequestInProgress = TRUE;
|
||||||
|
KeReleaseSpinLock(&IopDeviceRelationsSpinLock, OldIrql);
|
||||||
|
|
||||||
|
ExInitializeWorkItem(&IopDeviceRelationsWorkItem,
|
||||||
|
IopDeviceRelationsWorker,
|
||||||
|
NULL);
|
||||||
|
ExQueueWorkItem(&IopDeviceRelationsWorkItem,
|
||||||
|
DelayedWorkQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -47,7 +47,7 @@ DIB_FUNCTIONS DibFunctionsForBitmapFormat[] =
|
||||||
{
|
{
|
||||||
DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine,
|
DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine,
|
||||||
DIB_16BPP_BitBlt, DIB_16BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
|
DIB_16BPP_BitBlt, DIB_16BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
|
||||||
DIB_16BPP_TransparentBlt, DIB_16BPP_ColorFill, DIB_XXBPP_AlphaBlend
|
DIB_16BPP_TransparentBlt, DIB_16BPP_ColorFill, DIB_16BPP_AlphaBlend
|
||||||
},
|
},
|
||||||
/* BMF_24BPP */
|
/* BMF_24BPP */
|
||||||
{
|
{
|
||||||
|
|
|
@ -101,6 +101,7 @@ BOOLEAN DIB_16BPP_BitBlt(PBLTINFO);
|
||||||
BOOLEAN DIB_16BPP_BitBltSrcCopy(PBLTINFO);
|
BOOLEAN DIB_16BPP_BitBltSrcCopy(PBLTINFO);
|
||||||
BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
|
BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,XLATEOBJ*,ULONG);
|
||||||
BOOLEAN DIB_16BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
|
BOOLEAN DIB_16BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
|
||||||
|
BOOLEAN DIB_16BPP_AlphaBlend(SURFOBJ*, SURFOBJ*, RECTL*, RECTL*, CLIPOBJ*, XLATEOBJ*, BLENDOBJ*);
|
||||||
|
|
||||||
VOID DIB_24BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
|
VOID DIB_24BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG);
|
||||||
ULONG DIB_24BPP_GetPixel(SURFOBJ*,LONG,LONG);
|
ULONG DIB_24BPP_GetPixel(SURFOBJ*,LONG,LONG);
|
||||||
|
|
|
@ -525,4 +525,135 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
ULONG ul;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
UCHAR red;
|
||||||
|
UCHAR green;
|
||||||
|
UCHAR blue;
|
||||||
|
UCHAR alpha;
|
||||||
|
} col;
|
||||||
|
} NICEPIXEL32;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
USHORT us;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
USHORT red :5;
|
||||||
|
USHORT green :6;
|
||||||
|
USHORT blue :5;
|
||||||
|
} col;
|
||||||
|
} NICEPIXEL16;
|
||||||
|
|
||||||
|
static __inline UCHAR
|
||||||
|
Clamp6(ULONG val)
|
||||||
|
{
|
||||||
|
return (val > 63) ? 63 : (UCHAR)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline UCHAR
|
||||||
|
Clamp5(ULONG val)
|
||||||
|
{
|
||||||
|
return (val > 31) ? 31 : (UCHAR)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
DIB_16BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
|
||||||
|
RECTL* SourceRect, CLIPOBJ* ClipRegion,
|
||||||
|
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
|
||||||
|
{
|
||||||
|
INT DstX, DstY, SrcX, SrcY;
|
||||||
|
BLENDFUNCTION BlendFunc;
|
||||||
|
NICEPIXEL32 SrcPixel32;
|
||||||
|
NICEPIXEL16 DstPixel16;
|
||||||
|
UCHAR Alpha, Alpha6, Alpha5;
|
||||||
|
EXLATEOBJ* pexlo;
|
||||||
|
EXLATEOBJ exloSrcRGB;
|
||||||
|
|
||||||
|
DPRINT("DIB_16BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
|
||||||
|
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
|
||||||
|
DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
|
||||||
|
|
||||||
|
BlendFunc = BlendObj->BlendFunction;
|
||||||
|
if (BlendFunc.BlendOp != AC_SRC_OVER)
|
||||||
|
{
|
||||||
|
DPRINT1("BlendOp != AC_SRC_OVER\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (BlendFunc.BlendFlags != 0)
|
||||||
|
{
|
||||||
|
DPRINT1("BlendFlags != 0\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0)
|
||||||
|
{
|
||||||
|
DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 &&
|
||||||
|
(BitsPerFormat(Source->iBitmapFormat) != 32))
|
||||||
|
{
|
||||||
|
DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ColorTranslation)
|
||||||
|
{
|
||||||
|
DPRINT1("ColorTranslation must not be NULL!\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pexlo = CONTAINING_RECORD(ColorTranslation, EXLATEOBJ, xlo);
|
||||||
|
EXLATEOBJ_vInitialize(&exloSrcRGB, pexlo->ppalSrc, &gpalRGB, 0, 0, 0);
|
||||||
|
|
||||||
|
SrcY = SourceRect->top;
|
||||||
|
DstY = DestRect->top;
|
||||||
|
while ( DstY < DestRect->bottom )
|
||||||
|
{
|
||||||
|
SrcX = SourceRect->left;
|
||||||
|
DstX = DestRect->left;
|
||||||
|
while(DstX < DestRect->right)
|
||||||
|
{
|
||||||
|
SrcPixel32.ul = DIB_GetSource(Source, SrcX, SrcY, &exloSrcRGB.xlo);
|
||||||
|
SrcPixel32.col.red = (SrcPixel32.col.red * BlendFunc.SourceConstantAlpha) / 255;
|
||||||
|
SrcPixel32.col.green = (SrcPixel32.col.green * BlendFunc.SourceConstantAlpha) / 255;
|
||||||
|
SrcPixel32.col.blue = (SrcPixel32.col.blue * BlendFunc.SourceConstantAlpha) / 255;
|
||||||
|
|
||||||
|
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
|
||||||
|
(SrcPixel32.col.alpha * BlendFunc.SourceConstantAlpha) / 255 :
|
||||||
|
BlendFunc.SourceConstantAlpha;
|
||||||
|
|
||||||
|
Alpha6 = Alpha >> 2;
|
||||||
|
Alpha5 = Alpha >> 3;
|
||||||
|
|
||||||
|
DstPixel16.us = DIB_16BPP_GetPixel(Dest, DstX, DstY) & 0xFFFF;
|
||||||
|
/* Perform bit loss */
|
||||||
|
SrcPixel32.col.red >>= 3;
|
||||||
|
SrcPixel32.col.green >>= 2;
|
||||||
|
SrcPixel32.col.blue >>= 3;
|
||||||
|
|
||||||
|
/* Do the blend in the right bit depth */
|
||||||
|
DstPixel16.col.red = Clamp5((DstPixel16.col.red * (31 - Alpha5)) / 31 + SrcPixel32.col.red);
|
||||||
|
DstPixel16.col.green = Clamp6((DstPixel16.col.green * (63 - Alpha6)) / 63 + SrcPixel32.col.green);
|
||||||
|
DstPixel16.col.blue = Clamp5((DstPixel16.col.blue * (31 - Alpha5)) / 31 + SrcPixel32.col.blue);
|
||||||
|
|
||||||
|
DIB_16BPP_PutPixel(Dest, DstX, DstY, DstPixel16.us);
|
||||||
|
|
||||||
|
DstX++;
|
||||||
|
SrcX = SourceRect->left + ((DstX-DestRect->left)*(SourceRect->right - SourceRect->left))
|
||||||
|
/(DestRect->right-DestRect->left);
|
||||||
|
}
|
||||||
|
DstY++;
|
||||||
|
SrcY = SourceRect->top + ((DstY-DestRect->top)*(SourceRect->bottom - SourceRect->top))
|
||||||
|
/(DestRect->bottom-DestRect->top);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXLATEOBJ_vCleanup(&exloSrcRGB);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -249,6 +249,7 @@ IntCreateCompatibleBitmap(
|
||||||
/* Set flags */
|
/* Set flags */
|
||||||
psurf->flags = API_BITMAP;
|
psurf->flags = API_BITMAP;
|
||||||
psurf->hdc = NULL; // FIXME:
|
psurf->hdc = NULL; // FIXME:
|
||||||
|
psurf->SurfObj.hdev = (HDEV)Dc->ppdev;
|
||||||
SURFACE_ShareUnlockSurface(psurf);
|
SURFACE_ShareUnlockSurface(psurf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -277,6 +278,7 @@ IntCreateCompatibleBitmap(
|
||||||
/* Set flags */
|
/* Set flags */
|
||||||
psurfBmp->flags = API_BITMAP;
|
psurfBmp->flags = API_BITMAP;
|
||||||
psurfBmp->hdc = NULL; // FIXME:
|
psurfBmp->hdc = NULL; // FIXME:
|
||||||
|
psurf->SurfObj.hdev = (HDEV)Dc->ppdev;
|
||||||
SURFACE_ShareUnlockSurface(psurfBmp);
|
SURFACE_ShareUnlockSurface(psurfBmp);
|
||||||
}
|
}
|
||||||
else if (Count == sizeof(DIBSECTION))
|
else if (Count == sizeof(DIBSECTION))
|
||||||
|
|
|
@ -330,6 +330,10 @@ DC_bIsBitmapCompatible(PDC pdc, PSURFACE psurf)
|
||||||
/* DIB sections are always compatible */
|
/* DIB sections are always compatible */
|
||||||
if (psurf->hSecure != NULL) return TRUE;
|
if (psurf->hSecure != NULL) return TRUE;
|
||||||
|
|
||||||
|
/* See if this is the same PDEV */
|
||||||
|
if (psurf->SurfObj.hdev == (HDEV)pdc->ppdev)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
/* Get the bit depth of the bitmap */
|
/* Get the bit depth of the bitmap */
|
||||||
cBitsPixel = gajBitsPerFormat[psurf->SurfObj.iBitmapFormat];
|
cBitsPixel = gajBitsPerFormat[psurf->SurfObj.iBitmapFormat];
|
||||||
|
|
||||||
|
|
|
@ -1294,12 +1294,14 @@ IntUnhookWindowsHook(int HookId, HOOKPROC pfnFilterProc)
|
||||||
{
|
{
|
||||||
Hook = CONTAINING_RECORD(pElement, HOOK, Chain);
|
Hook = CONTAINING_RECORD(pElement, HOOK, Chain);
|
||||||
|
|
||||||
|
/* Get the next element now, we might free the hook in what follows */
|
||||||
|
pElement = Hook->Chain.Flink;
|
||||||
|
|
||||||
if (Hook->Proc == pfnFilterProc)
|
if (Hook->Proc == pfnFilterProc)
|
||||||
{
|
{
|
||||||
if (Hook->head.pti == pti)
|
if (Hook->head.pti == pti)
|
||||||
{
|
{
|
||||||
IntRemoveHook(Hook);
|
IntRemoveHook(Hook);
|
||||||
UserDereferenceObject(Hook);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1308,8 +1310,6 @@ IntUnhookWindowsHook(int HookId, HOOKPROC pfnFilterProc)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pElement = Hook->Chain.Flink;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -2648,6 +2648,7 @@ SendMessageTimeoutA(
|
||||||
|
|
||||||
dsm.uFlags = fuFlags;
|
dsm.uFlags = fuFlags;
|
||||||
dsm.uTimeout = uTimeout;
|
dsm.uTimeout = uTimeout;
|
||||||
|
dsm.Result = 0;
|
||||||
|
|
||||||
AnsiMsg.hwnd = hWnd;
|
AnsiMsg.hwnd = hWnd;
|
||||||
AnsiMsg.message = Msg;
|
AnsiMsg.message = Msg;
|
||||||
|
@ -2709,6 +2710,7 @@ SendMessageTimeoutW(
|
||||||
|
|
||||||
dsm.uFlags = fuFlags;
|
dsm.uFlags = fuFlags;
|
||||||
dsm.uTimeout = uTimeout;
|
dsm.uTimeout = uTimeout;
|
||||||
|
dsm.Result = 0;
|
||||||
|
|
||||||
Result = NtUserMessageCall( hWnd,
|
Result = NtUserMessageCall( hWnd,
|
||||||
Msg,
|
Msg,
|
||||||
|
|
Loading…
Reference in a new issue