* Sync up to trunk head (r64959).

svn path=/branches/shell-experiments/; revision=64961
This commit is contained in:
Amine Khaldi 2014-10-24 16:06:58 +00:00
commit 8069b8c90d
22 changed files with 1278 additions and 1107 deletions

View file

@ -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

View file

@ -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);
} }

View file

@ -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)

View file

@ -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

View file

@ -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 */

View file

@ -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

View file

@ -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

View file

@ -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'

View file

@ -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;

View file

@ -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);

View file

@ -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)

View file

@ -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();

View file

@ -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);
} }
/* /*

View file

@ -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 */
{ {

View file

@ -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);

View file

@ -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 */

View file

@ -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))

View file

@ -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];

View file

@ -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;

View file

@ -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,