From 9e92286f5c64a0b5946418a510052a92ff06e953 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 2 Apr 2010 11:53:14 +0000 Subject: [PATCH 002/261] [Win32k] - Implement MakeInfoDC and support functions. Dedicated to Timo. svn path=/trunk/; revision=46679 --- reactos/subsystems/win32/win32k/include/dc.h | 5 +- .../subsystems/win32/win32k/include/pdevobj.h | 8 ++- .../subsystems/win32/win32k/include/surface.h | 2 + .../subsystems/win32/win32k/objects/dclife.c | 62 +++++++++++++++++- .../subsystems/win32/win32k/objects/dcutil.c | 65 +++++++++++++++++++ .../subsystems/win32/win32k/objects/device.c | 16 +++++ 6 files changed, 151 insertions(+), 7 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/dc.h b/reactos/subsystems/win32/win32k/include/dc.h index b616bdc0ba6..48b0e921400 100644 --- a/reactos/subsystems/win32/win32k/include/dc.h +++ b/reactos/subsystems/win32/win32k/include/dc.h @@ -177,6 +177,8 @@ HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC); BOOL FASTCALL IntGdiCleanDC(HDC hDC); VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS); INT FASTCALL IntGdiGetDeviceCaps(PDC,INT); +BOOL FASTCALL MakeInfoDC(PDC,BOOL); +BOOL FASTCALL IntSetDefaultRegion(PDC); extern PPDEVOBJ pPrimarySurface; @@ -228,6 +230,5 @@ DC_vSelectPalette(PDC pdc, PPALETTE ppal) pdc->dclevel.ppal = ppal; } -BOOL FASTCALL -IntPrepareDriverIfNeeded(VOID); +BOOL FASTCALL IntPrepareDriverIfNeeded(VOID); extern PDEVOBJ PrimarySurface; diff --git a/reactos/subsystems/win32/win32k/include/pdevobj.h b/reactos/subsystems/win32/win32k/include/pdevobj.h index 4124509fbe5..ca0c3fa0821 100644 --- a/reactos/subsystems/win32/win32k/include/pdevobj.h +++ b/reactos/subsystems/win32/win32k/include/pdevobj.h @@ -88,8 +88,8 @@ typedef struct _PDEVOBJ // PVOID TypeOneInfo; PVOID pvGammaRamp; /* Gamma ramp pointer. */ // PVOID RemoteTypeOne; -// ULONG ulHorzRes; -// ULONG ulVertRes; + ULONG ulHorzRes; + ULONG ulVertRes; // PFN_DrvSetPointerShape pfnDrvSetPointerShape; // PFN_DrvMovePointer pfnDrvMovePointer; PFN_DrvMovePointer pfnMovePointer; @@ -107,7 +107,7 @@ typedef struct _PDEVOBJ // HANDLE hSpooler; /* Handle to spooler, if spooler dev driver. */ // PVOID pDesktopId; PGRAPHICS_DEVICE pGraphicsDevice; -// POINTL ptlOrigion; + POINTL ptlOrigion; PVOID pdmwDev; /* Ptr->DEVMODEW.dmSize + dmDriverExtra == alloc size. */ // DWORD Unknown3; FLONG DxDd_Flags; /* DxDD active status flags. */ @@ -141,4 +141,6 @@ typedef struct _PDEVEDD EDD_DIRECTDRAW_GLOBAL EDDgpl; } PDEVEDD, *PPDEVEDD; +PSIZEL FASTCALL PDEV_sizl(PPDEVOBJ, PSIZEL); + extern ULONG gdwDirectDrawContext; diff --git a/reactos/subsystems/win32/win32k/include/surface.h b/reactos/subsystems/win32/win32k/include/surface.h index 57a5ec24f85..3fe90540467 100644 --- a/reactos/subsystems/win32/win32k/include/surface.h +++ b/reactos/subsystems/win32/win32k/include/surface.h @@ -3,6 +3,8 @@ #include "win32.h" #include "gdiobj.h" +#define PDEV_SURFACE 0x80000000 + /* GDI surface object */ typedef struct _SURFACE { diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index 3837b78567d..e9f4cf7ecd1 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -586,8 +586,59 @@ DC_InitDC(HDC DCHandle) NtGdiSetVirtualResolution(DCHandle, 0, 0, 0, 0); } +BOOL +FASTCALL +MakeInfoDC(PDC pdc, BOOL bSet) +{ + PSURFACE pSurface; + SIZEL sizl; + + /* Can not be a display DC. */ + if (pdc->fs & DC_FLAG_DISPLAY) return FALSE; + if (bSet) + { + if (pdc->fs & DC_FLAG_TEMPINFODC || pdc->dctype == DC_TYPE_DIRECT) + return FALSE; + + pSurface = pdc->dclevel.pSurface; + pdc->fs |= DC_FLAG_TEMPINFODC; + pdc->pSurfInfo = pSurface; + pdc->dctype = DC_TYPE_INFO; + pdc->dclevel.pSurface = NULL; + + if (PDEV_sizl(pdc->ppdev, &sizl)->cx == pdc->dclevel.sizl.cx && + PDEV_sizl(pdc->ppdev, &sizl)->cy == pdc->dclevel.sizl.cy) + return TRUE; + + pdc->dclevel.sizl.cx = PDEV_sizl(pdc->ppdev, &sizl)->cx; + pdc->dclevel.sizl.cy = sizl.cy; + IntSetDefaultRegion(pdc); + } + else + { + if (!(pdc->fs & DC_FLAG_TEMPINFODC) || pdc->dctype != DC_TYPE_INFO) + return FALSE; + + pSurface = pdc->pSurfInfo; + pdc->fs &= ~DC_FLAG_TEMPINFODC; + pdc->dclevel.pSurface = pSurface; + pdc->dctype = DC_TYPE_DIRECT; + pdc->pSurfInfo = NULL; + + if ( !pSurface || + (pSurface->SurfObj.sizlBitmap.cx == pdc->dclevel.sizl.cx && + pSurface->SurfObj.sizlBitmap.cy == pdc->dclevel.sizl.cy) ) + return TRUE; + + pdc->dclevel.sizl.cx = pSurface->SurfObj.sizlBitmap.cx; + pdc->dclevel.sizl.cy = pSurface->SurfObj.sizlBitmap.cy; + IntSetDefaultRegion(pdc); + } + return TRUE; +} + /* -* @unimplemented +* @implemented */ BOOL APIENTRY @@ -595,7 +646,14 @@ NtGdiMakeInfoDC( IN HDC hdc, IN BOOL bSet) { - UNIMPLEMENTED; + BOOL Ret; + PDC pdc = DC_LockDc(hdc); + if (pdc) + { + Ret = MakeInfoDC(pdc, bSet); + DC_UnlockDc(pdc); + return Ret; + } return FALSE; } diff --git a/reactos/subsystems/win32/win32k/objects/dcutil.c b/reactos/subsystems/win32/win32k/objects/dcutil.c index 9721af3147f..a8c28ecb348 100644 --- a/reactos/subsystems/win32/win32k/objects/dcutil.c +++ b/reactos/subsystems/win32/win32k/objects/dcutil.c @@ -125,6 +125,71 @@ IntIsPrimarySurface(SURFOBJ *SurfObj) } #endif +BOOL +FASTCALL +IntSetDefaultRegion(PDC pdc) +{ + PSURFACE pSurface; + PROSRGNDATA prgn; + RECTL rclWnd, rclClip; + + IntGdiReleaseRaoRgn(pdc); + + rclWnd.left = 0; + rclWnd.top = 0; + rclWnd.right = pdc->dclevel.sizl.cx; + rclWnd.bottom = pdc->dclevel.sizl.cy; + rclClip = rclWnd; + +// EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock); + if (pdc->ppdev->flFlags & PDEV_META_DEVICE) + { + pSurface = pdc->dclevel.pSurface; + if (pSurface && pSurface->flFlags & PDEV_SURFACE) + { + rclClip.left += pdc->ppdev->ptlOrigion.x; + rclClip.top += pdc->ppdev->ptlOrigion.y; + rclClip.right += pdc->ppdev->ptlOrigion.x; + rclClip.bottom += pdc->ppdev->ptlOrigion.y; + } + } +// EngReleaseSemaphore(pdc->ppdev->hsemDevLock); + + prgn = pdc->prgnVis; + + if (prgn && prgn != prgnDefault) + { + REGION_SetRectRgn( prgn, + rclClip.left, + rclClip.top, + rclClip.right , + rclClip.bottom ); + } + else + { + prgn = IntSysCreateRectpRgn( rclClip.left, + rclClip.top, + rclClip.right , + rclClip.bottom ); + pdc->prgnVis = prgn; + } + + if (prgn) + { + pdc->ptlDCOrig.x = 0; + pdc->ptlDCOrig.y = 0; + pdc->erclWindow = rclWnd; + pdc->erclClip = rclClip; + /* Might be an InitDC or DCE....*/ + pdc->ptlFillOrigin.x = pdc->dcattr.VisRectRegion.Rect.right; + pdc->ptlFillOrigin.y = pdc->dcattr.VisRectRegion.Rect.bottom; + return TRUE; + } + + pdc->prgnVis = prgnDefault; + return FALSE; +} + BOOL APIENTRY NtGdiCancelDC(HDC hDC) diff --git a/reactos/subsystems/win32/win32k/objects/device.c b/reactos/subsystems/win32/win32k/objects/device.c index 40a79562ede..b1158471282 100644 --- a/reactos/subsystems/win32/win32k/objects/device.c +++ b/reactos/subsystems/win32/win32k/objects/device.c @@ -19,6 +19,22 @@ static KEVENT VideoDriverNeedsPreparation; static KEVENT VideoDriverPrepared; PDC defaultDCstate = NULL; +PSIZEL +FASTCALL +PDEV_sizl(PPDEVOBJ ppdev, PSIZEL psizl) +{ + if (ppdev->flFlags & PDEV_META_DEVICE) + { + psizl->cx = ppdev->ulHorzRes; + psizl->cy = ppdev->ulVertRes; + } + else + { + psizl->cx = ppdev->gdiinfo.ulHorzRes; + psizl->cy = ppdev->gdiinfo.ulVertRes; + } + return psizl; +} NTSTATUS FASTCALL InitDcImpl(VOID) From 90a11f48e9a1f997bfbc01e752cbd525a4666d1a Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 2 Apr 2010 13:49:10 +0000 Subject: [PATCH 003/261] [MMIXER] - Copy device name when initializing WAVEINCAPS / WAVEOUTCAPS - Fixes display wave device name in cpl / waveInGetDevCaps / waveOutGetDevCaps svn path=/trunk/; revision=46680 --- reactos/lib/drivers/sound/mmixer/wave.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/reactos/lib/drivers/sound/mmixer/wave.c b/reactos/lib/drivers/sound/mmixer/wave.c index a8b2675cac9..0ba0aae41b9 100644 --- a/reactos/lib/drivers/sound/mmixer/wave.c +++ b/reactos/lib/drivers/sound/mmixer/wave.c @@ -360,6 +360,17 @@ MMixerInitializeWaveInfo( WaveInfo->DeviceId = MixerData->DeviceId; WaveInfo->PinId = PinId; + + /* copy device name */ + if (bWaveIn) + { + wcscpy(WaveInfo->u.InCaps.szPname, DeviceName); + } + else + { + wcscpy(WaveInfo->u.OutCaps.szPname, DeviceName); + } + /* FIXME determine manufacturer / product id */ if (bWaveIn) { @@ -410,6 +421,8 @@ MMixerInitializeWaveInfo( MixerContext->Free(MultipleItem); + + if (bWaveIn) { InsertTailList(&MixerList->WaveInList, &WaveInfo->Entry); From 95650313d90c6dea23dd0f513bca39f3912843e9 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 2 Apr 2010 14:01:55 +0000 Subject: [PATCH 004/261] [NTOS] - Add support for reference strings in IoOpenDeviceInterfaceRegistryKey svn path=/trunk/; revision=46681 --- reactos/ntoskrnl/io/iomgr/deviface.c | 128 ++++++++++++--------------- 1 file changed, 59 insertions(+), 69 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 2b0789b5a60..391c6813664 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -51,31 +51,29 @@ IoOpenDeviceInterfaceRegistryKey(IN PUNICODE_STRING SymbolicLinkName, OUT PHANDLE DeviceInterfaceKey) { WCHAR StrBuff[MAX_PATH], PathBuff[MAX_PATH]; - PWCHAR Guid; - UNICODE_STRING EnumU = RTL_CONSTANT_STRING(ENUM_ROOT L"\\"); + PWCHAR Guid, RefString; UNICODE_STRING DevParamU = RTL_CONSTANT_STRING(L"\\Device Parameters"); UNICODE_STRING PrefixU = RTL_CONSTANT_STRING(L"\\??\\"); UNICODE_STRING KeyPath, KeyName; UNICODE_STRING MatchableGuid; - HANDLE GuidKey, ChildKey; + UNICODE_STRING GuidString; + HANDLE GuidKey, hInterfaceKey; ULONG Index = 0; PKEY_BASIC_INFORMATION KeyInformation; ULONG KeyInformationLength; - PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; - ULONG KeyValueInformationLength; OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS Status; ULONG RequiredLength; - MatchableGuid.Length = 0; - MatchableGuid.Length += swprintf(StrBuff, - L"##?#%ls", - &SymbolicLinkName->Buffer[PrefixU.Length / sizeof(WCHAR)]); - StrBuff[++MatchableGuid.Length] = UNICODE_NULL; + swprintf(StrBuff, L"##?#%s", &SymbolicLinkName->Buffer[PrefixU.Length / sizeof(WCHAR)]); - MatchableGuid.Buffer = StrBuff; - MatchableGuid.MaximumLength = MAX_PATH * sizeof(WCHAR); - MatchableGuid.Length = (MatchableGuid.Length-1) * sizeof(WCHAR); + RefString = wcsstr(StrBuff, L"\\"); + if (RefString) + { + RefString[0] = 0; + } + + RtlInitUnicodeString(&MatchableGuid, StrBuff); Guid = wcsstr(StrBuff, L"{"); if (!Guid) @@ -85,8 +83,11 @@ IoOpenDeviceInterfaceRegistryKey(IN PUNICODE_STRING SymbolicLinkName, KeyPath.Length = 0; KeyPath.MaximumLength = MAX_PATH * sizeof(WCHAR); + GuidString.Buffer = Guid; + GuidString.Length = GuidString.MaximumLength = 38 * sizeof(WCHAR); + RtlAppendUnicodeToString(&KeyPath, BaseKeyString); - RtlAppendUnicodeToString(&KeyPath, Guid); + RtlAppendUnicodeStringToString(&KeyPath, &GuidString); InitializeObjectAttributes(&ObjectAttributes, &KeyPath, @@ -142,73 +143,62 @@ IoOpenDeviceInterfaceRegistryKey(IN PUNICODE_STRING SymbolicLinkName, KeyName.Buffer = KeyInformation->Name; if (!RtlEqualUnicodeString(&KeyName, &MatchableGuid, TRUE)) - continue; - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - GuidKey, - NULL); - Status = ZwOpenKey(&ChildKey, KEY_QUERY_VALUE, &ObjectAttributes); - ZwClose(GuidKey); - if (!NT_SUCCESS(Status)) - return Status; - - RtlInitUnicodeString(&KeyName, L"DeviceInstance"); - Status = ZwQueryValueKey(ChildKey, - &KeyName, - KeyValuePartialInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_BUFFER_TOO_SMALL) { - KeyValueInformationLength = RequiredLength; - KeyValueInformation = ExAllocatePool(PagedPool, KeyValueInformationLength); - if (!KeyValueInformation) - { - ZwClose(ChildKey); - return Status; - } + ExFreePool(KeyInformation); + continue; + } - Status = ZwQueryValueKey(ChildKey, - &KeyName, - KeyValuePartialInformation, - KeyValueInformation, - KeyValueInformationLength, - &RequiredLength); + KeyPath.Length = 0; + RtlAppendUnicodeStringToString(&KeyPath, &KeyName); + RtlAppendUnicodeToString(&KeyPath, L"\\"); + + /* check for presence of a reference string */ + if (RefString) + { + /* append reference string */ + RefString[0] = L'#'; + RtlInitUnicodeString(&KeyName, RefString); } else { - ZwClose(ChildKey); - return STATUS_OBJECT_PATH_NOT_FOUND; + /* no reference string */ + RtlInitUnicodeString(&KeyName, L"#"); } - ZwClose(ChildKey); - - if (!NT_SUCCESS(Status)) - return Status; - - KeyPath.Length = 0; - - KeyName.Length = KeyName.MaximumLength = KeyValueInformation->DataLength; - KeyName.Buffer = (PWCHAR)KeyValueInformation->Data; - - RtlAppendUnicodeStringToString(&KeyPath, &EnumU); RtlAppendUnicodeStringToString(&KeyPath, &KeyName); - RtlAppendUnicodeStringToString(&KeyPath, &DevParamU); + /* initialize reference string attributes */ InitializeObjectAttributes(&ObjectAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, - 0, + GuidKey, NULL); - Status = ZwCreateKey(DeviceInterfaceKey, - DesiredAccess, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - NULL); + + /* now open device interface key */ + Status = ZwOpenKey(&hInterfaceKey, KEY_CREATE_SUB_KEY, &ObjectAttributes); + + if (NT_SUCCESS(Status)) + { + /* check if it provides a DeviceParameters key */ + InitializeObjectAttributes(&ObjectAttributes, &DevParamU, OBJ_CASE_INSENSITIVE, hInterfaceKey, NULL); + + Status = ZwCreateKey(DeviceInterfaceKey, DesiredAccess, &ObjectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE, NULL); + + if (NT_SUCCESS(Status)) + { + /* DeviceParameters key present */ + ZwClose(hInterfaceKey); + } + else + { + /* fall back to device interface */ + *DeviceInterfaceKey = hInterfaceKey; + Status = STATUS_SUCCESS; + } + } + + /* close class key */ + ZwClose(GuidKey); + ExFreePool(KeyInformation); return Status; } From 8051b8115a84839441a03f8ca00d631bb2ecf4af Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 2 Apr 2010 14:21:15 +0000 Subject: [PATCH 005/261] [NTOS] - Make sure SymbolicLink is null terminated svn path=/trunk/; revision=46682 --- reactos/ntoskrnl/io/iomgr/deviface.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 391c6813664..d5b2246f31f 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -1061,6 +1061,7 @@ IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, RtlAppendUnicodeStringToString(SymbolicLinkName, ReferenceString); } SymbolicLinkName->Buffer[SymbolicLinkName->Length/sizeof(WCHAR)] = L'\0'; + SymbolicLinkName->Length += sizeof(WCHAR); /* Write symbolic link name in registry */ SymbolicLinkName->Buffer[1] = '\\'; From 249d39c17aec6380a6e0b3c7ad3ff29527b822e6 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 2 Apr 2010 15:13:24 +0000 Subject: [PATCH 006/261] [NTOSKRNL] - Check the SeTakeOwnership privilege only if WRITE_OWNER access is desired. - Move the check for token ownership from SepAccessCheck because this check grants access rights rather than checking them. svn path=/trunk/; revision=46683 --- reactos/ntoskrnl/se/semgr.c | 169 ++++++++++++++++++++++++------------ 1 file changed, 112 insertions(+), 57 deletions(-) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index d06fb04bbb6..5e22e67d05e 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -314,6 +314,31 @@ SepSidInToken(PACCESS_TOKEN _Token, return FALSE; } +static BOOLEAN +SepTokenIsOwner(PACCESS_TOKEN Token, + PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + NTSTATUS Status; + PSID Sid = NULL; + BOOLEAN Defaulted; + + Status = RtlGetOwnerSecurityDescriptor(SecurityDescriptor, + &Sid, + &Defaulted); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlGetOwnerSecurityDescriptor() failed (Status %lx)\n", Status); + return FALSE; + } + + if (Sid == NULL) + { + DPRINT1("Owner Sid is NULL\n"); + return FALSE; + } + + return SepSidInToken(Token, Sid); +} VOID NTAPI SeQuerySecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, @@ -438,22 +463,25 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, CurrentAccess = PreviouslyGrantedAccess; /* RULE 2: Check token for 'take ownership' privilege */ - Privilege.Luid = SeTakeOwnershipPrivilege; - Privilege.Attributes = SE_PRIVILEGE_ENABLED; - - if (SepPrivilegeCheck(Token, - &Privilege, - 1, - PRIVILEGE_SET_ALL_NECESSARY, - AccessMode)) + if (DesiredAccess & WRITE_OWNER) { - CurrentAccess |= WRITE_OWNER; - if ((DesiredAccess & ~VALID_INHERIT_FLAGS) == - (CurrentAccess & ~VALID_INHERIT_FLAGS)) + Privilege.Luid = SeTakeOwnershipPrivilege; + Privilege.Attributes = SE_PRIVILEGE_ENABLED; + + if (SepPrivilegeCheck(Token, + &Privilege, + 1, + PRIVILEGE_SET_ALL_NECESSARY, + AccessMode)) { - *GrantedAccess = CurrentAccess; - *AccessStatus = STATUS_SUCCESS; - return TRUE; + CurrentAccess |= WRITE_OWNER; + if ((DesiredAccess & ~VALID_INHERIT_FLAGS) == + (CurrentAccess & ~VALID_INHERIT_FLAGS)) + { + *GrantedAccess = CurrentAccess; + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } } } @@ -465,29 +493,6 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return FALSE; } - /* RULE 3: Check whether the token is the owner */ - Status = RtlGetOwnerSecurityDescriptor(SecurityDescriptor, - &Sid, - &Defaulted); - if (!NT_SUCCESS(Status)) - { - DPRINT1("RtlGetOwnerSecurityDescriptor() failed (Status %lx)\n", Status); - *AccessStatus = Status; - return FALSE; - } - - if (Sid && SepSidInToken(Token, Sid)) - { - CurrentAccess |= (READ_CONTROL | WRITE_DAC); - if ((DesiredAccess & ~VALID_INHERIT_FLAGS) == - (CurrentAccess & ~VALID_INHERIT_FLAGS)) - { - *GrantedAccess = CurrentAccess; - *AccessStatus = STATUS_SUCCESS; - return TRUE; - } - } - /* Fail if DACL is absent */ if (Present == FALSE) { @@ -649,16 +654,43 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, if (!SubjectContextLocked) SeLockSubjectContext(SubjectSecurityContext); - /* Call the internal function */ - ret = SepAccessCheck(SecurityDescriptor, - SubjectSecurityContext, - DesiredAccess, - PreviouslyGrantedAccess, - Privileges, - GenericMapping, - AccessMode, - GrantedAccess, - AccessStatus); + /* Check if the token is the owner and grant WRITE_DAC and READ_CONTROL rights */ + if (DesiredAccess & (WRITE_DAC | READ_CONTROL | MAXIMUM_ALLOWED)) + { + PACCESS_TOKEN Token = SubjectSecurityContext->ClientToken ? + SubjectSecurityContext->ClientToken : SubjectSecurityContext->PrimaryToken; + + if (SepTokenIsOwner(Token, + SecurityDescriptor)) + { + if (DesiredAccess & MAXIMUM_ALLOWED) + PreviouslyGrantedAccess |= (WRITE_DAC | READ_CONTROL); + else + PreviouslyGrantedAccess |= (DesiredAccess & (WRITE_DAC | READ_CONTROL)); + + DesiredAccess &= ~(WRITE_DAC | READ_CONTROL); + } + } + + if (DesiredAccess == 0) + { + *GrantedAccess = PreviouslyGrantedAccess; + *AccessStatus = STATUS_SUCCESS; + ret = TRUE; + } + else + { + /* Call the internal function */ + ret = SepAccessCheck(SecurityDescriptor, + SubjectSecurityContext, + DesiredAccess, + PreviouslyGrantedAccess, + Privileges, + GenericMapping, + AccessMode, + GrantedAccess, + AccessStatus); + } /* Release the lock if needed */ if (!SubjectContextLocked) @@ -686,6 +718,7 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, PSECURITY_DESCRIPTOR CapturedSecurityDescriptor = NULL; SECURITY_SUBJECT_CONTEXT SubjectSecurityContext; KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + ACCESS_MASK PreviouslyGrantedAccess = 0; PTOKEN Token; NTSTATUS Status; PAGED_CODE(); @@ -801,16 +834,38 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, SubjectSecurityContext.ProcessAuditId = NULL; SeLockSubjectContext(&SubjectSecurityContext); - /* Now perform the access check */ - SepAccessCheck(SecurityDescriptor, // FIXME: use CapturedSecurityDescriptor - &SubjectSecurityContext, - DesiredAccess, - 0, - &PrivilegeSet, //FIXME - GenericMapping, - PreviousMode, - GrantedAccess, - AccessStatus); + /* Check if the token is the owner and grant WRITE_DAC and READ_CONTROL rights */ + if (DesiredAccess & (WRITE_DAC | READ_CONTROL | MAXIMUM_ALLOWED)) + { + if (SepTokenIsOwner(Token, SecurityDescriptor)) // FIXME: use CapturedSecurityDescriptor + { + if (DesiredAccess & MAXIMUM_ALLOWED) + PreviouslyGrantedAccess |= (WRITE_DAC | READ_CONTROL); + else + PreviouslyGrantedAccess |= (DesiredAccess & (WRITE_DAC | READ_CONTROL)); + + DesiredAccess &= ~(WRITE_DAC | READ_CONTROL); + } + } + + if (DesiredAccess == 0) + { + *GrantedAccess = PreviouslyGrantedAccess; + *AccessStatus = STATUS_SUCCESS; + } + else + { + /* Now perform the access check */ + SepAccessCheck(SecurityDescriptor, // FIXME: use CapturedSecurityDescriptor + &SubjectSecurityContext, + DesiredAccess, + PreviouslyGrantedAccess, + &PrivilegeSet, //FIXME + GenericMapping, + PreviousMode, + GrantedAccess, + AccessStatus); + } /* Unlock subject context */ SeUnlockSubjectContext(&SubjectSecurityContext); From b4a44e7a78ce9cae7e4ba97eea472f1427698942 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 2 Apr 2010 16:25:18 +0000 Subject: [PATCH 007/261] [KSPROXY, MSDVBNP] - Remove remaining DebugBreak - Add debug traces svn path=/trunk/; revision=46684 --- reactos/dll/directx/ksproxy/enumpins.cpp | 1 - reactos/dll/directx/ksproxy/input_pin.cpp | 10 ---- reactos/dll/directx/ksproxy/mediasample.cpp | 2 - reactos/dll/directx/ksproxy/output_pin.cpp | 44 ++++++++++++--- reactos/dll/directx/ksproxy/precomp.h | 2 +- reactos/dll/directx/ksproxy/proxy.cpp | 62 ++++++++++++++++++--- reactos/dll/directx/msdvbnp/enumpins.cpp | 8 --- 7 files changed, 91 insertions(+), 38 deletions(-) diff --git a/reactos/dll/directx/ksproxy/enumpins.cpp b/reactos/dll/directx/ksproxy/enumpins.cpp index a6c3bdfbd16..da07796d066 100644 --- a/reactos/dll/directx/ksproxy/enumpins.cpp +++ b/reactos/dll/directx/ksproxy/enumpins.cpp @@ -71,7 +71,6 @@ CEnumPins::QueryInterface( OutputDebugStringW(Buffer); CoTaskMemFree(lpstr); -DebugBreak(); return E_NOINTERFACE; } diff --git a/reactos/dll/directx/ksproxy/input_pin.cpp b/reactos/dll/directx/ksproxy/input_pin.cpp index 51b78726ccb..e56eacb938c 100644 --- a/reactos/dll/directx/ksproxy/input_pin.cpp +++ b/reactos/dll/directx/ksproxy/input_pin.cpp @@ -700,7 +700,6 @@ CInputPin::Receive(IMediaSample *pSample) { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Receive NotImplemented\n"); - DebugBreak(); #endif return E_NOTIMPL; @@ -712,7 +711,6 @@ CInputPin::ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSample { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ReceiveMultiple NotImplemented\n"); - DebugBreak(); #endif return E_NOTIMPL; @@ -724,7 +722,6 @@ CInputPin::ReceiveCanBlock( void) { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ReceiveCanBlock NotImplemented\n"); - DebugBreak(); #endif return S_FALSE; @@ -923,7 +920,6 @@ CInputPin::KsQualityNotify( OutputDebugStringW(L"CInputPin::KsQualityNotify NotImplemented\n"); #endif - DebugBreak(); return E_NOTIMPL; } @@ -1114,7 +1110,6 @@ CInputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Connect NotImplemented\n"); - DebugBreak(); #endif return NOERROR; } @@ -1199,7 +1194,6 @@ CInputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt) #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ConnectionMediaType NotImplemented\n"); - DebugBreak(); #endif return E_NOTIMPL; @@ -1496,7 +1490,6 @@ CInputPin::CreatePin( WCHAR Buffer[100]; swprintf(Buffer, L"CInputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName); OutputDebugStringW(Buffer); - DebugBreak(); #endif hr = E_FAIL; } @@ -1629,7 +1622,6 @@ CInputPin::CreatePinHandle( { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::CreatePinHandle GetSupportedSets failed\n"); - DebugBreak(); #endif return hr; } @@ -1640,7 +1632,6 @@ CInputPin::CreatePinHandle( { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::CreatePinHandle LoadProxyPlugins failed\n"); - DebugBreak(); #endif return hr; } @@ -1783,7 +1774,6 @@ CInputPin::LoadProxyPlugins( { // store plugin m_Plugins.push_back(pUnknown); -DebugBreak(); } // close key RegCloseKey(hSubKey); diff --git a/reactos/dll/directx/ksproxy/mediasample.cpp b/reactos/dll/directx/ksproxy/mediasample.cpp index e0411938444..28270cdc3bd 100644 --- a/reactos/dll/directx/ksproxy/mediasample.cpp +++ b/reactos/dll/directx/ksproxy/mediasample.cpp @@ -21,7 +21,6 @@ public: STDMETHODIMP_(ULONG) Release() { InterlockedDecrement(&m_Ref); - DebugBreak(); if (!m_Ref) { if (m_Allocator) @@ -280,7 +279,6 @@ STDMETHODCALLTYPE CMediaSample::SetMediaType(AM_MEDIA_TYPE *pMediaType) { OutputDebugStringW(L"CMediaSample::SetMediaType NotImplemented\n"); - DebugBreak(); return E_NOTIMPL; } diff --git a/reactos/dll/directx/ksproxy/output_pin.cpp b/reactos/dll/directx/ksproxy/output_pin.cpp index 17f07804a20..f9f37725c53 100644 --- a/reactos/dll/directx/ksproxy/output_pin.cpp +++ b/reactos/dll/directx/ksproxy/output_pin.cpp @@ -1548,7 +1548,6 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) OutputDebugStringW(L"COutputPin::Connect no IMemInputPin interface\n"); #endif - DebugBreak(); return hr; } @@ -1946,13 +1945,26 @@ COutputPin::CreatePin( // query for pin medium hr = KsQueryMediums(&MediumList); if (FAILED(hr)) + { +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::CreatePin KsQueryMediums failed %lx\n", hr); + OutputDebugStringW(Buffer); +#endif return hr; + } // query for pin interface hr = KsQueryInterfaces(&InterfaceList); if (FAILED(hr)) { // failed +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::CreatePin KsQueryInterfaces failed %lx\n", hr); + OutputDebugStringW(Buffer); +#endif + CoTaskMemFree(MediumList); return hr; } @@ -2003,6 +2015,12 @@ COutputPin::CreatePin( CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::CreatePin failed to create interface handler %lx\n", hr); + OutputDebugStringW(Buffer); +#endif + return hr; } @@ -2010,7 +2028,12 @@ COutputPin::CreatePin( hr = InterfaceHandler->KsSetPin((IKsPin*)this); if (FAILED(hr)) { - // failed to load interface handler plugin + // failed to initialize interface handler plugin +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::CreatePin failed to initialize interface handler %lx\n", hr); + OutputDebugStringW(Buffer); +#endif InterfaceHandler->Release(); CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); @@ -2027,7 +2050,6 @@ COutputPin::CreatePin( WCHAR Buffer[100]; swprintf(Buffer, L"COutputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName); OutputDebugStringW(Buffer); - DebugBreak(); #endif hr = E_FAIL; @@ -2037,6 +2059,12 @@ COutputPin::CreatePin( CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::CreatePin Result %lx\n", hr); + OutputDebugStringW(Buffer); +#endif + return hr; } @@ -2058,6 +2086,8 @@ COutputPin::CreatePinHandle( //KSPROPERTY Property; //ULONG BytesReturned; + OutputDebugStringW(L"COutputPin::CreatePinHandle\n"); + if (m_hPin != INVALID_HANDLE_VALUE) { // pin already exists @@ -2173,7 +2203,6 @@ COutputPin::CreatePinHandle( if (FAILED(InitializeIOThread())) { OutputDebugStringW(L"COutputPin::CreatePinHandle failed to initialize i/o thread\n"); - DebugBreak(); } LPGUID pGuid; @@ -2184,8 +2213,7 @@ COutputPin::CreatePinHandle( if (FAILED(hr)) { #ifdef KSPROXY_TRACE - OutputDebugStringW(L"CInputPin::CreatePinHandle GetSupportedSets failed\n"); - DebugBreak(); + OutputDebugStringW(L"COutputPin::CreatePinHandle GetSupportedSets failed\n"); #endif return hr; } @@ -2195,8 +2223,7 @@ COutputPin::CreatePinHandle( if (FAILED(hr)) { #ifdef KSPROXY_TRACE - OutputDebugStringW(L"CInputPin::CreatePinHandle LoadProxyPlugins failed\n"); - DebugBreak(); + OutputDebugStringW(L"COutputPin::CreatePinHandle LoadProxyPlugins failed\n"); #endif return hr; } @@ -2338,7 +2365,6 @@ COutputPin::LoadProxyPlugins( { // store plugin m_Plugins.push_back(pUnknown); -DebugBreak(); } // close key RegCloseKey(hSubKey); diff --git a/reactos/dll/directx/ksproxy/precomp.h b/reactos/dll/directx/ksproxy/precomp.h index eae5de0f1aa..f7268b1e026 100644 --- a/reactos/dll/directx/ksproxy/precomp.h +++ b/reactos/dll/directx/ksproxy/precomp.h @@ -3,7 +3,7 @@ #define _FORCENAMELESSUNION #define BUILDING_KS #define _KSDDK_ -//#define KSPROXY_TRACE +#define KSPROXY_TRACE #include //#include #include diff --git a/reactos/dll/directx/ksproxy/proxy.cpp b/reactos/dll/directx/ksproxy/proxy.cpp index bd34ec8184b..175eff205ca 100644 --- a/reactos/dll/directx/ksproxy/proxy.cpp +++ b/reactos/dll/directx/ksproxy/proxy.cpp @@ -1954,7 +1954,6 @@ CKsProxy::IsDirty() { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::IsDirty Notimplemented\n"); - DebugBreak(); #endif return E_NOTIMPL; } @@ -2035,7 +2034,6 @@ CKsProxy::Load( }while(Length > 0); - DebugBreak(); return S_OK; } @@ -2059,7 +2057,6 @@ CKsProxy::GetSizeMax( { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetSizeMax Notimplemented\n"); - DebugBreak(); #endif return E_NOTIMPL; @@ -2480,23 +2477,50 @@ CKsProxy::CreatePins() // query current instance count hr = GetPinInstanceCount(Index, &Instances); if (FAILED(hr)) + { +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::CreatePins GetPinInstanceCount failed with %lx\n", hr); + OutputDebugStringW(Buffer); +#endif continue; + } + // query pin communication; hr = GetPinCommunication(Index, &Communication); if (FAILED(hr)) + { +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::CreatePins GetPinCommunication failed with %lx\n", hr); + OutputDebugStringW(Buffer); +#endif continue; + } if (Instances.CurrentCount == Instances.PossibleCount) { // already maximum reached for this pin +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::CreatePins Instances.CurrentCount == Instances.PossibleCount\n"); + OutputDebugStringW(Buffer); +#endif continue; } // get direction of pin hr = GetPinDataflow(Index, &DataFlow); if (FAILED(hr)) + { +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::CreatePins GetPinDataflow failed with %lx\n", hr); + OutputDebugStringW(Buffer); +#endif continue; + } if (DataFlow == KSPIN_DATAFLOW_IN) hr = GetPinName(Index, DataFlow, InputPin, &PinName); @@ -2504,7 +2528,14 @@ CKsProxy::CreatePins() hr = GetPinName(Index, DataFlow, OutputPin, &PinName); if (FAILED(hr)) + { +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::CreatePins GetPinName failed with %lx\n", hr); + OutputDebugStringW(Buffer); +#endif continue; + } // construct the pins if (DataFlow == KSPIN_DATAFLOW_IN) @@ -2512,6 +2543,11 @@ CKsProxy::CreatePins() hr = CInputPin_Constructor((IBaseFilter*)this, PinName, m_hDevice, Index, Communication, IID_IPin, (void**)&pPin); if (FAILED(hr)) { +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::CreatePins CInputPin_Constructor failed with %lx\n", hr); + OutputDebugStringW(Buffer); +#endif CoTaskMemFree(PinName); continue; } @@ -2522,6 +2558,11 @@ CKsProxy::CreatePins() hr = COutputPin_Constructor((IBaseFilter*)this, PinName, Index, Communication, IID_IPin, (void**)&pPin); if (FAILED(hr)) { +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::CreatePins COutputPin_Constructor failed with %lx\n", hr); + OutputDebugStringW(Buffer); +#endif CoTaskMemFree(PinName); continue; } @@ -2627,9 +2668,12 @@ CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog) hr = LoadProxyPlugins(pGuid, NumGuids); if (FAILED(hr)) { +#if 0 //HACK CloseHandle(m_hDevice); m_hDevice = NULL; return hr; +#endif + OutputDebugStringW(L"CKsProxy::LoadProxyPlugins failed!\n"); } // free sets @@ -2638,6 +2682,14 @@ CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog) // now create the input / output pins hr = CreatePins(); +#ifdef KSPROXY_TRACE + swprintf(Buffer, L"CKsProxy::Load CreatePins %lx\n", hr); + OutputDebugStringW(Buffer); +#endif + + //HACK + hr = S_OK; + return hr; } @@ -2986,10 +3038,6 @@ STDMETHODCALLTYPE CKsProxy::EnumPins( IEnumPins **ppEnum) { -#ifdef KSPROXY_TRACE - OutputDebugStringW(L"CKsProxy::EnumPins\n"); -#endif - return CEnumPins_fnConstructor(m_Pins, IID_IEnumPins, (void**)ppEnum); } diff --git a/reactos/dll/directx/msdvbnp/enumpins.cpp b/reactos/dll/directx/msdvbnp/enumpins.cpp index 567705907b7..9466aaae8f3 100644 --- a/reactos/dll/directx/msdvbnp/enumpins.cpp +++ b/reactos/dll/directx/msdvbnp/enumpins.cpp @@ -155,14 +155,6 @@ CEnumPins_fnConstructor( { CEnumPins * handler = new CEnumPins(NumPins, pins); -#ifdef MSDVBNP_TRACE - WCHAR Buffer[MAX_PATH]; - LPOLESTR lpstr; - StringFromCLSID(riid, &lpstr); - swprintf(Buffer, L"CEnumPins_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); - OutputDebugStringW(Buffer); -#endif - if (!handler) return E_OUTOFMEMORY; From 215e19921976ca34e1c34f0dfbcf37a8bbd8e069 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 2 Apr 2010 16:38:48 +0000 Subject: [PATCH 008/261] [KS] - Instantiated pins use as the control mutex the mutex from the filter - Fix KsAcquireControl & KsReleaseControl - Fix handling of IRP_MN_QUERY_INTERFACE - Filter centric ks filters expect an array of KSPROCESSPIN_INDEXENTRY. Allocate array when intializing filter / new pin factory is added - Store result of pin intersection handler when result is STATUS_BUFFER_OVERFLOW - Implement setting / retrieving of master clock - Implement setting / retrieving pin state - Partly implement setting pin data format - Implement IKsReferenceClock interface - Implement KsPinGetReferenceClockInterface - Add sanity checks to KsGetPinFromIrp - Partly implement handling IOCTL_KS_READ_STREAM / IOCTL_KS_WRITE_STREAM - Supply filter property sets when an IOCTL_KS_PROPERTY request arrives - Release again filter mutex when closing the pin - Implement allocating a clock - Tuner pin fails with STATUS_IO_DEVICE_ERROR when set to KSSTATE_RUN, needs more investigation svn path=/trunk/; revision=46685 --- reactos/drivers/ksfilter/ks/api.c | 4 +- reactos/drivers/ksfilter/ks/device.c | 3 +- reactos/drivers/ksfilter/ks/driver.c | 6 +- reactos/drivers/ksfilter/ks/filter.c | 101 ++- reactos/drivers/ksfilter/ks/filterfactory.c | 11 +- reactos/drivers/ksfilter/ks/kstypes.h | 2 +- reactos/drivers/ksfilter/ks/pin.c | 854 ++++++++++++++++++-- reactos/drivers/ksfilter/ks/priv.h | 21 + reactos/drivers/ksfilter/ks/property.c | 2 +- 9 files changed, 903 insertions(+), 101 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index ef83f9dbedf..8ec11860e02 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -1589,7 +1589,7 @@ KsAcquireControl( /* sanity check */ ASSERT(BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); - KeWaitForSingleObject(&BasicHeader->ControlMutex, Executive, KernelMode, FALSE, NULL); + KeWaitForSingleObject(BasicHeader->ControlMutex, Executive, KernelMode, FALSE, NULL); } @@ -1606,7 +1606,7 @@ KsReleaseControl( /* sanity check */ ASSERT(BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); - KeReleaseMutex(&BasicHeader->ControlMutex, FALSE); + KeReleaseMutex(BasicHeader->ControlMutex, FALSE); } diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c index 345689f49b8..cf1d3f73216 100644 --- a/reactos/drivers/ksfilter/ks/device.c +++ b/reactos/drivers/ksfilter/ks/device.c @@ -492,7 +492,7 @@ IKsDevice_Pnp( } case IRP_MN_QUERY_INTERFACE: { - Status = STATUS_SUCCESS; + Status = STATUS_UNSUCCESSFUL; /* check for pnp notification support */ if (Dispatch) { @@ -508,6 +508,7 @@ IKsDevice_Pnp( if (NT_SUCCESS(Status)) { /* driver supports a private interface */ + DPRINT1("IRP_MN_QUERY_INTERFACE Device supports interface\n"); Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; diff --git a/reactos/drivers/ksfilter/ks/driver.c b/reactos/drivers/ksfilter/ks/driver.c index 409977d63d5..949e1285c54 100644 --- a/reactos/drivers/ksfilter/ks/driver.c +++ b/reactos/drivers/ksfilter/ks/driver.c @@ -39,10 +39,10 @@ KsGetDevice( { PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); - DPRINT("KsGetDevice %p BasicHeader %p Type %x\n", Object, BasicHeader, BasicHeader->Type); - - ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == BasicHeader->Type); + ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); ASSERT(BasicHeader->KsDevice); + ASSERT(BasicHeader->KsDevice->Started); + ASSERT(BasicHeader->KsDevice->PhysicalDeviceObject); return BasicHeader->KsDevice; } diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index 5d06ca2f49d..5c8fe7f463f 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -26,6 +26,7 @@ typedef struct ULONG PinDescriptorCount; PKSFILTERFACTORY Factory; PFILE_OBJECT FileObject; + KMUTEX ControlMutex; KMUTEX ProcessingMutex; @@ -34,7 +35,7 @@ typedef struct ULONG *PinInstanceCount; PKSPIN * FirstPin; - KSPROCESSPIN_INDEXENTRY ProcessPinIndex; + PKSPROCESSPIN_INDEXENTRY ProcessPinIndex; }IKsFilterImpl; @@ -294,18 +295,20 @@ IKsFilter_fnAddProcessPin( /* first acquire processing mutex */ KeWaitForSingleObject(&This->ProcessingMutex, Executive, KernelMode, FALSE, NULL); - /* edit process pin descriptor */ - Status = _KsEdit(This->Filter.Bag, - (PVOID*)&This->ProcessPinIndex.Pins, - (This->ProcessPinIndex.Count + 1) * sizeof(PKSPROCESSPIN), - (This->ProcessPinIndex.Count) * sizeof(PKSPROCESSPIN), + /* sanity check */ + ASSERT(This->PinDescriptorCount > ProcessPin->Pin->Id); + + /* allocate new process pin array */ + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex[ProcessPin->Pin->Id].Pins, + (This->PinDescriptorCount + 1) * sizeof(PKSPROCESSPIN), + This->PinDescriptorCount * sizeof(PKSPROCESSPIN), 0); if (NT_SUCCESS(Status)) { - /* add new process pin */ - This->ProcessPinIndex.Pins[This->ProcessPinIndex.Count] = ProcessPin; - This->ProcessPinIndex.Count++; + /* store process pin */ + This->ProcessPinIndex[ProcessPin->Pin->Id].Pins[This->ProcessPinIndex[ProcessPin->Pin->Id].Count] = ProcessPin; + This->ProcessPinIndex[ProcessPin->Pin->Id].Count++; } /* release process mutex */ @@ -321,25 +324,39 @@ IKsFilter_fnRemoveProcessPin( IN PKSPROCESSPIN ProcessPin) { ULONG Index; + ULONG Count; + PKSPROCESSPIN * Pins; + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); /* first acquire processing mutex */ KeWaitForSingleObject(&This->ProcessingMutex, Executive, KernelMode, FALSE, NULL); - /* iterate through process pin index array and search for the process pin to be removed */ - for(Index = 0; Index < This->ProcessPinIndex.Count; Index++) + /* sanity check */ + ASSERT(ProcessPin->Pin); + ASSERT(ProcessPin->Pin->Id); + + Count = This->ProcessPinIndex[ProcessPin->Pin->Id].Count; + Pins = This->ProcessPinIndex[ProcessPin->Pin->Id].Pins; + + /* search for current process pin */ + for(Index = 0; Index < Count; Index++) { - if (This->ProcessPinIndex.Pins[Index] == ProcessPin) + if (Pins[Index] == ProcessPin) { - /* found process pin */ - if (Index + 1 < This->ProcessPinIndex.Count) - { - /* erase entry */ - RtlMoveMemory(&This->ProcessPinIndex.Pins[Index], &This->ProcessPinIndex.Pins[Index+1], This->ProcessPinIndex.Count - Index - 1); - } - /* decrement process pin count */ - This->ProcessPinIndex.Count--; + RtlMoveMemory(&Pins[Index], &Pins[Index + 1], (Count - (Index + 1)) * sizeof(PKSPROCESSPIN)); + break; } + + } + + /* decrement pin count */ + This->ProcessPinIndex[ProcessPin->Pin->Id].Count--; + + if (!This->ProcessPinIndex[ProcessPin->Pin->Id].Count) + { + /* clear entry object bag will delete it */ + This->ProcessPinIndex[ProcessPin->Pin->Id].Pins = NULL; } /* release process mutex */ @@ -394,8 +411,9 @@ NTAPI IKsFilter_fnGetProcessDispatch( IKsFilter * iface) { - UNIMPLEMENTED - return NULL; + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); + + return This->ProcessPinIndex; } static IKsFilterVtbl vt_IKsFilter = @@ -619,7 +637,7 @@ KspHandleDataIntersection( Data, &Length); - if (Status == STATUS_SUCCESS) + if (Status == STATUS_SUCCESS || Status == STATUS_BUFFER_OVERFLOW) { IoStatus->Information = Length; break; @@ -784,6 +802,7 @@ IKsFilter_CreateDescriptors( This->PinInstanceCount = NULL; This->PinDescriptors = NULL; This->PinDescriptorsEx = NULL; + This->ProcessPinIndex = NULL; This->PinDescriptorCount = 0; /* initialize topology descriptor */ @@ -842,8 +861,6 @@ IKsFilter_CreateDescriptors( return Status; } - - /* add new pin factory */ RtlMoveMemory(This->PinDescriptorsEx, FilterDescriptor->PinDescriptors, sizeof(KSPIN_DESCRIPTOR_EX) * FilterDescriptor->PinDescriptorsCount); @@ -852,8 +869,19 @@ IKsFilter_CreateDescriptors( RtlMoveMemory(&This->PinDescriptors[Index], &FilterDescriptor->PinDescriptors[Index].PinDescriptor, sizeof(KSPIN_DESCRIPTOR)); } + /* allocate process pin index */ + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex, sizeof(KSPROCESSPIN_INDEXENTRY) * FilterDescriptor->PinDescriptorsCount, + sizeof(KSPROCESSPIN_INDEXENTRY) * FilterDescriptor->PinDescriptorsCount, 0); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IKsFilter_CreateDescriptors _KsEdit failed %lx\n", Status); + return Status; + } + /* store new pin descriptor count */ This->PinDescriptorCount = FilterDescriptor->PinDescriptorsCount; + } if (FilterDescriptor->NodeDescriptorsCount) @@ -991,7 +1019,7 @@ IKsFilter_DispatchCreatePin( ASSERT(This->Header.Type == KsObjectTypeFilter); /* acquire control mutex */ - KeWaitForSingleObject(&This->Header.ControlMutex, Executive, KernelMode, FALSE, NULL); + KeWaitForSingleObject(This->Header.ControlMutex, Executive, KernelMode, FALSE, NULL); /* now validate the connect request */ Status = KsValidateConnectRequest(Irp, This->PinDescriptorCount, This->PinDescriptors, &Connect); @@ -1029,7 +1057,7 @@ IKsFilter_DispatchCreatePin( } /* release control mutex */ - KeReleaseMutex(&This->Header.ControlMutex, FALSE); + KeReleaseMutex(This->Header.ControlMutex, FALSE); if (Status != STATUS_PENDING) { @@ -1176,6 +1204,8 @@ KspCreateFilter( return STATUS_INSUFFICIENT_RESOURCES; } + DPRINT("KspCreateFilter Flags %lx\n", Factory->FilterDescriptor->Flags); + /* initialize pin create item */ CreateItem[0].Create = IKsFilter_DispatchCreatePin; CreateItem[0].Context = (PVOID)This; @@ -1202,7 +1232,8 @@ KspCreateFilter( This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->Header.Parent.KsFilterFactory = iface->lpVtbl->GetStruct(iface); This->Header.Type = KsObjectTypeFilter; - KeInitializeMutex(&This->Header.ControlMutex, 0); + This->Header.ControlMutex = &This->ControlMutex; + KeInitializeMutex(This->Header.ControlMutex, 0); InitializeListHead(&This->Header.EventList); KeInitializeSpinLock(&This->Header.EventListLock); @@ -1224,8 +1255,9 @@ KspCreateFilter( if (Factory->FilterDescriptor->Dispatch->Create) { /* now let driver initialize the filter instance */ - DPRINT("Before instantiating filter Filter %p This %p KSBASIC_HEADER %u\n", &This->Filter, This, sizeof(KSBASIC_HEADER)); + ASSERT(This->Header.KsDevice); + ASSERT(This->Header.KsDevice->Started); Status = Factory->FilterDescriptor->Dispatch->Create(&This->Filter, Irp); if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) @@ -1432,6 +1464,17 @@ KsFilterCreatePinFactory ( RtlMoveMemory(&This->PinDescriptorsEx[This->PinDescriptorCount], InPinDescriptor, sizeof(KSPIN_DESCRIPTOR_EX)); RtlMoveMemory(&This->PinDescriptors[This->PinDescriptorCount], &InPinDescriptor->PinDescriptor, sizeof(KSPIN_DESCRIPTOR)); + + /* allocate process pin index */ + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex, sizeof(KSPROCESSPIN_INDEXENTRY) * Count, + sizeof(KSPROCESSPIN_INDEXENTRY) * This->PinDescriptorCount, 0); + + if (!NT_SUCCESS(Status)) + { + DPRINT("KsFilterCreatePinFactory _KsEdit failed %lx\n", Status); + return Status; + } + /* store new pin id */ *PinID = This->PinDescriptorCount; diff --git a/reactos/drivers/ksfilter/ks/filterfactory.c b/reactos/drivers/ksfilter/ks/filterfactory.c index a16b2900069..18b2147b679 100644 --- a/reactos/drivers/ksfilter/ks/filterfactory.c +++ b/reactos/drivers/ksfilter/ks/filterfactory.c @@ -21,6 +21,8 @@ typedef struct PFNKSFILTERFACTORYPOWER WakeCallback; LIST_ENTRY SymbolicLinkList; + KMUTEX ControlMutex; + }IKsFilterFactoryImpl; VOID @@ -225,17 +227,16 @@ IKsFilterFactory_fnInitialize( This->Header.Parent.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->DeviceHeader = DeviceExtension->DeviceHeader; + /* initialize filter factory control mutex */ + This->Header.ControlMutex = &This->ControlMutex; + KeInitializeMutex(This->Header.ControlMutex, 0); + /* unused fields */ - KeInitializeMutex(&This->Header.ControlMutex, 0); InitializeListHead(&This->Header.EventList); KeInitializeSpinLock(&This->Header.EventListLock); - InitializeListHead(&This->SymbolicLinkList); - /* initialize filter factory control mutex */ - KeInitializeMutex(&This->Header.ControlMutex, 0); - /* does the device use a reference string */ if (RefString || !Descriptor->ReferenceGuid) { diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index 4bdc04c0bcb..d5c7588fda1 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -58,7 +58,7 @@ typedef struct { KSOBJECTTYPE Type; PKSDEVICE KsDevice; - KMUTEX ControlMutex; + PRKMUTEX ControlMutex; LIST_ENTRY EventList; KSPIN_LOCK EventListLock; union diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c index 5d1ee77a6df..70e17e6607a 100644 --- a/reactos/drivers/ksfilter/ks/pin.c +++ b/reactos/drivers/ksfilter/ks/pin.c @@ -29,8 +29,9 @@ typedef struct LIST_ENTRY Entry; IKsPinVtbl *lpVtbl; - LONG ref; + + IKsFilter * Filter; KMUTEX ProcessingMutex; PFILE_OBJECT FileObject; @@ -50,8 +51,355 @@ typedef struct PFNKSPINFRAMERETURN FrameReturn; PFNKSPINIRPCOMPLETION IrpCompletion; + KSCLOCK_FUNCTIONTABLE ClockTable; + PFILE_OBJECT ClockFileObject; + IKsReferenceClockVtbl * lpVtblReferenceClock; + PKSDEFAULTCLOCK DefaultClock; + }IKsPinImpl; +NTSTATUS NTAPI IKsPin_PinStatePropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI IKsPin_PinDataFormatPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI IKsPin_PinAllocatorFramingPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI IKsPin_PinStreamAllocator(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI IKsPin_PinMasterClock(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI IKsPin_PinPipeId(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); + + + +DEFINE_KSPROPERTY_CONNECTIONSET(PinConnectionSet, IKsPin_PinStatePropertyHandler, IKsPin_PinDataFormatPropertyHandler, IKsPin_PinAllocatorFramingPropertyHandler); +DEFINE_KSPROPERTY_STREAMSET(PinStreamSet, IKsPin_PinStreamAllocator, IKsPin_PinMasterClock, IKsPin_PinPipeId); + +//TODO +// KSPROPSETID_Connection +// KSPROPERTY_CONNECTION_ACQUIREORDERING +// KSPROPSETID_StreamInterface +// KSPROPERTY_STREAMINTERFACE_HEADERSIZE + +KSPROPERTY_SET PinPropertySet[] = +{ + { + &KSPROPSETID_Connection, + sizeof(PinConnectionSet) / sizeof(KSPROPERTY_ITEM), + (const KSPROPERTY_ITEM*)&PinConnectionSet, + 0, + NULL + }, + { + &KSPROPSETID_Stream, + sizeof(PinStreamSet) / sizeof(KSPROPERTY_ITEM), + (const KSPROPERTY_ITEM*)&PinStreamSet, + 0, + NULL + } +}; + +const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; +const GUID KSPROPSETID_Stream = {0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}}; +const GUID KSPROPSETID_Clock = {0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; + +NTSTATUS +NTAPI +IKsPin_PinStreamAllocator( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +IKsPin_PinMasterClock( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PIO_STACK_LOCATION IoStack; + PKSIOBJECT_HEADER ObjectHeader; + IKsPinImpl * This; + NTSTATUS Status = STATUS_SUCCESS; + PHANDLE Handle; + PFILE_OBJECT FileObject; + KPROCESSOR_MODE Mode; + KSPROPERTY Property; + ULONG BytesReturned; + + /* get current irp stack */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("IKsPin_PinMasterClock\n"); + + /* sanity check */ + ASSERT(IoStack->FileObject); + ASSERT(IoStack->FileObject->FsContext2); + + /* get the object header */ + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; + + /* locate ks pin implemention from KSPIN offset */ + This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); + + /* acquire control mutex */ + KeWaitForSingleObject(This->BasicHeader.ControlMutex, Executive, KernelMode, FALSE, NULL); + + Handle = (PHANDLE)Data; + + if (Request->Flags & KSPROPERTY_TYPE_GET) + { + if (This->Pin.Descriptor->PinDescriptor.Communication != KSPIN_COMMUNICATION_NONE && + This->Pin.Descriptor->Dispatch && + (This->Pin.Descriptor->Flags & KSPIN_FLAG_IMPLEMENT_CLOCK)) + { + *Handle = NULL; + Status = STATUS_SUCCESS; + } + else + { + /* no clock available */ + Status = STATUS_UNSUCCESSFUL; + } + } + else if (Request->Flags & KSPROPERTY_TYPE_SET) + { + if (This->Pin.ClientState != KSSTATE_STOP) + { + /* can only set in stopped state */ + Status = STATUS_INVALID_DEVICE_STATE; + } + else + { + if (*Handle) + { + Mode = ExGetPreviousMode(); + + Status = ObReferenceObjectByHandle(*Handle, SYNCHRONIZE | DIRECTORY_QUERY, IoFileObjectType, Mode, (PVOID*)&FileObject, NULL); + + DPRINT("IKsPin_PinMasterClock ObReferenceObjectByHandle %lx\n", Status); + if (NT_SUCCESS(Status)) + { + Property.Set = KSPROPSETID_Clock; + Property.Id = KSPROPERTY_CLOCK_FUNCTIONTABLE; + Property.Flags = KSPROPERTY_TYPE_GET; + + Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), &This->ClockTable, sizeof(KSCLOCK_FUNCTIONTABLE), &BytesReturned); + + DPRINT("IKsPin_PinMasterClock KSPROPERTY_CLOCK_FUNCTIONTABLE %lx\n", Status); + + if (NT_SUCCESS(Status)) + { + This->ClockFileObject = FileObject; + } + else + { + ObDereferenceObject(FileObject); + } + } + } + else + { + /* zeroing clock handle */ + RtlZeroMemory(&This->ClockTable, sizeof(KSCLOCK_FUNCTIONTABLE)); + Status = STATUS_SUCCESS; + if (This->ClockFileObject) + { + FileObject = This->ClockFileObject; + This->ClockFileObject = NULL; + + ObDereferenceObject(This->ClockFileObject); + } + } + } + } + + /* release processing mutex */ + KeReleaseMutex(This->BasicHeader.ControlMutex, FALSE); + + DPRINT("IKsPin_PinStatePropertyHandler Status %lx\n", Status); + return Status; +} + + + +NTSTATUS +NTAPI +IKsPin_PinPipeId( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; +} + + +NTSTATUS +NTAPI +IKsPin_PinStatePropertyHandler( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PIO_STACK_LOCATION IoStack; + PKSIOBJECT_HEADER ObjectHeader; + IKsPinImpl * This; + NTSTATUS Status = STATUS_SUCCESS; + KSSTATE OldState; + PKSSTATE NewState; + + /* get current irp stack */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("IKsPin_PinStatePropertyHandler\n"); + + /* sanity check */ + ASSERT(IoStack->FileObject); + ASSERT(IoStack->FileObject->FsContext2); + + /* get the object header */ + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; + + /* locate ks pin implemention from KSPIN offset */ + This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); + + /* acquire control mutex */ + KeWaitForSingleObject(This->BasicHeader.ControlMutex, Executive, KernelMode, FALSE, NULL); + + /* grab state */ + NewState = (PKSSTATE)Data; + + if (Request->Flags & KSPROPERTY_TYPE_GET) + { + *NewState = This->Pin.DeviceState; + Irp->IoStatus.Information = sizeof(KSSTATE); + } + else if (Request->Flags & KSPROPERTY_TYPE_SET) + { + if (This->Pin.Descriptor->Dispatch->SetDeviceState) + { + /* backup old state */ + OldState = This->Pin.ClientState; + + /* set new state */ + This->Pin.ClientState = *NewState; + + /* check if it supported */ + Status = This->Pin.Descriptor->Dispatch->SetDeviceState(&This->Pin, *NewState, OldState); + + DPRINT("IKsPin_PinStatePropertyHandler NewState %lu Result %lx\n", *NewState, Status); + + if (!NT_SUCCESS(Status)) + { + /* revert to old state */ + This->Pin.ClientState = OldState; + DbgBreakPoint(); + } + else + { + /* update device state */ + This->Pin.DeviceState = *NewState; + } + } + else + { + /* just set new state */ + This->Pin.DeviceState = *NewState; + This->Pin.ClientState = *NewState; + } + } + + /* release processing mutex */ + KeReleaseMutex(This->BasicHeader.ControlMutex, FALSE); + + DPRINT("IKsPin_PinStatePropertyHandler Status %lx\n", Status); + return Status; +} + +NTSTATUS +NTAPI +IKsPin_PinAllocatorFramingPropertyHandler( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +IKsPin_PinDataFormatPropertyHandler( + IN PIRP Irp, + IN PKSPROPERTY Request, + IN OUT PVOID Data) +{ + PIO_STACK_LOCATION IoStack; + PKSIOBJECT_HEADER ObjectHeader; + IKsPinImpl * This; + NTSTATUS Status = STATUS_SUCCESS; + + /* get current irp stack */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("IKsPin_PinDataFormatPropertyHandler\n"); + + /* sanity check */ + ASSERT(IoStack->FileObject); + ASSERT(IoStack->FileObject->FsContext2); + + /* get the object header */ + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; + + /* locate ks pin implemention from KSPIN offset */ + This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); + + /* acquire control mutex */ + KeWaitForSingleObject(This->BasicHeader.ControlMutex, Executive, KernelMode, FALSE, NULL); + + if (Request->Flags & KSPROPERTY_TYPE_GET) + { + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < This->Pin.ConnectionFormat->FormatSize) + { + /* buffer too small */ + Irp->IoStatus.Information = This->Pin.ConnectionFormat->FormatSize; + Status = STATUS_BUFFER_TOO_SMALL; + } + else + { + /* copy format */ + RtlMoveMemory(Data, This->Pin.ConnectionFormat, This->Pin.ConnectionFormat->FormatSize); + } + } + else if (Request->Flags & KSPROPERTY_TYPE_SET) + { + /* set format */ + if (This->Pin.Descriptor->Flags & KSPIN_FLAG_FIXED_FORMAT) + { + /* format cannot be changed */ + Status = STATUS_INVALID_DEVICE_REQUEST; + } + else + { + /* FIXME check if the format is supported */ + Status = _KsEdit(This->Pin.Bag, (PVOID*)&This->Pin.ConnectionFormat, IoStack->Parameters.DeviceIoControl.OutputBufferLength, This->Pin.ConnectionFormat->FormatSize, 0); + + if (NT_SUCCESS(Status)) + { + /* store new format */ + RtlMoveMemory(This->Pin.ConnectionFormat, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength); + } + } + } + + /* release processing mutex */ + KeReleaseMutex(This->BasicHeader.ControlMutex, FALSE); + + DPRINT("IKsPin_PinDataFormatPropertyHandler Status %lx\n", Status); + + return Status; +} + NTSTATUS NTAPI IKsPin_fnQueryInterface( @@ -67,6 +415,7 @@ IKsPin_fnQueryInterface( _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } + DbgBreakPoint(); return STATUS_UNSUCCESSFUL; } @@ -270,6 +619,209 @@ static IKsPinVtbl vt_IKsPin = //============================================================== +NTSTATUS +NTAPI +IKsReferenceClock_fnQueryInterface( + IKsReferenceClock * iface, + IN REFIID refiid, + OUT PVOID* Output) +{ + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + return IKsPin_fnQueryInterface((IKsPin*)&This->lpVtbl, refiid, Output); +} + +ULONG +NTAPI +IKsReferenceClock_fnAddRef( + IKsReferenceClock * iface) +{ + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + return IKsPin_fnAddRef((IKsPin*)&This->lpVtbl); +} + +ULONG +NTAPI +IKsReferenceClock_fnRelease( + IKsReferenceClock * iface) +{ + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + return IKsPin_fnRelease((IKsPin*)&This->lpVtbl); +} + +LONGLONG +NTAPI +IKsReferenceClock_fnGetTime( + IKsReferenceClock * iface) +{ + LONGLONG Result; + + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + if (!This->ClockFileObject || !This->ClockTable.GetTime) + { + Result = 0; + } + else + { + Result = This->ClockTable.GetTime(This->ClockFileObject); + } + + return Result; +} + +LONGLONG +NTAPI +IKsReferenceClock_fnGetPhysicalTime( + IKsReferenceClock * iface) +{ + LONGLONG Result; + + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + if (!This->ClockFileObject || !This->ClockTable.GetPhysicalTime) + { + Result = 0; + } + else + { + Result = This->ClockTable.GetPhysicalTime(This->ClockFileObject); + } + + return Result; +} + + +LONGLONG +NTAPI +IKsReferenceClock_fnGetCorrelatedTime( + IKsReferenceClock * iface, + OUT PLONGLONG SystemTime) +{ + LONGLONG Result; + + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + if (!This->ClockFileObject || !This->ClockTable.GetCorrelatedTime) + { + Result = 0; + } + else + { + Result = This->ClockTable.GetCorrelatedTime(This->ClockFileObject, SystemTime); + } + + return Result; +} + + +LONGLONG +NTAPI +IKsReferenceClock_fnGetCorrelatedPhysicalTime( + IKsReferenceClock * iface, + OUT PLONGLONG SystemTime) +{ + LONGLONG Result; + + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + if (!This->ClockFileObject || !This->ClockTable.GetCorrelatedPhysicalTime) + { + Result = 0; + } + else + { + Result = This->ClockTable.GetCorrelatedPhysicalTime(This->ClockFileObject, SystemTime); + } + + return Result; +} + +NTSTATUS +NTAPI +IKsReferenceClock_fnGetResolution( + IKsReferenceClock * iface, + OUT PKSRESOLUTION Resolution) +{ + KSPROPERTY Property; + ULONG BytesReturned; + + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + DPRINT1("IKsReferenceClock_fnGetResolution\n"); + + if (!This->ClockFileObject) + { + Resolution->Error = 0; + Resolution->Granularity = 1; + DPRINT1("IKsReferenceClock_fnGetResolution Using HACK\n"); + return STATUS_SUCCESS; + } + + + if (!This->ClockFileObject) + return STATUS_DEVICE_NOT_READY; + + + Property.Set = KSPROPSETID_Clock; + Property.Id = KSPROPERTY_CLOCK_RESOLUTION; + Property.Flags = KSPROPERTY_TYPE_GET; + + return KsSynchronousIoControlDevice(This->ClockFileObject, KernelMode, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), Resolution, sizeof(KSRESOLUTION), &BytesReturned); + +} + +NTSTATUS +NTAPI +IKsReferenceClock_fnGetState( + IKsReferenceClock * iface, + OUT PKSSTATE State) +{ + KSPROPERTY Property; + ULONG BytesReturned; + + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + DPRINT1("IKsReferenceClock_fnGetState\n"); + + if (!This->ClockFileObject) + { + *State = This->Pin.ClientState; + DPRINT1("IKsReferenceClock_fnGetState Using HACK\n"); + return STATUS_SUCCESS; + } + + + if (!This->ClockFileObject) + return STATUS_DEVICE_NOT_READY; + + + Property.Set = KSPROPSETID_Clock; + Property.Id = KSPROPERTY_CLOCK_RESOLUTION; + Property.Flags = KSPROPERTY_TYPE_GET; + + return KsSynchronousIoControlDevice(This->ClockFileObject, KernelMode, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), State, sizeof(KSSTATE), &BytesReturned); +} + +static IKsReferenceClockVtbl vt_ReferenceClock = +{ + IKsReferenceClock_fnQueryInterface, + IKsReferenceClock_fnAddRef, + IKsReferenceClock_fnRelease, + IKsReferenceClock_fnGetTime, + IKsReferenceClock_fnGetPhysicalTime, + IKsReferenceClock_fnGetCorrelatedTime, + IKsReferenceClock_fnGetCorrelatedPhysicalTime, + IKsReferenceClock_fnGetResolution, + IKsReferenceClock_fnGetState +}; + + +//============================================================== + + /* @implemented */ @@ -340,6 +892,7 @@ KsPinAttemptProcessing( IN BOOLEAN Asynchronous) { DPRINT("KsPinAttemptProcessing\n"); +DbgBreakPoint(); UNIMPLEMENTED } @@ -448,7 +1001,7 @@ KsPinGetParentFilter( } /* - @unimplemented + @implemented */ NTSTATUS NTAPI @@ -456,9 +1009,22 @@ NTAPI IN PKSPIN Pin, OUT PIKSREFERENCECLOCK* Interface) { - UNIMPLEMENTED - DPRINT("KsPinGetReferenceClockInterface Pin %p Interface %p\n", Pin, Interface); - return STATUS_UNSUCCESSFUL; + NTSTATUS Status = STATUS_DEVICE_NOT_READY; + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); + + if (This->ClockFileObject) + { + /* clock is available */ + *Interface = (PIKSREFERENCECLOCK)&This->lpVtblReferenceClock; + Status = STATUS_SUCCESS; + } +//HACK + *Interface = (PIKSREFERENCECLOCK)&This->lpVtblReferenceClock; + Status = STATUS_SUCCESS; + + DPRINT("KsPinGetReferenceClockInterface Pin %p Interface %p Status %x\n", Pin, Interface, Status); + + return Status; } /* @@ -547,15 +1113,26 @@ KsGetPinFromIrp( IN PIRP Irp) { PKSIOBJECT_HEADER ObjectHeader; + PKSPIN Pin; + PKSBASIC_HEADER Header; PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); DPRINT("KsGetPinFromIrp\n"); /* get object header */ ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; - /* return object type */ - return (PKSPIN)ObjectHeader->ObjectType; + if (!ObjectHeader) + return NULL; + + Pin = (PKSPIN)ObjectHeader->ObjectType; + Header = (PKSBASIC_HEADER)((ULONG_PTR)Pin - sizeof(KSBASIC_HEADER)); + + /* sanity check */ + ASSERT(Header->Type == KsObjectTypePin); + + /* return object type */ + return Pin; } @@ -629,6 +1206,7 @@ KsPinGetLeadingEdgeStreamPointer( { UNIMPLEMENTED DPRINT("KsPinGetLeadingEdgeStreamPointer Pin %p State %x\n", Pin, State); +DbgBreakPoint(); return NULL; } @@ -685,6 +1263,7 @@ KsStreamPointerUnlock( { UNIMPLEMENTED DPRINT("KsStreamPointerUnlock\n"); +DbgBreakPoint(); } /* @@ -700,7 +1279,7 @@ KsStreamPointerAdvanceOffsetsAndUnlock( IN BOOLEAN Eject) { DPRINT("KsStreamPointerAdvanceOffsets\n"); - +DbgBreakPoint(); UNIMPLEMENTED } @@ -718,7 +1297,7 @@ KsStreamPointerDelete( PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; DPRINT("KsStreamPointerDelete\n"); - +DbgBreakPoint(); This = (IKsPinImpl*)CONTAINING_RECORD(Pointer->StreamPointer.Pin, IKsPinImpl, Pin); /* point to first stream pointer */ @@ -766,6 +1345,7 @@ KsStreamPointerClone( { UNIMPLEMENTED DPRINT("KsStreamPointerClone\n"); +DbgBreakPoint(); return STATUS_NOT_IMPLEMENTED; } @@ -878,7 +1458,7 @@ KsPinGetFirstCloneStreamPointer( IKsPinImpl * This; DPRINT("KsPinGetFirstCloneStreamPointer %p\n", Pin); - +DbgBreakPoint(); This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); /* return first cloned stream pointer */ return &This->ClonedStreamPointer->StreamPointer; @@ -896,7 +1476,7 @@ KsStreamPointerGetNextClone( PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; DPRINT("KsStreamPointerGetNextClone\n"); - +DbgBreakPoint(); /* is there a another cloned stream pointer */ if (!Pointer->Next) return NULL; @@ -904,6 +1484,64 @@ KsStreamPointerGetNextClone( /* return next stream pointer */ return &Pointer->Next->StreamPointer; } +NTSTATUS +IKsPin_DispatchKsStream( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + IKsPinImpl * This) +{ + PKSPROCESSPIN_INDEXENTRY ProcessPinIndex; + PKSFILTER Filter; + NTSTATUS Status = STATUS_SUCCESS; + + DPRINT("IKsPin_DispatchKsStream\n"); + + /* FIXME handle reset states */ + ASSERT(This->Pin.ResetState == KSRESET_END); + + /* mark irp as pending */ + IoMarkIrpPending(Irp); + + /* add irp to cancelable queue */ + KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); + + if (This->Pin.Descriptor->Dispatch->Process) + { + /* it is a pin centric avstream */ + ASSERT(0); + //Status = This->Pin.Descriptor->Dispatch->Process(&This->Pin); + /* TODO */ + } + else + { + /* filter-centric avstream */ + ASSERT(This->Filter); + + ProcessPinIndex = This->Filter->lpVtbl->GetProcessDispatch(This->Filter); + Filter = This->Filter->lpVtbl->GetStruct(This->Filter); + + ASSERT(ProcessPinIndex); + ASSERT(Filter); + ASSERT(Filter->Descriptor); + ASSERT(Filter->Descriptor->Dispatch); + + if (!Filter->Descriptor->Dispatch->Process) + { + /* invalid device request */ + DPRINT("Filter Centric Processing No Process Routine\n"); + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_UNSUCCESSFUL; + } + + Status = Filter->Descriptor->Dispatch->Process(Filter, ProcessPinIndex); + + DPRINT("IKsPin_DispatchKsStream FilterCentric: Status %lx \n", Status); + } + + return Status; +} + NTSTATUS IKsPin_DispatchKsProperty( @@ -941,7 +1579,23 @@ IKsPin_DispatchKsProperty( NULL, PropertyItemSize); - DPRINT("IKsPin_DispatchKsProperty PropertySetCount %lu Status %lu\n", PropertySetsCount, Status); + if (Status != STATUS_NOT_FOUND) + { + /* property was handled by driver */ + if (Status != STATUS_PENDING) + { + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + return Status; + } + + /* try our properties */ + Status = KspPropertyHandler(Irp, + sizeof(PinPropertySet) / sizeof(KSPROPERTY_SET), + PinPropertySet, + NULL, + 0); if (Status != STATUS_NOT_FOUND) { @@ -977,7 +1631,6 @@ IKsPin_DispatchDeviceIoControl( PIO_STACK_LOCATION IoStack; PKSIOBJECT_HEADER ObjectHeader; IKsPinImpl * This; - NTSTATUS Status = STATUS_SUCCESS; /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -998,38 +1651,17 @@ IKsPin_DispatchDeviceIoControl( return IKsPin_DispatchKsProperty(DeviceObject, Irp, This); } - - if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_WRITE_STREAM && IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_READ_STREAM) + if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM || + IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_READ_STREAM) { - UNIMPLEMENTED; - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_NOT_IMPLEMENTED; + /* handle ks properties */ + return IKsPin_DispatchKsStream(DeviceObject, Irp, This); } - /* mark irp as pending */ - IoMarkIrpPending(Irp); - - /* add irp to cancelable queue */ - KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); - - if (This->Pin.Descriptor->Dispatch->Process) - { - /* it is a pin centric avstream */ - Status = This->Pin.Descriptor->Dispatch->Process(&This->Pin); - - /* TODO */ - } - else - { - /* TODO - * filter-centric avstream - */ - UNIMPLEMENTED - } - - return Status; + UNIMPLEMENTED; + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -1057,7 +1689,7 @@ IKsPin_Close( This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); /* acquire filter control mutex */ - KsFilterAcquireControl(This->BasicHeader.Parent.KsFilter); + KsFilterAcquireControl(&This->Pin); if (This->Pin.Descriptor->Dispatch->Close) { @@ -1082,6 +1714,9 @@ IKsPin_Close( } } + /* release filter control mutex */ + KsFilterReleaseControl(&This->Pin); + return Status; } @@ -1104,11 +1739,80 @@ IKsPin_DispatchCreateClock( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - UNIMPLEMENTED; + PKSPIN Pin; + NTSTATUS Status = STATUS_SUCCESS; + IKsPinImpl * This; + KSRESOLUTION Resolution; + PKSRESOLUTION pResolution = NULL; + PKSOBJECT_CREATE_ITEM CreateItem; - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + DPRINT("IKsPin_DispatchCreateClock\n"); + + /* get the create item */ + CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); + + /* sanity check */ + ASSERT(CreateItem); + + /* get the pin object */ + Pin = (PKSPIN)CreateItem->Context; + + /* sanity check */ + ASSERT(Pin); + + /* locate ks pin implemention fro KSPIN offset */ + This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); + + /* sanity check */ + ASSERT(This->BasicHeader.Type == KsObjectTypePin); + ASSERT(This->BasicHeader.ControlMutex); + + /* acquire control mutex */ + KsAcquireControl(Pin); + + if ((This->Pin.Descriptor->PinDescriptor.Communication != KSPIN_COMMUNICATION_NONE && + This->Pin.Descriptor->Dispatch) || + (This->Pin.Descriptor->Flags & KSPIN_FLAG_IMPLEMENT_CLOCK)) + { + if (!This->DefaultClock) + { + if (This->Pin.Descriptor->Dispatch && This->Pin.Descriptor->Dispatch->Clock) + { + if (This->Pin.Descriptor->Dispatch->Clock->Resolution) + { + This->Pin.Descriptor->Dispatch->Clock->Resolution(&This->Pin, &Resolution); + pResolution = &Resolution; + } + + Status = KsAllocateDefaultClockEx(&This->DefaultClock, + (PVOID)&This->Pin, + (PFNKSSETTIMER)This->Pin.Descriptor->Dispatch->Clock->SetTimer, + (PFNKSCANCELTIMER)This->Pin.Descriptor->Dispatch->Clock->CancelTimer, + (PFNKSCORRELATEDTIME)This->Pin.Descriptor->Dispatch->Clock->CorrelatedTime, + pResolution, + 0); + } + else + { + Status = KsAllocateDefaultClockEx(&This->DefaultClock, (PVOID)&This->Pin, NULL, NULL, NULL, NULL, 0); + } + } + + if (NT_SUCCESS(Status)) + { + Status = KsCreateDefaultClock(Irp, This->DefaultClock); + } + } + + DPRINT("IKsPin_DispatchCreateClock %lx\n", Status); + + /* release control mutex */ + KsReleaseControl(Pin); + + /* done */ + Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_NOT_IMPLEMENTED; + return Status; } NTSTATUS @@ -1141,7 +1845,7 @@ static KSDISPATCH_TABLE PinDispatchTable = NTSTATUS KspCreatePin( IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, + IN PIRP Irp, IN PKSDEVICE KsDevice, IN IKsFilterFactory * FilterFactory, IN IKsFilter* Filter, @@ -1155,11 +1859,15 @@ KspCreatePin( PKSOBJECT_CREATE_ITEM CreateItem; NTSTATUS Status; PKSDATAFORMAT DataFormat; + PKSBASIC_HEADER BasicHeader; /* sanity checks */ ASSERT(Descriptor->Dispatch); - DPRINT("KspCreatePin\n"); + DPRINT("KspCreatePin PinId %lu Flags %x\n", Connect->PinId, Descriptor->Flags); + +//Output Pin: KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY +//Input Pin: KSPIN_FLAG_FIXED_FORMAT|KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT|KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -1192,14 +1900,24 @@ KspCreatePin( This->BasicHeader.KsDevice = KsDevice; This->BasicHeader.Type = KsObjectTypePin; This->BasicHeader.Parent.KsFilter = Filter->lpVtbl->GetStruct(Filter); - KeInitializeMutex(&This->BasicHeader.ControlMutex, 0); + + ASSERT(This->BasicHeader.Parent.KsFilter); + + BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)This->BasicHeader.Parent.KsFilter - sizeof(KSBASIC_HEADER)); + + This->BasicHeader.ControlMutex = BasicHeader->ControlMutex; + ASSERT(This->BasicHeader.ControlMutex); + + InitializeListHead(&This->BasicHeader.EventList); KeInitializeSpinLock(&This->BasicHeader.EventListLock); /* initialize pin */ This->lpVtbl = &vt_IKsPin; + This->lpVtblReferenceClock = &vt_ReferenceClock; This->ref = 1; This->FileObject = IoStack->FileObject; + This->Filter = Filter; KeInitializeMutex(&This->ProcessingMutex, 0); InitializeListHead(&This->IrpList); KeInitializeSpinLock(&This->IrpListLock); @@ -1216,12 +1934,12 @@ KspCreatePin( } /* initialize object bag */ - Device->lpVtbl->InitializeObjectBag(Device, This->Pin.Bag, &This->BasicHeader.ControlMutex); /* is using control mutex right? */ + Device->lpVtbl->InitializeObjectBag(Device, This->Pin.Bag, NULL); /* get format */ DataFormat = (PKSDATAFORMAT)(Connect + 1); - /* initialize ks pin descriptor */ + /* initialize pin descriptor */ This->Pin.Descriptor = Descriptor; This->Pin.Context = NULL; This->Pin.Id = Connect->PinId; @@ -1253,19 +1971,19 @@ KspCreatePin( This->Pin.ClientState = KSSTATE_STOP; /* intialize allocator create item */ - CreateItem[0].Context = (PVOID)This; + CreateItem[0].Context = (PVOID)&This->Pin; CreateItem[0].Create = IKsPin_DispatchCreateAllocator; CreateItem[0].Flags = KSCREATE_ITEM_FREEONSTOP; RtlInitUnicodeString(&CreateItem[0].ObjectClass, KSSTRING_Allocator); /* intialize clock create item */ - CreateItem[1].Context = (PVOID)This; + CreateItem[1].Context = (PVOID)&This->Pin; CreateItem[1].Create = IKsPin_DispatchCreateClock; CreateItem[1].Flags = KSCREATE_ITEM_FREEONSTOP; RtlInitUnicodeString(&CreateItem[1].ObjectClass, KSSTRING_Clock); /* intialize topology node create item */ - CreateItem[2].Context = (PVOID)This; + CreateItem[2].Context = (PVOID)&This->Pin; CreateItem[2].Create = IKsPin_DispatchCreateNode; CreateItem[2].Flags = KSCREATE_ITEM_FREEONSTOP; RtlInitUnicodeString(&CreateItem[2].ObjectClass, KSSTRING_TopologyNode); @@ -1289,15 +2007,21 @@ KspCreatePin( This->ObjectHeader->Unknown = (PUNKNOWN)&This->lpVtbl; This->ObjectHeader->ObjectType = (PVOID)&This->Pin; - /* setup process pin */ - This->ProcessPin.Pin = &This->Pin; - This->ProcessPin.StreamPointer = (PKSSTREAM_POINTER)This->LeadingEdgeStreamPointer; - if (!Descriptor->Dispatch || !Descriptor->Dispatch->Process) { /* the pin is part of filter-centric processing filter * add process pin to filter */ + This->ProcessPin.BytesAvailable = 0; + This->ProcessPin.BytesUsed = 0; + This->ProcessPin.CopySource = NULL; + This->ProcessPin.Data = NULL; + This->ProcessPin.DelegateBranch = NULL; + This->ProcessPin.Flags = 0; + This->ProcessPin.InPlaceCounterpart = NULL; + This->ProcessPin.Pin = &This->Pin; + This->ProcessPin.StreamPointer = (PKSSTREAM_POINTER)This->LeadingEdgeStreamPointer; + This->ProcessPin.Terminate = FALSE; Status = Filter->lpVtbl->AddProcessPin(Filter, &This->ProcessPin); DPRINT("KspCreatePin AddProcessPin %lx\n", Status); @@ -1307,7 +2031,8 @@ KspCreatePin( /* failed to add process pin */ KsFreeObjectBag((KSOBJECT_BAG)This->Pin.Bag); KsFreeObjectHeader(&This->ObjectHeader); - + FreeItem(This); + FreeItem(CreateItem); /* return failure code */ return Status; } @@ -1315,6 +2040,15 @@ KspCreatePin( /* FIXME add pin instance to filter instance */ + + if (Descriptor->Dispatch && Descriptor->Dispatch->SetDataFormat) + { + Status = Descriptor->Dispatch->SetDataFormat(&This->Pin, NULL, NULL, This->Pin.ConnectionFormat, NULL); + DPRINT("KspCreatePin SetDataFormat %lx\n", Status); + DbgBreakPoint(); + } + + /* does the driver have a pin dispatch */ if (Descriptor->Dispatch && Descriptor->Dispatch->Create) { @@ -1323,6 +2057,8 @@ KspCreatePin( DPRINT("KspCreatePin DispatchCreate %lx\n", Status); } + + DPRINT("KspCreatePin Status %lx\n", Status); if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) diff --git a/reactos/drivers/ksfilter/ks/priv.h b/reactos/drivers/ksfilter/ks/priv.h index cc0b8f95fef..86ea4ebba64 100644 --- a/reactos/drivers/ksfilter/ks/priv.h +++ b/reactos/drivers/ksfilter/ks/priv.h @@ -35,3 +35,24 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\ DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\ DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\ } + +#define DEFINE_KSPROPERTY_CONNECTIONSET(PinSet,\ + PropStateHandler, PropDataFormatHandler, PropAllocatorFraming)\ +DEFINE_KSPROPERTY_TABLE(PinSet) {\ + DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(PropStateHandler, PropStateHandler),\ + DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(PropDataFormatHandler, PropDataFormatHandler),\ + DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(PropAllocatorFraming)\ +} + + +#define DEFINE_KSPROPERTY_STREAMSET(PinSet,\ + PropStreamAllocator, PropMasterClock, PropPipeId)\ +DEFINE_KSPROPERTY_TABLE(PinSet) {\ + DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(PropStreamAllocator, PropStreamAllocator),\ + DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(PropMasterClock, PropMasterClock),\ + DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(PropPipeId, PropPipeId)\ +} + + + + diff --git a/reactos/drivers/ksfilter/ks/property.c b/reactos/drivers/ksfilter/ks/property.c index a2e759ca07a..b1a17e3ed09 100644 --- a/reactos/drivers/ksfilter/ks/property.c +++ b/reactos/drivers/ksfilter/ks/property.c @@ -137,7 +137,7 @@ KspPropertyHandler( /* get input property request */ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - DPRINT("KspPropertyHandler Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM)); +// DPRINT("KspPropertyHandler Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM)); /* sanity check */ ASSERT(PropertyItemSize == 0 || PropertyItemSize == sizeof(KSPROPERTY_ITEM)); From d214e123907fdd3bd19bcfbae2537a3254e2a6ca Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 2 Apr 2010 17:05:39 +0000 Subject: [PATCH 009/261] [FREELOADER] - Fix the ShareDisposition value of COM port interrupts - Fix the Vector value of the interrupt resources svn path=/trunk/; revision=46686 --- reactos/boot/freeldr/freeldr/arch/i386/hardware.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index d4654ccd138..1dff167c987 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -1419,10 +1419,10 @@ DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey) /* Set Interrupt */ PartialDescriptor = &PartialResourceList->PartialDescriptors[1]; PartialDescriptor->Type = CmResourceTypeInterrupt; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; + PartialDescriptor->ShareDisposition = CmResourceShareShared; PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; PartialDescriptor->u.Interrupt.Level = Irq[i]; - PartialDescriptor->u.Interrupt.Vector = 0; + PartialDescriptor->u.Interrupt.Vector = Irq[i]; PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; /* Set serial data (device specific) */ @@ -1529,7 +1529,7 @@ DetectParallelPorts(PCONFIGURATION_COMPONENT_DATA BusKey) PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; PartialDescriptor->u.Interrupt.Level = Irq[i]; - PartialDescriptor->u.Interrupt.Vector = 0; + PartialDescriptor->u.Interrupt.Vector = Irq[i]; PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; } @@ -1715,7 +1715,7 @@ DetectKeyboardController(PCONFIGURATION_COMPONENT_DATA BusKey) PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; PartialDescriptor->u.Interrupt.Level = 1; - PartialDescriptor->u.Interrupt.Vector = 0; + PartialDescriptor->u.Interrupt.Vector = 1; PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; /* Set IO Port 0x60 */ @@ -1887,7 +1887,7 @@ DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey) PartialResourceList.PartialDescriptors[0].ShareDisposition = CmResourceShareUndetermined; PartialResourceList.PartialDescriptors[0].Flags = CM_RESOURCE_INTERRUPT_LATCHED; PartialResourceList.PartialDescriptors[0].u.Interrupt.Level = 12; - PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 0; + PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 12; PartialResourceList.PartialDescriptors[0].u.Interrupt.Affinity = 0xFFFFFFFF; /* Create controller key */ From 3d1eaacc72e0f4e51e7f665d093bf3be94e2e34f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 2 Apr 2010 17:07:38 +0000 Subject: [PATCH 010/261] [PCI] - Fix the Vector value of the interrupt resource - Actually set the device to use the interrupt that the PnP manager gave us svn path=/trunk/; revision=46687 --- reactos/drivers/bus/pci/pdo.c | 48 ++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index f19e45c1f4c..27cd878b9c3 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -775,7 +775,7 @@ PdoQueryResources( Descriptor->ShareDisposition = CmResourceShareShared; Descriptor->Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE; Descriptor->u.Interrupt.Level = PciConfig.u.type0.InterruptLine; - Descriptor->u.Interrupt.Vector = 0; + Descriptor->u.Interrupt.Vector = PciConfig.u.type0.InterruptLine; Descriptor->u.Interrupt.Affinity = 0xFFFFFFFF; } } @@ -1186,6 +1186,49 @@ PdoQueryInterface( return Status; } +static NTSTATUS +PdoStartDevice( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PCM_RESOURCE_LIST RawResList = IrpSp->Parameters.StartDevice.AllocatedResources; + PCM_FULL_RESOURCE_DESCRIPTOR RawFullDesc; + PCM_PARTIAL_RESOURCE_DESCRIPTOR RawPartialDesc; + ULONG i, ii; + PPDO_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + UCHAR Irq; + + /* TODO: Assign the other resources we get to the card */ + + for (i = 0; i < RawResList->Count; i++) + { + RawFullDesc = &RawResList->List[i]; + + for (ii = 0; ii < RawFullDesc->PartialResourceList.Count; ii++) + { + RawPartialDesc = &RawFullDesc->PartialResourceList.PartialDescriptors[ii]; + + if (RawPartialDesc->Type == CmResourceTypeInterrupt) + { + DPRINT1("Assigning IRQ %x to PCI device (%x, %x)\n", + RawPartialDesc->u.Interrupt.Vector, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + DeviceExtension->PciDevice->BusNumber); + + Irq = (UCHAR)RawPartialDesc->u.Interrupt.Vector; + HalSetBusDataByOffset(PCIConfiguration, + DeviceExtension->PciDevice->BusNumber, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + &Irq, + 0x3c /* PCI_INTERRUPT_LINE */, + sizeof(UCHAR)); + } + } + } + + return STATUS_SUCCESS; +} static NTSTATUS PdoReadConfig( @@ -1352,6 +1395,9 @@ PdoPnpControl( break; case IRP_MN_START_DEVICE: + Status = PdoStartDevice(DeviceObject, Irp, IrpSp); + break; + case IRP_MN_QUERY_STOP_DEVICE: case IRP_MN_CANCEL_STOP_DEVICE: case IRP_MN_STOP_DEVICE: From 809944b6681df172d487cf8ddf224d86eee3bcad Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 2 Apr 2010 17:19:57 +0000 Subject: [PATCH 011/261] [PSDK] - Fix build svn path=/trunk/; revision=46688 --- reactos/include/psdk/ks.h | 93 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/reactos/include/psdk/ks.h b/reactos/include/psdk/ks.h index f728bfb0f78..e66f130418a 100644 --- a/reactos/include/psdk/ks.h +++ b/reactos/include/psdk/ks.h @@ -744,6 +744,99 @@ typedef enum KSPROPERTY_STREAM_PIPE_ID } KSPROPERTY_STREAM; +#define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_ALLOCATOR,\ + (GetHandler),\ + sizeof(KSPROPERTY),\ + sizeof(HANDLE),\ + (SetHandler),\ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_QUALITY,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KSQUALITY_MANAGER),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_DEGRADATION,\ + (GetHandler),\ + sizeof(KSPROPERTY),\ + 0,\ + (SetHandler),\ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_MASTERCLOCK,\ + (GetHandler),\ + sizeof(KSPROPERTY),\ + sizeof(HANDLE),\ + (SetHandler),\ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_TIMEFORMAT,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(GUID),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_PRESENTATIONTIME,\ + (GetHandler),\ + sizeof(KSPROPERTY),\ + sizeof(KSTIME),\ + (SetHandler),\ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_PRESENTATIONEXTENT,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(LONGLONG),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_FRAMETIME,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KSFRAMETIME),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_RATECAPABILITY,\ + (Handler),\ + sizeof(KSRATE_CAPABILITY),\ + sizeof(KSRATE),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_RATE,\ + (GetHandler),\ + sizeof(KSPROPERTY),\ + sizeof(KSRATE),\ + (SetHandler),\ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_STREAM_PIPE_ID,\ + (GetHandler),\ + sizeof(KSPROPERTY),\ + sizeof(HANDLE),\ + (SetHandler),\ + NULL, 0, NULL, NULL, 0) /* =============================================================== StreamAllocator From 74e30b909320bd857dd2859121e7f252687bc09a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 2 Apr 2010 17:46:24 +0000 Subject: [PATCH 012/261] [NTOSKRNL] - Add the check for ACESSS_SYSTEM_SECURITY. - Keep the desired access rights that have not been granted yet in the variable RemainingAccess. - Handle the MAXIMUM_ALLOWED case if the DACL is empty. svn path=/trunk/; revision=46689 --- reactos/ntoskrnl/se/semgr.c | 59 ++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 5e22e67d05e..2ebd18090e8 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -390,6 +390,7 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { LUID_AND_ATTRIBUTES Privilege; ACCESS_MASK CurrentAccess, AccessMask; + ACCESS_MASK RemainingAccess; PACCESS_TOKEN Token; ULONG i; PACL Dacl; @@ -424,14 +425,43 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, RtlMapGenericMask(&PreviouslyGrantedAccess, GenericMapping); - CurrentAccess = PreviouslyGrantedAccess; - + RemainingAccess = DesiredAccess; Token = SubjectSecurityContext->ClientToken ? SubjectSecurityContext->ClientToken : SubjectSecurityContext->PrimaryToken; + /* Check for system security access */ + if (RemainingAccess & ACCESS_SYSTEM_SECURITY) + { + Privilege.Luid = SeSecurityPrivilege; + Privilege.Attributes = SE_PRIVILEGE_ENABLED; + + /* Fail if we do not the SeSecurityPrivilege */ + if (!SepPrivilegeCheck(Token, + &Privilege, + 1, + PRIVILEGE_SET_ALL_NECESSARY, + AccessMode)) + { + *AccessStatus = STATUS_PRIVILEGE_NOT_HELD; + return FALSE; + } + + /* Adjust access rights */ + RemainingAccess &= ~ACCESS_SYSTEM_SECURITY; + PreviouslyGrantedAccess |= ACCESS_SYSTEM_SECURITY; + + /* Succeed if there are no more rights to grant */ + if (RemainingAccess == 0) + { + *GrantedAccess = PreviouslyGrantedAccess; + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } + } + /* Get the DACL */ Status = RtlGetDaclSecurityDescriptor(SecurityDescriptor, &Present, @@ -474,11 +504,15 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, PRIVILEGE_SET_ALL_NECESSARY, AccessMode)) { + /* Adjust access rights */ + RemainingAccess &= ~WRITE_OWNER; + PreviouslyGrantedAccess |= WRITE_OWNER; CurrentAccess |= WRITE_OWNER; - if ((DesiredAccess & ~VALID_INHERIT_FLAGS) == - (CurrentAccess & ~VALID_INHERIT_FLAGS)) + + /* Succeed if there are no more rights to grant */ + if (RemainingAccess == 0) { - *GrantedAccess = CurrentAccess; + *GrantedAccess = PreviouslyGrantedAccess; *AccessStatus = STATUS_SUCCESS; return TRUE; } @@ -488,9 +522,18 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, /* Deny access if the DACL is empty */ if (Dacl->AceCount == 0) { - *GrantedAccess = 0; - *AccessStatus = STATUS_ACCESS_DENIED; - return FALSE; + if (RemainingAccess == MAXIMUM_ALLOWED && PreviouslyGrantedAccess != 0) + { + *GrantedAccess = PreviouslyGrantedAccess; + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } + else + { + *GrantedAccess = 0; + *AccessStatus = STATUS_ACCESS_DENIED; + return FALSE; + } } /* Fail if DACL is absent */ From 6075ae9a8f23bf75a23b9f380839fc680dd1b19e Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Fri, 2 Apr 2010 17:57:33 +0000 Subject: [PATCH 013/261] [NTOS]: Rewrite boot driver loading code (not the driver code itself) to use the boot loader's BootDriverListHead, instead of parsing InOrderListHead and cherry-picking ".sys" files. This is the last incompatibility with Windows. [NTOS]: Use group prioritiy, tag numbers, and tag priority to determine the correct loading order for boot drivers, instead of just parsing the linked list. Dependencies work now! [NTOS]: Load any DLLs that are driver-dependent with MmCallDllInitialize. Previously, these .DLLS were ignored and drivers could lose dependencies. svn path=/trunk/; revision=46690 --- reactos/ntoskrnl/include/internal/io.h | 64 +++++++ reactos/ntoskrnl/io/iomgr/driver.c | 132 ++++++++++++-- reactos/ntoskrnl/io/iomgr/iomgr.c | 3 + reactos/ntoskrnl/io/pnpmgr/pnpinit.c | 222 +++++++++++++++++++++++ reactos/ntoskrnl/io/pnpmgr/pnputil.c | 185 +++++++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 2 + 6 files changed, 595 insertions(+), 13 deletions(-) create mode 100644 reactos/ntoskrnl/io/pnpmgr/pnpinit.c create mode 100644 reactos/ntoskrnl/io/pnpmgr/pnputil.c diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 2519a8134d2..dc80ff249a5 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -395,6 +395,33 @@ typedef struct _LOAD_UNLOAD_PARAMS PDRIVER_OBJECT DriverObject; } LOAD_UNLOAD_PARAMS, *PLOAD_UNLOAD_PARAMS; +// +// Boot Driver List Entry +// +typedef struct _DRIVER_INFORMATION +{ + LIST_ENTRY Link; + PDRIVER_OBJECT DriverObject; + PBOOT_DRIVER_LIST_ENTRY DataTableEntry; + HANDLE ServiceHandle; + USHORT TagPosition; + ULONG Failed; + ULONG Processed; + NTSTATUS Status; +} DRIVER_INFORMATION, *PDRIVER_INFORMATION; + +// +// Boot Driver Node +// +typedef struct _BOOT_DRIVER_NODE +{ + BOOT_DRIVER_LIST_ENTRY ListEntry; + UNICODE_STRING Group; + UNICODE_STRING Name; + ULONG Tag; + ULONG ErrorControl; +} BOOT_DRIVER_NODE, *PBOOT_DRIVER_NODE; + // // List of Bus Type GUIDs // @@ -605,6 +632,43 @@ IopGetRegistryValue(IN HANDLE Handle, OUT PKEY_VALUE_FULL_INFORMATION *Information); +// +// PnP Routines +// +NTSTATUS +NTAPI +PiInitCacheGroupInformation( + VOID +); + +USHORT +NTAPI +PpInitGetGroupOrderIndex( + IN HANDLE ServiceHandle +); + +USHORT +NTAPI +PipGetDriverTagPriority( + IN HANDLE ServiceHandle +); + +NTSTATUS +NTAPI +PnpRegMultiSzToUnicodeStrings( + IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation, + OUT PUNICODE_STRING *UnicodeStringList, + OUT PULONG UnicodeStringCount +); + +BOOLEAN +NTAPI +PnpRegSzToString( + IN PWCHAR RegSzData, + IN ULONG RegSzLength, + OUT PUSHORT StringLength OPTIONAL +); + // // Initialization Routines // diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index ef1b78969fb..f00a87d0e09 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -34,6 +34,9 @@ POBJECT_TYPE IoDriverObjectType = NULL; extern BOOLEAN ExpInTextModeSetup; extern BOOLEAN PnpSystemInit; +USHORT IopGroupIndex; +PLIST_ENTRY IopGroupTable; + /* PRIVATE FUNCTIONS **********************************************************/ NTSTATUS NTAPI @@ -880,14 +883,17 @@ VOID FASTCALL IopInitializeBootDrivers(VOID) { - PLIST_ENTRY ListHead, NextEntry; + PLIST_ENTRY ListHead, NextEntry, NextEntry2; PLDR_DATA_TABLE_ENTRY LdrEntry; PDEVICE_NODE DeviceNode; PDRIVER_OBJECT DriverObject; LDR_DATA_TABLE_ENTRY ModuleObject; NTSTATUS Status; UNICODE_STRING DriverName; - + ULONG i, Index; + PDRIVER_INFORMATION DriverInfo, DriverInfoTag; + HANDLE KeyHandle; + PBOOT_DRIVER_LIST_ENTRY BootEntry; DPRINT("IopInitializeBootDrivers()\n"); /* Use IopRootDeviceNode for now */ @@ -931,6 +937,19 @@ IopInitializeBootDrivers(VOID) return; } + /* Get highest group order index */ + IopGroupIndex = PpInitGetGroupOrderIndex(NULL); + if (IopGroupIndex == 0xFFFF) ASSERT(FALSE); + + /* Allocate the group table */ + IopGroupTable = ExAllocatePoolWithTag(PagedPool, + IopGroupIndex * sizeof(LIST_ENTRY), + TAG_IO); + if (IopGroupTable == NULL) ASSERT(FALSE); + + /* Initialize the group table lists */ + for (i = 0; i < IopGroupIndex; i++) InitializeListHead(&IopGroupTable[i]); + /* Loop the boot modules */ ListHead = &KeLoaderBlock->LoadOrderListHead; NextEntry = ListHead->Flink; @@ -940,19 +959,83 @@ IopInitializeBootDrivers(VOID) LdrEntry = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); - - /* - * HACK: Make sure we're loading a driver - * (we should be using BootDriverListHead!) - */ - if (wcsstr(_wcsupr(LdrEntry->BaseDllName.Buffer), L".SYS")) + + /* Check if the DLL needs to be initialized */ + if (LdrEntry->Flags & LDRP_DRIVER_DEPENDENT_DLL) { - /* Make sure we didn't load this driver already */ - if (!(LdrEntry->Flags & LDRP_ENTRY_INSERTED)) + /* Call its entrypoint */ + MmCallDllInitialize(LdrEntry, NULL); + } + + /* Go to the next driver */ + NextEntry = NextEntry->Flink; + } + + /* Loop the boot drivers */ + ListHead = &KeLoaderBlock->BootDriverListHead; + NextEntry = ListHead->Flink; + while (ListHead != NextEntry) + { + /* Get the entry */ + BootEntry = CONTAINING_RECORD(NextEntry, + BOOT_DRIVER_LIST_ENTRY, + Link); + + /* Get the driver loader entry */ + LdrEntry = BootEntry->LdrEntry; + + /* Allocate our internal accounting structure */ + DriverInfo = ExAllocatePoolWithTag(PagedPool, + sizeof(DRIVER_INFORMATION), + TAG_IO); + if (DriverInfo) + { + /* Zero it and initialize it */ + RtlZeroMemory(DriverInfo, sizeof(DRIVER_INFORMATION)); + InitializeListHead(&DriverInfo->Link); + DriverInfo->DataTableEntry = BootEntry; + + /* Open the registry key */ + Status = IopOpenRegistryKeyEx(&KeyHandle, + NULL, + &BootEntry->RegistryPath, + KEY_READ); + if ((NT_SUCCESS(Status)) || /* ReactOS HACK for SETUPLDR */ + ((KeLoaderBlock->SetupLdrBlock) && (KeyHandle = (PVOID)1))) { - DPRINT("Initializing bootdriver %wZ\n", &LdrEntry->BaseDllName); - /* Initialize it */ - IopInitializeBuiltinDriver(LdrEntry); + /* Save the handle */ + DriverInfo->ServiceHandle = KeyHandle; + + /* Get the group oder index */ + Index = PpInitGetGroupOrderIndex(KeyHandle); + + /* Get the tag position */ + DriverInfo->TagPosition = PipGetDriverTagPriority(KeyHandle); + + /* Insert it into the list, at the right place */ + ASSERT(Index < IopGroupIndex); + NextEntry2 = IopGroupTable[Index].Flink; + while (NextEntry2 != &IopGroupTable[Index]) + { + /* Get the driver info */ + DriverInfoTag = CONTAINING_RECORD(NextEntry2, + DRIVER_INFORMATION, + Link); + + /* Check if we found the right tag position */ + if (DriverInfoTag->TagPosition > DriverInfo->TagPosition) + { + /* We're done */ + break; + } + + /* Next entry */ + NextEntry2 = NextEntry2->Flink; + } + + /* Insert us right before the next entry */ + NextEntry2 = NextEntry2->Blink; + InsertHeadList(NextEntry2, &DriverInfo->Link); } } @@ -960,6 +1043,29 @@ IopInitializeBootDrivers(VOID) NextEntry = NextEntry->Flink; } + /* Loop each group index */ + for (i = 0; i < IopGroupIndex; i++) + { + /* Loop each group table */ + NextEntry = IopGroupTable[i].Flink; + while (NextEntry != &IopGroupTable[i]) + { + /* Get the entry */ + DriverInfo = CONTAINING_RECORD(NextEntry, + DRIVER_INFORMATION, + Link); + + /* Get the driver loader entry */ + LdrEntry = DriverInfo->DataTableEntry->LdrEntry; + + /* Initialize it */ + IopInitializeBuiltinDriver(LdrEntry); + + /* Next entry */ + NextEntry = NextEntry->Flink; + } + } + /* In old ROS, the loader list became empty after this point. Simulate. */ InitializeListHead(&KeLoaderBlock->LoadOrderListHead); } diff --git a/reactos/ntoskrnl/io/iomgr/iomgr.c b/reactos/ntoskrnl/io/iomgr/iomgr.c index cb32297d25c..c7999660a61 100644 --- a/reactos/ntoskrnl/io/iomgr/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr/iomgr.c @@ -489,6 +489,9 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Initialize PnP manager */ PnpInit(); + + /* Setup the group cache */ + if (!NT_SUCCESS(PiInitCacheGroupInformation())) return FALSE; /* Create the group driver list */ IoCreateDriverList(); diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpinit.c b/reactos/ntoskrnl/io/pnpmgr/pnpinit.c new file mode 100644 index 00000000000..8c5607289a6 --- /dev/null +++ b/reactos/ntoskrnl/io/pnpmgr/pnpinit.c @@ -0,0 +1,222 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/io/pnpmgr/pnpinit.c + * PURPOSE: PnP Initialization Code + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +PUNICODE_STRING PiInitGroupOrderTable; +ULONG PiInitGroupOrderTableCount; + +/* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +PiInitCacheGroupInformation(VOID) +{ + HANDLE KeyHandle; + NTSTATUS Status; + PKEY_VALUE_FULL_INFORMATION KeyValueInformation; + PUNICODE_STRING GroupTable; + ULONG Count; + UNICODE_STRING GroupString = + RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet" + L"\\Control\\ServiceGroupOrder"); + + /* ReactOS HACK for SETUPLDR */ + if (KeLoaderBlock->SetupLdrBlock) + { + /* Bogus data */ + PiInitGroupOrderTableCount = 0; + PiInitGroupOrderTable = (PVOID)0xBABEB00B; + return STATUS_SUCCESS; + } + + /* Open the registry key */ + Status = IopOpenRegistryKeyEx(&KeyHandle, + NULL, + &GroupString, + KEY_READ); + if (NT_SUCCESS(Status)) + { + /* Get the list */ + Status = IopGetRegistryValue(KeyHandle, L"List", &KeyValueInformation); + ZwClose(KeyHandle); + + /* Make sure we got it */ + if (NT_SUCCESS(Status)) + { + /* Make sure it's valid */ + if ((KeyValueInformation->Type == REG_MULTI_SZ) && + (KeyValueInformation->DataLength)) + { + /* Convert it to unicode strings */ + Status = PnpRegMultiSzToUnicodeStrings(KeyValueInformation, + &GroupTable, + &Count); + + /* Cache it for later */ + PiInitGroupOrderTable = GroupTable; + PiInitGroupOrderTableCount = Count; + } + else + { + /* Fail */ + Status = STATUS_UNSUCCESSFUL; + } + + /* Free the information */ + ExFreePool(KeyValueInformation); + } + } + + /* Return status */ + return Status; +} + +USHORT +NTAPI +PpInitGetGroupOrderIndex(IN HANDLE ServiceHandle) +{ + NTSTATUS Status; + PKEY_VALUE_FULL_INFORMATION KeyValueInformation; + ULONG i; + PVOID Buffer; + UNICODE_STRING Group; + PAGED_CODE(); + + /* Make sure we have a cache */ + if (!PiInitGroupOrderTable) return -1; + + /* If we don't have a handle, the rest is easy -- return the count */ + if (!ServiceHandle) return PiInitGroupOrderTableCount + 1; + + /* Otherwise, get the group value */ + Status = IopGetRegistryValue(ServiceHandle, L"Group", &KeyValueInformation); + if (!NT_SUCCESS(Status)) return PiInitGroupOrderTableCount; + + /* Make sure we have a valid string */ + ASSERT(KeyValueInformation->Type == REG_SZ); + ASSERT(KeyValueInformation->DataLength); + + /* Convert to unicode string */ + Buffer = (PVOID)((ULONG_PTR)KeyValueInformation + KeyValueInformation->DataOffset); + PnpRegSzToString(Buffer, KeyValueInformation->DataLength, &Group.Length); + Group.MaximumLength = KeyValueInformation->DataLength; + Group.Buffer = Buffer; + + /* Loop the groups */ + for (i = 0; i < PiInitGroupOrderTableCount; i++) + { + /* Try to find a match */ + if (RtlEqualUnicodeString(&Group, &PiInitGroupOrderTable[i], TRUE)) break; + } + + /* We're done */ + ExFreePool(KeyValueInformation); + return i; +} + +USHORT +NTAPI +PipGetDriverTagPriority(IN HANDLE ServiceHandle) +{ + NTSTATUS Status; + HANDLE KeyHandle = NULL; + PKEY_VALUE_FULL_INFORMATION KeyValueInformation = NULL; + PKEY_VALUE_FULL_INFORMATION KeyValueInformationTag; + PKEY_VALUE_FULL_INFORMATION KeyValueInformationGroupOrderList; + PVOID Buffer; + UNICODE_STRING Group; + PULONG GroupOrder; + ULONG i = -1, Count, Tag = 0; + UNICODE_STRING GroupString = + RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet" + L"\\Control\\ServiceGroupOrder"); + + /* Open the key */ + Status = IopOpenRegistryKeyEx(&KeyHandle, NULL, &GroupString, KEY_READ); + if (!NT_SUCCESS(Status)) goto Quickie; + + /* Read the group */ + Status = IopGetRegistryValue(ServiceHandle, L"Group", &KeyValueInformation); + if (!NT_SUCCESS(Status)) goto Quickie; + + /* Make sure we have a group */ + if ((KeyValueInformation->Type == REG_SZ) && + (KeyValueInformation->DataLength)) + { + /* Convert to unicode string */ + Buffer = (PVOID)((ULONG_PTR)KeyValueInformation + KeyValueInformation->DataOffset); + PnpRegSzToString(Buffer, KeyValueInformation->DataLength, &Group.Length); + Group.MaximumLength = KeyValueInformation->DataLength; + Group.Buffer = Buffer; + } + + /* Now read the tag */ + Status = IopGetRegistryValue(ServiceHandle, L"Tag", &KeyValueInformationTag); + if (!NT_SUCCESS(Status)) goto Quickie; + + /* Make sure we have a tag */ + if ((KeyValueInformationTag->Type == REG_DWORD) && + (KeyValueInformationTag->DataLength)) + { + /* Read it */ + Tag = *(PULONG)((ULONG_PTR)KeyValueInformationTag + + KeyValueInformationTag->DataOffset); + } + + /* We can get rid of this now */ + ExFreePool(KeyValueInformationTag); + + /* Now let's read the group's tag order */ + Status = IopGetRegistryValue(KeyHandle, + Group.Buffer, + &KeyValueInformationGroupOrderList); + + /* We can get rid of this now */ +Quickie: + if (KeyValueInformation) ExFreePool(KeyValueInformation); + if (KeyHandle) NtClose(KeyHandle); + if (!NT_SUCCESS(Status)) return -1; + + /* We're on the success path -- validate the tag order*/ + if ((KeyValueInformationGroupOrderList->Type == REG_BINARY) && + (KeyValueInformationGroupOrderList->DataLength)) + { + /* Get the order array */ + GroupOrder = (PULONG)((ULONG_PTR)KeyValueInformationGroupOrderList + + KeyValueInformationGroupOrderList->DataOffset); + + /* Get the count */ + Count = *GroupOrder; + ASSERT(((Count + 1) * sizeof(ULONG)) <= + KeyValueInformationGroupOrderList->DataLength); + + /* Now loop each tag */ + GroupOrder++; + for (i = 1; i <= Count; i++) + { + /* If we found it, we're out */ + if (Tag == *GroupOrder) break; + + /* Try the next one */ + GroupOrder++; + } + } + + /* Last buffer to free */ + ExFreePool(KeyValueInformationGroupOrderList); + return i; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/io/pnpmgr/pnputil.c b/reactos/ntoskrnl/io/pnpmgr/pnputil.c new file mode 100644 index 00000000000..f274f3db679 --- /dev/null +++ b/reactos/ntoskrnl/io/pnpmgr/pnputil.c @@ -0,0 +1,185 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/io/pnpmgr/pnputil.c + * PURPOSE: PnP Utility Code + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +PnpFreeUnicodeStringList(IN PUNICODE_STRING UnicodeStringList, + IN ULONG StringCount) +{ + ULONG i; + + /* Go through the list */ + if (UnicodeStringList) + { + /* Go through each string */ + for (i = 0; i < StringCount; i++) + { + /* Check if it exists */ + if (UnicodeStringList[i].Buffer) + { + /* Free it */ + ExFreePool(UnicodeStringList[i].Buffer); + } + } + + /* Free the whole list */ + ExFreePool(UnicodeStringList); + } +} + +NTSTATUS +NTAPI +PnpRegMultiSzToUnicodeStrings(IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation, + OUT PUNICODE_STRING *UnicodeStringList, + OUT PULONG UnicodeStringCount) +{ + PWCHAR p, pp, ps; + ULONG i = 0, n; + ULONG Count = 0; + + /* Validate the key information */ + if (KeyValueInformation->Type != REG_MULTI_SZ) return STATUS_INVALID_PARAMETER; + + /* Set the pointers */ + p = (PWCHAR)((ULONG_PTR)KeyValueInformation + + KeyValueInformation->DataOffset); + pp = (PWCHAR)((ULONG_PTR)p + KeyValueInformation->DataLength); + + /* Loop the data */ + while (p != pp) + { + /* If we find a NULL, that means one string is done */ + if (!*p) + { + /* Add to our string count */ + Count++; + + /* Check for a double-NULL, which means we're done */ + if (((p + 1) == pp) || !(*(p + 1))) break; + } + + /* Go to the next character */ + p++; + } + + /* If we looped the whole list over, we missed increment a string, do it */ + if (p == pp) Count++; + + /* Allocate the list now that we know how big it is */ + *UnicodeStringList = ExAllocatePoolWithTag(PagedPool, + sizeof(UNICODE_STRING) * Count, + 'sUpP'); + if (!(*UnicodeStringList)) return STATUS_INSUFFICIENT_RESOURCES; + + /* Set pointers for second loop */ + ps = p = (PWCHAR)((ULONG_PTR)KeyValueInformation + + KeyValueInformation->DataOffset); + + /* Loop again, to do the copy this time */ + while (p != pp) + { + /* If we find a NULL, that means one string is done */ + if (!*p) + { + /* Check how long this string is */ + n = (ULONG_PTR)p - (ULONG_PTR)ps + sizeof(UNICODE_NULL); + + /* Allocate the buffer */ + (*UnicodeStringList)[i].Buffer = ExAllocatePoolWithTag(PagedPool, + n, + 'sUpP'); + if (!(*UnicodeStringList)[i].Buffer) + { + /* Back out of everything */ + PnpFreeUnicodeStringList(*UnicodeStringList, i); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Copy the string into the buffer */ + RtlCopyMemory((*UnicodeStringList)[i].Buffer, ps, n); + + /* Set the lengths */ + (*UnicodeStringList)[i].MaximumLength = n; + (*UnicodeStringList)[i].Length = n - sizeof(UNICODE_NULL); + + /* One more entry done */ + i++; + + /* Check for a double-NULL, which means we're done */ + if (((p + 1) == pp) || !(*(p + 1))) break; + + /* New string */ + ps = p + 1; + } + + /* New string */ + p++; + } + + /* Check if we've reached the last string */ + if (p == pp) + { + /* Calculate the string length */ + n = (ULONG_PTR)p - (ULONG_PTR)ps; + + /* Allocate the buffer for it */ + (*UnicodeStringList)[i].Buffer = ExAllocatePoolWithTag(PagedPool, + n + + sizeof(UNICODE_NULL), + 'sUpP'); + if (!(*UnicodeStringList)[i].Buffer) + { + /* Back out of everything */ + PnpFreeUnicodeStringList(*UnicodeStringList, i); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Make sure there's an actual string here */ + if (n) RtlCopyMemory((*UnicodeStringList)[i].Buffer, ps, n); + + /* Null-terminate the string ourselves */ + (*UnicodeStringList)[i].Buffer[n / sizeof(WCHAR)] = UNICODE_NULL; + + /* Set the lenghts */ + (*UnicodeStringList)[i].Length = n; + (*UnicodeStringList)[i].MaximumLength = n + sizeof(UNICODE_NULL); + } + + /* And we're done */ + *UnicodeStringCount = Count; + return STATUS_SUCCESS; +} + +BOOLEAN +NTAPI +PnpRegSzToString(IN PWCHAR RegSzData, + IN ULONG RegSzLength, + OUT PUSHORT StringLength OPTIONAL) +{ + PWCHAR p, pp; + + /* Find the end */ + pp = RegSzData + RegSzLength; + for (p = RegSzData; p < pp; p++) if (!*p) break; + + /* Return it */ + if (StringLength) *StringLength = p - RegSzData; + return TRUE; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index a605ee1b147..b6ed1824217 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -267,10 +267,12 @@ plugplay.c pnpdma.c + pnpinit.c pnpmgr.c pnpnotify.c pnpreport.c pnproot.c + pnputil.c From 066b696c33325af307700725b233ca2d2aa549fe Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Fri, 2 Apr 2010 19:52:03 +0000 Subject: [PATCH 014/261] Fix MP install. svn path=/trunk/; revision=46691 --- reactos/boot/bootdata/txtsetup.sif | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/boot/bootdata/txtsetup.sif b/reactos/boot/bootdata/txtsetup.sif index 7977e447752..870c0d26951 100644 --- a/reactos/boot/bootdata/txtsetup.sif +++ b/reactos/boot/bootdata/txtsetup.sif @@ -76,7 +76,7 @@ hal.dll=,,,,,,,,,,,,2 [Files.pci_mp] ntkrnlmp.exe=,,,,,,,,,,ntoskrnl.exe,,2 -halmp.dll=,,,,,,,,,,hal.dll,,2 +halmps.dll=,,,,,,,,,,hal.dll,,2 [Display] ; = ,,,,, From d7c28ad92a70fd8005c1188caddf8caf8ac7ff70 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 2 Apr 2010 23:52:38 +0000 Subject: [PATCH 015/261] - Simplifying MakeInfoDC. svn path=/trunk/; revision=46692 --- reactos/subsystems/win32/win32k/objects/dclife.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index e9f4cf7ecd1..c64139c9426 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -606,13 +606,14 @@ MakeInfoDC(PDC pdc, BOOL bSet) pdc->dctype = DC_TYPE_INFO; pdc->dclevel.pSurface = NULL; - if (PDEV_sizl(pdc->ppdev, &sizl)->cx == pdc->dclevel.sizl.cx && - PDEV_sizl(pdc->ppdev, &sizl)->cy == pdc->dclevel.sizl.cy) + PDEV_sizl(pdc->ppdev, &sizl); + + if ( sizl.cx == pdc->dclevel.sizl.cx && + sizl.cy == pdc->dclevel.sizl.cy ) return TRUE; - pdc->dclevel.sizl.cx = PDEV_sizl(pdc->ppdev, &sizl)->cx; + pdc->dclevel.sizl.cx = sizl.cx; pdc->dclevel.sizl.cy = sizl.cy; - IntSetDefaultRegion(pdc); } else { @@ -632,9 +633,8 @@ MakeInfoDC(PDC pdc, BOOL bSet) pdc->dclevel.sizl.cx = pSurface->SurfObj.sizlBitmap.cx; pdc->dclevel.sizl.cy = pSurface->SurfObj.sizlBitmap.cy; - IntSetDefaultRegion(pdc); } - return TRUE; + return IntSetDefaultRegion(pdc); } /* From 959116f5217fc9b510e72b99a1db7689fdbcf1a1 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sat, 3 Apr 2010 07:44:38 +0000 Subject: [PATCH 016/261] [NTOS]: Implement Configuration Manager routines for building a driver list, sorting it, detecting circular dependencies and ordering, combining groups, tags, group orders and tag orders, etc. Replaces the "drvrlist" I/O interface currently in ReactOS. [NTOS]: Use the new Cm interface in IopInitializeSystemDrivers to parse the ordered list of system drivers to load. Make it use ZwLoadDriver directly instead of having a hacked IopLoadDriver function. [NTOS]: Drivers should not show up loading n times a reboot now (some drivers seemed to do this in the past when they failed to load). [NTOS]: The system driver code could be further improved by checknig if the driver has already been loaded, or attempted and failed to load, but it is already much better now than in the past. [PERF]: Boot-time improvement since the new system driver loading code uses low-level Cm interfaces (portability side-effect: can be shared with FreeLDR) instead of the complex parse-based object-manager-based system-calls. svn path=/trunk/; revision=46693 --- reactos/ntoskrnl/config/cmboot.c | 569 ++++++++++++++++++++++- reactos/ntoskrnl/config/cmsysini.c | 167 ++++++- reactos/ntoskrnl/include/internal/cm.h | 34 ++ reactos/ntoskrnl/io/iomgr/driver.c | 35 ++ reactos/ntoskrnl/io/iomgr/drvrlist.c | 561 ---------------------- reactos/ntoskrnl/io/iomgr/iomgr.c | 6 - reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 - 7 files changed, 794 insertions(+), 579 deletions(-) delete mode 100644 reactos/ntoskrnl/io/iomgr/drvrlist.c diff --git a/reactos/ntoskrnl/config/cmboot.c b/reactos/ntoskrnl/config/cmboot.c index f1dcc347a20..50c6815866f 100644 --- a/reactos/ntoskrnl/config/cmboot.c +++ b/reactos/ntoskrnl/config/cmboot.c @@ -1,20 +1,19 @@ /* * PROJECT: ReactOS Kernel - * LICENSE: GPL - See COPYING in the top level directory + * LICENSE: BSD - See COPYING.ARM in the top level directory * FILE: ntoskrnl/config/cmboot.c * PURPOSE: Configuration Manager - Boot Initialization - * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * PROGRAMMERS: ReactOS Portable Systems Group + * Alex Ionescu (alex.ionescu@reactos.org) */ -/* INCLUDES ******************************************************************/ +/* INCLUDES *******************************************************************/ #include "ntoskrnl.h" #define NDEBUG #include "debug.h" - -/* GLOBALS *******************************************************************/ - -/* FUNCTIONS *****************************************************************/ + +/* FUNCTIONS ******************************************************************/ HCELL_INDEX NTAPI @@ -124,3 +123,559 @@ CmpFindControlSet(IN PHHIVE SystemHive, /* Return the CCS Cell */ return ControlSetCell; } + +ULONG +NTAPI +CmpFindTagIndex(IN PHHIVE Hive, + IN HCELL_INDEX TagCell, + IN HCELL_INDEX GroupOrderCell, + IN PUNICODE_STRING GroupName) +{ + PCM_KEY_VALUE TagValue, Value; + HCELL_INDEX OrderCell; + PULONG TagOrder, DriverTag; + ULONG CurrentTag, Length; + PCM_KEY_NODE Node; + BOOLEAN BufferAllocated; + ASSERT(Hive->ReleaseCellRoutine == NULL); + + /* Get the tag */ + Value = HvGetCell(Hive, TagCell); + ASSERT(Value); + DriverTag = (PULONG)CmpValueToData(Hive, Value, &Length); + ASSERT(DriverTag); + + /* Get the order array */ + Node = HvGetCell(Hive, GroupOrderCell); + ASSERT(Node); + OrderCell = CmpFindValueByName(Hive, Node, GroupName); + if (OrderCell == HCELL_NIL) return -2; + + /* And read it */ + TagValue = HvGetCell(Hive, OrderCell); + CmpGetValueData(Hive, TagValue, &Length, (PVOID*)&TagOrder, &BufferAllocated, &OrderCell); + ASSERT(TagOrder); + + /* Parse each tag */ + for (CurrentTag = 1; CurrentTag <= TagOrder[0]; CurrentTag++) + { + /* Find a match */ + if (TagOrder[CurrentTag] == *DriverTag) + { + /* Found it -- return the tag */ + if (BufferAllocated) ExFreePool(TagOrder); + return CurrentTag; + } + } + + /* No matches, so assume next to last ordering */ + if (BufferAllocated) ExFreePool(TagOrder); + return -2; +} + +BOOLEAN +NTAPI +CmpAddDriverToList(IN PHHIVE Hive, + IN HCELL_INDEX DriverCell, + IN HCELL_INDEX GroupOrderCell, + IN PUNICODE_STRING RegistryPath, + IN PLIST_ENTRY BootDriverListHead) +{ + PBOOT_DRIVER_NODE DriverNode; + PBOOT_DRIVER_LIST_ENTRY DriverEntry; + PCM_KEY_NODE Node; + ULONG NameLength, Length; + HCELL_INDEX ValueCell, TagCell; + PCM_KEY_VALUE Value; + PUNICODE_STRING FileName, RegistryString; + UNICODE_STRING UnicodeString; + PULONG ErrorControl; + PWCHAR Buffer; + ASSERT(Hive->ReleaseCellRoutine == NULL); + + /* Allocate a driver node and initialize it */ + DriverNode = CmpAllocate(sizeof(BOOT_DRIVER_NODE), FALSE, TAG_CM); + if (!DriverNode) return FALSE; + DriverEntry = &DriverNode->ListEntry; + DriverEntry->RegistryPath.Buffer = NULL; + DriverEntry->FilePath.Buffer = NULL; + + /* Get the driver cell */ + Node = HvGetCell(Hive, DriverCell); + ASSERT(Node); + + /* Get the name from the cell */ + DriverNode->Name.Length = Node->Flags & KEY_COMP_NAME ? + CmpCompressedNameSize(Node->Name, Node->NameLength) : + Node->NameLength; + DriverNode->Name.MaximumLength = DriverNode->Name.Length; + NameLength = DriverNode->Name.Length; + + /* Now allocate the buffer for it and copy the name */ + DriverNode->Name.Buffer = CmpAllocate(NameLength, FALSE, TAG_CM); + if (!DriverNode->Name.Buffer) return FALSE; + if (Node->Flags & KEY_COMP_NAME) + { + /* Compressed name */ + CmpCopyCompressedName(DriverNode->Name.Buffer, + DriverNode->Name.Length, + Node->Name, + Node->NameLength); + } + else + { + /* Normal name */ + RtlCopyMemory(DriverNode->Name.Buffer, Node->Name, Node->NameLength); + } + + /* Now find the image path */ + RtlInitUnicodeString(&UnicodeString, L"ImagePath"); + ValueCell = CmpFindValueByName(Hive, Node, &UnicodeString); + if (ValueCell == HCELL_NIL) + { + /* Couldn't find it, so assume the drivers path */ + Length = sizeof(L"System32\\Drivers\\") + NameLength + sizeof(L".sys"); + + /* Allocate the path name */ + FileName = &DriverEntry->FilePath; + FileName->Length = 0; + FileName->MaximumLength = Length; + FileName->Buffer = CmpAllocate(Length, FALSE,TAG_CM); + if (!FileName->Buffer) return FALSE; + + /* Write the path name */ + RtlAppendUnicodeToString(FileName, L"System32\\Drivers\\"); + RtlAppendUnicodeStringToString(FileName, &DriverNode->Name); + RtlAppendUnicodeToString(FileName, L".sys"); + } + else + { + /* Path name exists, so grab it */ + Value = HvGetCell(Hive, ValueCell); + ASSERT(Value); + + /* Allocate and setup the path name */ + FileName = &DriverEntry->FilePath; + Buffer = (PWCHAR)CmpValueToData(Hive, Value, &Length); + FileName->MaximumLength = FileName->Length = Length; + FileName->Buffer = CmpAllocate(Length, FALSE, TAG_CM); + + /* Transfer the data */ + if (!(FileName->Buffer) || !(Buffer)) return FALSE; + RtlCopyMemory(FileName->Buffer, Buffer, Length); + } + + /* Now build the registry path */ + RegistryString = &DriverEntry->RegistryPath; + RegistryString->Length = 0; + RegistryString->MaximumLength = RegistryPath->Length + NameLength; + RegistryString->Buffer = CmpAllocate(RegistryString->MaximumLength, FALSE, TAG_CM); + if (!RegistryString->Buffer) return FALSE; + + /* Add the driver name to it */ + RtlAppendUnicodeStringToString(RegistryString, RegistryPath); + RtlAppendUnicodeStringToString(RegistryString, &DriverNode->Name); + + /* The entry is done, add it */ + InsertHeadList(BootDriverListHead, &DriverEntry->Link); + + /* Now find error control settings */ + RtlInitUnicodeString(&UnicodeString, L"ErrorControl"); + ValueCell = CmpFindValueByName(Hive, Node, &UnicodeString); + if (ValueCell == HCELL_NIL) + { + /* Couldn't find it, so assume default */ + DriverNode->ErrorControl = NormalError; + } + else + { + /* Otherwise, read whatever the data says */ + Value = HvGetCell(Hive, ValueCell); + ASSERT(Value); + ErrorControl = (PULONG)CmpValueToData(Hive, Value, &Length); + ASSERT(ErrorControl); + DriverNode->ErrorControl = *ErrorControl; + } + + /* Next, get the group cell */ + RtlInitUnicodeString(&UnicodeString, L"group"); + ValueCell = CmpFindValueByName(Hive, Node, &UnicodeString); + if (ValueCell == HCELL_NIL) + { + /* Couldn't find, so set an empty string */ + RtlInitEmptyUnicodeString(&DriverNode->Group, NULL, 0); + } + else + { + /* Found it, read the group value */ + Value = HvGetCell(Hive, ValueCell); + ASSERT(Value); + + /* Copy it into the node */ + DriverNode->Group.Buffer = (PWCHAR)CmpValueToData(Hive, Value, &Length); + if (!DriverNode->Group.Buffer) return FALSE; + DriverNode->Group.Length = Length - sizeof(UNICODE_NULL); + DriverNode->Group.MaximumLength = DriverNode->Group.Length; + } + + /* Finally, find the tag */ + RtlInitUnicodeString(&UnicodeString, L"Tag"); + TagCell = CmpFindValueByName(Hive, Node, &UnicodeString); + if (TagCell == HCELL_NIL) + { + /* No tag, so load last */ + DriverNode->Tag = -1; + } + else + { + /* Otherwise, decode it based on tag order */ + DriverNode->Tag = CmpFindTagIndex(Hive, + TagCell, + GroupOrderCell, + &DriverNode->Group); + } + + /* All done! */ + return TRUE; +} + +BOOLEAN +NTAPI +CmpIsLoadType(IN PHHIVE Hive, + IN HCELL_INDEX Cell, + IN SERVICE_LOAD_TYPE LoadType) +{ + PCM_KEY_NODE Node; + HCELL_INDEX ValueCell; + UNICODE_STRING ValueString = RTL_CONSTANT_STRING(L"Start"); + PCM_KEY_VALUE Value; + ULONG Length; + PLONG Data; + ASSERT(Hive->ReleaseCellRoutine == NULL); + + /* Open the start cell */ + Node = HvGetCell(Hive, Cell); + ASSERT(Node); + ValueCell = CmpFindValueByName(Hive, Node, &ValueString); + if (ValueCell == HCELL_NIL) return FALSE; + + /* Read the start value */ + Value = HvGetCell(Hive, ValueCell); + ASSERT(Value); + Data = (PLONG)CmpValueToData(Hive, Value, &Length); + ASSERT(Data); + + /* Return if the type matches */ + return (*Data == LoadType); +} + +BOOLEAN +NTAPI +CmpFindDrivers(IN PHHIVE Hive, + IN HCELL_INDEX ControlSet, + IN SERVICE_LOAD_TYPE LoadType, + IN PWCHAR BootFileSystem OPTIONAL, + IN PLIST_ENTRY DriverListHead) +{ + HCELL_INDEX ServicesCell, ControlCell, GroupOrderCell, DriverCell; + UNICODE_STRING Name; + ULONG i; + WCHAR Buffer[128]; + UNICODE_STRING UnicodeString, KeyPath; + PBOOT_DRIVER_NODE FsNode; + PCM_KEY_NODE ControlNode, ServicesNode, Node; + ASSERT(Hive->ReleaseCellRoutine == NULL); + + /* Open the control set key */ + ControlNode = HvGetCell(Hive, ControlSet); + ASSERT(ControlNode); + + /* Get services cell */ + RtlInitUnicodeString(&Name, L"Services"); + ServicesCell = CmpFindSubKeyByName(Hive, ControlNode, &Name); + if (ServicesCell == HCELL_NIL) return FALSE; + + /* Open services key */ + ServicesNode = HvGetCell(Hive, ServicesCell); + ASSERT(ServicesNode); + + /* Get control cell */ + RtlInitUnicodeString(&Name, L"Control"); + ControlCell = CmpFindSubKeyByName(Hive, ControlNode, &Name); + if (ControlCell == HCELL_NIL) return FALSE; + + /* Get the group order cell and read it */ + RtlInitUnicodeString(&Name, L"GroupOrderList"); + Node = HvGetCell(Hive, ControlCell); + ASSERT(Node); + GroupOrderCell = CmpFindSubKeyByName(Hive, Node, &Name); + if (GroupOrderCell == HCELL_NIL) return FALSE; + + /* Build the root registry path */ + RtlInitEmptyUnicodeString(&KeyPath, Buffer, sizeof(Buffer)); + RtlAppendUnicodeToString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); + + /* Find the first subkey (ie: the first driver or service) */ + i = 0; + DriverCell = CmpFindSubKeyByNumber(Hive, ServicesNode, i); + while (DriverCell != HCELL_NIL) + { + /* Make sure it's a driver of this start type */ + if (CmpIsLoadType(Hive, DriverCell, LoadType)) + { + /* Add it to the list */ + CmpAddDriverToList(Hive, + DriverCell, + GroupOrderCell, + &KeyPath, + DriverListHead); + + } + + /* Try the next subkey */ + DriverCell = CmpFindSubKeyByNumber(Hive, ServicesNode, ++i); + } + + /* Check if we have a boot file system */ + if (BootFileSystem) + { + /* Find it */ + RtlInitUnicodeString(&UnicodeString, BootFileSystem); + DriverCell = CmpFindSubKeyByName(Hive, ServicesNode, &UnicodeString); + if (DriverCell != HCELL_NIL) + { + /* Always add it to the list */ + CmpAddDriverToList(Hive, + DriverCell, + GroupOrderCell, + &KeyPath, + DriverListHead); + + /* Mark it as critical so it always loads */ + FsNode = CONTAINING_RECORD(DriverListHead->Flink, + BOOT_DRIVER_NODE, + ListEntry.Link); + FsNode->ErrorControl = SERVICE_ERROR_CRITICAL; + } + } + + /* We're done! */ + return TRUE; +} + +BOOLEAN +NTAPI +CmpDoSort(IN PLIST_ENTRY DriverListHead, + IN PUNICODE_STRING OrderList) +{ + PWCHAR Current, End = NULL; + PLIST_ENTRY NextEntry; + UNICODE_STRING GroupName; + PBOOT_DRIVER_NODE CurrentNode; + + /* We're going from end to start, so get to the last group and keep going */ + Current = &OrderList->Buffer[OrderList->Length / sizeof(WCHAR)]; + while (Current > OrderList->Buffer) + { + /* Scan the current string */ + do + { + if (*Current == UNICODE_NULL) End = Current; + } while ((*(--Current - 1) != UNICODE_NULL) && (Current != OrderList->Buffer)); + + /* This is our cleaned up string for this specific group */ + ASSERT(End != NULL); + GroupName.Length = (End - Current) * sizeof(WCHAR); + GroupName.MaximumLength = GroupName.Length; + GroupName.Buffer = Current; + + /* Now loop the driver list */ + NextEntry = DriverListHead->Flink; + while (NextEntry != DriverListHead) + { + /* Get this node */ + CurrentNode = CONTAINING_RECORD(NextEntry, + BOOT_DRIVER_NODE, + ListEntry.Link); + + /* Get the next entry now since we'll do a relink */ + NextEntry = CurrentNode->ListEntry.Link.Flink; + + /* Is there a group name and does it match the current group? */ + if ((CurrentNode->Group.Buffer) && + (RtlEqualUnicodeString(&GroupName, &CurrentNode->Group, TRUE))) + { + /* Remove from this location and re-link in the new one */ + RemoveEntryList(&CurrentNode->ListEntry.Link); + InsertHeadList(DriverListHead, &CurrentNode->ListEntry.Link); + } + } + + /* Move on */ + Current--; + } + + /* All done */ + return TRUE; +} + +BOOLEAN +NTAPI +CmpSortDriverList(IN PHHIVE Hive, + IN HCELL_INDEX ControlSet, + IN PLIST_ENTRY DriverListHead) +{ + HCELL_INDEX Controls, GroupOrder, ListCell; + UNICODE_STRING Name, DependList; + PCM_KEY_VALUE ListNode; + ULONG Length; + PCM_KEY_NODE Node; + ASSERT(Hive->ReleaseCellRoutine == NULL); + + /* Open the control key */ + Node = HvGetCell(Hive, ControlSet); + ASSERT(Node); + RtlInitUnicodeString(&Name, L"Control"); + Controls = CmpFindSubKeyByName(Hive, Node, &Name); + if (Controls == HCELL_NIL) return FALSE; + + /* Open the service group order */ + Node = HvGetCell(Hive, Controls); + ASSERT(Node); + RtlInitUnicodeString(&Name, L"ServiceGroupOrder"); + GroupOrder = CmpFindSubKeyByName(Hive, Node, &Name); + if (GroupOrder == HCELL_NIL) return FALSE; + + /* Open the list key */ + Node = HvGetCell(Hive, GroupOrder); + ASSERT(Node); + RtlInitUnicodeString(&Name, L"list"); + ListCell = CmpFindValueByName(Hive, Node, &Name); + if (ListCell == HCELL_NIL) return FALSE; + + /* Now read the actual list */ + ListNode = HvGetCell(Hive, ListCell); + ASSERT(ListNode); + if (ListNode->Type != REG_MULTI_SZ) return FALSE; + + /* Copy it into a buffer */ + DependList.Buffer = (PWCHAR)CmpValueToData(Hive, ListNode, &Length); + if (!DependList.Buffer) return FALSE; + DependList.Length = DependList.MaximumLength = Length - sizeof(UNICODE_NULL); + + /* And start the recurive sort algorithm */ + return CmpDoSort(DriverListHead, &DependList); +} + +BOOLEAN +NTAPI +CmpOrderGroup(IN PBOOT_DRIVER_NODE StartNode, + IN PBOOT_DRIVER_NODE EndNode) +{ + PBOOT_DRIVER_NODE CurrentNode, PreviousNode; + PLIST_ENTRY ListEntry; + + /* Base case, nothing to do */ + if (StartNode == EndNode) return TRUE; + + /* Loop the nodes */ + CurrentNode = StartNode; + do + { + /* Save this as the previous node */ + PreviousNode = CurrentNode; + + /* And move to the next one */ + ListEntry = CurrentNode->ListEntry.Link.Flink; + CurrentNode = CONTAINING_RECORD(ListEntry, + BOOT_DRIVER_NODE, + ListEntry.Link); + + /* Check if the previous driver had a bigger tag */ + if (PreviousNode->Tag > CurrentNode->Tag) + { + /* Check if we need to update the tail */ + if (CurrentNode == EndNode) + { + /* Update the tail */ + ListEntry = CurrentNode->ListEntry.Link.Blink; + EndNode = CONTAINING_RECORD(ListEntry, + BOOT_DRIVER_NODE, + ListEntry.Link); + } + + /* Remove this driver since we need to move it */ + RemoveEntryList(&CurrentNode->ListEntry.Link); + + /* Keep looping until we find a driver with a lower tag than ours */ + while ((PreviousNode->Tag > CurrentNode->Tag) && (PreviousNode != StartNode)) + { + /* We'll be re-inserted at this spot */ + ListEntry = PreviousNode->ListEntry.Link.Blink; + PreviousNode = CONTAINING_RECORD(ListEntry, + BOOT_DRIVER_NODE, + ListEntry.Link); + } + + /* Do the insert in the new location */ + InsertTailList(&PreviousNode->ListEntry.Link, &CurrentNode->ListEntry.Link); + + /* Update the head, if needed */ + if (PreviousNode == StartNode) StartNode = CurrentNode; + } + } while (CurrentNode != EndNode); + + /* All done */ + return TRUE; +} + +BOOLEAN +NTAPI +CmpResolveDriverDependencies(IN PLIST_ENTRY DriverListHead) +{ + PLIST_ENTRY NextEntry; + PBOOT_DRIVER_NODE StartNode, EndNode, CurrentNode; + + /* Loop the list */ + NextEntry = DriverListHead->Flink; + while (NextEntry != DriverListHead) + { + /* Find the first entry */ + StartNode = CONTAINING_RECORD(NextEntry, + BOOT_DRIVER_NODE, + ListEntry.Link); + do + { + /* Find the last entry */ + EndNode = CONTAINING_RECORD(NextEntry, + BOOT_DRIVER_NODE, + ListEntry.Link); + + /* Get the next entry */ + NextEntry = NextEntry->Flink; + CurrentNode = CONTAINING_RECORD(NextEntry, + BOOT_DRIVER_NODE, + ListEntry.Link); + + /* If the next entry is back to the top, break out */ + if (NextEntry == DriverListHead) break; + + /* Otherwise, check if this entry is equal */ + if (!RtlEqualUnicodeString(&StartNode->Group, + &CurrentNode->Group, + TRUE)) + { + /* It is, so we've detected a cycle, break out */ + break; + } + } while (NextEntry != DriverListHead); + + /* Now we have the correct start and end pointers, so do the sort */ + CmpOrderGroup(StartNode, EndNode); + } + + /* We're done */ + return TRUE; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/config/cmsysini.c b/reactos/ntoskrnl/config/cmsysini.c index 0326e88e619..3587efe7326 100644 --- a/reactos/ntoskrnl/config/cmsysini.c +++ b/reactos/ntoskrnl/config/cmsysini.c @@ -1,12 +1,13 @@ /* * PROJECT: ReactOS Kernel - * LICENSE: GPL - See COPYING in the top level directory + * LICENSE: BSD - See COPYING.ARM in the top level directory * FILE: ntoskrnl/config/cmsysini.c * PURPOSE: Configuration Manager - System Initialization Code - * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * PROGRAMMERS: ReactOS Portable Systems Group + * Alex Ionescu (alex.ionescu@reactos.org) */ -/* INCLUDES ******************************************************************/ +/* INCLUDES *******************************************************************/ #include "ntoskrnl.h" #define NDEBUG @@ -33,7 +34,7 @@ ULONG CmpTraceLevel = 0; extern LONG CmpFlushStarveWriters; extern BOOLEAN CmFirstTime; -/* FUNCTIONS *****************************************************************/ +/* FUNCTIONS ******************************************************************/ VOID NTAPI @@ -1574,6 +1575,162 @@ CmInitSystem1(VOID) return TRUE; } +VOID +NTAPI +CmpFreeDriverList(IN PHHIVE Hive, + IN PLIST_ENTRY DriverList) +{ + PLIST_ENTRY NextEntry, OldEntry; + PBOOT_DRIVER_NODE DriverNode; + PAGED_CODE(); + + /* Parse the current list */ + NextEntry = DriverList->Flink; + while (NextEntry != DriverList) + { + /* Get the driver node */ + DriverNode = CONTAINING_RECORD(NextEntry, BOOT_DRIVER_NODE, ListEntry.Link); + + /* Get the next entry now, since we're going to free it later */ + OldEntry = NextEntry; + NextEntry = NextEntry->Flink; + + /* Was there a name? */ + if (DriverNode->Name.Buffer) + { + /* Free it */ + CmpFree(DriverNode->Name.Buffer, DriverNode->Name.Length); + } + + /* Was there a registry path? */ + if (DriverNode->ListEntry.RegistryPath.Buffer) + { + /* Free it */ + CmpFree(DriverNode->ListEntry.RegistryPath.Buffer, + DriverNode->ListEntry.RegistryPath.MaximumLength); + } + + /* Was there a file path? */ + if (DriverNode->ListEntry.FilePath.Buffer) + { + /* Free it */ + CmpFree(DriverNode->ListEntry.FilePath.Buffer, + DriverNode->ListEntry.FilePath.MaximumLength); + } + + /* Now free the node, and move on */ + CmpFree(OldEntry, sizeof(BOOT_DRIVER_NODE)); + } +} + +PUNICODE_STRING* +NTAPI +CmGetSystemDriverList(VOID) +{ + LIST_ENTRY DriverList; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + PCM_KEY_BODY KeyBody; + PHHIVE Hive; + HCELL_INDEX RootCell, ControlCell; + HANDLE KeyHandle; + UNICODE_STRING KeyName; + PLIST_ENTRY NextEntry; + ULONG i; + PUNICODE_STRING* ServicePath = NULL; + BOOLEAN Success, AutoSelect; + PBOOT_DRIVER_LIST_ENTRY DriverEntry; + PAGED_CODE(); + + /* Initialize the driver list */ + InitializeListHead(&DriverList); + + /* Open the system hive key */ + RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\System"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) return NULL; + + /* Reference the key object to get the root hive/cell to access directly */ + Status = ObReferenceObjectByHandle(KeyHandle, + KEY_QUERY_VALUE, + CmpKeyObjectType, + KernelMode, + (PVOID*)&KeyBody, + NULL); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + NtClose(KeyHandle); + return NULL; + } + + /* Do all this under the registry lock */ + CmpLockRegistryExclusive(); + + /* Get the hive and key cell */ + Hive = KeyBody->KeyControlBlock->KeyHive; + RootCell = KeyBody->KeyControlBlock->KeyCell; + + /* Open the current control set key */ + RtlInitUnicodeString(&KeyName, L"Current"); + ControlCell = CmpFindControlSet(Hive, RootCell, &KeyName, &AutoSelect); + if (ControlCell == HCELL_NIL) goto EndPath; + + /* Find all system drivers */ + Success = CmpFindDrivers(Hive, ControlCell, SystemLoad, NULL, &DriverList); + if (!Success) goto EndPath; + + /* Sort by group/tag */ + if (!CmpSortDriverList(Hive, ControlCell, &DriverList)) goto EndPath; + + /* Remove circular dependencies (cycles) and sort */ + if (!CmpResolveDriverDependencies(&DriverList)) goto EndPath; + + /* Loop the list to count drivers */ + for (i = 0, NextEntry = DriverList.Flink; + NextEntry != &DriverList; + i++, NextEntry = NextEntry->Flink); + + /* Allocate the array */ + ServicePath = ExAllocatePool(NonPagedPool, (i + 1) * sizeof(PUNICODE_STRING)); + if (!ServicePath) KeBugCheckEx(CONFIG_INITIALIZATION_FAILED, 2, 1, 0, 0); + + /* Loop the driver list */ + for (i = 0, NextEntry = DriverList.Flink; + NextEntry != &DriverList; + i++, NextEntry = NextEntry->Flink) + { + /* Get the entry */ + DriverEntry = CONTAINING_RECORD(NextEntry, BOOT_DRIVER_LIST_ENTRY, Link); + + /* Allocate the path for the caller and duplicate the registry path */ + ServicePath[i] = ExAllocatePool(NonPagedPool, sizeof(UNICODE_STRING)); + RtlDuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE, + &DriverEntry->RegistryPath, + ServicePath[i]); + } + + /* Terminate the list */ + ServicePath[i] = NULL; + +EndPath: + /* Free the driver list if we had one */ + if (!IsListEmpty(&DriverList)) CmpFreeDriverList(Hive, &DriverList); + + /* Unlock the registry */ + CmpUnlockRegistry(); + + /* Close the key handle and dereference the object, then return the path */ + ObDereferenceObject(KeyBody); + NtClose(KeyHandle); + return ServicePath; +} + VOID NTAPI CmpLockRegistryExclusive(VOID) @@ -1771,3 +1928,5 @@ CmShutdownSystem(VOID) if (!CmFirstTime) CmpShutdownWorkers(); CmpDoFlushAll(TRUE); } + +/* EOF */ diff --git a/reactos/ntoskrnl/include/internal/cm.h b/reactos/ntoskrnl/include/internal/cm.h index 4880dc08026..62f4010f20b 100644 --- a/reactos/ntoskrnl/include/internal/cm.h +++ b/reactos/ntoskrnl/include/internal/cm.h @@ -1522,6 +1522,40 @@ CmSetLazyFlushState( IN BOOLEAN Enable ); +// +// Driver List Routines +// +PUNICODE_STRING* +NTAPI +CmGetSystemDriverList( + VOID +); + +BOOLEAN +NTAPI +CmpFindDrivers( + IN PHHIVE Hive, + IN HCELL_INDEX ControlSet, + IN SERVICE_LOAD_TYPE LoadType, + IN PWSTR BootFileSystem OPTIONAL, + IN PLIST_ENTRY DriverListHead +); + + +BOOLEAN +NTAPI +CmpSortDriverList( + IN PHHIVE Hive, + IN HCELL_INDEX ControlSet, + IN PLIST_ENTRY DriverListHead +); + +BOOLEAN +NTAPI +CmpResolveDriverDependencies( + IN PLIST_ENTRY DriverListHead +); + // // Global variables accessible from all of Cm // diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index f00a87d0e09..18202bfd5e4 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -200,6 +200,7 @@ IopDisplayLoadingMessage(PUNICODE_STRING ServiceName) UNICODE_STRING DotSys = RTL_CONSTANT_STRING(L".SYS"); if (ExpInTextModeSetup) return; + if (!KeLoaderBlock) return; RtlUpcaseUnicodeString(ServiceName, ServiceName, FALSE); snprintf(TextBuffer, sizeof(TextBuffer), "%s%sSystem32\\Drivers\\%wZ%s\n", @@ -1070,6 +1071,38 @@ IopInitializeBootDrivers(VOID) InitializeListHead(&KeLoaderBlock->LoadOrderListHead); } +VOID +FASTCALL +IopInitializeSystemDrivers(VOID) +{ + PUNICODE_STRING *DriverList, *SavedList; + + /* No system drivers on the boot cd */ + if (KeLoaderBlock->SetupLdrBlock) return; + + /* Get the driver list */ + SavedList = DriverList = CmGetSystemDriverList(); + ASSERT(DriverList); + + /* Loop it */ + while (*DriverList) + { + /* Load the driver */ + ZwLoadDriver(*DriverList); + + /* Free the entry */ + RtlFreeUnicodeString(*DriverList); + ExFreePool(*DriverList); + + /* Next entry */ + InbvIndicateProgress(); + DriverList++; + } + + /* Free the list */ + ExFreePool(SavedList); +} + /* * IopUnloadDriver * @@ -1791,6 +1824,8 @@ IopLoadUnloadDriver(PLOAD_UNLOAD_PARAMS LoadParams) cur--; } + IopDisplayLoadingMessage(&ServiceName); + /* * Get service type. */ diff --git a/reactos/ntoskrnl/io/iomgr/drvrlist.c b/reactos/ntoskrnl/io/iomgr/drvrlist.c deleted file mode 100644 index e15aab2a2cd..00000000000 --- a/reactos/ntoskrnl/io/iomgr/drvrlist.c +++ /dev/null @@ -1,561 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: GPL - See COPYING in the top level directory - * FILE: ntoskrnl/io/iomgr/drvrlist.c - * PURPOSE: Driver List support for Grouping, Tagging, Sorting, etc. - * PROGRAMMERS: - */ - -/* INCLUDES *******************************************************************/ - -#include -#define NDEBUG -#include - -typedef struct _SERVICE_GROUP -{ - LIST_ENTRY GroupListEntry; - UNICODE_STRING GroupName; - BOOLEAN ServicesRunning; - ULONG TagCount; - PULONG TagArray; -} SERVICE_GROUP, *PSERVICE_GROUP; - -typedef struct _SERVICE -{ - LIST_ENTRY ServiceListEntry; - UNICODE_STRING ServiceName; - UNICODE_STRING RegistryPath; - UNICODE_STRING ServiceGroup; - UNICODE_STRING ImagePath; - - ULONG Start; - ULONG Type; - ULONG ErrorControl; - ULONG Tag; - -/* BOOLEAN ServiceRunning;*/ // needed ?? -} SERVICE, *PSERVICE; - -#define TAG_RTLREGISTRY 'vrqR' - -/* GLOBALS ********************************************************************/ - -LIST_ENTRY GroupListHead = {NULL, NULL}; -LIST_ENTRY ServiceListHead = {NULL, NULL}; -extern BOOLEAN NoGuiBoot; - -VOID -FASTCALL -INIT_FUNCTION -IopDisplayLoadingMessage(PUNICODE_STRING ServiceName); - -/* PRIVATE FUNCTIONS **********************************************************/ - -static NTSTATUS NTAPI -IopGetGroupOrderList(PWSTR ValueName, - ULONG ValueType, - PVOID ValueData, - ULONG ValueLength, - PVOID Context, - PVOID EntryContext) -{ - PSERVICE_GROUP Group; - - DPRINT("IopGetGroupOrderList(%S, %x, 0x%p, %x, 0x%p, 0x%p)\n", - ValueName, ValueType, ValueData, ValueLength, Context, EntryContext); - - if (ValueType == REG_BINARY && - ValueData != NULL && - ValueLength >= sizeof(ULONG) && - ValueLength >= (*(PULONG)ValueData + 1) * sizeof(ULONG)) - { - Group = (PSERVICE_GROUP)Context; - Group->TagCount = ((PULONG)ValueData)[0]; - if (Group->TagCount > 0) - { - if (ValueLength >= (Group->TagCount + 1) * sizeof(ULONG)) - { - Group->TagArray = ExAllocatePool(NonPagedPool, Group->TagCount * sizeof(ULONG)); - if (Group->TagArray == NULL) - { - Group->TagCount = 0; - return STATUS_INSUFFICIENT_RESOURCES; - } - memcpy(Group->TagArray, (PULONG)ValueData + 1, Group->TagCount * sizeof(ULONG)); - } - else - { - Group->TagCount = 0; - return STATUS_UNSUCCESSFUL; - } - } - } - return STATUS_SUCCESS; -} - -static NTSTATUS NTAPI -IopCreateGroupListEntry(PWSTR ValueName, - ULONG ValueType, - PVOID ValueData, - ULONG ValueLength, - PVOID Context, - PVOID EntryContext) -{ - PSERVICE_GROUP Group; - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - NTSTATUS Status; - - - if (ValueType == REG_SZ) - { - DPRINT("GroupName: '%S'\n", (PWCHAR)ValueData); - - Group = ExAllocatePool(NonPagedPool, - sizeof(SERVICE_GROUP)); - if (Group == NULL) - { - return(STATUS_INSUFFICIENT_RESOURCES); - } - - RtlZeroMemory(Group, sizeof(SERVICE_GROUP)); - - if (!RtlCreateUnicodeString(&Group->GroupName, (PWSTR)ValueData)) - { - ExFreePool(Group); - return(STATUS_INSUFFICIENT_RESOURCES); - } - - RtlZeroMemory(&QueryTable, sizeof(QueryTable)); - QueryTable[0].Name = (PWSTR)ValueData; - QueryTable[0].QueryRoutine = IopGetGroupOrderList; - - Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, - L"GroupOrderList", - QueryTable, - (PVOID)Group, - NULL); - DPRINT("%x %d %S\n", Status, Group->TagCount, (PWSTR)ValueData); - - InsertTailList(&GroupListHead, - &Group->GroupListEntry); - } - - return(STATUS_SUCCESS); -} - - -static NTSTATUS NTAPI -IopCreateServiceListEntry(PUNICODE_STRING ServiceName) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[7]; - PSERVICE Service; - NTSTATUS Status; - ULONG DefaultTag = MAXULONG; - - DPRINT("ServiceName: '%wZ'\n", ServiceName); - - /* Allocate service entry */ - Service = (PSERVICE)ExAllocatePool(NonPagedPool, sizeof(SERVICE)); - if (Service == NULL) - { - DPRINT1("ExAllocatePool() failed\n"); - return(STATUS_INSUFFICIENT_RESOURCES); - } - RtlZeroMemory(Service, sizeof(SERVICE)); - - /* Get service data */ - RtlZeroMemory(&QueryTable, - sizeof(QueryTable)); - - QueryTable[0].Name = L"Start"; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[0].EntryContext = &Service->Start; - - QueryTable[1].Name = L"Type"; - QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[1].EntryContext = &Service->Type; - - QueryTable[2].Name = L"ErrorControl"; - QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[2].EntryContext = &Service->ErrorControl; - - QueryTable[3].Name = L"Group"; - QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[3].EntryContext = &Service->ServiceGroup; - - QueryTable[4].Name = L"ImagePath"; - QueryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[4].EntryContext = &Service->ImagePath; - - QueryTable[5].Name = L"Tag"; - QueryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[5].EntryContext = &Service->Tag; - QueryTable[5].DefaultData = &DefaultTag; - QueryTable[5].DefaultType = REG_DWORD; - QueryTable[5].DefaultLength = sizeof(DefaultTag); - - Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, - ServiceName->Buffer, - QueryTable, - NULL, - NULL); - if (!NT_SUCCESS(Status) || Service->Start > 1) - { - /* - * If something goes wrong during RtlQueryRegistryValues - * it'll just drop everything on the floor and return, - * so you have to check if the buffers were filled. - * Luckily we zerofilled the Service. - */ - if (Service->ServiceGroup.Buffer) - { - ExFreePoolWithTag(Service->ServiceGroup.Buffer, TAG_RTLREGISTRY); - } - if (Service->ImagePath.Buffer) - { - ExFreePoolWithTag(Service->ImagePath.Buffer, TAG_RTLREGISTRY); - } - ExFreePool(Service); - return(Status); - } - - /* Copy service name */ - Service->ServiceName.Length = ServiceName->Length; - Service->ServiceName.MaximumLength = ServiceName->Length + sizeof(WCHAR); - Service->ServiceName.Buffer = ExAllocatePool(NonPagedPool, - Service->ServiceName.MaximumLength); - RtlCopyMemory(Service->ServiceName.Buffer, - ServiceName->Buffer, - ServiceName->Length); - Service->ServiceName.Buffer[ServiceName->Length / sizeof(WCHAR)] = 0; - - /* Build registry path */ - Service->RegistryPath.MaximumLength = MAX_PATH * sizeof(WCHAR); - Service->RegistryPath.Buffer = ExAllocatePool(NonPagedPool, - MAX_PATH * sizeof(WCHAR)); - wcscpy(Service->RegistryPath.Buffer, - L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); - wcscat(Service->RegistryPath.Buffer, - Service->ServiceName.Buffer); - Service->RegistryPath.Length = wcslen(Service->RegistryPath.Buffer) * sizeof(WCHAR); - - DPRINT("ServiceName: '%wZ'\n", &Service->ServiceName); - DPRINT("RegistryPath: '%wZ'\n", &Service->RegistryPath); - DPRINT("ServiceGroup: '%wZ'\n", &Service->ServiceGroup); - DPRINT("ImagePath: '%wZ'\n", &Service->ImagePath); - DPRINT("Start %lx Type %lx Tag %lx ErrorControl %lx\n", - Service->Start, Service->Type, Service->Tag, Service->ErrorControl); - - /* Append service entry */ - InsertTailList(&ServiceListHead, - &Service->ServiceListEntry); - - return(STATUS_SUCCESS); -} - - -NTSTATUS INIT_FUNCTION -IoCreateDriverList(VOID) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - PKEY_BASIC_INFORMATION KeyInfo = NULL; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING ServicesKeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services"); - UNICODE_STRING SubKeyName; - HANDLE KeyHandle; - NTSTATUS Status; - ULONG Index; - - ULONG KeyInfoLength = 0; - ULONG ReturnedLength; - - DPRINT("IoCreateDriverList() called\n"); - - /* Initialize basic variables */ - InitializeListHead(&GroupListHead); - InitializeListHead(&ServiceListHead); - - /* Build group order list */ - RtlZeroMemory(&QueryTable, - sizeof(QueryTable)); - - QueryTable[0].Name = L"List"; - QueryTable[0].QueryRoutine = IopCreateGroupListEntry; - - Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, - L"ServiceGroupOrder", - QueryTable, - NULL, - NULL); - if (!NT_SUCCESS(Status)) - return(Status); - - /* Enumerate services and create the service list */ - InitializeObjectAttributes(&ObjectAttributes, - &ServicesKeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - Status = ZwOpenKey(&KeyHandle, - KEY_ENUMERATE_SUB_KEYS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - KeyInfoLength = sizeof(KEY_BASIC_INFORMATION) + MAX_PATH * sizeof(WCHAR); - KeyInfo = ExAllocatePool(NonPagedPool, KeyInfoLength); - if (KeyInfo == NULL) - { - ZwClose(KeyHandle); - return(STATUS_INSUFFICIENT_RESOURCES); - } - - Index = 0; - while (TRUE) - { - Status = ZwEnumerateKey(KeyHandle, - Index, - KeyBasicInformation, - KeyInfo, - KeyInfoLength, - &ReturnedLength); - if (NT_SUCCESS(Status)) - { - if (KeyInfo->NameLength < MAX_PATH * sizeof(WCHAR)) - { - - SubKeyName.Length = (USHORT)KeyInfo->NameLength; - SubKeyName.MaximumLength = (USHORT)KeyInfo->NameLength + sizeof(WCHAR); - SubKeyName.Buffer = KeyInfo->Name; - SubKeyName.Buffer[SubKeyName.Length / sizeof(WCHAR)] = 0; - - DPRINT("KeyName: '%wZ'\n", &SubKeyName); - IopCreateServiceListEntry(&SubKeyName); - } - } - - if (!NT_SUCCESS(Status)) - break; - - Index++; - } - - ExFreePool(KeyInfo); - ZwClose(KeyHandle); - - DPRINT("IoCreateDriverList() done\n"); - - return(STATUS_SUCCESS); -} - -NTSTATUS INIT_FUNCTION -IoDestroyDriverList(VOID) -{ - PSERVICE_GROUP CurrentGroup; - PSERVICE CurrentService; - PLIST_ENTRY NextEntry, TempEntry; - - DPRINT("IoDestroyDriverList() called\n"); - - /* Destroy the Group List */ - for (NextEntry = GroupListHead.Flink, TempEntry = NextEntry->Flink; - NextEntry != &GroupListHead; - NextEntry = TempEntry, TempEntry = NextEntry->Flink) - { - /* Get the entry */ - CurrentGroup = CONTAINING_RECORD(NextEntry, - SERVICE_GROUP, - GroupListEntry); - - /* Remove it from the list */ - RemoveEntryList(&CurrentGroup->GroupListEntry); - - /* Free buffers */ - ExFreePool(CurrentGroup->GroupName.Buffer); - if (CurrentGroup->TagArray) - ExFreePool(CurrentGroup->TagArray); - ExFreePool(CurrentGroup); - } - - /* Destroy the Service List */ - for (NextEntry = ServiceListHead.Flink, TempEntry = NextEntry->Flink; - NextEntry != &ServiceListHead; - NextEntry = TempEntry, TempEntry = NextEntry->Flink) - { - /* Get the entry */ - CurrentService = CONTAINING_RECORD(NextEntry, - SERVICE, - ServiceListEntry); - - /* Remove it from the list */ - RemoveEntryList(&CurrentService->ServiceListEntry); - - /* Free buffers */ - ExFreePool(CurrentService->ServiceName.Buffer); - ExFreePool(CurrentService->RegistryPath.Buffer); - if (CurrentService->ServiceGroup.Buffer) - ExFreePool(CurrentService->ServiceGroup.Buffer); - if (CurrentService->ImagePath.Buffer) - ExFreePool(CurrentService->ImagePath.Buffer); - ExFreePool(CurrentService); - } - - DPRINT("IoDestroyDriverList() done\n"); - - /* Return success */ - return STATUS_SUCCESS; -} - -static INIT_FUNCTION NTSTATUS -IopLoadDriver(PSERVICE Service) -{ - NTSTATUS Status = STATUS_UNSUCCESSFUL; - PUNICODE_STRING ImagePath = &Service->ImagePath; - PWCHAR ImageName; - UNICODE_STRING ImageNameU; - - ImageName = wcsrchr(ImagePath->Buffer, L'\\'); - if (!ImageName) - ImageName = ImagePath->Buffer; - else - ImageName++; - - RtlInitUnicodeString(&ImageNameU, ImageName); - - IopDisplayLoadingMessage(&ImageNameU); - - Status = ZwLoadDriver(&Service->RegistryPath); - IopBootLog(&Service->ImagePath, NT_SUCCESS(Status) ? TRUE : FALSE); - if (!NT_SUCCESS(Status)) - { - DPRINT("IopLoadDriver() failed (Status %lx)\n", Status); -#if 0 - if (Service->ErrorControl == 1) - { - /* Log error */ - } - else if (Service->ErrorControl == 2) - { - if (IsLastKnownGood == FALSE) - { - /* Boot last known good configuration */ - } - } - else if (Service->ErrorControl == 3) - { - if (IsLastKnownGood == FALSE) - { - /* Boot last known good configuration */ - } - else - { - /* BSOD! */ - } - } -#endif - } - return Status; -} - -/* - * IopInitializeSystemDrivers - * - * Load drivers marked as system start. - * - * Parameters - * None - * - * Return Value - * None - */ -VOID -FASTCALL -IopInitializeSystemDrivers(VOID) -{ - PSERVICE_GROUP CurrentGroup; - PSERVICE CurrentService; - NTSTATUS Status; - ULONG i; - PLIST_ENTRY NextGroupEntry, NextServiceEntry; - - DPRINT("IopInitializeSystemDrivers()\n"); - - /* Start looping */ - for (NextGroupEntry = GroupListHead.Flink; - NextGroupEntry != &GroupListHead; - NextGroupEntry = NextGroupEntry->Flink) - { - /* Get the entry */ - CurrentGroup = CONTAINING_RECORD(NextGroupEntry, - SERVICE_GROUP, - GroupListEntry); - - DPRINT("Group: %wZ\n", &CurrentGroup->GroupName); - - /* Load all drivers with a valid tag */ - for (i = 0; i < CurrentGroup->TagCount; i++) - { - /* Start looping */ - for (NextServiceEntry = ServiceListHead.Flink; - NextServiceEntry != &ServiceListHead; - NextServiceEntry = NextServiceEntry->Flink) - { - /* Get the entry */ - CurrentService = CONTAINING_RECORD(NextServiceEntry, - SERVICE, - ServiceListEntry); - - if ((!RtlCompareUnicodeString(&CurrentGroup->GroupName, - &CurrentService->ServiceGroup, - TRUE)) && - (CurrentService->Start == SERVICE_SYSTEM_START) && - (CurrentService->Tag == CurrentGroup->TagArray[i])) - - { - DPRINT(" Path: %wZ\n", &CurrentService->RegistryPath); - Status = IopLoadDriver(CurrentService); - InbvIndicateProgress(); - } - } - } - - /* Load all drivers without a tag or with an invalid tag */ - for (NextServiceEntry = ServiceListHead.Flink; - NextServiceEntry != &ServiceListHead; - NextServiceEntry = NextServiceEntry->Flink) - { - /* Get the entry */ - CurrentService = CONTAINING_RECORD(NextServiceEntry, - SERVICE, - ServiceListEntry); - - if ((!RtlCompareUnicodeString(&CurrentGroup->GroupName, - &CurrentService->ServiceGroup, - TRUE)) && - (CurrentService->Start == SERVICE_SYSTEM_START)) - { - for (i = 0; i < CurrentGroup->TagCount; i++) - { - if (CurrentGroup->TagArray[i] == CurrentService->Tag) - { - break; - } - } - - if (i >= CurrentGroup->TagCount) - { - DPRINT(" Path: %wZ\n", &CurrentService->RegistryPath); - Status = IopLoadDriver(CurrentService); - InbvIndicateProgress(); - } - - } - } - } - - DPRINT("IopInitializeSystemDrivers() done\n"); -} diff --git a/reactos/ntoskrnl/io/iomgr/iomgr.c b/reactos/ntoskrnl/io/iomgr/iomgr.c index c7999660a61..e52f2fe54ab 100644 --- a/reactos/ntoskrnl/io/iomgr/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr/iomgr.c @@ -493,9 +493,6 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Setup the group cache */ if (!NT_SUCCESS(PiInitCacheGroupInformation())) return FALSE; - /* Create the group driver list */ - IoCreateDriverList(); - /* Load boot start drivers */ IopInitializeBootDrivers(); @@ -533,9 +530,6 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) IopInitializeSystemDrivers(); PnpSystemInit = TRUE; - /* Destroy the group driver list */ - IoDestroyDriverList(); - /* Reinitialize drivers that requested it */ IopReinitializeDrivers(); diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index b6ed1824217..a349f887312 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -244,7 +244,6 @@ device.c deviface.c driver.c - drvrlist.c error.c file.c iocomp.c From d384dbd46a969a288dede53e61cc85ac3ab730fd Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 3 Apr 2010 10:52:17 +0000 Subject: [PATCH 017/261] [NTOSKRNL] - Implement the calculation of access rights for the MAXIMUM_ALLOWED case. svn path=/trunk/; revision=46695 --- reactos/ntoskrnl/se/semgr.c | 78 ++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 2ebd18090e8..104c5de6ffd 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -391,6 +391,9 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, LUID_AND_ATTRIBUTES Privilege; ACCESS_MASK CurrentAccess, AccessMask; ACCESS_MASK RemainingAccess; + ACCESS_MASK TempAccess; + ACCESS_MASK TempGrantedAccess = 0; + ACCESS_MASK TempDeniedAccess = 0; PACCESS_TOKEN Token; ULONG i; PACL Dacl; @@ -544,6 +547,69 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return FALSE; } + /* Determine the MAXIMUM_ALLOWED access rights */ + if (DesiredAccess & MAXIMUM_ALLOWED) + { + CurrentAce = (PACE)(Dacl + 1); + for (i = 0; i < Dacl->AceCount; i++) + { + Sid = (PSID)(CurrentAce + 1); + if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) + { + if (SepSidInToken(Token, Sid)) + { + /* Map access rights from the ACE */ + TempAccess = CurrentAce->AccessMask; + RtlMapGenericMask(&TempAccess, GenericMapping); + + /* Deny access rights that have not been granted yet */ + TempDeniedAccess |= (TempAccess & ~TempGrantedAccess); + } + } + else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) + { + if (SepSidInToken(Token, Sid)) + { + /* Map access rights from the ACE */ + TempAccess = CurrentAce->AccessMask; + RtlMapGenericMask(&TempAccess, GenericMapping); + + /* Grant access rights that have not been denied yet */ + TempGrantedAccess |= (TempAccess & ~TempDeniedAccess); + } + } + else + { + DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); + } + + /* Get to the next ACE */ + CurrentAce = (PACE)((ULONG_PTR)CurrentAce + CurrentAce->Header.AceSize); + } + + /* Fail if some rights have not been granted */ + RemainingAccess &= ~(MAXIMUM_ALLOWED | TempGrantedAccess); + if (RemainingAccess != 0) + { + *GrantedAccess = 0; + *AccessStatus = STATUS_ACCESS_DENIED; + return FALSE; + } + + /* Set granted access right and access status */ + *GrantedAccess = TempGrantedAccess | PreviouslyGrantedAccess; + if (*GrantedAccess != 0) + { + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } + else + { + *AccessStatus = STATUS_ACCESS_DENIED; + return FALSE; + } + } + /* RULE 4: Grant rights according to the DACL */ CurrentAce = (PACE)(Dacl + 1); for (i = 0; i < Dacl->AceCount; i++) @@ -570,7 +636,7 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, } else { - DPRINT1("Unknown Ace type 0x%lx\n", CurrentAce->Header.AceType); + DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); } CurrentAce = (PACE)((ULONG_PTR)CurrentAce + CurrentAce->Header.AceSize); } @@ -580,14 +646,8 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, *GrantedAccess = CurrentAccess & DesiredAccess; - if (DesiredAccess & MAXIMUM_ALLOWED) - { - *GrantedAccess = CurrentAccess; - *AccessStatus = STATUS_SUCCESS; - return TRUE; - } - else if ((*GrantedAccess & ~VALID_INHERIT_FLAGS) == - (DesiredAccess & ~VALID_INHERIT_FLAGS)) + if ((*GrantedAccess & ~VALID_INHERIT_FLAGS) == + (DesiredAccess & ~VALID_INHERIT_FLAGS)) { *AccessStatus = STATUS_SUCCESS; return TRUE; From e9a0761db974d52575cfc305889dfef9edebe6a7 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 3 Apr 2010 17:23:27 +0000 Subject: [PATCH 018/261] [taskmgr] Hide CPU graph options on single CPU systems See issue #2144 for more details. svn path=/trunk/; revision=46699 --- reactos/base/applications/taskmgr/taskmgr.c | 32 ++++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/reactos/base/applications/taskmgr/taskmgr.c b/reactos/base/applications/taskmgr/taskmgr.c index 3f8bcbd9a4a..c409f808b1f 100644 --- a/reactos/base/applications/taskmgr/taskmgr.c +++ b/reactos/base/applications/taskmgr/taskmgr.c @@ -869,6 +869,7 @@ void TaskManager_OnTabWndSelChange(void) HMENU hViewMenu; HMENU hSubMenu; WCHAR szTemp[256]; + SYSTEM_INFO sysInfo; hMenu = GetMenu(hMainWnd); hViewMenu = GetSubMenu(hMenu, 2); @@ -947,16 +948,28 @@ void TaskManager_OnTabWndSelChange(void) DeleteMenu(hMenu, 3, MF_BYPOSITION); DrawMenuBar(hMainWnd); } - hSubMenu = CreatePopupMenu(); - LoadStringW(hInst, IDS_MENU_ONEGRAPHALLCPUS, szTemp, 256); - AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHALL, szTemp); + GetSystemInfo(&sysInfo); - LoadStringW(hInst, IDS_MENU_ONEGRAPHPERCPU, szTemp, 256); - AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, szTemp); + /* Hide CPU graph options on single CPU systems */ + if (sysInfo.dwNumberOfProcessors > 1) + { + hSubMenu = CreatePopupMenu(); - LoadStringW(hInst, IDS_MENU_CPUHISTORY, szTemp, 256); - AppendMenuW(hViewMenu, MF_STRING|MF_POPUP, (UINT_PTR) hSubMenu, szTemp); + LoadStringW(hInst, IDS_MENU_ONEGRAPHALLCPUS, szTemp, 256); + AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHALL, szTemp); + + LoadStringW(hInst, IDS_MENU_ONEGRAPHPERCPU, szTemp, 256); + AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, szTemp); + + LoadStringW(hInst, IDS_MENU_CPUHISTORY, szTemp, 256); + AppendMenuW(hViewMenu, MF_STRING|MF_POPUP, (UINT_PTR) hSubMenu, szTemp); + + if (TaskManagerSettings.CPUHistory_OneGraphPerCPU) + CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND); + else + CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND); + } LoadStringW(hInst, IDS_MENU_SHOWKERNELTIMES, szTemp, 256); AppendMenuW(hViewMenu, MF_STRING, ID_VIEW_SHOWKERNELTIMES, szTemp); @@ -965,10 +978,7 @@ void TaskManager_OnTabWndSelChange(void) CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_CHECKED); else CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_UNCHECKED); - if (TaskManagerSettings.CPUHistory_OneGraphPerCPU) - CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND); - else - CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND); + /* * Give the tab control focus */ From eb82a3b915400c6765b20acda649c8bba8b6594d Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 3 Apr 2010 17:24:10 +0000 Subject: [PATCH 019/261] [cmd] Emit line breaks DOS/Windows style (CRLF), instead of Linux style (LF only) See issue #4509 for more details. svn path=/trunk/; revision=46700 --- reactos/base/shell/cmd/console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/shell/cmd/console.c b/reactos/base/shell/cmd/console.c index 18541bf389f..8184af747ea 100644 --- a/reactos/base/shell/cmd/console.c +++ b/reactos/base/shell/cmd/console.c @@ -166,7 +166,7 @@ VOID ConOutChar (TCHAR c) VOID ConPuts(LPTSTR szText, DWORD nStdHandle) { ConWrite(szText, _tcslen(szText), nStdHandle); - ConWrite(_T("\n"), 1, nStdHandle); + ConWrite(_T("\r\n"), 2, nStdHandle); } VOID ConOutResPaging(BOOL NewPage, UINT resID) From 71d61c9c591aea715413ae7e795ee27cc5cdcb45 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sat, 3 Apr 2010 20:22:32 +0000 Subject: [PATCH 020/261] [NTOSKRNL/CONFIG] - Flusher lock fixes: wrong kind of lock,total mess (and the wrong kind of lock). Properly fixed throughout cmapi.c, but still missing in many other places. - Add support for detecting loading of an already loaded hive. - Start adding calls to CmpReportNotify to support registry callbacks. - Do work needed to flush notifications for a deleted node (but CmpFlushNotify not yet implemented). - Add support for adding each newly loaded hive to the HiveList key in the registry (but CmpAddHiveToFileList not yet implemented). - Add some ViewLock acquire/releases where needed. - Load the key in a faster way (Ob vs Zw) - Add checks everywhere for HvMarkCellDirty success. In future (when log/backup file is enabled), it can return FALSE (e.g. when we are out of space). - Change logic in CmpDoFlushAll to only flush a hive if it won't shrink (in the future, flushing may lead to hive shrinkage for efficiency). - Add SEH2 protection to all CmApis that may deal with user-mode data. - Add HvTrackCellRef/HvReleaseCellRef for tracking cell references in scenarios where we might need many GetCell/ReleaseCell calls. For now stubbed to only work with up to 4 static references. - Properly unlock/free in some failure paths in some of the CM APIs. - Add some missing HvReleaseCell in paths where it was missing. - Try to fix hack in enumerate key. - Fix wrong usage of KeQuerySystemTime. It was called twice to save it in 2 different places. Instead, there should be only one call, and then duplicate the value across. - Fix logic in CmpSetValueExistingData/Key. Tested with winetests and .NET framework 1.1 installation which fully completes. svn path=/trunk/; revision=46702 --- reactos/lib/cmlib/cmlib.h | 37 + reactos/lib/cmlib/hivecell.c | 55 +- reactos/lib/cmlib/hivewrt.c | 8 + reactos/ntoskrnl/config/cmapi.c | 1730 ++++++++++++++++------------ reactos/ntoskrnl/config/cmhvlist.c | 7 + reactos/ntoskrnl/config/cminit.c | 8 +- reactos/ntoskrnl/config/cmkcbncb.c | 59 + reactos/ntoskrnl/config/cmparse.c | 19 - 8 files changed, 1187 insertions(+), 736 deletions(-) diff --git a/reactos/lib/cmlib/cmlib.h b/reactos/lib/cmlib/cmlib.h index fae049507d2..c6823b06a47 100644 --- a/reactos/lib/cmlib/cmlib.h +++ b/reactos/lib/cmlib/cmlib.h @@ -198,6 +198,22 @@ typedef struct _CMHIVE #endif +typedef struct _HV_HIVE_CELL_PAIR +{ + PHHIVE Hive; + HCELL_INDEX Cell; +} HV_HIVE_CELL_PAIR, *PHV_HIVE_CELL_PAIR; + +#define STATIC_CELL_PAIR_COUNT 4 +typedef struct _HV_TRACK_CELL_REF +{ + USHORT Count; + USHORT Max; + PHV_HIVE_CELL_PAIR CellArray; + HV_HIVE_CELL_PAIR StaticArray[STATIC_CELL_PAIR_COUNT]; + USHORT StaticCount; +} HV_TRACK_CELL_REF, *PHV_TRACK_CELL_REF; + extern ULONG CmlibTraceLevel; /* @@ -272,6 +288,12 @@ HvIsCellDirty( IN HCELL_INDEX Cell ); +BOOLEAN +CMAPI +HvHiveWillShrink( + IN PHHIVE RegistryHive +); + BOOLEAN CMAPI HvSyncHive( PHHIVE RegistryHive); @@ -288,6 +310,21 @@ CmCreateRootNode( VOID CMAPI CmPrepareHive( PHHIVE RegistryHive); + + +BOOLEAN +CMAPI +HvTrackCellRef( + PHV_TRACK_CELL_REF CellRef, + PHHIVE Hive, + HCELL_INDEX Cell +); + +VOID +CMAPI +HvReleaseFreeCellRefArray( + PHV_TRACK_CELL_REF CellRef +); /* * Private functions. diff --git a/reactos/lib/cmlib/hivecell.c b/reactos/lib/cmlib/hivecell.c index 994ca98170d..815165182a5 100644 --- a/reactos/lib/cmlib/hivecell.c +++ b/reactos/lib/cmlib/hivecell.c @@ -113,7 +113,7 @@ HvMarkCellDirty( __FUNCTION__, RegistryHive, CellIndex, HoldingLock); if ((CellIndex & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT != Stable) - return FALSE; + return TRUE; CellBlock = (CellIndex & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT; CellLastBlock = ((CellIndex + HV_BLOCK_SIZE - 1) & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT; @@ -525,3 +525,56 @@ HvFreeCell( if (CellType == Stable) HvMarkCellDirty(RegistryHive, CellIndex, FALSE); } + +BOOLEAN +CMAPI +HvTrackCellRef(PHV_TRACK_CELL_REF CellRef, + PHHIVE Hive, + HCELL_INDEX Cell) +{ + /* Sanity checks */ + ASSERT(CellRef); + ASSERT(Hive ); + ASSERT(Cell != HCELL_NIL); + + /* Less than 4? */ + if (CellRef->StaticCount < STATIC_CELL_PAIR_COUNT) + { + /* Add reference */ + CellRef->StaticArray[CellRef->StaticCount].Hive = Hive; + CellRef->StaticArray[CellRef->StaticCount].Cell = Cell; + CellRef->StaticCount++; + return TRUE; + } + + /* FIXME: TODO */ + DPRINT1("ERROR: Too many references\n"); + while (TRUE); + return FALSE; +} + +VOID +CMAPI +HvReleaseFreeCellRefArray(PHV_TRACK_CELL_REF CellRef) +{ + ULONG i; + ASSERT(CellRef); + + /* Any references? */ + if (CellRef->StaticCount > 0) + { + /* Sanity check */ + ASSERT(CellRef->StaticCount <= STATIC_CELL_PAIR_COUNT); + + /* Loop them */ + for (i = 0; i < CellRef->StaticCount;i++) + { + /* Release them */ + HvReleaseCell(CellRef->StaticArray[i].Hive, + CellRef->StaticArray[i].Cell); + } + + /* Free again */ + CellRef->StaticCount = 0; + } +} \ No newline at end of file diff --git a/reactos/lib/cmlib/hivewrt.c b/reactos/lib/cmlib/hivewrt.c index 5cc20cfe503..7ecadff2062 100644 --- a/reactos/lib/cmlib/hivewrt.c +++ b/reactos/lib/cmlib/hivewrt.c @@ -265,6 +265,14 @@ HvSyncHive( return TRUE; } +BOOLEAN +CMAPI +HvHiveWillShrink(IN PHHIVE RegistryHive) +{ + /* No shrinking yet */ + return FALSE; +} + BOOLEAN CMAPI HvWriteHive( PHHIVE RegistryHive) diff --git a/reactos/ntoskrnl/config/cmapi.c b/reactos/ntoskrnl/config/cmapi.c index 85f2ed9fe14..538c3e5b560 100644 --- a/reactos/ntoskrnl/config/cmapi.c +++ b/reactos/ntoskrnl/config/cmapi.c @@ -14,6 +14,67 @@ /* FUNCTIONS *****************************************************************/ +BOOLEAN +NTAPI +CmpIsHiveAlreadyLoaded(IN HANDLE KeyHandle, + IN POBJECT_ATTRIBUTES SourceFile, + OUT PCMHIVE *CmHive) +{ + NTSTATUS Status; + PCM_KEY_BODY KeyBody; + PCMHIVE Hive; + BOOLEAN Loaded = FALSE; + PAGED_CODE(); + + /* Sanity check */ + CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK(); + + /* Reference the handle */ + Status = ObReferenceObjectByHandle(KeyHandle, + 0, + CmpKeyObjectType, + KernelMode, + (PVOID)&KeyBody, + NULL); + if (!NT_SUCCESS(Status)) return Loaded; + + /* Don't touch deleted KCBs */ + if (KeyBody->KeyControlBlock->Delete) return Loaded; + + Hive = CONTAINING_RECORD(KeyBody->KeyControlBlock->KeyHive, CMHIVE, Hive); + + /* Must be the root key */ + if (!(KeyBody->KeyControlBlock->Flags & KEY_HIVE_ENTRY) || + !(Hive->FileUserName.Buffer)) + { + /* It isn't */ + ObDereferenceObject(KeyBody); + return Loaded; + } + + /* Now compare the name of the file */ + if (!RtlCompareUnicodeString(&Hive->FileUserName, + SourceFile->ObjectName, + TRUE)) + { + /* Same file found */ + Loaded = TRUE; + *CmHive = Hive; + + /* If the hive is frozen, not sure what to do */ + if (Hive->Frozen) + { + /* FIXME: TODO */ + DPRINT1("ERROR: Hive is frozen\n"); + while (TRUE); + } + } + + /* Dereference and return result */ + ObDereferenceObject(KeyBody); + return Loaded; + } + BOOLEAN NTAPI CmpDoFlushAll(IN BOOLEAN ForceFlush) @@ -39,16 +100,35 @@ CmpDoFlushAll(IN BOOLEAN ForceFlush) if (!(Hive->Hive.HiveFlags & HIVE_NOLAZYFLUSH)) { /* Acquire the flusher lock */ - ExAcquirePushLockExclusive((PVOID)&Hive->FlusherLock); + CmpLockHiveFlusherExclusive(Hive); + + /* Check for illegal state */ + if ((ForceFlush) && (Hive->UseCount)) + { + /* Registry needs to be locked down */ + CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK(); + DPRINT1("FIXME: Hive is damaged and needs fixup\n"); + while (TRUE); + } + + /* Only sync if we are forced to or if it won't cause a hive shrink */ + if ((ForceFlush) || (!HvHiveWillShrink(&Hive->Hive))) + { + /* Do the sync */ + Status = HvSyncHive(&Hive->Hive); - /* Do the sync */ - Status = HvSyncHive(&Hive->Hive); - - /* If something failed - set the flag and continue looping*/ - if (!NT_SUCCESS(Status)) Result = FALSE; + /* If something failed - set the flag and continue looping */ + if (!NT_SUCCESS(Status)) Result = FALSE; + } + else + { + /* We won't flush if the hive might shrink */ + Result = FALSE; + CmpForceForceFlush = TRUE; + } /* Release the flusher lock */ - ExReleasePushLock((PVOID)&Hive->FlusherLock); + CmpUnlockHiveFlusher(Hive); } /* Try the next entry */ @@ -81,10 +161,14 @@ CmpSetValueKeyNew(IN PHHIVE Hive, { /* Then make sure it's valid and dirty it */ ASSERT(Parent->ValueList.List != HCELL_NIL); - HvMarkCellDirty(Hive, Parent->ValueList.List, FALSE); + if (!HvMarkCellDirty(Hive, Parent->ValueList.List, FALSE)) + { + /* Fail if we're out of space for log changes */ + return STATUS_NO_LOG_SPACE; + } } - /* Allocate avalue cell */ + /* Allocate a value cell */ ValueCell = HvAllocateCell(Hive, FIELD_OFFSET(CM_KEY_VALUE, Name) + CmpNameSize(Hive, ValueName), @@ -102,16 +186,33 @@ CmpSetValueKeyNew(IN PHHIVE Hive, /* Set it up and copy the name */ CellData->u.KeyValue.Signature = CM_KEY_VALUE_SIGNATURE; - CellData->u.KeyValue.Flags = 0; - CellData->u.KeyValue.Type = Type; - CellData->u.KeyValue.NameLength = CmpCopyName(Hive, - CellData->u.KeyValue.Name, - ValueName); + _SEH2_TRY + { + /* This can crash since the name is coming from user-mode */ + CellData->u.KeyValue.NameLength = CmpCopyName(Hive, + CellData->u.KeyValue.Name, + ValueName); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Fail */ + DPRINT1("Invalid user data!\n"); + HvFreeCell(Hive, ValueCell); + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + + /* Check for compressed name */ if (CellData->u.KeyValue.NameLength < ValueName->Length) { /* This is a compressed name */ CellData->u.KeyValue.Flags = VALUE_COMP_NAME; } + else + { + /* No flags to set */ + CellData->u.KeyValue.Flags = 0; + } /* Check if this is a normal key */ if (DataSize > CM_KEY_VALUE_SMALL) @@ -140,6 +241,9 @@ CmpSetValueKeyNew(IN PHHIVE Hive, CellData->u.KeyValue.DataLength = DataSize + CM_KEY_VALUE_SPECIAL_SIZE; CellData->u.KeyValue.Data = SmallData; } + + /* Set the type now */ + CellData->u.KeyValue.Type = Type; /* Add this value cell to the child list */ Status = CmpAddValueToList(Hive, @@ -149,7 +253,12 @@ CmpSetValueKeyNew(IN PHHIVE Hive, &Parent->ValueList); /* If we failed, free the entire cell, including the data */ - if (!NT_SUCCESS(Status)) CmpFreeValue(Hive, ValueCell); + if (!NT_SUCCESS(Status)) + { + /* Overwrite the status with a known one */ + CmpFreeValue(Hive, ValueCell); + Status = STATUS_INSUFFICIENT_RESOURCES; + } /* Return Status */ return Status; @@ -170,9 +279,12 @@ CmpSetValueKeyExisting(IN PHHIVE Hive, PCELL_DATA CellData; ULONG Length; BOOLEAN WasSmall, IsSmall; + + /* Registry writes must be blocked */ + CMP_ASSERT_FLUSH_LOCK(Hive); /* Mark the old child cell dirty */ - HvMarkCellDirty(Hive, OldChild, FALSE); + if (!HvMarkCellDirty(Hive, OldChild, FALSE)) return STATUS_NO_LOG_SPACE; /* See if this is a small or normal key */ WasSmall = CmpIsKeyValueSmall(&Length, Value->DataLength); @@ -185,7 +297,7 @@ CmpSetValueKeyExisting(IN PHHIVE Hive, ASSERT_VALUE_BIG(Hive, DataSize); /* Mark the old value dirty */ - CmpMarkValueDataDirty(Hive, Value); + if (!CmpMarkValueDataDirty(Hive, Value)) return STATUS_NO_LOG_SPACE; /* Check if we have a small key */ if (IsSmall) @@ -203,662 +315,58 @@ CmpSetValueKeyExisting(IN PHHIVE Hive, Value->Type = Type; return STATUS_SUCCESS; } - else + + /* We have a normal key. Was the old cell also normal and had data? */ + if (!(WasSmall) && (Length > 0)) { - /* We have a normal key. Was the old cell also normal and had data? */ - if (!(WasSmall) && (Length > 0)) + /* Get the current data cell and actual data inside it */ + DataCell = Value->Data; + ASSERT(DataCell != HCELL_NIL); + CellData = HvGetCell(Hive, DataCell); + if (!CellData) return STATUS_INSUFFICIENT_RESOURCES; + + /* Immediately release the cell */ + HvReleaseCell(Hive, DataCell); + + /* Make sure that the data cell actually has a size */ + ASSERT(HvGetCellSize(Hive, CellData) > 0); + + /* Check if the previous data cell could fit our new data */ + if (DataSize <= (ULONG)(HvGetCellSize(Hive, CellData))) { - /* Get the current data cell and actual data inside it */ - DataCell = Value->Data; - ASSERT(DataCell != HCELL_NIL); - CellData = HvGetCell(Hive, DataCell); - if (!CellData) return STATUS_INSUFFICIENT_RESOURCES; - - /* Immediately release the cell */ - HvReleaseCell(Hive, DataCell); - - /* Make sure that the data cell actually has a size */ - ASSERT(HvGetCellSize(Hive, CellData) > 0); - - /* Check if the previous data cell could fit our new data */ - if (DataSize <= (ULONG)(HvGetCellSize(Hive, CellData))) - { - /* Re-use it then */ - NewCell = DataCell; - } - else - { - /* Otherwise, re-allocate the current data cell */ - NewCell = HvReallocateCell(Hive, DataCell, DataSize); - if (NewCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; - } + /* Re-use it then */ + NewCell = DataCell; } else { - /* This was a small key, or a key with no data, allocate a cell */ - NewCell = HvAllocateCell(Hive, DataSize, StorageType, HCELL_NIL); + /* Otherwise, re-allocate the current data cell */ + NewCell = HvReallocateCell(Hive, DataCell, DataSize); if (NewCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; } - - /* Now get the actual data for our data cell */ - CellData = HvGetCell(Hive, NewCell); - if (!CellData) ASSERT(FALSE); - - /* Release it immediately */ - HvReleaseCell(Hive, NewCell); - - /* Copy our data into the data cell's buffer, and set up the value */ - RtlCopyMemory(CellData, Data, DataSize); - Value->Data = NewCell; - Value->DataLength = DataSize; - Value->Type = Type; - - /* Return success */ - ASSERT(HvIsCellDirty(Hive, NewCell)); - return STATUS_SUCCESS; - } -} - -NTSTATUS -NTAPI -CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, - IN PUNICODE_STRING ValueName, - IN ULONG Type, - IN PVOID Data, - IN ULONG DataLength) -{ - PHHIVE Hive; - PCM_KEY_NODE Parent; - PCM_KEY_VALUE Value = NULL; - HCELL_INDEX CurrentChild, Cell; - NTSTATUS Status; - BOOLEAN Found, Result; - ULONG Count, ChildIndex, SmallData, Storage; - VALUE_SEARCH_RETURN_TYPE SearchResult; - - /* Acquire hive lock */ - CmpLockRegistry(); - CmpAcquireKcbLockShared(Kcb); - - /* Sanity check */ - ASSERT(sizeof(ULONG) == CM_KEY_VALUE_SMALL); - - /* Don't touch deleted KCBs */ -DoAgain: - if (Kcb->Delete) - { - /* Fail */ - Status = STATUS_KEY_DELETED; - goto Quickie; - } - - /* Don't let anyone mess with symlinks */ - if ((Kcb->Flags & KEY_SYM_LINK) && - ((Type != REG_LINK) || - !(ValueName) || - !(RtlEqualUnicodeString(&CmSymbolicLinkValueName, ValueName, TRUE)))) - { - /* Invalid modification of a symlink key */ - Status = STATUS_ACCESS_DENIED; - goto Quickie; - } - - /* Search for the value */ - SearchResult = CmpCompareNewValueDataAgainstKCBCache(Kcb, - ValueName, - Type, - Data, - DataLength); - if (SearchResult == SearchNeedExclusiveLock) - { - /* Try again with the exclusive lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - else if (SearchResult == SearchSuccess) - { - /* We don't actually need to do anything! */ - Status = STATUS_SUCCESS; - goto Quickie; - } - - /* We need the exclusive KCB lock now */ - if (!(CmpIsKcbLockedExclusive(Kcb)) && !(CmpTryToConvertKcbSharedToExclusive(Kcb))) - { - /* Acquire exclusive lock */ - CmpConvertKcbSharedToExclusive(Kcb); - } - - /* Get pointer to key cell */ - Hive = Kcb->KeyHive; - Cell = Kcb->KeyCell; - - /* Prepare to scan the key node */ - Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell); - Count = Parent->ValueList.Count; - Found = FALSE; - if (Count > 0) - { - /* Try to find the existing name */ - Result = CmpFindNameInList(Hive, - &Parent->ValueList, - ValueName, - &ChildIndex, - &CurrentChild); - if (!Result) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Check if we found something */ - if (CurrentChild != HCELL_NIL) - { - /* Get its value */ - Value = (PCM_KEY_VALUE)HvGetCell(Hive, CurrentChild); - if (!Value) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Remember that we found it */ - Found = TRUE; - } } else { - /* No child list, we'll need to add it */ - ChildIndex = 0; - } - - /* The KCB must be locked exclusive at this point */ - ASSERT((CmpIsKcbLockedExclusive(Kcb) == TRUE) || - (CmpTestRegistryLockExclusive() == TRUE)); - - /* Mark the cell dirty */ - HvMarkCellDirty(Hive, Cell, FALSE); - - /* Get the storage type */ - Storage = HvGetCellType(Cell); - - /* Check if this is small data */ - SmallData = 0; - if ((DataLength <= CM_KEY_VALUE_SMALL) && (DataLength > 0)) - { - /* Copy it */ - RtlCopyMemory(&SmallData, Data, DataLength); + /* This was a small key, or a key with no data, allocate a cell */ + NewCell = HvAllocateCell(Hive, DataSize, StorageType, HCELL_NIL); + if (NewCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; } - /* Check if we didn't find a matching key */ - if (!Found) - { - /* Call the internal routine */ - Status = CmpSetValueKeyNew(Hive, - Parent, - ValueName, - ChildIndex, - Type, - Data, - DataLength, - Storage, - SmallData); - } - else - { - /* Call the internal routine */ - Status = CmpSetValueKeyExisting(Hive, - CurrentChild, - Value, - Type, - Data, - DataLength, - Storage, - SmallData); - } + /* Now get the actual data for our data cell */ + CellData = HvGetCell(Hive, NewCell); + if (!CellData) ASSERT(FALSE); - /* Check for success */ - if (NT_SUCCESS(Status)) - { - /* Check if the maximum value name length changed */ - ASSERT(Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen); - if (Parent->MaxValueNameLen < ValueName->Length) - { - /* Set the new values */ - Parent->MaxValueNameLen = ValueName->Length; - Kcb->KcbMaxValueNameLen = ValueName->Length; - } - - /* Check if the maximum data length changed */ - ASSERT(Parent->MaxValueDataLen == Kcb->KcbMaxValueDataLen); - if (Parent->MaxValueDataLen < DataLength) - { - /* Update it */ - Parent->MaxValueDataLen = DataLength; - Kcb->KcbMaxValueDataLen = Parent->MaxValueDataLen; - } - - /* Save the write time */ - KeQuerySystemTime(&Parent->LastWriteTime); - KeQuerySystemTime(&Kcb->KcbLastWriteTime); - - /* Check if the cell is cached */ - if ((Found) && (CMP_IS_CELL_CACHED(Kcb->ValueCache.ValueList))) - { - /* Shouldn't happen */ - ASSERT(FALSE); - } - else - { - /* Cleanup the value cache */ - CmpCleanUpKcbValueCache(Kcb); + /* Release it immediately */ + HvReleaseCell(Hive, NewCell); - /* Sanity checks */ - ASSERT(!(CMP_IS_CELL_CACHED(Kcb->ValueCache.ValueList))); - ASSERT(!(Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND)); - - /* Set the value cache */ - Kcb->ValueCache.Count = Parent->ValueList.Count; - Kcb->ValueCache.ValueList = Parent->ValueList.List; - } - } - -Quickie: - /* Release the locks */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); - return Status; -} + /* Copy our data into the data cell's buffer, and set up the value */ + RtlCopyMemory(CellData, Data, DataSize); + Value->Data = NewCell; + Value->DataLength = DataSize; + Value->Type = Type; -NTSTATUS -NTAPI -CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, - IN UNICODE_STRING ValueName) -{ - NTSTATUS Status = STATUS_OBJECT_NAME_NOT_FOUND; - PHHIVE Hive; - PCM_KEY_NODE Parent; - HCELL_INDEX ChildCell, Cell; - PCHILD_LIST ChildList; - PCM_KEY_VALUE Value = NULL; - ULONG ChildIndex; - BOOLEAN Result; - - /* Acquire hive lock */ - CmpLockRegistry(); - - /* Lock KCB exclusively */ - CmpAcquireKcbLockExclusive(Kcb); - - /* Don't touch deleted keys */ - if (Kcb->Delete) - { - /* Undo everything */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); - return STATUS_KEY_DELETED; - } - - /* Get the hive and the cell index */ - Hive = Kcb->KeyHive; - Cell = Kcb->KeyCell; - - /* Get the parent key node */ - Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell); - if (!Parent) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Get the value list and check if it has any entries */ - ChildList = &Parent->ValueList; - if (ChildList->Count) - { - /* Try to find this value */ - Result = CmpFindNameInList(Hive, - ChildList, - &ValueName, - &ChildIndex, - &ChildCell); - if (!Result) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Value not found, return error */ - if (ChildCell == HCELL_NIL) goto Quickie; - - /* We found the value, mark all relevant cells dirty */ - HvMarkCellDirty(Hive, Cell, FALSE); - HvMarkCellDirty(Hive, Parent->ValueList.List, FALSE); - HvMarkCellDirty(Hive, ChildCell, FALSE); - - /* Get the key value */ - Value = (PCM_KEY_VALUE)HvGetCell(Hive,ChildCell); - if (!Value) ASSERT(FALSE); - - /* Mark it and all related data as dirty */ - CmpMarkValueDataDirty(Hive, Value); - - /* Ssanity checks */ - ASSERT(HvIsCellDirty(Hive, Parent->ValueList.List)); - ASSERT(HvIsCellDirty(Hive, ChildCell)); - - /* Remove the value from the child list */ - Status = CmpRemoveValueFromList(Hive, ChildIndex, ChildList); - if(!NT_SUCCESS(Status)) goto Quickie; - - /* Remove the value and its data itself */ - if (!CmpFreeValue(Hive, ChildCell)) - { - /* Failed to free the value, fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Set the last write time */ - KeQuerySystemTime(&Parent->LastWriteTime); - KeQuerySystemTime(&Kcb->KcbLastWriteTime); - - /* Sanity check */ - ASSERT(Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen); - ASSERT(Parent->MaxValueDataLen == Kcb->KcbMaxValueDataLen); - ASSERT(HvIsCellDirty(Hive, Cell)); - - /* Check if the value list is empty now */ - if (!Parent->ValueList.Count) - { - /* Then clear key node data */ - Parent->MaxValueNameLen = 0; - Parent->MaxValueDataLen = 0; - Kcb->KcbMaxValueNameLen = 0; - Kcb->KcbMaxValueDataLen = 0; - } - - /* Cleanup the value cache */ - CmpCleanUpKcbValueCache(Kcb); - - /* Sanity checks */ - ASSERT(!(CMP_IS_CELL_CACHED(Kcb->ValueCache.ValueList))); - ASSERT(!(Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND)); - - /* Set the value cache */ - Kcb->ValueCache.Count = ChildList->Count; - Kcb->ValueCache.ValueList = ChildList->List; - - /* Change default Status to success */ - Status = STATUS_SUCCESS; - } - -Quickie: - /* Release the parent cell, if any */ - if (Parent) HvReleaseCell(Hive, Cell); - - /* Check if we had a value */ - if (Value) - { - /* Release the child cell */ - ASSERT(ChildCell != HCELL_NIL); - HvReleaseCell(Hive, ChildCell); - } - - /* Release locks */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); - return Status; -} - -NTSTATUS -NTAPI -CmQueryValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, - IN UNICODE_STRING ValueName, - IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - IN PVOID KeyValueInformation, - IN ULONG Length, - IN PULONG ResultLength) -{ - NTSTATUS Status; - PCM_KEY_VALUE ValueData; - ULONG Index; - BOOLEAN ValueCached = FALSE; - PCM_CACHED_VALUE *CachedValue; - HCELL_INDEX CellToRelease; - VALUE_SEARCH_RETURN_TYPE Result; - PHHIVE Hive; - PAGED_CODE(); - - /* Acquire hive lock */ - CmpLockRegistry(); - - /* Lock the KCB shared */ - CmpAcquireKcbLockShared(Kcb); - - /* Don't touch deleted keys */ -DoAgain: - if (Kcb->Delete) - { - /* Undo everything */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); - return STATUS_KEY_DELETED; - } - - /* We don't deal with this yet */ - if (Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND) - { - /* Shouldn't happen */ - ASSERT(FALSE); - } - - /* Get the hive */ - Hive = Kcb->KeyHive; - - /* Find the key value */ - Result = CmpFindValueByNameFromCache(Kcb, - &ValueName, - &CachedValue, - &Index, - &ValueData, - &ValueCached, - &CellToRelease); - if (Result == SearchNeedExclusiveLock) - { - /* Check if we need an exclusive lock */ - ASSERT(CellToRelease == HCELL_NIL); - ASSERT(ValueData == NULL); - - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - - if (Result == SearchSuccess) - { - /* Sanity check */ - ASSERT(ValueData != NULL); - - /* Query the information requested */ - Result = CmpQueryKeyValueData(Kcb, - CachedValue, - ValueData, - ValueCached, - KeyValueInformationClass, - KeyValueInformation, - Length, - ResultLength, - &Status); - if (Result == SearchNeedExclusiveLock) - { - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - } - else - { - /* Failed to find the value */ - Status = STATUS_OBJECT_NAME_NOT_FOUND; - } - - /* If we have a cell to release, do so */ - if (CellToRelease != HCELL_NIL) HvReleaseCell(Hive, CellToRelease); - - /* Release locks */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); - return Status; -} - -NTSTATUS -NTAPI -CmEnumerateValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, - IN ULONG Index, - IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - IN PVOID KeyValueInformation, - IN ULONG Length, - IN PULONG ResultLength) -{ - NTSTATUS Status; - PHHIVE Hive; - PCM_KEY_NODE Parent; - HCELL_INDEX CellToRelease = HCELL_NIL, CellToRelease2 = HCELL_NIL; - VALUE_SEARCH_RETURN_TYPE Result; - BOOLEAN IndexIsCached, ValueIsCached = FALSE; - PCELL_DATA CellData; - PCM_CACHED_VALUE *CachedValue; - PCM_KEY_VALUE ValueData = NULL; - PAGED_CODE(); - - /* Acquire hive lock */ - CmpLockRegistry(); - - /* Lock the KCB shared */ - CmpAcquireKcbLockShared(Kcb); - - /* Don't touch deleted keys */ -DoAgain: - if (Kcb->Delete) - { - /* Undo everything */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); - return STATUS_KEY_DELETED; - } - - /* Get the hive and parent */ - Hive = Kcb->KeyHive; - Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); - if (!Parent) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Make sure the index is valid */ - //if (Index >= Kcb->ValueCache.Count) - if (Index >= Parent->ValueList.Count) - { - /* Release the cell and fail */ - HvReleaseCell(Hive, Kcb->KeyCell); - Status = STATUS_NO_MORE_ENTRIES; - goto Quickie; - } - - /* We don't deal with this yet */ - if (Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND) - { - /* Shouldn't happen */ - ASSERT(FALSE); - } - - /* Find the value list */ - Result = CmpGetValueListFromCache(Kcb, - &CellData, - &IndexIsCached, - &CellToRelease); - if (Result == SearchNeedExclusiveLock) - { - /* Check if we need an exclusive lock */ - ASSERT(CellToRelease == HCELL_NIL); - ASSERT(ValueData == NULL); - - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - else if (Result != SearchSuccess) - { - /* Sanity check */ - ASSERT(CellData == NULL); - - /* Release the cell and fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Now get the key value */ - Result = CmpGetValueKeyFromCache(Kcb, - CellData, - Index, - &CachedValue, - &ValueData, - IndexIsCached, - &ValueIsCached, - &CellToRelease2); - if (Result == SearchNeedExclusiveLock) - { - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - else if (Result != SearchSuccess) - { - /* Sanity check */ - ASSERT(ValueData == NULL); - - /* Release the cells and fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Query the information requested */ - Result = CmpQueryKeyValueData(Kcb, - CachedValue, - ValueData, - ValueIsCached, - KeyValueInformationClass, - KeyValueInformation, - Length, - ResultLength, - &Status); - if (Result == SearchNeedExclusiveLock) - { - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - -Quickie: - /* If we have a cell to release, do so */ - if (CellToRelease != HCELL_NIL) HvReleaseCell(Hive, CellToRelease); - - /* Release the parent cell */ - HvReleaseCell(Hive, Kcb->KeyCell); - - /* If we have a cell to release, do so */ - if (CellToRelease2 != HCELL_NIL) HvReleaseCell(Hive, CellToRelease2); - - /* Release locks */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); - return Status; + /* Return success */ + ASSERT(HvIsCellDirty(Hive, NewCell)); + return STATUS_SUCCESS; } NTSTATUS @@ -1076,6 +584,725 @@ CmpQueryKeyData(IN PHHIVE Hive, return Status; } +NTSTATUS +NTAPI +CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, + IN PUNICODE_STRING ValueName, + IN ULONG Type, + IN PVOID Data, + IN ULONG DataLength) +{ + PHHIVE Hive = NULL; + PCM_KEY_NODE Parent; + PCM_KEY_VALUE Value = NULL; + HCELL_INDEX CurrentChild, Cell; + NTSTATUS Status; + BOOLEAN Found, Result; + ULONG Count, ChildIndex, SmallData, Storage; + VALUE_SEARCH_RETURN_TYPE SearchResult; + BOOLEAN FirstTry = TRUE, FlusherLocked = FALSE; + HCELL_INDEX ParentCell = HCELL_NIL, ChildCell = HCELL_NIL; + + /* Acquire hive and KCB lock */ + CmpLockRegistry(); + CmpAcquireKcbLockShared(Kcb); + + /* Sanity check */ + ASSERT(sizeof(ULONG) == CM_KEY_VALUE_SMALL); + + /* Don't touch deleted KCBs */ +DoAgain: + if (Kcb->Delete) + { + /* Fail */ + Status = STATUS_KEY_DELETED; + goto Quickie; + } + + /* Don't let anyone mess with symlinks */ + if ((Kcb->Flags & KEY_SYM_LINK) && + ((Type != REG_LINK) || + !(ValueName) || + !(RtlEqualUnicodeString(&CmSymbolicLinkValueName, ValueName, TRUE)))) + { + /* Invalid modification of a symlink key */ + Status = STATUS_ACCESS_DENIED; + goto Quickie; + } + + /* Check if this is the first attempt */ + if (FirstTry) + { + /* Search for the value in the cache */ + SearchResult = CmpCompareNewValueDataAgainstKCBCache(Kcb, + ValueName, + Type, + Data, + DataLength); + if (SearchResult == SearchNeedExclusiveLock) + { + /* Try again with the exclusive lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + else if (SearchResult == SearchSuccess) + { + /* We don't actually need to do anything! */ + Status = STATUS_SUCCESS; + goto Quickie; + } + + /* We need the exclusive KCB lock now */ + if (!(CmpIsKcbLockedExclusive(Kcb)) && + !(CmpTryToConvertKcbSharedToExclusive(Kcb))) + { + /* Acquire exclusive lock */ + CmpConvertKcbSharedToExclusive(Kcb); + } + + /* Cache lookup failed, so don't try it next time */ + FirstTry = FALSE; + + /* Now grab the flush lock since the key will be modified */ + ASSERT(FlusherLocked == FALSE); + CmpLockHiveFlusherShared((PCMHIVE)Kcb->KeyHive); + FlusherLocked = TRUE; + goto DoAgain; + } + else + { + /* Get pointer to key cell */ + Hive = Kcb->KeyHive; + Cell = Kcb->KeyCell; + + /* Get the parent */ + Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell); + ASSERT(Parent); + ParentCell = Cell; + + /* Prepare to scan the key node */ + Count = Parent->ValueList.Count; + Found = FALSE; + if (Count > 0) + { + /* Try to find the existing name */ + Result = CmpFindNameInList(Hive, + &Parent->ValueList, + ValueName, + &ChildIndex, + &CurrentChild); + if (!Result) + { + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Check if we found something */ + if (CurrentChild != HCELL_NIL) + { + /* Release existing child */ + if (ChildCell != HCELL_NIL) + { + HvReleaseCell(Hive, ChildCell); + ChildCell = HCELL_NIL; + } + + /* Get its value */ + Value = (PCM_KEY_VALUE)HvGetCell(Hive, CurrentChild); + if (!Value) + { + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Remember that we found it */ + ChildCell = CurrentChild; + Found = TRUE; + } + } + else + { + /* No child list, we'll need to add it */ + ChildIndex = 0; + } + } + + /* Should only get here on the second pass */ + ASSERT(FirstTry == FALSE); + + /* The KCB must be locked exclusive at this point */ + CMP_ASSERT_KCB_LOCK(Kcb); + + /* Mark the cell dirty */ + if (!HvMarkCellDirty(Hive, Cell, FALSE)) + { + /* Not enough log space, fail */ + Status = STATUS_NO_LOG_SPACE; + goto Quickie; + } + + /* Get the storage type */ + Storage = HvGetCellType(Cell); + + /* Check if this is small data */ + SmallData = 0; + if ((DataLength <= CM_KEY_VALUE_SMALL) && (DataLength > 0)) + { + /* Need SEH because user data may be invalid */ + _SEH2_TRY + { + /* Copy it */ + RtlCopyMemory(&SmallData, Data, DataLength); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return failure code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(goto Quickie); + } + _SEH2_END; + } + + /* Check if we didn't find a matching key */ + if (!Found) + { + /* Call the internal routine */ + Status = CmpSetValueKeyNew(Hive, + Parent, + ValueName, + ChildIndex, + Type, + Data, + DataLength, + Storage, + SmallData); + } + else + { + /* Call the internal routine */ + Status = CmpSetValueKeyExisting(Hive, + CurrentChild, + Value, + Type, + Data, + DataLength, + Storage, + SmallData); + } + + /* Check for success */ + if (NT_SUCCESS(Status)) + { + /* Check if the maximum value name length changed */ + ASSERT(Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen); + if (Parent->MaxValueNameLen < ValueName->Length) + { + /* Set the new values */ + Parent->MaxValueNameLen = ValueName->Length; + Kcb->KcbMaxValueNameLen = ValueName->Length; + } + + /* Check if the maximum data length changed */ + ASSERT(Parent->MaxValueDataLen == Kcb->KcbMaxValueDataLen); + if (Parent->MaxValueDataLen < DataLength) + { + /* Update it */ + Parent->MaxValueDataLen = DataLength; + Kcb->KcbMaxValueDataLen = Parent->MaxValueDataLen; + } + + /* Save the write time */ + KeQuerySystemTime(&Parent->LastWriteTime); + Kcb->KcbLastWriteTime = Parent->LastWriteTime; + + /* Check if the cell is cached */ + if ((Found) && (CMP_IS_CELL_CACHED(Kcb->ValueCache.ValueList))) + { + /* Shouldn't happen */ + ASSERT(FALSE); + } + else + { + /* Cleanup the value cache */ + CmpCleanUpKcbValueCache(Kcb); + + /* Sanity checks */ + ASSERT(!(CMP_IS_CELL_CACHED(Kcb->ValueCache.ValueList))); + ASSERT(!(Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND)); + + /* Set the value cache */ + Kcb->ValueCache.Count = Parent->ValueList.Count; + Kcb->ValueCache.ValueList = Parent->ValueList.List; + } + + /* Notify registered callbacks */ + CmpReportNotify(Kcb, + Hive, + Kcb->KeyCell, + REG_NOTIFY_CHANGE_LAST_SET); + } + + /* Release the cells */ +Quickie: + if ((ParentCell != HCELL_NIL) && (Hive)) HvReleaseCell(Hive, ParentCell); + if ((ChildCell != HCELL_NIL) && (Hive)) HvReleaseCell(Hive, ChildCell); + + /* Release the locks */ + if (FlusherLocked) CmpUnlockHiveFlusher((PCMHIVE)Hive); + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return Status; +} + +NTSTATUS +NTAPI +CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, + IN UNICODE_STRING ValueName) +{ + NTSTATUS Status = STATUS_OBJECT_NAME_NOT_FOUND; + PHHIVE Hive; + PCM_KEY_NODE Parent; + HCELL_INDEX ChildCell, Cell; + PCHILD_LIST ChildList; + PCM_KEY_VALUE Value = NULL; + ULONG ChildIndex; + BOOLEAN Result; + + /* Acquire hive lock */ + CmpLockRegistry(); + + /* Lock KCB exclusively */ + CmpAcquireKcbLockExclusive(Kcb); + + /* Don't touch deleted keys */ + if (Kcb->Delete) + { + /* Undo everything */ + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return STATUS_KEY_DELETED; + } + + /* Get the hive and the cell index */ + Hive = Kcb->KeyHive; + Cell = Kcb->KeyCell; + + /* Lock flushes */ + CmpLockHiveFlusherShared((PCMHIVE)Hive); + + /* Get the parent key node */ + Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell); + ASSERT(Parent); + + /* Get the value list and check if it has any entries */ + ChildList = &Parent->ValueList; + if (ChildList->Count) + { + /* Try to find this value */ + Result = CmpFindNameInList(Hive, + ChildList, + &ValueName, + &ChildIndex, + &ChildCell); + if (!Result) + { + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Value not found, return error */ + if (ChildCell == HCELL_NIL) goto Quickie; + + /* We found the value, mark all relevant cells dirty */ + if (!((HvMarkCellDirty(Hive, Cell, FALSE)) && + (HvMarkCellDirty(Hive, Parent->ValueList.List, FALSE)) && + (HvMarkCellDirty(Hive, ChildCell, FALSE)))) + { + /* Not enough log space, fail */ + Status = STATUS_NO_LOG_SPACE; + goto Quickie; + } + + /* Get the key value */ + Value = (PCM_KEY_VALUE)HvGetCell(Hive,ChildCell); + ASSERT(Value); + + /* Mark it and all related data as dirty */ + if (!CmpMarkValueDataDirty(Hive, Value)) + { + /* Not enough log space, fail */ + Status = STATUS_NO_LOG_SPACE; + goto Quickie; + } + + /* Ssanity checks */ + ASSERT(HvIsCellDirty(Hive, Parent->ValueList.List)); + ASSERT(HvIsCellDirty(Hive, ChildCell)); + + /* Remove the value from the child list */ + Status = CmpRemoveValueFromList(Hive, ChildIndex, ChildList); + if (!NT_SUCCESS(Status)) + { + /* Set known error */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Remove the value and its data itself */ + if (!CmpFreeValue(Hive, ChildCell)) + { + /* Failed to free the value, fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Set the last write time */ + KeQuerySystemTime(&Parent->LastWriteTime); + Kcb->KcbLastWriteTime = Parent->LastWriteTime; + + /* Sanity check */ + ASSERT(Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen); + ASSERT(Parent->MaxValueDataLen == Kcb->KcbMaxValueDataLen); + ASSERT(HvIsCellDirty(Hive, Cell)); + + /* Check if the value list is empty now */ + if (!Parent->ValueList.Count) + { + /* Then clear key node data */ + Parent->MaxValueNameLen = 0; + Parent->MaxValueDataLen = 0; + Kcb->KcbMaxValueNameLen = 0; + Kcb->KcbMaxValueDataLen = 0; + } + + /* Cleanup the value cache */ + CmpCleanUpKcbValueCache(Kcb); + + /* Sanity checks */ + ASSERT(!(CMP_IS_CELL_CACHED(Kcb->ValueCache.ValueList))); + ASSERT(!(Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND)); + + /* Set the value cache */ + Kcb->ValueCache.Count = ChildList->Count; + Kcb->ValueCache.ValueList = ChildList->List; + + /* Notify registered callbacks */ + CmpReportNotify(Kcb, Hive, Cell, REG_NOTIFY_CHANGE_LAST_SET); + + /* Change default Status to success */ + Status = STATUS_SUCCESS; + } + +Quickie: + /* Release the parent cell, if any */ + if (Parent) HvReleaseCell(Hive, Cell); + + /* Check if we had a value */ + if (Value) + { + /* Release the child cell */ + ASSERT(ChildCell != HCELL_NIL); + HvReleaseCell(Hive, ChildCell); + } + + /* Release locks */ + CmpUnlockHiveFlusher((PCMHIVE)Hive); + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return Status; +} + +NTSTATUS +NTAPI +CmQueryValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, + IN UNICODE_STRING ValueName, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + IN PVOID KeyValueInformation, + IN ULONG Length, + IN PULONG ResultLength) +{ + NTSTATUS Status; + PCM_KEY_VALUE ValueData; + ULONG Index; + BOOLEAN ValueCached = FALSE; + PCM_CACHED_VALUE *CachedValue; + HCELL_INDEX CellToRelease; + VALUE_SEARCH_RETURN_TYPE Result; + PHHIVE Hive; + PAGED_CODE(); + + /* Acquire hive lock */ + CmpLockRegistry(); + + /* Lock the KCB shared */ + CmpAcquireKcbLockShared(Kcb); + + /* Don't touch deleted keys */ +DoAgain: + if (Kcb->Delete) + { + /* Undo everything */ + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return STATUS_KEY_DELETED; + } + + /* We don't deal with this yet */ + if (Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND) + { + /* Shouldn't happen */ + ASSERT(FALSE); + } + + /* Get the hive */ + Hive = Kcb->KeyHive; + + /* Find the key value */ + Result = CmpFindValueByNameFromCache(Kcb, + &ValueName, + &CachedValue, + &Index, + &ValueData, + &ValueCached, + &CellToRelease); + if (Result == SearchNeedExclusiveLock) + { + /* Check if we need an exclusive lock */ + ASSERT(CellToRelease == HCELL_NIL); + ASSERT(ValueData == NULL); + + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + + if (Result == SearchSuccess) + { + /* Sanity check */ + ASSERT(ValueData != NULL); + + /* User data, protect against exceptions */ + _SEH2_TRY + { + /* Query the information requested */ + Result = CmpQueryKeyValueData(Kcb, + CachedValue, + ValueData, + ValueCached, + KeyValueInformationClass, + KeyValueInformation, + Length, + ResultLength, + &Status); + if (Result == SearchNeedExclusiveLock) + { + /* Release the value cell */ + if (CellToRelease != HCELL_NIL) + { + HvReleaseCell(Hive, CellToRelease); + CellToRelease = HCELL_NIL; + } + + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + } + else + { + /* Failed to find the value */ + Status = STATUS_OBJECT_NAME_NOT_FOUND; + } + + /* If we have a cell to release, do so */ + if (CellToRelease != HCELL_NIL) HvReleaseCell(Hive, CellToRelease); + + /* Release locks */ + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return Status; +} + +NTSTATUS +NTAPI +CmEnumerateValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, + IN ULONG Index, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + IN PVOID KeyValueInformation, + IN ULONG Length, + IN PULONG ResultLength) +{ + NTSTATUS Status; + PHHIVE Hive; + PCM_KEY_NODE Parent; + HCELL_INDEX CellToRelease = HCELL_NIL, CellToRelease2 = HCELL_NIL; + VALUE_SEARCH_RETURN_TYPE Result; + BOOLEAN IndexIsCached, ValueIsCached = FALSE; + PCELL_DATA CellData; + PCM_CACHED_VALUE *CachedValue; + PCM_KEY_VALUE ValueData = NULL; + PAGED_CODE(); + + /* Acquire hive lock */ + CmpLockRegistry(); + + /* Lock the KCB shared */ + CmpAcquireKcbLockShared(Kcb); + + /* Don't touch deleted keys */ +DoAgain: + if (Kcb->Delete) + { + /* Undo everything */ + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return STATUS_KEY_DELETED; + } + + /* Get the hive and parent */ + Hive = Kcb->KeyHive; + Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); + ASSERT(Parent); + + /* FIXME: Lack of cache? */ + if (Kcb->ValueCache.Count != Parent->ValueList.Count) + { + DPRINT1("HACK: Overriding value cache count\n"); + Kcb->ValueCache.Count = Parent->ValueList.Count; + } + + /* Make sure the index is valid */ + if (Index >= Kcb->ValueCache.Count) + { + /* Release the cell and fail */ + HvReleaseCell(Hive, Kcb->KeyCell); + Status = STATUS_NO_MORE_ENTRIES; + goto Quickie; + } + + /* We don't deal with this yet */ + if (Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND) + { + /* Shouldn't happen */ + ASSERT(FALSE); + } + + /* Find the value list */ + Result = CmpGetValueListFromCache(Kcb, + &CellData, + &IndexIsCached, + &CellToRelease); + if (Result == SearchNeedExclusiveLock) + { + /* Check if we need an exclusive lock */ + ASSERT(CellToRelease == HCELL_NIL); + HvReleaseCell(Hive, Kcb->KeyCell); + + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + else if (Result != SearchSuccess) + { + /* Sanity check */ + ASSERT(CellData == NULL); + + /* Release the cell and fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Now get the key value */ + Result = CmpGetValueKeyFromCache(Kcb, + CellData, + Index, + &CachedValue, + &ValueData, + IndexIsCached, + &ValueIsCached, + &CellToRelease2); + if (Result == SearchNeedExclusiveLock) + { + /* Cleanup state */ + ASSERT(CellToRelease2 == HCELL_NIL); + if (CellToRelease) + { + HvReleaseCell(Hive, CellToRelease); + CellToRelease = HCELL_NIL; + } + HvReleaseCell(Hive, Kcb->KeyCell); + + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + else if (Result != SearchSuccess) + { + /* Sanity check */ + ASSERT(ValueData == NULL); + + /* Release the cells and fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* User data, need SEH */ + _SEH2_TRY + { + /* Query the information requested */ + Result = CmpQueryKeyValueData(Kcb, + CachedValue, + ValueData, + ValueIsCached, + KeyValueInformationClass, + KeyValueInformation, + Length, + ResultLength, + &Status); + if (Result == SearchNeedExclusiveLock) + { + /* Cleanup state */ + if (CellToRelease2) HvReleaseCell(Hive, CellToRelease2); + HvReleaseCell(Hive, Kcb->KeyCell); + if (CellToRelease) HvReleaseCell(Hive, CellToRelease); + + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Get exception code */ + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + +Quickie: + /* If we have a cell to release, do so */ + if (CellToRelease != HCELL_NIL) HvReleaseCell(Hive, CellToRelease); + + /* Release the parent cell */ + HvReleaseCell(Hive, Kcb->KeyCell); + + /* If we have a cell to release, do so */ + if (CellToRelease2 != HCELL_NIL) HvReleaseCell(Hive, CellToRelease2); + + /* Release locks */ + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return Status; +} + NTSTATUS NTAPI CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, @@ -1087,6 +1314,7 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, NTSTATUS Status; PHHIVE Hive; PCM_KEY_NODE Parent; + HV_TRACK_CELL_REF CellReferences = {0}; /* Acquire hive lock */ CmpLockRegistry(); @@ -1094,16 +1322,6 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Lock KCB shared */ CmpAcquireKcbLockShared(Kcb); - /* Get the hive and parent */ - Hive = Kcb->KeyHive; - Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); - if (!Parent) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - /* Don't touch deleted keys */ if (Kcb->Delete) { @@ -1120,13 +1338,27 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, case KeyBasicInformation: case KeyNodeInformation: - /* Call the internal API */ - Status = CmpQueryKeyData(Hive, - Parent, - KeyInformationClass, - KeyInformation, - Length, - ResultLength); + /* Get the hive and parent */ + Hive = Kcb->KeyHive; + Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); + ASSERT(Parent); + + /* Track cell references */ + if (!HvTrackCellRef(&CellReferences, Hive, Kcb->KeyCell)) + { + /* Not enough memory to track references */ + Status = STATUS_INSUFFICIENT_RESOURCES; + } + else + { + /* Call the internal API */ + Status = CmpQueryKeyData(Hive, + Parent, + KeyInformationClass, + KeyInformation, + Length, + ResultLength); + } break; /* Unsupported classes for now */ @@ -1149,6 +1381,9 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, } Quickie: + /* Release references */ + HvReleaseFreeCellRefArray(&CellReferences); + /* Release locks */ CmpReleaseKcbLock(Kcb); CmpUnlockRegistry(); @@ -1168,6 +1403,7 @@ CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb, PHHIVE Hive; PCM_KEY_NODE Parent, Child; HCELL_INDEX ChildCell; + HV_TRACK_CELL_REF CellReferences = {0}; /* Acquire hive lock */ CmpLockRegistry(); @@ -1179,20 +1415,14 @@ CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb, if (Kcb->Delete) { /* Undo everything */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); - return STATUS_KEY_DELETED; + Status = STATUS_KEY_DELETED; + goto Quickie; } /* Get the hive and parent */ Hive = Kcb->KeyHive; Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); - if (!Parent) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } + ASSERT(Parent); /* Get the child cell */ ChildCell = CmpFindSubKeyByNumber(Hive, Parent, Index); @@ -1210,22 +1440,39 @@ CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Now get the actual child node */ Child = (PCM_KEY_NODE)HvGetCell(Hive, ChildCell); - if (!Child) + ASSERT(Child); + + /* Track references */ + if (!HvTrackCellRef(&CellReferences, Hive, ChildCell)) { - /* Fail */ + /* Can't allocate memory for tracking */ Status = STATUS_INSUFFICIENT_RESOURCES; goto Quickie; } - /* Query the data requested */ - Status = CmpQueryKeyData(Hive, - Child, - KeyInformationClass, - KeyInformation, - Length, - ResultLength); + /* Data can be user-mode, use SEH */ + _SEH2_TRY + { + /* Query the data requested */ + Status = CmpQueryKeyData(Hive, + Child, + KeyInformationClass, + KeyInformation, + Length, + ResultLength); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Fail with exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(goto Quickie); + } + _SEH2_END; Quickie: + /* Release references */ + HvReleaseFreeCellRefArray(&CellReferences); + /* Release locks */ CmpReleaseKcbLock(Kcb); CmpUnlockRegistry(); @@ -1271,14 +1518,12 @@ CmDeleteKey(IN PCM_KEY_BODY KeyBody) Hive = Kcb->KeyHive; Cell = Kcb->KeyCell; + /* Lock flushes */ + CmpLockHiveFlusherShared((PCMHIVE)Hive); + /* Get the key node */ Node = (PCM_KEY_NODE)HvGetCell(Hive, Cell); - if (!Node) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } + ASSERT(Node); /* Sanity check */ ASSERT(Node->Flags == Kcb->Flags); @@ -1287,11 +1532,17 @@ CmDeleteKey(IN PCM_KEY_BODY KeyBody) if (!(Node->SubKeyCounts[Stable] + Node->SubKeyCounts[Volatile]) && !(Node->Flags & KEY_NO_DELETE)) { + /* Send notification to registered callbacks */ + CmpReportNotify(Kcb, Hive, Cell, REG_NOTIFY_CHANGE_NAME); + /* Get the parent and free the cell */ ParentCell = Node->Parent; Status = CmpFreeKeyByCell(Hive, Cell, TRUE); if (NT_SUCCESS(Status)) { + /* Flush any notifications */ + CmpFlushNotifiesOnKeyBodyList(Kcb, FALSE); + /* Clean up information we have on the subkey */ CmpCleanUpSubKeyInfo(Kcb->ParentKcb); @@ -1327,10 +1578,12 @@ CmDeleteKey(IN PCM_KEY_BODY KeyBody) Status = STATUS_CANNOT_DELETE; } -Quickie: /* Release the cell */ HvReleaseCell(Hive, Cell); - + + /* Release flush lock */ + CmpUnlockHiveFlusher((PCMHIVE)Hive); + /* Release the KCB locks */ Quickie2: CmpReleaseTwoKcbLockByKey(Kcb->ConvKey, Kcb->ParentKcb->ConvKey); @@ -1364,12 +1617,36 @@ CmFlushKey(IN PCM_KEY_CONTROL_BLOCK Kcb, } else { + /* Don't touch the hive */ + CmpLockHiveFlusherExclusive(CmHive); + ASSERT(CmHive->ViewLock); + KeAcquireGuardedMutex(CmHive->ViewLock); + CmHive->ViewLockOwner = KeGetCurrentThread(); + + /* Will the hive shrink? */ + if (HvHiveWillShrink(Hive)) + { + /* I don't believe the current Hv does shrinking */ + ASSERT(FALSE); + } + else + { + /* Now we can release views */ + ASSERT(CmHive->ViewLock); + CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK_OR_LOADING(CmHive); + ASSERT(KeGetCurrentThread() == CmHive->ViewLockOwner); + KeReleaseGuardedMutex(CmHive->ViewLock); + } + /* Flush only this hive */ if (!HvSyncHive(Hive)) { /* Fail */ Status = STATUS_REGISTRY_IO_FAILED; } + + /* Release the flush lock */ + CmpUnlockHiveFlusher((PCMHIVE)Hive); } /* Return the status */ @@ -1387,8 +1664,9 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, SECURITY_CLIENT_CONTEXT ClientSecurityContext; HANDLE KeyHandle; BOOLEAN Allocate = TRUE; - PCMHIVE CmHive; + PCMHIVE CmHive, LoadedHive; NTSTATUS Status; + CM_PARSE_CONTEXT ParseContext; /* Check if we have a trust key */ if (KeyBody) @@ -1415,9 +1693,21 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, } /* Open the target key */ +#if 0 Status = ZwOpenKey(&KeyHandle, KEY_READ, TargetKey); +#else + RtlZeroMemory(&ParseContext, sizeof(ParseContext)); + ParseContext.CreateOperation = FALSE; + Status = ObOpenObjectByName(TargetKey, + CmpKeyObjectType, + KernelMode, + NULL, + KEY_READ, + &ParseContext, + &KeyHandle); +#endif if (!NT_SUCCESS(Status)) KeyHandle = NULL; - + /* Open the hive */ Status = CmpCmdHiveOpen(SourceFile, &ClientSecurityContext, @@ -1437,21 +1727,29 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, /* Lock the registry */ CmpLockRegistryExclusive(); - /* FIXME: Check if we are already loaded */ - + /* Check if we are already loaded */ + if (CmpIsHiveAlreadyLoaded(KeyHandle, SourceFile, &LoadedHive)) + { + /* That's okay then */ + ASSERT(LoadedHive); + Status = STATUS_SUCCESS; + } + /* Release the registry */ CmpUnlockRegistry(); } /* Close the key handle if we had one */ if (KeyHandle) ZwClose(KeyHandle); - DPRINT1("Failed: %lx\n", Status); return Status; } /* Lock the registry shared */ CmpLockRegistry(); + /* Lock loading */ + ExAcquirePushLockExclusive(&CmpLoadHiveLock); + /* Lock the hive to this thread */ CmHive->Hive.HiveFlags |= HIVE_IS_UNLOADING; CmHive->CreatorOwner = KeGetCurrentThread(); @@ -1467,23 +1765,37 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, TargetKey->SecurityDescriptor); if (NT_SUCCESS(Status)) { - /* FIXME: Add to HiveList key */ + /* Add to HiveList key */ + CmpAddToHiveFileList(CmHive); /* Sync the hive if necessary */ if (Allocate) { - /* Sync it */ + /* Sync it under the flusher lock */ + CmpLockHiveFlusherExclusive(CmHive); HvSyncHive(&CmHive->Hive); + CmpUnlockHiveFlusher(CmHive); } /* Release the hive */ CmHive->Hive.HiveFlags &= ~HIVE_IS_UNLOADING; CmHive->CreatorOwner = NULL; + + /* Allow loads */ + ExReleasePushLock(&CmpLoadHiveLock); } else { /* FIXME: TODO */ - + ASSERT(FALSE); + } + + /* Is this first profile load? */ + if (!(CmpProfileLoaded) && !(CmpWasSetupBoot)) + { + /* User is now logged on, set quotas */ + CmpProfileLoaded = TRUE; + CmpSetGlobalQuotaAllowed(); } /* Unlock the registry */ diff --git a/reactos/ntoskrnl/config/cmhvlist.c b/reactos/ntoskrnl/config/cmhvlist.c index f4e97814bbd..8fb2636f3dc 100644 --- a/reactos/ntoskrnl/config/cmhvlist.c +++ b/reactos/ntoskrnl/config/cmhvlist.c @@ -14,4 +14,11 @@ /* FUNCTIONS *****************************************************************/ +NTSTATUS +NTAPI +CmpAddToHiveFileList(IN PCMHIVE Hive) +{ + return STATUS_SUCCESS; +} + /* EOF */ \ No newline at end of file diff --git a/reactos/ntoskrnl/config/cminit.c b/reactos/ntoskrnl/config/cminit.c index 154ba1530b6..be7efc1660f 100644 --- a/reactos/ntoskrnl/config/cminit.c +++ b/reactos/ntoskrnl/config/cminit.c @@ -119,12 +119,10 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, if (!Hive->ViewLock) return STATUS_INSUFFICIENT_RESOURCES; /* Allocate the flush lock */ -#if 0 Hive->FlusherLock = ExAllocatePoolWithTag(NonPagedPool, sizeof(ERESOURCE), TAG_CM); if (!Hive->FlusherLock) return STATUS_INSUFFICIENT_RESOURCES; -#endif /* Setup the handles */ Hive->FileHandles[HFILE_TYPE_PRIMARY] = Primary; @@ -136,7 +134,7 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, Hive->ViewLockOwner = NULL; /* Initialize the flush lock */ - ExInitializePushLock((PULONG_PTR)&Hive->FlusherLock); + ExInitializeResourceLite(Hive->FlusherLock); /* Setup hive locks */ ExInitializePushLock((PULONG_PTR)&Hive->HiveLock); @@ -193,9 +191,7 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, { /* Clear allocations and fail */ ExFreePool(Hive->ViewLock); -#if 0 ExFreePool(Hive->FlusherLock); -#endif ExFreePool(Hive); return Status; } @@ -211,9 +207,7 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, { /* Free all alocations */ ExFreePool(Hive->ViewLock); -#if 0 ExFreePool(Hive->FlusherLock); -#endif ExFreePool(Hive); return STATUS_REGISTRY_CORRUPT; } diff --git a/reactos/ntoskrnl/config/cmkcbncb.c b/reactos/ntoskrnl/config/cmkcbncb.c index 5e7060d61c4..a26de07cf1b 100644 --- a/reactos/ntoskrnl/config/cmkcbncb.c +++ b/reactos/ntoskrnl/config/cmkcbncb.c @@ -1135,3 +1135,62 @@ DelistKeyBodyFromKCB(IN PCM_KEY_BODY KeyBody, /* Unlock it it if we did a manual lock */ if (!LockHeld) CmpReleaseKcbLock(KeyBody->KeyControlBlock); } + +VOID +NTAPI +CmpFlushNotifiesOnKeyBodyList(IN PCM_KEY_CONTROL_BLOCK Kcb, + IN BOOLEAN LockHeld) +{ + PLIST_ENTRY NextEntry, ListHead; + PCM_KEY_BODY KeyBody; + + /* Sanity check */ + LockHeld ? CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK() : CmpIsKcbLockedExclusive(Kcb); + while (TRUE) + { + /* Is the list empty? */ + ListHead = &Kcb->KeyBodyListHead; + if (!IsListEmpty(ListHead)) + { + /* Loop the list */ + NextEntry = ListHead->Flink; + while (NextEntry != ListHead) + { + /* Get the key body */ + KeyBody = CONTAINING_RECORD(NextEntry, CM_KEY_BODY, KeyBodyList); + ASSERT(KeyBody->Type == '20yk'); + + /* Check for notifications */ + if (KeyBody->NotifyBlock) + { + /* Is the lock held? */ + if (LockHeld) + { + /* Flush it */ + CmpFlushNotify(KeyBody, LockHeld); + ASSERT(KeyBody->NotifyBlock == NULL); + continue; + } + + /* Lock isn't held, so we need to take a reference */ + if (ObReferenceObjectSafe(KeyBody)) + { + /* Now we can flush */ + CmpFlushNotify(KeyBody, LockHeld); + ASSERT(KeyBody->NotifyBlock == NULL); + + /* Release the reference we took */ + ObDereferenceObjectDeferDelete(KeyBody); + continue; + } + } + + /* Try the next entry */ + NextEntry = NextEntry->Flink; + } + } + + /* List has been parsed, exit */ + break; + } +} diff --git a/reactos/ntoskrnl/config/cmparse.c b/reactos/ntoskrnl/config/cmparse.c index 42d737908a0..82635445dda 100644 --- a/reactos/ntoskrnl/config/cmparse.c +++ b/reactos/ntoskrnl/config/cmparse.c @@ -414,15 +414,6 @@ CmpDoCreate(IN PHHIVE Hive, LARGE_INTEGER TimeStamp; PCM_KEY_NODE KeyNode; - /* Sanity check */ -#if 0 - ASSERT((CmpIsKcbLockedExclusive(ParentKcb) == TRUE) || - (CmpTestRegistryLockExclusive() == TRUE)); -#endif - - /* Acquire the flusher lock */ - ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock); - /* Check if the parent is being deleted */ if (ParentKcb->Delete) { @@ -555,7 +546,6 @@ CmpDoCreate(IN PHHIVE Hive, Exit: /* Release the flusher lock and return status */ - ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock); return Status; } @@ -747,9 +737,6 @@ CmpCreateLinkNode(IN PHHIVE Hive, LARGE_INTEGER TimeStamp; PCM_KEY_NODE KeyNode; PCM_KEY_CONTROL_BLOCK Kcb = ParentKcb; -#if 0 - CMP_ASSERT_REGISTRY_LOCK(); -#endif /* Link nodes only allowed on the master */ if (Hive != &CmiVolatileHive->Hive) @@ -759,10 +746,6 @@ CmpCreateLinkNode(IN PHHIVE Hive, return STATUS_ACCESS_DENIED; } - /* Acquire the flusher locks */ - ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock); - ExAcquirePushLockShared((PVOID)&((PCMHIVE)Context->ChildHive.KeyHive)->FlusherLock); - /* Check if the parent is being deleted */ if (ParentKcb->Delete) { @@ -964,8 +947,6 @@ CmpCreateLinkNode(IN PHHIVE Hive, Exit: /* Release the flusher locks and return status */ - ExReleasePushLock((PVOID)&((PCMHIVE)Context->ChildHive.KeyHive)->FlusherLock); - ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock); return Status; } From 2b4f3854ddcd91129cb8f3a70e5d90b2ffe3393e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 3 Apr 2010 21:21:52 +0000 Subject: [PATCH 021/261] [NTOSKRNL] - Check access rights according to the DACL. Granted rights are removed from the remaining rights variable. - Return success only if there are no more remaining rights. Return failure otherwise. - Remove outdated code. svn path=/trunk/; revision=46703 --- reactos/ntoskrnl/se/semgr.c | 73 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 104c5de6ffd..6792180c5b5 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -389,7 +389,6 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PNTSTATUS AccessStatus) { LUID_AND_ATTRIBUTES Privilege; - ACCESS_MASK CurrentAccess, AccessMask; ACCESS_MASK RemainingAccess; ACCESS_MASK TempAccess; ACCESS_MASK TempGrantedAccess = 0; @@ -427,11 +426,9 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, if (PreviouslyGrantedAccess) RtlMapGenericMask(&PreviouslyGrantedAccess, GenericMapping); - - CurrentAccess = PreviouslyGrantedAccess; + /* Initialize remaining access rights */ RemainingAccess = DesiredAccess; - Token = SubjectSecurityContext->ClientToken ? SubjectSecurityContext->ClientToken : SubjectSecurityContext->PrimaryToken; @@ -488,13 +485,11 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { *GrantedAccess = DesiredAccess | PreviouslyGrantedAccess; } - + *AccessStatus = STATUS_SUCCESS; return TRUE; } - CurrentAccess = PreviouslyGrantedAccess; - /* RULE 2: Check token for 'take ownership' privilege */ if (DesiredAccess & WRITE_OWNER) { @@ -510,7 +505,6 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, /* Adjust access rights */ RemainingAccess &= ~WRITE_OWNER; PreviouslyGrantedAccess |= WRITE_OWNER; - CurrentAccess |= WRITE_OWNER; /* Succeed if there are no more rights to grant */ if (RemainingAccess == 0) @@ -547,7 +541,7 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return FALSE; } - /* Determine the MAXIMUM_ALLOWED access rights */ + /* Determine the MAXIMUM_ALLOWED access rights according to the DACL */ if (DesiredAccess & MAXIMUM_ALLOWED) { CurrentAce = (PACE)(Dacl + 1); @@ -583,7 +577,7 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); } - /* Get to the next ACE */ + /* Get the next ACE */ CurrentAce = (PACE)((ULONG_PTR)CurrentAce + CurrentAce->Header.AceSize); } @@ -619,48 +613,61 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { if (SepSidInToken(Token, Sid)) { - *GrantedAccess = 0; - *AccessStatus = STATUS_ACCESS_DENIED; - return FALSE; + /* Map access rights from the ACE */ + TempAccess = CurrentAce->AccessMask; + RtlMapGenericMask(&TempAccess, GenericMapping); + + /* Leave if a remaining right must be denied */ + if (RemainingAccess & TempAccess) + break; } } - else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) { if (SepSidInToken(Token, Sid)) { - AccessMask = CurrentAce->AccessMask; - RtlMapGenericMask(&AccessMask, GenericMapping); - CurrentAccess |= AccessMask; + /* Map access rights from the ACE */ + TempAccess = CurrentAce->AccessMask; + RtlMapGenericMask(&TempAccess, GenericMapping); + + /* Remove granted rights */ + RemainingAccess &= ~TempAccess; } } else { DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); } + + /* Get the next ACE */ CurrentAce = (PACE)((ULONG_PTR)CurrentAce + CurrentAce->Header.AceSize); } - DPRINT("CurrentAccess %08lx\n DesiredAccess %08lx\n", - CurrentAccess, DesiredAccess); + DPRINT("DesiredAccess %08lx\nPreviouslyGrantedAccess %08lx\nRemainingAccess %08lx\n", + DesiredAccess, PreviouslyGrantedAccess, RemainingAccess); - *GrantedAccess = CurrentAccess & DesiredAccess; + /* Fail if some rights have not been granted */ + if (RemainingAccess != 0) + { + *GrantedAccess = 0; + *AccessStatus = STATUS_ACCESS_DENIED; + return FALSE; + } - if ((*GrantedAccess & ~VALID_INHERIT_FLAGS) == - (DesiredAccess & ~VALID_INHERIT_FLAGS)) + /* Set granted access rights */ + *GrantedAccess = DesiredAccess | PreviouslyGrantedAccess; + + DPRINT("GrantedAccess %08lx\n", *GrantedAccess); + + /* Fail if no rights have been granted */ + if (*GrantedAccess == 0) { - *AccessStatus = STATUS_SUCCESS; - return TRUE; - } - else - { - DPRINT1("HACK: Should deny access for caller: granted 0x%lx, desired 0x%lx (generic mapping %p).\n", - *GrantedAccess, DesiredAccess, GenericMapping); - //*AccessStatus = STATUS_ACCESS_DENIED; - //return FALSE; - *AccessStatus = STATUS_SUCCESS; - return TRUE; + *AccessStatus = STATUS_ACCESS_DENIED; + return FALSE; } + + *AccessStatus = STATUS_SUCCESS; + return TRUE; } static PSID From 05799d4a578f6a06c1e7e2e94d0a7a05d283e22c Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 3 Apr 2010 22:05:03 +0000 Subject: [PATCH 022/261] [Gdi32] - Adding batch support for ExtSelectClipRgn and update to the batch object structure. svn path=/trunk/; revision=46705 --- reactos/dll/win32/gdi32/objects/region.c | 108 +++++++++++++++++++++- reactos/include/reactos/win32k/ntgdityp.h | 5 +- 2 files changed, 105 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/gdi32/objects/region.c b/reactos/dll/win32/gdi32/objects/region.c index e1f187ad3d2..3e2b7fe5b65 100644 --- a/reactos/dll/win32/gdi32/objects/region.c +++ b/reactos/dll/win32/gdi32/objects/region.c @@ -104,7 +104,6 @@ BOOL FASTCALL DeleteRegion( HRGN hRgn ) { -//#if 0 PRGN_ATTR Rgn_Attr; if ((GdiGetHandleUserData((HGDIOBJ) hRgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr)) && @@ -128,7 +127,6 @@ DeleteRegion( HRGN hRgn ) } } } -//#endif return NtGdiDeleteObjectApp((HGDIOBJ) hRgn); } @@ -581,8 +579,110 @@ INT WINAPI ExtSelectClipRgn( IN HDC hdc, IN HRGN hrgn, IN INT iMode) { - /* FIXME some part need be done on user mode size */ - return NtGdiExtSelectClipRgn(hdc,hrgn, iMode); + INT Ret; + HRGN NewRgn = NULL; + +#if 0 +// Handle something other than a normal dc object. + if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) + { + if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) + return MFDRV_ExtSelectClipRgn( hdc, ); + else + { + PLDC pLDC = GdiGetLDC(hdc); + if ( pLDC ) + { + if (pLDC->iType != LDC_EMFLDC || EMFDRV_ExtSelectClipRgn( hdc, )) + return NtGdiExtSelectClipRgn(hdc, ); + } + else + SetLastError(ERROR_INVALID_HANDLE); + return ERROR; + } + } +#endif +#if 0 + if ( hrgn ) + { + if ( GetLayout(hdc) & LAYOUT_RTL ) + { + if ( MirrorRgnDC(hdc, hrgn, &NewRgn) ) + { + if ( NewRgn ) hrgn = NewRgn; + } + } + } +#endif + /* Batch handles RGN_COPY only! */ + if (iMode == RGN_COPY) + { +#if 0 + PDC_ATTR pDc_Attr; + PRGN_ATTR pRgn_Attr = NULL; + + /* hrgn can be NULL unless the RGN_COPY mode is specified. */ + if (hrgn) + GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr); + + if ( GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &pDc_Attr) && + pDc_Attr ) + { + PGDI_TABLE_ENTRY pEntry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hdc); + PTEB pTeb = NtCurrentTeb(); + + if ( pTeb->Win32ThreadInfo != NULL && + pTeb->GdiTebBatch.HDC == hdc && + !(pDc_Attr->ulDirty_ & DC_DIBSECTION) && + !(pEntry->Flags & GDI_ENTRY_VALIDATE_VIS) ) + { + if (!hrgn || + (hrgn && pRgn_Attr && pRgn_Attr->Flags <= SIMPLEREGION) ) + { + if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSEXTSELCLPRGN)) <= GDIBATCHBUFSIZE) + { + PGDIBSEXTSELCLPRGN pgO = (PGDIBSEXTSELCLPRGN)(&pTeb->GdiTebBatch.Buffer[0] + + pTeb->GdiTebBatch.Offset); + pgO->gbHdr.Cmd = GdiBCExtSelClipRgn; + pgO->gbHdr.Size = sizeof(GDIBSEXTSELCLPRGN); + pgO->fnMode = iMode; + + if ( hrgn && pRgn_Attr ) + { + Ret = pRgn_Attr->Flags; + + if ( pDc_Attr->VisRectRegion.Rect.left >= pRgn_Attr->Rect.right || + pDc_Attr->VisRectRegion.Rect.top >= pRgn_Attr->Rect.bottom || + pDc_Attr->VisRectRegion.Rect.right <= pRgn_Attr->Rect.left || + pDc_Attr->VisRectRegion.Rect.bottom <= pRgn_Attr->Rect.top ) + Ret = NULLREGION; + + pgO->left = pRgn_Attr->Rect.left; + pgO->top = pRgn_Attr->Rect.top; + pgO->right = pRgn_Attr->Rect.right; + pgO->bottom = pRgn_Attr->Rect.bottom; + } + else + { + Ret = pDc_Attr->VisRectRegion.Flags; + pgO->fnMode |= 0x80000000; // Set no hrgn mode. + } + pTeb->GdiTebBatch.Offset += sizeof(GDIBSEXTSELCLPRGN); + pTeb->GdiBatchCount++; + if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); + if ( NewRgn ) DeleteObject(NewRgn); + return Ret; + } + } + } + } +#endif + } + Ret = NtGdiExtSelectClipRgn(hdc, hrgn, iMode); + + if ( NewRgn ) DeleteObject(NewRgn); + + return Ret; } /* diff --git a/reactos/include/reactos/win32k/ntgdityp.h b/reactos/include/reactos/win32k/ntgdityp.h index 2e710ca6bdf..1aedf765dbc 100644 --- a/reactos/include/reactos/win32k/ntgdityp.h +++ b/reactos/include/reactos/win32k/ntgdityp.h @@ -523,10 +523,7 @@ typedef struct _GDIBSEXTSELCLPRGN { GDIBATCHHDR gbHdr; int fnMode; - LONG right; - LONG bottom; - LONG left; - LONG top; + RECTL; } GDIBSEXTSELCLPRGN, *PGDIBSEXTSELCLPRGN; // // Use with GdiBCSelObj, GdiBCDelObj and GdiBCDelRgn. From d6d462f2039416db48768b9dcec7c498f7dc5aa2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 00:00:21 +0000 Subject: [PATCH 023/261] [PCI] - Handle IRP_MN_QUERY_DEVICE_RELATIONS for TargetDeviceRelation for PCI's child PDOs svn path=/trunk/; revision=46706 --- reactos/drivers/bus/pci/pdo.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index 27cd878b9c3..6fde92e8311 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -1290,6 +1290,33 @@ PdoWriteConfig( return STATUS_SUCCESS; } +static NTSTATUS +PdoQueryDeviceRelations( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PDEVICE_RELATIONS DeviceRelations; + + /* We only support TargetDeviceRelation for child PDOs */ + if (IrpSp->Parameters.QueryDeviceRelations.Type != TargetDeviceRelation) + return Irp->IoStatus.Status; + + /* We can do this because we only return 1 PDO for TargetDeviceRelation */ + DeviceRelations = ExAllocatePool(PagedPool, sizeof(*DeviceRelations)); + if (!DeviceRelations) + return STATUS_INSUFFICIENT_RESOURCES; + + DeviceRelations->Count = 1; + DeviceRelations->Objects[0] = DeviceObject; + + /* The PnP manager will remove this when it is done with the PDO */ + ObReferenceObject(DeviceObject); + + Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations; + + return STATUS_SUCCESS; +} static NTSTATUS PdoSetPower( @@ -1362,8 +1389,7 @@ PdoPnpControl( break; case IRP_MN_QUERY_DEVICE_RELATIONS: - /* FIXME: Possibly handle for RemovalRelations */ - DPRINT("Unimplemented IRP_MN_QUERY_DEVICE_RELATIONS received\n"); + Status = PdoQueryDeviceRelations(DeviceObject, Irp, IrpSp); break; case IRP_MN_QUERY_DEVICE_TEXT: From 28971e63f31043bbeff77bd829c65c21da43767f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 00:33:19 +0000 Subject: [PATCH 024/261] [NTOSKRNL] - Pass IRPs down to the root PDO if we don't handle it - Don't complain if we get an IRP that we don't expect. We are the parent bus driver for the device so we are responsible for completing those IRPs. svn path=/trunk/; revision=46707 --- reactos/ntoskrnl/io/pnpmgr/pnproot.c | 74 ++++++++++------------------ 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnproot.c b/reactos/ntoskrnl/io/pnpmgr/pnproot.c index a5fa2a04f0c..80a1662b791 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnproot.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnproot.c @@ -677,27 +677,26 @@ PnpRootFdoPnpControl( if (NT_SUCCESS(Status)) DeviceExtension->State = dsStarted; } - break; + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; case IRP_MN_STOP_DEVICE: DPRINT("IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n"); /* Root device cannot be stopped */ - Status = STATUS_NOT_SUPPORTED; - break; + Irp->IoStatus.Status = Status = STATUS_INVALID_DEVICE_REQUEST; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; default: DPRINT("IRP_MJ_PNP / Unknown minor function 0x%lx\n", IrpSp->MinorFunction); - Status = STATUS_NOT_IMPLEMENTED; break; } - if (Status != STATUS_PENDING) - { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - return Status; + /* Pass this IRP down to the root device PDO */ + IoSkipCurrentIrpStackLocation(Irp); + return IoCallDriver(DeviceExtension->Ldo, Irp); } static NTSTATUS @@ -707,48 +706,25 @@ PdoQueryDeviceRelations( IN PIO_STACK_LOCATION IrpSp) { PDEVICE_RELATIONS Relations; - DEVICE_RELATION_TYPE RelationType; NTSTATUS Status = Irp->IoStatus.Status; - RelationType = IrpSp->Parameters.QueryDeviceRelations.Type; + if (IrpSp->Parameters.QueryDeviceRelations.Type != TargetDeviceRelation) + return Status; - switch (RelationType) + DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n"); + Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); + if (!Relations) { - /* FIXME: remove */ - case BusRelations: - { - if (IoGetAttachedDevice(DeviceObject) != DeviceObject) - { - /* We're not alone in the stack */ - DPRINT1("PnP is misbehaving ; don't know how to handle IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n"); - } - break; - } - - case TargetDeviceRelation: - { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n"); - Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); - if (!Relations) - { - DPRINT("ExAllocatePoolWithTag() failed\n"); - Status = STATUS_NO_MEMORY; - } - else - { - ObReferenceObject(DeviceObject); - Relations->Count = 1; - Relations->Objects[0] = DeviceObject; - Status = STATUS_SUCCESS; - Irp->IoStatus.Information = (ULONG_PTR)Relations; - } - break; - } - - default: - { - DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / unknown relation type 0x%lx\n", RelationType); - } + DPRINT("ExAllocatePoolWithTag() failed\n"); + Status = STATUS_NO_MEMORY; + } + else + { + ObReferenceObject(DeviceObject); + Relations->Count = 1; + Relations->Objects[0] = DeviceObject; + Status = STATUS_SUCCESS; + Irp->IoStatus.Information = (ULONG_PTR)Relations; } return Status; From e90ce939a6be799d1a54b900ca56c754431a9427 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 01:18:41 +0000 Subject: [PATCH 025/261] [NTOSKRNL] - Revert part of r46707 - Remove a hack in PnpRoot that assembled a CM_RESOURCE_LIST from a CM_PARTIAL_RESOURCE_DESCRIPTOR but also corrupted proper resource lists (such as from detected devices in IoReportDetectedDevice) - Add a simple resource arbiter that finds an unused resource in the range provided in the resource requirements list. It's not perfect but it's a start. - Start enforcing resource conflicts - Fix incorrect code that was writing a CM_PARTIAL_RESOURCE_DESCRIPTOR instead of a CM_RESOURCE_LIST (the hack above was compensating for this) which result in BootConfig being a REG_PARTIAL_RESOURCE_DESCRIPTOR type on certain devices and a REG_RESOURCE_LIST on others - Fix a broken check for no partial resource descriptors svn path=/trunk/; revision=46708 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 748 ++++++++++++++++++--------- reactos/ntoskrnl/io/pnpmgr/pnproot.c | 18 +- 2 files changed, 506 insertions(+), 260 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 44283968d0c..b6241070fbf 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -1005,137 +1005,183 @@ IopSetDeviceInstanceData(HANDLE InstanceKey, } BOOLEAN -IopCheckForResourceConflict( - IN PCM_RESOURCE_LIST ResourceList1, - IN PCM_RESOURCE_LIST ResourceList2) +IopCheckResourceDescriptor( + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc, + IN PCM_RESOURCE_LIST ResourceList, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) { - ULONG i1, i2, ii1, ii2; + ULONG i, ii; BOOLEAN Result = FALSE; - for (i1 = 0; i1 < ResourceList1->Count; i1++) + if (ResDesc->ShareDisposition == CmResourceShareShared) + return FALSE; + + for (i = 0; i < ResourceList->Count; i++) { - PCM_PARTIAL_RESOURCE_LIST ResList1 = &ResourceList1->List[i1].PartialResourceList; - for (i2 = 0; i2 < ResourceList2->Count; i2++) + PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList; + for (ii = 0; ii < ResList->Count; ii++) { - PCM_PARTIAL_RESOURCE_LIST ResList2 = &ResourceList2->List[i2].PartialResourceList; - for (ii1 = 0; ii1 < ResList1->Count; ii1++) + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList->PartialDescriptors[ii]; + + /* We don't care about shared resources */ + if (ResDesc->ShareDisposition == CmResourceShareShared && + ResDesc2->ShareDisposition == CmResourceShareShared) + continue; + + /* Make sure we're comparing the same types */ + if (ResDesc->Type != ResDesc2->Type) + continue; + + switch (ResDesc->Type) { - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc1 = &ResList1->PartialDescriptors[ii1]; - - if (ResDesc1->ShareDisposition == CmResourceShareShared) - continue; - - for (ii2 = 0; ii2 < ResList2->Count; ii2++) - { - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList2->PartialDescriptors[ii2]; - - /* We don't care about shared resources */ - if (ResDesc2->ShareDisposition == CmResourceShareShared) - continue; - - /* Make sure we're comparing the same types */ - if (ResDesc1->Type != ResDesc2->Type) - continue; - - switch (ResDesc1->Type) - { - case CmResourceTypeMemory: - if ((ResDesc1->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && - ResDesc1->u.Memory.Start.QuadPart + ResDesc1->u.Memory.Length > - ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < - ResDesc1->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + - ResDesc2->u.Memory.Length > ResDesc1->u.Memory.Start.QuadPart)) + case CmResourceTypeMemory: + if ((ResDesc->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && + ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length > + ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < + ResDesc->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + + ResDesc2->u.Memory.Length > ResDesc->u.Memory.Start.QuadPart)) + { + if (!Silent) { DPRINT1("Resource conflict: Memory (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc1->u.Memory.Start.QuadPart, ResDesc1->u.Memory.Start.QuadPart + - ResDesc1->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart, + ResDesc->u.Memory.Start.QuadPart, ResDesc->u.Memory.Start.QuadPart + + ResDesc->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart, ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length); - - Result = TRUE; - - goto ByeBye; } - break; - case CmResourceTypePort: - if ((ResDesc1->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && - ResDesc1->u.Port.Start.QuadPart + ResDesc1->u.Port.Length > - ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < - ResDesc1->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + - ResDesc2->u.Port.Length > ResDesc1->u.Port.Start.QuadPart)) + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypePort: + if ((ResDesc->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && + ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length > + ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < + ResDesc->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + + ResDesc2->u.Port.Length > ResDesc->u.Port.Start.QuadPart)) + { + if (!Silent) { DPRINT1("Resource conflict: Port (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc1->u.Port.Start.QuadPart, ResDesc1->u.Port.Start.QuadPart + - ResDesc1->u.Port.Length, ResDesc2->u.Port.Start.QuadPart, + ResDesc->u.Port.Start.QuadPart, ResDesc->u.Port.Start.QuadPart + + ResDesc->u.Port.Length, ResDesc2->u.Port.Start.QuadPart, ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length); - - Result = TRUE; - - goto ByeBye; } - break; - case CmResourceTypeInterrupt: - if (ResDesc1->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector) + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeInterrupt: + if (ResDesc->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector) + { + if (!Silent) { - DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n", - ResDesc1->u.Interrupt.Vector, ResDesc1->u.Interrupt.Level, - ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level); - - Result = TRUE; - - goto ByeBye; + DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n", + ResDesc->u.Interrupt.Vector, ResDesc->u.Interrupt.Level, + ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level); } - break; - case CmResourceTypeBusNumber: - if ((ResDesc1->u.BusNumber.Start < ResDesc2->u.BusNumber.Start && - ResDesc1->u.BusNumber.Start + ResDesc1->u.BusNumber.Length > - ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start < - ResDesc1->u.BusNumber.Start && ResDesc2->u.BusNumber.Start + - ResDesc2->u.BusNumber.Length > ResDesc1->u.BusNumber.Start)) + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeBusNumber: + if ((ResDesc->u.BusNumber.Start < ResDesc2->u.BusNumber.Start && + ResDesc->u.BusNumber.Start + ResDesc->u.BusNumber.Length > + ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start < + ResDesc->u.BusNumber.Start && ResDesc2->u.BusNumber.Start + + ResDesc2->u.BusNumber.Length > ResDesc->u.BusNumber.Start)) + { + if (!Silent) { - DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc1->u.BusNumber.Start, ResDesc1->u.BusNumber.Start + - ResDesc1->u.BusNumber.Length, ResDesc2->u.BusNumber.Start, + DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc->u.BusNumber.Start, ResDesc->u.BusNumber.Start + + ResDesc->u.BusNumber.Length, ResDesc2->u.BusNumber.Start, ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length); - - Result = TRUE; - - goto ByeBye; } - break; - case CmResourceTypeDma: - if (ResDesc1->u.Dma.Channel == ResDesc2->u.Dma.Channel) - { + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeDma: + if (ResDesc->u.Dma.Channel == ResDesc2->u.Dma.Channel) + { + if (!Silent) + { DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n", - ResDesc1->u.Dma.Channel, ResDesc1->u.Dma.Port, + ResDesc->u.Dma.Channel, ResDesc->u.Dma.Port, ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port); + } - Result = TRUE; + Result = TRUE; - goto ByeBye; - } - break; - } - } + goto ByeBye; + } + break; } } } ByeBye: -#ifdef ENABLE_RESOURCE_CONFLICT_DETECTION + if (Result && ConflictingDescriptor) + { + RtlCopyMemory(ConflictingDescriptor, + ResDesc, + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); + } + + return Result; +} + + +BOOLEAN +IopCheckForResourceConflict( + IN PCM_RESOURCE_LIST ResourceList1, + IN PCM_RESOURCE_LIST ResourceList2, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + ULONG i, ii; + BOOLEAN Result = FALSE; + + for (i = 0; i < ResourceList1->Count; i++) + { + PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList1->List[i].PartialResourceList; + for (ii = 0; ii < ResList->Count; ii++) + { + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc = &ResList->PartialDescriptors[ii]; + + Result = IopCheckResourceDescriptor(ResDesc, + ResourceList2, + Silent, + ConflictingDescriptor); + if (Result) goto ByeBye; + } + } + + +ByeBye: + return Result; -#else - return FALSE; -#endif } NTSTATUS IopDetectResourceConflict( - IN PCM_RESOURCE_LIST ResourceList) + IN PCM_RESOURCE_LIST ResourceList, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING KeyName; @@ -1321,7 +1367,9 @@ IopDetectResourceConflict( ExFreePool(KeyNameInformation); if (IopCheckForResourceConflict(ResourceList, - (PCM_RESOURCE_LIST)KeyValueInformation->Data)) + (PCM_RESOURCE_LIST)KeyValueInformation->Data, + Silent, + ConflictingDescriptor)) { ExFreePool(KeyValueInformation); Status = STATUS_CONFLICTING_ADDRESSES; @@ -1346,19 +1394,312 @@ cleanup: return Status; } - + +BOOLEAN +IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + CM_RESOURCE_LIST CmList; + NTSTATUS Status; + + CmList.Count = 1; + CmList.List[0].InterfaceType = InterfaceTypeUndefined; + CmList.List[0].BusNumber = 0; + CmList.List[0].PartialResourceList.Version = 1; + CmList.List[0].PartialResourceList.Revision = 1; + CmList.List[0].PartialResourceList.Count = 1; + CmList.List[0].PartialResourceList.PartialDescriptors[0] = *CmDesc; + + Status = IopDetectResourceConflict(&CmList, TRUE, ConflictingDescriptor); + if (Status == STATUS_CONFLICTING_ADDRESSES) + return TRUE; + + return FALSE; +} + +BOOLEAN +IopFindBusNumberResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeBusNumber); + + for (Start = IoDesc->u.BusNumber.MinBusNumber; + Start < IoDesc->u.BusNumber.MaxBusNumber; + Start++) + { + CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length; + CmDesc->u.BusNumber.Start = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.BusNumber.Start + ConflictingDesc.u.BusNumber.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +BOOLEAN +IopFindMemoryResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONGLONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeMemory); + + for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart; + Start < IoDesc->u.Memory.MaximumAddress.QuadPart; + Start++) + { + CmDesc->u.Memory.Length = IoDesc->u.Memory.Length; + CmDesc->u.Memory.Start.QuadPart = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.Memory.Start.QuadPart + ConflictingDesc.u.Memory.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +BOOLEAN +IopFindPortResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONGLONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypePort); + + for (Start = IoDesc->u.Port.MinimumAddress.QuadPart; + Start < IoDesc->u.Port.MaximumAddress.QuadPart; + Start++) + { + CmDesc->u.Port.Length = IoDesc->u.Port.Length; + CmDesc->u.Port.Start.QuadPart = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.Port.Start.QuadPart + ConflictingDesc.u.Port.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +BOOLEAN +IopFindDmaResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Channel; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeDma); + + for (Channel = IoDesc->u.Dma.MinimumChannel; + Channel < IoDesc->u.Dma.MaximumChannel; + Channel++) + { + CmDesc->u.Dma.Channel = Channel; + CmDesc->u.Dma.Port = 0; + + if (!IopCheckDescriptorForConflict(CmDesc, NULL)) + return TRUE; + } + + return FALSE; +} + +BOOLEAN +IopFindInterruptResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Vector; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeInterrupt); + + for (Vector = IoDesc->u.Interrupt.MinimumVector; + Vector < IoDesc->u.Interrupt.MaximumVector; + Vector++) + { + CmDesc->u.Interrupt.Vector = Vector; + CmDesc->u.Interrupt.Level = Vector; + CmDesc->u.Interrupt.Affinity = (KAFFINITY)-1; + + if (!IopCheckDescriptorForConflict(CmDesc, NULL)) + return TRUE; + } + + return FALSE; +} + +NTSTATUS +IopCreateResourceListFromRequirements( + IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, + OUT PCM_RESOURCE_LIST *ResourceList) +{ + ULONG i, ii, Size; + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc; + + Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); + for (i = 0; i < RequirementsList->AlternativeLists; i++) + { + PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + } + + DPRINT1("Allocating resource list: %d\n", Size); + *ResourceList = ExAllocatePool(PagedPool, Size); + if (!*ResourceList) + return STATUS_INSUFFICIENT_RESOURCES; + + (*ResourceList)->Count = 1; + (*ResourceList)->List[0].BusNumber = RequirementsList->BusNumber; + (*ResourceList)->List[0].InterfaceType = RequirementsList->InterfaceType; + (*ResourceList)->List[0].PartialResourceList.Version = 1; + (*ResourceList)->List[0].PartialResourceList.Revision = 1; + (*ResourceList)->List[0].PartialResourceList.Count = 0; + + ResDesc = &(*ResourceList)->List[0].PartialResourceList.PartialDescriptors[0]; + + for (i = 0; i < RequirementsList->AlternativeLists; i++) + { + PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; + for (ii = 0; ii < ResList->Count; ii++) + { + PIO_RESOURCE_DESCRIPTOR ReqDesc = &ResList->Descriptors[ii]; + + /* FIXME: Handle alternate ranges */ + if (ReqDesc->Option == IO_RESOURCE_ALTERNATIVE) + continue; + + ResDesc->Type = ReqDesc->Type; + ResDesc->Flags = ReqDesc->Flags; + ResDesc->ShareDisposition = ReqDesc->ShareDisposition; + + switch (ReqDesc->Type) + { + case CmResourceTypeInterrupt: + if (!IopFindInterruptResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available interrupt resource (0x%x to 0x%x)\n", + ReqDesc->u.Interrupt.MinimumVector, ReqDesc->u.Interrupt.MaximumVector); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypePort: + if (!IopFindPortResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available port resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.Port.MinimumAddress.QuadPart, ReqDesc->u.Port.MaximumAddress.QuadPart, + ReqDesc->u.Port.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeMemory: + if (!IopFindMemoryResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available memory resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.Memory.MinimumAddress.QuadPart, ReqDesc->u.Memory.MaximumAddress.QuadPart, + ReqDesc->u.Memory.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeBusNumber: + if (!IopFindBusNumberResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available bus number resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.BusNumber.MinBusNumber, ReqDesc->u.BusNumber.MaxBusNumber, + ReqDesc->u.BusNumber.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeDma: + if (!IopFindDmaResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available dma resource (0x%x to 0x%x)\n", + ReqDesc->u.Dma.MinimumChannel, ReqDesc->u.Dma.MaximumChannel); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + default: + DPRINT1("Unsupported resource type: %x\n", ReqDesc->Type); + break; + } + + (*ResourceList)->List[0].PartialResourceList.Count++; + ResDesc++; + } + } + + return STATUS_SUCCESS; +} + NTSTATUS IopAssignDeviceResources( IN PDEVICE_NODE DeviceNode, OUT ULONG *pRequiredSize) { - PIO_RESOURCE_LIST ResourceList; - PIO_RESOURCE_DESCRIPTOR ResourceDescriptor; - PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw; PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; - ULONG NumberOfResources = 0; ULONG Size; - ULONG i, j; + ULONG i; + ULONG j; NTSTATUS Status; if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) @@ -1371,7 +1712,7 @@ IopAssignDeviceResources( /* Fill DeviceNode->ResourceList * FIXME: the PnP arbiter should go there! - * Actually, use the BootResources if provided, else the resource list #0 + * Actually, use the BootResources if provided, else the resource requirements */ if (DeviceNode->BootResources) @@ -1398,161 +1739,38 @@ IopAssignDeviceResources( } RtlCopyMemory(DeviceNode->ResourceList, DeviceNode->BootResources, Size); - Status = IopDetectResourceConflict(DeviceNode->ResourceList); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - *pRequiredSize = Size; - return STATUS_SUCCESS; - } - - /* Ok, here, we have to use the device requirement list */ - ResourceList = &DeviceNode->ResourceRequirements->List[0]; - if (ResourceList->Version != 1 || ResourceList->Revision != 1) - { - Status = STATUS_REVISION_MISMATCH; - goto ByeBye; - } - - Size = sizeof(CM_RESOURCE_LIST) + ResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - DeviceNode->ResourceList = ExAllocatePool(PagedPool, Size); - if (!DeviceNode->ResourceList) - { - Status = STATUS_NO_MEMORY; - goto ByeBye; - } - - DeviceNode->ResourceList->Count = 1; - DeviceNode->ResourceList->List[0].InterfaceType = DeviceNode->ResourceRequirements->InterfaceType; - DeviceNode->ResourceList->List[0].BusNumber = DeviceNode->ResourceRequirements->BusNumber; - DeviceNode->ResourceList->List[0].PartialResourceList.Version = 1; - DeviceNode->ResourceList->List[0].PartialResourceList.Revision = 1; - - for (i = 0; i < ResourceList->Count; i++) - { - ResourceDescriptor = &ResourceList->Descriptors[i]; - - if (ResourceDescriptor->Option == 0 || ResourceDescriptor->Option == IO_RESOURCE_PREFERRED) + Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); + if (NT_SUCCESS(Status) || !DeviceNode->ResourceRequirements) { - DescriptorRaw = &DeviceNode->ResourceList->List[0].PartialResourceList.PartialDescriptors[NumberOfResources]; - NumberOfResources++; + if (!NT_SUCCESS(Status) && !DeviceNode->ResourceRequirements) + { + DPRINT1("Using conflicting boot resources because no requirements were supplied!\n"); + } - /* Copy ResourceDescriptor to DescriptorRaw and DescriptorTranslated */ - DescriptorRaw->Type = ResourceDescriptor->Type; - DescriptorRaw->ShareDisposition = ResourceDescriptor->ShareDisposition; - DescriptorRaw->Flags = ResourceDescriptor->Flags; - switch (ResourceDescriptor->Type) - { - case CmResourceTypePort: - { - DescriptorRaw->u.Port.Start = ResourceDescriptor->u.Port.MinimumAddress; - DescriptorRaw->u.Port.Length = ResourceDescriptor->u.Port.Length; - break; - } - case CmResourceTypeInterrupt: - { - INTERFACE_TYPE BusType; - ULONG SlotNumber; - ULONG ret; - UCHAR Irq; - - DescriptorRaw->u.Interrupt.Level = 0; - DescriptorRaw->u.Interrupt.Vector = ResourceDescriptor->u.Interrupt.MinimumVector; - /* FIXME: HACK: if we have a PCI device, we try - * to keep the IRQ assigned by the BIOS */ - if (NT_SUCCESS(IoGetDeviceProperty( - DeviceNode->PhysicalDeviceObject, - DevicePropertyLegacyBusType, - sizeof(INTERFACE_TYPE), - &BusType, - &ret)) && BusType == PCIBus) - { - /* We have a PCI bus */ - if (NT_SUCCESS(IoGetDeviceProperty( - DeviceNode->PhysicalDeviceObject, - DevicePropertyAddress, - sizeof(ULONG), - &SlotNumber, - &ret)) && SlotNumber > 0) - { - /* We have a good slot number */ - ret = HalGetBusDataByOffset(PCIConfiguration, - DeviceNode->ResourceRequirements->BusNumber, - SlotNumber, - &Irq, - 0x3c /* PCI_INTERRUPT_LINE */, - sizeof(UCHAR)); - if (ret != 0 && ret != 2 - && ResourceDescriptor->u.Interrupt.MinimumVector <= Irq - && ResourceDescriptor->u.Interrupt.MaximumVector >= Irq) - { - /* The device already has an assigned IRQ */ - DescriptorRaw->u.Interrupt.Vector = Irq; - } - else - { - DPRINT1("Trying to assign IRQ 0x%lx to %wZ\n", - DescriptorRaw->u.Interrupt.Vector, - &DeviceNode->InstancePath); - Irq = (UCHAR)DescriptorRaw->u.Interrupt.Vector; - ret = HalSetBusDataByOffset(PCIConfiguration, - DeviceNode->ResourceRequirements->BusNumber, - SlotNumber, - &Irq, - 0x3c /* PCI_INTERRUPT_LINE */, - sizeof(UCHAR)); - if (ret == 0 || ret == 2) - ASSERT(FALSE); - } - } - } - break; - } - case CmResourceTypeMemory: - { - DescriptorRaw->u.Memory.Start = ResourceDescriptor->u.Memory.MinimumAddress; - DescriptorRaw->u.Memory.Length = ResourceDescriptor->u.Memory.Length; - break; - } - case CmResourceTypeDma: - { - DescriptorRaw->u.Dma.Channel = ResourceDescriptor->u.Dma.MinimumChannel; - DescriptorRaw->u.Dma.Port = 0; /* FIXME */ - DescriptorRaw->u.Dma.Reserved1 = 0; - break; - } - case CmResourceTypeBusNumber: - { - DescriptorRaw->u.BusNumber.Start = ResourceDescriptor->u.BusNumber.MinBusNumber; - DescriptorRaw->u.BusNumber.Length = ResourceDescriptor->u.BusNumber.Length; - DescriptorRaw->u.BusNumber.Reserved = ResourceDescriptor->u.BusNumber.Reserved; - break; - } - /*CmResourceTypeDevicePrivate: - case CmResourceTypePcCardConfig: - case CmResourceTypeMfCardConfig: - { - RtlCopyMemory( - &DescriptorRaw->u.DevicePrivate, - &ResourceDescriptor->u.DevicePrivate, - sizeof(ResourceDescriptor->u.DevicePrivate)); - RtlCopyMemory( - &DescriptorTranslated->u.DevicePrivate, - &ResourceDescriptor->u.DevicePrivate, - sizeof(ResourceDescriptor->u.DevicePrivate)); - break; - }*/ - default: - DPRINT1("IopAssignDeviceResources(): unknown resource descriptor type 0x%x\n", ResourceDescriptor->Type); - NumberOfResources--; - } + *pRequiredSize = Size; + return STATUS_SUCCESS; + } + else + { + DPRINT1("Boot resources for %wZ cause a resource conflict!\n", &DeviceNode->InstancePath); + ExFreePool(DeviceNode->ResourceList); } - } - DeviceNode->ResourceList->List[0].PartialResourceList.Count = NumberOfResources; + Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements, + &DeviceNode->ResourceList); + if (!NT_SUCCESS(Status)) + goto ByeBye; - Status = IopDetectResourceConflict(DeviceNode->ResourceList); + Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); + for (i = 0; i < DeviceNode->ResourceList->Count; i++) + { + pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + } + + Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); if (!NT_SUCCESS(Status)) goto ByeBye; @@ -2744,6 +2962,8 @@ IopEnumerateDetectedDevices( PUNICODE_STRING pHardwareId; ULONG DeviceIndex = 0; BOOLEAN IsDeviceDesc; + PUCHAR CmResourceList; + ULONG ListCount; if (RelativePath) { @@ -2858,7 +3078,7 @@ IopEnumerateDetectedDevices( DPRINT("ExAllocatePool() failed\n"); goto nextdevice; } - if (ParentBootResourcesLength == 0) + if (ParentBootResourcesLength < sizeof(CM_FULL_RESOURCE_DESCRIPTOR)) { RtlCopyMemory(BootResources, pValueInformation->Data, pValueInformation->DataLength); } @@ -3094,10 +3314,29 @@ IopEnumerateDetectedDevices( ZwDeleteKey(hLevel2Key); goto nextdevice; } - if (BootResourcesLength > 0) + if (BootResourcesLength >= sizeof(CM_FULL_RESOURCE_DESCRIPTOR)) { + CmResourceList = ExAllocatePool(PagedPool, BootResourcesLength + sizeof(ULONG)); + if (!CmResourceList) + { + ZwClose(hLogConf); + ZwDeleteKey(hLevel2Key); + goto nextdevice; + } + + /* Add the list count (1st member of CM_RESOURCE_LIST) */ + ListCount = 1; + RtlCopyMemory(CmResourceList, + &ListCount, + sizeof(ULONG)); + + /* Now add the actual list (2nd member of CM_RESOURCE_LIST) */ + RtlCopyMemory(CmResourceList + sizeof(ULONG), + BootResources, + BootResourcesLength); + /* Save boot resources to 'LogConf\BootConfig' */ - Status = ZwSetValueKey(hLogConf, &BootConfigU, 0, REG_FULL_RESOURCE_DESCRIPTOR, BootResources, BootResourcesLength); + Status = ZwSetValueKey(hLogConf, &BootConfigU, 0, REG_FULL_RESOURCE_DESCRIPTOR, CmResourceList, BootResourcesLength + sizeof(ULONG)); if (!NT_SUCCESS(Status)) { DPRINT("ZwSetValueKey() failed with status 0x%08lx\n", Status); @@ -3110,7 +3349,10 @@ IopEnumerateDetectedDevices( nextdevice: if (BootResources && BootResources != ParentBootResources) + { ExFreePool(BootResources); + BootResources = NULL; + } if (hLevel2Key) { ZwClose(hLevel2Key); diff --git a/reactos/ntoskrnl/io/pnpmgr/pnproot.c b/reactos/ntoskrnl/io/pnpmgr/pnproot.c index 80a1662b791..46df601b750 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnproot.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnproot.c @@ -694,9 +694,13 @@ PnpRootFdoPnpControl( break; } - /* Pass this IRP down to the root device PDO */ - IoSkipCurrentIrpStackLocation(Irp); - return IoCallDriver(DeviceExtension->Ldo, Irp); + if (Status != STATUS_PENDING) + { + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + return Status; } static NTSTATUS @@ -778,16 +782,16 @@ PdoQueryResources( /* Copy existing resource requirement list */ ResourceList = ExAllocatePool( PagedPool, - FIELD_OFFSET(CM_RESOURCE_LIST, List) + DeviceExtension->DeviceInfo->ResourceListSize); + DeviceExtension->DeviceInfo->ResourceListSize); if (!ResourceList) return STATUS_NO_MEMORY; - ResourceList->Count = 1; RtlCopyMemory( - &ResourceList->List, + ResourceList, DeviceExtension->DeviceInfo->ResourceList, DeviceExtension->DeviceInfo->ResourceListSize); - Irp->IoStatus.Information = (ULONG_PTR)ResourceList; + + Irp->IoStatus.Information = (ULONG_PTR)ResourceList; } return STATUS_SUCCESS; From e0b95b05b03576f0c949213aefc95f65a6911310 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 01:34:33 +0000 Subject: [PATCH 026/261] - Remove a leftover debug print svn path=/trunk/; revision=46709 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index b6241070fbf..b418dd67e94 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -1574,7 +1574,6 @@ IopCreateResourceListFromRequirements( + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); } - DPRINT1("Allocating resource list: %d\n", Size); *ResourceList = ExAllocatePool(PagedPool, Size); if (!*ResourceList) return STATUS_INSUFFICIENT_RESOURCES; From 93c0c968c0edd066cd272c60a15c46d3a8e87fa2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 02:59:31 +0000 Subject: [PATCH 027/261] [NTOSKRNL] - Remove an unused member from PNPROOT_DEVICE - Don't build a bogus resource list if no resources are required - Fixes a crash during resource arbitration because the created resource requirements list was malformed svn path=/trunk/; revision=46710 --- reactos/ntoskrnl/io/pnpmgr/pnproot.c | 50 ++++++++++------------------ 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnproot.c b/reactos/ntoskrnl/io/pnpmgr/pnproot.c index 46df601b750..63a3dd59c70 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnproot.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnproot.c @@ -33,7 +33,6 @@ typedef struct _PNPROOT_DEVICE UNICODE_STRING DeviceDescription; // Resource requirement list PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList; - ULONG ResourceRequirementsListSize; // Associated resource list PCM_RESOURCE_LIST ResourceList; ULONG ResourceListSize; @@ -766,18 +765,7 @@ PdoQueryResources( DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - if (DeviceExtension->DeviceInfo->ResourceList == NULL) - { - /* Create an empty resource list */ - ResourceList = ExAllocatePool(PagedPool, sizeof(CM_RESOURCE_LIST)); - if (!ResourceList) - return STATUS_NO_MEMORY; - - ResourceList->Count = 0; - - Irp->IoStatus.Information = (ULONG_PTR)ResourceList; - } - else + if (DeviceExtension->DeviceInfo->ResourceList) { /* Copy existing resource requirement list */ ResourceList = ExAllocatePool( @@ -792,9 +780,14 @@ PdoQueryResources( DeviceExtension->DeviceInfo->ResourceListSize); Irp->IoStatus.Information = (ULONG_PTR)ResourceList; - } - return STATUS_SUCCESS; + return STATUS_SUCCESS; + } + else + { + /* No resources so just return without changing the status */ + return Irp->IoStatus.Status; + } } static NTSTATUS @@ -805,23 +798,10 @@ PdoQueryResourceRequirements( { PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension; PIO_RESOURCE_REQUIREMENTS_LIST ResourceList; - ULONG ResourceListSize = FIELD_OFFSET(IO_RESOURCE_REQUIREMENTS_LIST, List); DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - if (DeviceExtension->DeviceInfo->ResourceRequirementsList == NULL) - { - /* Create an empty resource list */ - ResourceList = ExAllocatePool(PagedPool, ResourceListSize); - if (!ResourceList) - return STATUS_NO_MEMORY; - - RtlZeroMemory(ResourceList, ResourceListSize); - ResourceList->ListSize = ResourceListSize; - - Irp->IoStatus.Information = (ULONG_PTR)ResourceList; - } - else + if (DeviceExtension->DeviceInfo->ResourceRequirementsList) { /* Copy existing resource requirement list */ ResourceList = ExAllocatePool(PagedPool, DeviceExtension->DeviceInfo->ResourceRequirementsList->ListSize); @@ -832,10 +812,16 @@ PdoQueryResourceRequirements( ResourceList, DeviceExtension->DeviceInfo->ResourceRequirementsList, DeviceExtension->DeviceInfo->ResourceRequirementsList->ListSize); - Irp->IoStatus.Information = (ULONG_PTR)ResourceList; - } - return STATUS_SUCCESS; + Irp->IoStatus.Information = (ULONG_PTR)ResourceList; + + return STATUS_SUCCESS; + } + else + { + /* No resource requirements so just return without changing the status */ + return Irp->IoStatus.Status; + } } static NTSTATUS From 38bae887c2e33a8de6e35d091ca62b959f25d030 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 04:39:56 +0000 Subject: [PATCH 028/261] [NTOSKRNL] - Don't manually write a device description for detected devices - Instead, let PnpRoot report it in response to IRP_MN_QUERY_DEVICE_TEXT svn path=/trunk/; revision=46711 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index b418dd67e94..4365dee4d90 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -2913,7 +2913,6 @@ IopEnumerateDetectedDevices( IN ULONG ParentBootResourcesLength) { UNICODE_STRING IdentifierU = RTL_CONSTANT_STRING(L"Identifier"); - UNICODE_STRING DeviceDescU = RTL_CONSTANT_STRING(L"DeviceDesc"); UNICODE_STRING HardwareIDU = RTL_CONSTANT_STRING(L"HardwareID"); UNICODE_STRING ConfigurationDataU = RTL_CONSTANT_STRING(L"Configuration Data"); UNICODE_STRING BootConfigU = RTL_CONSTANT_STRING(L"BootConfig"); @@ -2960,7 +2959,6 @@ IopEnumerateDetectedDevices( UNICODE_STRING HardwareIdKey; PUNICODE_STRING pHardwareId; ULONG DeviceIndex = 0; - BOOLEAN IsDeviceDesc; PUCHAR CmResourceList; ULONG ListCount; @@ -3189,31 +3187,26 @@ IopEnumerateDetectedDevices( { pHardwareId = &HardwareIdSerial; DeviceIndex = DeviceIndexSerial++; - IsDeviceDesc = TRUE; } else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierKeyboard, FALSE) == 0) { pHardwareId = &HardwareIdKeyboard; DeviceIndex = DeviceIndexKeyboard++; - IsDeviceDesc = FALSE; } else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierMouse, FALSE) == 0) { pHardwareId = &HardwareIdMouse; DeviceIndex = DeviceIndexMouse++; - IsDeviceDesc = FALSE; } else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierParallel, FALSE) == 0) { pHardwareId = &HardwareIdParallel; DeviceIndex = DeviceIndexParallel++; - IsDeviceDesc = FALSE; } else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierFloppy, FALSE) == 0) { pHardwareId = &HardwareIdFloppy; DeviceIndex = DeviceIndexFloppy++; - IsDeviceDesc = FALSE; } else if (NT_SUCCESS(Status)) { @@ -3222,13 +3215,11 @@ IopEnumerateDetectedDevices( { pHardwareId = &HardwareIdPci; DeviceIndex = DeviceIndexPci++; - IsDeviceDesc = FALSE; } else if (RtlCompareUnicodeString(&ValueName, &IdentifierIsa, FALSE) == 0) { pHardwareId = &HardwareIdIsa; DeviceIndex = DeviceIndexIsa++; - IsDeviceDesc = FALSE; } else { @@ -3280,16 +3271,6 @@ IopEnumerateDetectedDevices( goto nextdevice; } DPRINT("Found %wZ #%lu (%wZ)\n", &ValueName, DeviceIndex, &HardwareIdKey); - if (IsDeviceDesc) - { - Status = ZwSetValueKey(hLevel2Key, &DeviceDescU, 0, REG_SZ, ValueName.Buffer, ValueName.MaximumLength); - if (!NT_SUCCESS(Status)) - { - DPRINT("ZwSetValueKey() failed with status 0x%08lx\n", Status); - ZwDeleteKey(hLevel2Key); - goto nextdevice; - } - } Status = ZwSetValueKey(hLevel2Key, &HardwareIDU, 0, REG_MULTI_SZ, pHardwareId->Buffer, pHardwareId->MaximumLength); if (!NT_SUCCESS(Status)) { From 141ca81c828cb2371153d4a6221505b61914b716 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 05:17:29 +0000 Subject: [PATCH 029/261] [NTOSKRNL] - Fix the type passed to ZwSetValueKey svn path=/trunk/; revision=46712 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 4365dee4d90..5d6c13336bc 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -3316,7 +3316,7 @@ IopEnumerateDetectedDevices( BootResourcesLength); /* Save boot resources to 'LogConf\BootConfig' */ - Status = ZwSetValueKey(hLogConf, &BootConfigU, 0, REG_FULL_RESOURCE_DESCRIPTOR, CmResourceList, BootResourcesLength + sizeof(ULONG)); + Status = ZwSetValueKey(hLogConf, &BootConfigU, 0, REG_RESOURCE_LIST, CmResourceList, BootResourcesLength + sizeof(ULONG)); if (!NT_SUCCESS(Status)) { DPRINT("ZwSetValueKey() failed with status 0x%08lx\n", Status); From 2af6abad95a0f249a58ed39ea58425a2667af6aa Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 4 Apr 2010 12:34:53 +0000 Subject: [PATCH 030/261] [NTOSKRNL] Ignore inherit only ACEs in a DACL. svn path=/trunk/; revision=46714 --- reactos/ntoskrnl/se/semgr.c | 94 ++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 6792180c5b5..0cb0da49e07 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -485,7 +485,7 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { *GrantedAccess = DesiredAccess | PreviouslyGrantedAccess; } - + *AccessStatus = STATUS_SUCCESS; return TRUE; } @@ -547,34 +547,37 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, CurrentAce = (PACE)(Dacl + 1); for (i = 0; i < Dacl->AceCount; i++) { - Sid = (PSID)(CurrentAce + 1); - if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) + if (!(CurrentAce->Header.AceFlags & INHERIT_ONLY_ACE)) { - if (SepSidInToken(Token, Sid)) + Sid = (PSID)(CurrentAce + 1); + if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) { - /* Map access rights from the ACE */ - TempAccess = CurrentAce->AccessMask; - RtlMapGenericMask(&TempAccess, GenericMapping); + if (SepSidInToken(Token, Sid)) + { + /* Map access rights from the ACE */ + TempAccess = CurrentAce->AccessMask; + RtlMapGenericMask(&TempAccess, GenericMapping); - /* Deny access rights that have not been granted yet */ - TempDeniedAccess |= (TempAccess & ~TempGrantedAccess); + /* Deny access rights that have not been granted yet */ + TempDeniedAccess |= (TempAccess & ~TempGrantedAccess); + } } - } - else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) - { - if (SepSidInToken(Token, Sid)) + else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) { - /* Map access rights from the ACE */ - TempAccess = CurrentAce->AccessMask; - RtlMapGenericMask(&TempAccess, GenericMapping); + if (SepSidInToken(Token, Sid)) + { + /* Map access rights from the ACE */ + TempAccess = CurrentAce->AccessMask; + RtlMapGenericMask(&TempAccess, GenericMapping); - /* Grant access rights that have not been denied yet */ - TempGrantedAccess |= (TempAccess & ~TempDeniedAccess); + /* Grant access rights that have not been denied yet */ + TempGrantedAccess |= (TempAccess & ~TempDeniedAccess); + } + } + else + { + DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); } - } - else - { - DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); } /* Get the next ACE */ @@ -608,35 +611,38 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, CurrentAce = (PACE)(Dacl + 1); for (i = 0; i < Dacl->AceCount; i++) { - Sid = (PSID)(CurrentAce + 1); - if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) + if (!(CurrentAce->Header.AceFlags & INHERIT_ONLY_ACE)) { - if (SepSidInToken(Token, Sid)) + Sid = (PSID)(CurrentAce + 1); + if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) { - /* Map access rights from the ACE */ - TempAccess = CurrentAce->AccessMask; - RtlMapGenericMask(&TempAccess, GenericMapping); + if (SepSidInToken(Token, Sid)) + { + /* Map access rights from the ACE */ + TempAccess = CurrentAce->AccessMask; + RtlMapGenericMask(&TempAccess, GenericMapping); - /* Leave if a remaining right must be denied */ - if (RemainingAccess & TempAccess) - break; + /* Leave if a remaining right must be denied */ + if (RemainingAccess & TempAccess) + break; + } } - } - else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) - { - if (SepSidInToken(Token, Sid)) + else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) { - /* Map access rights from the ACE */ - TempAccess = CurrentAce->AccessMask; - RtlMapGenericMask(&TempAccess, GenericMapping); + if (SepSidInToken(Token, Sid)) + { + /* Map access rights from the ACE */ + TempAccess = CurrentAce->AccessMask; + RtlMapGenericMask(&TempAccess, GenericMapping); - /* Remove granted rights */ - RemainingAccess &= ~TempAccess; + /* Remove granted rights */ + RemainingAccess &= ~TempAccess; + } + } + else + { + DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); } - } - else - { - DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); } /* Get the next ACE */ From 917fa8ad1403f5c558ed8e51343bc7fe73f74ea5 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 4 Apr 2010 13:43:56 +0000 Subject: [PATCH 031/261] [UNIATA] - Adjust timings in WaitOnBaseBusy, WaitForDrq, WaitShortForDrq to match old atapi driver. Thanks Caemyr for testing and finding optimal values (which are slightly below the values used in this commit). The proper solution would be to implement adaptive delays scaling. See issue #4995 for more details. svn path=/trunk/; revision=46716 --- reactos/drivers/storage/ide/uniata/id_ata.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/storage/ide/uniata/id_ata.cpp b/reactos/drivers/storage/ide/uniata/id_ata.cpp index 1cace8bd488..fb2bb028e87 100644 --- a/reactos/drivers/storage/ide/uniata/id_ata.cpp +++ b/reactos/drivers/storage/ide/uniata/id_ata.cpp @@ -537,10 +537,10 @@ WaitOnBaseBusy( { ULONG i; UCHAR Status; - for (i=0; i<200; i++) { + for (i=0; i<20000; i++) { GetBaseStatus(chan, Status); if (Status & IDE_STATUS_BUSY) { - AtapiStallExecution(10); + AtapiStallExecution(150); continue; } else { break; @@ -640,11 +640,11 @@ WaitForDrq( for (i=0; i<1000; i++) { GetStatus(chan, Status); if (Status & IDE_STATUS_BUSY) { - AtapiStallExecution(10); + AtapiStallExecution(100); } else if (Status & IDE_STATUS_DRQ) { break; } else { - AtapiStallExecution(10); + AtapiStallExecution(200); } } return Status; @@ -661,11 +661,11 @@ WaitShortForDrq( for (i=0; i<2; i++) { GetStatus(chan, Status); if (Status & IDE_STATUS_BUSY) { - AtapiStallExecution(10); + AtapiStallExecution(100); } else if (Status & IDE_STATUS_DRQ) { break; } else { - AtapiStallExecution(10); + AtapiStallExecution(100); } } return Status; From 08f73a5234653d09e1021967615dc63a761c4a6e Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 4 Apr 2010 13:47:45 +0000 Subject: [PATCH 032/261] - Sync user32 and gdi32 winetests to Wine-1.1.42. svn path=/trunk/; revision=46717 --- rostests/winetests/user32/combo.c | 2 +- rostests/winetests/user32/cursoricon.c | 265 ++++++++++++++++++++++++- rostests/winetests/user32/menu.c | 2 +- rostests/winetests/user32/msg.c | 8 +- rostests/winetests/user32/scroll.c | 16 +- rostests/winetests/user32/win.c | 64 +++++- 6 files changed, 339 insertions(+), 18 deletions(-) diff --git a/rostests/winetests/user32/combo.c b/rostests/winetests/user32/combo.c index bee685cb3ea..faf2145b833 100644 --- a/rostests/winetests/user32/combo.c +++ b/rostests/winetests/user32/combo.c @@ -461,7 +461,7 @@ static void test_editselection(void) ok(LOWORD(len)==1, "Unexpected start position for selection %d\n", LOWORD(len)); ok(HIWORD(len)==1, "Unexpected end position for selection %d\n", HIWORD(len)); - /* Now what happens when it gets more focus a second time - it doesnt reselect */ + /* Now what happens when it gets more focus a second time - it doesn't reselect */ SendMessage(hCombo, WM_SETFOCUS, 0, (LPARAM)hEdit); len = SendMessage(hCombo, CB_GETEDITSEL, 0,0); ok(LOWORD(len)==1, "Unexpected start position for selection %d\n", LOWORD(len)); diff --git a/rostests/winetests/user32/cursoricon.c b/rostests/winetests/user32/cursoricon.c index ff86cd0d1ab..8534875b631 100644 --- a/rostests/winetests/user32/cursoricon.c +++ b/rostests/winetests/user32/cursoricon.c @@ -64,6 +64,8 @@ static HANDLE child_process; #define PROC_INIT (WM_USER+1) +static BOOL (WINAPI *pGetCursorInfo)(CURSORINFO *); + static LRESULT CALLBACK callback_child(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL ret; @@ -961,7 +963,7 @@ static HICON create_test_icon(HDC hdc, int width, int height, int bpp, { ICONINFO iconInfo; BITMAPINFO bitmapInfo; - UINT32 *buffer = NULL; + void *buffer = NULL; UINT32 mask = maskvalue ? 0xFFFFFFFF : 0x00000000; memset(&bitmapInfo, 0, sizeof(bitmapInfo)); @@ -980,7 +982,7 @@ static HICON create_test_icon(HDC hdc, int width, int height, int bpp, iconInfo.hbmMask = CreateBitmap( width, height, 1, 1, &mask ); if(!iconInfo.hbmMask) return NULL; - iconInfo.hbmColor = CreateDIBSection(hdc, &bitmapInfo, DIB_RGB_COLORS, (void**)&buffer, NULL, 0); + iconInfo.hbmColor = CreateDIBSection(hdc, &bitmapInfo, DIB_RGB_COLORS, &buffer, NULL, 0); if(!iconInfo.hbmColor || !buffer) { DeleteObject(iconInfo.hbmMask); @@ -1072,7 +1074,7 @@ static void test_DrawIcon(void) HDC hdcDst = NULL; HBITMAP bmpDst = NULL; HBITMAP bmpOld = NULL; - UINT32 *bits = 0; + void *bits = 0; hdcDst = CreateCompatibleDC(0); ok(hdcDst != 0, "CreateCompatibleDC(0) failed to return a valid DC\n"); @@ -1094,7 +1096,7 @@ static void test_DrawIcon(void) bitmapInfo.bmiHeader.biCompression = BI_RGB; bitmapInfo.bmiHeader.biSizeImage = sizeof(UINT32); - bmpDst = CreateDIBSection(hdcDst, &bitmapInfo, DIB_RGB_COLORS, (void**)&bits, NULL, 0); + bmpDst = CreateDIBSection(hdcDst, &bitmapInfo, DIB_RGB_COLORS, &bits, NULL, 0); ok (bmpDst && bits, "CreateDIBSection failed to return a valid bitmap and buffer\n"); if (!bmpDst || !bits) goto cleanup; @@ -1156,7 +1158,7 @@ static void test_DrawIconEx(void) HDC hdcDst = NULL; HBITMAP bmpDst = NULL; HBITMAP bmpOld = NULL; - UINT32 bits = 0; + void *bits = 0; hdcDst = CreateCompatibleDC(0); ok(hdcDst != 0, "CreateCompatibleDC(0) failed to return a valid DC\n"); @@ -1177,7 +1179,7 @@ static void test_DrawIconEx(void) bitmapInfo.bmiHeader.biPlanes = 1; bitmapInfo.bmiHeader.biCompression = BI_RGB; bitmapInfo.bmiHeader.biSizeImage = sizeof(UINT32); - bmpDst = CreateDIBSection(hdcDst, &bitmapInfo, DIB_RGB_COLORS, (void**)&bits, NULL, 0); + bmpDst = CreateDIBSection(hdcDst, &bitmapInfo, DIB_RGB_COLORS, &bits, NULL, 0); ok (bmpDst && bits, "CreateDIBSection failed to return a valid bitmap and buffer\n"); if (!bmpDst || !bits) goto cleanup; @@ -1308,7 +1310,7 @@ static void test_DrawState(void) HDC hdcDst = NULL; HBITMAP bmpDst = NULL; HBITMAP bmpOld = NULL; - UINT32 bits = 0; + void *bits = 0; hdcDst = CreateCompatibleDC(0); ok(hdcDst != 0, "CreateCompatibleDC(0) failed to return a valid DC\n"); @@ -1329,7 +1331,7 @@ static void test_DrawState(void) bitmapInfo.bmiHeader.biPlanes = 1; bitmapInfo.bmiHeader.biCompression = BI_RGB; bitmapInfo.bmiHeader.biSizeImage = sizeof(UINT32); - bmpDst = CreateDIBSection(hdcDst, &bitmapInfo, DIB_RGB_COLORS, (void**)&bits, NULL, 0); + bmpDst = CreateDIBSection(hdcDst, &bitmapInfo, DIB_RGB_COLORS, &bits, NULL, 0); ok (bmpDst && bits, "CreateDIBSection failed to return a valid bitmap and buffer\n"); if (!bmpDst || !bits) goto cleanup; @@ -1353,6 +1355,250 @@ cleanup: DeleteDC(hdcDst); } +static DWORD parent_id; + +static DWORD CALLBACK set_cursor_thread( void *arg ) +{ + HCURSOR ret; + + PeekMessage( 0, 0, 0, 0, PM_NOREMOVE ); /* create a msg queue */ + if (parent_id) + { + BOOL ret = AttachThreadInput( GetCurrentThreadId(), parent_id, TRUE ); + ok( ret, "AttachThreadInput failed\n" ); + } + if (arg) ret = SetCursor( (HCURSOR)arg ); + else ret = GetCursor(); + return (DWORD_PTR)ret; +} + +static void test_SetCursor(void) +{ + static const BYTE bmp_bits[4096]; + ICONINFO cursorInfo; + HCURSOR cursor, old_cursor, global_cursor = 0; + DWORD error, id, result; + UINT display_bpp; + HDC hdc; + HANDLE thread; + CURSORINFO info; + + if (pGetCursorInfo) + { + memset( &info, 0, sizeof(info) ); + info.cbSize = sizeof(info); + if (!pGetCursorInfo( &info )) + { + win_skip( "GetCursorInfo not working\n" ); + pGetCursorInfo = NULL; + } + else global_cursor = info.hCursor; + } + cursor = GetCursor(); + thread = CreateThread( NULL, 0, set_cursor_thread, 0, 0, &id ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == (DWORD_PTR)cursor, "wrong thread cursor %x/%p\n", result, cursor ); + + hdc = GetDC(0); + display_bpp = GetDeviceCaps(hdc, BITSPIXEL); + ReleaseDC(0, hdc); + + cursorInfo.fIcon = FALSE; + cursorInfo.xHotspot = 0; + cursorInfo.yHotspot = 0; + cursorInfo.hbmMask = CreateBitmap(32, 32, 1, 1, bmp_bits); + cursorInfo.hbmColor = CreateBitmap(32, 32, 1, display_bpp, bmp_bits); + + cursor = CreateIconIndirect(&cursorInfo); + ok(cursor != NULL, "CreateIconIndirect returned %p\n", cursor); + old_cursor = SetCursor( cursor ); + + if (pGetCursorInfo) + { + info.cbSize = sizeof(info); + ok( pGetCursorInfo( &info ), "GetCursorInfo failed\n" ); + /* global cursor doesn't change since we don't have a window */ + ok( info.hCursor == global_cursor || broken(info.hCursor != cursor), /* win9x */ + "wrong info cursor %p/%p\n", info.hCursor, global_cursor ); + } + thread = CreateThread( NULL, 0, set_cursor_thread, 0, 0, &id ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == (DWORD_PTR)old_cursor, "wrong thread cursor %x/%p\n", result, old_cursor ); + + SetCursor( 0 ); + ok( GetCursor() == 0, "wrong cursor %p\n", GetCursor() ); + thread = CreateThread( NULL, 0, set_cursor_thread, 0, 0, &id ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == (DWORD_PTR)old_cursor, "wrong thread cursor %x/%p\n", result, old_cursor ); + + thread = CreateThread( NULL, 0, set_cursor_thread, cursor, 0, &id ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == (DWORD_PTR)old_cursor, "wrong thread cursor %x/%p\n", result, old_cursor ); + ok( GetCursor() == 0, "wrong cursor %p/0\n", GetCursor() ); + + parent_id = GetCurrentThreadId(); + thread = CreateThread( NULL, 0, set_cursor_thread, cursor, 0, &id ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == (DWORD_PTR)old_cursor, "wrong thread cursor %x/%p\n", result, old_cursor ); + ok( GetCursor() == cursor, "wrong cursor %p/0\n", cursor ); + + if (pGetCursorInfo) + { + info.cbSize = sizeof(info); + ok( pGetCursorInfo( &info ), "GetCursorInfo failed\n" ); + ok( info.hCursor == global_cursor || broken(info.hCursor != cursor), /* win9x */ + "wrong info cursor %p/%p\n", info.hCursor, global_cursor ); + } + SetCursor( old_cursor ); + DestroyCursor( cursor ); + + SetLastError( 0xdeadbeef ); + cursor = SetCursor( (HCURSOR)0xbadbad ); + error = GetLastError(); + ok( cursor == 0, "wrong cursor %p/0\n", cursor ); + ok( error == ERROR_INVALID_CURSOR_HANDLE || broken( error == 0xdeadbeef ), /* win9x */ + "wrong error %u\n", error ); + + if (pGetCursorInfo) + { + info.cbSize = sizeof(info); + ok( pGetCursorInfo( &info ), "GetCursorInfo failed\n" ); + ok( info.hCursor == global_cursor || broken(info.hCursor != cursor), /* win9x */ + "wrong info cursor %p/%p\n", info.hCursor, global_cursor ); + } +} + +static HANDLE event_start, event_next; + +static DWORD CALLBACK show_cursor_thread( void *arg ) +{ + DWORD count = (DWORD_PTR)arg; + int ret; + + PeekMessage( 0, 0, 0, 0, PM_NOREMOVE ); /* create a msg queue */ + if (parent_id) + { + BOOL ret = AttachThreadInput( GetCurrentThreadId(), parent_id, TRUE ); + ok( ret, "AttachThreadInput failed\n" ); + } + if (!count) ret = ShowCursor( FALSE ); + else while (count--) ret = ShowCursor( TRUE ); + SetEvent( event_start ); + WaitForSingleObject( event_next, 2000 ); + return ret; +} + +static void test_ShowCursor(void) +{ + int count; + DWORD id, result; + HANDLE thread; + CURSORINFO info; + + if (pGetCursorInfo) + { + memset( &info, 0, sizeof(info) ); + info.cbSize = sizeof(info); + ok( pGetCursorInfo( &info ), "GetCursorInfo failed\n" ); + ok( info.flags & CURSOR_SHOWING, "cursor not shown in info\n" ); + } + + event_start = CreateEvent( NULL, FALSE, FALSE, NULL ); + event_next = CreateEvent( NULL, FALSE, FALSE, NULL ); + + count = ShowCursor( TRUE ); + ok( count == 1, "wrong count %d\n", count ); + count = ShowCursor( TRUE ); + ok( count == 2, "wrong count %d\n", count ); + count = ShowCursor( FALSE ); + ok( count == 1, "wrong count %d\n", count ); + count = ShowCursor( FALSE ); + ok( count == 0, "wrong count %d\n", count ); + count = ShowCursor( FALSE ); + ok( count == -1, "wrong count %d\n", count ); + count = ShowCursor( FALSE ); + ok( count == -2, "wrong count %d\n", count ); + + if (pGetCursorInfo) + { + info.cbSize = sizeof(info); + ok( pGetCursorInfo( &info ), "GetCursorInfo failed\n" ); + /* global show count is not affected since we don't have a window */ + ok( info.flags & CURSOR_SHOWING, "cursor not shown in info\n" ); + } + + parent_id = 0; + thread = CreateThread( NULL, 0, show_cursor_thread, NULL, 0, &id ); + WaitForSingleObject( event_start, 1000 ); + count = ShowCursor( FALSE ); + ok( count == -3, "wrong count %d\n", count ); + SetEvent( event_next ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == -1, "wrong thread count %d\n", result ); + count = ShowCursor( FALSE ); + ok( count == -4, "wrong count %d\n", count ); + + thread = CreateThread( NULL, 0, show_cursor_thread, (void *)1, 0, &id ); + WaitForSingleObject( event_start, 1000 ); + count = ShowCursor( TRUE ); + ok( count == -3, "wrong count %d\n", count ); + SetEvent( event_next ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == 1, "wrong thread count %d\n", result ); + count = ShowCursor( TRUE ); + ok( count == -2, "wrong count %d\n", count ); + + parent_id = GetCurrentThreadId(); + thread = CreateThread( NULL, 0, show_cursor_thread, NULL, 0, &id ); + WaitForSingleObject( event_start, 1000 ); + count = ShowCursor( TRUE ); + ok( count == -2, "wrong count %d\n", count ); + SetEvent( event_next ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == -3, "wrong thread count %d\n", result ); + count = ShowCursor( FALSE ); + ok( count == -2, "wrong count %d\n", count ); + + thread = CreateThread( NULL, 0, show_cursor_thread, (void *)3, 0, &id ); + WaitForSingleObject( event_start, 1000 ); + count = ShowCursor( TRUE ); + ok( count == 2, "wrong count %d\n", count ); + SetEvent( event_next ); + WaitForSingleObject( thread, 1000 ); + GetExitCodeThread( thread, &result ); + ok( result == 1, "wrong thread count %d\n", result ); + count = ShowCursor( FALSE ); + ok( count == -2, "wrong count %d\n", count ); + + if (pGetCursorInfo) + { + info.cbSize = sizeof(info); + ok( pGetCursorInfo( &info ), "GetCursorInfo failed\n" ); + ok( info.flags & CURSOR_SHOWING, "cursor not shown in info\n" ); + } + + count = ShowCursor( TRUE ); + ok( count == -1, "wrong count %d\n", count ); + count = ShowCursor( TRUE ); + ok( count == 0, "wrong count %d\n", count ); + + if (pGetCursorInfo) + { + info.cbSize = sizeof(info); + ok( pGetCursorInfo( &info ), "GetCursorInfo failed\n" ); + ok( info.flags & CURSOR_SHOWING, "cursor not shown in info\n" ); + } +} + + static void test_DestroyCursor(void) { static const BYTE bmp_bits[4096]; @@ -1435,6 +1681,7 @@ static void test_DestroyCursor(void) START_TEST(cursoricon) { + pGetCursorInfo = (void *)GetProcAddress( GetModuleHandleA("user32.dll"), "GetCursorInfo" ); test_argc = winetest_get_mainargs(&test_argv); if (test_argc >= 3) @@ -1463,6 +1710,8 @@ START_TEST(cursoricon) test_DrawIcon(); test_DrawIconEx(); test_DrawState(); + test_SetCursor(); + test_ShowCursor(); test_DestroyCursor(); do_parent(); test_child_process(); diff --git a/rostests/winetests/user32/menu.c b/rostests/winetests/user32/menu.c index 8c49c2d5fdc..761d70c7a2f 100755 --- a/rostests/winetests/user32/menu.c +++ b/rostests/winetests/user32/menu.c @@ -3218,7 +3218,7 @@ START_TEST(menu) test_menu_hilitemenuitem(); test_menu_trackpopupmenu(); -// test_menu_cancelmode(); + test_menu_cancelmode(); test_menu_maxdepth(); test_menu_circref(); } diff --git a/rostests/winetests/user32/msg.c b/rostests/winetests/user32/msg.c index 23e990ee96c..714e57f4bcb 100755 --- a/rostests/winetests/user32/msg.c +++ b/rostests/winetests/user32/msg.c @@ -12434,17 +12434,17 @@ START_TEST(msg) test_quit_message(); test_SetActiveWindow(); -// if (!pTrackMouseEvent) + if (!pTrackMouseEvent) win_skip("TrackMouseEvent is not available\n"); -// else -// test_TrackMouseEvent(); + else + test_TrackMouseEvent(); test_SetWindowRgn(); test_sys_menu(); test_dialog_messages(); test_nullCallback(); test_dbcs_wm_char(); -// test_menu_messages(); + test_menu_messages(); test_paintingloop(); test_defwinproc(); test_clipboard_viewers(); diff --git a/rostests/winetests/user32/scroll.c b/rostests/winetests/user32/scroll.c index 0695639a458..e3f6938129c 100644 --- a/rostests/winetests/user32/scroll.c +++ b/rostests/winetests/user32/scroll.c @@ -42,12 +42,25 @@ static LRESULT CALLBACK MyWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP case WM_DESTROY: PostQuitMessage(0); break; - + case WM_HSCROLL: + case WM_VSCROLL: + /* stop tracking */ + ReleaseCapture(); + return 0; default: return DefWindowProcA(hWnd, msg, wParam, lParam); } return 0; } +static void scrollbar_test_track(void) +{ + /* test that scrollbar tracking is terminated when + * the control looses mouse capture */ + SendMessage( hScroll, WM_LBUTTONDOWN, 0, MAKELPARAM( 1, 1)); + /* a normal return from the sendmessage */ + /* not normal for instance by closing the windws */ + ok( IsWindow( hScroll), "Scrollbar has gone!\n"); +} static void scrollbar_test1(void) { @@ -420,6 +433,7 @@ START_TEST ( scroll ) scrollbar_test2(); scrollbar_test3(); scrollbar_test4(); + scrollbar_test_track(); /* Some test results vary depending of theming being active or not */ hUxtheme = LoadLibraryA("uxtheme.dll"); diff --git a/rostests/winetests/user32/win.c b/rostests/winetests/user32/win.c index cc41bae8032..96033a2746c 100644 --- a/rostests/winetests/user32/win.c +++ b/rostests/winetests/user32/win.c @@ -2476,10 +2476,39 @@ static void test_SetActiveWindow(HWND hwnd) check_wnd_state(hwnd, hwnd, hwnd, 0); } +struct create_window_thread_params +{ + HWND window; + HANDLE window_created; + HANDLE test_finished; +}; + +static DWORD WINAPI create_window_thread(void *param) +{ + struct create_window_thread_params *p = param; + DWORD res; + BOOL ret; + + p->window = CreateWindowA("static", NULL, WS_POPUP | WS_VISIBLE, 0, 0, 0, 0, 0, 0, 0, 0); + + ret = SetEvent(p->window_created); + ok(ret, "SetEvent failed, last error %#x.\n", GetLastError()); + + res = WaitForSingleObject(p->test_finished, INFINITE); + ok(res == WAIT_OBJECT_0, "Wait failed (%#x), last error %#x.\n", res, GetLastError()); + + DestroyWindow(p->window); + return 0; +} + static void test_SetForegroundWindow(HWND hwnd) { + struct create_window_thread_params thread_params; + HANDLE thread; + DWORD res, tid; BOOL ret; HWND hwnd2; + MSG msg; flush_events( TRUE ); ShowWindow(hwnd, SW_HIDE); @@ -2552,6 +2581,34 @@ static void test_SetForegroundWindow(HWND hwnd) DestroyWindow(hwnd2); check_wnd_state(hwnd, hwnd, hwnd, 0); + + hwnd2 = CreateWindowA("static", NULL, WS_POPUP | WS_VISIBLE, 0, 0, 0, 0, 0, 0, 0, 0); + check_wnd_state(hwnd2, hwnd2, hwnd2, 0); + + thread_params.window_created = CreateEvent(NULL, FALSE, FALSE, NULL); + ok(!!thread_params.window_created, "CreateEvent failed, last error %#x.\n", GetLastError()); + thread_params.test_finished = CreateEvent(NULL, FALSE, FALSE, NULL); + ok(!!thread_params.test_finished, "CreateEvent failed, last error %#x.\n", GetLastError()); + thread = CreateThread(NULL, 0, create_window_thread, &thread_params, 0, &tid); + ok(!!thread, "Failed to create thread, last error %#x.\n", GetLastError()); + res = WaitForSingleObject(thread_params.window_created, INFINITE); + ok(res == WAIT_OBJECT_0, "Wait failed (%#x), last error %#x.\n", res, GetLastError()); + check_wnd_state(hwnd2, thread_params.window, hwnd2, 0); + + SetForegroundWindow(hwnd2); + check_wnd_state(hwnd2, hwnd2, hwnd2, 0); + + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + if (0) check_wnd_state(hwnd2, hwnd2, hwnd2, 0); + todo_wine ok(GetActiveWindow() == hwnd2, "Expected active window %p, got %p.\n", hwnd2, GetActiveWindow()); + todo_wine ok(GetFocus() == hwnd2, "Expected focus window %p, got %p.\n", hwnd2, GetFocus()); + + SetEvent(thread_params.test_finished); + WaitForSingleObject(thread, INFINITE); + CloseHandle(thread_params.test_finished); + CloseHandle(thread_params.window_created); + CloseHandle(thread); + DestroyWindow(hwnd2); } static WNDPROC old_button_proc; @@ -2953,7 +3010,7 @@ static void test_mouse_input(HWND hwnd) BOOL ret; LRESULT res; - ShowWindow(hwnd, SW_SHOW); + ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); SetWindowPos( hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); @@ -5161,6 +5218,7 @@ static void run_NCRedrawLoop(UINT flags) NULL, NULL, 0, &flags); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); + flush_events( FALSE ); while(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE) != 0) { if (msg.message == WM_PAINT) loopcount++; @@ -5979,7 +6037,7 @@ START_TEST(win) test_capture_1(); test_capture_2(); test_capture_3(hwndMain, hwndMain2); -// test_capture_4(); + test_capture_4(); test_CreateWindow(); test_parent_owner(); @@ -6019,7 +6077,7 @@ START_TEST(win) test_layered_window(); test_SetForegroundWindow(hwndMain); -// test_shell_window(); + test_shell_window(); test_handles( hwndMain ); test_winregion(); From 4525984fb0db81838bc0cf243275f5d232701cbe Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 4 Apr 2010 14:04:24 +0000 Subject: [PATCH 033/261] [CMD] - Don't prefix double quotation marks during file completion See issue #4491 for more details. svn path=/trunk/; revision=46718 --- reactos/base/shell/cmd/filecomp.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/reactos/base/shell/cmd/filecomp.c b/reactos/base/shell/cmd/filecomp.c index 4ca8b837311..7cb99a72f12 100644 --- a/reactos/base/shell/cmd/filecomp.c +++ b/reactos/base/shell/cmd/filecomp.c @@ -703,7 +703,7 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) LastSpace = i; } - /* insert the quoation and move things around */ + /* insert the quotation and move things around */ if(szPrefix[LastSpace + 1] != _T('\"') && LastSpace != -1) { memmove ( &szPrefix[LastSpace+1], &szPrefix[LastSpace], (_tcslen(szPrefix)-LastSpace+1) * sizeof(TCHAR) ); @@ -712,14 +712,17 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) { _tcscat(szPrefix,_T("\"")); } - szPrefix[LastSpace + 1] = _T('\"'); + szPrefix[LastSpace + 1] = _T('\"'); } else if(LastSpace == -1) { - _tcscpy(szBaseWord,_T("\"")); - _tcscat(szBaseWord,szPrefix); - _tcscpy(szPrefix,szBaseWord); - + /* Add quotation only if none exists already */ + if (szPrefix[0] != _T('\"')) + { + _tcscpy(szBaseWord,_T("\"")); + _tcscat(szBaseWord,szPrefix); + _tcscpy(szPrefix,szBaseWord); + } } } From 2f22a7d7f8ea8ac279fe75ff0f9323cb20037a08 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 18:17:51 +0000 Subject: [PATCH 034/261] [NTOSKRNL] - Fix a case where we miss copying back the IO_STATUS_BLOCK into the UserIosb buffer - Fixes the registry corruption caused when PnP wrote an invalid resource list (passed back via UserIosb->Information) to the registry - Hopefully this also fixes a few other nasty bugs in other areas related to this issue svn path=/trunk/; revision=46719 --- reactos/ntoskrnl/io/iomgr/irp.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index 0863f58907b..e3695e9d2fb 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -469,9 +469,6 @@ IopCompleteRequest(IN PKAPC Apc, /* So we did return with a synch operation, was it the IRP? */ if (Irp->Flags & IRP_SYNCHRONOUS_API) { - /* Yes, this IRP was synchronous, so return the I/O Status */ - *Irp->UserIosb = Irp->IoStatus; - /* Now check if the user gave an event */ if (Irp->UserEvent) { @@ -495,6 +492,22 @@ IopCompleteRequest(IN PKAPC Apc, } } + /* Check if we have an associated user IOSB */ + if (Irp->UserIosb) + { + /* We do, so let's give them the final status */ + _SEH2_TRY + { + /* Save the IOSB Information */ + *Irp->UserIosb = Irp->IoStatus; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Ignore any error */ + } + _SEH2_END; + } + /* Now that we got here, we do this for incomplete I/Os as well */ if ((FileObject) && !(Irp->Flags & IRP_CREATE_OPERATION)) { From 7be442943e1c21ab7b877932b900eb842c6a2084 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 18:22:54 +0000 Subject: [PATCH 035/261] - Move the code from my previous commit before signalling the user event - Sorry for the wasted commit number svn path=/trunk/; revision=46720 --- reactos/ntoskrnl/io/iomgr/irp.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index e3695e9d2fb..21870d5f9cc 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -460,6 +460,22 @@ IopCompleteRequest(IN PKAPC Apc, } else { + /* Check if we have an associated user IOSB */ + if (Irp->UserIosb) + { + /* We do, so let's give them the final status */ + _SEH2_TRY + { + /* Save the IOSB Information */ + *Irp->UserIosb = Irp->IoStatus; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Ignore any error */ + } + _SEH2_END; + } + /* * Either we didn't return from the request, or we did return but this * request was synchronous. @@ -492,22 +508,6 @@ IopCompleteRequest(IN PKAPC Apc, } } - /* Check if we have an associated user IOSB */ - if (Irp->UserIosb) - { - /* We do, so let's give them the final status */ - _SEH2_TRY - { - /* Save the IOSB Information */ - *Irp->UserIosb = Irp->IoStatus; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Ignore any error */ - } - _SEH2_END; - } - /* Now that we got here, we do this for incomplete I/Os as well */ if ((FileObject) && !(Irp->Flags & IRP_CREATE_OPERATION)) { From a842dbcce0a32eb6169eef176a32c5004215fcc3 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 4 Apr 2010 18:24:28 +0000 Subject: [PATCH 036/261] [FORMAT] - Bail out when detecting invalid root path, instead of asking to insert a disk See issue #4067 for more details. svn path=/trunk/; revision=46721 --- reactos/base/system/format/format.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/base/system/format/format.c b/reactos/base/system/format/format.c index 59f9f302a0a..ba9f42b3a05 100755 --- a/reactos/base/system/format/format.c +++ b/reactos/base/system/format/format.c @@ -363,6 +363,12 @@ _tmain(int argc, TCHAR *argv[]) PrintWin32Error( szMsg, GetLastError()); return -1; } + else if ( driveType == 1 ) + { + LoadString( GetModuleHandle(NULL), STRING_NO_VOLUME, (LPTSTR) szMsg,RC_STRING_MAX_SIZE); + PrintWin32Error( szMsg, GetLastError()); + return -1; + } if( driveType != DRIVE_FIXED ) { LoadString( GetModuleHandle(NULL), STRING_INSERT_DISK, (LPTSTR) szMsg,RC_STRING_MAX_SIZE); From 7988cc7cad0624c1f3d483fcbf4654f232651e5d Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 4 Apr 2010 18:37:39 +0000 Subject: [PATCH 037/261] [SHELL32] - Add a confirmation dialog for logoff operation - English and German translation included See issue #1494 for more details. svn path=/trunk/; revision=46722 --- reactos/dll/win32/shell32/dialogs.c | 8 +++++--- reactos/dll/win32/shell32/lang/bg-BG.rc | 2 ++ reactos/dll/win32/shell32/lang/ca-ES.rc | 2 ++ reactos/dll/win32/shell32/lang/cs-CZ.rc | 2 ++ reactos/dll/win32/shell32/lang/da-DK.rc | 2 ++ reactos/dll/win32/shell32/lang/de-DE.rc | 2 ++ reactos/dll/win32/shell32/lang/el-GR.rc | 2 ++ reactos/dll/win32/shell32/lang/en-GB.rc | 2 ++ reactos/dll/win32/shell32/lang/en-US.rc | 2 ++ reactos/dll/win32/shell32/lang/es-ES.rc | 2 ++ reactos/dll/win32/shell32/lang/fi-FI.rc | 2 ++ reactos/dll/win32/shell32/lang/fr-FR.rc | 2 ++ reactos/dll/win32/shell32/lang/hu-HU.rc | 2 ++ reactos/dll/win32/shell32/lang/it-IT.rc | 2 ++ reactos/dll/win32/shell32/lang/ja-JP.rc | 2 ++ reactos/dll/win32/shell32/lang/ko-KR.rc | 2 ++ reactos/dll/win32/shell32/lang/nl-NL.rc | 2 ++ reactos/dll/win32/shell32/lang/no-NO.rc | 2 ++ reactos/dll/win32/shell32/lang/pl-PL.rc | 2 ++ reactos/dll/win32/shell32/lang/pt-BR.rc | 2 ++ reactos/dll/win32/shell32/lang/pt-PT.rc | 2 ++ reactos/dll/win32/shell32/lang/ro-RO.rc | 2 ++ reactos/dll/win32/shell32/lang/ru-RU.rc | 2 ++ reactos/dll/win32/shell32/lang/sk-SK.rc | 2 ++ reactos/dll/win32/shell32/lang/sl-SI.rc | 2 ++ reactos/dll/win32/shell32/lang/sv-SE.rc | 2 ++ reactos/dll/win32/shell32/lang/tr-TR.rc | 2 ++ reactos/dll/win32/shell32/lang/uk-UA.rc | 2 ++ reactos/dll/win32/shell32/lang/zh-CN.rc | 2 ++ reactos/dll/win32/shell32/lang/zh-TW.rc | 2 ++ reactos/dll/win32/shell32/shresdef.h | 3 +++ 31 files changed, 66 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/shell32/dialogs.c b/reactos/dll/win32/shell32/dialogs.c index e5aa28f74e8..792ed62be1b 100644 --- a/reactos/dll/win32/shell32/dialogs.c +++ b/reactos/dll/win32/shell32/dialogs.c @@ -612,9 +612,11 @@ int WINAPI RestartDialogEx(HWND hWndOwner, LPCWSTR lpwstrReason, DWORD uFlags, D int WINAPI LogoffWindowsDialog(HWND hWndOwner) { - UNIMPLEMENTED; - ExitWindowsEx(EWX_LOGOFF, 0); - return 0; + if (ConfirmDialog(hWndOwner, IDS_LOGOFF_PROMPT, IDS_LOGOFF_TITLE)) + { + ExitWindowsEx(EWX_LOGOFF, 0); + } + return 0; } /************************************************************************* diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index fea6d988882..5cda676dd5e 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -666,6 +666,8 @@ BEGIN IDS_RESTART_PROMPT "Èñêàòå ëè äà ïðåçàïóñíåòå ñèñòåìàòà?" IDS_SHUTDOWN_TITLE "Èçêëþ÷âàíå" IDS_SHUTDOWN_PROMPT "Èñêàòå ëè äà èçêëþ÷èòå êîìïþòúðà?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" // shell folder path default values IDS_PROGRAMS "Ïóñêîâ èçáîðíèê\\Ïðèëîæåíèÿ" diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index df5cb9e4b24..a26fab0e23f 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index b08beea99f9..f2652e6a2d4 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -666,6 +666,8 @@ BEGIN IDS_RESTART_PROMPT "Opravdu chcete restartovat systém?" IDS_SHUTDOWN_TITLE "Vypnout" IDS_SHUTDOWN_PROMPT "Opravdu chcete vypnout poèítaè?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Nabídka Start\\Programy" diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index 40e1eabce06..b9cf5217235 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -654,6 +654,8 @@ BEGIN IDS_RESTART_PROMPT "Ønsker du at Genstarte Systemet?" IDS_SHUTDOWN_TITLE "Luk Ned" IDS_SHUTDOWN_PROMPT "Ønsker du at Lukke Ned?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programmer" diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index db0fa82a369..09f6559a447 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -669,6 +669,8 @@ BEGIN IDS_RESTART_PROMPT "Möchten Sie das System neu starten?" IDS_SHUTDOWN_TITLE "Herunterfahren" IDS_SHUTDOWN_PROMPT "Möchten Sie das System herunterfahren?" + IDS_LOGOFF_TITLE "Ausloggen" + IDS_LOGOFF_PROMPT "Möchten Sie sich ausloggen?" /* shell folder path default values */ IDS_PROGRAMS "Startmenü\\Programme" diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index 6b35ec3f541..0821f013408 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -666,6 +666,8 @@ BEGIN IDS_RESTART_PROMPT "Åßóôå óßãïõñïé üôé èÝëåôå íá åðáíåêêéíÞóåôå ôïí õðïëïãéóôÞ óáò;" IDS_SHUTDOWN_TITLE "Áðåíåñãïðïßçóç" IDS_SHUTDOWN_PROMPT "Åßóôå óßãïõñïé üôé èÝëåôå íá áðåíåñãïðïéÞóåôå ôïí õðïëïãéóôÞ óáò;" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index 38203c24077..3dfbfd940df 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 63d38cba154..200c97ae1fb 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index 0e20abcf95f..a0dacf6a7a7 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -668,6 +668,8 @@ BEGIN IDS_RESTART_PROMPT "¿Desea reiniciar el equipo?" IDS_SHUTDOWN_TITLE "Apagar" IDS_SHUTDOWN_PROMPT "¿Desea apagar el equipo?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Menú Inicio\\Programas" diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index 2620c2b4277..778576a08fb 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Haluatko simuloida Windows:n uudelleenkäynnistämistä?" IDS_SHUTDOWN_TITLE "Sammuta" IDS_SHUTDOWN_PROMPT "Haluatko lopettaa Wine:n istunnon?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Käynnistä\\Ohjelmat" diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 98cd95fa6f0..3f712a60bbd 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -669,6 +669,8 @@ BEGIN IDS_RESTART_PROMPT "Voulez-vous redémarrer votre ordinateur ?" IDS_SHUTDOWN_TITLE "Arrêter" IDS_SHUTDOWN_PROMPT "Voulez-vous fermer la session ReactOS ?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Menu Démarrer\\Programmes" diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index 7016d5021a8..22a26038c7c 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -668,6 +668,8 @@ BEGIN IDS_RESTART_PROMPT "Újra szeretnéd indítani a rendszert?" IDS_SHUTDOWN_TITLE "Kikapcsolás" IDS_SHUTDOWN_PROMPT "Kiakarod kapcsolni számítógépét?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 986ecfeeb46..4407298403c 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -666,6 +666,8 @@ BEGIN IDS_RESTART_PROMPT "Volete riavviare il sistema?" IDS_SHUTDOWN_TITLE "Termina sessione" IDS_SHUTDOWN_PROMPT "Volete terminare la sessione di ReactOS?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Menu Avvio\\Programmi" diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index 47c5bfb9923..12f24d34adb 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "ƒVƒXƒeƒ€‚ðÄ‹N“®‚µ‚Ü‚·‚©?" IDS_SHUTDOWN_TITLE "ƒVƒƒƒbƒgƒ_ƒEƒ“" IDS_SHUTDOWN_PROMPT "ƒVƒƒƒbƒgƒ_ƒEƒ“‚µ‚Ü‚·‚©?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "ƒXƒ^[ƒg ƒƒjƒ…[\\ƒvƒƒOƒ‰ƒ€" diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index e9e67b71a4e..9d7ad808fa6 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index 5ff6c83a59a..b0e1c919a5f 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index 90dc27d3aa6..43c637f1dcb 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -668,6 +668,8 @@ BEGIN IDS_RESTART_PROMPT "Vil du starte datamaskinen på nytt?" IDS_SHUTDOWN_TITLE "Avslutt" IDS_SHUTDOWN_PROMPT "Vil du slå av datamaskinen?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start-meny\\Programmer" diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index b6d33a64fd4..a0d3682dc1f 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -672,6 +672,8 @@ BEGIN IDS_RESTART_PROMPT "Czy chcesz zrestartowaæ system?" IDS_SHUTDOWN_TITLE "Wy³¹cz" IDS_SHUTDOWN_PROMPT "Czy chcesz wy³¹czyæ system?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Menu Start\\Programy" diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index 048d4c39110..5bcee218b35 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -667,6 +667,8 @@ BEGIN IDS_RESTART_PROMPT "Você quer simular a reinicialização do Windows?" IDS_SHUTDOWN_TITLE "Desligar" IDS_SHUTDOWN_PROMPT "Você quer finalizar a sessão no Wine?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Menu Iniciar\\Programas" diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index c20e670e3a2..dbf3fe2453c 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -667,6 +667,8 @@ BEGIN IDS_RESTART_PROMPT "Deseja simular a reinicialização do Windows?" IDS_SHUTDOWN_TITLE "Desligar" IDS_SHUTDOWN_PROMPT "Deseja finalizar esta sessão do Wine?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Menu Iniciar\\Programas" diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc index 656bc410bc9..efbff8594d2 100644 --- a/reactos/dll/win32/shell32/lang/ro-RO.rc +++ b/reactos/dll/win32/shell32/lang/ro-RO.rc @@ -668,6 +668,8 @@ BEGIN IDS_RESTART_PROMPT "VreÈ›i să reporniÈ›i sistemul?" IDS_SHUTDOWN_TITLE "ÃŽnchidere" IDS_SHUTDOWN_PROMPT "VreÈ›i să închideÈ›i computerul?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Meniu Start\\Programe" diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index 7d6e1e1e06e..6c3f488f3eb 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -664,6 +664,8 @@ BEGIN IDS_RESTART_PROMPT "Âû äåéñòâèòåëüíî õîòèòå ïåðåçàãðóçèòü ReactOS?" IDS_SHUTDOWN_TITLE "Âûêëþ÷èòü ïèòàíèå" IDS_SHUTDOWN_PROMPT "Çàêîí÷èòü ðàáîòó ñ ReactOS?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Ãëàâíîå ìåíþ\\Ïðîãðàììû" diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 2ec58ec12ae..e45b141e87f 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -671,6 +671,8 @@ BEGIN IDS_RESTART_PROMPT "Naozaj chcete reštartova systém?" IDS_SHUTDOWN_TITLE "Vypnú" IDS_SHUTDOWN_PROMPT "Naozaj chcete vypnú poèítaè?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Ponuka Štart\\Programy" diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 876be4b4927..5038af1c123 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index e7a520f5ba4..08a6f59e70f 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index 49a154c3408..3ab92cbb104 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -665,6 +665,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Oturumu Kapat" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programlar" diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index 3846965c696..cf2847ed9ab 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -666,6 +666,8 @@ BEGIN IDS_RESTART_PROMPT "Âè õî÷åòå ïåðåçàâàíòàæèòè ñèñòåìó?" IDS_SHUTDOWN_TITLE "Âèìêíóòè" IDS_SHUTDOWN_PROMPT "Âè õî÷åòå âèìêíóòè êîìï'þòåð?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index 5180db558cd..18c4d5439d4 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -654,6 +654,8 @@ BEGIN IDS_RESTART_PROMPT "ÊÇ·ñÖØÐÂÆô¶¯ÏµÍ³?" IDS_SHUTDOWN_TITLE "¹Ø»ú" IDS_SHUTDOWN_PROMPT "ÊÇ·ñ¹Ø±Õϵͳ?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index fc76bf15798..f7c59a2e1ff 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -666,6 +666,8 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + IDS_LOGOFF_TITLE "Log Off" + IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index e28efb0e240..981e17ff9ce 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -90,6 +90,9 @@ #define IDS_FONTS 76 #define IDS_PRINTERS 77 +#define IDS_LOGOFF_TITLE 78 +#define IDS_LOGOFF_PROMPT 79 + #define IDS_CREATEFOLDER_DENIED 128 #define IDS_CREATEFOLDER_CAPTION 129 #define IDS_DELETEITEM_CAPTION 130 From 6141336a7894c8c80f30e5dc37029dedf80c21ac Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 4 Apr 2010 21:27:07 +0000 Subject: [PATCH 038/261] [KS] - Add hack to IKsClock_DispatchDeviceIoControl - Store device state before calling SetDeviceState - Partly implement KsPinGetLeadingEdgeStreamPointer, KsStreamPointerDelete, KsStreamPointerClone, KsStreamPointerAdvanceOffsets - Implement a worker routine to dispatch read/write stream requests for pin centric filters - Tv tuner is now able to transfer MPEG2 TS to user mode, WIP, needs more testing svn path=/trunk/; revision=46723 --- reactos/drivers/ksfilter/ks/api.c | 4 +- reactos/drivers/ksfilter/ks/bag.c | 4 + reactos/drivers/ksfilter/ks/clocks.c | 4 +- reactos/drivers/ksfilter/ks/driver.c | 4 + reactos/drivers/ksfilter/ks/filter.c | 2 + reactos/drivers/ksfilter/ks/pin.c | 349 ++++++++++++++++++++++++--- 6 files changed, 331 insertions(+), 36 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index 8ec11860e02..f1ac9a848db 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -94,6 +94,8 @@ KsReleaseDeviceSecurityLock( { PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader; + DPRINT("KsReleaseDevice\n"); + ExReleaseResourceLite(&Header->SecurityLock); KeLeaveCriticalRegion(); } @@ -1623,7 +1625,7 @@ KsAcquireDevice( IKsDevice *KsDevice; PKSIDEVICE_HEADER DeviceHeader; - + DPRINT("KsAcquireDevice\n"); DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice); /* get device interface*/ diff --git a/reactos/drivers/ksfilter/ks/bag.c b/reactos/drivers/ksfilter/ks/bag.c index 1b7eec9bc5e..d0b76cc8cd1 100644 --- a/reactos/drivers/ksfilter/ks/bag.c +++ b/reactos/drivers/ksfilter/ks/bag.c @@ -89,6 +89,8 @@ KsAddItemToObjectBag( PKSIOBJECT_BAG Bag; PKSIOBJECT_BAG_ENTRY BagEntry; + DPRINT("KsAddItemToObjectBag\n"); + /* get real object bag */ Bag = (PKSIOBJECT_BAG)ObjectBag; @@ -363,6 +365,8 @@ _KsEdit( PVOID Item; NTSTATUS Status; + DPRINT("_KsEdit\n"); + /* get real object bag */ Bag = (PKSIOBJECT_BAG)ObjectBag; diff --git a/reactos/drivers/ksfilter/ks/clocks.c b/reactos/drivers/ksfilter/ks/clocks.c index 39611935076..f3e7d7acbb8 100644 --- a/reactos/drivers/ksfilter/ks/clocks.c +++ b/reactos/drivers/ksfilter/ks/clocks.c @@ -98,10 +98,10 @@ IKsClock_DispatchDeviceIoControl( { UNIMPLEMENTED - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_NOT_IMPLEMENTED; + return STATUS_SUCCESS; } NTSTATUS diff --git a/reactos/drivers/ksfilter/ks/driver.c b/reactos/drivers/ksfilter/ks/driver.c index 949e1285c54..0b6cf43a96e 100644 --- a/reactos/drivers/ksfilter/ks/driver.c +++ b/reactos/drivers/ksfilter/ks/driver.c @@ -39,6 +39,8 @@ KsGetDevice( { PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); + DPRINT("KsGetDevice\n"); + ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); ASSERT(BasicHeader->KsDevice); ASSERT(BasicHeader->KsDevice->Started); @@ -152,6 +154,8 @@ KsInitializeDriver( PKS_DRIVER_EXTENSION DriverObjectExtension; NTSTATUS Status = STATUS_SUCCESS; + DPRINT("KsInitializeDriver\n"); + if (Descriptor) { Status = IoAllocateDriverObjectExtension(DriverObject, (PVOID)KsInitializeDriver, sizeof(KS_DRIVER_EXTENSION), (PVOID*)&DriverObjectExtension); diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index 5c8fe7f463f..2fb69977f58 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -1572,6 +1572,8 @@ KsGetFilterFromIrp( PIO_STACK_LOCATION IoStack; PKSIOBJECT_HEADER ObjectHeader; + DPRINT("KsGetFilterFromIrp\n"); + /* get current irp stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c index 70e17e6607a..a4cc63bfbc6 100644 --- a/reactos/drivers/ksfilter/ks/pin.c +++ b/reactos/drivers/ksfilter/ks/pin.c @@ -11,13 +11,13 @@ typedef struct _KSISTREAM_POINTER { - KSSTREAM_POINTER StreamPointer; PFNKSSTREAMPOINTER Callback; PIRP Irp; KTIMER Timer; KDPC TimerDpc; struct _KSISTREAM_POINTER *Next; - + PKSPIN Pin; + KSSTREAM_POINTER StreamPointer; }KSISTREAM_POINTER, *PKSISTREAM_POINTER; typedef struct @@ -56,6 +56,12 @@ typedef struct IKsReferenceClockVtbl * lpVtblReferenceClock; PKSDEFAULTCLOCK DefaultClock; + PKSWORKER PinWorker; + WORK_QUEUE_ITEM PinWorkQueueItem; + IRP * Irp; + KEVENT FrameComplete; + + }IKsPinImpl; NTSTATUS NTAPI IKsPin_PinStatePropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); @@ -283,6 +289,7 @@ IKsPin_PinStatePropertyHandler( /* set new state */ This->Pin.ClientState = *NewState; + This->Pin.DeviceState = *NewState; /* check if it supported */ Status = This->Pin.Descriptor->Dispatch->SetDeviceState(&This->Pin, *NewState, OldState); @@ -293,6 +300,7 @@ IKsPin_PinStatePropertyHandler( { /* revert to old state */ This->Pin.ClientState = OldState; + This->Pin.DeviceState = OldState; DbgBreakPoint(); } else @@ -892,7 +900,7 @@ KsPinAttemptProcessing( IN BOOLEAN Asynchronous) { DPRINT("KsPinAttemptProcessing\n"); -DbgBreakPoint(); + DbgBreakPoint(); UNIMPLEMENTED } @@ -1204,10 +1212,33 @@ KsPinGetLeadingEdgeStreamPointer( IN PKSPIN Pin, IN KSSTREAM_POINTER_STATE State) { - UNIMPLEMENTED - DPRINT("KsPinGetLeadingEdgeStreamPointer Pin %p State %x\n", Pin, State); -DbgBreakPoint(); - return NULL; + IKsPinImpl * This; + + This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); + + DPRINT("KsPinGetLeadingEdgeStreamPointer Pin %p State %x Count %lu Remaining %lu\n", Pin, State, + This->LeadingEdgeStreamPointer->StreamPointer.Offset->Count, + This->LeadingEdgeStreamPointer->StreamPointer.Offset->Remaining); + + /* sanity check */ + ASSERT(This->LeadingEdgeStreamPointer); + ASSERT(State == KSSTREAM_POINTER_STATE_LOCKED); + + if (State == KSSTREAM_POINTER_STATE_LOCKED) + { + /* do we have an irp packet */ + if (!This->Irp) + { + /* run out of packets */ + return NULL; + } + + if (!This->LeadingEdgeStreamPointer->StreamPointer.Offset->Remaining) + return NULL; + } + DPRINT("LeadingEdge %p\n", &This->LeadingEdgeStreamPointer->StreamPointer); + This->LeadingEdgeStreamPointer->Pin = &This->Pin; + return &This->LeadingEdgeStreamPointer->StreamPointer; } /* @@ -1262,8 +1293,8 @@ KsStreamPointerUnlock( IN BOOLEAN Eject) { UNIMPLEMENTED - DPRINT("KsStreamPointerUnlock\n"); -DbgBreakPoint(); + DPRINT("KsStreamPointerUnlock Eject %lu\n", Eject); + DbgBreakPoint(); } /* @@ -1278,8 +1309,8 @@ KsStreamPointerAdvanceOffsetsAndUnlock( IN ULONG OutUsed, IN BOOLEAN Eject) { - DPRINT("KsStreamPointerAdvanceOffsets\n"); -DbgBreakPoint(); + DPRINT("KsStreamPointerAdvanceOffsets InUsed %lu OutUsed %lu Eject %lu\n", InUsed, OutUsed, Eject); + DbgBreakPoint(); UNIMPLEMENTED } @@ -1294,10 +1325,10 @@ KsStreamPointerDelete( { IKsPinImpl * This; PKSISTREAM_POINTER Cur, Last; - PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; + PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); + + DPRINT("KsStreamPointerDelete %p\n", Pointer); - DPRINT("KsStreamPointerDelete\n"); -DbgBreakPoint(); This = (IKsPinImpl*)CONTAINING_RECORD(Pointer->StreamPointer.Pin, IKsPinImpl, Pin); /* point to first stream pointer */ @@ -1332,7 +1363,7 @@ DbgBreakPoint(); } /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS @@ -1343,14 +1374,57 @@ KsStreamPointerClone( IN ULONG ContextSize, OUT PKSSTREAM_POINTER* CloneStreamPointer) { - UNIMPLEMENTED - DPRINT("KsStreamPointerClone\n"); -DbgBreakPoint(); - return STATUS_NOT_IMPLEMENTED; + IKsPinImpl * This; + PKSISTREAM_POINTER CurFrame; + PKSISTREAM_POINTER NewFrame; + ULONG RefCount; + ULONG Size; + + DPRINT("KsStreamPointerClone StreamPointer %p CancelCallback %p ContextSize %p CloneStreamPointer %p\n", StreamPointer, CancelCallback, ContextSize, CloneStreamPointer); + + /* get stream pointer */ + CurFrame = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); + + /* calculate context size */ + Size = sizeof(KSISTREAM_POINTER) + ContextSize; + + /* allocate new stream pointer */ + NewFrame = (PKSISTREAM_POINTER)ExAllocatePool(NonPagedPool, Size); + + if (!NewFrame) + return STATUS_INSUFFICIENT_RESOURCES; + + /* get current irp stack location */ + RefCount = (ULONG)CurFrame->Irp->Tail.Overlay.DriverContext[0]; + + /* increment reference count */ + RefCount++; + CurFrame->Irp->Tail.Overlay.DriverContext[0] = (PVOID)RefCount; + + /* copy stream pointer */ + RtlMoveMemory(NewFrame, CurFrame, sizeof(KSISTREAM_POINTER)); + + if (ContextSize) + NewFrame->StreamPointer.Context = (NewFrame + 1); + + /* locate pin */ + This = (IKsPinImpl*)CONTAINING_RECORD(CurFrame->Pin, IKsPinImpl, Pin); + + NewFrame->StreamPointer.Pin = &This->Pin; + + ASSERT(NewFrame->StreamPointer.Pin); + ASSERT(NewFrame->StreamPointer.Context); + ASSERT(NewFrame->StreamPointer.Offset); + ASSERT(NewFrame->StreamPointer.StreamHeader); + + /* store result */ + *CloneStreamPointer = &NewFrame->StreamPointer; + + return STATUS_SUCCESS; } /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS @@ -1361,8 +1435,58 @@ KsStreamPointerAdvanceOffsets( IN ULONG OutUsed, IN BOOLEAN Eject) { - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + PKSISTREAM_POINTER CurFrame; + IKsPinImpl * This; + + DPRINT("KsStreamPointerAdvanceOffsets InUsed %lu OutUsed %lu Eject %lu\n", InUsed, OutUsed, Eject); + + /* get stream pointer */ + CurFrame = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); + + CurFrame->StreamPointer.OffsetIn.Remaining -= InUsed; + CurFrame->StreamPointer.OffsetOut.Remaining -= OutUsed; + CurFrame->StreamPointer.OffsetIn.Count -= InUsed; + CurFrame->StreamPointer.OffsetOut.Count -= OutUsed; + CurFrame->StreamPointer.OffsetIn.Data = (PVOID)((ULONG_PTR)CurFrame->StreamPointer.OffsetIn.Data + InUsed); + CurFrame->StreamPointer.OffsetOut.Data = (PVOID)((ULONG_PTR)CurFrame->StreamPointer.OffsetOut.Data + OutUsed); + + if (!CurFrame->StreamPointer.OffsetIn.Remaining) + CurFrame->StreamPointer.OffsetIn.Data = NULL; + + if (!CurFrame->StreamPointer.OffsetOut.Remaining) + CurFrame->StreamPointer.OffsetOut.Data = NULL; + + /* locate pin */ + This = (IKsPinImpl*)CONTAINING_RECORD(CurFrame->Pin, IKsPinImpl, Pin); + + if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) + { + if (CurFrame->StreamPointer.OffsetIn.Remaining == 0) + { + /* get next mapping */ + This->Irp = KsRemoveIrpFromCancelableQueue(&This->IrpList, &This->IrpListLock, KsListEntryHead, KsAcquireAndRemoveOnlySingleItem); + if (!This->Irp) + return STATUS_DEVICE_NOT_READY; + + /* FIXME handle me */ + ASSERT(0); + } + } + else + { + if (CurFrame->StreamPointer.OffsetOut.Remaining == 0) + { + /* get next mapping */ + This->Irp = KsRemoveIrpFromCancelableQueue(&This->IrpList, &This->IrpListLock, KsListEntryHead, KsAcquireAndRemoveOnlySingleItem); + if (!This->Irp) + return STATUS_DEVICE_NOT_READY; + + /* FIXME handle me */ + ASSERT(0); + } + } + + return STATUS_SUCCESS; } /* @@ -1458,7 +1582,7 @@ KsPinGetFirstCloneStreamPointer( IKsPinImpl * This; DPRINT("KsPinGetFirstCloneStreamPointer %p\n", Pin); -DbgBreakPoint(); + DbgBreakPoint(); This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); /* return first cloned stream pointer */ return &This->ClonedStreamPointer->StreamPointer; @@ -1476,7 +1600,7 @@ KsStreamPointerGetNextClone( PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; DPRINT("KsStreamPointerGetNextClone\n"); -DbgBreakPoint(); + DbgBreakPoint(); /* is there a another cloned stream pointer */ if (!Pointer->Next) return NULL; @@ -1484,7 +1608,101 @@ DbgBreakPoint(); /* return next stream pointer */ return &Pointer->Next->StreamPointer; } + +VOID +NTAPI +IKsPin_PinCentricWorker( + IN PVOID Parameter) +{ + PIO_STACK_LOCATION IoStack; + PKSSTREAM_HEADER Header; + ULONG NumHeaders; + NTSTATUS Status; + PIRP Irp; + IKsPinImpl * This = (IKsPinImpl*)Parameter; + + DPRINT("IKsPin_PinCentricWorker\n"); + + /* sanity checks */ + ASSERT(This); + ASSERT(This->Pin.Descriptor); + ASSERT(This->Pin.Descriptor->Dispatch); + ASSERT(This->Pin.Descriptor->Dispatch->Process); + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + ASSERT(!(This->Pin.Descriptor->Flags & KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING)); + ASSERT(This->LeadingEdgeStreamPointer); + + do + { + /* do we have an irp packet */ + if (!This->Irp) + { + /* fetch new irp packet */ + This->Irp = KsRemoveIrpFromCancelableQueue(&This->IrpList, &This->IrpListLock, KsListEntryHead, KsAcquireAndRemoveOnlySingleItem); + + if (!This->Irp) + { + /* reached last packet */ + break; + } + } + + /* get current irp stack location */ + IoStack = IoGetCurrentIrpStackLocation(This->Irp); + + if (This->Irp->RequestorMode == UserMode) + This->LeadingEdgeStreamPointer->StreamPointer.StreamHeader = Header = (PKSSTREAM_HEADER)This->Irp->AssociatedIrp.SystemBuffer; + else + This->LeadingEdgeStreamPointer->StreamPointer.StreamHeader = Header = (PKSSTREAM_HEADER)This->Irp->UserBuffer; + + /* calculate num headers */ + NumHeaders = IoStack->Parameters.DeviceIoControl.OutputBufferLength / Header->Size; + + /* assume headers of same length */ + ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength % Header->Size == 0); + + /* FIXME support multiple stream headers */ + ASSERT(NumHeaders == 1); + + if (This->Irp->RequestorMode == UserMode) + { + /* prepare header */ + Header->Data = MmGetSystemAddressForMdlSafe(This->Irp->MdlAddress, NormalPagePriority); + } + + /* set up stream pointer */ + This->LeadingEdgeStreamPointer->Irp = Irp = This->Irp; + This->LeadingEdgeStreamPointer->StreamPointer.Context = NULL; + This->LeadingEdgeStreamPointer->StreamPointer.Pin = &This->Pin; + This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut.Count = max(Header->DataUsed, Header->FrameExtent); + This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut.Data = Header->Data; + This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut.Count = max(Header->DataUsed, Header->FrameExtent); + This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut.Remaining = max(Header->DataUsed, Header->FrameExtent); + This->LeadingEdgeStreamPointer->Pin = &This->Pin; + + DPRINT("IKsPin_PinCentricWorker calling Pin Process Routine\n"); + + Status = This->Pin.Descriptor->Dispatch->Process(&This->Pin); + DPRINT("IKsPin_PinCentricWorker Status %lx, Count %lu Remaining %lu\n", Status, + This->LeadingEdgeStreamPointer->StreamPointer.Offset->Count, + This->LeadingEdgeStreamPointer->StreamPointer.Offset->Remaining); + + ASSERT(Status != STATUS_PENDING); + + // HACK complete irp + Irp->IoStatus.Information = max(Header->DataUsed, Header->FrameExtent); + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + KsDecrementCountedWorker(This->PinWorker); + + + break; + + }while(TRUE); +} + NTSTATUS +NTAPI IKsPin_DispatchKsStream( PDEVICE_OBJECT DeviceObject, PIRP Irp, @@ -1492,6 +1710,7 @@ IKsPin_DispatchKsStream( { PKSPROCESSPIN_INDEXENTRY ProcessPinIndex; PKSFILTER Filter; + PIO_STACK_LOCATION IoStack; NTSTATUS Status = STATUS_SUCCESS; DPRINT("IKsPin_DispatchKsStream\n"); @@ -1499,18 +1718,41 @@ IKsPin_DispatchKsStream( /* FIXME handle reset states */ ASSERT(This->Pin.ResetState == KSRESET_END); - /* mark irp as pending */ - IoMarkIrpPending(Irp); + /* get current stack location */ + IoStack = IoGetCurrentIrpStackLocation(Irp); - /* add irp to cancelable queue */ - KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); + if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM) + Status = KsProbeStreamIrp(Irp, KSSTREAM_WRITE | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_SYSTEMADDRESS, This->Pin.StreamHeaderSize); + else + Status = KsProbeStreamIrp(Irp, KSSTREAM_READ | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_SYSTEMADDRESS, This->Pin.StreamHeaderSize); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("KsProbeStreamIrp failed with %x\n", Status); + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + } if (This->Pin.Descriptor->Dispatch->Process) { /* it is a pin centric avstream */ - ASSERT(0); - //Status = This->Pin.Descriptor->Dispatch->Process(&This->Pin); - /* TODO */ + + /* mark irp as pending */ + IoMarkIrpPending(Irp); + + /* add irp to cancelable queue */ + KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); + + /* sanity checks */ + ASSERT(!(This->Pin.Descriptor->Flags & KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING)); + ASSERT(This->PinWorker); + + /* start the processing loop */ + KsIncrementCountedWorker(This->PinWorker); + + Status = STATUS_PENDING; } else { @@ -1534,9 +1776,17 @@ IKsPin_DispatchKsStream( return STATUS_UNSUCCESSFUL; } + /* mark irp as pending */ + IoMarkIrpPending(Irp); + + /* add irp to cancelable queue */ + KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); + + Status = Filter->Descriptor->Dispatch->Process(Filter, ProcessPinIndex); DPRINT("IKsPin_DispatchKsStream FilterCentric: Status %lx \n", Status); + } return Status; @@ -2037,6 +2287,41 @@ KspCreatePin( return Status; } } + else if (Descriptor->Dispatch && Descriptor->Dispatch->Process) + { + /* pin centric processing filter */ + + /* allocate leading stream pointer */ + Status = _KsEdit(This->Pin.Bag, (PVOID*)&This->LeadingEdgeStreamPointer, sizeof(KSISTREAM_POINTER), sizeof(KSISTREAM_POINTER), 0); + + /* FIXME cleanup */ + ASSERT(Status == STATUS_SUCCESS); + + /* FIXME cleanup */ + ASSERT(Status == STATUS_SUCCESS); + + /* setup stream pointer offset */ + This->LeadingEdgeStreamPointer->StreamPointer.Offset = &This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut; + + /* initialize work item */ + ExInitializeWorkItem(&This->PinWorkQueueItem, IKsPin_PinCentricWorker, (PVOID)This); + + /* allocate counted work item */ + Status = KsRegisterCountedWorker(HyperCriticalWorkQueue, &This->PinWorkQueueItem, &This->PinWorker); + + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed to register Worker %lx\n", Status); + KsFreeObjectBag((KSOBJECT_BAG)This->Pin.Bag); + KsFreeObjectHeader(&This->ObjectHeader); + FreeItem(This); + FreeItem(CreateItem); + return Status; + } + + KeInitializeEvent(&This->FrameComplete, NotificationEvent, FALSE); + + } /* FIXME add pin instance to filter instance */ @@ -2045,7 +2330,6 @@ KspCreatePin( { Status = Descriptor->Dispatch->SetDataFormat(&This->Pin, NULL, NULL, This->Pin.ConnectionFormat, NULL); DPRINT("KspCreatePin SetDataFormat %lx\n", Status); - DbgBreakPoint(); } @@ -2058,7 +2342,6 @@ KspCreatePin( } - DPRINT("KspCreatePin Status %lx\n", Status); if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) From dfb82f3856967a4394e5e8ab1814c750f15734f0 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Apr 2010 21:43:51 +0000 Subject: [PATCH 039/261] [NTOSKRNL] - Revert r46720 and fix the issue properly svn path=/trunk/; revision=46724 --- reactos/ntoskrnl/io/iomgr/irp.c | 19 +++---------------- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 5 ++++- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index 21870d5f9cc..0863f58907b 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -460,22 +460,6 @@ IopCompleteRequest(IN PKAPC Apc, } else { - /* Check if we have an associated user IOSB */ - if (Irp->UserIosb) - { - /* We do, so let's give them the final status */ - _SEH2_TRY - { - /* Save the IOSB Information */ - *Irp->UserIosb = Irp->IoStatus; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Ignore any error */ - } - _SEH2_END; - } - /* * Either we didn't return from the request, or we did return but this * request was synchronous. @@ -485,6 +469,9 @@ IopCompleteRequest(IN PKAPC Apc, /* So we did return with a synch operation, was it the IRP? */ if (Irp->Flags & IRP_SYNCHRONOUS_API) { + /* Yes, this IRP was synchronous, so return the I/O Status */ + *Irp->UserIosb = Irp->IoStatus; + /* Now check if the user gave an event */ if (Irp->UserEvent) { diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 5d6c13336bc..0213d04d13e 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -163,7 +163,10 @@ IopStartDevice( DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); return Status; } - DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; + else if (NT_SUCCESS(Status)) + { + DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; + } Status = IopAssignDeviceResources(DeviceNode, &RequiredLength); if (NT_SUCCESS(Status)) From 215581f39f161e60ff2e888c3e0012a538c8b468 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 5 Apr 2010 09:29:01 +0000 Subject: [PATCH 040/261] [crypt32] sync crypt32 to wine 1.1.42 svn path=/trunk/; revision=46727 --- reactos/dll/win32/crypt32/base64.c | 54 ++++++++++-------------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/reactos/dll/win32/crypt32/base64.c b/reactos/dll/win32/crypt32/base64.c index 4a6504a488e..7a23dd9a111 100644 --- a/reactos/dll/win32/crypt32/base64.c +++ b/reactos/dll/win32/crypt32/base64.c @@ -99,8 +99,7 @@ static LONG encodeBase64A(const BYTE *in_buf, int in_len, LPCSTR sep, TRACE("bytes is %d, pad bytes is %d\n", bytes, pad_bytes); needed = bytes + pad_bytes + 1; - if (sep) - needed += (needed / 64 + 1) * strlen(sep); + needed += (needed / 64 + 1) * strlen(sep); if (needed > *out_len) { @@ -117,7 +116,7 @@ static LONG encodeBase64A(const BYTE *in_buf, int in_len, LPCSTR sep, i = 0; while (div > 0) { - if (sep && i && i % 64 == 0) + if (i && i % 64 == 0) { strcpy(ptr, sep); ptr += strlen(sep); @@ -163,8 +162,7 @@ static LONG encodeBase64A(const BYTE *in_buf, int in_len, LPCSTR sep, *ptr++ = '='; break; } - if (sep) - strcpy(ptr, sep); + strcpy(ptr, sep); return ERROR_SUCCESS; } @@ -180,7 +178,7 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, if (dwFlags & CRYPT_STRING_NOCR) sep = lf; else if (dwFlags & CRYPT_STRING_NOCRLF) - sep = NULL; + sep = ""; else sep = crlf; switch (dwFlags & 0x0fffffff) @@ -204,8 +202,6 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, charsNeeded = 0; encodeBase64A(pbBinary, cbBinary, sep, NULL, &charsNeeded); - if (sep) - charsNeeded += strlen(sep); if (header) charsNeeded += strlen(header) + strlen(sep); if (trailer) @@ -219,11 +215,8 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, { strcpy(ptr, header); ptr += strlen(ptr); - if (sep) - { - strcpy(ptr, sep); - ptr += strlen(sep); - } + strcpy(ptr, sep); + ptr += strlen(sep); } encodeBase64A(pbBinary, cbBinary, sep, ptr, &size); ptr += size - 1; @@ -231,11 +224,8 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, { strcpy(ptr, trailer); ptr += strlen(ptr); - if (sep) - { - strcpy(ptr, sep); - ptr += strlen(sep); - } + strcpy(ptr, sep); + ptr += strlen(sep); } *pcchString = charsNeeded - 1; } @@ -304,8 +294,7 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep, TRACE("bytes is %d, pad bytes is %d\n", bytes, pad_bytes); needed = bytes + pad_bytes + 1; - if (sep) - needed += (needed / 64 + 1) * strlenW(sep); + needed += (needed / 64 + 1) * strlenW(sep); if (needed > *out_len) { @@ -322,7 +311,7 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep, i = 0; while (div > 0) { - if (sep && i && i % 64 == 0) + if (i && i % 64 == 0) { strcpyW(ptr, sep); ptr += strlenW(sep); @@ -368,8 +357,7 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep, *ptr++ = '='; break; } - if (sep) - strcpyW(ptr, sep); + strcpyW(ptr, sep); return ERROR_SUCCESS; } @@ -377,7 +365,7 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep, static BOOL BinaryToBase64W(const BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPWSTR pszString, DWORD *pcchString) { - static const WCHAR crlf[] = { '\r','\n',0 }, lf[] = { '\n',0 }; + static const WCHAR crlf[] = { '\r','\n',0 }, lf[] = { '\n',0 }, empty[] = {0}; BOOL ret = TRUE; LPCWSTR header = NULL, trailer = NULL, sep; DWORD charsNeeded; @@ -385,7 +373,7 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, if (dwFlags & CRYPT_STRING_NOCR) sep = lf; else if (dwFlags & CRYPT_STRING_NOCRLF) - sep = NULL; + sep = empty; else sep = crlf; switch (dwFlags & 0x0fffffff) @@ -409,8 +397,6 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, charsNeeded = 0; encodeBase64W(pbBinary, cbBinary, sep, NULL, &charsNeeded); - if (sep) - charsNeeded += strlenW(sep); if (header) charsNeeded += strlenW(header) + strlenW(sep); if (trailer) @@ -424,11 +410,8 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, { strcpyW(ptr, header); ptr += strlenW(ptr); - if (sep) - { - strcpyW(ptr, sep); - ptr += strlenW(sep); - } + strcpyW(ptr, sep); + ptr += strlenW(sep); } encodeBase64W(pbBinary, cbBinary, sep, ptr, &size); ptr += size - 1; @@ -436,11 +419,8 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, { strcpyW(ptr, trailer); ptr += strlenW(ptr); - if (sep) - { - strcpyW(ptr, sep); - ptr += strlenW(sep); - } + strcpyW(ptr, sep); + ptr += strlenW(sep); } *pcchString = charsNeeded - 1; } From c174a972b499efd7f8e88d57a3189ffab467c645 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 5 Apr 2010 09:39:06 +0000 Subject: [PATCH 041/261] [mscoree] sync mscoree to wine 1.1.42 svn path=/trunk/; revision=46728 --- reactos/dll/win32/mscoree/mscoree.spec | 2 +- reactos/dll/win32/mscoree/mscoree_main.c | 33 +++++++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/mscoree/mscoree.spec b/reactos/dll/win32/mscoree/mscoree.spec index 9365f189b51..8e25cec2b7d 100644 --- a/reactos/dll/win32/mscoree/mscoree.spec +++ b/reactos/dll/win32/mscoree/mscoree.spec @@ -7,7 +7,7 @@ @ stub CallFunctionShim @ stub CloseCtrs -@ stub ClrCreateManagedInstance +@ stdcall ClrCreateManagedInstance(wstr ptr ptr) @ stub CoEEShutDownCOM @ stdcall CoInitializeCor(long) @ stub CoInitializeEE diff --git a/reactos/dll/win32/mscoree/mscoree_main.c b/reactos/dll/win32/mscoree/mscoree_main.c index dcdc91a5cc1..5b20c854c2e 100644 --- a/reactos/dll/win32/mscoree/mscoree_main.c +++ b/reactos/dll/win32/mscoree/mscoree_main.c @@ -91,9 +91,9 @@ HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor { WCHAR *mono_exe; - FIXME("(%s, %s, %s, %p, %d, %p, %p, %p): semi-stub!\n", debugstr_w(pwszVersion), + FIXME("(%s, %s, %s, %p, %d, %s, %s, %p): semi-stub!\n", debugstr_w(pwszVersion), debugstr_w(pwszBuildFlavor), debugstr_w(pwszHostConfigFile), pReserved, - startupFlags, rclsid, riid, ppv); + startupFlags, debugstr_guid(rclsid), debugstr_guid(riid), ppv); if (!(mono_exe = get_mono_exe())) { @@ -144,6 +144,11 @@ __int32 WINAPI _CorExeMain(void) PROCESS_INFORMATION pi; WCHAR *mono_exe, *cmd_line; DWORD size, exit_code; + static const WCHAR WINE_MONO_TRACE[]={'W','I','N','E','_','M','O','N','O','_','T','R','A','C','E',0}; + static const WCHAR trace_switch_start[]={'"','-','-','t','r','a','c','e','=',0}; + static const WCHAR trace_switch_end[]={'"',' ',0}; + int trace_size; + WCHAR trace_setting[256]; if (!(mono_exe = get_mono_exe())) { @@ -151,7 +156,13 @@ __int32 WINAPI _CorExeMain(void) return -1; } + trace_size = GetEnvironmentVariableW(WINE_MONO_TRACE, trace_setting, sizeof(trace_setting)/sizeof(WCHAR)); + size = (lstrlenW(mono_exe) + lstrlenW(GetCommandLineW()) + 1) * sizeof(WCHAR); + + if (trace_size) + size += (trace_size + lstrlenW(trace_switch_start) + lstrlenW(trace_switch_end)) * sizeof(WCHAR); + if (!(cmd_line = HeapAlloc(GetProcessHeap(), 0, size))) { HeapFree(GetProcessHeap(), 0, mono_exe); @@ -160,6 +171,14 @@ __int32 WINAPI _CorExeMain(void) lstrcpyW(cmd_line, mono_exe); HeapFree(GetProcessHeap(), 0, mono_exe); + + if (trace_size) + { + lstrcatW(cmd_line, trace_switch_start); + lstrcatW(cmd_line, trace_setting); + lstrcatW(cmd_line, trace_switch_end); + } + lstrcatW(cmd_line, GetCommandLineW()); TRACE("new command line: %s\n", debugstr_w(cmd_line)); @@ -271,7 +290,7 @@ HRESULT WINAPI CoInitializeCor(DWORD fFlags) HRESULT WINAPI GetAssemblyMDImport(LPCWSTR szFileName, REFIID riid, IUnknown **ppIUnk) { - FIXME("(%p %s, %p, %p): stub\n", szFileName, debugstr_w(szFileName), riid, *ppIUnk); + FIXME("(%p %s, %s, %p): stub\n", szFileName, debugstr_w(szFileName), debugstr_guid(riid), *ppIUnk); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -324,6 +343,12 @@ HRESULT WINAPI CorBindToCurrentRuntime(LPCWSTR filename, REFCLSID rclsid, REFIID return E_NOTIMPL; } +STDAPI ClrCreateManagedInstance(LPCWSTR pTypeName, REFIID riid, void **ppObject) +{ + FIXME("(%s,%s,%p)\n", debugstr_w(pTypeName), debugstr_guid(riid), ppObject); + return E_NOTIMPL; +} + BOOL WINAPI StrongNameSignatureVerification(LPCWSTR filename, DWORD inFlags, DWORD* pOutFlags) { FIXME("(%s, 0x%X, %p): stub\n", debugstr_w(filename), inFlags, pOutFlags); @@ -338,7 +363,7 @@ BOOL WINAPI StrongNameSignatureVerificationEx(LPCWSTR filename, BOOL forceVerifi HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { - FIXME("(%p, %p, %p): stub\n", rclsid, riid, ppv); + FIXME("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); if(!ppv) return E_INVALIDARG; From 59929a1790e384d4e08ba76b0128c8faa4021737 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 5 Apr 2010 09:40:24 +0000 Subject: [PATCH 042/261] [qedit] sync qedit to wine 1.1.42 svn path=/trunk/; revision=46729 --- reactos/dll/directx/qedit/samplegrabber.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/directx/qedit/samplegrabber.c b/reactos/dll/directx/qedit/samplegrabber.c index 1875c51c49e..78a7306e10e 100644 --- a/reactos/dll/directx/qedit/samplegrabber.c +++ b/reactos/dll/directx/qedit/samplegrabber.c @@ -854,7 +854,7 @@ SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSi static HRESULT WINAPI SampleGrabber_ISampleGrabber_GetCurrentSample(ISampleGrabber *iface, IMediaSample **sample) { - /* MS doesn't implement it either, noone should call it */ + /* MS doesn't implement it either, no one should call it */ WARN("(%p): not implemented\n", sample); return E_NOTIMPL; } @@ -1264,7 +1264,7 @@ SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes) TRACE("(%p)->(%p)\n", This, mtypes); if (!mtypes) return E_POINTER; - *mtypes = mediaenum_create(This->sg->pin_in.pair ? &This->sg->mtype : (const AM_MEDIA_TYPE *)NULL); + *mtypes = mediaenum_create(This->sg->pin_in.pair ? &This->sg->mtype : NULL); return *mtypes ? S_OK : E_OUTOFMEMORY; } From 56ab20eda40f98ac622df3700e418c563ca814a6 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 5 Apr 2010 09:44:43 +0000 Subject: [PATCH 043/261] [quartz] sync quartz to wine 1.1.42 svn path=/trunk/; revision=46730 --- reactos/dll/directx/quartz/avidec.c | 2 +- reactos/dll/directx/quartz/avisplit.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/directx/quartz/avidec.c b/reactos/dll/directx/quartz/avidec.c index 68b1908d6e6..8469bbc9f29 100644 --- a/reactos/dll/directx/quartz/avidec.c +++ b/reactos/dll/directx/quartz/avidec.c @@ -203,7 +203,7 @@ static HRESULT AVIDec_ConnectInput(InputPin *pin, const AM_MEDIA_TYPE * pmt) bmi = &format2->bmiHeader; else goto failed; - TRACE("Fourcc: %s\n", debugstr_an((char *)&pmt->subtype.Data1, 4)); + TRACE("Fourcc: %s\n", debugstr_an((const char *)&pmt->subtype.Data1, 4)); This->hvid = ICLocate(pmt->majortype.Data1, pmt->subtype.Data1, bmi, NULL, ICMODE_DECOMPRESS); if (This->hvid) diff --git a/reactos/dll/directx/quartz/avisplit.c b/reactos/dll/directx/quartz/avisplit.c index faa844b4848..42ec2ae2b34 100644 --- a/reactos/dll/directx/quartz/avisplit.c +++ b/reactos/dll/directx/quartz/avisplit.c @@ -692,7 +692,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE amt.formattype = FORMAT_WaveFormatEx; break; default: - FIXME("fccType %.4s not handled yet\n", (char *)&pStrHdr->fccType); + FIXME("fccType %.4s not handled yet\n", (const char *)&pStrHdr->fccType); amt.formattype = FORMAT_None; } amt.majortype = MEDIATYPE_Video; @@ -793,7 +793,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE TRACE("bIndexSubType: %hd\n", pIndex->bIndexSubType); TRACE("bIndexType: %hd\n", pIndex->bIndexType); TRACE("nEntriesInUse: %u\n", pIndex->nEntriesInUse); - TRACE("dwChunkId: %.4s\n", (char *)&pIndex->dwChunkId); + TRACE("dwChunkId: %.4s\n", (const char *)&pIndex->dwChunkId); if (pIndex->dwReserved[0]) TRACE("dwReserved[0]: %u\n", pIndex->dwReserved[0]); if (pIndex->dwReserved[2]) From 817ca6d3d7ea4e505e56ee4098ca3ee96b6ceafb Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 5 Apr 2010 09:51:49 +0000 Subject: [PATCH 044/261] =?UTF-8?q?[SHELL]=20-=20Updated=20Spanish=20trans?= =?UTF-8?q?lation=20by=20Javier=20Fernand=C3=A9z=20See=20issue=20#1494=20f?= =?UTF-8?q?or=20more=20details.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=46731 --- reactos/dll/win32/shell32/lang/es-ES.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index a0dacf6a7a7..8704146f23c 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -668,8 +668,8 @@ BEGIN IDS_RESTART_PROMPT "¿Desea reiniciar el equipo?" IDS_SHUTDOWN_TITLE "Apagar" IDS_SHUTDOWN_PROMPT "¿Desea apagar el equipo?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" + IDS_LOGOFF_TITLE "Cerrar sesión" + IDS_LOGOFF_PROMPT "¿Desea cerrar la sesión?" /* shell folder path default values */ IDS_PROGRAMS "Menú Inicio\\Programas" From 222e4f03b92c18f0e6cd9ed41295396ae397b813 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 5 Apr 2010 12:23:30 +0000 Subject: [PATCH 045/261] [usb/usbehci] - Modify UsbDevice structure to hold all the device's configurations vice only the active one. - Change code to handle new UsbDevice structure and data. - Add missing Status assignment for IOCTLs get device handle and get hub count. - When checking port status in deffered routine continue looping through the ports if the device is not high speed. - Implement direct call functions InitializeUsbDevice, QueryDeviceInformation and GetControllerInformation. - Fix incorrect return type for direct call function GetUSBDIVersion. - Remove no longer needed structures from usbiffn.h as they are now in usbbusif.h and hubbusif.h. - Code based on XEN PV Drivers by James Harper. svn path=/trunk/; revision=46735 --- reactos/drivers/usb/usbehci/fdo.c | 7 +- reactos/drivers/usb/usbehci/irp.c | 63 ++++++++----- reactos/drivers/usb/usbehci/pdo.c | 70 ++++++++++++--- reactos/drivers/usb/usbehci/usbehci.h | 41 +++++++-- reactos/drivers/usb/usbehci/usbiffn.c | 123 ++++++++++++++++++++++++-- reactos/drivers/usb/usbehci/usbiffn.h | 72 +-------------- 6 files changed, 258 insertions(+), 118 deletions(-) diff --git a/reactos/drivers/usb/usbehci/fdo.c b/reactos/drivers/usb/usbehci/fdo.c index b1ec5503cb6..b85ab4fefc2 100644 --- a/reactos/drivers/usb/usbehci/fdo.c +++ b/reactos/drivers/usb/usbehci/fdo.c @@ -83,11 +83,11 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO DPRINT1("Releasing ownership to companion host controller!\n"); /* Release ownership to companion host controller */ WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), 0x4000); + continue; } } KeStallExecutionProcessor(30); - DPRINT("port tmp %x\n", tmp); /* As per USB 2.0 Specs, 9.1.2. Reset the port and clear the status change */ tmp |= 0x100 | 0x02; @@ -545,6 +545,7 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART StartEhci(DeviceObject); FdoDeviceExtension->DeviceState = DEVICESTARTED; + return STATUS_SUCCESS; } @@ -814,7 +815,6 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) IoDetachDevice(FdoDeviceExtension->LowerDevice); IoDeleteSymbolicLink(&SymLinkName); IoDeleteDevice(Fdo); - return STATUS_UNSUCCESSFUL; } @@ -840,11 +840,14 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) if (!NT_SUCCESS(Status)) { DPRINT1("Unable to register device interface!\n"); + ASSERT(FALSE); } else { Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); DPRINT1("SetInterfaceState %x\n", Status); + if (!NT_SUCCESS(Status)) + ASSERT(FALSE); } Fdo->Flags &= ~DO_DEVICE_INITIALIZING; diff --git a/reactos/drivers/usb/usbehci/irp.c b/reactos/drivers/usb/usbehci/irp.c index 06d7c50ab08..54b3b9738d2 100644 --- a/reactos/drivers/usb/usbehci/irp.c +++ b/reactos/drivers/usb/usbehci/irp.c @@ -101,7 +101,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT1("--->TransferBufferLength %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); DPRINT1("--->TransferBuffer %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBuffer); DPRINT1("--->PipeHandle %x\n",Urb->UrbBulkOrInterruptTransfer.PipeHandle); - DPRINT1("---->(PVOID)&UsbDevice->EndPointDescriptor %x\n", (PVOID)&UsbDevice->EndPointDescriptor); + DPRINT1("---->(PVOID)&UsbDevice->EndPointDescriptor %x\n", (PVOID)&UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor); DPRINT1("--->TransferFlags %x\n", Urb->UrbBulkOrInterruptTransfer.TransferFlags); RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); @@ -142,6 +142,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT1("Uknown identifier\n"); Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; Status = STATUS_UNSUCCESSFUL; + ASSERT(FALSE); } break; } @@ -164,19 +165,39 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) } case USB_CONFIGURATION_DESCRIPTOR_TYPE: { - DPRINT1("USB CONFIG DESC\n"); - ULONG FullDescriptorLength = sizeof(USB_CONFIGURATION_DESCRIPTOR) + - sizeof(USB_INTERFACE_DESCRIPTOR) + - sizeof(USB_ENDPOINT_DESCRIPTOR); + PUCHAR BufPtr; + LONG i, j; - if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= FullDescriptorLength) + DPRINT1("USB CONFIG DESC\n"); + + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= UsbDevice->ActiveConfig->ConfigurationDescriptor.wTotalLength) { - Urb->UrbControlDescriptorRequest.TransferBufferLength = FullDescriptorLength; + Urb->UrbControlDescriptorRequest.TransferBufferLength = UsbDevice->ActiveConfig->ConfigurationDescriptor.wTotalLength; + } + else + { + DPRINT1("Buffer to small!!!\n"); + ASSERT(FALSE); + } + + BufPtr = (PUCHAR)Urb->UrbControlDescriptorRequest.TransferBuffer; + + /* Copy the Configuration Descriptor */ + RtlCopyMemory(BufPtr, &UsbDevice->ActiveConfig->ConfigurationDescriptor, sizeof(USB_CONFIGURATION_DESCRIPTOR)); + BufPtr += sizeof(USB_CONFIGURATION_DESCRIPTOR); + for (i = 0; i < UsbDevice->ActiveConfig->ConfigurationDescriptor.bNumInterfaces; i++) + { + /* Copy the Interface Descriptor */ + RtlCopyMemory(BufPtr, &UsbDevice->ActiveConfig->Interfaces[i]->InterfaceDescriptor, sizeof(USB_INTERFACE_DESCRIPTOR)); + BufPtr += sizeof(USB_INTERFACE_DESCRIPTOR); + for (j = 0; j < UsbDevice->ActiveConfig->Interfaces[i]->InterfaceDescriptor.bNumEndpoints; j++) + { + /* Copy the EndPoint Descriptor */ + RtlCopyMemory(BufPtr, &UsbDevice->ActiveConfig->Interfaces[i]->EndPoints[j]->EndPointDescriptor, sizeof(USB_ENDPOINT_DESCRIPTOR)); + BufPtr += sizeof(USB_ENDPOINT_DESCRIPTOR); + } } - RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, - &UsbDevice->ConfigurationDescriptor, - Urb->UrbControlDescriptorRequest.TransferBufferLength); break; } case USB_STRING_DESCRIPTOR_TYPE: @@ -213,7 +234,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT(" MaxPower = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->MaxPower); - Urb->UrbSelectConfiguration.ConfigurationHandle = (PVOID)&DeviceExtension->UsbDevices[0]->ConfigurationDescriptor; + Urb->UrbSelectConfiguration.ConfigurationHandle = (PVOID)&DeviceExtension->UsbDevices[0]->ActiveConfig->ConfigurationDescriptor; DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); InterfaceInfo = &Urb->UrbSelectConfiguration.Interface; @@ -229,10 +250,10 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT(" Reserved = %02x\n", (ULONG)InterfaceInfo->Reserved); DPRINT(" InterfaceHandle = %p\n", InterfaceInfo->InterfaceHandle); DPRINT(" NumberOfPipes = %d\n", InterfaceInfo->NumberOfPipes); - InterfaceInfo->InterfaceHandle = (PVOID)&UsbDevice->InterfaceDescriptor; - InterfaceInfo->Class = UsbDevice->InterfaceDescriptor.bInterfaceClass; - InterfaceInfo->SubClass = UsbDevice->InterfaceDescriptor.bInterfaceSubClass; - InterfaceInfo->Protocol = UsbDevice->InterfaceDescriptor.bInterfaceProtocol; + InterfaceInfo->InterfaceHandle = (PVOID)&UsbDevice->ActiveInterface->InterfaceDescriptor; + InterfaceInfo->Class = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceClass; + InterfaceInfo->SubClass = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceSubClass; + InterfaceInfo->Protocol = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceProtocol; InterfaceInfo->Reserved = 0; for (pCount = 0; pCount < InterfaceInfo->NumberOfPipes; pCount++) @@ -245,11 +266,11 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT(" PipeHandle = %x\n", InterfaceInfo->Pipes[pCount].PipeHandle); DPRINT(" MaximumTransferSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumTransferSize); DPRINT(" PipeFlags = %08x\n", InterfaceInfo->Pipes[pCount].PipeFlags); - InterfaceInfo->Pipes[pCount].MaximumPacketSize = UsbDevice->EndPointDescriptor.wMaxPacketSize; - InterfaceInfo->Pipes[pCount].EndpointAddress = UsbDevice->EndPointDescriptor.bEndpointAddress; - InterfaceInfo->Pipes[pCount].Interval = UsbDevice->EndPointDescriptor.bInterval; + InterfaceInfo->Pipes[pCount].MaximumPacketSize = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.wMaxPacketSize; + InterfaceInfo->Pipes[pCount].EndpointAddress = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.bEndpointAddress; + InterfaceInfo->Pipes[pCount].Interval = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.bInterval; InterfaceInfo->Pipes[pCount].PipeType = UsbdPipeTypeInterrupt; - InterfaceInfo->Pipes[pCount].PipeHandle = (PVOID)&UsbDevice->EndPointDescriptor; + InterfaceInfo->Pipes[pCount].PipeHandle = (PVOID)&UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor; if (InterfaceInfo->Pipes[pCount].MaximumTransferSize == 0) InterfaceInfo->Pipes[pCount].MaximumTransferSize = 4096; /* InterfaceInfo->Pipes[j].PipeFlags = 0; */ @@ -315,6 +336,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) break; } case USB_DEVICE_CLASS_RESERVED: + DPRINT1("Reserved!!!\n"); case USB_DEVICE_CLASS_HUB: { PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer; @@ -328,7 +350,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) /* FIXME: Handle this correctly */ UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); UsbHubDescr->bDescriptorType = 0x29; - return; + break; } DPRINT1("USB_DEVICE_CLASS_HUB request\n"); UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); @@ -425,7 +447,6 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) case USB_REQUEST_SET_ADDRESS: { DPRINT1("USB_REQUEST_SET_ADDRESS\n"); - ASSERT(FALSE); break; } case USB_REQUEST_GET_DESCRIPTOR: diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index 6a0d735e851..84073a11fa0 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -11,8 +11,10 @@ #define NDEBUG #include "usbehci.h" -#include +#include +#include #include "usbiffn.h" +#include #include #include @@ -51,8 +53,11 @@ const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] = 6: Self-powered, 5: Remote wakeup, 4..0: reserved */ - 0x00, /* MaxPower; */ + 0x00 /* MaxPower; */ +}; +const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] = +{ /* one interface */ 0x09, /* bLength: Interface; */ 0x04, /* bDescriptorType; Interface */ @@ -62,8 +67,11 @@ const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] = 0x09, /* bInterfaceClass; HUB_CLASSCODE */ 0x01, /* bInterfaceSubClass; */ 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface; */ + 0x00 /* iInterface; */ +}; +const UCHAR ROOTHUB2_ENDPOINT_DESCRIPTOR [] = +{ /* one endpoint (status change endpoint) */ 0x07, /* bLength; */ 0x05, /* bDescriptorType; Endpoint */ @@ -87,7 +95,6 @@ UrbWorkerThread(PVOID Context) DPRINT1("Thread terminated\n"); } -/* FIXME: Do something better */ PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) { PUSB_DEVICE UsbDevicePointer = NULL; @@ -98,6 +105,8 @@ PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent return NULL; } + RtlZeroMemory(UsbDevicePointer, sizeof(USB_DEVICE)); + if ((Hub) && (!Parent)) { DPRINT1("This is the root hub\n"); @@ -176,21 +185,27 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) if (Stack->Parameters.Others.Argument1) { /* Return the root hubs devicehandle */ + DPRINT1("Returning RootHub Handle %x\n", PdoDeviceExtension->UsbDevices[0]); *(PVOID *)Stack->Parameters.Others.Argument1 = (PVOID)PdoDeviceExtension->UsbDevices[0]; + Status = STATUS_SUCCESS; } else Status = STATUS_INVALID_DEVICE_REQUEST; + break; + } case IOCTL_INTERNAL_USB_GET_HUB_COUNT: { DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT); + ASSERT(Stack->Parameters.Others.Argument1 != NULL); if (Stack->Parameters.Others.Argument1) { /* FIXME: Determine the number of hubs between the usb device and root hub */ - /* For now return 1, the root hub */ - *(PVOID *)Stack->Parameters.Others.Argument1 = (PVOID)1; + DPRINT1("RootHubCount %x\n", *(PULONG)Stack->Parameters.Others.Argument1); + *(PULONG)Stack->Parameters.Others.Argument1 = 0; } + Status = STATUS_SUCCESS; break; } case IOCTL_INTERNAL_USB_GET_HUB_NAME: @@ -220,7 +235,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) if (Stack->Parameters.Others.Argument1) *(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo; if (Stack->Parameters.Others.Argument2) - *(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDevice(FdoDeviceExtension->DeviceObject); + *(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDeviceReference(FdoDeviceExtension->DeviceObject); Information = 0; Status = STATUS_SUCCESS; @@ -275,6 +290,7 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) SourceString.Length = SourceString.MaximumLength = Index * sizeof(WCHAR); SourceString.Buffer = Buffer; break; + } case BusQueryCompatibleIDs: { @@ -375,10 +391,44 @@ PdoDispatchPnp( RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId; RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId; - RtlCopyMemory(&RootHubDevice->ConfigurationDescriptor, + RootHubDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PVOID) * RootHubDevice->DeviceDescriptor.bNumConfigurations, + USB_POOL_TAG); + + RootHubDevice->Configs[0] = ExAllocatePoolWithTag(NonPagedPool, + sizeof(USB_CONFIGURATION) + sizeof(PVOID) * ROOTHUB2_CONFIGURATION_DESCRIPTOR[5], + USB_POOL_TAG); + + RootHubDevice->Configs[0]->Interfaces[0] = ExAllocatePoolWithTag(NonPagedPool, + sizeof(USB_INTERFACE) + sizeof(PVOID) * ROOTHUB2_INTERFACE_DESCRIPTOR[3], + USB_POOL_TAG); + + RootHubDevice->Configs[0]->Interfaces[0]->EndPoints[0] = ExAllocatePoolWithTag(NonPagedPool, + sizeof(USB_ENDPOINT), + USB_POOL_TAG); + + DPRINT1("before: ActiveConfig %x\n", RootHubDevice->ActiveConfig); + RootHubDevice->ActiveConfig = RootHubDevice->Configs[0]; + DPRINT1("after: ActiveConfig %x\n", RootHubDevice->ActiveConfig); + + DPRINT1("before: ActiveConfig->Interfaces[0] %x\n", RootHubDevice->ActiveConfig->Interfaces[0]); + RootHubDevice->ActiveInterface = RootHubDevice->ActiveConfig->Interfaces[0]; + + + RtlCopyMemory(&RootHubDevice->ActiveConfig->ConfigurationDescriptor, ROOTHUB2_CONFIGURATION_DESCRIPTOR, sizeof(ROOTHUB2_CONFIGURATION_DESCRIPTOR)); + RtlCopyMemory(&RootHubDevice->ActiveConfig->Interfaces[0]->InterfaceDescriptor, + ROOTHUB2_INTERFACE_DESCRIPTOR, + sizeof(ROOTHUB2_INTERFACE_DESCRIPTOR)); + + RtlCopyMemory(&RootHubDevice->ActiveConfig->Interfaces[0]->EndPoints[0]->EndPointDescriptor, + ROOTHUB2_ENDPOINT_DESCRIPTOR, + sizeof(ROOTHUB2_ENDPOINT_DESCRIPTOR)); + RootHubDevice->DeviceSpeed = UsbHighSpeed; + RootHubDevice->DeviceType = Usb20Device; + PdoDeviceExtension->UsbDevices[0] = RootHubDevice; /* Create a thread to handle the URB's */ @@ -397,14 +447,15 @@ PdoDispatchPnp( if (!NT_SUCCESS(Status)) { DPRINT1("Failed to register interface\n"); + ASSERT(FALSE); } else { Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); DPRINT1("Set interface state %x\n", Status); + if (!NT_SUCCESS(Status)) ASSERT(FALSE); } - Status = STATUS_SUCCESS; break; } @@ -593,4 +644,3 @@ PdoDispatchPnp( IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } - diff --git a/reactos/drivers/usb/usbehci/usbehci.h b/reactos/drivers/usb/usbehci/usbehci.h index 13bfabb3657..6d6a570ce98 100644 --- a/reactos/drivers/usb/usbehci/usbehci.h +++ b/reactos/drivers/usb/usbehci/usbehci.h @@ -5,10 +5,12 @@ #include #define NDEBUG #include -#include "usbiffn.h" +#include #include #include +#define USB_POOL_TAG (ULONG)'UsbR' + #define DEVICEINTIALIZED 0x01 #define DEVICESTARTED 0x02 #define DEVICEBUSY 0x04 @@ -196,21 +198,46 @@ typedef struct _EHCI_SETUP_FORMAT typedef struct _STRING_DESCRIPTOR { - UCHAR bLength; /* Size of this descriptor in bytes */ + UCHAR bLength; /* Size of this descriptor in bytes */ UCHAR bDescriptorType; /* STRING Descriptor Type */ - UCHAR bString[0]; /* UNICODE encoded string */ + UCHAR bString[0]; /* UNICODE encoded string */ } STRING_DESCRIPTOR, *PSTRING_DESCRIPTOR; +typedef struct _USB_ENDPOINT +{ + ULONG Flags; + LIST_ENTRY UrbList; + struct _USB_INTERFACE *Interface; + USB_ENDPOINT_DESCRIPTOR EndPointDescriptor; +} USB_ENDPOINT, *PUSB_ENDPOINT; + +typedef struct _USB_INTERFACE +{ + struct _USB_CONFIGURATION *Config; + USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; + USB_ENDPOINT *EndPoints[]; +} USB_INTERFACE, *PUSB_INTERFACE; + +typedef struct _USB_CONFIGURATION +{ + struct _USB_DEVICE *Device; + USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + USB_INTERFACE *Interfaces[]; +} USB_CONFIGURATION, *PUSB_CONFIGURATION; + typedef struct _USB_DEVICE { UCHAR Address; ULONG Port; PVOID ParentDevice; BOOLEAN IsHub; + USB_DEVICE_SPEED DeviceSpeed; + USB_DEVICE_TYPE DeviceType; USB_DEVICE_DESCRIPTOR DeviceDescriptor; - USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; - USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; - USB_ENDPOINT_DESCRIPTOR EndPointDescriptor; + USB_CONFIGURATION *ActiveConfig; + USB_INTERFACE *ActiveInterface; + USB_CONFIGURATION **Configs; + } USB_DEVICE, *PUSB_DEVICE; /* USBCMD register 32 bits */ @@ -382,7 +409,7 @@ typedef struct _PDO_DEVICE_EXTENSION ULONG ChildDeviceCount; BOOLEAN HaltUrbHandling; PVOID CallbackContext; - PRH_INIT_CALLBACK CallbackRoutine; + RH_INIT_CALLBACK *CallbackRoutine; ULONG NumberOfPorts; EHCIPORTS Ports[32]; } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c index 47fefb610b3..e30aa305e7a 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.c +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -7,12 +7,33 @@ * Michael Martin */ -/* usbbusif.h and hubbusif.h need to be imported */ #include "usbehci.h" -#include "usbiffn.h" -#define NDEBUG +#include +#include +#define NDEBUG #include +BOOLEAN +IsHandleValid(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle) +{ + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + LONG i; + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) BusContext; + + if (!DeviceHandle) + return FALSE; + + for (i = 0; i < 128; i++) + { + if (PdoDeviceExtension->UsbDevices[i] == DeviceHandle) + return TRUE; + } + + return FALSE; +} + VOID USB_BUSIFFN InterfaceReference(PVOID BusContext) @@ -44,8 +65,21 @@ NTSTATUS USB_BUSIFFN InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) { + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + LONG i; DPRINT1("InitializeUsbDevice called\n"); - return STATUS_SUCCESS; + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; + /* Find the device handle */ + for (i = 0; i < PdoDeviceExtension->ChildDeviceCount; i++) + { + if (DeviceHandle == PdoDeviceExtension->UsbDevices[i]) + { + DPRINT1("Device Handle Found!\n"); + return STATUS_SUCCESS; + } + } + return STATUS_DEVICE_DATA_ERROR; } NTSTATUS @@ -93,7 +127,52 @@ QueryDeviceInformation(PVOID BusContext, ULONG DeviceInformationBufferLength, PULONG LengthReturned) { - DPRINT1("QueryDeviceInformation called\n"); + PUSB_DEVICE_INFORMATION_0 DeviceInfo = DeviceInformationBuffer; + PUSB_DEVICE UsbDevice = (PUSB_DEVICE) DeviceHandle; + ULONG SizeNeeded; + LONG i; + + DPRINT1("QueryDeviceInformation (%x, %x, %x, %d, %x\n", BusContext, DeviceHandle, DeviceInformationBuffer, DeviceInformationBufferLength, LengthReturned); + + /* Search for a valid usb device in this BusContext */ + if (!IsHandleValid(BusContext, DeviceHandle)) + { + DPRINT1("Not a valid DeviceHandle\n"); + return STATUS_INVALID_PARAMETER; + } + + SizeNeeded = FIELD_OFFSET(USB_DEVICE_INFORMATION_0, PipeList[UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints]); + *LengthReturned = SizeNeeded; + + DeviceInfo->ActualLength = SizeNeeded; + + if (DeviceInformationBufferLength < SizeNeeded) + { + DPRINT1("Buffer to small\n"); + return STATUS_BUFFER_TOO_SMALL; + } + + if (DeviceInfo->InformationLevel != 0) + { + DPRINT1("Invalid Param\n"); + return STATUS_INVALID_PARAMETER; + } + + DeviceInfo->PortNumber = UsbDevice->Port; + DeviceInfo->HubAddress = 1; + DeviceInfo->DeviceAddress = UsbDevice->Address; + DeviceInfo->DeviceSpeed = UsbDevice->DeviceSpeed; + DeviceInfo->DeviceType = UsbDevice->DeviceType; + DeviceInfo->CurrentConfigurationValue = UsbDevice->ActiveConfig->ConfigurationDescriptor.bConfigurationValue; + DeviceInfo->NumberOfOpenPipes = UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints; + + RtlCopyMemory(&DeviceInfo->DeviceDescriptor, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); + + for (i = 0; i < UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints; i++) + { + RtlCopyMemory(&DeviceInfo->PipeList[i].EndpointDescriptor, &UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor, sizeof(USB_ENDPOINT_DESCRIPTOR)); + } + return STATUS_SUCCESS; } @@ -104,7 +183,29 @@ GetControllerInformation(PVOID BusContext, ULONG ControllerInformationBufferLength, PULONG LengthReturned) { + PUSB_CONTROLLER_INFORMATION_0 ControllerInfo; + DPRINT1("GetControllerInformation called\n"); + ControllerInfo = ControllerInformationBuffer; + + if (ControllerInformationBufferLength < sizeof(USB_CONTROLLER_INFORMATION_0)) + { + DPRINT1("Buffer to small\n"); + return STATUS_BUFFER_TOO_SMALL; + } + + if (ControllerInfo->InformationLevel != 0) + { + DPRINT1("InformationLevel other than 0 not supported\n"); + return STATUS_NOT_SUPPORTED; + } + + ControllerInfo->ActualLength = sizeof(USB_CONTROLLER_INFORMATION_0); + ControllerInfo->SelectiveSuspendEnabled = FALSE; + ControllerInfo->IsHighSpeedController = TRUE; + + *LengthReturned = ControllerInfo->ActualLength; + return STATUS_SUCCESS; } @@ -113,7 +214,7 @@ USB_BUSIFFN ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable) { DPRINT1("ControllerSelectiveSuspend called\n"); - return STATUS_SUCCESS; + return STATUS_NOT_SUPPORTED; } NTSTATUS @@ -162,6 +263,12 @@ GetRootHubSymbolicName(PVOID BusContext, PULONG HubSymNameActualLength) { DPRINT1("GetRootHubSymbolicName called\n"); + + if (HubSymNameBufferLength < 20) + return STATUS_UNSUCCESSFUL; + //RtlStringCbCopy(HubSymNameBuffer, HubSymNameBufferLength, L"ROOT_HUB20"); + *HubSymNameActualLength = 20; + return STATUS_SUCCESS; } @@ -211,12 +318,12 @@ SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevi /* USB_BUS_INTERFACE_USBDI_V2 Functions */ -NTSTATUS +VOID USB_BUSIFFN GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites) { DPRINT1("GetUSBDIVersion called\n"); - return STATUS_SUCCESS; + return; } NTSTATUS diff --git a/reactos/drivers/usb/usbehci/usbiffn.h b/reactos/drivers/usb/usbehci/usbiffn.h index e9c2de469be..47f86219b64 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.h +++ b/reactos/drivers/usb/usbehci/usbiffn.h @@ -1,77 +1,9 @@ #pragma once -#define USB_BUSIFFN __stdcall #include #include #include - -/* usbbusif.h and hubbusif.h need to be imported */ -typedef PVOID PUSB_DEVICE_HANDLE; - -typedef -VOID -USB_BUSIFFN -RH_INIT_CALLBACK (PVOID CallBackContext); - -typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK; - -typedef struct _USB_EXTPORT_INFORMATION_0 -{ - ULONG PhysicalPortNumber; - ULONG PortLabelNumber; - USHORT VidOverride; - USHORT PidOverride; - ULONG PortAttributes; -} USB_EXTPORT_INFORMATION_0, *PUSB_EXTPORT_INFORMATION; - -typedef struct _USB_EXTHUB_INFORMATION_0 -{ - ULONG InformationLevel; - ULONG NumberOfPorts; - USB_EXTPORT_INFORMATION_0 Port[255]; -} USB_EXTHUB_INFORMATION_0, *PUSB_EXTHUB_INFORMATION_0; - -typedef struct _USB_BUS_INTERFACE_USBDI_V2 -{ - USHORT Size; - USHORT Version; - PVOID BusContext; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - - PVOID GetUSBDIVersion; - PVOID QueryBusTime; - PVOID SubmitIsoOutUrb; - PVOID QueryBusInformation; - PVOID IsDeviceHighSpeed; - PVOID EnumLogEntry; -} USB_BUS_INTERFACE_USBDI_V2, *PUSB_BUS_INTERFACE_USBDI_V2; - -typedef struct _USB_BUS_INTERFACE_HUB_V5 -{ - USHORT Size; - USHORT Version; - PVOID BusContext; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - - PVOID CreateUsbDevice; - PVOID InitializeUsbDevice; - PVOID GetUsbDescriptors; - PVOID RemoveUsbDevice; - PVOID RestoreUsbDevice; - PVOID GetPortHackFlags; - PVOID QueryDeviceInformation; - PVOID GetControllerInformation; - PVOID ControllerSelectiveSuspend; - PVOID GetExtendedHubInformation; - PVOID GetRootHubSymbolicName; - PVOID GetDeviceBusContext; - PVOID Initialize20Hub; - PVOID RootHubInitNotification; - PVOID FlushTransfers; - PVOID SetDeviceHandleData; -} USB_BUS_INTERFACE_HUB_V5, *PUSB_BUS_INTERFACE_HUB_V5; +#include VOID USB_BUSIFFN @@ -167,7 +99,7 @@ VOID USB_BUSIFFN SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo); -NTSTATUS +VOID USB_BUSIFFN GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites); From 931c1f37768384e60c99194d4fdd38b17e1c1f8c Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 5 Apr 2010 12:46:05 +0000 Subject: [PATCH 046/261] [DDK] - Add missing include. svn path=/trunk/; revision=46736 --- reactos/include/ddk/hubbusif.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/include/ddk/hubbusif.h b/reactos/include/ddk/hubbusif.h index e03f19edbb8..6a186e1cbb7 100644 --- a/reactos/include/ddk/hubbusif.h +++ b/reactos/include/ddk/hubbusif.h @@ -1,5 +1,7 @@ #pragma once +#include "usbdi.h" + #if (NTDDI_VERSION >= NTDDI_WINXP) typedef PVOID PUSB_DEVICE_HANDLE; From 60ff1b6f8044d19fad16f72d5ceffdf0a566e284 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Mon, 5 Apr 2010 12:55:00 +0000 Subject: [PATCH 047/261] Fix typo in FDC.inf. svn path=/trunk/; revision=46737 --- reactos/media/inf/fdc.inf | Bin 6338 -> 6336 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/fdc.inf b/reactos/media/inf/fdc.inf index 0da85d2785ad4848302a6a0956602d12dbacd468..445f38e096bb6445350c90fe71719544c6d3a8ec 100644 GIT binary patch delta 16 XcmX?Pc))Oj9M|MuTwW?Wr-06HWE#{d8T From 939ddddd64ce7f5bc64791bc89a6b100f19eb3bd Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 5 Apr 2010 12:56:09 +0000 Subject: [PATCH 048/261] [DDK] - Remove PUSB_DEVICE_HANDLE as its not used in this header. Its defined in hubbusif. svn path=/trunk/; revision=46738 --- reactos/include/ddk/usbbusif.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/include/ddk/usbbusif.h b/reactos/include/ddk/usbbusif.h index 0483738b18a..33d529ccee0 100644 --- a/reactos/include/ddk/usbbusif.h +++ b/reactos/include/ddk/usbbusif.h @@ -6,8 +6,6 @@ #if (NTDDI_VERSION >= NTDDI_WINXP) -typedef PVOID PUSB_DEVICE_HANDLE; - typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB) ( IN PVOID, From cf01e4674e66ec3108d5239ef143568fb1a03954 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 5 Apr 2010 16:00:49 +0000 Subject: [PATCH 049/261] [SHELL32] - Updated polish translation by Olaf Siejka See issue #1494 for more details. svn path=/trunk/; revision=46739 --- reactos/dll/win32/shell32/lang/pl-PL.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index a0d3682dc1f..fef5815d4aa 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -17,7 +17,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * ReactOS shell32 fork translation updated by Caemyr - - * - Olaf Siejka (Jan,Mar,Apr,Jul, Aug 2008) + * - Olaf Siejka (Jan,Mar,Apr,Jul, Aug 2008; Apr, 2010) * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; @@ -672,8 +672,8 @@ BEGIN IDS_RESTART_PROMPT "Czy chcesz zrestartowaæ system?" IDS_SHUTDOWN_TITLE "Wy³¹cz" IDS_SHUTDOWN_PROMPT "Czy chcesz wy³¹czyæ system?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" + IDS_LOGOFF_TITLE "Wyloguj" + IDS_LOGOFF_PROMPT "Czy chcesz siê wylogowaæ z systemu?" /* shell folder path default values */ IDS_PROGRAMS "Menu Start\\Programy" From c96838e3504859e314a38b27287484000bce0c0a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 5 Apr 2010 23:35:44 +0000 Subject: [PATCH 050/261] [INF] - Fix the class GUID so devices appear in the correct category in device manager - Remove trailing spaces on some device descriptions - Remove the "(UniATA)" at the end of some device descriptions svn path=/trunk/; revision=46740 --- reactos/media/inf/hdc.inf | Bin 83820 -> 83158 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/hdc.inf b/reactos/media/inf/hdc.inf index 0ad794cce9eec2109a08f06ae35af2cccd77b767..a3fd5a9b0d2ee4c8bdb10e6ed137c266c3c5638e 100644 GIT binary patch delta 4153 zcmZu!eQZJ4V?`Gq)=nU!yzsH4dAz|2gu^@1Xde0m|!Z3DVR7kuTFN3Zzx@7qv-B$(vep5K}{VFW$m%{n}6~Y>SOD2)g zRQTsxQYfQo(4LE7*`g31tL(p?iwx%=HLezvw>LrY-6X^N)9=~Lp+WqJ3ika$NFUKb zIl>CgY;0%PUkzd*1ASr09yPelF$1vnXrdImdVCPf_ce$dtCfD_AB*#G%CxyJdOXZ= z@wg7!13KDfNi61ZObzTBgLC`d7dbFn{~c@#9u&OTi83#AqK)fi!v?g6HLjB!tb%hV zL{5dU$RjyeFL^o~8Wb^(se)3=)~`TE-Vd8TaM!`?9vJ+f%(LoTp3Qa4i5i^C3%@y0 zhXoO~HVwM}TqFGkoQsHjTw8pi$ff&3QIoDo8eI5LXmm}&L;shBJeG}zD#odg%J!%w z<}p7OxiW6wZ8igLek@{glWe}e{!;-scv8&Ea<4um_K}U_lReOT%3X^F>B(&073e?J zP+F_s{*JA?L5E#7p4u}_jKZKbr3Aq|^E8jN8|+HT%(FZx#_m76*bQtxR~q`KGYwq* zS)OTkg9aVbj7k%v8g&@_t5{sB(EzKF7rFZrv9?Sjudxdmd;UYbWR<3qpD+P0?VUcSSyH=Vav(8#15GQu;nv4k72rdXeOSi3JxSa+GV zg8|vgtlhDF=LH}(AFq=yYoHVTuI(JRHB0P=#1Oly7~c;U`Iwi03H#ysmJkXA!6|xR z-@jO23!=BUT3nFnRt0txlP=J}`YItnw$+0CS1}i;5c_(S0Qs-ix%>d6{#{ZE!1V-1#qsZ(05hN;9Tn{TZgX6dq25IgRR$P;$4d@$XvHz#f@4)?OLS5p&OFw+}tb$ zZsKB}#I3qg3(Ia*!Kxc!;YcnDz?moUg_Vwh|5Z3bw`5kVq`!AT{`(qq;y)JB^=&=Z z>271Iu6;Q|1jbb=FLw|b9(;QhT^N%9Td(yU0eFcS582nZ%-9 zBS|%ldR+Nb!lD@uX%(zgLZ!wCB6q;(hG=w~LZZCovTHOt zq>!5&6xLW3oI-#EXfl8wbF4Q}gYF3s(a}s$`B7OgOgqL9c6VcwtyN)Hg{!$_wc5)8 zWvg$Uv?}+KCYMWpdas`M9%>q7G2=5-1@-Ik>BKXgGsrYy&8`n|i*p}oaCu(H zZct$0PX^=p=;`~&Z%Zzk4U!g2oZq5B=-Q}K`+jM;8p3HZ8-qP{M4>O#5wpaj%6Otu zD^w<0Fz^#z3Y(KKbb~vgm!*1%ji$FlaF%Cyq?4Og=YJCeI6>elEz) zgO6^g=ZDivxjFT`mk!pG`COm%PWLavwC#JOk8Pw}YV zOU*6yceE;Sev5HOkC(2FlDT|JuHgR_Q^5OfGVd=hl~ylppIqiW>jumK--`xSrVyR( zv9a4({V*a5*%vitX3fkkwX}VTtSI_xVPIRRr$OEm+)&)^f!uZvO*RnLgfb}KAS=u{ zg{~?ZpGq9=#~XxgOc1i$71}h7Cnvxj7bu|8-3HdKFcrHmISsGQmg!hLjH2o3gnd#3 zA>ZliX_T{|W-YY86v7fHbax}C@_TG6pAsu?)2$B?_BG2lO^1rtK&8tbCILAAw#mL* zI?EhKT>spUUoPcPycQnjSqL%qC^$?+kWeHFeNXYrU88Y)reNAJmb{lPd4%+qgxDL` z%>3fyurN9>lWZyz@WFHFYmcJb+AO~g@JI4HI`z#Wt2qgaYk>1EUXWS*9)2fC3$x_X zxhJm&*pKIhoZC5@^oRr5^1{X6n{(P*WH=Bw0=~j3(0y|&Dp9vWE+GAwLh?-%ehgHMRe=~-*&n2xDurL>2 qduJZmhC+TiG>@#{gV;Q5td994RzmQ?ukl8BoF5R6=i6J=!~PEiIeeV} delta 4288 zcmZu!4^Wfm8P97Yr5fW$NMlSO1hfd4e}JM*6$4tYM>~q1bN&-7V)oTEK=_Pm}$Vg8|rVe70_N`rIMbCzam*H$S8=epY3bWTQ`dbrWq>RwuqnqQMjSI+X?1F^_t}yX@w?bW7}w#36iw&hTJkd5{g9r{Y6~>9P1KM*8Zy|%u^H_fG`zFDnyiW=GogAE$GF=z z{^?gEBTnSahsFL*rvS5;>nhB4aGjWOfj$!2IL7j#1ZGMyDt8S>P>+ zn4qe|mq5+X(xJBQgn-2Y1#d6XxUj_v2j5<(c>#+JKFhE{^rQuroJfbdlj`uC5Vm+E z8tYVt=LGkOWr-*&G-cYgC)GanE96MQ)@N6(W z!jsqCJ+tl4ks_Y7?ruLcjL(PAUoL3gn-2EeZQI|uCI}k-Ya#4CwM4Tzvt7{mxdnPp zrNO|vCa8PYp)pmiREB%uNY81WCAL~mFD5JFtQWq@aX`&`LCrhz-U7`kJ0r(+*1Idu z2wi7Xc#9F zo!dmud4J<)pM1_c|B}T0(CJb84g8&_qVJp^s=Rk0RI%Ty_TcL;V+|oq{oEy6HGU&x zeJHDt*Ycr`n*(}`1$z43q|P`y83Lt7*c+e?bIA^uPvoVbp5ptV9rs0_D7jag1{X?b z``(o|T$)A546RD*Ke$W13-eUYp>yk}q$*pc8KIeYUdQDh$rpioXSCxZo>|VpUT`4k zr9tO_+`z;|r)4E$arG48goZLZbbYMuEHyYjT`e&9u_q;EZ!A?~3Z`h(M6sX)nu9iI zyu!U#eBy=t#~dl%)yw=!Gu|@82rI8}hZUdr;o246r)-61+7o&|3|&=m+7DW%Av>67 zk>vB~9Pp_hn(y+8h}SvZdaM}wl!wmNs?T)mTEdD~CL?H@&QA4Ab2JY(Wr-Y!1+B1m z4$qzfmg_}oPdVUz+(QQ_y=+5vc;h;6R6fStk6Yo(>pWkoXMyUuj)d;;U{Ys+ODRn7 zizH(PWylEIzu;}FW?>|pENq76q2(#0=LUOy!;_)w2Fb|sLRDP1+)ojTjO5-p3Vhij2GtKs?)3s39IR8 zBh>$AsfI_MrW59t8+yJp!L7q;EiY8p=xB+iyOco8@Xj4oHyI-TT_t(8jIj7CK9qTU z>}{J*Z^_pMP;#5r0)}sUVcTuyhi|_spME&@HT${WpnUqF`WZX*k`Ft+NrR$0JkcDr z{tnk*YxzR%O63=S%RJXQ@U7lM=zqGUEXtBf`*&Qs;ybR8(e8w-AIQzHJ5SIRf%6^` zg%JN?8pfv!A1di0efN1m0V)xA&4u9+A`k0?pjs*zA$5lkyvQ7ljgN^EjEoYaFfN1< zH;)i>uj(=SrPdNcKi zom4}L4_a9)_hU`Hhf7$n?qMNsG}@yz^$HBt7cp)=dhKD+%HL3U^VZZ`VdH9(!pw%4whnzOV3`4jvU>7L5(Rzvs;IX;q(g*Y;g-Z@?^n1xygEi z>m{Y&zFe7FHs82GHmhJBwMs!1d4luOM=1{F$-Hbs@I^Zhit|dpNA(q4nx)6lh#DR0 z$Tv?EJaSSN!;lWrIhg<(H)+ask0d}0IfVhe!UYBDUMrv;Vq1*(R)LsH35E+~PWjd}J+FXyD}4nx;=tA% zk&e+q@tU>`8a7y9U@PH8vJU0W-7{Ixk;?O$4dHDQA-tV`jTkXBS=eDjn@!_T@rXq! zK56aP>Jf7iyf={t6|W%Dn?m|hNT0|9(<|~S#u}fn;-F91^)zn3JWI586bSBc>Ft=X z-!B|`ud$sLbOq$-S&WSVL3h16j@V9LGH6P%pw(1~Xp3BRiOVp_>dO~8oG{<3ANUT#$h`n9_&9BSl99>|jH>@?RqQ64?XO?&bo1AnGwpWNX zPPd`J@O{Gy61WW|hJgGlG~^k^7)HUS{h1i56jkF`^bAQ>7%B`4=s!gOw*B Date: Tue, 6 Apr 2010 00:00:00 +0000 Subject: [PATCH 051/261] - Add -fms-extensions for arm build - Add _NT_TIB_KPCR to compensate for a missing NT_TIB (hackfix) - add KERNEL_STACK_SIZE & co for arm - Add missing KeGetCurrentThread prototype for arm - define INTERLOCKED_RESULT for X86 only - Add _CONTEXT and _EXCEPTION_RECORD forward declarations svn path=/trunk/; revision=46741 --- reactos/ReactOS-arm.rbuild | 1 + reactos/include/ddk/ntddk.h | 3 ++- reactos/include/psdk/ntdef.h | 3 +++ reactos/include/reactos/arm/armddk.h | 30 ++++++++++++++++++++++++---- reactos/include/xdk/exfuncs.h | 3 ++- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/reactos/ReactOS-arm.rbuild b/reactos/ReactOS-arm.rbuild index 777a1aa2cc3..6d7abe77d6e 100644 --- a/reactos/ReactOS-arm.rbuild +++ b/reactos/ReactOS-arm.rbuild @@ -28,6 +28,7 @@ -ftracer + -fms-extensions -Wno-attributes -U_UNICODE -UUNICODE diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 88aa183ea45..fdd99d9f7ef 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -3303,13 +3303,14 @@ ExFreeToZone( #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite #define ExReleaseResourceForThread ExReleaseResourceForThreadLite +#ifdef _X86_ + typedef enum _INTERLOCKED_RESULT { ResultNegative = RESULT_NEGATIVE, ResultZero = RESULT_ZERO, ResultPositive = RESULT_POSITIVE } INTERLOCKED_RESULT; -#ifdef _X86_ NTKERNELAPI INTERLOCKED_RESULT FASTCALL diff --git a/reactos/include/psdk/ntdef.h b/reactos/include/psdk/ntdef.h index fdc365085b2..18107cdcbcc 100644 --- a/reactos/include/psdk/ntdef.h +++ b/reactos/include/psdk/ntdef.h @@ -565,6 +565,9 @@ typedef struct _PROCESSOR_NUMBER { UCHAR Reserved; } PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; +struct _CONTEXT; +struct _EXCEPTION_RECORD; + typedef EXCEPTION_DISPOSITION (NTAPI *PEXCEPTION_ROUTINE)( IN struct _EXCEPTION_RECORD *ExceptionRecord, diff --git a/reactos/include/reactos/arm/armddk.h b/reactos/include/reactos/arm/armddk.h index 68262c2b9d7..82e6d9fdd72 100644 --- a/reactos/include/reactos/arm/armddk.h +++ b/reactos/include/reactos/arm/armddk.h @@ -54,13 +54,16 @@ extern ULONG_PTR MmUserProbeAddress; // #define MAXIMUM_VECTOR 16 +#define KERNEL_STACK_SIZE 12288 +#define KERNEL_LARGE_STACK_SIZE 61440 +#define KERNEL_LARGE_STACK_COMMIT 12288 // // Used to contain PFNs and PFN counts // -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; +//typedef ULONG PFN_COUNT; +//typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +//typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; // // Stub @@ -124,11 +127,25 @@ typedef struct _CONTEXT { #ifdef _WINNT_H #define KIRQL ULONG #endif + +typedef struct _NT_TIB_KPCR { + struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; + PVOID StackBase; + PVOID StackLimit; + PVOID SubSystemTib; + _ANONYMOUS_UNION union { + PVOID FiberData; + ULONG Version; + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; + struct _NT_TIB_KPCR *Self; +} NT_TIB_KPCR,*PNT_TIB_KPCR; + typedef struct _KPCR { union { - NT_TIB NtTib; + NT_TIB_KPCR NtTib; struct { struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused @@ -167,6 +184,11 @@ struct _TEB* NtCurrentTeb(VOID) return (struct _TEB*)USERPCR->Used_Self; } +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + #ifndef _WINNT_H // // IRQL Support on ARM is similar to MIPS/ALPHA diff --git a/reactos/include/xdk/exfuncs.h b/reactos/include/xdk/exfuncs.h index 46a5387733a..2879e1d4e16 100644 --- a/reactos/include/xdk/exfuncs.h +++ b/reactos/include/xdk/exfuncs.h @@ -67,13 +67,14 @@ ExFreeToZone( #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite #define ExReleaseResourceForThread ExReleaseResourceForThreadLite +#ifdef _X86_ + typedef enum _INTERLOCKED_RESULT { ResultNegative = RESULT_NEGATIVE, ResultZero = RESULT_ZERO, ResultPositive = RESULT_POSITIVE } INTERLOCKED_RESULT; -#ifdef _X86_ NTKERNELAPI INTERLOCKED_RESULT FASTCALL From 93be8ad5abc8e1107611295ed18d1a56ccab4b9e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 6 Apr 2010 00:10:46 +0000 Subject: [PATCH 052/261] remove scsiport from arm build svn path=/trunk/; revision=46742 --- reactos/drivers/storage/directory.rbuild | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/storage/directory.rbuild b/reactos/drivers/storage/directory.rbuild index c0c43724a9e..d72619494d2 100644 --- a/reactos/drivers/storage/directory.rbuild +++ b/reactos/drivers/storage/directory.rbuild @@ -13,7 +13,9 @@ - - - + + + + + From ce7c240a5e377c1598b3649afdd82d38fb6457bb Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 6 Apr 2010 00:19:48 +0000 Subject: [PATCH 053/261] Compile scsiport.c for freeldr only on x86 builds svn path=/trunk/; revision=46743 --- reactos/boot/freeldr/freeldr/freeldr_base.rbuild | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild index c8c2ab113c1..a8b784baf9b 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild @@ -23,7 +23,9 @@ disk.c partition.c ramdisk.c - scsiport.c + + scsiport.c + ext2.c From a2ac545098657ac91a1b237e0874acb1a74d4fbb Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 6 Apr 2010 00:20:53 +0000 Subject: [PATCH 054/261] revert r46742 svn path=/trunk/; revision=46744 --- reactos/drivers/storage/directory.rbuild | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/storage/directory.rbuild b/reactos/drivers/storage/directory.rbuild index d72619494d2..c0c43724a9e 100644 --- a/reactos/drivers/storage/directory.rbuild +++ b/reactos/drivers/storage/directory.rbuild @@ -13,9 +13,7 @@ - - - - - + + + From 2d1579957b2fb81f21c0c5ca2e4767f8f4fbab47 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Tue, 6 Apr 2010 13:23:33 +0000 Subject: [PATCH 055/261] [DDK] - A better fix for r46738. Patch by Amine Khaidi. svn path=/trunk/; revision=46747 --- reactos/include/ddk/hubbusif.h | 4 ++++ reactos/include/ddk/usbbusif.h | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/reactos/include/ddk/hubbusif.h b/reactos/include/ddk/hubbusif.h index 6a186e1cbb7..cf97c5cf64f 100644 --- a/reactos/include/ddk/hubbusif.h +++ b/reactos/include/ddk/hubbusif.h @@ -1,10 +1,14 @@ #pragma once +#define _HUBBUSIF_ + #include "usbdi.h" #if (NTDDI_VERSION >= NTDDI_WINXP) +#if !defined(_USBBUSIF_) typedef PVOID PUSB_DEVICE_HANDLE; +#endif typedef struct _ROOTHUB_PDO_EXTENSION { ULONG Signature; diff --git a/reactos/include/ddk/usbbusif.h b/reactos/include/ddk/usbbusif.h index 33d529ccee0..3d1c1f3a337 100644 --- a/reactos/include/ddk/usbbusif.h +++ b/reactos/include/ddk/usbbusif.h @@ -1,11 +1,17 @@ #pragma once +#define _USBBUSIF_ + #ifndef USB_BUSIFFN #define USB_BUSIFFN __stdcall #endif #if (NTDDI_VERSION >= NTDDI_WINXP) +#if !defined(_USBBUSIF_) +typedef PVOID PUSB_DEVICE_HANDLE; +#endif + typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB) ( IN PVOID, From f9e0e0d0b33302012fa861fd757fef2b867aeada Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 6 Apr 2010 14:00:02 +0000 Subject: [PATCH 056/261] [NTOS] - Device interface strings are null terminated svn path=/trunk/; revision=46748 --- reactos/ntoskrnl/io/iomgr/deviface.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index d5b2246f31f..114e308c4a8 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -661,12 +661,6 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, DPRINT("RtlAppendUnicodeStringToString() failed with status 0x%08lx\n", Status); goto cleanup; } - /* RtlAppendUnicodeStringToString added a NULL at the end of the - * destination string, but didn't increase the Length field. - * Do it for it. - */ - ReturnBuffer.Length += sizeof(WCHAR); - NextReferenceString: ExFreePool(ReferenceBi); ReferenceBi = NULL; From 35ac4e1e9235dc60e67de6cc98485afa31e5714d Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 6 Apr 2010 14:32:35 +0000 Subject: [PATCH 057/261] [KSPROXY] - Implement sending multiple media samples to tv tuner at once in order to avoid the kernel irp queue running out svn path=/trunk/; revision=46749 --- reactos/dll/directx/ksproxy/allocator.cpp | 1 + reactos/dll/directx/ksproxy/output_pin.cpp | 68 ++++++++++++++++++---- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/reactos/dll/directx/ksproxy/allocator.cpp b/reactos/dll/directx/ksproxy/allocator.cpp index e7c4b1f2436..8229bd2f56e 100644 --- a/reactos/dll/directx/ksproxy/allocator.cpp +++ b/reactos/dll/directx/ksproxy/allocator.cpp @@ -357,6 +357,7 @@ CKsAllocator::GetBuffer( if (!m_FreeList.empty()) { + OutputDebugStringW(L"CKsAllocator::GetBuffer HACK\n"); Sample = m_FreeList.top(); m_FreeList.pop(); } diff --git a/reactos/dll/directx/ksproxy/output_pin.cpp b/reactos/dll/directx/ksproxy/output_pin.cpp index f9f37725c53..bee119303ae 100644 --- a/reactos/dll/directx/ksproxy/output_pin.cpp +++ b/reactos/dll/directx/ksproxy/output_pin.cpp @@ -2383,17 +2383,48 @@ COutputPin::IoProcessRoutine() IMediaSample *Sample; LONG SampleCount; HRESULT hr; - PKSSTREAM_SEGMENT StreamSegment; + PKSSTREAM_SEGMENT * StreamSegment; HANDLE hEvent; - IMediaSample * Samples[1]; + IMediaSample ** Samples; + LONG NumHandles; + DWORD dwStatus; #ifdef KSPROXY_TRACE WCHAR Buffer[200]; #endif + NumHandles = m_Properties.cBuffers / 2; + + if (!NumHandles) + NumHandles = 8; + + assert(NumHandles); + + //allocate stream segment array + StreamSegment = (PKSSTREAM_SEGMENT*)CoTaskMemAlloc(sizeof(PKSSTREAM_SEGMENT) * NumHandles); + if (!StreamSegment) + { + OutputDebugStringW(L"COutputPin::IoProcessRoutine out of memory\n"); + return E_FAIL; + } + + // allocate handle array + Samples = (IMediaSample**)CoTaskMemAlloc(sizeof(IMediaSample*) * NumHandles); + if (!Samples) + { + OutputDebugStringW(L"COutputPin::IoProcessRoutine out of memory\n"); + return E_FAIL; + } + + // zero handles array + ZeroMemory(StreamSegment, sizeof(PKSSTREAM_SEGMENT) * NumHandles); + ZeroMemory(Samples, sizeof(IMediaSample*) * NumHandles); + // first wait for the start event to signal WaitForSingleObject(m_hStartEvent, INFINITE); + m_IoCount = 0; + assert(m_InterfaceHandler); do { @@ -2418,14 +2449,14 @@ COutputPin::IoProcessRoutine() // fill buffer SampleCount = 1; - Samples[0] = Sample; + Samples[m_IoCount] = Sample; Sample->SetTime(NULL, NULL); hr = m_InterfaceHandler->KsProcessMediaSamples(NULL, /* FIXME */ - Samples, + &Samples[m_IoCount], &SampleCount, KsIoOperation_Read, - &StreamSegment); + &StreamSegment[m_IoCount]); if (FAILED(hr) || !StreamSegment) { #ifdef KSPROXY_TRACE @@ -2435,14 +2466,26 @@ COutputPin::IoProcessRoutine() break; } - // get completion event - hEvent = StreamSegment->CompletionEvent; + // interface handle should increment pending i/o count + assert(m_IoCount >= 1); + + swprintf(Buffer, L"COutputPin::IoProcessRoutine m_IoCount %lu NumHandles %lu\n", m_IoCount, NumHandles); + OutputDebugStringW(Buffer); + + if (m_IoCount != NumHandles) + continue; + + // get completion handle + hEvent = StreamSegment[0]->CompletionEvent; // wait for i/o completion - WaitForSingleObject(hEvent, INFINITE); + dwStatus = WaitForSingleObject(hEvent, INFINITE); + + swprintf(Buffer, L"COutputPin::IoProcessRoutine dwStatus %lx Error %lx NumHandles %lu\n", dwStatus, GetLastError(), NumHandles); + OutputDebugStringW(Buffer); // perform completion - m_InterfaceHandler->KsCompleteIo(StreamSegment); + m_InterfaceHandler->KsCompleteIo(StreamSegment[0]); // close completion event CloseHandle(hEvent); @@ -2452,7 +2495,7 @@ COutputPin::IoProcessRoutine() assert(m_MemInputPin); // now deliver the sample - hr = m_MemInputPin->Receive(Sample); + hr = m_MemInputPin->Receive(Samples[0]); #ifdef KSPROXY_TRACE swprintf(Buffer, L"COutputPin::IoProcessRoutine PinName %s IMemInputPin::Receive hr %lx Sample %p m_MemAllocator %p\n", m_PinName, hr, Sample, m_MemAllocator); @@ -2464,6 +2507,11 @@ COutputPin::IoProcessRoutine() Sample = NULL; } + + //circular stream segment array + RtlMoveMemory(StreamSegment, &StreamSegment[1], sizeof(PKSSTREAM_SEGMENT) * (NumHandles - 1)); + RtlMoveMemory(Samples, &Samples[1], sizeof(IMediaSample*) * (NumHandles - 1)); + }while(TRUE); // signal end of i/o thread From 9b8546277a133f184b77d7de86272f2d080c343a Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 6 Apr 2010 15:08:16 +0000 Subject: [PATCH 058/261] [MSDVBNP] - Dynamically register DVB network provider categories svn path=/trunk/; revision=46750 --- reactos/dll/directx/msdvbnp/msdvbnp.cpp | 53 +++++++++++++++++++++++-- reactos/dll/directx/msdvbnp/precomp.h | 1 + 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.cpp b/reactos/dll/directx/msdvbnp/msdvbnp.cpp index b67f232e13f..170408d522c 100644 --- a/reactos/dll/directx/msdvbnp/msdvbnp.cpp +++ b/reactos/dll/directx/msdvbnp/msdvbnp.cpp @@ -9,10 +9,14 @@ #include "precomp.h" +#ifndef _MSC_VER +const GUID KSCATEGORY_BDA_NETWORK_PROVIDER = {0x71985f4b, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; +#endif + static INTERFACE_TABLE InterfaceTable[] = { - {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor}, - {NULL, NULL} + {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor, L"ReactOS DVBT Network Provider"}, + {NULL, NULL, NULL} }; extern "C" @@ -53,8 +57,19 @@ DllUnregisterServer(void) HRESULT hr = S_OK; HKEY hClass; + + hr = StringFromCLSID(KSCATEGORY_BDA_NETWORK_PROVIDER, &pStr); + if (FAILED(hr)) + return hr; + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_SET_VALUE, &hClass) != ERROR_SUCCESS) + { + CoTaskMemFree(pStr); return E_FAIL; + } + + RegDeleteKeyW(hClass, pStr); + CoTaskMemFree(pStr); do { @@ -80,12 +95,35 @@ DllRegisterServer(void) ULONG Index = 0; LPOLESTR pStr; HRESULT hr = S_OK; - HKEY hClass, hKey, hSubKey; + HKEY hClass, hKey, hSubKey, hProvider, hInstance; static LPCWSTR ModuleName = L"msdvbnp.ax"; static LPCWSTR ThreadingModel = L"Both"; + hr = StringFromCLSID(KSCATEGORY_BDA_NETWORK_PROVIDER, &pStr); + if (FAILED(hr)) + return hr; + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_WRITE, &hClass) != ERROR_SUCCESS) + { + CoTaskMemFree(pStr); return E_FAIL; + } + + if (RegCreateKeyExW(hClass, pStr, 0, NULL, 0, KEY_WRITE, NULL, &hProvider, NULL) != ERROR_SUCCESS) + { + RegCloseKey(hClass); + CoTaskMemFree(pStr); + return E_FAIL; + } + + CoTaskMemFree(pStr); + + if (RegCreateKeyExW(hProvider, L"Instance", 0, NULL, 0, KEY_WRITE, NULL, &hInstance, NULL) != ERROR_SUCCESS) + { + RegCloseKey(hClass); + return E_FAIL; + } + RegCloseKey(hProvider); do { @@ -104,11 +142,20 @@ DllRegisterServer(void) RegCloseKey(hKey); } + if (RegCreateKeyExW(hInstance, InterfaceTable[Index].ProviderName, 0, 0, 0, KEY_WRITE, NULL, &hKey, 0) == ERROR_SUCCESS) + { + //FIXME filterdata + RegSetValueExW(hKey, L"FriendlyName", 0, REG_SZ, (const BYTE*)InterfaceTable[Index].ProviderName, (wcslen(InterfaceTable[Index].ProviderName) + 1) * sizeof(WCHAR)); + RegSetValueExW(hKey, L"CLSID", 0, REG_SZ, (const BYTE*)pStr, (wcslen(pStr)+1) * sizeof(WCHAR)); + RegCloseKey(hKey); + } + CoTaskMemFree(pStr); Index++; }while(InterfaceTable[Index].lpfnCI != 0); RegCloseKey(hClass); + RegCloseKey(hInstance); return hr; } diff --git a/reactos/dll/directx/msdvbnp/precomp.h b/reactos/dll/directx/msdvbnp/precomp.h index c9abe7ac000..828cfb47202 100644 --- a/reactos/dll/directx/msdvbnp/precomp.h +++ b/reactos/dll/directx/msdvbnp/precomp.h @@ -28,6 +28,7 @@ typedef struct { const GUID* riid; LPFNCREATEINSTANCE lpfnCI; + LPCWSTR ProviderName; } INTERFACE_TABLE; /* classfactory.cpp */ From 716555b739539bd1afa05bdedf3acc58b15157c0 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 6 Apr 2010 15:47:15 +0000 Subject: [PATCH 059/261] [MSDVBNP] - Register BDA Filter components svn path=/trunk/; revision=46751 --- reactos/dll/directx/msdvbnp/msdvbnp.cpp | 38 ++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.cpp b/reactos/dll/directx/msdvbnp/msdvbnp.cpp index 170408d522c..9b7f24517d6 100644 --- a/reactos/dll/directx/msdvbnp/msdvbnp.cpp +++ b/reactos/dll/directx/msdvbnp/msdvbnp.cpp @@ -86,6 +86,24 @@ DllUnregisterServer(void) return hr; } +VOID +RegisterBDAComponent( + HKEY hFilter, + LPCWSTR ComponentClsid, + LPCWSTR ComponentName) +{ + HKEY hComp; + + // create network provider filter key + if (RegCreateKeyExW(hFilter, ComponentClsid, 0, NULL, 0, KEY_WRITE, NULL, &hComp, NULL) == ERROR_SUCCESS) + { + // store class id + RegSetValueExW(hComp, L"CLSID", 0, REG_SZ, (const BYTE*)ComponentClsid, (wcslen(ComponentClsid)+1) * sizeof(WCHAR)); + RegSetValueExW(hComp, L"FriendlyName", 0, REG_SZ, (const BYTE*)ComponentName, (wcslen(ComponentName)+1) * sizeof(WCHAR)); + RegCloseKey(hComp); + } +} + extern "C" KSDDKAPI HRESULT @@ -95,7 +113,7 @@ DllRegisterServer(void) ULONG Index = 0; LPOLESTR pStr; HRESULT hr = S_OK; - HKEY hClass, hKey, hSubKey, hProvider, hInstance; + HKEY hClass, hKey, hSubKey, hProvider, hInstance, hFilter; static LPCWSTR ModuleName = L"msdvbnp.ax"; static LPCWSTR ThreadingModel = L"Both"; @@ -125,6 +143,21 @@ DllRegisterServer(void) } RegCloseKey(hProvider); + /* open active movie filter category key */ + if (RegCreateKeyExW(hClass, L"{da4e3da0-d07d-11d0-bd50-00a0c911ce86}\\Instance", 0, NULL, 0, KEY_WRITE, NULL, &hFilter, NULL) != ERROR_SUCCESS) + { + RegCloseKey(hClass); + RegCloseKey(hInstance); + return E_FAIL; + } + + RegisterBDAComponent(hFilter, L"{71985F4A-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Playback Filter"); + RegisterBDAComponent(hFilter, L"{71985F4B-1CA1-11D3-9CC8-00C04F7971E0}", L"BDA Network Providerss"); + RegisterBDAComponent(hFilter, L"{71985F48-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Source Filter"); + RegisterBDAComponent(hFilter, L"{A2E3074F-6C3D-11D3-B653-00C04F79498E}", L"BDA Transport Information Renderers"); + RegisterBDAComponent(hFilter, L"{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}", L"BDA Receiver Component"); + RegCloseKey(hKey); + do { hr = StringFromCLSID(*InterfaceTable[Index].riid, &pStr); @@ -150,6 +183,9 @@ DllRegisterServer(void) RegCloseKey(hKey); } + + + CoTaskMemFree(pStr); Index++; }while(InterfaceTable[Index].lpfnCI != 0); From 06ad53455edffc7814bb236b67d8726c8e3e27be Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Tue, 6 Apr 2010 18:51:13 +0000 Subject: [PATCH 060/261] [SHELL32] - Updated Italian translation by Gabriel Ilardi See issue #1494 for more details. svn path=/trunk/; revision=46754 --- reactos/dll/win32/shell32/lang/it-IT.rc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 4407298403c..9ad6e53377e 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -434,8 +434,8 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUPWIND CAPTION "Conferma della sovrascrittura dei file" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Si", IDYES, 20, 122, 60, 14 - PUSHBUTTON "Si &tutti", 12807, 85, 122, 60, 14 + DEFPUSHBUTTON "&Sì", IDYES, 20, 122, 60, 14 + PUSHBUTTON "Sì &tutti", 12807, 85, 122, 60, 14 PUSHBUTTON "&No", IDNO, 150, 122, 60, 14 PUSHBUTTON "Annulla", IDCANCEL, 215, 122, 60, 14 ICON 146, -1, 11, 10, 21, 20, SS_REALSIZECONTROL @@ -555,13 +555,13 @@ BEGIN LTEXT "&File system", -1, 7, 35, 170, 9 COMBOBOX 28677, 7, 46, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP CONTROL "", 28678, "MSCTLS_PROGRESS32", 0, 7, 181, 170, 8 - LTEXT "Dimensione dell'unità di &Allocazione", -1, 7, 64, 170, 9 + LTEXT "Dimensione dell'unità di &allocazione", -1, 7, 64, 170, 9 COMBOBOX 28680, 7, 75, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP LTEXT "&Etichetta del Volume", -1, 7, 93, 170, 9 EDITTEXT 28679, 7, 103, 170, 13, ES_AUTOHSCROLL - GROUPBOX "Opzioni di &Formattazione", 4610, 7, 121, 170, 49 + GROUPBOX "Opzioni di &formattazione", 4610, 7, 121, 170, 49 AUTOCHECKBOX "Formattazione &rapida", 28674, 16, 135, 155, 10 - AUTOCHECKBOX "Abilita la &Compressione", 28675, 16, 152, 155, 10 + AUTOCHECKBOX "Abilita la &compressione", 28675, 16, 152, 155, 10 END CHKDSK_DLG DIALOGEX 50, 50, 194, 120 @@ -645,7 +645,7 @@ BEGIN IDS_CREATEFOLDER_DENIED "Impossibile creare la cartella: Accesso negato." IDS_CREATEFOLDER_CAPTION "Errore durante la creazione della cartella" - IDS_DELETEITEM_CAPTION "Confermare la cancallazione del file" + IDS_DELETEITEM_CAPTION "Confermare la cancellazione del file" IDS_DELETEFOLDER_CAPTION "Confermare la cancellazione della cartella" IDS_DELETEITEM_TEXT "Sei sicuro di voler cancellare '%1'?" IDS_DELETEMULTIPLE_TEXT "Sei sicuro di voler cancellare questi %1 elementi?" @@ -664,10 +664,10 @@ BEGIN /* message box strings */ IDS_RESTART_TITLE "Riavvia" IDS_RESTART_PROMPT "Volete riavviare il sistema?" - IDS_SHUTDOWN_TITLE "Termina sessione" - IDS_SHUTDOWN_PROMPT "Volete terminare la sessione di ReactOS?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" + IDS_SHUTDOWN_TITLE "Arresta sistema" + IDS_SHUTDOWN_PROMPT "Volete arrestare il sistema?" + IDS_LOGOFF_TITLE "Disconnetti" + IDS_LOGOFF_PROMPT "Volete disconnettervi?" /* shell folder path default values */ IDS_PROGRAMS "Menu Avvio\\Programmi" From 01f84db1d4671b24e00ba93503d552fb96cb007f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 7 Apr 2010 00:46:16 +0000 Subject: [PATCH 061/261] [Win32k|Gdi32] - Enable font batch and fixed setting brush origion. Use the new delete object functions in win32k. svn path=/trunk/; revision=46758 --- reactos/dll/win32/gdi32/objects/dc.c | 4 +- .../subsystems/win32/win32k/include/coord.h | 4 +- .../subsystems/win32/win32k/include/gdiobj.h | 3 + .../subsystems/win32/win32k/objects/brush.c | 1 + .../subsystems/win32/win32k/objects/coord.c | 10 +++ .../subsystems/win32/win32k/objects/dclife.c | 30 ++------ .../subsystems/win32/win32k/objects/font.c | 68 ++++++++++++------- .../win32/win32k/objects/gdibatch.c | 33 +++++++-- 8 files changed, 98 insertions(+), 55 deletions(-) diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index 2d90f60cdac..34c31148bb3 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -1540,7 +1540,7 @@ SelectObject(HDC hDC, PDC_ATTR pDc_Attr; HGDIOBJ hOldObj = NULL; UINT uType; -// PTEB pTeb; + PTEB pTeb; if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) { @@ -1582,7 +1582,6 @@ SelectObject(HDC hDC, case GDI_OBJECT_TYPE_FONT: hOldObj = pDc_Attr->hlfntNew; if (hOldObj == hGdiObj) return hOldObj; -#if 0 pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS; pDc_Attr->ulDirty_ |= DIRTY_CHARSET; pDc_Attr->hlfntNew = hGdiObj; @@ -1604,7 +1603,6 @@ SelectObject(HDC hDC, if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); return hOldObj; } -#endif // default for select object font return NtGdiSelectFont(hDC, hGdiObj); diff --git a/reactos/subsystems/win32/win32k/include/coord.h b/reactos/subsystems/win32/win32k/include/coord.h index c241b9eb9b6..83f3a355eaa 100644 --- a/reactos/subsystems/win32/win32k/include/coord.h +++ b/reactos/subsystems/win32/win32k/include/coord.h @@ -18,4 +18,6 @@ IntGdiModifyWorldTransform(PDC pDc, DWORD Mode); VOID FASTCALL IntMirrorWindowOrg(PDC); -void FASTCALL IntFixIsotropicMapping(PDC dc); +void FASTCALL IntFixIsotropicMapping(PDC); +LONG FASTCALL IntCalcFillOrigin(PDC); +PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG); \ No newline at end of file diff --git a/reactos/subsystems/win32/win32k/include/gdiobj.h b/reactos/subsystems/win32/win32k/include/gdiobj.h index 50ed2e6163f..6b9a7fd8aa8 100644 --- a/reactos/subsystems/win32/win32k/include/gdiobj.h +++ b/reactos/subsystems/win32/win32k/include/gdiobj.h @@ -131,3 +131,6 @@ GDIOBJ_IncrementShareCount(POBJ Object) #endif INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE); + +#define GDIOBJ_GetKernelObj(Handle) \ + ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index 6e827fa7bae..f45f6fbcdd4 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -709,6 +709,7 @@ NtGdiSetBrushOrg(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point) pdcattr->ptlBrushOrigin.x = XOrg; pdcattr->ptlBrushOrigin.y = YOrg; + IntptlBrushOrigin(dc, XOrg, YOrg ); DC_UnlockDc(dc); return TRUE; diff --git a/reactos/subsystems/win32/win32k/objects/coord.c b/reactos/subsystems/win32/win32k/objects/coord.c index 6b80f1d463e..0ae25bcc10d 100644 --- a/reactos/subsystems/win32/win32k/objects/coord.c +++ b/reactos/subsystems/win32/win32k/objects/coord.c @@ -1133,6 +1133,16 @@ IntCalcFillOrigin(PDC pdc) return pdc->ptlFillOrigin.y; } +PPOINTL +FASTCALL +IntptlBrushOrigin(PDC pdc, LONG x, LONG y ) +{ + pdc->dclevel.ptlBrushOrigin.x = x; + pdc->dclevel.ptlBrushOrigin.y = y; + IntCalcFillOrigin(pdc); + return &pdc->dclevel.ptlBrushOrigin; +} + VOID APIENTRY GdiSetDCOrg(HDC hDC, LONG Left, LONG Top, PRECTL prc) diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index c64139c9426..1fe51886b2a 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -119,6 +119,8 @@ DC_AllocDC(PUNICODE_STRING Driver) pdcattr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT); TextIntRealizeFont(pdcattr->hlfntNew,NULL); + NewDC->hlfntCur = pdcattr->hlfntNew; + NewDC->dclevel.plfnt = GDIOBJ_GetKernelObj(pdcattr->hlfntNew); NewDC->dclevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE); NewDC->dclevel.ppal = PALETTE_ShareLockPalette(NewDC->dclevel.hpal); @@ -762,34 +764,16 @@ NtGdiCreateCompatibleDC(HDC hDC) BOOL APIENTRY NtGdiDeleteObjectApp(HANDLE DCHandle) -{ - /* Complete all pending operations */ - NtGdiFlushUserBatch(); - - if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE; - - if (GDI_HANDLE_GET_TYPE(DCHandle) != GDI_OBJECT_TYPE_DC) - return GreDeleteObject((HGDIOBJ) DCHandle); - - if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE; - - if (!GDIOBJ_OwnedByCurrentProcess(DCHandle)) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - - return IntGdiDeleteDC(DCHandle, FALSE); -} - -BOOL -APIENTRY -NewNtGdiDeleteObjectApp(HANDLE DCHandle) { GDIOBJTYPE ObjType; + /* Complete all pending operations */ + NtGdiFlushUserBatch(); + if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE; + if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE; + ObjType = GDI_HANDLE_GET_TYPE(DCHandle) >> GDI_ENTRY_UPPER_SHIFT; if (GreGetObjectOwner( DCHandle, ObjType)) diff --git a/reactos/subsystems/win32/win32k/objects/font.c b/reactos/subsystems/win32/win32k/objects/font.c index 41a75cdb43f..6127d835f42 100644 --- a/reactos/subsystems/win32/win32k/objects/font.c +++ b/reactos/subsystems/win32/win32k/objects/font.c @@ -251,6 +251,49 @@ RealizeFontInit(HFONT hFont) return pTextObj; } +HFONT +FASTCALL +GreSelectFont( HDC hDC, HFONT hFont) +{ + PDC pdc; + PDC_ATTR pdcattr; + PTEXTOBJ pOrgFnt, pNewFnt = NULL; + HFONT hOrgFont = NULL; + + if (!hDC || !hFont) return NULL; + + pdc = DC_LockDc(hDC); + if (!pdc) + { + return NULL; + } + + if (NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL))) + { + /* LFONTOBJ use share and locking. */ + pNewFnt = TEXTOBJ_LockText(hFont); + pdcattr = pdc->pdcattr; + pOrgFnt = pdc->dclevel.plfnt; + if (pOrgFnt) + { + hOrgFont = pOrgFnt->BaseObject.hHmgr; + } + else + { + hOrgFont = pdcattr->hlfntNew; + } + pdc->dclevel.plfnt = pNewFnt; + pdc->hlfntCur = hFont; + pdcattr->hlfntNew = hFont; + pdcattr->ulDirty_ |= DIRTY_CHARSET; + pdcattr->ulDirty_ &= ~SLOW_WIDTHS; + } + + if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt); + DC_UnlockDc(pdc); + return hOrgFont; +} + /** Functions ******************************************************************/ INT @@ -933,30 +976,7 @@ NtGdiSelectFont( IN HDC hDC, IN HFONT hFont) { - PDC pDC; - PDC_ATTR pdcattr; - HFONT hOrgFont = NULL; - - if (hDC == NULL || hFont == NULL) return NULL; - - pDC = DC_LockDc(hDC); - if (!pDC) - { - return NULL; - } - - pdcattr = pDC->pdcattr; - - /* FIXME: what if not successful? */ - if(NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL))) - { - hOrgFont = pdcattr->hlfntNew; - pdcattr->hlfntNew = hFont; - } - - DC_UnlockDc(pDC); - - return hOrgFont; + return GreSelectFont(hDC, hFont); } diff --git a/reactos/subsystems/win32/win32k/objects/gdibatch.c b/reactos/subsystems/win32/win32k/objects/gdibatch.c index b958ad4835d..ac174e971fb 100644 --- a/reactos/subsystems/win32/win32k/objects/gdibatch.c +++ b/reactos/subsystems/win32/win32k/objects/gdibatch.c @@ -106,9 +106,10 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) case GdiBCSetBrushOrg: { PGDIBSSETBRHORG pgSBO; - if(!dc) break; + if (!dc) break; pgSBO = (PGDIBSSETBRHORG) pHdr; pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin; + IntptlBrushOrigin(dc, pgSBO->ptlBrushOrigin.x, pgSBO->ptlBrushOrigin.y); break; } case GdiBCExtSelClipRgn: @@ -116,10 +117,34 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) case GdiBCSelObj: { PGDIBSOBJECT pgO; - if(!dc) break; + PTEXTOBJ pOrgFnt, pNewFnt = NULL; + HFONT hOrgFont = NULL; + + if (!dc) break; pgO = (PGDIBSOBJECT) pHdr; - TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL); - pdcattr->ulDirty_ &= ~(DIRTY_CHARSET); + + if (NT_SUCCESS(TextIntRealizeFont((HFONT)pgO->hgdiobj,NULL))) + { + /* LFONTOBJ use share and locking. */ + pNewFnt = TEXTOBJ_LockText(pgO->hgdiobj); + + pOrgFnt = dc->dclevel.plfnt; + if (pOrgFnt) + { + hOrgFont = pOrgFnt->BaseObject.hHmgr; + } + else + { + hOrgFont = pdcattr->hlfntNew; + } + dc->dclevel.plfnt = pNewFnt; + dc->hlfntCur = pgO->hgdiobj; + pdcattr->hlfntNew = pgO->hgdiobj; + pdcattr->ulDirty_ |= DIRTY_CHARSET; + pdcattr->ulDirty_ &= ~SLOW_WIDTHS; + } + if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt); + break; } case GdiBCDelRgn: DPRINT("Delete Region Object!\n"); From 56eef6c56de9ac40f5d53291cf4bf22104d90dc2 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 7 Apr 2010 10:25:36 +0000 Subject: [PATCH 062/261] [usb/usbehci] - Check the Interface GUID instead of only the version and size. - Handle up to USB_BUS_INTERFACE_USBDI_V2 and USB_BUS_INTERFACE_HUB_V5. Driver gets further in win2k. - Basic implementation of Direct Call Function CreateUsbDevice. - Fix GetRootHubSymbolicName to return RootHub20. - Change return status to not supported for functions not implemented yet. svn path=/trunk/; revision=46760 --- reactos/drivers/usb/usbehci/pdo.c | 155 ++++++++++++++++++-------- reactos/drivers/usb/usbehci/usbiffn.c | 30 +++-- 2 files changed, 126 insertions(+), 59 deletions(-) diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index 84073a11fa0..2d251d66e87 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -17,6 +17,7 @@ #include #include #include +#include /* Lifted from Linux with slight changes */ const UCHAR ROOTHUB2_DEVICE_DESCRIPTOR [] = @@ -98,7 +99,8 @@ UrbWorkerThread(PVOID Context) PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) { PUSB_DEVICE UsbDevicePointer = NULL; - UsbDevicePointer = ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE)); + UsbDevicePointer = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_DEVICE), USB_POOL_TAG); + if (!UsbDevicePointer) { DPRINT1("Out of memory\n"); @@ -538,75 +540,132 @@ PdoDispatchPnp( case IRP_MN_QUERY_INTERFACE: { UNICODE_STRING GuidString; + UNICODE_STRING InterfacMatchString; PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub; PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI; PPDO_DEVICE_EXTENSION PdoDeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExtension; + NTSTATUS CompareStatus; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; - Status = RtlStringFromGUID(Stack->Parameters.QueryInterface.InterfaceType, &GuidString); - if (!NT_SUCCESS(Status)) + /* Assume success */ + Status = STATUS_SUCCESS; + Information = 0; + + CompareStatus = RtlStringFromGUID(Stack->Parameters.QueryInterface.InterfaceType, &GuidString); + if (!NT_SUCCESS(CompareStatus)) { DPRINT1("Failed to create string from GUID!\n"); } + DPRINT1("Interface GUID requested %wZ\n", &GuidString); DPRINT1("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); DPRINT1("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); - Status = STATUS_SUCCESS; - Information = 0; - - /* FIXME: Check the actual Guid */ - if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_USBDI_V2) && (Stack->Parameters.QueryInterface.Version == 2)) + CompareStatus = RtlStringFromGUID(&USB_BUS_INTERFACE_HUB_GUID, &InterfacMatchString); + if (!NT_SUCCESS(CompareStatus)) { - InterfaceDI = (PUSB_BUS_INTERFACE_USBDI_V2) Stack->Parameters.QueryInterface.Interface; - InterfaceDI->Size = sizeof(USB_BUS_INTERFACE_USBDI_V2); - InterfaceDI->Version = 2; - InterfaceDI->BusContext = PdoDeviceExtension->DeviceObject; - InterfaceDI->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; - InterfaceDI->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; - InterfaceDI->GetUSBDIVersion = GetUSBDIVersion; - InterfaceDI->QueryBusTime = QueryBusTime; - InterfaceDI->SubmitIsoOutUrb = SubmitIsoOutUrb; - InterfaceDI->QueryBusInformation = QueryBusInformation; - InterfaceDI->IsDeviceHighSpeed = IsDeviceHighSpeed; - InterfaceDI->EnumLogEntry = EnumLogEntry; + DPRINT1("Failed to create string from GUID!\n"); } - /* FIXME: Check the actual Guid */ - else if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_HUB_V5) && - (Stack->Parameters.QueryInterface.Version == 5)) + + CompareStatus = RtlCompareUnicodeString(&InterfacMatchString, &GuidString, TRUE); + + if (NT_SUCCESS(CompareStatus)) { InterfaceHub = (PUSB_BUS_INTERFACE_HUB_V5)Stack->Parameters.QueryInterface.Interface; - InterfaceHub->Version = 5; - InterfaceHub->Size = sizeof(USB_BUS_INTERFACE_HUB_V5); - InterfaceHub->BusContext = PdoDeviceExtension->DeviceObject; - InterfaceHub->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; - InterfaceHub->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; - InterfaceHub->CreateUsbDevice = CreateUsbDevice; - InterfaceHub->InitializeUsbDevice = InitializeUsbDevice; - InterfaceHub->GetUsbDescriptors = GetUsbDescriptors; - InterfaceHub->RemoveUsbDevice = RemoveUsbDevice; - InterfaceHub->RestoreUsbDevice = RestoreUsbDevice; - InterfaceHub->GetPortHackFlags = GetPortHackFlags; - InterfaceHub->QueryDeviceInformation = QueryDeviceInformation; - InterfaceHub->GetControllerInformation = GetControllerInformation; - InterfaceHub->ControllerSelectiveSuspend = ControllerSelectiveSuspend; - InterfaceHub->GetExtendedHubInformation = GetExtendedHubInformation; - InterfaceHub->GetRootHubSymbolicName = GetRootHubSymbolicName; - InterfaceHub->GetDeviceBusContext = GetDeviceBusContext; - InterfaceHub->Initialize20Hub = Initialize20Hub; - InterfaceHub->RootHubInitNotification = RootHubInitNotification; - InterfaceHub->FlushTransfers = FlushTransfers; - InterfaceHub->SetDeviceHandleData = SetDeviceHandleData; + InterfaceHub->Version = Stack->Parameters.QueryInterface.Version; + if (Stack->Parameters.QueryInterface.Version >= 0) + { + InterfaceHub->Size = Stack->Parameters.QueryInterface.Size; + InterfaceHub->BusContext = PdoDeviceExtension->DeviceObject; + InterfaceHub->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; + InterfaceHub->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; + } + if (Stack->Parameters.QueryInterface.Version >= 1) + { + InterfaceHub->CreateUsbDevice = CreateUsbDevice; + InterfaceHub->InitializeUsbDevice = InitializeUsbDevice; + InterfaceHub->GetUsbDescriptors = GetUsbDescriptors; + InterfaceHub->RemoveUsbDevice = RemoveUsbDevice; + InterfaceHub->RestoreUsbDevice = RestoreUsbDevice; + InterfaceHub->GetPortHackFlags = GetPortHackFlags; + InterfaceHub->QueryDeviceInformation = QueryDeviceInformation; + } + if (Stack->Parameters.QueryInterface.Version >= 2) + { + InterfaceHub->GetControllerInformation = GetControllerInformation; + InterfaceHub->ControllerSelectiveSuspend = ControllerSelectiveSuspend; + InterfaceHub->GetExtendedHubInformation = GetExtendedHubInformation; + InterfaceHub->GetRootHubSymbolicName = GetRootHubSymbolicName; + InterfaceHub->GetDeviceBusContext = GetDeviceBusContext; + InterfaceHub->Initialize20Hub = Initialize20Hub; + + } + if (Stack->Parameters.QueryInterface.Version >= 3) + { + InterfaceHub->RootHubInitNotification = RootHubInitNotification; + } + if (Stack->Parameters.QueryInterface.Version >= 4) + { + InterfaceHub->FlushTransfers = FlushTransfers; + } + if (Stack->Parameters.QueryInterface.Version >= 5) + { + InterfaceHub->SetDeviceHandleData = SetDeviceHandleData; + } + if (Stack->Parameters.QueryInterface.Version >= 6) + { + DPRINT1("Unknown version!\n"); + } + break; } - else + + CompareStatus = RtlStringFromGUID(&USB_BUS_INTERFACE_USBDI_GUID, &InterfacMatchString); + if (!NT_SUCCESS(CompareStatus)) { - DPRINT1("Not Supported\n"); - Status = Irp->IoStatus.Status; - Information = Irp->IoStatus.Information; + DPRINT1("Failed to create string from GUID!\n"); } + + CompareStatus = RtlCompareUnicodeString(&InterfacMatchString, &GuidString, TRUE); + + if (NT_SUCCESS(CompareStatus)) + { + InterfaceDI = (PUSB_BUS_INTERFACE_USBDI_V2) Stack->Parameters.QueryInterface.Interface; + InterfaceDI->Version = Stack->Parameters.QueryInterface.Version; + if (Stack->Parameters.QueryInterface.Version >= 0) + { + //InterfaceDI->Size = sizeof(USB_BUS_INTERFACE_USBDI_V2); + InterfaceDI->Size = Stack->Parameters.QueryInterface.Size; + InterfaceDI->BusContext = PdoDeviceExtension->DeviceObject; + InterfaceDI->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; + InterfaceDI->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; + InterfaceDI->GetUSBDIVersion = GetUSBDIVersion; + InterfaceDI->QueryBusTime = QueryBusTime; + InterfaceDI->SubmitIsoOutUrb = SubmitIsoOutUrb; + InterfaceDI->QueryBusInformation = QueryBusInformation; + } + if (Stack->Parameters.QueryInterface.Version >= 1) + { + InterfaceDI->IsDeviceHighSpeed = IsDeviceHighSpeed; + } + if (Stack->Parameters.QueryInterface.Version >= 2) + { + InterfaceDI->EnumLogEntry = EnumLogEntry; + } + + if (Stack->Parameters.QueryInterface.Version >= 3) + { + DPRINT1("Not Supported!\n"); + } + break; + } + + DPRINT1("Not Supported\n"); + Status = Irp->IoStatus.Status; + Information = Irp->IoStatus.Information; + break; } case IRP_MN_QUERY_BUS_INFORMATION: diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c index e30aa305e7a..77d4b0f70b6 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.c +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -58,6 +58,10 @@ CreateUsbDevice(PVOID BusContext, USHORT PortStatus, USHORT PortNumber) { DPRINT1("CreateUsbDevice called\n"); + DPRINT1("PortStatus %x\n", PortStatus); + DPRINT1("PortNumber %x\n", PortNumber); + *NewDevice = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_DEVICE), USB_POOL_TAG); + return STATUS_SUCCESS; } @@ -100,7 +104,7 @@ USB_BUSIFFN RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags) { DPRINT1("RemoveUsbDevice called\n"); - return STATUS_SUCCESS; + return STATUS_NOT_SUPPORTED; } NTSTATUS @@ -108,7 +112,7 @@ USB_BUSIFFN RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle) { DPRINT1("RestoreUsbDevice called\n"); - return STATUS_SUCCESS; + return STATUS_NOT_SUPPORTED; } NTSTATUS @@ -116,7 +120,7 @@ USB_BUSIFFN GetPortHackFlags(PVOID BusContext, PULONG Flags) { DPRINT1("GetPortHackFlags called\n"); - return STATUS_SUCCESS; + return STATUS_NOT_SUPPORTED; } NTSTATUS @@ -172,7 +176,6 @@ QueryDeviceInformation(PVOID BusContext, { RtlCopyMemory(&DeviceInfo->PipeList[i].EndpointDescriptor, &UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor, sizeof(USB_ENDPOINT_DESCRIPTOR)); } - return STATUS_SUCCESS; } @@ -230,7 +233,7 @@ GetExtendedHubInformation(PVOID BusContext, PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExntension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; LONG i; - + DPRINT1("GetExtendedHubInformation\n"); /* Set the default return value */ *LengthReturned = 0; /* Caller must have set InformationLevel to 0 */ @@ -266,7 +269,7 @@ GetRootHubSymbolicName(PVOID BusContext, if (HubSymNameBufferLength < 20) return STATUS_UNSUCCESSFUL; - //RtlStringCbCopy(HubSymNameBuffer, HubSymNameBufferLength, L"ROOT_HUB20"); + RtlCopyMemory(HubSymNameBuffer, L"ROOT_HUB20", HubSymNameBufferLength); *HubSymNameActualLength = 20; return STATUS_SUCCESS; @@ -284,7 +287,12 @@ NTSTATUS USB_BUSIFFN Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount) { - DPRINT1("Initialize20Hub called\n"); + DPRINT1("Initialize20Hub called, HubDeviceHandle: %x\n", HubDeviceHandle); + + /* FIXME: */ + /* Create the Irp Queue for SCE */ + /* Should queue be created for each device or each enpoint??? */ + return STATUS_SUCCESS; } @@ -331,7 +339,7 @@ USB_BUSIFFN QueryBusTime(PVOID BusContext, PULONG CurrentFrame) { DPRINT1("QueryBusTime called\n"); - return STATUS_SUCCESS; + return STATUS_NOT_SUPPORTED; } NTSTATUS @@ -339,7 +347,7 @@ USB_BUSIFFN SubmitIsoOutUrb(PVOID BusContext, PURB Urb) { DPRINT1("SubmitIsoOutUrb called\n"); - return STATUS_SUCCESS; + return STATUS_NOT_SUPPORTED; } NTSTATUS @@ -351,7 +359,7 @@ QueryBusInformation(PVOID BusContext, PULONG BusInformationActualLength) { DPRINT1("QueryBusInformation called\n"); - return STATUS_SUCCESS; + return STATUS_NOT_SUPPORTED; } BOOLEAN @@ -367,6 +375,6 @@ USB_BUSIFFN EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2) { DPRINT1("EnumLogEntry called\n"); - return STATUS_SUCCESS; + return STATUS_NOT_SUPPORTED; } From f1c016d7cd95288fc0d2dfce845597dee0d39130 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 7 Apr 2010 11:09:36 +0000 Subject: [PATCH 063/261] [usb/usbehci] - Instead of converting GUID to UNICODE_STRING and comparing, use IsEqualGUIDAligned. Thanks Ged. - Remove a unneeded header. svn path=/trunk/; revision=46761 --- reactos/drivers/usb/usbehci/pdo.c | 33 +++++++------------------------ 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index 2d251d66e87..d38ca6fb608 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -17,7 +17,6 @@ #include #include #include -#include /* Lifted from Linux with slight changes */ const UCHAR ROOTHUB2_DEVICE_DESCRIPTOR [] = @@ -540,22 +539,16 @@ PdoDispatchPnp( case IRP_MN_QUERY_INTERFACE: { UNICODE_STRING GuidString; - UNICODE_STRING InterfacMatchString; PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub; PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI; PPDO_DEVICE_EXTENSION PdoDeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExtension; - NTSTATUS CompareStatus; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; - /* Assume success */ - Status = STATUS_SUCCESS; - Information = 0; - - CompareStatus = RtlStringFromGUID(Stack->Parameters.QueryInterface.InterfaceType, &GuidString); - if (!NT_SUCCESS(CompareStatus)) + Status = RtlStringFromGUID(Stack->Parameters.QueryInterface.InterfaceType, &GuidString); + if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create string from GUID!\n"); } @@ -564,15 +557,11 @@ PdoDispatchPnp( DPRINT1("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); DPRINT1("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); - CompareStatus = RtlStringFromGUID(&USB_BUS_INTERFACE_HUB_GUID, &InterfacMatchString); - if (!NT_SUCCESS(CompareStatus)) - { - DPRINT1("Failed to create string from GUID!\n"); - } + /* Assume success */ + Status = STATUS_SUCCESS; + Information = 0; - CompareStatus = RtlCompareUnicodeString(&InterfacMatchString, &GuidString, TRUE); - - if (NT_SUCCESS(CompareStatus)) + if (IsEqualGUIDAligned(Stack->Parameters.QueryInterface.InterfaceType, &USB_BUS_INTERFACE_HUB_GUID)) { InterfaceHub = (PUSB_BUS_INTERFACE_HUB_V5)Stack->Parameters.QueryInterface.Interface; InterfaceHub->Version = Stack->Parameters.QueryInterface.Version; @@ -622,15 +611,7 @@ PdoDispatchPnp( break; } - CompareStatus = RtlStringFromGUID(&USB_BUS_INTERFACE_USBDI_GUID, &InterfacMatchString); - if (!NT_SUCCESS(CompareStatus)) - { - DPRINT1("Failed to create string from GUID!\n"); - } - - CompareStatus = RtlCompareUnicodeString(&InterfacMatchString, &GuidString, TRUE); - - if (NT_SUCCESS(CompareStatus)) + if (IsEqualGUIDAligned(Stack->Parameters.QueryInterface.InterfaceType, &USB_BUS_INTERFACE_USBDI_GUID)) { InterfaceDI = (PUSB_BUS_INTERFACE_USBDI_V2) Stack->Parameters.QueryInterface.Interface; InterfaceDI->Version = Stack->Parameters.QueryInterface.Version; From 779a3240ded67c81656124df1f883f1343341dd2 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Wed, 7 Apr 2010 14:35:04 +0000 Subject: [PATCH 064/261] Update all rapps entries. svn path=/trunk/; revision=46762 --- .../base/applications/rapps/rapps/firefox3.txt | 16 ++++++++-------- .../base/applications/rapps/rapps/mirandaim.txt | 4 ++-- .../base/applications/rapps/rapps/openttd.txt | 6 +++--- reactos/base/applications/rapps/rapps/scite.txt | 4 ++-- .../base/applications/rapps/rapps/scummvm.txt | 6 +++--- .../base/applications/rapps/rapps/seamonkey.txt | 16 ++++++++-------- .../applications/rapps/rapps/thunderbird.txt | 14 +++++++------- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/reactos/base/applications/rapps/rapps/firefox3.txt b/reactos/base/applications/rapps/rapps/firefox3.txt index e6051802e00..e9313b7677a 100644 --- a/reactos/base/applications/rapps/rapps/firefox3.txt +++ b/reactos/base/applications/rapps/rapps/firefox3.txt @@ -2,41 +2,41 @@ [Section] Name = Mozilla Firefox 3.0 -Version = 3.0.18 +Version = 3.0.19 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. Size = 7.2M Category = 5 URLSite = http://www.mozilla.com/en-US/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/en-US/Firefox%20Setup%203.0.18.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/en-US/Firefox%20Setup%203.0.19.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Webbrowser. Size = 7.0M URLSite = http://www.mozilla-europe.org/de/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/de/Firefox%20Setup%203.0.18.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/de/Firefox%20Setup%203.0.19.exe [Section.040a] Description = El más popular y uno de los mejores navegadores web gratuitos que hay. Size = 7.0M URLSite = http://www.mozilla-europe.org/es/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/es-ES/Firefox%20Setup%203.0.18.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/es-ES/Firefox%20Setup%203.0.19.exe [Section.0414] Description = Mest populære og best ogsÃ¥ gratis nettleserene der ute. -Size = 6.9M +Size = 7.0M URLSite = http://www.mozilla-europe.org/no/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/nb-NO/Firefox%20Setup%203.0.18.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/nb-NO/Firefox%20Setup%203.0.19.exe [Section.0415] Description = Najpopularniejsza i jedna z najlepszych darmowych przeglÄ…darek internetowych. Size = 7.8M URLSite = http://www.mozilla-europe.org/pl/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/pl/Firefox%20Setup%203.0.18.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/pl/Firefox%20Setup%203.0.19.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных браузеров. Size = 7.4M URLSite = http://www.mozilla-europe.org/ru/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/ru/Firefox%20Setup%203.0.18.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/ru/Firefox%20Setup%203.0.19.exe diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt index 0fff6a4ea04..db0b17f1ab6 100644 --- a/reactos/base/applications/rapps/rapps/mirandaim.txt +++ b/reactos/base/applications/rapps/rapps/mirandaim.txt @@ -2,13 +2,13 @@ [Section] Name = Miranda IM -Version = 0.8.18 +Version = 0.8.19 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 1.6MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.18-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.19-unicode.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/openttd.txt b/reactos/base/applications/rapps/rapps/openttd.txt index dfc94a95e43..2e70160c846 100644 --- a/reactos/base/applications/rapps/rapps/openttd.txt +++ b/reactos/base/applications/rapps/rapps/openttd.txt @@ -2,13 +2,13 @@ [Section] Name = OpenTTD -Version = 0.7.5 +Version = 1.0.0 Licence = GPL v2 Description = Open Source clone of the "Transport Tycoon Deluxe" game engine. You need a copy of Transport Tycoon. -Size = 2.9MB +Size = 3.5MB Category = 4 URLSite = http://www.openttd.org/ -URLDownload = http://binaries.openttd.org/releases/0.7.5/openttd-0.7.5-windows-win32.exe +URLDownload = http://binaries.openttd.org/releases/1.0.0/openttd-1.0.0-windows-win32.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/scite.txt b/reactos/base/applications/rapps/rapps/scite.txt index fc3d9d50cca..1f8208b2153 100644 --- a/reactos/base/applications/rapps/rapps/scite.txt +++ b/reactos/base/applications/rapps/rapps/scite.txt @@ -2,13 +2,13 @@ [Section] Name = SciTE -Version = 2.03 +Version = 2.10 Licence = Freeware Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs. Size = 0.6M Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc203.exe +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc210.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/scummvm.txt b/reactos/base/applications/rapps/rapps/scummvm.txt index 6365b1c1b63..ebe7b348a50 100644 --- a/reactos/base/applications/rapps/rapps/scummvm.txt +++ b/reactos/base/applications/rapps/rapps/scummvm.txt @@ -2,13 +2,13 @@ [Section] Name = ScummVM -Version = 1.0.0 +Version = 1.1.0 Licence = GPL Description = Sam and Max, Day of the Tentacle, etc on ReactOS. -Size = 3.1MB +Size = 3.4MB Category = 4 URLSite = http://scummvm.org/ -URLDownload = http://dfn.dl.sourceforge.net/project/scummvm/scummvm/1.0.0/scummvm-1.0.0-win32.exe +URLDownload = http://dfn.dl.sourceforge.net/project/scummvm/scummvm/1.1.0/scummvm-1.1.0-win32.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/seamonkey.txt b/reactos/base/applications/rapps/rapps/seamonkey.txt index 9c980d30b65..55d3be87f2f 100644 --- a/reactos/base/applications/rapps/rapps/seamonkey.txt +++ b/reactos/base/applications/rapps/rapps/seamonkey.txt @@ -2,31 +2,31 @@ [Section] Name = Mozilla SeaMonkey -Version = 2.0.3 +Version = 2.0.4 Licence = MPL/GPL/LGPL Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need. -Size = 10.0MB +Size = 10.1MB Category = 5 URLSite = http://www.seamonkey-project.org/ -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/en-US/SeaMonkey%20Setup%202.0.3.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/en-US/SeaMonkey%20Setup%202.0.4.exe CDPath = none [Section.0407] Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen. -Size = 10.1MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/de/SeaMonkey%20Setup%202.0.3.exe +Size = 10.0MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/de/SeaMonkey%20Setup%202.0.4.exe [Section.040a] Description = La suite de Mozilla está viva. Es el primero y único navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarás. Size = 10.0MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/es-ES/SeaMonkey%20Setup%202.0.3.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/es-ES/SeaMonkey%20Setup%202.0.4.exe [Section.0415] Description = Pakiet Mozilla żyje. W zestawie: przeglÄ…darka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz. Size = 10.8MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/pl/SeaMonkey%20Setup%202.0.3.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/pl/SeaMonkey%20Setup%202.0.4.exe [Section.0419] Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор. Size = 10.4MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/ru/SeaMonkey%20Setup%202.0.3.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/ru/SeaMonkey%20Setup%202.0.4.exe diff --git a/reactos/base/applications/rapps/rapps/thunderbird.txt b/reactos/base/applications/rapps/rapps/thunderbird.txt index 9f0cd328d89..a9e837cd7e0 100644 --- a/reactos/base/applications/rapps/rapps/thunderbird.txt +++ b/reactos/base/applications/rapps/rapps/thunderbird.txt @@ -2,35 +2,35 @@ [Section] Name = Mozilla Thunderbird -Version = 3.0.3 +Version = 3.0.4 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. Size = 8.6M Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/en-US/Thunderbird%20Setup%203.0.3.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/en-US/Thunderbird%20Setup%203.0.4.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Mail-Clients. -Size = 8.4M +Size = 8.5M URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/de/Thunderbird%20Setup%203.0.3.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/de/Thunderbird%20Setup%203.0.4.exe [Section.040a] Description = El más popular y uno de los mejores clientes mail que hay. Size = 8.4M URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/es-ES/Thunderbird%20Setup%203.0.3.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/es-ES/Thunderbird%20Setup%203.0.4.exe [Section.0415] Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty. Size = 9.3M URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/pl/Thunderbird%20Setup%203.0.3.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/pl/Thunderbird%20Setup%203.0.4.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных почтовых клиентов. Size = 8.8M URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/ru/Thunderbird%20Setup%203.0.3.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/ru/Thunderbird%20Setup%203.0.4.exe From 2052c57785e55f9136cc56b01d197d4d9c82ef9c Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Wed, 7 Apr 2010 17:41:38 +0000 Subject: [PATCH 065/261] [SHELL32] - Portuguese translation by Manuel Silva See issue #1494 for more details. svn path=/trunk/; revision=46764 --- reactos/dll/win32/shell32/lang/pt-PT.rc | 575 ++++++++++++------------ 1 file changed, 288 insertions(+), 287 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index dbf3fe2453c..0660e3b481d 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -2,6 +2,7 @@ * Copyright 1998 Juergen Schmied * Copyright 2003 Marcelo Duarte * Copyright 2006-2007 Américo José Melo + * Copyright 2010 Manuel D V Silva * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -66,27 +67,27 @@ MENU_SHV_FILE MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "E&xplore", FCIDM_SHVIEW_EXPLORE - MENUITEM "&Open", FCIDM_SHVIEW_OPEN + MENUITEM "E&xplorador", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Abrir", FCIDM_SHVIEW_OPEN MENUITEM SEPARATOR - MENUITEM "C&ut", FCIDM_SHVIEW_CUT - MENUITEM "&Copy", FCIDM_SHVIEW_COPY + MENUITEM "C&ortar", FCIDM_SHVIEW_CUT + MENUITEM "&Copiar", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR - MENUITEM "Create &Link", FCIDM_SHVIEW_CREATELINK - MENUITEM "&Delete", FCIDM_SHVIEW_DELETE - MENUITEM "&Rename", FCIDM_SHVIEW_RENAME + MENUITEM "Criar &Link", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Apagar", FCIDM_SHVIEW_DELETE + MENUITEM "&Renomear", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR - MENUITEM "&Properties", FCIDM_SHVIEW_PROPERTIES + MENUITEM "&Propriadades", FCIDM_SHVIEW_PROPERTIES END END SHBRSFORFOLDER_MSGBOX DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "Browse for Folder" +CAPTION "Procurar Pastas" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "OK", 1, 60, 175, 60, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Cancel", 2, 125, 175, 60, 15, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancelar", 2, 125, 175, 60, 15, WS_GROUP | WS_TABSTOP LTEXT "", IDD_TITLE, 4, 4, 180, 12 LTEXT "", IDD_STATUS, 4, 25, 180, 12 CONTROL "", IDD_TREEVIEW, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP, 4, 40, 180, 120 @@ -94,28 +95,28 @@ END SHNEWBRSFORFOLDER_MSGBOX DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 15, 40, 218, 196 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "Browse for Folder" +CAPTION "Procurar Pastas" FONT 8, "MS Shell Dlg" BEGIN LTEXT "", IDD_TITLE, 10, 8, 198, 24 LTEXT "", IDD_STATUS, 10, 25, 198, 12 - LTEXT "Folder:", IDD_FOLDER, 10, 152, 40, 12 + LTEXT "Pasta:", IDD_FOLDER, 10, 152, 40, 12 CONTROL "", IDD_TREEVIEW, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP, 12, 38, 194, 105 EDITTEXT IDD_FOLDERTEXT, 46, 150, 160, 14, WS_BORDER | WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Make New Folder", IDD_MAKENEWFOLDER, 12, 174, 77, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Criar Nova Pasta", IDD_MAKENEWFOLDER, 12, 174, 77, 14, WS_GROUP | WS_TABSTOP DEFPUSHBUTTON "OK", IDOK, 102, 174, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 156, 174, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancelar", IDCANCEL, 156, 174, 50, 14, WS_GROUP | WS_TABSTOP END SHELL_YESTOALL_MSGBOX DIALOGEX 200, 100, 280, 90 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Message" +CAPTION "Mensagem" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Yes", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Yes to &all", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&No", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Cancel", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "&Sim", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Sim para &todos", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Não", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Cancelar", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP ICON "", IDD_ICON, 10, 10, 16, 16 LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0 END @@ -127,14 +128,14 @@ FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_SHELL_ABOUT_ICON, 7, 55, 21, 20 LTEXT "", IDC_SHELL_ABOUT_APPNAME, 35, 55, 200, 10 - LTEXT "Version " KERNEL_VERSION_STR " (" KERNEL_VERSION_BUILD_STR ")", IDC_STATIC, 35, 65, 235, 10 + LTEXT "Versão " KERNEL_VERSION_STR " (" KERNEL_VERSION_BUILD_STR ")", IDC_STATIC, 35, 65, 235, 10 LTEXT REACTOS_DEFAULT_STR_LEGAL_COPYRIGHT, IDC_STATIC, 35, 75, 210, 10 LTEXT "", IDC_SHELL_ABOUT_OTHERSTUFF, 35, 90, 180, 20 - LTEXT "This ReactOS version is registered to:", IDC_STATIC, 35, 115, 180, 10 + LTEXT "Esta versão do ReactOS é registado a:", IDC_STATIC, 35, 115, 180, 10 LTEXT "", IDC_SHELL_ABOUT_REG_USERNAME, 45, 125, 180, 10 LTEXT "", IDC_SHELL_ABOUT_REG_ORGNAME, 45, 135, 180, 10 LTEXT "", IDC_STATIC, 35, 147, 235, 1, SS_ETCHEDHORZ - LTEXT "Installed physical memory:", IDC_STATIC, 35, 152, 130, 10 + LTEXT "Memória física instalada:", IDC_STATIC, 35, 152, 130, 10 LTEXT "", IDC_SHELL_ABOUT_PHYSMEM, 167, 152, 88, 10 DEFPUSHBUTTON "OK", IDOK, 220, 178, 50, 14 @@ -155,7 +156,7 @@ CAPTION "" FONT 8, "MS Shell Dlg" BEGIN ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Digite o nome do programa, pasta, documento, ou endereço Internet, que o Wine irá abrí-lo.", 12289, 36, 11, 182, 18 + LTEXT "Digite o nome do programa, pasta, documento, ou endereço Internet, que o ReactOS irá abrí-lo.", 12289, 36, 11, 182, 18 LTEXT "&Abrir:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP @@ -165,156 +166,156 @@ END SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 235, 215 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" +CAPTION "Atalho" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 4, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 8, 38, 64, 10 + LTEXT "Tipo de destino:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 - LTEXT "Target location:", 14006, 8, 58, 64, 10 + LTEXT "Localização do destino:", 14006, 8, 58, 64, 10 LTEXT "", 14007, 79, 58, 141, 10 - LTEXT "Target:", 14008, 8, 77, 45, 10 + LTEXT "Destino:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL - LTEXT "&Start in:", 14010, 8, 96, 57, 10 + LTEXT "&Iniciar em:", 14010, 8, 96, 57, 10 EDITTEXT 14011, 79, 94, 150, 14, ES_AUTOHSCROLL - LTEXT "Shortcut &key:", 14014, 8, 115, 57, 10 + LTEXT "&Tecla de Atalho:", 14014, 8, 115, 57, 10 EDITTEXT 14015, 79, 112, 150, 14, ES_LEFT - LTEXT "Run:", 14016, 8, 134, 57, 10 + LTEXT "Executar:", 14016, 8, 134, 57, 10 EDITTEXT 14017, 79, 131, 150, 14, ES_AUTOHSCROLL - LTEXT "C&omment:", 14018, 8, 152, 57, 10 + LTEXT "C&omemntário:", 14018, 8, 152, 57, 10 EDITTEXT 14019, 79, 149, 150, 14, ES_AUTOHSCROLL - PUSHBUTTON "&Find Target...", 14020, 9, 172, 70, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 84, 172, 70, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 159, 172, 70, 14, ES_LEFT + PUSHBUTTON "&Localizar Destino...", 14020, 9, 172, 70, 14, ES_LEFT + PUSHBUTTON "&Trocar Icon...", 14021, 84, 172, 70, 14, ES_LEFT + PUSHBUTTON "A&vançado...", 14022, 159, 172, 70, 14, ES_LEFT END SHELL_EXTENDED_SHORTCUT_DLG DIALOGEX 0, 0, 230, 150 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Extended Properties" +CAPTION "Propriedades Avançadas" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Choose the advanced properties you want for this shortcut.", -1, 5, 30, 210, 10 - CHECKBOX "Run with different credentials", 14000, 25, 50, 150, 10 - LTEXT "This option can allow you to run the this shortcut as another user, or continue as yourself while protecting your computer and data from unauthorized program activity.", -1, 50, 60, 175, 40 - CHECKBOX "Run in seperate memory space", 14001, 25, 100, 90, 10, WS_DISABLED + LTEXT "Escolha as propriedades avançadas que quer para este atalho.", -1, 5, 30, 210, 10 + CHECKBOX "Executar com diferentes credenciais", 14000, 25, 50, 150, 10 + LTEXT "Esta opção permite executar este atalho como outro utilizador, ou continue com a sua conta enquanto protege o seu computador e dados contra actividade de programas não autorizados.", -1, 50, 60, 175, 40 + CHECKBOX "Executar num espaço de memória separada", 14001, 25, 100, 90, 10, WS_DISABLED PUSHBUTTON "OK", 1, 63, 124, 50, 15, WS_VISIBLE - PUSHBUTTON "Abort", 2, 120, 124, 50, 15, WS_VISIBLE + PUSHBUTTON "Abortar", 2, 120, 124, 50, 15, WS_VISIBLE END SHELL_FOLDER_GENERAL_DLG DIALOGEX 0, 0, 240, 205 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" +CAPTION "Geral" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 3, 30, 30, WS_VISIBLE EDITTEXT 14001, 70, 9, 158, 14, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 8, 35, 50, 10 - LTEXT "Folder", 14005, 68, 35, 160, 10 - LTEXT "Location:", 14006, 8, 53, 50, 10 + LTEXT "Tipo de ficheiro:", 14004, 8, 35, 50, 10 + LTEXT "Pasta", 14005, 68, 35, 160, 10 + LTEXT "Localização:", 14006, 8, 53, 50, 10 LTEXT "", 14007, 68, 53, 315, 10 - LTEXT "Size:", 14008, 8, 72, 45, 10 + LTEXT "Tamanho:", 14008, 8, 72, 45, 10 LTEXT "", 14009, 68, 72, 315, 10 - LTEXT "Contains:", 14010, 8, 93, 45, 10 + LTEXT "Contém:", 14010, 8, 93, 45, 10 LTEXT "", 14011, 68, 93, 160, 10 - LTEXT "Created:", 14014, 8, 118, 45, 10 + LTEXT "Criado:", 14014, 8, 118, 45, 10 LTEXT "", 14015, 68, 118, 160, 10 - AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 - AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 + AUTOCHECKBOX "&Sómente de Leitura", 14021, 45, 150, 67, 10 + AUTOCHECKBOX "&Escondido", 14022, 126, 150, 50, 10 END SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 205 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" +CAPTION "geral" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 3, 30, 30, WS_VISIBLE EDITTEXT 14001, 70, 9, 158, 14, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 8, 35, 50, 10 - LTEXT "File", 14005, 68, 35, 160, 10 - LTEXT "Opens with:", 14006, 8, 53, 50, 10 + LTEXT "Tipo de Ficheiro:", 14004, 8, 35, 50, 10 + LTEXT "Ficheiro", 14005, 68, 35, 160, 10 + LTEXT "Abre com::", 14006, 8, 53, 50, 10 LTEXT "", 14007, 68, 53, 160, 10 - LTEXT "Location:", 14008, 8, 72, 45, 10 + LTEXT "Localização:", 14008, 8, 72, 45, 10 LTEXT "", 14009, 68, 72, 315, 10 - LTEXT "Size:", 14010, 8, 93, 45, 10 + LTEXT "Tamanho:", 14010, 8, 93, 45, 10 LTEXT "", 14011, 68, 93, 160, 10 - LTEXT "Created:", 14014, 8, 118, 45, 10 + LTEXT "Criado:", 14014, 8, 118, 45, 10 LTEXT "", 14015, 68, 118, 160, 10 - LTEXT "Modified:", 14016, 8, 140, 45, 10 + LTEXT "Modificado:", 14016, 8, 140, 45, 10 LTEXT "", 14017, 68, 140, 160, 10 - LTEXT "Accessed:", 14018, 8, 160, 45, 10 + LTEXT "Acedido:", 14018, 8, 160, 45, 10 LTEXT "", 14019, 68, 160, 160, 10 - LTEXT "Attributes:", 14020, 8, 189, 45, 10 - CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 - CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 - CHECKBOX "&Archive", 14023, 181, 189, 49, 10 + LTEXT "propriedades:", 14020, 8, 189, 45, 10 + CHECKBOX "&Somente de Leitura", 14021, 58, 189, 67, 10 + CHECKBOX "&Oculto", 14022, 126, 189, 50, 10 + CHECKBOX "&Arquivo", 14023, 181, 189, 49, 10 END SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 235, 215 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" +CAPTION "Versão" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "File version: ", 14000, 10, 10, 55, 10 + LTEXT "Versão do Ficheiro: ", 14000, 10, 10, 55, 10 LTEXT "", 14001, 77, 10, 152, 10 - LTEXT "Description: ", 14002, 10, 27, 45, 10 + LTEXT "Descrição: ", 14002, 10, 27, 45, 10 LTEXT "", 14003, 77, 27, 152, 10 LTEXT "Copyright: ", 14004, 10, 46, 66, 10 LTEXT "", 14005, 77, 46, 152, 10 - GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 - LTEXT "Item name: ", 14007, 13, 82, 50, 10 - LTEXT "Value: ", 14008, 112, 82, 45, 10 + GROUPBOX "Outras informações da versão: ", 14006, 6, 70, 222, 115 + LTEXT "Nome do Item: ", 14007, 13, 82, 50, 10 + LTEXT "Valor: ", 14008, 112, 82, 45, 10 LISTBOX 14009, 12, 94, 94, 83, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY EDITTEXT 14010, 112, 93, 109, 83, ES_LEFT | WS_BORDER | WS_VSCROLL | WS_GROUP | ES_MULTILINE | ES_READONLY END DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" +CAPTION "Geral" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 + LTEXT "Tipo:", -1, 15, 55, 40, 10 LTEXT "", 14001, 110, 55, 100, 10 - LTEXT "File system:", -1, 15, 70, 100, 10 + LTEXT "Sistema de Ficheiros:", -1, 15, 70, 100, 10 LTEXT "", 14002, 110, 70, 100, 10 CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 + LTEXT "Espaço utilizado:", -1, 25, 90, 120, 10 LTEXT "", 14003, 110, 90, 120, 10 LTEXT "", 14004, 200, 90, 40, 10 CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 + LTEXT "Espaço livre:", -1, 25, 105, 70, 10 LTEXT "", 14005, 110, 105, 120, 10 LTEXT "", 14006, 200, 105, 40, 10 - LTEXT "Capacity:", -1, 25, 125, 80, 10 + LTEXT "Capacidade:", -1, 25, 125, 80, 10 LTEXT "", 14007, 110, 125, 120, 10 LTEXT "", 14008, 200, 125, 40, 10 CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - LTEXT "Drive %s", 14009, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14010, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14011, 15, 205, 180, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED + LTEXT "Disco %s", 14009, 100, 170, 40, 10 + PUSHBUTTON "Limpeza do Disco", 14010, 180, 175, 50, 15, WS_TABSTOP + CHECKBOX "Comprimir unidade para libertar espaço no disco", 14011, 15, 205, 180, 10, WS_DISABLED + CHECKBOX "permitir indexar este disco para acelerar a procura de ficheiros", 14012, 15, 220, 200, 10, WS_DISABLED END DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" +CAPTION "Ferramentas" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP + GROUPBOX "Verificar por erros...", -1, 5, 5, 230, 60 + LTEXT "Esta opção vai verificar o volume por erros.", -1, 40, 25, 160, 20 + PUSHBUTTON "Verificar agora...", 14000, 130, 45, 90, 15, WS_TABSTOP + GROUPBOX "Desfragmentação", -1, 5, 65, 230, 60 + LTEXT "Esta opção vai desfragmentar os ficheiros no volume", -1, 40, 85, 160, 20 + PUSHBUTTON "Defragmentar Agora...", 14001, 130, 105, 90, 15, WS_TABSTOP + GROUPBOX "Cópia de segurança", -1, 5, 130, 230, 60 + LTEXT "Esta opção vai criar os ficheiros do volume.", -1, 40, 150, 160, 20 + PUSHBUTTON "Executar Cópia de Segurança...", 14002, 130, 170, 90, 15, WS_TABSTOP END DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 230 @@ -326,151 +327,151 @@ END RUN_AS_DIALOG DIALOGEX 0, 0, 240, 190 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Run As" +CAPTION "Executar Como..." FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Which user account do you want to use to run this program?", -1, 10, 20, 220, 20 - CHECKBOX "Current User %s", 14000, 10, 45, 150, 10 - LTEXT "Protect my computer and data from unauthorized program activity", -1, 25, 57, 200, 10, WS_DISABLED - CHECKBOX "This option can prevent computer viruses from harming your computer or personal data, but selecting it might cause the program to function improperly.", 14001, 25, 68, 200, 30, WS_DISABLED | BS_MULTILINE - CHECKBOX "The following user:", 14002, 10, 100, 90, 10 - LTEXT "User name:", -1, 20, 118, 54, 10 + LTEXT "Que conta de utilizador quer utilizar para executar este programa?", -1, 10, 20, 220, 20 + CHECKBOX "Utilizador actual %s", 14000, 10, 45, 150, 10 + LTEXT "Proteger o meu computador e dados de actividade de programas não autoridados.", -1, 25, 57, 200, 10, WS_DISABLED + CHECKBOX "Esta opção pode prevenir a acção de virus no computador,mas seleccionando-a pode levar a que alguns programas funcionem incorrectamente.", 14001, 25, 68, 200, 30, WS_DISABLED | BS_MULTILINE + CHECKBOX "O seguinte utilizador:", 14002, 10, 100, 90, 10 + LTEXT "Nome do utilizador:", -1, 20, 118, 54, 10 COMBOBOX 14003, 75, 115, 100, 15, CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP PUSHBUTTON "...", 14004, 180, 115, 30, 14, WS_TABSTOP - LTEXT "Password:", -1, 20, 143, 53, 10 + LTEXT "Palavra-passe:", -1, 20, 143, 53, 10 EDITTEXT 14005, 74, 140, 100, 14, ES_LEFT | WS_BORDER | WS_GROUP PUSHBUTTON "...", 14006, 180, 140, 30, 14, WS_TABSTOP PUSHBUTTON "OK", 14007, 57, 170, 60, 14, WS_TABSTOP - PUSHBUTTON "Cancel", 14008, 122, 170, 60, 14, WS_TABSTOP + PUSHBUTTON "Cancelar", 14008, 122, 170, 60, 14, WS_TABSTOP END BITBUCKET_PROPERTIES_DLG DIALOGEX 0, 0, 240, 190 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Recycle Bin Properties" +CAPTION "propriedades da Reciclagem" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN CONTROL "", 14000, "SysListView32", LVS_REPORT | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 10, 10, 220, 50 - GROUPBOX "Settings for selected location", -1, 10, 72, 220, 70 - RADIOBUTTON "&Custom size:", 14001, 20, 90, 80, 10, WS_TABSTOP + GROUPBOX "propriedades para as localizações seleccionadas", -1, 10, 72, 220, 70 + RADIOBUTTON "&Tamanho personalizado:", 14001, 20, 90, 80, 10, WS_TABSTOP EDITTEXT 14002, 106, 87, 50, 14, WS_TABSTOP | ES_NUMBER - LTEXT "M&aximum size(MB):", -1, 20, 105, 70, 10 - RADIOBUTTON "Do not move files to the &Recycle Bin. Remove files immediately when deleted.", 14003, 20, 117, 170, 20, BS_MULTILINE | WS_TABSTOP - AUTOCHECKBOX "&Display delete confirmation dialog", 14004, 20, 155, 140, 10, WS_TABSTOP + LTEXT "Tamanho M&áximo(MB):", -1, 20, 105, 70, 10 + RADIOBUTTON "Não mover os ficheiros para a &Reciclagem. Apagá-los definitivamente.", 14003, 20, 117, 170, 20, BS_MULTILINE | WS_TABSTOP + AUTOCHECKBOX "&Mostrar ecrân de confirmação de eliminação", 14004, 20, 155, 140, 10, WS_TABSTOP END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Open With" +CAPTION "Abre com..." FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON IDI_SHELL_OPEN_WITH, -1, 8, 12, 21, 20 - LTEXT "Choose the program you want to use to open this file:", -1, 44, 12, 211, 10 - LTEXT "File: ", 14001, 44, 25, 188, 10 - GROUPBOX "&Programs", -1, 7, 42, 249, 187 + LTEXT "Escolha o programa que quer utilizar para abrir este ficheiro:", -1, 44, 12, 211, 10 + LTEXT "Ficheiro: ", 14001, 44, 25, 188, 10 + GROUPBOX "&Programas", -1, 7, 42, 249, 187 LISTBOX 14002, 16 ,57, 230, 130, LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP, WS_EX_STATICEDGE - AUTOCHECKBOX "&Always use the selected program to open this kind of file", 14003, 20, 193, 225, 10 - PUSHBUTTON "&Browse...", 14004, 198, 207, 50, 14 + AUTOCHECKBOX "&Utilizar sempre o programa seleccionado para abrir este tipo de ficheiros", 14003, 20, 193, 225, 10 + PUSHBUTTON "&Seleccione...", 14004, 198, 207, 50, 14 PUSHBUTTON "OK", 14005, 150, 236, 50, 14 - PUSHBUTTON "Cancel", 14006, 206, 236, 50, 14 + PUSHBUTTON "Cancelar", 14006, 206, 236, 50, 14 END FOLDER_OPTIONS_GENERAL_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "General" +CAPTION "Geral" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - GROUPBOX "Tasks", -1, 7, 10, 249, 45 + GROUPBOX "Tarefas", -1, 7, 10, 249, 45 ICON "", 30109, 14, 25, 21, 20, SS_REALSIZECONTROL - AUTORADIOBUTTON "Show common tasks in &folders", 14001, 40, 25, 120, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "Use ReactOS class&ic folders", 14002, 40, 37, 120, 10, WS_TABSTOP | WS_GROUP - GROUPBOX "Browse folders", -1, 7, 60, 249, 45, WS_TABSTOP + AUTORADIOBUTTON "Mostrar tarefas comuns nas &pastas", 14001, 40, 25, 120, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "Utilizar pastas class&icas ReactOS", 14002, 40, 37, 120, 10, WS_TABSTOP | WS_GROUP + GROUPBOX "Procurar pastas", -1, 7, 60, 249, 45, WS_TABSTOP ICON "", 30110, 14, 70, 21, 20, SS_REALSIZECONTROL - AUTORADIOBUTTON "Open each folder in the sa&me window", 14004, 40, 70, 140, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "Open each folder in its own &window", 14005, 40, 82, 140, 10, WS_TABSTOP | WS_GROUP - GROUPBOX "Click items as follows", -1, 7, 110, 249, 60 + AUTORADIOBUTTON "Abrir cada pasta na &mesma janela", 14004, 40, 70, 140, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "Abrir cada pasta na sua &janela", 14005, 40, 82, 140, 10, WS_TABSTOP | WS_GROUP + GROUPBOX "Seleccione a seguinte opção", -1, 7, 110, 249, 60 ICON "", 30111, 14, 120, 21, 20, SS_REALSIZECONTROL - AUTORADIOBUTTON "&Single-click to open an item (point to select)", 14007, 40, 120, 170, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "Underline icon titles consistent with my &browser", 14008, 50, 132, 170, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "Underline icon titles only when I &point at them", 14009, 50, 144, 170, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "&Double-click to open an item (single-click to select)", 14010, 40, 156, 170, 10, WS_TABSTOP | WS_GROUP - PUSHBUTTON "&Restore Defaults", 14011, 180, 180, 60, 14, WS_TABSTOP + AUTORADIOBUTTON "&Click simples para abrir um item", 14007, 40, 120, 170, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "Sublinhar os títulos dos ícones mantendo o aspecto do &browser", 14008, 50, 132, 170, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "Sublinhar os títulos dos ícones apenas quando &aponto para eles", 14009, 50, 144, 170, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "&Duplo-click para abrir um item (um click para seleccionar)", 14010, 40, 156, 170, 10, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&Restaurar valores por defeito", 14011, 180, 180, 60, 14, WS_TABSTOP END FOLDER_OPTIONS_VIEW_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "View" +CAPTION "Ver" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN -GROUPBOX "Folder views", -1, 7, 10, 249, 60 +GROUPBOX "Vistas das Pastas", -1, 7, 10, 249, 60 //ICON -LTEXT "You can apply the view(such as Details or Tiles) that\nyou are using for this folder to all folders.", -1, 60, 20, 180, 20 -PUSHBUTTON "Apply to A&ll Folders", 14001, 60, 50, 80, 14, WS_TABSTOP -PUSHBUTTON "&Reset All Folders", 14002, 150, 50, 80, 14, WS_TABSTOP -LTEXT "Advanced settings:", -1, 7, 80, 100, 10 +LTEXT "Pode aplicar a vista (como detalhes ou títulos) que\nestá a usar para esta pasta para todas as pastas.", -1, 60, 20, 180, 20 +PUSHBUTTON "Applicar a T&odas as Pastas", 14001, 60, 50, 80, 14, WS_TABSTOP +PUSHBUTTON "&Reiniciar todas as Pastas", 14002, 150, 50, 80, 14, WS_TABSTOP +LTEXT "Definições avançadas:", -1, 7, 80, 100, 10 CONTROL "", 14003, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 7, 90, 249, 120 -PUSHBUTTON "Restore &Defaults", 14004, 180, 210, 80, 14, WS_TABSTOP +PUSHBUTTON "Restaurar valores por &Defeito", 14004, 180, 210, 80, 14, WS_TABSTOP END FOLDER_OPTIONS_FILETYPES_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "File Types" +CAPTION "Tipos de Ficheiros" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN -LTEXT "Registered file &types:", -1, 7, 10, 70, 10 +LTEXT "&Tipos de ficheiros registados:", -1, 7, 10, 70, 10 CONTROL "", 14000, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 7, 20, 249, 80 -PUSHBUTTON "&New", 14001, 120, 110, 50, 14, WS_TABSTOP -PUSHBUTTON "&Delete", 14002, 180, 110, 50, 14, WS_TABSTOP -GROUPBOX "Details for '%s' extension", 14003, 7, 130, 249, 70 -LTEXT "Opens with:", -1, 12, 140, 40, 10 +PUSHBUTTON "&Novo", 14001, 120, 110, 50, 14, WS_TABSTOP +PUSHBUTTON "&Apagar", 14002, 180, 110, 50, 14, WS_TABSTOP +GROUPBOX "Detalhes para '%s' extensão", 14003, 7, 130, 249, 70 +LTEXT "Abre com:", -1, 12, 140, 40, 10 //ICON -LTEXT "Appname", 14005, 100, 140, 40, 10 -PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 -PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP +LTEXT "Appnome", 14005, 100, 140, 40, 10 +PUSHBUTTON "&Mudar...", 14006, 180, 140, 50, 14, WS_TABSTOP +LTEXT "Ficheiros com extensão '%s' são do tipo '%s'. Para\nmudar definições que afectam todos '%s' ficheiros, click\nAvançado.", 14007, 12, 155, 160, 30 +PUSHBUTTON "A&vançado", 14008, 180, 175, 50, 14, WS_TABSTOP END CONFIRM_FILE_REPLACE_DLG DIALOGEX 0, 0, 282, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Confirm File Replace" +CAPTION "Confirmar Substituição de Ficheiros" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Yes", IDYES, 20, 122, 60, 14 - PUSHBUTTON "Yes to &All", 12807, 85, 122, 60, 14 - PUSHBUTTON "&No", IDNO, 150, 122, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 215, 122, 60, 14 + DEFPUSHBUTTON "&Sim", IDYES, 20, 122, 60, 14 + PUSHBUTTON "Sim para &Todos", 12807, 85, 122, 60, 14 + PUSHBUTTON "&Não", IDNO, 150, 122, 60, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 215, 122, 60, 14 ICON 146, -1, 11, 10, 21, 20, SS_REALSIZECONTROL - LTEXT "This folder already contains a file named '%2'.", 12291, 44, 10, 231, 22, SS_NOPREFIX - LTEXT "This folder already contains a read-only file named '%2'.", 12292, 41, 10, 222, 22, SS_NOPREFIX - LTEXT "This folder already contains a system file named '%2'.", 12293, 41, 10, 222, 22, SS_NOPREFIX - LTEXT "Would you like to replace the existing file", -1, 44, 35, 228, 10, SS_NOPREFIX - LTEXT "(unknown date and size)", 12302, 79, 51, 198, 20, SS_NOPREFIX + LTEXT "Esta pasta já contém um ficheiro com o nome '%2'.", 12291, 44, 10, 231, 22, SS_NOPREFIX + LTEXT "Esta pasta já contém um ficheiro sómente de leitura com o nome '%2'.", 12292, 41, 10, 222, 22, SS_NOPREFIX + LTEXT "Esta pasta já contém um ficheiro de sistema com o nome '%2'.", 12293, 41, 10, 222, 22, SS_NOPREFIX + LTEXT "pretende substituir o ficheiro existente", -1, 44, 35, 228, 10, SS_NOPREFIX + LTEXT "(data e tamanho desconhecido)", 12302, 79, 51, 198, 20, SS_NOPREFIX ICON "", 12300, 50, 49, 21, 20, SS_REALSIZECONTROL - LTEXT "with this one?", -1, 44, 75, 228, 10, SS_NOPREFIX - LTEXT "(unknown date and size)", 12303, 79, 91, 198, 20, SS_NOPREFIX + LTEXT "por este?", -1, 44, 75, 228, 10, SS_NOPREFIX + LTEXT "(data e tamanho desconhecido)", 12303, 79, 91, 198, 20, SS_NOPREFIX ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END LOGOFF_DLG DIALOGEX 0, 0, 190, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Log Off ReactOS" +CAPTION "Terminar sessão ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON 45, 14344, 10, 10, 21, 20, SS_REALSIZECONTROL - LTEXT "Are you sure you want to log off?", -1, 43, 11, 140, 22 - DEFPUSHBUTTON "&Log Off", IDOK, 57, 40, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 122, 40, 60, 14 + LTEXT "Tem a certeza que quer terminar a sessão?", -1, 43, 11, 140, 22 + DEFPUSHBUTTON "&Terminar a sessão", IDOK, 57, 40, 60, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 122, 40, 60, 14 END DISCONNECT_DLG DIALOGEX 0, 0, 190, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Disconnect ReactOS" +CAPTION "Encerrar ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON 49, 14346, 10, 10, 21, 20, SS_REALSIZECONTROL - LTEXT "Are you sure you want to disconnect?", -1, 49, 12, 137, 23 - DEFPUSHBUTTON "&Disconnect", IDOK, 57, 40, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 123, 40, 60, 14 + LTEXT "Tem a certeza que quer encerrar?", -1, 49, 12, 137, 23 + DEFPUSHBUTTON "&Encerrar", IDOK, 57, 40, 60, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 123, 40, 60, 14 END AUTOPLAY1_DLG DIALOGEX 0, 0, 227, 218 @@ -478,42 +479,42 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLIN CAPTION "AutoPlay" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Select a content type, then choose an action for ReactOS to perform automatically when that type is used in this device:", 1000, 7, 7, 215, 20 + LTEXT "&Seleccione o tipo de conteúdo, depois escolha uma acção para o RactOS executar automáticamente quando este tipo for usado neste dispositivo:", 1000, 7, 7, 215, 20 CONTROL "", 1001, "COMBOBOXEX32", WS_TABSTOP | 0x00000043, 7, 27, 212, 200 - GROUPBOX "Actions", -1, 7, 45, 212, 146 - AUTORADIOBUTTON "Select an action to &perform:", 1005, 14, 54, 202, 10, WS_GROUP + GROUPBOX "Acções", -1, 7, 45, 212, 146 + AUTORADIOBUTTON "Seleccione uma acção para &executar:", 1005, 14, 54, 202, 10, WS_GROUP CONTROL "LIST2", 1002, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 22, 66, 192, 107 - AUTORADIOBUTTON "Prompt me each time to &choose an action", 1006, 14, 177, 202, 10 - PUSHBUTTON "&Restore Defaults", 1008, 108, 197, 110, 14, WS_DISABLED + AUTORADIOBUTTON "pergunte-me sempre para escolher uma &acção", 1006, 14, 177, 202, 10 + PUSHBUTTON "&Restaurar valores por defeito", 1008, 108, 197, 110, 14, WS_DISABLED END MIXED_CONTENT1_DLG DIALOGEX 0, 0, 227, 207 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION -CAPTION "Mixed Content" +CAPTION "Conteúdos mistos" FONT 8, "MS Shell Dlg" BEGIN ICON "", 1000, 5, 7, 21, 20 - LTEXT "This disk or device contains more than one type of content.", 1001, 32, 7, 191, 20 - LTEXT "What do you want ReactOS to do?", 1002, 32, 31, 188, 8 + LTEXT "Este disco ou dispositivo contém mais de um tipo de conteúdo.", 1001, 32, 7, 191, 20 + LTEXT "O que pretende que o ReactOS faça?", 1002, 32, 31, 188, 8 CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 43, 188, 139 DEFPUSHBUTTON "OK", IDOK, 96, 186, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 160, 186, 60, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 160, 186, 60, 14 END MIXED_CONTENT2_DLG DIALOGEX 0, 0, 227, 206 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION -CAPTION "Mixed Content" +CAPTION "Conteúdo misto" FONT 8, "MS Shell Dlg" BEGIN ICON "", 1000, 5, 7, 21, 20 - LTEXT "ReactOS can perform the same action each time you insert a disk or connect a device with this kind of file:", 1001, 30, 7, 193, 20 + LTEXT "ReactOS pode executar a mesma acção de cada vez que inserir um disco ou um dispositivo com este tipo de ficheiro:", 1001, 30, 7, 193, 20 ICON "", 1005, 32, 27, 11, 10, SS_REALSIZECONTROL EDITTEXT 1006, 49, 28, 177, 14, ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "What do you want ReactOS to do?", 1002, 32, 41, 190, 8 + LTEXT "O que pretende que o ReactOS faça?", 1002, 32, 41, 190, 8 CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 55, 188, 112 - AUTOCHECKBOX "Always do the selected action.", 1004, 32, 171, 190, 10 + AUTOCHECKBOX "Executar sempre a acção seleccionada.", 1004, 32, 171, 190, 10 DEFPUSHBUTTON "OK", IDOK, 96, 185, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 160, 185, 60, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 160, 185, 60, 14 END AUTOPLAY2_DLG DIALOGEX 0, 0, 227, 181 @@ -522,75 +523,75 @@ CAPTION "Autoplay" FONT 8, "MS Shell Dlg" BEGIN ICON "", 1000, 5, 7, 21, 20 - LTEXT "ReactOS can perform the same action each time you connect this device.", 1001, 32, 7, 190, 22 - LTEXT "&What do you want ReactOS to do?", 1002, 32, 31, 190, 8 + LTEXT "ReactOS pode executar sempre mesma acção de cada vez que inserir um disco ou um dispositivo.", 1001, 32, 7, 190, 22 + LTEXT "&O que pretende que o ReactOS faça?", 1002, 32, 31, 190, 8 CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 43, 187, 96 - AUTOCHECKBOX "&Always perform the selected action", 1004, 32, 143, 190, 8 + AUTOCHECKBOX "&Executar sempre a acção seleccionada", 1004, 32, 143, 190, 8 DEFPUSHBUTTON "OK", IDOK, 94, 160, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 159, 160, 60, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 159, 160, 60, 14 END SHUTDOWN_DLG DIALOGEX 0, 0, 211, 103 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Shut Down ReactOS" +CAPTION "Encerrar ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON 8240, -1, 6, 6, 21, 20, SS_REALSIZECONTROL | WS_GROUP - LTEXT "What do you want the computer to do?", -1, 39, 7, 167, 10 + LTEXT "O que pretende aue o computador faça?", -1, 39, 7, 167, 10 COMBOBOX 8224, 39, 20, 165, 200, CBS_DROPDOWNLIST | WS_VSCROLL - LTEXT "Maintains your session, keeping the computer running on low power with data still in memory. The computer wakes up when you press a key or move the mouse.", 8225, 39, 40, 167, 37 + LTEXT "Manter a sessão, deixando o computador a correr em baixa energia. O computador arranca quando tocar numa tecla ou mover o rato.", 8225, 39, 40, 167, 37 DEFPUSHBUTTON "OK", 1, 7, 82, 60, 14, WS_GROUP - PUSHBUTTON "Cancel", IDCANCEL, 75, 82, 60, 14 - PUSHBUTTON "&Help", IDHELP, 144, 82, 60, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 75, 82, 60, 14 + PUSHBUTTON "&Ajuda", IDHELP, 144, 82, 60, 14 END FORMAT_DLG DIALOGEX 50, 50, 184, 218 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Format" +CAPTION "Formatar" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Start", IDOK, 53, 198, 60, 14 - PUSHBUTTON "&Close", IDCANCEL, 118, 198, 60, 14 - LTEXT "Ca&pacity:", -1, 7, 6, 169, 9 + DEFPUSHBUTTON "&Iniciar", IDOK, 53, 198, 60, 14 + PUSHBUTTON "&Fechar", IDCANCEL, 118, 198, 60, 14 + LTEXT "Ca&pacidade:", -1, 7, 6, 169, 9 COMBOBOX 28673, 7, 17, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP - LTEXT "&File system", -1, 7, 35, 170, 9 + LTEXT "&Sistema de Ficheiros", -1, 7, 35, 170, 9 COMBOBOX 28677, 7, 46, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP CONTROL "", 28678, "MSCTLS_PROGRESS32", 0, 7, 181, 170, 8 - LTEXT "&Allocation unit size", -1, 7, 64, 170, 9 + LTEXT "&Tamanho da unidade de alocação", -1, 7, 64, 170, 9 COMBOBOX 28680, 7, 75, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP - LTEXT "Volume &label", -1, 7, 93, 170, 9 + LTEXT "&Nome do Volume ", -1, 7, 93, 170, 9 EDITTEXT 28679, 7, 103, 170, 13, ES_AUTOHSCROLL - GROUPBOX "Format &options", 4610, 7, 121, 170, 49 - AUTOCHECKBOX "&Quick Format", 28674, 16, 135, 155, 10 - AUTOCHECKBOX "&Enable Compression", 28675, 16, 152, 155, 10 + GROUPBOX "&Opções", 4610, 7, 121, 170, 49 + AUTOCHECKBOX "Formatação &Rápida", 28674, 16, 135, 155, 10 + AUTOCHECKBOX "&Permitir Compressão", 28675, 16, 152, 155, 10 END CHKDSK_DLG DIALOGEX 50, 50, 194, 120 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Check Disk" +CAPTION "Verificar Disco" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "Start", IDOK, 53, 100, 60, 14 - GROUPBOX "Check disk options", -1, 7, 6, 179, 50 - PUSHBUTTON "Cancel", IDCANCEL, 118, 100, 60, 14 - AUTOCHECKBOX "Automatically fix file system errors", 14000, 16, 15, 155, 10 - AUTOCHECKBOX "&Scan for and attempt recovery of bad sectors", 14001, 16, 30, 165, 10 + DEFPUSHBUTTON "Iniciar", IDOK, 53, 100, 60, 14 + GROUPBOX "Opções verificação do disco", -1, 7, 6, 179, 50 + PUSHBUTTON "Cancelar", IDCANCEL, 118, 100, 60, 14 + AUTOCHECKBOX "Reparar automáticamente erros nos ficheiros do sistema", 14000, 16, 15, 155, 10 + AUTOCHECKBOX "&Procurar e tentar reparar sectores danificados", 14001, 16, 30, 165, 10 CONTROL "", 14002, "MSCTLS_PROGRESS32", 16, 7, 60, 170, 8 LTEXT "", 14003, 60, 80, 170, 10 END IDD_PICK_ICON_DIALOG DIALOGEX 0, 0, 237, 204 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Change Icon" +CAPTION "Trocar Icone" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - LTEXT "Filename:", -1, 7, 14, 208, 10 - PUSHBUTTON "Browse...",IDC_BUTTON_PATH, 148, 24,67,14 + LTEXT "Nome do ficheiro:", -1, 7, 14, 208, 10 + PUSHBUTTON "procurar...",IDC_BUTTON_PATH, 148, 24,67,14 EDITTEXT IDC_EDIT_PATH, 6, 24, 135, 15, ES_AUTOHSCROLL LTEXT "Icons:", -1, 7, 47, 208, 10 LISTBOX IDC_PICKICON_LIST,7,57,208,119,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,WS_EX_STATICEDGE DEFPUSHBUTTON "OK",IDOK, 107, 181,50, 14 - PUSHBUTTON "Cancel",IDCANCEL, 167, 181, 50, 14 + PUSHBUTTON "Cancelar",IDCANCEL, 167, 181, 50, 14 END STRINGTABLE DISCARDABLE @@ -600,32 +601,32 @@ BEGIN IDS_SHV_COLUMN2 "Tamanho" IDS_SHV_COLUMN3 "Tipo" IDS_SHV_COLUMN4 "Modificado" - IDS_SHV_COLUMN5 "Atributos" + IDS_SHV_COLUMN5 "propriedades" IDS_SHV_COLUMN6 "Tamanho" IDS_SHV_COLUMN7 "Disponível" IDS_SHV_COLUMN8 "Nome" IDS_SHV_COLUMN9 "Comentários" IDS_SHV_COLUMN10 "Dono" IDS_SHV_COLUMN11 "Grupo" - IDS_SHV_COLUMN12 "Filename" - IDS_SHV_COLUMN13 "Category" - IDS_SHV_COLUMN_DELFROM "Original location" - IDS_SHV_COLUMN_DELDATE "Date deleted" - IDS_SHV_COLUMN_FONTTYPE "Fonttype" - IDS_SHV_COLUMN_WORKGROUP "Workgroup" - IDS_SHV_NETWORKLOCATION "Network Location" - IDS_SHV_COLUMN_DOCUMENTS "Documents" - IDS_SHV_COLUMN_STATUS "Status" - IDS_SHV_COLUMN_COMMENTS "Comments" - IDS_SHV_COLUMN_LOCATION "Location" - IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN12 "Nome do ficheiro" + IDS_SHV_COLUMN13 "Categoria" + IDS_SHV_COLUMN_DELFROM "Localização original" + IDS_SHV_COLUMN_DELDATE "Data da eliminação" + IDS_SHV_COLUMN_FONTTYPE "Tipo de letra" + IDS_SHV_COLUMN_WORKGROUP "Grupo de trabalho" + IDS_SHV_NETWORKLOCATION "localizações na rede" + IDS_SHV_COLUMN_DOCUMENTS "Documentos" + IDS_SHV_COLUMN_STATUS "Estado" + IDS_SHV_COLUMN_COMMENTS "Commentários" + IDS_SHV_COLUMN_LOCATION "Localização" + IDS_SHV_COLUMN_MODEL "Modelo" /* special folders */ IDS_DESKTOP "Ambiente de trabalho" IDS_MYCOMPUTER "O Meu Computador" - IDS_RECYCLEBIN_FOLDER_NAME "Trash" - IDS_CONTROLPANEL "Control Panel" - IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_RECYCLEBIN_FOLDER_NAME "Reciclagem" + IDS_CONTROLPANEL "Painel de Controlo" + IDS_ADMINISTRATIVETOOLS "Ferramentas Administrativas" /* context menus */ IDS_VIEW_LARGE "Ícones &grandes" @@ -634,15 +635,15 @@ BEGIN IDS_VIEW_DETAILS "&Detalhes" IDS_SELECT "Seleccionar" IDS_OPEN "Abrir" - IDS_CREATELINK "Create &Link" - IDS_COPY "Copy" - IDS_DELETE "Delete" - IDS_PROPERTIES "Properties" - IDS_CUT "Cut" - IDS_RESTORE "Restore" - IDS_FORMATDRIVE "Format..." - IDS_RENAME "Rename" - IDS_INSERT "Insert" + IDS_CREATELINK "Criar &Atalho" + IDS_COPY "Copiar" + IDS_DELETE "Apagar" + IDS_PROPERTIES "Propriedades" + IDS_CUT "Cortar" + IDS_RESTORE "Restaurar" + IDS_FORMATDRIVE "Formatar..." + IDS_RENAME "Renaomear" + IDS_INSERT "Inserir" IDS_CREATEFOLDER_DENIED "Não é possível criar nova pasta: Permissão negada." IDS_CREATEFOLDER_CAPTION "Erro durante a criação da nova pasta" @@ -650,25 +651,25 @@ BEGIN IDS_DELETEFOLDER_CAPTION "Confirmar exclusão da pasta" IDS_DELETEITEM_TEXT "Tem certeza que deseja excluir '%1'?" IDS_DELETEMULTIPLE_TEXT "Tem certeza que deseja excluir estes %1 itens?" - IDS_DELETESELECTED_TEXT "Are you sure you want to delete the selected item(s)?" - IDS_TRASHITEM_TEXT "Are you sure that you want to send '%1' to the Trash?" - IDS_TRASHFOLDER_TEXT "Are you sure that you want to send '%1' and all its content to the Trash?" - IDS_TRASHMULTIPLE_TEXT "Are you sure that you want to send these %1 items to the Trash?" - IDS_CANTTRASH_TEXT "The item '%1' can't be sent to Trash. Do you want to delete it instead?" - IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" + IDS_DELETESELECTED_TEXT "Tem a certeza que quer eliminar os item(s) seleccionado(s)?" + IDS_TRASHITEM_TEXT "Tem a certeza que quer enviar '%1' para a reciclagem?" + IDS_TRASHFOLDER_TEXT "Tem a certeza que quer enviar '%1' e todo o seu conteúdo para a reciclagem?" + IDS_TRASHMULTIPLE_TEXT "Tem a certeza que quer enviar este '%1' item para a reciclagem?" + IDS_CANTTRASH_TEXT "O item '%1' não pode ser enviado para a reciclagem. Em vez disso pretende eliminá-lo?" + IDS_OVERWRITEFILE_TEXT "Esta pasta já contém um ficheiro com o nome '%1'.\n\npretende substituí-lo?" IDS_OVERWRITEFILE_CAPTION "Confirmar substituição de ficheiro" - IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ - "If the files in the destination folder have the same names as files in the\n"\ - "selected folder they will be replaced. Do you still want to move or copy\n"\ - "the folder?" + IDS_OVERWRITEFOLDER_TEXT "Esta pasta já contém uma pasta com o nome '%1'.\n\n"\ + "Se os ficheiros na pasta de destino tiverem o mesmo nome dos ficheiros na\n"\ + "pasta seleccionada, serão substituídos. Ainda assim pretende mover ou copiar\n"\ + "a pasta?" /* message box strings */ IDS_RESTART_TITLE "Reiniciar" IDS_RESTART_PROMPT "Deseja simular a reinicialização do Windows?" IDS_SHUTDOWN_TITLE "Desligar" - IDS_SHUTDOWN_PROMPT "Deseja finalizar esta sessão do Wine?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" + IDS_SHUTDOWN_PROMPT "Deseja finalizar esta sessão do ReactOS?" + IDS_LOGOFF_TITLE "Terminar a sessão" + IDS_LOGOFF_PROMPT "Pretende terminar a sessão?" /* shell folder path default values */ IDS_PROGRAMS "Menu Iniciar\\Programas" @@ -681,12 +682,12 @@ BEGIN IDS_MYMUSIC "As Minhas Músicas" IDS_MYVIDEO "Os Meus Vídeos" IDS_DESKTOPDIRECTORY "Ambiente de Trabalho" - IDS_NETHOOD "NetHood" + IDS_NETHOOD "Visinhança na rede" IDS_TEMPLATES "Modelos" - IDS_APPDATA "Application Data" + IDS_APPDATA "Dados de Aplicação" IDS_PRINTHOOD "PrintHood" - IDS_LOCAL_APPDATA "Definições locais\\Application Data" - IDS_INTERNET_CACHE "Definições locais\\Temporary Internet Files" + IDS_LOCAL_APPDATA "Definições locais\\Dados de Aplicação" + IDS_INTERNET_CACHE "Definições locais\\Ficheiros Temporários da Internet" IDS_COOKIES "Cookies" IDS_HISTORY "Definições locais\\Histórico" IDS_PROGRAM_FILES "Programas" @@ -697,60 +698,60 @@ BEGIN IDS_COMMON_MUSIC "Os Meus Documentos\\As Minhas Músicas" IDS_COMMON_PICTURES "Os Meus Documentos\\As Minhas Imagens" IDS_COMMON_VIDEO "Os Meus Documentos\\Os Meus Vídeos" - IDS_CDBURN_AREA "Definições locais\\Application Data\\Microsoft\\CD Burning" - IDS_NETWORKPLACE "My Network Places" + IDS_CDBURN_AREA "Definições locais\\Dados de Aplicação\\Microsoft\\CD Burning" + IDS_NETWORKPLACE "Os Meus Locais da Rede" - IDS_NEWFOLDER "New Folder" + IDS_NEWFOLDER "Nova Pasta" - IDS_DRIVE_FIXED "Local Disk" + IDS_DRIVE_FIXED "Disco Local" IDS_DRIVE_CDROM "CDROM" - IDS_DRIVE_NETWORK "Network Disk" + IDS_DRIVE_NETWORK "Disco de Rede" - IDS_OPEN_WITH "Open With" - IDS_OPEN_WITH_CHOOSE "Choose Program..." + IDS_OPEN_WITH "Abre com..." + IDS_OPEN_WITH_CHOOSE "Escolha Programa..." - IDS_SHELL_ABOUT_AUTHORS "&Authors" - IDS_SHELL_ABOUT_BACK "< &Back" + IDS_SHELL_ABOUT_AUTHORS "&Autores" + IDS_SHELL_ABOUT_BACK "< &Trás" FCIDM_SHVIEW_NEW "Novo" FCIDM_SHVIEW_NEWFOLDER "&Pasta" FCIDM_SHVIEW_NEWLINK "&Atalho" - IDS_FOLDER_OPTIONS "Folder Options" - IDS_RECYCLEBIN_LOCATION "Recycle Bin Location" - IDS_RECYCLEBIN_DISKSPACE "Space Available" - IDS_EMPTY_BITBUCKET "Empty Recycle Bin" - IDS_PICK_ICON_TITLE "Choose Icon" - IDS_PICK_ICON_FILTER "Icon Files(*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0" - IDS_OPEN_WITH_FILTER "Executable Files\0*.exe\0" - IDS_DIRECTORY "Folder" - IDS_VIRTUAL_DRIVER "Virtual Device Driver" + IDS_FOLDER_OPTIONS "Opções das Pastas" + IDS_RECYCLEBIN_LOCATION "Localização da Reciclagem" + IDS_RECYCLEBIN_DISKSPACE "Espaço Disponível" + IDS_EMPTY_BITBUCKET "Esvaziar Reciclagem" + IDS_PICK_ICON_TITLE "Escolha Ícone" + IDS_PICK_ICON_FILTER "Ficheiros de Ícones(*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0" + IDS_OPEN_WITH_FILTER "Ficheiros Executáveis\0*.exe\0" + IDS_DIRECTORY "Pasta" + IDS_VIRTUAL_DRIVER "Driver de Dispositivo Virtual" IDS_BAT_FILE "ReactOS Batch File" IDS_CMD_FILE "ReactOS Command Script" - IDS_COM_FILE "Dos Application" - IDS_CPL_FILE "Control Panel Item" + IDS_COM_FILE "Aplicação Dos" + IDS_CPL_FILE "Item do Painel de Controle" IDS_CUR_FILE "Cursor" - IDS_DLL_FILE "Application Extension" - IDS_DRV_FILE "Device Driver" - IDS_EXE_FILE "Application" - IDS_FON_FILE "Font file" - IDS_TTF_FILE "TrueType Font file" - IDS_HLP_FILE "Help File" - IDS_INI_FILE "Configuration Settings" - IDS_LNK_FILE "Shortcut" - IDS_SYS_FILE "System file" + IDS_DLL_FILE "Extensão da Aplicação" + IDS_DRV_FILE "Driver do Dispositivo" + IDS_EXE_FILE "Aplicação" + IDS_FON_FILE "Ficheiro de tipo de letra" + IDS_TTF_FILE "Tipo de letra TrueType" + IDS_HLP_FILE "Ficheiro de Ajuda" + IDS_INI_FILE "Definições" + IDS_LNK_FILE "Atalho" + IDS_SYS_FILE "Ficheiro de Sistema" - IDS_OPEN_VERB "Open" - IDS_RUNAS_VERB "Run as " - IDS_EDIT_VERB "Edit" - IDS_FIND_VERB "Find" - IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" + IDS_OPEN_VERB "Abrir" + IDS_RUNAS_VERB "Executar como " + IDS_EDIT_VERB "Editar" + IDS_FIND_VERB "Procurar" + IDS_PRINT_VERB "Imprimir" + IDS_PLAY_VERB "Reproduzir" + IDS_PREVIEW_VERB "Previzualizar" - IDS_FILE_FOLDER "%u Files, %u Folders" - IDS_PRINTERS "Printers" - IDS_FONTS "Fonts" - IDS_INSTALLNEWFONT "Install New Font..." + IDS_FILE_FOLDER "%u Ficheiros, %u Pastas" + IDS_PRINTERS "Impressoras" + IDS_FONTS "Tipos de Letras" + IDS_INSTALLNEWFONT "Instalar novo tipo de letra..." - IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" - IDS_COPY_OF "Copy of" + IDS_DEFAULT_CLUSTER_SIZE "Tamanho da unidade de atribuição" + IDS_COPY_OF "Cópia de" END From b800febcd75e3d0485c18ea634ea33a77bc8fd72 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Wed, 7 Apr 2010 17:42:43 +0000 Subject: [PATCH 066/261] [SHELL] Increase field width in German resources so the drive text can fit svn path=/trunk/; revision=46765 --- reactos/dll/win32/shell32/lang/de-DE.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index 09f6559a447..94523084c8a 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -296,7 +296,7 @@ BEGIN CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - LTEXT "Laufwerk %s", 14009, 100, 170, 40, 10 + LTEXT "Laufwerk %s", 14009, 100, 170, 50, 10 PUSHBUTTON "Bereinigen", 14010, 180, 175, 50, 15, WS_TABSTOP CHECKBOX "Laufwerk komprimieren, um Speicherplatz zu sparen", 14011, 15, 205, 180, 10, WS_DISABLED CHECKBOX "Laufwerk für schnelle Dateisuche indizieren", 14012, 15, 220, 165, 10, WS_DISABLED From 2d3b57377f8dc422b89c905caa38e46ef88690fd Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Wed, 7 Apr 2010 19:11:56 +0000 Subject: [PATCH 067/261] [SHELL32] - Change "open with" dialog type to allow aborting, add code to handle WM_DESTROY messages - Change full blue selection color to standard background blue, set selection background non white correctly - Adjust German resource fields to make texts fit See issue #4226 for more details. svn path=/trunk/; revision=46766 --- reactos/dll/win32/shell32/lang/bg-BG.rc | 2 +- reactos/dll/win32/shell32/lang/ca-ES.rc | 2 +- reactos/dll/win32/shell32/lang/cs-CZ.rc | 2 +- reactos/dll/win32/shell32/lang/da-DK.rc | 2 +- reactos/dll/win32/shell32/lang/de-DE.rc | 8 ++++---- reactos/dll/win32/shell32/lang/el-GR.rc | 2 +- reactos/dll/win32/shell32/lang/en-GB.rc | 2 +- reactos/dll/win32/shell32/lang/en-US.rc | 2 +- reactos/dll/win32/shell32/lang/es-ES.rc | 2 +- reactos/dll/win32/shell32/lang/fi-FI.rc | 2 +- reactos/dll/win32/shell32/lang/fr-FR.rc | 2 +- reactos/dll/win32/shell32/lang/hu-HU.rc | 2 +- reactos/dll/win32/shell32/lang/it-IT.rc | 2 +- reactos/dll/win32/shell32/lang/ja-JP.rc | 2 +- reactos/dll/win32/shell32/lang/ko-KR.rc | 2 +- reactos/dll/win32/shell32/lang/nl-NL.rc | 2 +- reactos/dll/win32/shell32/lang/no-NO.rc | 2 +- reactos/dll/win32/shell32/lang/pl-PL.rc | 2 +- reactos/dll/win32/shell32/lang/pt-BR.rc | 2 +- reactos/dll/win32/shell32/lang/pt-PT.rc | 2 +- reactos/dll/win32/shell32/lang/ro-RO.rc | 2 +- reactos/dll/win32/shell32/lang/ru-RU.rc | 2 +- reactos/dll/win32/shell32/lang/sk-SK.rc | 2 +- reactos/dll/win32/shell32/lang/sl-SI.rc | 2 +- reactos/dll/win32/shell32/lang/sv-SE.rc | 2 +- reactos/dll/win32/shell32/lang/tr-TR.rc | 2 +- reactos/dll/win32/shell32/lang/uk-UA.rc | 2 +- reactos/dll/win32/shell32/lang/zh-CN.rc | 2 +- reactos/dll/win32/shell32/lang/zh-TW.rc | 2 +- reactos/dll/win32/shell32/she_ocmenu.c | 10 +++++++--- 30 files changed, 39 insertions(+), 35 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index 5cda676dd5e..63fe6968565 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -357,7 +357,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Îòâàðÿíå ñ" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index a26fab0e23f..567cbc1533b 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index f2652e6a2d4..8b8383f23b4 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -360,7 +360,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Otevøít v..." FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index b9cf5217235..baa177f4631 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -347,7 +347,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index 94523084c8a..a07af8785d3 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -361,17 +361,17 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Öffnen mit" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON IDI_SHELL_OPEN_WITH, -1, 8, 12, 21, 20 - LTEXT "Wählen Sie das Programm, das zum Öffnen dieser Datei verwendet werden soll:", -1, 44, 12, 211, 10 - LTEXT "Datei: ", 14001, 44, 25, 188, 10 + LTEXT "Wählen Sie das Programm, das zum Öffnen dieser Datei verwendet werden soll:", -1, 44, 12, 211, 18 + LTEXT "Datei: ", 14001, 44, 30, 188, 10 GROUPBOX "&Programme", -1, 7, 42, 249, 187 LISTBOX 14002, 16 ,57, 230, 130, LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP, WS_EX_STATICEDGE AUTOCHECKBOX "&Dateityp &immer mit dem ausgewählten Programm öffnen", 14003, 20, 193, 225, 10 - PUSHBUTTON "&Durchsuchen..", 14004, 198, 207, 50, 14 + PUSHBUTTON "&Durchsuchen...", 14004, 188, 207, 60, 14 PUSHBUTTON "OK", 14005, 150, 236, 50, 14 PUSHBUTTON "Abbrechen", 14006, 206, 236, 50, 14 END diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index 0821f013408..4a18d144671 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "¢íïéãìá ìå" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index 3dfbfd940df..e25cedd5e08 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 200c97ae1fb..b24ed529a28 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index 8704146f23c..8bbf95ef8c8 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -361,7 +361,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 284, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Abrir con" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index 778576a08fb..d34a695da49 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 3f712a60bbd..ae5b34b4973 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -362,7 +362,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Ouvrir avec" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index 22a26038c7c..79964671b28 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -361,7 +361,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 9ad6e53377e..ba31b5a98ac 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -359,7 +359,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Apri con" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index 12f24d34adb..3b083005517 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "ŠJ‚­ƒvƒƒOƒ‰ƒ€" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index 9d7ad808fa6..96f8656e3eb 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index b0e1c919a5f..95c4465e1f5 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index 43c637f1dcb..e659e3f8175 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -359,7 +359,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Åpne med" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index fef5815d4aa..7ef8add35dc 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -365,7 +365,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Otwórz za pomoc¹" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index 5bcee218b35..a2d235b4883 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -360,7 +360,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index 0660e3b481d..34f98f578cb 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -361,7 +361,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Abre com..." FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc index efbff8594d2..a479927320e 100644 --- a/reactos/dll/win32/shell32/lang/ro-RO.rc +++ b/reactos/dll/win32/shell32/lang/ro-RO.rc @@ -361,7 +361,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index 6c3f488f3eb..d1c3b42f31b 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Âûáîð ïðîãðàììû" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index e45b141e87f..24867f74690 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -364,7 +364,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Otvori v programe" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 5038af1c123..3d33693efcd 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index 08a6f59e70f..1bc2f6fa121 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index 3ab92cbb104..0ec3378ff17 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index cf2847ed9ab..620bd261f0b 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -359,7 +359,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Âèá³ð ïðîãðàìè" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index 18c4d5439d4..152903feb42 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -347,7 +347,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index f7c59a2e1ff..feb21894ceb 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -359,7 +359,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN diff --git a/reactos/dll/win32/shell32/she_ocmenu.c b/reactos/dll/win32/shell32/she_ocmenu.c index dc66376cdea..216c6265fbf 100644 --- a/reactos/dll/win32/shell32/she_ocmenu.c +++ b/reactos/dll/win32/shell32/she_ocmenu.c @@ -719,12 +719,12 @@ static INT_PTR CALLBACK OpenWithProgrammDlg(HWND hwndDlg, UINT uMsg, WPARAM wPar if (lpdis->itemID == index) { - /* paint focused item with blue background */ + /* paint focused item with standard background colour */ HBRUSH hBrush; - hBrush = CreateSolidBrush(RGB(0, 0, 255)); + hBrush = CreateSolidBrush(RGB(46, 104, 160)); FillRect(lpdis->hDC, &lpdis->rcItem, hBrush); DeleteObject(hBrush); - preBkColor = SetBkColor(lpdis->hDC, RGB(255, 255, 255)); + preBkColor = SetBkColor(lpdis->hDC, RGB(46, 104, 160)); } else { @@ -756,6 +756,10 @@ static INT_PTR CALLBACK OpenWithProgrammDlg(HWND hwndDlg, UINT uMsg, WPARAM wPar break; } break; + case WM_DESTROY: + FreeListItems(hwndDlg); + EndDialog(hwndDlg, 0); + return TRUE; default: break; } From da1fa61cf0a6d6a7406b2ba4c6883e71bbe241d6 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 7 Apr 2010 20:18:44 +0000 Subject: [PATCH 068/261] [PCI] - Fix a crash that occurs when a device is started which requires no resources svn path=/trunk/; revision=46767 --- reactos/drivers/bus/pci/pdo.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index 6fde92e8311..266b95d6a97 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -1199,6 +1199,9 @@ PdoStartDevice( PPDO_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; UCHAR Irq; + if (!RawResList) + return STATUS_SUCCESS; + /* TODO: Assign the other resources we get to the card */ for (i = 0; i < RawResList->Count; i++) From d9face83c693cb5e3fad155df8609d9c13316061 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 7 Apr 2010 20:19:29 +0000 Subject: [PATCH 069/261] [ISAPNP] - Rewrite the ISAPnP driver based off EtherBoot source - TODO: Resource stuff svn path=/trunk/; revision=46768 --- reactos/drivers/bus/isapnp/fdo.c | 141 ++ reactos/drivers/bus/isapnp/hardware.c | 579 +++++++ reactos/drivers/bus/isapnp/isapnp.c | 1810 ++-------------------- reactos/drivers/bus/isapnp/isapnp.h | 383 +---- reactos/drivers/bus/isapnp/isapnp.rbuild | 4 + reactos/drivers/bus/isapnp/isapnphw.h | 106 ++ reactos/drivers/bus/isapnp/pdo.c | 83 + 7 files changed, 1115 insertions(+), 1991 deletions(-) create mode 100644 reactos/drivers/bus/isapnp/fdo.c create mode 100644 reactos/drivers/bus/isapnp/hardware.c create mode 100644 reactos/drivers/bus/isapnp/isapnphw.h create mode 100644 reactos/drivers/bus/isapnp/pdo.c diff --git a/reactos/drivers/bus/isapnp/fdo.c b/reactos/drivers/bus/isapnp/fdo.c new file mode 100644 index 00000000000..51a0f4bccaf --- /dev/null +++ b/reactos/drivers/bus/isapnp/fdo.c @@ -0,0 +1,141 @@ +/* + * PROJECT: ReactOS ISA PnP Bus driver + * FILE: fdo.c + * PURPOSE: FDO-specific code + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ +#include + +#define NDEBUG +#include + +NTSTATUS +NTAPI +IsaFdoStartDevice( + IN PISAPNP_FDO_EXTENSION FdoExt, + IN PIRP Irp, + IN PIO_STACK_LOCATION IrpSp) +{ + NTSTATUS Status; + KIRQL OldIrql; + + KeAcquireSpinLock(&FdoExt->Lock, &OldIrql); + + Status = IsaHwDetectReadDataPort(FdoExt); + if (!NT_SUCCESS(Status)) + { + KeReleaseSpinLock(&FdoExt->Lock, OldIrql); + return Status; + } + + FdoExt->Common.State = dsStarted; + + KeReleaseSpinLock(&FdoExt->Lock, OldIrql); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +IsaFdoQueryDeviceRelations( + IN PISAPNP_FDO_EXTENSION FdoExt, + IN PIRP Irp, + IN PIO_STACK_LOCATION IrpSp) +{ + NTSTATUS Status; + PLIST_ENTRY CurrentEntry; + PISAPNP_LOGICAL_DEVICE IsaDevice; + PDEVICE_RELATIONS DeviceRelations; + KIRQL OldIrql; + ULONG i = 0; + + if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations) + return Irp->IoStatus.Status; + + KeAcquireSpinLock(&FdoExt->Lock, &OldIrql); + + Status = IsaHwFillDeviceList(FdoExt); + if (!NT_SUCCESS(Status)) + { + KeReleaseSpinLock(&FdoExt->Lock, OldIrql); + return Status; + } + + DeviceRelations = ExAllocatePool(NonPagedPool, + sizeof(DEVICE_RELATIONS) + sizeof(DEVICE_OBJECT) * (FdoExt->DeviceCount - 1)); + if (!DeviceRelations) + { + KeReleaseSpinLock(&FdoExt->Lock, OldIrql); + return STATUS_INSUFFICIENT_RESOURCES; + } + + CurrentEntry = FdoExt->DeviceListHead.Flink; + while (CurrentEntry != &FdoExt->DeviceListHead) + { + IsaDevice = CONTAINING_RECORD(CurrentEntry, ISAPNP_LOGICAL_DEVICE, ListEntry); + + DeviceRelations->Objects[i++] = IsaDevice->Common.Self; + + ObReferenceObject(IsaDevice->Common.Self); + + CurrentEntry = CurrentEntry->Flink; + } + + DeviceRelations->Count = FdoExt->DeviceCount; + + KeReleaseSpinLock(&FdoExt->Lock, OldIrql); + + Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations; + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +IsaFdoPnp( + IN PISAPNP_FDO_EXTENSION FdoExt, + IN PIRP Irp, + IN PIO_STACK_LOCATION IrpSp) +{ + NTSTATUS Status = Irp->IoStatus.Status; + + switch (IrpSp->MinorFunction) + { + case IRP_MN_START_DEVICE: + Status = IsaForwardIrpSynchronous(FdoExt, Irp); + + if (NT_SUCCESS(Status)) + Status = IsaFdoStartDevice(FdoExt, Irp, IrpSp); + + Irp->IoStatus.Status = Status; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + + case IRP_MN_STOP_DEVICE: + FdoExt->Common.State = dsStopped; + + Status = STATUS_SUCCESS; + break; + + case IRP_MN_QUERY_DEVICE_RELATIONS: + Status = IsaFdoQueryDeviceRelations(FdoExt, Irp, IrpSp); + + Irp->IoStatus.Status = Status; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + + case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: + DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); + break; + + default: + DPRINT1("Unknown PnP code: %x\n", IrpSp->MinorFunction); + break; + } + + IoSkipCurrentIrpStackLocation(Irp); + + return IoCallDriver(FdoExt->Ldo, Irp); +} diff --git a/reactos/drivers/bus/isapnp/hardware.c b/reactos/drivers/bus/isapnp/hardware.c new file mode 100644 index 00000000000..67a903948f8 --- /dev/null +++ b/reactos/drivers/bus/isapnp/hardware.c @@ -0,0 +1,579 @@ +/* + * PROJECT: ReactOS ISA PnP Bus driver + * FILE: hardware.c + * PURPOSE: Hardware support code + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ +#include +#include + +#define NDEBUG +#include + +static +inline +VOID +WriteAddress(USHORT Address) +{ + WRITE_PORT_UCHAR((PUCHAR)ISAPNP_ADDRESS, Address); +} + +static +inline +VOID +WriteData(USHORT Data) +{ + WRITE_PORT_UCHAR((PUCHAR)ISAPNP_WRITE_DATA, Data); +} + +static +inline +UCHAR +ReadData(PUCHAR ReadDataPort) +{ + return READ_PORT_UCHAR(ReadDataPort); +} + +static +inline +VOID +WriteByte(USHORT Address, USHORT Value) +{ + WriteAddress(Address); + WriteData(Value); +} + +static +inline +UCHAR +ReadByte(PUCHAR ReadDataPort, USHORT Address) +{ + WriteAddress(Address); + return ReadData(ReadDataPort); +} + +static +inline +USHORT +ReadWord(PUCHAR ReadDataPort, USHORT Address) +{ + return ((ReadByte(ReadDataPort, Address) << 8) | + (ReadByte(ReadDataPort, Address + 1))); +} + +static +inline +VOID +SetReadDataPort(PUCHAR ReadDataPort) +{ + WriteByte(ISAPNP_READPORT, ((ULONG_PTR)ReadDataPort >> 2)); +} + +static +inline +VOID +EnterIsolationState(VOID) +{ + WriteAddress(ISAPNP_SERIALISOLATION); +} + +static +inline +VOID +WaitForKey(VOID) +{ + WriteByte(ISAPNP_CONFIGCONTROL, ISAPNP_CONFIG_WAIT_FOR_KEY); +} + +static +inline +VOID +ResetCsn(VOID) +{ + WriteByte(ISAPNP_CONFIGCONTROL, ISAPNP_CONFIG_RESET_CSN); +} + +static +inline +VOID +Wake(USHORT Csn) +{ + WriteByte(ISAPNP_WAKE, Csn); +} + +static +inline +USHORT +ReadResourceData(PUCHAR ReadDataPort) +{ + return ReadByte(ReadDataPort, ISAPNP_RESOURCEDATA); +} + +static +inline +USHORT +ReadStatus(PUCHAR ReadDataPort) +{ + return ReadByte(ReadDataPort, ISAPNP_STATUS); +} + +static +inline +VOID +WriteCsn(USHORT Csn) +{ + WriteByte(ISAPNP_CARDSELECTNUMBER, Csn); +} + +static +inline +VOID +WriteLogicalDeviceNumber(USHORT LogDev) +{ + WriteByte(ISAPNP_LOGICALDEVICENUMBER, LogDev); +} + +static +inline +VOID +ActivateDevice(USHORT LogDev) +{ + WriteLogicalDeviceNumber(LogDev); + WriteByte(ISAPNP_ACTIVATE, 1); +} + +static +inline +VOID +DeactivateDevice(USHORT LogDev) +{ + WriteLogicalDeviceNumber(LogDev); + WriteByte(ISAPNP_ACTIVATE, 0); +} + +static +inline +USHORT +ReadIoBase(PUCHAR ReadDataPort, USHORT Index) +{ + return ReadWord(ReadDataPort, ISAPNP_IOBASE(Index)); +} + +static +inline +USHORT +ReadIrqNo(PUCHAR ReadDataPort, USHORT Index) +{ + return ReadByte(ReadDataPort, ISAPNP_IRQNO(Index)); +} + +static +inline +VOID +HwDelay(VOID) +{ + KeStallExecutionProcessor(1000); +} + +static +inline +USHORT +NextLFSR(USHORT Lfsr, USHORT InputBit) +{ + ULONG NextLfsr = Lfsr >> 1; + + NextLfsr |= (((Lfsr ^ NextLfsr) ^ InputBit)) << 7; + + return NextLfsr; +} + +static +VOID +SendKey(VOID) +{ + USHORT i, Lfsr; + + HwDelay(); + WriteAddress(0x00); + WriteAddress(0x00); + + Lfsr = ISAPNP_LFSR_SEED; + for (i = 0; i < 32; i++) + { + WriteAddress(Lfsr); + Lfsr = NextLFSR(Lfsr, 0); + } +} + +static +USHORT +PeekByte(PUCHAR ReadDataPort) +{ + USHORT i; + + for (i = 0; i < 20; i++) + { + if (ReadStatus(ReadDataPort) & 0x01) + return ReadResourceData(ReadDataPort); + + HwDelay(); + } + + return 0xFF; +} + +static +VOID +Peek(PUCHAR ReadDataPort, PVOID Buffer, ULONG Length) +{ + USHORT i, byte; + + for (i = 0; i < Length; i++) + { + byte = PeekByte(ReadDataPort); + if (Buffer) + *((PUCHAR)Buffer + i) = byte; + } +} + +static +USHORT +IsaPnpChecksum(PISAPNP_IDENTIFIER Identifier) +{ + USHORT i,j, Lfsr, Byte; + + Lfsr = ISAPNP_LFSR_SEED; + for (i = 0; i < 8; i++) + { + Byte = *(((PUCHAR)Identifier) + i); + for (j = 0; j < 8; j++) + { + Lfsr = NextLFSR(Lfsr, Byte); + Byte >>= 1; + } + } + + return Lfsr; +} + +static +BOOLEAN +FindTag(PUCHAR ReadDataPort, USHORT WantedTag, PVOID Buffer, ULONG Length) +{ + USHORT Tag, TagLen; + + do + { + Tag = PeekByte(ReadDataPort); + if (ISAPNP_IS_SMALL_TAG(Tag)) + { + TagLen = ISAPNP_SMALL_TAG_LEN(Tag); + Tag = ISAPNP_SMALL_TAG_NAME(Tag); + } + else + { + TagLen = PeekByte(ReadDataPort) + (PeekByte(ReadDataPort) << 8); + Tag = ISAPNP_LARGE_TAG_NAME(Tag); + } + + if (Tag == WantedTag) + { + if (Length > TagLen) + Length = TagLen; + + Peek(ReadDataPort, Buffer, Length); + + return TRUE; + } + else + { + Peek(ReadDataPort, NULL, Length); + } + } while (Tag != ISAPNP_TAG_END); + + return FALSE; +} + +static +BOOLEAN +FindLogDevId(PUCHAR ReadDataPort, USHORT LogDev, PISAPNP_LOGDEVID LogDeviceId) +{ + USHORT i; + + for (i = 0; i <= LogDev; i++) + { + if (!FindTag(ReadDataPort, ISAPNP_TAG_LOGDEVID, LogDeviceId, sizeof(*LogDeviceId))) + return FALSE; + } + + return TRUE; +} + +static +INT +TryIsolate(PUCHAR ReadDataPort) +{ + ISAPNP_IDENTIFIER Identifier; + USHORT i, j; + BOOLEAN Seen55aa, SeenLife; + INT Csn = 0; + USHORT Byte, Data; + + DPRINT("Setting read data port: 0x%x\n", ReadDataPort); + + WaitForKey(); + SendKey(); + + ResetCsn(); + HwDelay(); + HwDelay(); + + WaitForKey(); + SendKey(); + Wake(0x00); + + SetReadDataPort(ReadDataPort); + HwDelay(); + + while (TRUE) + { + EnterIsolationState(); + HwDelay(); + + RtlZeroMemory(&Identifier, sizeof(Identifier)); + + Seen55aa = SeenLife = FALSE; + for (i = 0; i < 9; i++) + { + Byte = 0; + for (j = 0; j < 8; j++) + { + Data = ReadData(ReadDataPort); + HwDelay(); + Data = ((Data << 8) | ReadData(ReadDataPort)); + HwDelay(); + Data >>= 1; + + if (Data != 0xFFFF) + { + SeenLife = TRUE; + if (Data == 0x55AA) + { + Byte |= 0x80; + Seen55aa = TRUE; + } + } + } + *(((PUCHAR)&Identifier) + i) = Byte; + } + + if (!Seen55aa) + { + if (Csn) + { + DPRINT("Found no more cards\n"); + } + else + { + if (SeenLife) + { + DPRINT("Saw life but no cards, trying new read port\n"); + Csn = -1; + } + else + { + DPRINT("Saw no sign of life, abandoning isolation\n"); + } + } + break; + } + + if (Identifier.Checksum != IsaPnpChecksum(&Identifier)) + { + DPRINT("Bad checksum, trying next read data port\n"); + Csn = -1; + break; + } + + Csn++; + + WriteCsn(Csn); + HwDelay(); + + Wake(0x00); + HwDelay(); + } + + WaitForKey(); + + if (Csn > 0) + { + DPRINT("Found %d cards at read port 0x%x\n", Csn, ReadDataPort); + } + + return Csn; +} + +static +PUCHAR +Isolate(VOID) +{ + PUCHAR ReadPort; + + for (ReadPort = (PUCHAR)ISAPNP_READ_PORT_START; + (ULONG_PTR)ReadPort <= ISAPNP_READ_PORT_MAX; + ReadPort += ISAPNP_READ_PORT_STEP) + { + /* Avoid the NE2000 probe space */ + if ((ULONG_PTR)ReadPort >= 0x280 && + (ULONG_PTR)ReadPort <= 0x380) + continue; + + if (TryIsolate(ReadPort) > 0) + return ReadPort; + } + + return 0; +} + +VOID +DeviceActivation(PISAPNP_LOGICAL_DEVICE IsaDevice, + BOOLEAN Activate) +{ + WaitForKey(); + SendKey(); + Wake(IsaDevice->CSN); + + if (Activate) + ActivateDevice(IsaDevice->LDN); + else + DeactivateDevice(IsaDevice->LDN); + + HwDelay(); + + WaitForKey(); +} + +NTSTATUS +ProbeIsaPnpBus(PISAPNP_FDO_EXTENSION FdoExt) +{ + PISAPNP_LOGICAL_DEVICE LogDevice; + ISAPNP_IDENTIFIER Identifier; + ISAPNP_LOGDEVID LogDevId; + USHORT Csn; + USHORT LogDev; + PDEVICE_OBJECT Pdo; + NTSTATUS Status; + + ASSERT(FdoExt->ReadDataPort); + + for (Csn = 1; Csn <= 0xFF; Csn++) + { + for (LogDev = 0; LogDev <= 0xFF; LogDev++) + { + Status = IoCreateDevice(FdoExt->Common.Self->DriverObject, + sizeof(ISAPNP_LOGICAL_DEVICE), + NULL, + FILE_DEVICE_CONTROLLER, + FILE_DEVICE_SECURE_OPEN, + FALSE, + &Pdo); + if (!NT_SUCCESS(Status)) + return Status; + + Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; + + LogDevice = Pdo->DeviceExtension; + + RtlZeroMemory(LogDevice, sizeof(ISAPNP_LOGICAL_DEVICE)); + + LogDevice->Common.Self = Pdo; + LogDevice->Common.IsFdo = FALSE; + LogDevice->Common.State = dsStopped; + + LogDevice->CSN = Csn; + LogDevice->LDN = LogDev; + + WaitForKey(); + SendKey(); + Wake(Csn); + + Peek(FdoExt->ReadDataPort, &Identifier, sizeof(Identifier)); + + if (Identifier.VendorId & 0x80) + { + IoDeleteDevice(LogDevice->Common.Self); + return STATUS_SUCCESS; + } + + if (!FindLogDevId(FdoExt->ReadDataPort, LogDev, &LogDevId)) + break; + + WriteLogicalDeviceNumber(LogDev); + + LogDevice->VendorId = LogDevId.VendorId; + LogDevice->ProdId = LogDevId.ProdId; + LogDevice->IoAddr = ReadIoBase(FdoExt->ReadDataPort, 0); + LogDevice->IrqNo = ReadIrqNo(FdoExt->ReadDataPort, 0); + + DPRINT1("Detected ISA PnP device - VID: 0x%x PID: 0x%x IoBase: 0x%x IRQ:0x%x\n", + LogDevice->VendorId, LogDevice->ProdId, LogDevice->IoAddr, LogDevice->IrqNo); + + WaitForKey(); + + Pdo->Flags &= ~DO_DEVICE_INITIALIZING; + + InsertTailList(&FdoExt->DeviceListHead, &LogDevice->ListEntry); + FdoExt->DeviceCount++; + } + } + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +IsaHwDetectReadDataPort( + IN PISAPNP_FDO_EXTENSION FdoExt) +{ + FdoExt->ReadDataPort = Isolate(); + if (!FdoExt->ReadDataPort) + { + DPRINT1("No read data port found\n"); + return STATUS_UNSUCCESSFUL; + } + + DPRINT1("Detected read data port at 0x%x\n", FdoExt->ReadDataPort); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +IsaHwActivateDevice( + IN PISAPNP_LOGICAL_DEVICE LogicalDevice) +{ + DeviceActivation(LogicalDevice, + TRUE); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +IsaHwDeactivateDevice( + IN PISAPNP_LOGICAL_DEVICE LogicalDevice) +{ + DeviceActivation(LogicalDevice, + FALSE); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +IsaHwFillDeviceList( + IN PISAPNP_FDO_EXTENSION FdoExt) +{ + return ProbeIsaPnpBus(FdoExt); +} diff --git a/reactos/drivers/bus/isapnp/isapnp.c b/reactos/drivers/bus/isapnp/isapnp.c index 37262c3aa87..594b5a90541 100644 --- a/reactos/drivers/bus/isapnp/isapnp.c +++ b/reactos/drivers/bus/isapnp/isapnp.c @@ -1,1729 +1,183 @@ -/* $Id$ - * +/* * PROJECT: ReactOS ISA PnP Bus driver * FILE: isapnp.c * PURPOSE: Driver entry - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * NOTE: Parts adapted from linux ISA PnP driver - * UPDATE HISTORY: - * 01-05-2001 CSH Created + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) */ #include -#ifndef NDEBUG #define NDEBUG -#endif #include - -#ifdef ALLOC_PRAGMA - -// Make the initialization routines discardable, so that they -// don't waste space - -#pragma alloc_text(init, DriverEntry) - - -#endif /* ALLOC_PRAGMA */ - - -PUCHAR IsaPnPReadPort; - - -#define UCHAR2USHORT(v0, v1) \ - ((v1 << 8) | v0) - -#define UCHAR2ULONG(v0, v1, v2, v3) \ - ((UCHAR2USHORT(v2, v3) << 16) | UCHAR2USHORT(v0, v1)) - - -#ifndef NDEBUG - -struct -{ - PCH Name; -} SmallTags[] = { - {"Unknown Small Tag"}, - {"ISAPNP_SRIN_VERSION"}, - {"ISAPNP_SRIN_LDEVICE_ID"}, - {"ISAPNP_SRIN_CDEVICE_ID"}, - {"ISAPNP_SRIN_IRQ_FORMAT"}, - {"ISAPNP_SRIN_DMA_FORMAT"}, - {"ISAPNP_SRIN_START_DFUNCTION"}, - {"ISAPNP_SRIN_END_DFUNCTION"}, - {"ISAPNP_SRIN_IO_DESCRIPTOR"}, - {"ISAPNP_SRIN_FL_IO_DESCRIPOTOR"}, - {"Reserved Small Tag"}, - {"Reserved Small Tag"}, - {"Reserved Small Tag"}, - {"Reserved Small Tag"}, - {"ISAPNP_SRIN_VENDOR_DEFINED"}, - {"ISAPNP_SRIN_END_TAG"} -}; - -struct -{ - PCH Name; -} LargeTags[] = { - {"Unknown Large Tag"}, - {"ISAPNP_LRIN_MEMORY_RANGE"}, - {"ISAPNP_LRIN_ID_STRING_ANSI"}, - {"ISAPNP_LRIN_ID_STRING_UNICODE"}, - {"ISAPNP_LRIN_VENDOR_DEFINED"}, - {"ISAPNP_LRIN_MEMORY_RANGE32"}, - {"ISAPNP_LRIN_FL_MEMORY_RANGE32"} -}; - -PCSZ TagName(ULONG Tag, BOOLEAN Small) -{ - if (Small && (Tag <= ISAPNP_SRIN_END_TAG)) { - return SmallTags[Tag].Name; - } else if (Tag <= ISAPNP_LRIN_FL_MEMORY_RANGE32){ - return LargeTags[Tag].Name; - } - - return NULL; -} - -#endif - -static __inline VOID WriteData(UCHAR Value) -{ - WRITE_PORT_UCHAR((PUCHAR)ISAPNP_WRITE_PORT, Value); -} - -static __inline VOID WriteAddress(UCHAR Value) -{ - WRITE_PORT_UCHAR((PUCHAR)ISAPNP_ADDRESS_PORT, Value); - KeStallExecutionProcessor(20); -} - -static __inline UCHAR ReadData(VOID) -{ - return READ_PORT_UCHAR(IsaPnPReadPort); -} - -static UCHAR ReadUchar(UCHAR Index) -{ - WriteAddress(Index); - return ReadData(); -} - -#if 0 -static USHORT ReadUshort(UCHAR Index) -{ - USHORT Value; - - Value = ReadUchar(Index); - Value = (Value << 8) + ReadUchar(Index + 1); - return Value; -} - -static ULONG ReadUlong(UCHAR Index) -{ - ULONG Value; - - Value = ReadUchar(Index); - Value = (Value << 8) + ReadUchar(Index + 1); - Value = (Value << 8) + ReadUchar(Index + 2); - Value = (Value << 8) + ReadUchar(Index + 3); - return Value; -} -#endif - -static VOID WriteUchar(UCHAR Index, UCHAR Value) -{ - WriteAddress(Index); - WriteData(Value); -} - -#if 0 -static VOID WriteUshort(UCHAR Index, USHORT Value) -{ - WriteUchar(Index, Value >> 8); - WriteUchar(Index + 1, Value); -} - -static VOID WriteUlong(UCHAR Index, ULONG Value) -{ - WriteUchar(Index, Value >> 24); - WriteUchar(Index + 1, Value >> 16); - WriteUchar(Index + 2, Value >> 8); - WriteUchar(Index + 3, Value); -} -#endif - -static __inline VOID SetReadDataPort(ULONG_PTR Port) -{ - IsaPnPReadPort = (PUCHAR)Port; - WriteUchar(0x00, (UCHAR) (Port >> 2)); - KeStallExecutionProcessor(100); -} - -static VOID SendKey(VOID) -{ - ULONG i; - UCHAR msb; - UCHAR code; - - /* FIXME: Is there something better? */ - KeStallExecutionProcessor(1000); - WriteAddress(0x00); - WriteAddress(0x00); - - code = 0x6a; - WriteAddress(code); - for (i = 1; i < 32; i++) { - msb = ((code & 0x01) ^ ((code & 0x02) >> 1)) << 7; - code = (code >> 1) | msb; - WriteAddress(code); - } -} - -/* Place all PnP cards in wait-for-key state */ -static VOID SendWait(VOID) -{ - WriteUchar(0x02, 0x02); -} - -static VOID SendWake(UCHAR csn) -{ - WriteUchar(ISAPNP_CARD_WAKECSN, csn); -} - -#if 0 -static VOID SelectLogicalDevice(UCHAR LogicalDevice) -{ - WriteUchar(ISAPNP_CARD_LOG_DEVICE_NUM, LogicalDevice); -} - -static VOID ActivateLogicalDevice(UCHAR LogicalDevice) -{ - SelectLogicalDevice(LogicalDevice); - WriteUchar(ISAPNP_CONTROL_ACTIVATE, 0x1); - KeStallExecutionProcessor(250); -} - -static VOID DeactivateLogicalDevice(UCHAR LogicalDevice) -{ - SelectLogicalDevice(LogicalDevice); - WriteUchar(ISAPNP_CONTROL_ACTIVATE, 0x0); - KeStallExecutionProcessor(500); -} -#endif - -#define READ_DATA_PORT_STEP 32 /* Minimum is 4 */ - -static ULONG_PTR FindNextReadPort(VOID) -{ - ULONG_PTR Port; - - - - Port = (ULONG_PTR)IsaPnPReadPort; - - while (TRUE) { - - Port += READ_DATA_PORT_STEP; - - - - if (Port > ISAPNP_MAX_READ_PORT) - - { - - return 0; - - } - - - - /* - - * We cannot use NE2000 probe spaces for - - * ISAPnP or we will lock up machines - - */ - - if ((Port < 0x280) || (Port > 0x380)) - - { - - return Port; - - } - - } - -} - -static BOOLEAN IsolateReadDataPortSelect(VOID) -{ - ULONG_PTR Port; - - SendWait(); - SendKey(); - - /* Control: reset CSN and conditionally everything else too */ - WriteUchar(0x02, 0x05); - KeStallExecutionProcessor(2000); - - SendWait(); - SendKey(); - SendWake(0x00); - - Port = FindNextReadPort(); - if (Port == 0) { - SendWait(); - return FALSE; - } - - SetReadDataPort(Port); - KeStallExecutionProcessor(1000); - WriteAddress(0x01); - KeStallExecutionProcessor(1000); - return TRUE; -} - -/* - * Isolate (assign uniqued CSN) to all ISA PnP devices - */ -static ULONG IsolatePnPCards(VOID) -{ - UCHAR checksum = 0x6a; - UCHAR chksum = 0x00; - UCHAR bit = 0x00; - ULONG data; - ULONG csn = 0; - ULONG i; - ULONG iteration = 1; - - DPRINT("Called\n"); - - IsaPnPReadPort = (PUCHAR)(ISAPNP_MIN_READ_PORT - READ_DATA_PORT_STEP); - if (!IsolateReadDataPortSelect()) { - DPRINT("Could not set read data port\n"); - return 0; - } - - while (TRUE) { - for (i = 1; i <= 64; i++) { - data = ReadData() << 8; - KeStallExecutionProcessor(250); - data = data | ReadData(); - KeStallExecutionProcessor(250); - if (data == 0x55aa) - bit = 0x01; - checksum = ((((checksum ^ (checksum >> 1)) & 0x01) ^ bit) << 7) | (checksum >> 1); - bit = 0x00; - } - for (i = 65; i <= 72; i++) { - data = ReadData() << 8; - KeStallExecutionProcessor(250); - data = data | ReadData(); - KeStallExecutionProcessor(250); - if (data == 0x55aa) - chksum |= (1 << (i - 65)); - } - if ((checksum != 0x00) && (checksum == chksum)) { - csn++; - - WriteUchar(0x06, (UCHAR) csn); - KeStallExecutionProcessor(250); - iteration++; - SendWake(0x00); - SetReadDataPort((ULONG_PTR)IsaPnPReadPort); - KeStallExecutionProcessor(1000); - WriteAddress(0x01); - KeStallExecutionProcessor(1000); - goto next; - } - if (iteration == 1) { - if (!IsolateReadDataPortSelect()) { - DPRINT("Could not set read data port\n"); - return 0; - } - } else if (iteration > 1) { - break; - } -next: - checksum = 0x6a; - chksum = 0x00; - bit = 0x00; - } - SendWait(); - return csn; -} - - -static VOID Peek(PUCHAR Data, ULONG Count) -{ - ULONG i, j; - UCHAR d = 0; - - for (i = 1; i <= Count; i++) { - for (j = 0; j < 20; j++) { - d = ReadUchar(0x05); - if (d & 0x1) - break; - KeStallExecutionProcessor(100); - } - if (!(d & 0x1)) { - if (Data != NULL) - *Data++ = 0xff; - continue; - } - d = ReadUchar(0x04); /* PRESDI */ - if (Data != NULL) - *Data++ = d; - } -} - - -/* - * Skip specified number of bytes from stream - */ -static VOID Skip(ULONG Count) -{ - Peek(NULL, Count); -} - - -/* - * Read one tag from stream - */ -static BOOLEAN ReadTag(PUCHAR Type, - PUSHORT Size, - PBOOLEAN Small) -{ - UCHAR tag, tmp[2]; - - Peek(&tag, 1); - if (tag == 0) { - /* Invalid tag */ - DPRINT("Invalid tag with value 0\n"); -#ifndef NDEBUG - for (;;); -#endif - return FALSE; - } - - if (tag & ISAPNP_RESOURCE_ITEM_TYPE) { - /* Large resource item */ - *Type = (tag & 0x7f); - Peek(tmp, 2); - *Size = UCHAR2USHORT(tmp[0], tmp[1]); - *Small = FALSE; -#ifndef NDEBUG - if (*Type > ISAPNP_LRIN_FL_MEMORY_RANGE32) { - DPRINT("Invalid large tag with value 0x%X\n", *Type); - for (;;); - } -#endif - } else { - /* Small resource item */ - *Type = (tag >> 3) & 0x0f; - *Size = tag & 0x07; - *Small = TRUE; -#ifndef NDEBUG - if (*Type > ISAPNP_SRIN_END_TAG) { - DPRINT("Invalid small tag with value 0x%X\n", *Type); - for (;;); - } -#endif - } -#if 0 - DPRINT("Tag = 0x%X, Type = 0x%X, Size = %d (%s)\n", - tag, *Type, *Size, TagName(*Type, *Small)); -#endif - /* Probably invalid data */ - if ((*Type == 0xff) && (*Size == 0xffff)) { - DPRINT("Invalid data (Type 0x%X Size 0x%X)\n", *Type, *Size); - for (;;); - return FALSE; - } - - return TRUE; -} - - -/* - * Parse ANSI name for ISA PnP logical device - */ -static NTSTATUS ParseAnsiName(PUNICODE_STRING Name, PUSHORT Size) -{ - ANSI_STRING AnsiString; - UCHAR Buffer[256]; - USHORT size1; - - size1 = (*Size >= sizeof(Buffer)) ? (sizeof(Buffer) - 1) : *Size; - - Peek(Buffer, size1); - Buffer[size1] = '\0'; - *Size -= size1; - - /* Clean whitespace from end of string */ - while ((size1 > 0) && (Buffer[--size1] == ' ')) - Buffer[size1] = '\0'; - - DPRINT("ANSI name: %s\n", Buffer); - - RtlInitAnsiString(&AnsiString, (PCSZ)&Buffer); - return RtlAnsiStringToUnicodeString(Name, &AnsiString, TRUE); -} - - -/* - * Add a resource list to the - * resource lists of a logical device - */ -static NTSTATUS AddResourceList( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Priority, - PISAPNP_CONFIGURATION_LIST *NewList) -{ - PISAPNP_CONFIGURATION_LIST List; - - DPRINT("Adding resource list for logical device %d on card %d (Priority %d)\n", - LogicalDevice->Number, - LogicalDevice->Card->CardId, - Priority); - - List = (PISAPNP_CONFIGURATION_LIST) - ExAllocatePoolWithTag(PagedPool, sizeof(ISAPNP_CONFIGURATION_LIST), TAG_ISAPNP); - if (!List) - return STATUS_INSUFFICIENT_RESOURCES; - - RtlZeroMemory(List, sizeof(ISAPNP_CONFIGURATION_LIST)); - - List->Priority = Priority; - - InitializeListHead(&List->ListHead); - - InsertTailList(&LogicalDevice->Configuration, &List->ListEntry); - - *NewList = List; - - return STATUS_SUCCESS; -} - - -/* - * Add a resource entry to the - * resource list of a logical device - */ -static NTSTATUS AddResourceDescriptor( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Priority, - ULONG Option, - PISAPNP_DESCRIPTOR *Descriptor) -{ - PLIST_ENTRY CurrentEntry; - PISAPNP_CONFIGURATION_LIST List; - PISAPNP_DESCRIPTOR d; - NTSTATUS Status; - - DPRINT("Adding resource descriptor for logical device %d on card %d (%d of %d)\n", - LogicalDevice->Number, - LogicalDevice->Card->CardId, - LogicalDevice->CurrentDescriptorCount, - LogicalDevice->DescriptorCount); - - d = (PISAPNP_DESCRIPTOR) - ExAllocatePoolWithTag(PagedPool, sizeof(ISAPNP_DESCRIPTOR), TAG_ISAPNP); - if (!d) - return STATUS_NO_MEMORY; - - RtlZeroMemory(d, sizeof(ISAPNP_DESCRIPTOR)); - - d->Descriptor.Option = (UCHAR) Option; - - *Descriptor = d; - - CurrentEntry = LogicalDevice->Configuration.Flink; - while (CurrentEntry != &LogicalDevice->Configuration) { - List = CONTAINING_RECORD( - CurrentEntry, ISAPNP_CONFIGURATION_LIST, ListEntry); - - if (List->Priority == Priority) { - - LogicalDevice->ConfigurationSize += sizeof(IO_RESOURCE_DESCRIPTOR); - InsertTailList(&List->ListHead, &d->ListEntry); - LogicalDevice->CurrentDescriptorCount++; - if (LogicalDevice->DescriptorCount < - LogicalDevice->CurrentDescriptorCount) { - LogicalDevice->DescriptorCount = - LogicalDevice->CurrentDescriptorCount; - } - - return STATUS_SUCCESS; - } - CurrentEntry = CurrentEntry->Flink; - } - - Status = AddResourceList(LogicalDevice, Priority, &List); - if (NT_SUCCESS(Status)) { - LogicalDevice->ConfigurationSize += sizeof(IO_RESOURCE_LIST); - LogicalDevice->CurrentDescriptorCount = 0; - InsertTailList(&List->ListHead, &d->ListEntry); - } - - return Status; -} - - -/* - * Add IRQ resource to resources list - */ -static NTSTATUS AddIrqResource( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Size, - ULONG Priority, - ULONG Option) -{ - PISAPNP_DESCRIPTOR Descriptor; - UCHAR tmp[3]; - ULONG irq, i, last = 0; - BOOLEAN found; - NTSTATUS Status; - - Peek(tmp, Size); - - irq = UCHAR2USHORT(tmp[0], tmp[0]); - - DPRINT("IRQ bitmask: 0x%X\n", irq); - - found = FALSE; - for (i = 0; i < 16; i++) { - if (!found && (irq & (1 << i))) { - last = i; - found = TRUE; - } - - if ((found && !(irq & (1 << i))) || (irq & (1 << i) && (i == 15))) { - Status = AddResourceDescriptor(LogicalDevice, - Priority, Option, &Descriptor); - if (!NT_SUCCESS(Status)) - return Status; - Descriptor->Descriptor.Type = CmResourceTypeInterrupt; - Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Descriptor.u.Interrupt.MinimumVector = last; - - if ((irq & (1 << i)) && (i == 15)) - Descriptor->Descriptor.u.Interrupt.MaximumVector = i; - else - Descriptor->Descriptor.u.Interrupt.MaximumVector = i - 1; - - DPRINT("Found IRQ range %d - %d for logical device %d on card %d\n", - Descriptor->Descriptor.u.Interrupt.MinimumVector, - Descriptor->Descriptor.u.Interrupt.MaximumVector, - LogicalDevice->Number, - LogicalDevice->Card->CardId); - - found = FALSE; - } - } - - return STATUS_SUCCESS; -} - -/* - * Add DMA resource to resources list - */ -static NTSTATUS AddDmaResource( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Size, - ULONG Priority, - ULONG Option) -{ - PISAPNP_DESCRIPTOR Descriptor; - UCHAR tmp[2]; - ULONG dma, flags, i, last = 0; - BOOLEAN found; - NTSTATUS Status; - - Peek(tmp, Size); - - dma = tmp[0]; - flags = tmp[1]; - - DPRINT("DMA bitmask: 0x%X\n", dma); - - found = FALSE; - for (i = 0; i < 8; i++) { - if (!found && (dma & (1 << i))) { - last = i; - found = TRUE; - } - - if ((found && !(dma & (1 << i))) || (dma & (1 << i) && (i == 15))) { - Status = AddResourceDescriptor(LogicalDevice, - Priority, Option, &Descriptor); - if (!NT_SUCCESS(Status)) - return Status; - Descriptor->Descriptor.Type = CmResourceTypeDma; - Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Descriptor.u.Dma.MinimumChannel = last; - - if ((dma & (1 << i)) && (i == 15)) - Descriptor->Descriptor.u.Dma.MaximumChannel = i; - else - Descriptor->Descriptor.u.Dma.MaximumChannel = i - 1; - - /* FIXME: Parse flags */ - - DPRINT("Found DMA range %d - %d for logical device %d on card %d\n", - Descriptor->Descriptor.u.Dma.MinimumChannel, - Descriptor->Descriptor.u.Dma.MaximumChannel, - LogicalDevice->Number, - LogicalDevice->Card->CardId); - - found = FALSE; - } - } - - return STATUS_SUCCESS; -} - -/* - * Add port resource to resources list - */ -static NTSTATUS AddIOPortResource( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Size, - ULONG Priority, - ULONG Option) -{ -#if 0 - DPRINT("I/O port: size 0x%X\n", Size); - Skip(Size); -#else - PISAPNP_DESCRIPTOR Descriptor; - UCHAR tmp[7]; - NTSTATUS Status; - - Peek(tmp, Size); - - Status = AddResourceDescriptor(LogicalDevice, - Priority, Option, &Descriptor); - if (!NT_SUCCESS(Status)) - return Status; - Descriptor->Descriptor.Type = CmResourceTypePort; - Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Descriptor.u.Port.Length = tmp[6]; - /* FIXME: Parse flags */ - Descriptor->Descriptor.u.Port.Alignment = 0; - Descriptor->Descriptor.u.Port.MinimumAddress.QuadPart = UCHAR2USHORT(tmp[1], tmp[2]); - Descriptor->Descriptor.u.Port.MaximumAddress.QuadPart = UCHAR2USHORT(tmp[4], tmp[4]); - - DPRINT("Found I/O port range 0x%X - 0x%X for logical device %d on card %d\n", - Descriptor->Descriptor.u.Port.MinimumAddress, - Descriptor->Descriptor.u.Port.MaximumAddress, - LogicalDevice->Number, - LogicalDevice->Card->CardId); -#endif - return STATUS_SUCCESS; -} - -/* - * Add fixed port resource to resources list - */ -static NTSTATUS AddFixedIOPortResource( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Size, - ULONG Priority, - ULONG Option) -{ -#if 0 - DPRINT("Fixed I/O port: size 0x%X\n", Size); - Skip(Size); -#else - PISAPNP_DESCRIPTOR Descriptor; - UCHAR tmp[3]; - NTSTATUS Status; - - Peek(tmp, Size); - - Status = AddResourceDescriptor(LogicalDevice, - Priority, Option, &Descriptor); - if (!NT_SUCCESS(Status)) - return Status; - Descriptor->Descriptor.Type = CmResourceTypePort; - Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Descriptor.u.Port.Length = tmp[2]; - Descriptor->Descriptor.u.Port.Alignment = 0; - Descriptor->Descriptor.u.Port.MinimumAddress.QuadPart = UCHAR2USHORT(tmp[0], tmp[1]); - Descriptor->Descriptor.u.Port.MaximumAddress.QuadPart = UCHAR2USHORT(tmp[0], tmp[1]); - - DPRINT("Found fixed I/O port range 0x%X - 0x%X for logical device %d on card %d\n", - Descriptor->Descriptor.u.Port.MinimumAddress, - Descriptor->Descriptor.u.Port.MaximumAddress, - LogicalDevice->Number, - LogicalDevice->Card->CardId); -#endif - return STATUS_SUCCESS; -} - -/* - * Add memory resource to resources list - */ -static NTSTATUS AddMemoryResource( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Size, - ULONG Priority, - ULONG Option) -{ -#if 0 - DPRINT("Memory range: size 0x%X\n", Size); - Skip(Size); -#else - PISAPNP_DESCRIPTOR Descriptor; - UCHAR tmp[9]; - NTSTATUS Status; - - Peek(tmp, Size); - - Status = AddResourceDescriptor(LogicalDevice, - Priority, Option, &Descriptor); - if (!NT_SUCCESS(Status)) - return Status; - Descriptor->Descriptor.Type = CmResourceTypeMemory; - Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Descriptor.u.Memory.Length = UCHAR2USHORT(tmp[7], tmp[8]) << 8; - Descriptor->Descriptor.u.Memory.Alignment = UCHAR2USHORT(tmp[5], tmp[6]); - Descriptor->Descriptor.u.Memory.MinimumAddress.QuadPart = UCHAR2USHORT(tmp[1], tmp[2]) << 8; - Descriptor->Descriptor.u.Memory.MaximumAddress.QuadPart = UCHAR2USHORT(tmp[3], tmp[4]) << 8; - - DPRINT("Found memory range 0x%X - 0x%X for logical device %d on card %d\n", - Descriptor->Descriptor.u.Memory.MinimumAddress, - Descriptor->Descriptor.u.Memory.MaximumAddress, - LogicalDevice->Number, - LogicalDevice->Card->CardId); -#endif - return STATUS_SUCCESS; -} - -/* - * Add 32-bit memory resource to resources list - */ -static NTSTATUS AddMemory32Resource( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Size, - ULONG Priority, - ULONG Option) -{ -#if 0 - DPRINT("Memory32 range: size 0x%X\n", Size); - Skip(Size); -#else - PISAPNP_DESCRIPTOR Descriptor; - UCHAR tmp[17]; - NTSTATUS Status; - - Peek(tmp, Size); - - Status = AddResourceDescriptor(LogicalDevice, - Priority, Option, &Descriptor); - if (!NT_SUCCESS(Status)) - return Status; - Descriptor->Descriptor.Type = CmResourceTypeMemory; - Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Descriptor.u.Memory.Length = - UCHAR2ULONG(tmp[13], tmp[14], tmp[15], tmp[16]); - Descriptor->Descriptor.u.Memory.Alignment = - UCHAR2ULONG(tmp[9], tmp[10], tmp[11], tmp[12]); - Descriptor->Descriptor.u.Memory.MinimumAddress.QuadPart = - UCHAR2ULONG(tmp[1], tmp[2], tmp[3], tmp[4]); - Descriptor->Descriptor.u.Memory.MaximumAddress.QuadPart = - UCHAR2ULONG(tmp[5], tmp[6], tmp[7], tmp[8]); - - DPRINT("Found memory32 range 0x%X - 0x%X for logical device %d on card %d\n", - Descriptor->Descriptor.u.Memory.MinimumAddress, - Descriptor->Descriptor.u.Memory.MaximumAddress, - LogicalDevice->Number, - LogicalDevice->Card->CardId); -#endif - return STATUS_SUCCESS; -} - -/* - * Add 32-bit fixed memory resource to resources list - */ -static NTSTATUS AddFixedMemory32Resource( - PISAPNP_LOGICAL_DEVICE LogicalDevice, - ULONG Size, - ULONG Priority, - ULONG Option) -{ -#if 0 - DPRINT("Memory32 range: size 0x%X\n", Size); - Skip(Size); -#else - PISAPNP_DESCRIPTOR Descriptor; - UCHAR tmp[17]; - NTSTATUS Status; - - Peek(tmp, Size); - - Status = AddResourceDescriptor(LogicalDevice, - Priority, Option, &Descriptor); - if (!NT_SUCCESS(Status)) - return Status; - Descriptor->Descriptor.Type = CmResourceTypeMemory; - Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; - Descriptor->Descriptor.u.Memory.Length = - UCHAR2ULONG(tmp[9], tmp[10], tmp[11], tmp[12]); - Descriptor->Descriptor.u.Memory.Alignment = - UCHAR2ULONG(tmp[5], tmp[6], tmp[7], tmp[8]); - Descriptor->Descriptor.u.Memory.MinimumAddress.QuadPart = - UCHAR2ULONG(tmp[1], tmp[2], tmp[3], tmp[4]); - Descriptor->Descriptor.u.Memory.MaximumAddress.QuadPart = - UCHAR2ULONG(tmp[1], tmp[2], tmp[3], tmp[4]); - - DPRINT("Found fixed memory32 range 0x%X - 0x%X for logical device %d on card %d\n", - Descriptor->Descriptor.u.Memory.MinimumAddress, - Descriptor->Descriptor.u.Memory.MaximumAddress, - LogicalDevice->Number, - LogicalDevice->Card->CardId); -#endif - return STATUS_SUCCESS; -} - - -/* - * Parse logical device tag - */ -static PISAPNP_LOGICAL_DEVICE ParseLogicalDevice( - PISAPNP_DEVICE_EXTENSION DeviceExtension, - PISAPNP_CARD Card, - ULONG Size, - USHORT Number) -{ - UCHAR tmp[6]; - PISAPNP_LOGICAL_DEVICE LogicalDevice; - - DPRINT("Card %d Number %d\n", Card->CardId, Number); - - Peek(tmp, Size); - - LogicalDevice = (PISAPNP_LOGICAL_DEVICE)ExAllocatePoolWithTag( - PagedPool, sizeof(ISAPNP_LOGICAL_DEVICE), TAG_ISAPNP); - if (!LogicalDevice) - return NULL; - - RtlZeroMemory(LogicalDevice, sizeof(ISAPNP_LOGICAL_DEVICE)); - - LogicalDevice->Number = Number; - LogicalDevice->VendorId = UCHAR2USHORT(tmp[0], tmp[1]); - LogicalDevice->DeviceId = UCHAR2USHORT(tmp[2], tmp[3]); - LogicalDevice->Regs = tmp[4]; - LogicalDevice->Card = Card; - if (Size > 5) - LogicalDevice->Regs |= tmp[5] << 8; - - InitializeListHead(&LogicalDevice->Configuration); - - ExInterlockedInsertTailList(&Card->LogicalDevices, - &LogicalDevice->CardListEntry, - &Card->LogicalDevicesLock); - - ExInterlockedInsertTailList(&DeviceExtension->DeviceListHead, - &LogicalDevice->DeviceListEntry, - &DeviceExtension->GlobalListLock); - - DeviceExtension->DeviceListCount++; - - return LogicalDevice; -} - - -/* - * Parse resource map for logical device - */ -static BOOLEAN CreateLogicalDevice(PISAPNP_DEVICE_EXTENSION DeviceExtension, - PISAPNP_CARD Card, USHORT Size) -{ - ULONG number = 0, skip = 0, compat = 0; - UCHAR type, tmp[17]; - PISAPNP_LOGICAL_DEVICE LogicalDevice; - BOOLEAN Small; - ULONG Priority = 0; - ULONG Option = IO_RESOURCE_REQUIRED; - - DPRINT("Card %d Size %d\n", Card->CardId, Size); - - LogicalDevice = ParseLogicalDevice(DeviceExtension, Card, Size, (USHORT) number++); - if (!LogicalDevice) - return FALSE; - - while (TRUE) { - if (!ReadTag(&type, &Size, &Small)) - return FALSE; - - if (skip && !(Small && ((type == ISAPNP_SRIN_LDEVICE_ID) - || (type == ISAPNP_SRIN_END_TAG)))) - goto skip; - - if (Small) { - switch (type) { - case ISAPNP_SRIN_LDEVICE_ID: - if ((Size >= 5) && (Size <= 6)) { - LogicalDevice = ParseLogicalDevice( - DeviceExtension, Card, Size, (USHORT)number++); - if (!LogicalDevice) - return FALSE; - Size = 0; - skip = 0; - } else { - skip = 1; - } - Priority = 0; - Option = IO_RESOURCE_REQUIRED; - compat = 0; - break; - - case ISAPNP_SRIN_CDEVICE_ID: - if ((Size == 4) && (compat < MAX_COMPATIBLE_ID)) { - Peek(tmp, 4); - LogicalDevice->CVendorId[compat] = UCHAR2USHORT(tmp[0], tmp[1]); - LogicalDevice->CDeviceId[compat] = UCHAR2USHORT(tmp[2], tmp[3]); - compat++; - Size = 0; - } - break; - - case ISAPNP_SRIN_IRQ_FORMAT: - if ((Size < 2) || (Size > 3)) - goto skip; - AddIrqResource(LogicalDevice, Size, Priority, Option); - Size = 0; - break; - - case ISAPNP_SRIN_DMA_FORMAT: - if (Size != 2) - goto skip; - AddDmaResource(LogicalDevice, Size, Priority, Option); - Size = 0; - break; - - case ISAPNP_SRIN_START_DFUNCTION: - if (Size > 1) - goto skip; - - if (Size > 0) { - Peek(tmp, Size); - Priority = tmp[0]; - Size = 0; - /* FIXME: Maybe use IO_RESOURCE_PREFERRED for some */ - Option = IO_RESOURCE_ALTERNATIVE; - } else { - Priority = 0; - Option = IO_RESOURCE_ALTERNATIVE; - } - - DPRINT(" Start priority %d \n", Priority); - - LogicalDevice->CurrentDescriptorCount = 0; - - break; - - case ISAPNP_SRIN_END_DFUNCTION: - - DPRINT(" End priority %d \n", Priority); - - if (Size != 0) - goto skip; - Priority = 0; - Option = IO_RESOURCE_REQUIRED; - LogicalDevice->CurrentDescriptorCount = 0; - break; - - case ISAPNP_SRIN_IO_DESCRIPTOR: - if (Size != 7) - goto skip; - AddIOPortResource(LogicalDevice, Size, Priority, Option); - Size = 0; - break; - - case ISAPNP_SRIN_FL_IO_DESCRIPOTOR: - if (Size != 3) - goto skip; - AddFixedIOPortResource(LogicalDevice, Size, Priority, Option); - Size = 0; - break; - - case ISAPNP_SRIN_VENDOR_DEFINED: - break; - - case ISAPNP_SRIN_END_TAG: - if (Size > 0) - Skip(Size); - return FALSE; - - default: - DPRINT("Ignoring small tag of type 0x%X for logical device %d on card %d\n", - type, LogicalDevice->Number, Card->CardId); - } - } else { - switch (type) { - case ISAPNP_LRIN_MEMORY_RANGE: - if (Size != 9) - goto skip; - AddMemoryResource(LogicalDevice, Size, Priority, Option); - Size = 0; - break; - - case ISAPNP_LRIN_ID_STRING_ANSI: - ParseAnsiName(&LogicalDevice->Name, &Size); - break; - - case ISAPNP_LRIN_ID_STRING_UNICODE: - break; - - case ISAPNP_LRIN_VENDOR_DEFINED: - break; - - case ISAPNP_LRIN_MEMORY_RANGE32: - if (Size != 17) - goto skip; - AddMemory32Resource(LogicalDevice, Size, Priority, Option); - Size = 0; - break; - - case ISAPNP_LRIN_FL_MEMORY_RANGE32: - if (Size != 17) - goto skip; - AddFixedMemory32Resource(LogicalDevice, Size, Priority, Option); - Size = 0; - break; - - default: - DPRINT("Ignoring large tag of type 0x%X for logical device %d on card %d\n", - type, LogicalDevice->Number, Card->CardId); - } - } -skip: - if (Size > 0) - Skip(Size); - } - - return TRUE; -} - - -/* - * Parse resource map for ISA PnP card - */ -static BOOLEAN ParseResourceMap(PISAPNP_DEVICE_EXTENSION DeviceExtension, - PISAPNP_CARD Card) -{ - UCHAR type, tmp[17]; - USHORT size; - BOOLEAN Small; - - DPRINT("Card %d\n", Card->CardId); - - while (TRUE) { - if (!ReadTag(&type, &size, &Small)) - return FALSE; - - if (Small) { - switch (type) { - case ISAPNP_SRIN_VERSION: - if (size != 2) - goto skip; - Peek(tmp, 2); - Card->PNPVersion = tmp[0]; - Card->ProductVersion = tmp[1]; - size = 0; - break; - - case ISAPNP_SRIN_LDEVICE_ID: - if ((size >= 5) && (size <= 6)) { - if (!CreateLogicalDevice(DeviceExtension, Card, size)) - return FALSE; - size = 0; - } - break; - - case ISAPNP_SRIN_CDEVICE_ID: - /* FIXME: Parse compatible IDs */ - break; - - case ISAPNP_SRIN_END_TAG: - if (size > 0) - Skip(size); - return TRUE; - - default: - DPRINT("Ignoring small tag Type 0x%X for Card %d\n", type, Card->CardId); - } - } else { - switch (type) { - case ISAPNP_LRIN_ID_STRING_ANSI: - ParseAnsiName(&Card->Name, &size); - break; - - default: - DPRINT("Ignoring large tag Type 0x%X for Card %d\n", - type, Card->CardId); - } - } -skip: - if (size > 0) - Skip(size); - } - - return TRUE; -} - - -/* - * Compute ISA PnP checksum for first eight bytes - */ -static UCHAR Checksum(PUCHAR data) -{ - ULONG i, j; - UCHAR checksum = 0x6a, bit, b; - - for (i = 0; i < 8; i++) { - b = data[i]; - for (j = 0; j < 8; j++) { - bit = 0; - if (b & (1 << j)) - bit = 1; - checksum = ((((checksum ^ (checksum >> 1)) & - 0x01) ^ bit) << 7) | (checksum >> 1); - } - } - return checksum; -} - - -/* - * Build a resource list for a logical ISA PnP device - */ -static NTSTATUS BuildResourceList(PISAPNP_LOGICAL_DEVICE LogicalDevice, - PIO_RESOURCE_LIST DestinationList, - ULONG Priority) -{ - PLIST_ENTRY CurrentEntry, Entry; - PISAPNP_CONFIGURATION_LIST List; - PISAPNP_DESCRIPTOR Descriptor; - ULONG i; - - if (IsListEmpty(&LogicalDevice->Configuration)) - return STATUS_NOT_FOUND; - - CurrentEntry = LogicalDevice->Configuration.Flink; - while (CurrentEntry != &LogicalDevice->Configuration) { - List = CONTAINING_RECORD( - CurrentEntry, ISAPNP_CONFIGURATION_LIST, ListEntry); - - if (List->Priority == Priority) { - - DPRINT("Logical device %d DestinationList %p\n", - LogicalDevice->Number, - DestinationList); - - DestinationList->Version = 1; - DestinationList->Revision = 1; - DestinationList->Count = LogicalDevice->DescriptorCount; - - i = 0; - Entry = List->ListHead.Flink; - while (Entry != &List->ListHead) { - Descriptor = CONTAINING_RECORD( - Entry, ISAPNP_DESCRIPTOR, ListEntry); - - DPRINT("Logical device %d Destination %p(%d)\n", - LogicalDevice->Number, - &DestinationList->Descriptors[i], - i); - - RtlCopyMemory(&DestinationList->Descriptors[i], - &Descriptor->Descriptor, - sizeof(IO_RESOURCE_DESCRIPTOR)); - - i++; - - Entry = Entry->Flink; - } - - RemoveEntryList(&List->ListEntry); - - ExFreePool(List); - - return STATUS_SUCCESS; - } - - CurrentEntry = CurrentEntry->Flink; - } - - return STATUS_UNSUCCESSFUL; -} - - -/* - * Build resource lists for a logical ISA PnP device - */ -static NTSTATUS BuildResourceLists(PISAPNP_LOGICAL_DEVICE LogicalDevice) -{ - ULONG ListSize; - ULONG Priority; - ULONG SingleListSize; - PIO_RESOURCE_LIST p; - NTSTATUS Status; - - ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) - - sizeof(IO_RESOURCE_LIST) - + LogicalDevice->ConfigurationSize; - - DPRINT("Logical device %d ListSize 0x%X ConfigurationSize 0x%X DescriptorCount %d\n", - LogicalDevice->Number, ListSize, - LogicalDevice->ConfigurationSize, - LogicalDevice->DescriptorCount); - - LogicalDevice->ResourceLists = - (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePoolWithTag( - PagedPool, ListSize, TAG_ISAPNP); - if (!LogicalDevice->ResourceLists) - return STATUS_INSUFFICIENT_RESOURCES; - - RtlZeroMemory(LogicalDevice->ResourceLists, ListSize); - - SingleListSize = sizeof(IO_RESOURCE_LIST) + - (LogicalDevice->DescriptorCount - 1) * - sizeof(IO_RESOURCE_DESCRIPTOR); - - DPRINT("SingleListSize %d\n", SingleListSize); - - Priority = 0; - p = &LogicalDevice->ResourceLists->List[0]; - do { - Status = BuildResourceList(LogicalDevice, p, Priority); - if (NT_SUCCESS(Status)) { - p = (PIO_RESOURCE_LIST)((ULONG_PTR)p + SingleListSize); - Priority++; - } - } while (Status != STATUS_NOT_FOUND); - - LogicalDevice->ResourceLists->ListSize = ListSize; - LogicalDevice->ResourceLists->AlternativeLists = Priority + 1; - - return STATUS_SUCCESS; -} - - -/* - * Build resource lists for a ISA PnP card - */ -static NTSTATUS BuildResourceListsForCard(PISAPNP_CARD Card) -{ - PISAPNP_LOGICAL_DEVICE LogicalDevice; - PLIST_ENTRY CurrentEntry; - NTSTATUS Status; - - CurrentEntry = Card->LogicalDevices.Flink; - while (CurrentEntry != &Card->LogicalDevices) { - LogicalDevice = CONTAINING_RECORD( - CurrentEntry, ISAPNP_LOGICAL_DEVICE, CardListEntry); - Status = BuildResourceLists(LogicalDevice); - if (!NT_SUCCESS(Status)) - return Status; - CurrentEntry = CurrentEntry->Flink; - } - - return STATUS_SUCCESS; -} - - -/* - * Build resource lists for all present ISA PnP cards - */ -static NTSTATUS BuildResourceListsForAll( - PISAPNP_DEVICE_EXTENSION DeviceExtension) -{ - PLIST_ENTRY CurrentEntry; - PISAPNP_CARD Card; - NTSTATUS Status; - - CurrentEntry = DeviceExtension->CardListHead.Flink; - while (CurrentEntry != &DeviceExtension->CardListHead) { - Card = CONTAINING_RECORD( - CurrentEntry, ISAPNP_CARD, ListEntry); - Status = BuildResourceListsForCard(Card); - if (!NT_SUCCESS(Status)) - return Status; - CurrentEntry = CurrentEntry->Flink; - } - - return STATUS_SUCCESS; -} - - -/* - * Build device list for all present ISA PnP cards - */ -static NTSTATUS BuildDeviceList(PISAPNP_DEVICE_EXTENSION DeviceExtension) -{ - ULONG csn; - UCHAR header[9], checksum; - PISAPNP_CARD Card; - - DPRINT("Called\n"); - - SendWait(); - SendKey(); - for (csn = 1; csn <= 10; csn++) { - SendWake((UCHAR)csn); - Peek(header, 9); - checksum = Checksum(header); - - if (checksum == 0x00 || checksum != header[8]) /* Invalid CSN */ - continue; - - DPRINT("VENDOR: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", - header[0], header[1], header[2], header[3], - header[4], header[5], header[6], header[7], header[8]); - - Card = (PISAPNP_CARD)ExAllocatePoolWithTag( - PagedPool, sizeof(ISAPNP_CARD), TAG_ISAPNP); - if (!Card) - return STATUS_INSUFFICIENT_RESOURCES; - - RtlZeroMemory(Card, sizeof(ISAPNP_CARD)); - - Card->CardId = (USHORT) csn; - Card->VendorId = (header[1] << 8) | header[0]; - Card->DeviceId = (header[3] << 8) | header[2]; - Card->Serial = (header[7] << 24) | (header[6] << 16) | (header[5] << 8) | header[4]; - - InitializeListHead(&Card->LogicalDevices); - KeInitializeSpinLock(&Card->LogicalDevicesLock); - - ParseResourceMap(DeviceExtension, Card); - - ExInterlockedInsertTailList(&DeviceExtension->CardListHead, - &Card->ListEntry, - &DeviceExtension->GlobalListLock); - } - - return STATUS_SUCCESS; -} - - -static NTSTATUS -ISAPNPQueryBusRelations( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PISAPNP_DEVICE_EXTENSION DeviceExtension; - PISAPNP_LOGICAL_DEVICE LogicalDevice; - PDEVICE_RELATIONS Relations; - PLIST_ENTRY CurrentEntry; - NTSTATUS Status = STATUS_SUCCESS; - ULONG Size; - ULONG i; - - DPRINT("Called\n"); - - DeviceExtension = (PISAPNP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (Irp->IoStatus.Information) { - /* FIXME: Another bus driver has already created a DEVICE_RELATIONS - structure so we must merge this structure with our own */ - } - - Size = sizeof(DEVICE_RELATIONS) + sizeof(Relations->Objects) * - (DeviceExtension->DeviceListCount - 1); - Relations = (PDEVICE_RELATIONS)ExAllocatePoolWithTag(PagedPool, Size, TAG_ISAPNP); - if (!Relations) - return STATUS_INSUFFICIENT_RESOURCES; - - Relations->Count = DeviceExtension->DeviceListCount; - - i = 0; - CurrentEntry = DeviceExtension->DeviceListHead.Flink; - while (CurrentEntry != &DeviceExtension->DeviceListHead) { - LogicalDevice = CONTAINING_RECORD( - CurrentEntry, ISAPNP_LOGICAL_DEVICE, DeviceListEntry); - - if (!LogicalDevice->Pdo) { - /* Create a physical device object for the - device as it does not already have one */ - Status = IoCreateDevice(DeviceObject->DriverObject, 0, - NULL, FILE_DEVICE_CONTROLLER, 0, FALSE, &LogicalDevice->Pdo); - if (!NT_SUCCESS(Status)) { - DPRINT("IoCreateDevice() failed with status 0x%X\n", Status); - ExFreePool(Relations); - return Status; - } - - LogicalDevice->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; - } - - /* Reference the physical device object. The PnP manager - will dereference it again when it is no longer needed */ - ObReferenceObject(LogicalDevice->Pdo); - - Relations->Objects[i] = LogicalDevice->Pdo; - - i++; - - CurrentEntry = CurrentEntry->Flink; - } - - Irp->IoStatus.Information = (ULONG_PTR)Relations; - - return Status; -} - - -static NTSTATUS -ISAPNPQueryDeviceRelations( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PISAPNP_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - - DPRINT("Called\n"); - - DeviceExtension = (PISAPNP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceExtension->State == dsStopped) - return STATUS_UNSUCCESSFUL; - - switch (IrpSp->Parameters.QueryDeviceRelations.Type) { - case BusRelations: - Status = ISAPNPQueryBusRelations(DeviceObject, Irp, IrpSp); - break; - - default: - Status = STATUS_NOT_IMPLEMENTED; - } - - return Status; -} - - -static NTSTATUS -ISAPNPStartDevice( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PISAPNP_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - ULONG NumCards; - - DPRINT("Called\n"); - - DeviceExtension = (PISAPNP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceExtension->State == dsStarted) - return STATUS_SUCCESS; - - NumCards = IsolatePnPCards(); - - DPRINT("Number of ISA PnP cards found: %d\n", NumCards); - - Status = BuildDeviceList(DeviceExtension); - if (!NT_SUCCESS(Status)) { - DPRINT("BuildDeviceList() failed with status 0x%X\n", Status); - return Status; - } - - Status = BuildResourceListsForAll(DeviceExtension); - if (!NT_SUCCESS(Status)) { - DPRINT("BuildResourceListsForAll() failed with status 0x%X\n", Status); - return Status; - } - - DeviceExtension->State = dsStarted; - - return STATUS_SUCCESS; -} - - -static NTSTATUS -ISAPNPStopDevice( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PISAPNP_DEVICE_EXTENSION DeviceExtension; - - DPRINT("Called\n"); - - DeviceExtension = (PISAPNP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceExtension->State != dsStopped) { - /* FIXME: Stop device */ - DeviceExtension->State = dsStopped; - } - - return STATUS_SUCCESS; -} - - -static DRIVER_DISPATCH ISAPNPDispatchOpenClose; -static NTSTATUS +static +NTSTATUS NTAPI -ISAPNPDispatchOpenClose( +ForwardIrpCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context) +{ + if (Irp->PendingReturned) + KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); + + return STATUS_MORE_PROCESSING_REQUIRED; +} + +NTSTATUS +NTAPI +IsaForwardIrpSynchronous( + IN PISAPNP_FDO_EXTENSION FdoExt, + IN PIRP Irp) +{ + KEVENT Event; + NTSTATUS Status; + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + IoCopyCurrentIrpStackLocationToNext(Irp); + + IoSetCompletionRoutine(Irp, ForwardIrpCompletion, &Event, TRUE, TRUE, TRUE); + + Status = IoCallDriver(FdoExt->Ldo, Irp); + if (Status == STATUS_PENDING) + { + Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); + if (NT_SUCCESS(Status)) + Status = Irp->IoStatus.Status; + } + + return Status; +} + + +static +NTSTATUS +NTAPI +IsaCreateClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - DPRINT("Called\n"); - Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = FILE_OPENED; + + DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); + IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } -static DRIVER_DISPATCH ISAPNPDispatchReadWrite; -static NTSTATUS +static +NTSTATUS NTAPI -ISAPNPDispatchReadWrite( - IN PDEVICE_OBJECT PhysicalDeviceObject, +IsaIoctl( + IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - DPRINT("Called\n"); + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; + DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); + + switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) + { + default: + DPRINT1("Unknown ioctl code: %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode); + Status = STATUS_NOT_SUPPORTED; + break; + } + + Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_UNSUCCESSFUL; + return Status; } -static DRIVER_DISPATCH ISAPNPDispatchDeviceControl; -static NTSTATUS +static +NTSTATUS NTAPI -ISAPNPDispatchDeviceControl( +IsaReadWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; - - DPRINT("Called\n"); + DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; Irp->IoStatus.Information = 0; - IrpSp = IoGetCurrentIrpStackLocation(Irp); - switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); - Status = STATUS_NOT_IMPLEMENTED; - break; - } + IoCompleteRequest(Irp, IO_NO_INCREMENT); - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - - return Status; + return STATUS_NOT_SUPPORTED; } -static DRIVER_DISPATCH ISAPNPControl; -static NTSTATUS +static +NTSTATUS NTAPI -ISAPNPControl( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; - - DPRINT("Called\n"); - - IrpSp = IoGetCurrentIrpStackLocation(Irp); - switch (IrpSp->MinorFunction) { - case IRP_MN_QUERY_DEVICE_RELATIONS: - Status = ISAPNPQueryDeviceRelations(DeviceObject, Irp, IrpSp); - break; - - case IRP_MN_START_DEVICE: - Status = ISAPNPStartDevice(DeviceObject, Irp, IrpSp); - break; - - case IRP_MN_STOP_DEVICE: - Status = ISAPNPStopDevice(DeviceObject, Irp, IrpSp); - break; - - case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - /* Nothing to do here */ - DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); - Status = Irp->IoStatus.Status; - break; - - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); - Status = STATUS_NOT_IMPLEMENTED; - break; - } - - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - - return Status; -} - - -static NTSTATUS -NTAPI -ISAPNPAddDevice( +IsaAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject) { - PISAPNP_DEVICE_EXTENSION DeviceExtension; PDEVICE_OBJECT Fdo; + PISAPNP_FDO_EXTENSION FdoExt; NTSTATUS Status; - DPRINT("Called\n"); + DPRINT("%s(%p, %p)\n", __FUNCTION__, DriverObject, PhysicalDeviceObject); - Status = IoCreateDevice(DriverObject, sizeof(ISAPNP_DEVICE_EXTENSION), - NULL, FILE_DEVICE_BUS_EXTENDER, FILE_DEVICE_SECURE_OPEN, TRUE, &Fdo); - if (!NT_SUCCESS(Status)) { - DPRINT("IoCreateDevice() failed with status 0x%X\n", Status); - return Status; + Status = IoCreateDevice(DriverObject, + sizeof(*FdoExt), + NULL, + FILE_DEVICE_BUS_EXTENDER, + FILE_DEVICE_SECURE_OPEN, + TRUE, + &Fdo); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create FDO (0x%x)\n", Status); + return Status; } - DeviceExtension = (PISAPNP_DEVICE_EXTENSION)Fdo->DeviceExtension; + FdoExt = Fdo->DeviceExtension; + RtlZeroMemory(FdoExt, sizeof(*FdoExt)); - DeviceExtension->Pdo = PhysicalDeviceObject; + FdoExt->Common.Self = Fdo; + FdoExt->Common.IsFdo = TRUE; + FdoExt->Common.State = dsStopped; + FdoExt->Pdo = PhysicalDeviceObject; + FdoExt->Ldo = IoAttachDeviceToDeviceStack(Fdo, + PhysicalDeviceObject); - DeviceExtension->Ldo = - IoAttachDeviceToDeviceStack(Fdo, PhysicalDeviceObject); - - InitializeListHead(&DeviceExtension->CardListHead); - InitializeListHead(&DeviceExtension->DeviceListHead); - DeviceExtension->DeviceListCount = 0; - KeInitializeSpinLock(&DeviceExtension->GlobalListLock); - - DeviceExtension->State = dsStopped; + InitializeListHead(&FdoExt->DeviceListHead); + KeInitializeSpinLock(&FdoExt->Lock); Fdo->Flags &= ~DO_DEVICE_INITIALIZING; - DPRINT("Done AddDevice\n"); - return STATUS_SUCCESS; } +static +NTSTATUS +NTAPI +IsaPnp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + PISAPNP_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension; + + DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); + + if (DevExt->IsFdo) + { + return IsaFdoPnp((PISAPNP_FDO_EXTENSION)DevExt, + Irp, + IrpSp); + } + else + { + return IsaPdoPnp((PISAPNP_LOGICAL_DEVICE)DevExt, + Irp, + IrpSp); + } +} NTSTATUS NTAPI @@ -1731,15 +185,15 @@ DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { - DbgPrint("ISA Plug and Play Bus Driver\n"); + DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath); - DriverObject->MajorFunction[IRP_MJ_CREATE] = ISAPNPDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = ISAPNPDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_READ] = ISAPNPDispatchReadWrite; - DriverObject->MajorFunction[IRP_MJ_WRITE] = ISAPNPDispatchReadWrite; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ISAPNPDispatchDeviceControl; - DriverObject->MajorFunction[IRP_MJ_PNP] = ISAPNPControl; - DriverObject->DriverExtension->AddDevice = ISAPNPAddDevice; + DriverObject->MajorFunction[IRP_MJ_CREATE] = IsaCreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = IsaCreateClose; + DriverObject->MajorFunction[IRP_MJ_READ] = IsaReadWrite; + DriverObject->MajorFunction[IRP_MJ_WRITE] = IsaReadWrite; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsaIoctl; + DriverObject->MajorFunction[IRP_MJ_PNP] = IsaPnp; + DriverObject->DriverExtension->AddDevice = IsaAddDevice; return STATUS_SUCCESS; } diff --git a/reactos/drivers/bus/isapnp/isapnp.h b/reactos/drivers/bus/isapnp/isapnp.h index 59697b9848e..85fcb7887f4 100644 --- a/reactos/drivers/bus/isapnp/isapnp.h +++ b/reactos/drivers/bus/isapnp/isapnp.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #ifdef __cplusplus extern "C" { @@ -8,331 +8,88 @@ extern "C" { #define TAG_ISAPNP 'PNPI' -#define IO_RESOURCE_REQUIRED 0x00 //ROS Extension - -#define ISAPNP_ADDRESS_PORT 0x0279 // ADDRESS (W) -#define ISAPNP_WRITE_PORT 0x0A79 // WRITE_DATA (W) -#define ISAPNP_MIN_READ_PORT 0x0203 // READ_DATA (R) -#define ISAPNP_MAX_READ_PORT 0x03FF // READ_DATA (R) - -// Card control registers -#define ISAPNP_CARD_READ_DATA_PORT 0x00 // Set READ_DATA port -#define ISAPNP_CARD_ISOLATION 0x01 // Isolation -#define ISAPNP_CARD_CONFIG_COTROL 0x02 // Configuration control -#define ISAPNP_CARD_WAKECSN 0x03 // Wake[CSN] -#define ISAPNP_CARD_RESOUCE_DATA 0x04 // Resource data port -#define ISAPNP_CARD_STATUS 0x05 // Status port -#define ISAPNP_CARD_CSN 0x06 // Card Select Number port -#define ISAPNP_CARD_LOG_DEVICE_NUM 0x07 // Logical Device Number -#define ISAPNP_CARD_RESERVED 0x08 // Card level reserved -#define ISAPNP_CARD_VENDOR_DEFINED 0x20 // Vendor defined - -// Logical device control registers -#define ISAPNP_CONTROL_ACTIVATE 0x30 // Activate logical device -#define ISAPNP_CONTROL_IO_RANGE_CHECK 0x31 // I/O range conflict check -#define ISAPNP_CONTROL_LDC_RESERVED 0x32 // Logical Device Control reserved -#define ISAPNP_CONTROL_LDCV_RESERVED 0x38 // Logical Device Control Vendor reserved - -// Logical device configuration registers -#define ISAPNP_CONFIG_MEMORY_BASE2 0x00 // Memory base address bits 23-16 -#define ISAPNP_CONFIG_MEMORY_BASE1 0x01 // Memory base address bits 15-8 -#define ISAPNP_CONFIG_MEMORY_CONTROL 0x02 // Memory control -#define ISAPNP_CONFIG_MEMORY_LIMIT2 0x03 // Memory limit bits 23-16 -#define ISAPNP_CONFIG_MEMORY_LIMIT1 0x04 // Memory limit bits 15-8 - -#define ISAPNP_CONFIG_MEMORY_DESC0 0x40 // Memory descriptor 0 -#define ISAPNP_CONFIG_MEMORY_DESC1 0x48 // Memory descriptor 1 -#define ISAPNP_CONFIG_MEMORY_DESC2 0x50 // Memory descriptor 2 -#define ISAPNP_CONFIG_MEMORY_DESC3 0x58 // Memory descriptor 3 - -#define ISAPNP_CONFIG_MEMORY32_BASE3 0x00 // 32-bit memory base address bits 31-24 -#define ISAPNP_CONFIG_MEMORY32_BASE2 0x01 // 32-bit memory base address bits 23-16 -#define ISAPNP_CONFIG_MEMORY32_BASE1 0x01 // 32-bit memory base address bits 15-8 -#define ISAPNP_CONFIG_MEMORY32_CONTROL 0x02 // 32-bit memory control -#define ISAPNP_CONFIG_MEMORY32_LIMIT3 0x03 // 32-bit memory limit bits 31-24 -#define ISAPNP_CONFIG_MEMORY32_LIMIT2 0x04 // 32-bit memory limit bits 23-16 -#define ISAPNP_CONFIG_MEMORY32_LIMIT1 0x05 // 32-bit memory limit bits 15-8 - -#define ISAPNP_CONFIG_MEMORY32_DESC0 0x76 // 32-bit memory descriptor 0 -#define ISAPNP_CONFIG_MEMORY32_DESC1 0x80 // 32-bit memory descriptor 1 -#define ISAPNP_CONFIG_MEMORY32_DESC2 0x90 // 32-bit memory descriptor 2 -#define ISAPNP_CONFIG_MEMORY32_DESC3 0xA0 // 32-bit memory descriptor 3 - -#define ISAPNP_CONFIG_IO_BASE1 0x00 // I/O port base address bits 15-8 -#define ISAPNP_CONFIG_IO_BASE0 0x01 // I/O port base address bits 7-0 - -#define ISAPNP_CONFIG_IO_DESC0 0x60 // I/O port descriptor 0 -#define ISAPNP_CONFIG_IO_DESC1 0x62 // I/O port descriptor 1 -#define ISAPNP_CONFIG_IO_DESC2 0x64 // I/O port descriptor 2 -#define ISAPNP_CONFIG_IO_DESC3 0x66 // I/O port descriptor 3 -#define ISAPNP_CONFIG_IO_DESC4 0x68 // I/O port descriptor 4 -#define ISAPNP_CONFIG_IO_DESC5 0x6A // I/O port descriptor 5 -#define ISAPNP_CONFIG_IO_DESC6 0x6C // I/O port descriptor 6 -#define ISAPNP_CONFIG_IO_DESC7 0x6E // I/O port descriptor 7 - -#define ISAPNP_CONFIG_IRQ_LEVEL0 0x70 // Interupt level for descriptor 0 -#define ISAPNP_CONFIG_IRQ_TYPE0 0x71 // Type level for descriptor 0 -#define ISAPNP_CONFIG_IRQ_LEVEL1 0x72 // Interupt level for descriptor 1 -#define ISAPNP_CONFIG_IRQ_TYPE1 0x73 // Type level for descriptor 1 - -#define ISAPNP_CONFIG_DMA_CHANNEL0 0x74 // DMA channel for descriptor 0 -#define ISAPNP_CONFIG_DMA_CHANNEL1 0x75 // DMA channel for descriptor 1 - - -typedef struct _PNPISA_SERIAL_ID -{ - UCHAR VendorId[4]; // Vendor Identifier - UCHAR SerialId[4]; // Serial number - UCHAR Checksum; // Checksum -} PNPISA_SERIAL_ID, *PPNPISA_SERIAL_ID; - - -#define ISAPNP_RES_PRIORITY_PREFERRED 0 -#define ISAPNP_RES_PRIORITY_ACCEPTABLE 1 -#define ISAPNP_RES_PRIORITY_FUNCTIONAL 2 -#define ISAPNP_RES_PRIORITY_INVALID 65535 - - -#define ISAPNP_RESOURCE_ITEM_TYPE 0x80 // 0 = small, 1 = large - -// Small Resource Item Names (SRINs) -#define ISAPNP_SRIN_VERSION 0x1 // PnP version number -#define ISAPNP_SRIN_LDEVICE_ID 0x2 // Logical device id -#define ISAPNP_SRIN_CDEVICE_ID 0x3 // Compatible device id -#define ISAPNP_SRIN_IRQ_FORMAT 0x4 // IRQ format -#define ISAPNP_SRIN_DMA_FORMAT 0x5 // DMA format -#define ISAPNP_SRIN_START_DFUNCTION 0x6 // Start dependant function -#define ISAPNP_SRIN_END_DFUNCTION 0x7 // End dependant function -#define ISAPNP_SRIN_IO_DESCRIPTOR 0x8 // I/O port descriptor -#define ISAPNP_SRIN_FL_IO_DESCRIPOTOR 0x9 // Fixed location I/O port descriptor -#define ISAPNP_SRIN_VENDOR_DEFINED 0xE // Vendor defined -#define ISAPNP_SRIN_END_TAG 0xF // End tag - -typedef struct _ISAPNP_SRI_VERSION -{ - UCHAR Header; - UCHAR Version; // Packed BCD format version number - UCHAR VendorVersion; // Vendor specific version number -} ISAPNP_SRI_VERSION, *PISAPNP_SRI_VERSION; - -typedef struct _ISAPNP_SRI_LDEVICE_ID -{ - UCHAR Header; - USHORT DeviceId; // Logical device id - USHORT VendorId; // Manufacturer id - UCHAR Flags; // Flags -} ISAPNP_SRI_LDEVICE_ID, *PISAPNP_SRI_LDEVICE_ID; - -typedef struct _ISAPNP_SRI_CDEVICE_ID -{ - UCHAR Header; - USHORT DeviceId; // Logical device id - USHORT VendorId; // Manufacturer id -} ISAPNP_SRI_CDEVICE_ID, *PISAPNP_SRI_CDEVICE_ID; - -typedef struct _ISAPNP_SRI_IRQ_FORMAT -{ - UCHAR Header; - USHORT Mask; // IRQ mask (bit 0 = irq 0, etc.) - UCHAR Information; // IRQ information -} ISAPNP_SRI_IRQ_FORMAT, *PISAPNP_SRI_IRQ_FORMAT; - -typedef struct _ISAPNP_SRI_DMA_FORMAT -{ - UCHAR Header; - USHORT Mask; // DMA channel mask (bit 0 = channel 0, etc.) - UCHAR Information; // DMA information -} ISAPNP_SRI_DMA_FORMAT, *PISAPNP_SRI_DMA_FORMAT; - -typedef struct _ISAPNP_SRI_START_DFUNCTION -{ - UCHAR Header; -} ISAPNP_SRI_START_DFUNCTION, *PISAPNP_SRI_START_DFUNCTION; - -typedef struct _ISAPNP_SRI_END_DFUNCTION -{ - UCHAR Header; -} ISAPNP_SRI_END_DFUNCTION, *PISAPNP_SRI_END_DFUNCTION; - -typedef struct _ISAPNP_SRI_IO_DESCRIPTOR -{ - UCHAR Header; - UCHAR Information; // Information - USHORT RangeMinBase; // Minimum base address - USHORT RangeMaxBase; // Maximum base address - UCHAR Alignment; // Base alignment - UCHAR RangeLength; // Length of range -} ISAPNP_SRI_IO_DESCRIPTOR, *PISAPNP_SRI_IO_DESCRIPTOR; - -typedef struct _ISAPNP_SRI_FL_IO_DESCRIPTOR -{ - UCHAR Header; - USHORT RangeBase; // Range base address - UCHAR RangeLength; // Length of range -} ISAPNP_SRI_FL_IO_DESCRIPTOR, *PISAPNP_SRI_FL_IO_DESCRIPTOR; - -typedef struct _PISAPNP_SRI_VENDOR_DEFINED -{ - UCHAR Header; - UCHAR Reserved[0]; // Vendor defined -} ISAPNP_SRI_VENDOR_DEFINED, *PISAPNP_SRI_VENDOR_DEFINED; - -typedef struct _ISAPNP_SRI_END_TAG -{ - UCHAR Header; - UCHAR Checksum; // Checksum -} ISAPNP_SRI_END_TAG, *PISAPNP_SRI_END_TAG; - - -typedef struct _ISAPNP_LRI -{ - UCHAR Header; - USHORT Length; // Length of data items -} ISAPNP_LRI, *PISAPNP_LRI; - -// Large Resource Item Names (LRINs) -#define ISAPNP_LRIN_MEMORY_RANGE 0x1 // Memory range descriptor -#define ISAPNP_LRIN_ID_STRING_ANSI 0x2 // Identifier string (ANSI) -#define ISAPNP_LRIN_ID_STRING_UNICODE 0x3 // Identifier string (UNICODE) -#define ISAPNP_LRIN_VENDOR_DEFINED 0x4 // Vendor defined -#define ISAPNP_LRIN_MEMORY_RANGE32 0x5 // 32-bit memory range descriptor -#define ISAPNP_LRIN_FL_MEMORY_RANGE32 0x6 // 32-bit fixed location memory range descriptor - -typedef struct _ISAPNP_LRI_MEMORY_RANGE -{ - UCHAR Header; - USHORT Length; // Length of data items - UCHAR Information; // Information - USHORT RangeMinBase; // Minimum base address - USHORT RangeMaxBase; // Maximum base address - USHORT Alignment; // Base alignment - USHORT RangeLength; // Length of range -} ISAPNP_LRI_MEMORY_RANGE, *PISAPNP_LRI_MEMORY_RANGE; - -typedef struct _ISAPNP_LRI_ID_STRING_ANSI -{ - UCHAR Header; - USHORT Length; // Length of data items - UCHAR String[0]; // Identifier string -} ISAPNP_LRI_ID_STRING_ANSI, *PISAPNP_LRI_ID_STRING_ANSI; - -typedef struct _ISAPNP_LRI_ID_STRING_UNICODE -{ - UCHAR Header; - USHORT Length; // Length of data items - USHORT CountryId; // Country identifier - USHORT String[0]; // Identifier string -} ISAPNP_LRI_ID_STRING_UNICODE, *PISAPNP_LRI_ID_STRING_UNICODE; - -typedef struct _PISAPNP_LRI_VENDOR_DEFINED -{ - UCHAR Header; - USHORT Length; // Length of data items - UCHAR Reserved[0]; // Vendor defined -} ISAPNP_LRI_VENDOR_DEFINED, *PISAPNP_LRI_VENDOR_DEFINED; - -typedef struct _ISAPNP_LRI_MEMORY_RANGE32 -{ - UCHAR Header; - USHORT Length; // Length of data items - UCHAR Information; // Information - ULONG RangeMinBase; // Minimum base address - ULONG RangeMaxBase; // Maximum base address - ULONG Alignment; // Base alignment - ULONG RangeLength; // Length of range -} ISAPNP_LRI_MEMORY_RANGE32, *PISAPNP_LRI_MEMORY_RANGE32; - -typedef struct _ISAPNP_LRI_FL_MEMORY_RANGE32 -{ - UCHAR Header; - USHORT Length; // Length of data items - UCHAR Information; // Information - ULONG RangeMinBase; // Minimum base address - ULONG RangeMaxBase; // Maximum base address - ULONG RangeLength; // Length of range -} ISAPNP_LRI_FL_MEMORY_RANGE32, *PISAPNP_LRI_FL_MEMORY_RANGE32; - -typedef struct _ISAPNP_CARD -{ - LIST_ENTRY ListEntry; - USHORT CardId; - USHORT VendorId; - USHORT DeviceId; - ULONG Serial; - UCHAR PNPVersion; - UCHAR ProductVersion; - UNICODE_STRING Name; - LIST_ENTRY LogicalDevices; - KSPIN_LOCK LogicalDevicesLock; -} ISAPNP_CARD, *PISAPNP_CARD; - - -typedef struct _ISAPNP_DESCRIPTOR -{ - LIST_ENTRY ListEntry; - IO_RESOURCE_DESCRIPTOR Descriptor; -} ISAPNP_DESCRIPTOR, *PISAPNP_DESCRIPTOR; - -typedef struct _ISAPNP_CONFIGURATION_LIST -{ - LIST_ENTRY ListEntry; - ULONG Priority; - LIST_ENTRY ListHead; -} ISAPNP_CONFIGURATION_LIST, *PISAPNP_CONFIGURATION_LIST; - - -#define MAX_COMPATIBLE_ID 32 - -typedef struct _ISAPNP_LOGICAL_DEVICE -{ - LIST_ENTRY CardListEntry; - LIST_ENTRY DeviceListEntry; - USHORT Number; - USHORT VendorId; - USHORT DeviceId; - USHORT CVendorId[MAX_COMPATIBLE_ID]; - USHORT CDeviceId[MAX_COMPATIBLE_ID]; - USHORT Regs; - PISAPNP_CARD Card; - UNICODE_STRING Name; - PDEVICE_OBJECT Pdo; - PIO_RESOURCE_REQUIREMENTS_LIST ResourceLists; - LIST_ENTRY Configuration; - ULONG ConfigurationSize; - ULONG DescriptorCount; - ULONG CurrentDescriptorCount; -} ISAPNP_LOGICAL_DEVICE, *PISAPNP_LOGICAL_DEVICE; - - typedef enum { dsStopped, dsStarted } ISAPNP_DEVICE_STATE; -typedef struct _ISAPNP_DEVICE_EXTENSION -{ - // Physical Device Object - PDEVICE_OBJECT Pdo; - // Lower device object - PDEVICE_OBJECT Ldo; - // List of ISA PnP cards managed by this driver - LIST_ENTRY CardListHead; - // List of devices managed by this driver - LIST_ENTRY DeviceListHead; - // Number of devices managed by this driver - ULONG DeviceListCount; - // Spinlock for the linked lists - KSPIN_LOCK GlobalListLock; - // Current state of the driver +typedef struct _ISAPNP_COMMON_EXTENSION { + PDEVICE_OBJECT Self; + BOOLEAN IsFdo; ISAPNP_DEVICE_STATE State; -} ISAPNP_DEVICE_EXTENSION, *PISAPNP_DEVICE_EXTENSION; +} ISAPNP_COMMON_EXTENSION, *PISAPNP_COMMON_EXTENSION; +typedef struct _ISAPNP_FDO_EXTENSION { + ISAPNP_COMMON_EXTENSION Common; + PDEVICE_OBJECT Ldo; + PDEVICE_OBJECT Pdo; + LIST_ENTRY DeviceListHead; + ULONG DeviceCount; + PUCHAR ReadDataPort; + KSPIN_LOCK Lock; +} ISAPNP_FDO_EXTENSION, *PISAPNP_FDO_EXTENSION; + +typedef struct _ISAPNP_LOGICAL_DEVICE { + ISAPNP_COMMON_EXTENSION Common; + USHORT VendorId; + USHORT ProdId; + USHORT IoAddr; + UCHAR IrqNo; + UCHAR CSN; + UCHAR LDN; + LIST_ENTRY ListEntry; +} ISAPNP_LOGICAL_DEVICE, *PISAPNP_LOGICAL_DEVICE; + +/* isapnp.c */ NTSTATUS NTAPI DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath); +NTSTATUS +NTAPI +IsaForwardIrpSynchronous( + IN PISAPNP_FDO_EXTENSION FdoExt, + IN PIRP Irp); + +/* fdo.c */ +NTSTATUS +NTAPI +IsaFdoPnp( + IN PISAPNP_FDO_EXTENSION FdoExt, + IN PIRP Irp, + IN PIO_STACK_LOCATION IrpSp); + +/* pdo.c */ +NTSTATUS +NTAPI +IsaPdoPnp( + IN PISAPNP_LOGICAL_DEVICE LogDev, + IN PIRP Irp, + IN PIO_STACK_LOCATION IrpSp); + +/* hardware.c */ +NTSTATUS +NTAPI +IsaHwDetectReadDataPort( + IN PISAPNP_FDO_EXTENSION FdoExt); + +NTSTATUS +NTAPI +IsaHwFillDeviceList( + IN PISAPNP_FDO_EXTENSION FdoExt); + +NTSTATUS +NTAPI +IsaHwDeactivateDevice( + IN PISAPNP_LOGICAL_DEVICE LogicalDevice); + +NTSTATUS +NTAPI +IsaHwActivateDevice( + IN PISAPNP_LOGICAL_DEVICE LogicalDevice); + #ifdef __cplusplus } #endif diff --git a/reactos/drivers/bus/isapnp/isapnp.rbuild b/reactos/drivers/bus/isapnp/isapnp.rbuild index b0b7919d927..bc8a96acaf7 100644 --- a/reactos/drivers/bus/isapnp/isapnp.rbuild +++ b/reactos/drivers/bus/isapnp/isapnp.rbuild @@ -1,9 +1,13 @@ + . ntoskrnl hal isapnp.c + pdo.c + fdo.c + hardware.c isapnp.rc diff --git a/reactos/drivers/bus/isapnp/isapnphw.h b/reactos/drivers/bus/isapnp/isapnphw.h new file mode 100644 index 00000000000..aec87191fe5 --- /dev/null +++ b/reactos/drivers/bus/isapnp/isapnphw.h @@ -0,0 +1,106 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define ISAPNP_ADDRESS 0x279 +#define ISAPNP_WRITE_DATA 0xA79 + +#define ISAPNP_READ_PORT_MIN 0x203 +#define ISAPNP_READ_PORT_START 0x213 +#define ISAPNP_READ_PORT_MAX 0x3FF +#define ISAPNP_READ_PORT_STEP 0x10 + +#define ISAPNP_CSN_MIN 0x01 +#define ISAPNP_CSN_MAX 0x0F + +#define ISAPNP_READPORT 0x00 +#define ISAPNP_SERIALISOLATION 0x01 +#define ISAPNP_CONFIGCONTROL 0x02 +#define ISAPNP_WAKE 0x03 +#define ISAPNP_RESOURCEDATA 0x04 +#define ISAPNP_STATUS 0x05 +#define ISAPNP_CARDSELECTNUMBER 0x06 +#define ISAPNP_LOGICALDEVICENUMBER 0x07 + +#define ISAPNP_ACTIVATE 0x30 +#define ISAPNP_IORANGECHECK 0x31 + +#define ISAPNP_IOBASE(n) (0x60 + ((n)*2)) +#define ISAPNP_IRQNO(n) (0x70 + ((n)*2)) +#define ISAPNP_IRQTYPE(n) (0x71 + ((n) * 2)) + +#define ISAPNP_CONFIG_RESET (1 << 0) +#define ISAPNP_CONFIG_WAIT_FOR_KEY (1 << 1) +#define ISAPNP_CONFIG_RESET_CSN (1 << 2) + +#define ISAPNP_LFSR_SEED 0x6A + +#define ISAPNP_IS_SMALL_TAG(t) (!((t) & 0x80)) +#define ISAPNP_SMALL_TAG_NAME(t) (((t) >> 3) & 0xF) +#define ISAPNP_SMALL_TAG_LEN(t) (((t) & 0x7)) +#define ISAPNP_TAG_PNPVERNO 0x01 +#define ISAPNP_TAG_LOGDEVID 0x02 +#define ISAPNP_TAG_COMPATDEVID 0x03 +#define ISAPNP_TAG_IRQ 0x04 +#define ISAPNP_TAG_DMA 0x05 +#define ISAPNP_TAG_STARTDEP 0x06 +#define ISAPNP_TAG_ENDDEP 0x07 +#define ISAPNP_TAG_IOPORT 0x08 +#define ISAPNP_TAG_FIXEDIO 0x09 +#define ISAPNP_TAG_RSVDSHORTA 0x0A +#define ISAPNP_TAG_RSVDSHORTB 0x0B +#define ISAPNP_TAG_RSVDSHORTC 0x0C +#define ISAPNP_TAG_RSVDSHORTD 0x0D +#define ISAPNP_TAG_VENDORSHORT 0x0E +#define ISAPNP_TAG_END 0x0F + +#define ISAPNP_IS_LARGE_TAG(t) (((t) & 0x80)) +#define ISAPNP_LARGE_TAG_NAME(t) (t) +#define ISAPNP_TAG_MEMRANGE 0x81 +#define ISAPNP_TAG_ANSISTR 0x82 +#define ISAPNP_TAG_UNICODESTR 0x83 +#define ISAPNP_TAG_VENDORLONG 0x84 +#define ISAPNP_TAG_MEM32RANGE 0x85 +#define ISAPNP_TAG_FIXEDMEM32RANGE 0x86 +#define ISAPNP_TAG_RSVDLONG0 0xF0 +#define ISAPNP_TAG_RSVDLONG1 0xF1 +#define ISAPNP_TAG_RSVDLONG2 0xF2 +#define ISAPNP_TAG_RSVDLONG3 0xF3 +#define ISAPNP_TAG_RSVDLONG4 0xF4 +#define ISAPNP_TAG_RSVDLONG5 0xF5 +#define ISAPNP_TAG_RSVDLONG6 0xF6 +#define ISAPNP_TAG_RSVDLONG7 0xF7 +#define ISAPNP_TAG_RSVDLONG8 0xF8 +#define ISAPNP_TAG_RSVDLONG9 0xF9 +#define ISAPNP_TAG_RSVDLONGA 0xFA +#define ISAPNP_TAG_RSVDLONGB 0xFB +#define ISAPNP_TAG_RSVDLONGC 0xFC +#define ISAPNP_TAG_RSVDLONGD 0xFD +#define ISAPNP_TAG_RSVDLONGE 0xFE +#define ISAPNP_TAG_RSVDLONGF 0xFF +#define ISAPNP_TAG_PSEUDO_NEWBOARD 0x100 + +typedef struct _ISAPNP_IDENTIFIER { + USHORT VendorId; + USHORT ProdId; + ULONG Serial; + UCHAR Checksum; +} ISAPNP_IDENTIFIER, *PISAPNP_IDENTIFIER; + +typedef struct _ISAPNP_LOGDEVID { + USHORT VendorId; + USHORT ProdId; + USHORT Flags; +} ISAPNP_LOGDEVID, *PISAPNP_LOGDEVID; + +typedef struct _ISAPNP_DEVICEID { + CHAR* Name; + USHORT VendorId; + USHORT ProdId; +} ISAPNP_DEVICEID, *PISAPNP_DEVICEID; + +#ifdef __cplusplus +} +#endif diff --git a/reactos/drivers/bus/isapnp/pdo.c b/reactos/drivers/bus/isapnp/pdo.c new file mode 100644 index 00000000000..0292f20f0f4 --- /dev/null +++ b/reactos/drivers/bus/isapnp/pdo.c @@ -0,0 +1,83 @@ +/* + * PROJECT: ReactOS ISA PnP Bus driver + * FILE: pdo.c + * PURPOSE: PDO-specific code + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ +#include + +#define NDEBUG +#include + +NTSTATUS +NTAPI +IsaPdoQueryDeviceRelations( + IN PISAPNP_LOGICAL_DEVICE LogDev, + IN PIRP Irp, + IN PIO_STACK_LOCATION IrpSp) +{ + PDEVICE_RELATIONS DeviceRelations; + + if (IrpSp->Parameters.QueryDeviceRelations.Type != TargetDeviceRelation) + return Irp->IoStatus.Status; + + DeviceRelations = ExAllocatePool(PagedPool, sizeof(*DeviceRelations)); + if (!DeviceRelations) + return STATUS_INSUFFICIENT_RESOURCES; + + DeviceRelations->Count = 1; + DeviceRelations->Objects[0] = LogDev->Common.Self; + ObReferenceObject(LogDev->Common.Self); + + Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations; + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +IsaPdoPnp( + IN PISAPNP_LOGICAL_DEVICE LogDev, + IN PIRP Irp, + IN PIO_STACK_LOCATION IrpSp) +{ + NTSTATUS Status = Irp->IoStatus.Status; + + switch (IrpSp->MinorFunction) + { + case IRP_MN_START_DEVICE: + Status = IsaHwActivateDevice(LogDev); + + if (NT_SUCCESS(Status)) + LogDev->Common.State = dsStarted; + break; + + case IRP_MN_STOP_DEVICE: + Status = IsaHwDeactivateDevice(LogDev); + + if (NT_SUCCESS(Status)) + LogDev->Common.State = dsStopped; + break; + + case IRP_MN_QUERY_DEVICE_RELATIONS: + Status = IsaPdoQueryDeviceRelations(LogDev, Irp, IrpSp); + break; + + case IRP_MN_QUERY_RESOURCES: + DPRINT1("IRP_MN_QUERY_RESOURCES is UNIMPLEMENTED!\n"); + break; + + case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: + DPRINT1("IRP_MN_QUERY_RESOURCE_REQUIREMENTS is UNIMPLEMENTED!\n"); + break; + + default: + DPRINT1("Unknown PnP code: %x\n", IrpSp->MinorFunction); + break; + } + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; +} From 2f488e47553d1173a56ebea14fae2e8f99efdecf Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 7 Apr 2010 20:20:22 +0000 Subject: [PATCH 070/261] [INF] - Reenable isapnp svn path=/trunk/; revision=46769 --- reactos/media/inf/machine.inf | Bin 45620 -> 45566 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/machine.inf b/reactos/media/inf/machine.inf index ecc90375e8d1de8d54b6cc66e14fa58f09e17e72..ce3f8658bd0285b1ad9b8532e5acf16a8fb95ffb 100644 GIT binary patch delta 31 ncmdn;gz4X7rVT10lO2SlCOe1(O+Fybw)vb$%3PNJ|F{?c)P@YN delta 35 rcmezOm}$!srVT10jMkIwg`_9ji3Ckn5s{i4C8V@@nn=oACN2g5>ZA)u From b270d2cf888a2b24764f09c2cbc7a73639790593 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 7 Apr 2010 20:37:13 +0000 Subject: [PATCH 071/261] [HAL] - Remove an unnecessary hack now that PnP manager doesn't suck (as much ;)) svn path=/trunk/; revision=46770 --- reactos/hal/halx86/generic/acpi/halpnpdd.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/reactos/hal/halx86/generic/acpi/halpnpdd.c b/reactos/hal/halx86/generic/acpi/halpnpdd.c index ca85188bcaf..8617b20f1fc 100644 --- a/reactos/hal/halx86/generic/acpi/halpnpdd.c +++ b/reactos/hal/halx86/generic/acpi/halpnpdd.c @@ -848,9 +848,6 @@ HalpDriverEntry(IN PDRIVER_OBJECT DriverObject, /* Now add us */ if (NT_SUCCESS(Status)) Status = HalpAddDevice(DriverObject, TargetDevice); - - /* Force re-enumeration??? */ - IoInvalidateDeviceRelations(TargetDevice, 0); /* Return to kernel */ return Status; From 8cc9a982b587dd26e24bc5976c3012c2d253a13e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 7 Apr 2010 21:04:41 +0000 Subject: [PATCH 072/261] [RAMDISK] - Remove another unnecessary hack svn path=/trunk/; revision=46771 --- reactos/drivers/storage/class/ramdisk/ramdisk.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/reactos/drivers/storage/class/ramdisk/ramdisk.c b/reactos/drivers/storage/class/ramdisk/ramdisk.c index 1ebe19664c8..6a353bc264e 100644 --- a/reactos/drivers/storage/class/ramdisk/ramdisk.c +++ b/reactos/drivers/storage/class/ramdisk/ramdisk.c @@ -2422,18 +2422,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, 0, &PhysicalDeviceObject); if (NT_SUCCESS(Status)) - { - // - // ReactOS Fix - // The ReactOS Plug and Play Manager is broken and does not create - // the required keys when reporting a detected device. - // We hack around this ourselves. - // - RtlCreateUnicodeString(&((PEXTENDED_DEVOBJ_EXTENSION) - PhysicalDeviceObject->DeviceObjectExtension) - ->DeviceNode->InstancePath, - L"Root\\UNKNOWN\\0000"); - + { // // Create the device object // From 07e1066306e216ebadc4ae1a9af8e79f7af86b97 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 7 Apr 2010 21:45:25 +0000 Subject: [PATCH 073/261] [KS] - Implement IKsDevice::GetAdapterObject, IKsDevice::ArbitrateAdapterChannel - Store device interface guid in the symbolic link list entry, which is used by KsFilterFactoryUpdateCacheData - Implement KsFilterFactoryUpdateCacheData, which is used to dynamically propagate format / medium changes to directshow components - Move stream pointer preparation to an own function, which is called by KsPinGetLeadingEdgeStreamPointer / KsStreamPointerClone / KsStreamPointerAdvanceOffsets - Fix locating correct offset in KsStreamPointerScheduleTimeout, KsStreamPointerCancelTimeout, KsStreamPointerGetNextClone - Further BDA support is on hold until ReactOS supports s/g in hal svn path=/trunk/; revision=46774 --- reactos/drivers/ksfilter/ks/device.c | 46 +- reactos/drivers/ksfilter/ks/deviceinterface.c | 4 + reactos/drivers/ksfilter/ks/filterfactory.c | 248 ++++++++++- reactos/drivers/ksfilter/ks/ksiface.h | 6 +- reactos/drivers/ksfilter/ks/kstypes.h | 51 +++ reactos/drivers/ksfilter/ks/pin.c | 419 ++++++++++++------ reactos/drivers/ksfilter/ks/priv.h | 6 +- 7 files changed, 623 insertions(+), 157 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c index cf1d3f73216..982b717e7c8 100644 --- a/reactos/drivers/ksfilter/ks/device.c +++ b/reactos/drivers/ksfilter/ks/device.c @@ -112,14 +112,15 @@ NTSTATUS NTAPI IKsDevice_fnGetAdapterObject( IN IKsDevice * iface, - IN PADAPTER_OBJECT Object, + IN PADAPTER_OBJECT * Object, IN PULONG Unknown1, IN PULONG Unknown2) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + *Object = This->AdapterObject; + + return STATUS_SUCCESS; } @@ -169,15 +170,24 @@ NTSTATUS NTAPI IKsDevice_fnArbitrateAdapterChannel( IN IKsDevice * iface, - IN ULONG ControlCode, - IN IO_ALLOCATION_ACTION Action, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine, IN PVOID Context) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + NTSTATUS Status; - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + DPRINT("IKsDevice_fnArbitrateAdapterChannel NumberOfMapRegisters %lu ExecutionRoutine %p Context %p Irql %lu\n", NumberOfMapRegisters, ExecutionRoutine, Context, KeGetCurrentIrql()); + /* sanity check */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(This->AdapterObject); + + /* allocate adapter channel */ + Status = IoAllocateAdapterChannel(This->AdapterObject, This->KsDevice.FunctionalDeviceObject, NumberOfMapRegisters, ExecutionRoutine, Context); + + /* done */ + return Status; } NTSTATUS @@ -518,7 +528,6 @@ IKsDevice_Pnp( Status = KspForwardIrpSynchronous(DeviceObject, Irp); DPRINT1("IRP_MN_QUERY_INTERFACE Next Device: Status %x\n", Status); - Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; @@ -687,6 +696,23 @@ KsInitializeDevice( DPRINT("DeviceHeader %p\n", DeviceExtension->DeviceHeader); + if (Descriptor && Descriptor->Dispatch) + { + DPRINT("Descriptor Add %p\n", Descriptor->Dispatch->Add); + DPRINT("Descriptor Start %p\n", Descriptor->Dispatch->Start); + DPRINT("Descriptor PostStart %p\n", Descriptor->Dispatch->PostStart); + DPRINT("Descriptor QueryStop %p\n", Descriptor->Dispatch->QueryStop); + DPRINT("Descriptor CancelStop %p\n", Descriptor->Dispatch->CancelStop); + DPRINT("Descriptor Stop %p\n", Descriptor->Dispatch->Stop); + DPRINT("Descriptor QueryRemove %p\n", Descriptor->Dispatch->QueryRemove); + DPRINT("Descriptor CancelRemove %p\n", Descriptor->Dispatch->CancelRemove); + DPRINT("Descriptor Remove %p\n", Descriptor->Dispatch->Remove); + DPRINT("Descriptor QueryCapabilities %p\n", Descriptor->Dispatch->QueryCapabilities); + DPRINT("Descriptor SurpriseRemoval %p\n", Descriptor->Dispatch->SurpriseRemoval); + DPRINT("Descriptor QueryPower %p\n", Descriptor->Dispatch->QueryPower); + DPRINT("Descriptor SetPower %p\n", Descriptor->Dispatch->SetPower); + DPRINT("Descriptor QueryInterface %p\n", Descriptor->Dispatch->QueryInterface); + } /* check for success */ if (!NT_SUCCESS(Status)) diff --git a/reactos/drivers/ksfilter/ks/deviceinterface.c b/reactos/drivers/ksfilter/ks/deviceinterface.c index cd0ffe274bb..c1fdff8470b 100644 --- a/reactos/drivers/ksfilter/ks/deviceinterface.c +++ b/reactos/drivers/ksfilter/ks/deviceinterface.c @@ -90,6 +90,10 @@ KspRegisterDeviceInterfaces( /* return result */ return Status; } + + /* copy device class */ + RtlMoveMemory(&SymEntry->DeviceInterfaceClass, &Categories[Index], sizeof(CLSID)); + /* insert symbolic link entry */ InsertTailList(SymbolicLinkList, &SymEntry->Entry); } diff --git a/reactos/drivers/ksfilter/ks/filterfactory.c b/reactos/drivers/ksfilter/ks/filterfactory.c index 18b2147b679..0e15bb76f3c 100644 --- a/reactos/drivers/ksfilter/ks/filterfactory.c +++ b/reactos/drivers/ksfilter/ks/filterfactory.c @@ -469,19 +469,261 @@ KsFilterFactoryAddCreateItem( return KsAllocateObjectCreateItem((KSDEVICE_HEADER)Factory->DeviceHeader, &CreateItem, TRUE, IKsFilterFactory_ItemFreeCb); } +ULONG +KspCacheAddData( + PKSPCACHE_DESCRIPTOR Descriptor, + LPCVOID Data, + ULONG Length) +{ + ULONG Index; + + for(Index = 0; Index < Descriptor->DataOffset; Index++) + { + if (RtlCompareMemory(Descriptor->DataCache, Data, Length) == Length) + { + if (Index + Length > Descriptor->DataOffset) + { + /* adjust used space */ + Descriptor->DataOffset = Index + Length; + /* return absolute offset */ + return Descriptor->DataLength + Index; + } + } + } + + /* sanity check */ + ASSERT(Descriptor->DataOffset + Length < Descriptor->DataLength); + + /* copy to data blob */ + RtlMoveMemory((Descriptor->DataCache + Descriptor->DataOffset), Data, Length); + + /* backup offset */ + Index = Descriptor->DataOffset; + + /* adjust used space */ + Descriptor->DataOffset += Length; + + /* return absolute offset */ + return Descriptor->DataLength + Index; +} + /* @implemented */ KSDDKAPI NTSTATUS NTAPI -KsFilterFactoryUpdateCacheData ( +KsFilterFactoryUpdateCacheData( IN PKSFILTERFACTORY FilterFactory, IN const KSFILTER_DESCRIPTOR* FilterDescriptor OPTIONAL) { - UNIMPLEMENTED + KSPCACHE_DESCRIPTOR Descriptor; + PKSPCACHE_FILTER_HEADER FilterHeader; + UNICODE_STRING FilterData = RTL_CONSTANT_STRING(L"FilterData"); + PKSPCACHE_PIN_HEADER PinHeader; + ULONG Index, SubIndex; + PLIST_ENTRY Entry; + PSYMBOLIC_LINK_ENTRY SymEntry; + BOOLEAN Found; + HKEY hKey; + NTSTATUS Status = STATUS_SUCCESS; + + IKsFilterFactoryImpl * Factory = (IKsFilterFactoryImpl*)CONTAINING_RECORD(FilterFactory, IKsFilterFactoryImpl, FilterFactory); + DPRINT("KsFilterFactoryUpdateCacheData %p\n", FilterDescriptor); - return STATUS_SUCCESS; + if (!FilterDescriptor) + FilterDescriptor = Factory->FilterFactory.FilterDescriptor; + + ASSERT(FilterDescriptor); + + /* initialize cache descriptor */ + RtlZeroMemory(&Descriptor, sizeof(KSPCACHE_DESCRIPTOR)); + + /* calculate filter data size */ + Descriptor.FilterLength = sizeof(KSPCACHE_FILTER_HEADER); + + /* FIXME support variable size pin descriptors */ + ASSERT(FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); + + for(Index = 0; Index < FilterDescriptor->PinDescriptorsCount; Index++) + { + /* add filter descriptor */ + Descriptor.FilterLength += sizeof(KSPCACHE_PIN_HEADER); + + if (FilterDescriptor->PinDescriptors[Index].PinDescriptor.Category) + { + /* add extra ULONG for offset to category */ + Descriptor.FilterLength += sizeof(ULONG); + + /* add size for clsid */ + Descriptor.DataLength += sizeof(CLSID); + } + + /* add space for formats */ + Descriptor.FilterLength += FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRangesCount * sizeof(KSPCACHE_DATARANGE); + + /* add space for MajorFormat / MinorFormat */ + Descriptor.DataLength += FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRangesCount * sizeof(CLSID) * 2; + + /* add space for mediums */ + Descriptor.FilterLength += FilterDescriptor->PinDescriptors[Index].PinDescriptor.MediumsCount * sizeof(ULONG); + + /* add space for the data */ + Descriptor.DataLength += FilterDescriptor->PinDescriptors[Index].PinDescriptor.MediumsCount * sizeof(KSPCACHE_MEDIUM); + } + + /* now allocate the space */ + Descriptor.FilterData = (PUCHAR)AllocateItem(NonPagedPool, Descriptor.DataLength + Descriptor.FilterLength); + if (!Descriptor.FilterData) + { + /* no memory */ + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* initialize data cache */ + Descriptor.DataCache = (PUCHAR)((ULONG_PTR)Descriptor.FilterData + Descriptor.FilterLength); + + /* setup filter header */ + FilterHeader = (PKSPCACHE_FILTER_HEADER)Descriptor.FilterData; + + FilterHeader->dwVersion = 2; + FilterHeader->dwMerit = MERIT_DO_NOT_USE; + FilterHeader->dwUnused = 0; + FilterHeader->dwPins = FilterDescriptor->PinDescriptorsCount; + + Descriptor.FilterOffset = sizeof(KSPCACHE_FILTER_HEADER); + + /* write pin headers */ + for(Index = 0; Index < FilterDescriptor->PinDescriptorsCount; Index++) + { + /* get offset to pin */ + PinHeader = (PKSPCACHE_PIN_HEADER)((ULONG_PTR)Descriptor.FilterData + Descriptor.FilterOffset); + + /* write pin header */ + PinHeader->Signature = 0x33697030 + Index; + PinHeader->Flags = 0; + PinHeader->Instances = FilterDescriptor->PinDescriptors[Index].InstancesPossible; + if (PinHeader->Instances > 1) + PinHeader->Flags |= REG_PINFLAG_B_MANY; + + + PinHeader->MediaTypes = FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRangesCount; + PinHeader->Mediums = FilterDescriptor->PinDescriptors[Index].PinDescriptor.MediumsCount; + PinHeader->Category = (FilterDescriptor->PinDescriptors[Index].PinDescriptor.Category ? TRUE : FALSE); + + Descriptor.FilterOffset += sizeof(KSPCACHE_PIN_HEADER); + + if (PinHeader->Category) + { + /* get category offset */ + PULONG Category = (PULONG)(PinHeader + 1); + + /* write category offset */ + *Category = KspCacheAddData(&Descriptor, FilterDescriptor->PinDescriptors[Index].PinDescriptor.Category, sizeof(CLSID)); + + /* adjust offset */ + Descriptor.FilterOffset += sizeof(ULONG); + } + + /* add dataranges */ + for(SubIndex = 0; SubIndex < FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRangesCount; SubIndex++) + { + /* get datarange offset */ + PKSPCACHE_DATARANGE DataRange = (PKSPCACHE_DATARANGE)((ULONG_PTR)Descriptor.FilterData + Descriptor.FilterOffset); + + /* initialize data range */ + DataRange->Signature = 0x33797430 + SubIndex; + DataRange->dwUnused = 0; + DataRange->OffsetMajor = KspCacheAddData(&Descriptor, &FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRanges[SubIndex]->MajorFormat, sizeof(CLSID)); + DataRange->OffsetMinor = KspCacheAddData(&Descriptor, &FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRanges[SubIndex]->SubFormat, sizeof(CLSID)); + + /* adjust offset */ + Descriptor.FilterOffset += sizeof(KSPCACHE_DATARANGE); + } + + /* add mediums */ + for(SubIndex = 0; SubIndex < FilterDescriptor->PinDescriptors[Index].PinDescriptor.MediumsCount; SubIndex++) + { + KSPCACHE_MEDIUM Medium; + PULONG MediumOffset; + + /* get pin medium offset */ + MediumOffset = (PULONG)((ULONG_PTR)Descriptor.FilterData + Descriptor.FilterOffset); + + /* copy medium guid */ + RtlMoveMemory(&Medium.Medium, &FilterDescriptor->PinDescriptors[Index].PinDescriptor.Mediums[SubIndex].Set, sizeof(GUID)); + Medium.dw1 = FilterDescriptor->PinDescriptors[Index].PinDescriptor.Mediums[SubIndex].Id; /* FIXME verify */ + Medium.dw2 = 0; + + *MediumOffset = KspCacheAddData(&Descriptor, &Medium, sizeof(KSPCACHE_MEDIUM)); + + /* adjust offset */ + Descriptor.FilterOffset += sizeof(ULONG); + } + } + + /* sanity checks */ + ASSERT(Descriptor.FilterOffset == Descriptor.FilterLength); + ASSERT(Descriptor.DataOffset <= Descriptor.DataLength); + + + /* now go through all entries and update 'FilterData' key */ + for(Index = 0; Index < FilterDescriptor->CategoriesCount; Index++) + { + /* get first entry */ + Entry = Factory->SymbolicLinkList.Flink; + + /* set status to not found */ + Found = FALSE; + /* loop list until the the current category is found */ + while(Entry != &Factory->SymbolicLinkList) + { + /* fetch symbolic link entry */ + SymEntry = (PSYMBOLIC_LINK_ENTRY)CONTAINING_RECORD(Entry, SYMBOLIC_LINK_ENTRY, Entry); + + if (IsEqualGUIDAligned(&SymEntry->DeviceInterfaceClass, &FilterDescriptor->Categories[Index])) + { + /* found category */ + Found = TRUE; + break; + } + + /* move to next entry */ + Entry = Entry->Flink; + } + + if (!Found) + { + /* filter category is not present */ + Status = STATUS_INVALID_PARAMETER; + break; + } + + /* now open device interface */ + Status = IoOpenDeviceInterfaceRegistryKey(&SymEntry->SymbolicLink, KEY_WRITE, &hKey); + if (!NT_SUCCESS(Status)) + { + /* failed to open interface key */ + break; + } + + /* update filterdata key */ + Status = ZwSetValueKey(hKey, &FilterData, 0, REG_BINARY, Descriptor.FilterData, Descriptor.FilterLength + Descriptor.DataOffset); + + /* close filterdata key */ + ZwClose(hKey); + + if (!NT_SUCCESS(Status)) + { + /* failed to set key value */ + break; + } + } + /* free filter data */ + FreeItem(Descriptor.FilterData); + + /* done */ + return Status; } diff --git a/reactos/drivers/ksfilter/ks/ksiface.h b/reactos/drivers/ksfilter/ks/ksiface.h index ffea3ed8a7c..0977886beaf 100644 --- a/reactos/drivers/ksfilter/ks/ksiface.h +++ b/reactos/drivers/ksfilter/ks/ksiface.h @@ -282,7 +282,7 @@ DECLARE_INTERFACE_(IKsDevice, IUnknown) STDMETHOD_(NTSTATUS,ReleaseDevice)(THIS) PURE; STDMETHOD_(NTSTATUS, GetAdapterObject)(THIS_ - IN PADAPTER_OBJECT Object, + IN PADAPTER_OBJECT * Object, IN PULONG Unknown1, IN PULONG Unknown2) PURE; @@ -300,8 +300,8 @@ DECLARE_INTERFACE_(IKsDevice, IUnknown) IN KSSTATE NewState)PURE; STDMETHOD_(NTSTATUS, ArbitrateAdapterChannel)(THIS_ - IN ULONG ControlCode, - IN IO_ALLOCATION_ACTION Action, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine, IN PVOID Context)PURE; STDMETHOD_(NTSTATUS, CheckIoCapability)(THIS_ diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index d5c7588fda1..51b365aaaad 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -108,6 +108,8 @@ typedef struct LIST_ENTRY PowerDispatchList; LIST_ENTRY ObjectBags; + PADAPTER_OBJECT AdapterObject; + }KSIDEVICE_HEADER, *PKSIDEVICE_HEADER; typedef struct @@ -120,6 +122,7 @@ typedef struct { LIST_ENTRY Entry; UNICODE_STRING SymbolicLink; + CLSID DeviceInterfaceClass; }SYMBOLIC_LINK_ENTRY, *PSYMBOLIC_LINK_ENTRY; typedef struct @@ -157,3 +160,51 @@ typedef struct WCHAR BusIdentifier[1]; }BUS_ENUM_DEVICE_EXTENSION, *PBUS_ENUM_DEVICE_EXTENSION; + +typedef struct +{ + PUCHAR FilterData; + ULONG FilterLength; + ULONG FilterOffset; + + PUCHAR DataCache; + ULONG DataLength; + ULONG DataOffset; + +}KSPCACHE_DESCRIPTOR, *PKSPCACHE_DESCRIPTOR; + +typedef struct +{ + DWORD dwVersion; + DWORD dwMerit; + DWORD dwPins; + DWORD dwUnused; +}KSPCACHE_FILTER_HEADER, *PKSPCACHE_FILTER_HEADER; + +typedef struct +{ + ULONG Signature; + ULONG Flags; + ULONG Instances; + ULONG MediaTypes; + ULONG Mediums; + DWORD Category; +}KSPCACHE_PIN_HEADER, *PKSPCACHE_PIN_HEADER; + + +typedef struct +{ + ULONG Signature; + ULONG dwUnused; + ULONG OffsetMajor; + ULONG OffsetMinor; +}KSPCACHE_DATARANGE, *PKSPCACHE_DATARANGE; + + +typedef struct +{ + CLSID Medium; + ULONG dw1; + ULONG dw2; +}KSPCACHE_MEDIUM; + diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c index a4cc63bfbc6..0612fc74b9c 100644 --- a/reactos/drivers/ksfilter/ks/pin.c +++ b/reactos/drivers/ksfilter/ks/pin.c @@ -17,6 +17,9 @@ typedef struct _KSISTREAM_POINTER KDPC TimerDpc; struct _KSISTREAM_POINTER *Next; PKSPIN Pin; + PVOID Data; + ULONG Offset; + ULONG Length; KSSTREAM_POINTER StreamPointer; }KSISTREAM_POINTER, *PKSISTREAM_POINTER; @@ -40,10 +43,11 @@ typedef struct LIST_ENTRY IrpList; KSPIN_LOCK IrpListLock; + volatile LONG IrpCount; PKSISTREAM_POINTER ClonedStreamPointer; - PKSISTREAM_POINTER LeadingEdgeStreamPointer; - PKSISTREAM_POINTER TrailingStreamPointer; + KSISTREAM_POINTER LeadingEdgeStreamPointer; + KSISTREAM_POINTER TrailingStreamPointer; PFNKSPINPOWER Sleep; PFNKSPINPOWER Wake; @@ -58,9 +62,11 @@ typedef struct PKSWORKER PinWorker; WORK_QUEUE_ITEM PinWorkQueueItem; - IRP * Irp; KEVENT FrameComplete; - + ULONG FrameSize; + ULONG NumFrames; + PDMA_ADAPTER Dma; + ULONG MapRegisters; }IKsPinImpl; @@ -1202,6 +1208,84 @@ KsProcessPinUpdate( return FALSE; } +NTSTATUS +IKsPin_PrepareStreamHeader( + IN IKsPinImpl * This, + IN PKSISTREAM_POINTER StreamPointer) +{ + PKSSTREAM_HEADER Header; + ULONG Length; + + /* grab new irp */ + StreamPointer->Irp = KsRemoveIrpFromCancelableQueue(&This->IrpList, &This->IrpListLock, KsListEntryHead, KsAcquireAndRemoveOnlySingleItem); + if (!StreamPointer->Irp) + { + /* run out of mappings */ + DPRINT("OutOfMappings\n"); + return STATUS_DEVICE_NOT_READY; + } + + InterlockedDecrement(&This->IrpCount); + + /* get stream header */ + if (StreamPointer->Irp->RequestorMode == UserMode) + Header = (PKSSTREAM_HEADER)StreamPointer->Irp->AssociatedIrp.SystemBuffer; + else + Header = (PKSSTREAM_HEADER)StreamPointer->Irp->UserBuffer; + + /* initialize stream pointer */ + StreamPointer->Callback = NULL; + StreamPointer->Length = max(Header->DataUsed, Header->FrameExtent); + StreamPointer->Next = NULL; + StreamPointer->Offset = 0; + StreamPointer->Pin = &This->Pin; + StreamPointer->Data = Header->Data; + + StreamPointer->StreamPointer.Context = NULL; + StreamPointer->StreamPointer.Pin = &This->Pin; + StreamPointer->StreamPointer.StreamHeader = Header; + + if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) + StreamPointer->StreamPointer.Offset = &StreamPointer->StreamPointer.OffsetIn; + else + StreamPointer->StreamPointer.Offset = &StreamPointer->StreamPointer.OffsetOut; + + StreamPointer->StreamPointer.Offset->Alignment = 0; + StreamPointer->StreamPointer.Offset->Count = 0; + StreamPointer->StreamPointer.Offset->Data = NULL; + StreamPointer->StreamPointer.Offset->Remaining = 0; + + ASSERT(StreamPointer->StreamPointer.Offset->Remaining == 0); + + //StreamPointer->Offset += StreamPointer->StreamPointer.Offset->Count; + + ASSERT(StreamPointer->Length > StreamPointer->Offset); + ASSERT(StreamPointer->StreamPointer.StreamHeader); + ASSERT(This->FrameSize); + + /* calculate length */ + /* TODO split into frames */ + Length = StreamPointer->Length; + + /* FIXME */ + ASSERT(Length); + + StreamPointer->StreamPointer.Offset->Alignment = 0; + StreamPointer->StreamPointer.Context = NULL; + StreamPointer->StreamPointer.Pin = &This->Pin; + StreamPointer->StreamPointer.Offset->Count = Length; + StreamPointer->StreamPointer.Offset->Remaining = Length; + StreamPointer->StreamPointer.Offset->Data = (PVOID)((ULONG_PTR)StreamPointer->Data + StreamPointer->Offset); + StreamPointer->StreamPointer.StreamHeader->FrameExtent = Length; + if (StreamPointer->StreamPointer.StreamHeader->DataUsed) + StreamPointer->StreamPointer.StreamHeader->DataUsed = Length; + + StreamPointer->StreamPointer.StreamHeader->Data = StreamPointer->StreamPointer.Offset->Data; + + return STATUS_SUCCESS; +} + + /* @unimplemented */ @@ -1213,32 +1297,30 @@ KsPinGetLeadingEdgeStreamPointer( IN KSSTREAM_POINTER_STATE State) { IKsPinImpl * This; + NTSTATUS Status; This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); - DPRINT("KsPinGetLeadingEdgeStreamPointer Pin %p State %x Count %lu Remaining %lu\n", Pin, State, - This->LeadingEdgeStreamPointer->StreamPointer.Offset->Count, - This->LeadingEdgeStreamPointer->StreamPointer.Offset->Remaining); + DPRINT("KsPinGetLeadingEdgeStreamPointer Pin %p State %x Count %lu Remaining %lu\n", Pin, State, + This->LeadingEdgeStreamPointer.Length, + This->LeadingEdgeStreamPointer.Offset); /* sanity check */ - ASSERT(This->LeadingEdgeStreamPointer); ASSERT(State == KSSTREAM_POINTER_STATE_LOCKED); if (State == KSSTREAM_POINTER_STATE_LOCKED) { - /* do we have an irp packet */ - if (!This->Irp) + if (!This->LeadingEdgeStreamPointer.Irp || This->LeadingEdgeStreamPointer.StreamPointer.Offset->Remaining == 0) { - /* run out of packets */ - return NULL; + Status = IKsPin_PrepareStreamHeader(This, &This->LeadingEdgeStreamPointer); + if (!NT_SUCCESS(Status)) + return NULL; } - if (!This->LeadingEdgeStreamPointer->StreamPointer.Offset->Remaining) - return NULL; - } - DPRINT("LeadingEdge %p\n", &This->LeadingEdgeStreamPointer->StreamPointer); - This->LeadingEdgeStreamPointer->Pin = &This->Pin; - return &This->LeadingEdgeStreamPointer->StreamPointer; + DPRINT("KsPinGetLeadingEdgeStreamPointer NewOffset %lu TotalLength %lu\n", This->LeadingEdgeStreamPointer.Offset, This->LeadingEdgeStreamPointer.Length); + } + + return &This->LeadingEdgeStreamPointer.StreamPointer; } /* @@ -1293,7 +1375,7 @@ KsStreamPointerUnlock( IN BOOLEAN Eject) { UNIMPLEMENTED - DPRINT("KsStreamPointerUnlock Eject %lu\n", Eject); + DPRINT("KsStreamPointerUnlock StreamPointer %pEject %lu\n", StreamPointer, Eject); DbgBreakPoint(); } @@ -1328,7 +1410,7 @@ KsStreamPointerDelete( PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); DPRINT("KsStreamPointerDelete %p\n", Pointer); - +DbgBreakPoint(); This = (IKsPinImpl*)CONTAINING_RECORD(Pointer->StreamPointer.Pin, IKsPinImpl, Pin); /* point to first stream pointer */ @@ -1378,6 +1460,7 @@ KsStreamPointerClone( PKSISTREAM_POINTER CurFrame; PKSISTREAM_POINTER NewFrame; ULONG RefCount; + NTSTATUS Status; ULONG Size; DPRINT("KsStreamPointerClone StreamPointer %p CancelCallback %p ContextSize %p CloneStreamPointer %p\n", StreamPointer, CancelCallback, ContextSize, CloneStreamPointer); @@ -1404,11 +1487,30 @@ KsStreamPointerClone( /* copy stream pointer */ RtlMoveMemory(NewFrame, CurFrame, sizeof(KSISTREAM_POINTER)); + /* locate pin */ + This = (IKsPinImpl*)CONTAINING_RECORD(CurFrame->Pin, IKsPinImpl, Pin); + + /* prepare stream header in case required */ + if (CurFrame->StreamPointer.Offset->Remaining == 0) + { + Status = IKsPin_PrepareStreamHeader(This, NewFrame); + if (!NT_SUCCESS(Status)) + { + FreeItem(NewFrame); + return STATUS_DEVICE_NOT_READY; + } + } + if (ContextSize) NewFrame->StreamPointer.Context = (NewFrame + 1); - /* locate pin */ - This = (IKsPinImpl*)CONTAINING_RECORD(CurFrame->Pin, IKsPinImpl, Pin); + + if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) + NewFrame->StreamPointer.Offset = &NewFrame->StreamPointer.OffsetIn; + else + NewFrame->StreamPointer.Offset = &NewFrame->StreamPointer.OffsetOut; + + NewFrame->StreamPointer.Pin = &This->Pin; @@ -1420,6 +1522,8 @@ KsStreamPointerClone( /* store result */ *CloneStreamPointer = &NewFrame->StreamPointer; + DPRINT("KsStreamPointerClone CloneStreamPointer %p\n", *CloneStreamPointer); + return STATUS_SUCCESS; } @@ -1437,52 +1541,46 @@ KsStreamPointerAdvanceOffsets( { PKSISTREAM_POINTER CurFrame; IKsPinImpl * This; + NTSTATUS Status; - DPRINT("KsStreamPointerAdvanceOffsets InUsed %lu OutUsed %lu Eject %lu\n", InUsed, OutUsed, Eject); + DPRINT("KsStreamPointerAdvanceOffsets StreamPointer %p InUsed %lu OutUsed %lu Eject %lu\n", StreamPointer, InUsed, OutUsed, Eject); /* get stream pointer */ CurFrame = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); - CurFrame->StreamPointer.OffsetIn.Remaining -= InUsed; - CurFrame->StreamPointer.OffsetOut.Remaining -= OutUsed; - CurFrame->StreamPointer.OffsetIn.Count -= InUsed; - CurFrame->StreamPointer.OffsetOut.Count -= OutUsed; - CurFrame->StreamPointer.OffsetIn.Data = (PVOID)((ULONG_PTR)CurFrame->StreamPointer.OffsetIn.Data + InUsed); - CurFrame->StreamPointer.OffsetOut.Data = (PVOID)((ULONG_PTR)CurFrame->StreamPointer.OffsetOut.Data + OutUsed); - - if (!CurFrame->StreamPointer.OffsetIn.Remaining) - CurFrame->StreamPointer.OffsetIn.Data = NULL; - - if (!CurFrame->StreamPointer.OffsetOut.Remaining) - CurFrame->StreamPointer.OffsetOut.Data = NULL; - /* locate pin */ This = (IKsPinImpl*)CONTAINING_RECORD(CurFrame->Pin, IKsPinImpl, Pin); + /* TODO */ + ASSERT(InUsed == 0); + ASSERT(Eject == 0); + ASSERT(OutUsed); + + DPRINT("KsStreamPointerAdvanceOffsets Offset %lu Length %lu NewOffset %lu Remaining %lu LeadingEdge %p DataUsed %lu\n", CurFrame->Offset, CurFrame->Length, CurFrame->Offset + OutUsed, +CurFrame->StreamPointer.OffsetOut.Remaining, &This->LeadingEdgeStreamPointer.StreamPointer, CurFrame->StreamPointer.StreamHeader->DataUsed); +DbgBreakPoint(); + if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) { - if (CurFrame->StreamPointer.OffsetIn.Remaining == 0) - { - /* get next mapping */ - This->Irp = KsRemoveIrpFromCancelableQueue(&This->IrpList, &This->IrpListLock, KsListEntryHead, KsAcquireAndRemoveOnlySingleItem); - if (!This->Irp) - return STATUS_DEVICE_NOT_READY; - - /* FIXME handle me */ - ASSERT(0); - } + ASSERT(CurFrame->StreamPointer.OffsetIn.Remaining >= InUsed); + CurFrame->StreamPointer.OffsetIn.Remaining -= InUsed; + CurFrame->StreamPointer.OffsetIn.Data = (PVOID)((ULONG_PTR)CurFrame->StreamPointer.OffsetIn.Data + InUsed); } else { - if (CurFrame->StreamPointer.OffsetOut.Remaining == 0) + if (!CurFrame->StreamPointer.OffsetOut.Remaining) { - /* get next mapping */ - This->Irp = KsRemoveIrpFromCancelableQueue(&This->IrpList, &This->IrpListLock, KsListEntryHead, KsAcquireAndRemoveOnlySingleItem); - if (!This->Irp) + Status = IKsPin_PrepareStreamHeader(This, CurFrame); + if (!NT_SUCCESS(Status)) + { return STATUS_DEVICE_NOT_READY; - - /* FIXME handle me */ - ASSERT(0); + } + } + else + { + ASSERT(CurFrame->StreamPointer.OffsetOut.Remaining >= OutUsed); + CurFrame->StreamPointer.OffsetOut.Remaining -= OutUsed; + CurFrame->StreamPointer.OffsetOut.Data = (PVOID)((ULONG_PTR)CurFrame->StreamPointer.OffsetOut.Data + OutUsed); } } @@ -1499,6 +1597,7 @@ KsStreamPointerAdvance( IN PKSSTREAM_POINTER StreamPointer) { UNIMPLEMENTED + DbgBreakPoint(); return STATUS_NOT_IMPLEMENTED; } @@ -1542,7 +1641,10 @@ KsStreamPointerScheduleTimeout( IN ULONGLONG Interval) { LARGE_INTEGER DueTime; - PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; + PKSISTREAM_POINTER Pointer; + + /* get stream pointer */ + Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); /* setup timer callback */ Pointer->Callback = Callback; @@ -1564,7 +1666,10 @@ NTAPI KsStreamPointerCancelTimeout( IN PKSSTREAM_POINTER StreamPointer) { - PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; + PKSISTREAM_POINTER Pointer; + + /* get stream pointer */ + Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); KeCancelTimer(&Pointer->Timer); @@ -1582,7 +1687,7 @@ KsPinGetFirstCloneStreamPointer( IKsPinImpl * This; DPRINT("KsPinGetFirstCloneStreamPointer %p\n", Pin); - DbgBreakPoint(); +DbgBreakPoint(); This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); /* return first cloned stream pointer */ return &This->ClonedStreamPointer->StreamPointer; @@ -1597,10 +1702,14 @@ NTAPI KsStreamPointerGetNextClone( IN PKSSTREAM_POINTER StreamPointer) { - PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; + PKSISTREAM_POINTER Pointer; DPRINT("KsStreamPointerGetNextClone\n"); - DbgBreakPoint(); +DbgBreakPoint(); + /* get stream pointer */ + Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); + + /* is there a another cloned stream pointer */ if (!Pointer->Next) return NULL; @@ -1614,11 +1723,7 @@ NTAPI IKsPin_PinCentricWorker( IN PVOID Parameter) { - PIO_STACK_LOCATION IoStack; - PKSSTREAM_HEADER Header; - ULONG NumHeaders; NTSTATUS Status; - PIRP Irp; IKsPinImpl * This = (IKsPinImpl*)Parameter; DPRINT("IKsPin_PinCentricWorker\n"); @@ -1630,77 +1735,22 @@ IKsPin_PinCentricWorker( ASSERT(This->Pin.Descriptor->Dispatch->Process); ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); ASSERT(!(This->Pin.Descriptor->Flags & KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING)); - ASSERT(This->LeadingEdgeStreamPointer); + ASSERT(!(This->Pin.Descriptor->Flags & KSPIN_FLAG_GENERATE_MAPPINGS)); do { - /* do we have an irp packet */ - if (!This->Irp) - { - /* fetch new irp packet */ - This->Irp = KsRemoveIrpFromCancelableQueue(&This->IrpList, &This->IrpListLock, KsListEntryHead, KsAcquireAndRemoveOnlySingleItem); - - if (!This->Irp) - { - /* reached last packet */ - break; - } - } - - /* get current irp stack location */ - IoStack = IoGetCurrentIrpStackLocation(This->Irp); - - if (This->Irp->RequestorMode == UserMode) - This->LeadingEdgeStreamPointer->StreamPointer.StreamHeader = Header = (PKSSTREAM_HEADER)This->Irp->AssociatedIrp.SystemBuffer; - else - This->LeadingEdgeStreamPointer->StreamPointer.StreamHeader = Header = (PKSSTREAM_HEADER)This->Irp->UserBuffer; - - /* calculate num headers */ - NumHeaders = IoStack->Parameters.DeviceIoControl.OutputBufferLength / Header->Size; - - /* assume headers of same length */ - ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength % Header->Size == 0); - - /* FIXME support multiple stream headers */ - ASSERT(NumHeaders == 1); - - if (This->Irp->RequestorMode == UserMode) - { - /* prepare header */ - Header->Data = MmGetSystemAddressForMdlSafe(This->Irp->MdlAddress, NormalPagePriority); - } - - /* set up stream pointer */ - This->LeadingEdgeStreamPointer->Irp = Irp = This->Irp; - This->LeadingEdgeStreamPointer->StreamPointer.Context = NULL; - This->LeadingEdgeStreamPointer->StreamPointer.Pin = &This->Pin; - This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut.Count = max(Header->DataUsed, Header->FrameExtent); - This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut.Data = Header->Data; - This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut.Count = max(Header->DataUsed, Header->FrameExtent); - This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut.Remaining = max(Header->DataUsed, Header->FrameExtent); - This->LeadingEdgeStreamPointer->Pin = &This->Pin; - DPRINT("IKsPin_PinCentricWorker calling Pin Process Routine\n"); - Status = This->Pin.Descriptor->Dispatch->Process(&This->Pin); - DPRINT("IKsPin_PinCentricWorker Status %lx, Count %lu Remaining %lu\n", Status, - This->LeadingEdgeStreamPointer->StreamPointer.Offset->Count, - This->LeadingEdgeStreamPointer->StreamPointer.Offset->Remaining); - - ASSERT(Status != STATUS_PENDING); - - // HACK complete irp - Irp->IoStatus.Information = max(Header->DataUsed, Header->FrameExtent); - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - KsDecrementCountedWorker(This->PinWorker); - - + Status = This->Pin.Descriptor->Dispatch->Process(&This->Pin); + DPRINT("IKsPin_PinCentricWorker Status %lx, Offset %lu Length %lu\n", Status, + This->LeadingEdgeStreamPointer.Offset, + This->LeadingEdgeStreamPointer.Length); break; - }while(TRUE); + }while(This->IrpCount); } + NTSTATUS NTAPI IKsPin_DispatchKsStream( @@ -1709,6 +1759,8 @@ IKsPin_DispatchKsStream( IKsPinImpl * This) { PKSPROCESSPIN_INDEXENTRY ProcessPinIndex; + PKSSTREAM_HEADER Header; + ULONG NumHeaders; PKSFILTER Filter; PIO_STACK_LOCATION IoStack; NTSTATUS Status = STATUS_SUCCESS; @@ -1721,6 +1773,7 @@ IKsPin_DispatchKsStream( /* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); + /* probe stream pointer */ if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM) Status = KsProbeStreamIrp(Irp, KSSTREAM_WRITE | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_SYSTEMADDRESS, This->Pin.StreamHeaderSize); else @@ -1735,6 +1788,46 @@ IKsPin_DispatchKsStream( return Status; } + if (Irp->RequestorMode == UserMode) + Header = (PKSSTREAM_HEADER)Irp->AssociatedIrp.SystemBuffer; + else + Header = (PKSSTREAM_HEADER)Irp->UserBuffer; + + if (!Header) + { + DPRINT("NoHeader Canceling Irp %p\n", Irp); + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + } + + /* calculate num headers */ + NumHeaders = IoStack->Parameters.DeviceIoControl.OutputBufferLength / Header->Size; + + /* assume headers of same length */ + ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength % Header->Size == 0); + + /* FIXME support multiple stream headers */ + ASSERT(NumHeaders == 1); + + if (Irp->RequestorMode == UserMode) + { + /* prepare header */ + ASSERT(Irp->MdlAddress); + Header->Data = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); + + if (!Header->Data) + { + DPRINT("NoHeader->Data Canceling Irp %p\n", Irp); + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + } + + } + + + if (This->Pin.Descriptor->Dispatch->Process) { /* it is a pin centric avstream */ @@ -1749,6 +1842,10 @@ IKsPin_DispatchKsStream( ASSERT(!(This->Pin.Descriptor->Flags & KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING)); ASSERT(This->PinWorker); + InterlockedIncrement(&This->IrpCount); + + DPRINT("IKsPin_DispatchKsStream IrpCount %lu\n", This->IrpCount); + /* start the processing loop */ KsIncrementCountedWorker(This->PinWorker); @@ -1782,7 +1879,6 @@ IKsPin_DispatchKsStream( /* add irp to cancelable queue */ KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); - Status = Filter->Descriptor->Dispatch->Process(Filter, ProcessPinIndex); DPRINT("IKsPin_DispatchKsStream FilterCentric: Status %lx \n", Status); @@ -2110,6 +2206,9 @@ KspCreatePin( NTSTATUS Status; PKSDATAFORMAT DataFormat; PKSBASIC_HEADER BasicHeader; + ULONG Index; + ULONG FrameSize = 0; + ULONG NumFrames = 0; /* sanity checks */ ASSERT(Descriptor->Dispatch); @@ -2119,6 +2218,52 @@ KspCreatePin( //Output Pin: KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY //Input Pin: KSPIN_FLAG_FIXED_FORMAT|KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT|KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING + + if (Descriptor->AllocatorFraming) + { + DPRINT("KspCreatePin Dataflow %lu\n", Descriptor->PinDescriptor.DataFlow); + DPRINT("KspCreatePin CountItems %lu\n", Descriptor->AllocatorFraming->CountItems); + DPRINT("KspCreatePin PinFlags %lx\n", Descriptor->AllocatorFraming->PinFlags); + DPRINT("KspCreatePin OutputCompression RatioNumerator %lu RatioDenominator %lu RatioConstantMargin %lu\n", Descriptor->AllocatorFraming->OutputCompression.RatioNumerator, + Descriptor->AllocatorFraming->OutputCompression.RatioDenominator, Descriptor->AllocatorFraming->OutputCompression.RatioConstantMargin); + DPRINT("KspCreatePin PinWeight %lx\n", Descriptor->AllocatorFraming->PinWeight); + + for(Index = 0; Index < Descriptor->AllocatorFraming->CountItems; Index++) + { + DPRINT("KspCreatePin Index %lu MemoryFlags %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].MemoryFlags); + DPRINT("KspCreatePin Index %lu BusFlags %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].BusFlags); + DPRINT("KspCreatePin Index %lu Flags %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].Flags); + DPRINT("KspCreatePin Index %lu Frames %lu\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].Frames); + DPRINT("KspCreatePin Index %lu FileAlignment %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].FileAlignment); + DPRINT("KspCreatePin Index %lu MemoryTypeWeight %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].MemoryTypeWeight); + DPRINT("KspCreatePin Index %lu PhysicalRange MinFrameSize %lu MaxFrameSize %lu Stepping %lu\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].PhysicalRange.MinFrameSize, + Descriptor->AllocatorFraming->FramingItem[Index].PhysicalRange.MaxFrameSize, + Descriptor->AllocatorFraming->FramingItem[Index].PhysicalRange.Stepping); + + DPRINT("KspCreatePin Index %lu FramingRange MinFrameSize %lu MaxFrameSize %lu Stepping %lu InPlaceWeight %lu NotInPlaceWeight %lu\n", + Index, + Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.Range.MinFrameSize, + Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.Range.MaxFrameSize, + Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.Range.Stepping, + Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.InPlaceWeight, + Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.NotInPlaceWeight); + + FrameSize = Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.Range.MaxFrameSize; + NumFrames = Descriptor->AllocatorFraming->FramingItem[Index].Frames; + } + } + + if (!FrameSize) + { + /* default to 50 * 188 (MPEG2 TS packet size) */ + FrameSize = 9400; + } + + if (!NumFrames) + { + NumFrames = 8; + } + /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -2158,12 +2303,13 @@ KspCreatePin( This->BasicHeader.ControlMutex = BasicHeader->ControlMutex; ASSERT(This->BasicHeader.ControlMutex); - InitializeListHead(&This->BasicHeader.EventList); KeInitializeSpinLock(&This->BasicHeader.EventListLock); /* initialize pin */ This->lpVtbl = &vt_IKsPin; + This->FrameSize = FrameSize; + This->NumFrames = NumFrames; This->lpVtblReferenceClock = &vt_ReferenceClock; This->ref = 1; This->FileObject = IoStack->FileObject; @@ -2172,7 +2318,6 @@ KspCreatePin( InitializeListHead(&This->IrpList); KeInitializeSpinLock(&This->IrpListLock); - /* allocate object bag */ This->Pin.Bag = AllocateItem(NonPagedPool, sizeof(KSIOBJECT_BAG)); if (!This->Pin.Bag) @@ -2270,7 +2415,7 @@ KspCreatePin( This->ProcessPin.Flags = 0; This->ProcessPin.InPlaceCounterpart = NULL; This->ProcessPin.Pin = &This->Pin; - This->ProcessPin.StreamPointer = (PKSSTREAM_POINTER)This->LeadingEdgeStreamPointer; + This->ProcessPin.StreamPointer = (PKSSTREAM_POINTER)&This->LeadingEdgeStreamPointer.StreamPointer; This->ProcessPin.Terminate = FALSE; Status = Filter->lpVtbl->AddProcessPin(Filter, &This->ProcessPin); @@ -2291,18 +2436,6 @@ KspCreatePin( { /* pin centric processing filter */ - /* allocate leading stream pointer */ - Status = _KsEdit(This->Pin.Bag, (PVOID*)&This->LeadingEdgeStreamPointer, sizeof(KSISTREAM_POINTER), sizeof(KSISTREAM_POINTER), 0); - - /* FIXME cleanup */ - ASSERT(Status == STATUS_SUCCESS); - - /* FIXME cleanup */ - ASSERT(Status == STATUS_SUCCESS); - - /* setup stream pointer offset */ - This->LeadingEdgeStreamPointer->StreamPointer.Offset = &This->LeadingEdgeStreamPointer->StreamPointer.OffsetOut; - /* initialize work item */ ExInitializeWorkItem(&This->PinWorkQueueItem, IKsPin_PinCentricWorker, (PVOID)This); @@ -2319,6 +2452,12 @@ KspCreatePin( return Status; } + if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) + This->LeadingEdgeStreamPointer.StreamPointer.Offset = &This->LeadingEdgeStreamPointer.StreamPointer.OffsetIn; + else + This->LeadingEdgeStreamPointer.StreamPointer.Offset = &This->LeadingEdgeStreamPointer.StreamPointer.OffsetOut; + + KeInitializeEvent(&This->FrameComplete, NotificationEvent, FALSE); } diff --git a/reactos/drivers/ksfilter/ks/priv.h b/reactos/drivers/ksfilter/ks/priv.h index 86ea4ebba64..eb38f882021 100644 --- a/reactos/drivers/ksfilter/ks/priv.h +++ b/reactos/drivers/ksfilter/ks/priv.h @@ -4,7 +4,8 @@ #include #include -#define NDEBUG +//#define NDEBUG +#define YDEBUG #include #include #include @@ -16,8 +17,11 @@ #include "kstypes.h" #include "ksiface.h" +#include "ksmedia.h" #define TAG_DEVICE_HEADER 'KSDH' +#define REG_PINFLAG_B_MANY 0x4 /* strmif.h */ +#define MERIT_DO_NOT_USE 0x200000 /* dshow.h */ #define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\ PropGeneral, PropInstances, PropIntersection)\ From 5fcb03c68d2b70f4249a2aa28a9f35cb6a62e582 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 7 Apr 2010 23:03:59 +0000 Subject: [PATCH 074/261] [ISAPNP] - Fix a typo svn path=/trunk/; revision=46775 --- reactos/drivers/bus/isapnp/hardware.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/bus/isapnp/hardware.c b/reactos/drivers/bus/isapnp/hardware.c index 67a903948f8..99e5d44aa33 100644 --- a/reactos/drivers/bus/isapnp/hardware.c +++ b/reactos/drivers/bus/isapnp/hardware.c @@ -352,7 +352,7 @@ TryIsolate(PUCHAR ReadDataPort) HwDelay(); Data = ((Data << 8) | ReadData(ReadDataPort)); HwDelay(); - Data >>= 1; + Byte >>= 1; if (Data != 0xFFFF) { From ba87c15658070e6ae7f871602b662ad5c7d9499d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 8 Apr 2010 02:18:27 +0000 Subject: [PATCH 075/261] [TXTSETUP.SIF] - Add PnP information for isapnp [REACTOS.DFF] - Remove isapnp svn path=/trunk/; revision=46776 --- reactos/boot/bootdata/packages/reactos.dff | 2 -- reactos/boot/bootdata/txtsetup.sif | 6 +++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 895b3fc2fb5..a4d4de2a79b 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -489,8 +489,6 @@ drivers\base\nmidebug\nmidebug.sys 2 drivers\battery\battc\battc.sys 2 -drivers\bus\isapnp\isapnp.sys 2 - drivers\bus\acpi\cmbatt\cmbatt.sys 2 drivers\bus\acpi\compbatt\compbatt.sys 2 diff --git a/reactos/boot/bootdata/txtsetup.sif b/reactos/boot/bootdata/txtsetup.sif index 870c0d26951..4da20f331da 100644 --- a/reactos/boot/bootdata/txtsetup.sif +++ b/reactos/boot/bootdata/txtsetup.sif @@ -22,6 +22,7 @@ c_1252.nls=,,,,,,,,,,,,2 cdfs.sys=,,,,,,x,,,,,,4 cdrom.sys=,,,,,,x,,,,,,4 class2.sys=,,,,,,x,,,,,,4 +isapnp.sys=,,,,,,,,,,,,4 kdcom.dll=,,,,,,,,,,,,2 disk.sys=,,,,,,x,,,,,,4 floppy.sys=,,,,,,x,,,,,,4 @@ -36,13 +37,16 @@ ramdisk.sys=,,,,,,x,,,,,,4 ext2.sys=,,,,,,x,,,,,,4 [HardwareIdsDatabase] -*PNP0C08 = acpi +*PNP0A00 = isapnp *PNP0A03 = pci +*PNP0C08 = acpi +PCI\CC_0601 = isapnp PCI\CC_0604 = pci [BootBusExtenders.Load] acpi = acpi.sys pci = pci.sys +isapnp = isapnp.sys [Cabinets] Cabinet=reactos.cab From fc4cd6d714ed91677c44a315320fffadd5668a85 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 8 Apr 2010 08:38:50 +0000 Subject: [PATCH 076/261] [KS] - Disable debugging traces svn path=/trunk/; revision=46777 --- reactos/drivers/ksfilter/ks/priv.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/priv.h b/reactos/drivers/ksfilter/ks/priv.h index eb38f882021..ec5976be238 100644 --- a/reactos/drivers/ksfilter/ks/priv.h +++ b/reactos/drivers/ksfilter/ks/priv.h @@ -4,8 +4,8 @@ #include #include -//#define NDEBUG -#define YDEBUG +#define NDEBUG +//#define YDEBUG #include #include #include From 169a95782aabd182d08d8734ae99599beeeae771 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 8 Apr 2010 09:39:24 +0000 Subject: [PATCH 077/261] [DRIVERS/GREEN] - Includes cleanup, fix NDK inclusion. svn path=/trunk/; revision=46779 --- rosapps/drivers/green/green.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rosapps/drivers/green/green.h b/rosapps/drivers/green/green.h index 4e32131ab35..5c3f1b20084 100644 --- a/rosapps/drivers/green/green.h +++ b/rosapps/drivers/green/green.h @@ -1,7 +1,6 @@ -#include +#include #include -#include -#include +#include #include #define WINBASEAPI typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES; From 0d672ad7cde4e542305d72b4412ddf30a24996b6 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 8 Apr 2010 20:14:38 +0000 Subject: [PATCH 078/261] [KS] - Fix tons of bugs in KsMergeAutomationTable - Implement removing instantiated filter from filter factory when filter is about to be closed - Fix a memory corrupion bug in KspHandleDataIntersection svn path=/trunk/; revision=46780 --- reactos/drivers/ksfilter/ks/api.c | 53 +++++++++++------ reactos/drivers/ksfilter/ks/filter.c | 88 ++++++++++++++++++++++++++-- 2 files changed, 118 insertions(+), 23 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index f1ac9a848db..2fae3669083 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -2096,8 +2096,15 @@ KspCountMethodSets( if (!AutomationTableB) return AutomationTableA->MethodSetsCount; - /* sanity check */ - ASSERT(AutomationTableA->MethodItemSize == AutomationTableB->MethodItemSize); + + DPRINT("AutomationTableA MethodItemSize %lu MethodSetsCount %lu\n", AutomationTableA->MethodItemSize, AutomationTableA->MethodSetsCount); + DPRINT("AutomationTableB MethodItemSize %lu MethodSetsCount %lu\n", AutomationTableB->MethodItemSize, AutomationTableB->MethodSetsCount); + + if (AutomationTableA->MethodItemSize && AutomationTableB->MethodItemSize) + { + /* sanity check */ + ASSERT(AutomationTableA->MethodItemSize == AutomationTableB->MethodItemSize); + } /* now iterate all property sets and compare their guids */ Count = AutomationTableA->MethodSetsCount; @@ -2138,8 +2145,14 @@ KspCountEventSets( if (!AutomationTableB) return AutomationTableA->EventSetsCount; - /* sanity check */ - ASSERT(AutomationTableA->EventItemSize == AutomationTableB->EventItemSize); + DPRINT("AutomationTableA EventItemSize %lu EventSetsCount %lu\n", AutomationTableA->EventItemSize, AutomationTableA->EventSetsCount); + DPRINT("AutomationTableB EventItemSize %lu EventSetsCount %lu\n", AutomationTableB->EventItemSize, AutomationTableB->EventSetsCount); + + if (AutomationTableA->EventItemSize && AutomationTableB->EventItemSize) + { + /* sanity check */ + ASSERT(AutomationTableA->EventItemSize == AutomationTableB->EventItemSize); + } /* now iterate all Event sets and compare their guids */ Count = AutomationTableA->EventSetsCount; @@ -2182,6 +2195,8 @@ KspCountPropertySets( return AutomationTableA->PropertySetsCount; /* sanity check */ + DPRINT("AutomationTableA EventItemSize %lu PropertySetsCount %lu\n", AutomationTableA->PropertyItemSize, AutomationTableA->PropertySetsCount); + DPRINT("AutomationTableB EventItemSize %lu PropertySetsCount %lu\n", AutomationTableB->PropertyItemSize, AutomationTableB->PropertySetsCount); ASSERT(AutomationTableA->PropertyItemSize == AutomationTableB->PropertyItemSize); /* now iterate all property sets and compare their guids */ @@ -2221,18 +2236,18 @@ KspCopyMethodSets( if (!AutomationTableA) { /* copy of property set */ - RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableB->MethodSets, Table->MethodItemSize * AutomationTableB->MethodSetsCount); + RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableB->MethodSets, sizeof(KSMETHOD_SET) * AutomationTableB->MethodSetsCount); return STATUS_SUCCESS; } else if (!AutomationTableB) { /* copy of property set */ - RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableA->MethodSets, Table->MethodItemSize * AutomationTableA->MethodSetsCount); + RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableA->MethodSets, sizeof(KSMETHOD_SET) * AutomationTableA->MethodSetsCount); return STATUS_SUCCESS; } /* first copy all property items from dominant table */ - RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableA->MethodSets, Table->MethodItemSize * AutomationTableA->MethodSetsCount); + RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableA->MethodSets, sizeof(KSMETHOD_SET) * AutomationTableA->MethodSetsCount); /* set counter */ Count = AutomationTableA->MethodSetsCount; @@ -2255,7 +2270,7 @@ KspCopyMethodSets( if (!bFound) { /* copy new property item set */ - RtlMoveMemory((PVOID)&Table->MethodSets[Count], &AutomationTableB->MethodSets[Index], Table->MethodItemSize); + RtlMoveMemory((PVOID)&Table->MethodSets[Count], &AutomationTableB->MethodSets[Index], sizeof(KSMETHOD_SET)); Count++; } } @@ -2276,18 +2291,18 @@ KspCopyPropertySets( if (!AutomationTableA) { /* copy of property set */ - RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableB->PropertySets, Table->PropertyItemSize * AutomationTableB->PropertySetsCount); + RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableB->PropertySets, sizeof(KSPROPERTY_SET) * AutomationTableB->PropertySetsCount); return STATUS_SUCCESS; } else if (!AutomationTableB) { /* copy of property set */ - RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableA->PropertySets, Table->PropertyItemSize * AutomationTableA->PropertySetsCount); + RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableA->PropertySets, sizeof(KSPROPERTY_SET) * AutomationTableA->PropertySetsCount); return STATUS_SUCCESS; } /* first copy all property items from dominant table */ - RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableA->PropertySets, Table->PropertyItemSize * AutomationTableA->PropertySetsCount); + RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableA->PropertySets, sizeof(KSPROPERTY_SET) * AutomationTableA->PropertySetsCount); /* set counter */ Count = AutomationTableA->PropertySetsCount; @@ -2310,7 +2325,7 @@ KspCopyPropertySets( if (!bFound) { /* copy new property item set */ - RtlMoveMemory((PVOID)&Table->PropertySets[Count], &AutomationTableB->PropertySets[Index], Table->PropertyItemSize); + RtlMoveMemory((PVOID)&Table->PropertySets[Count], &AutomationTableB->PropertySets[Index], sizeof(KSPROPERTY_SET)); Count++; } } @@ -2330,18 +2345,18 @@ KspCopyEventSets( if (!AutomationTableA) { /* copy of Event set */ - RtlMoveMemory((PVOID)Table->EventSets, AutomationTableB->EventSets, Table->EventItemSize * AutomationTableB->EventSetsCount); + RtlMoveMemory((PVOID)Table->EventSets, AutomationTableB->EventSets, sizeof(KSEVENT_SET) * AutomationTableB->EventSetsCount); return STATUS_SUCCESS; } else if (!AutomationTableB) { /* copy of Event set */ - RtlMoveMemory((PVOID)Table->EventSets, AutomationTableA->EventSets, Table->EventItemSize * AutomationTableA->EventSetsCount); + RtlMoveMemory((PVOID)Table->EventSets, AutomationTableA->EventSets, sizeof(KSEVENT_SET) * AutomationTableA->EventSetsCount); return STATUS_SUCCESS; } /* first copy all Event items from dominant table */ - RtlMoveMemory((PVOID)Table->EventSets, AutomationTableA->EventSets, Table->EventItemSize * AutomationTableA->EventSetsCount); + RtlMoveMemory((PVOID)Table->EventSets, AutomationTableA->EventSets, sizeof(KSEVENT_SET) * AutomationTableA->EventSetsCount); /* set counter */ Count = AutomationTableA->EventSetsCount; @@ -2364,7 +2379,7 @@ KspCopyEventSets( if (!bFound) { /* copy new Event item set */ - RtlMoveMemory((PVOID)&Table->EventSets[Count], &AutomationTableB->EventSets[Index], Table->EventItemSize); + RtlMoveMemory((PVOID)&Table->EventSets[Count], &AutomationTableB->EventSets[Index], sizeof(KSEVENT_SET)); Count++; } } @@ -2428,7 +2443,7 @@ KsMergeAutomationTables( } /* now allocate the property sets */ - Table->PropertySets = AllocateItem(NonPagedPool, Table->PropertyItemSize * Table->PropertySetsCount); + Table->PropertySets = AllocateItem(NonPagedPool, sizeof(KSPROPERTY_SET) * Table->PropertySetsCount); if (!Table->PropertySets) { @@ -2471,7 +2486,7 @@ KsMergeAutomationTables( } /* now allocate the property sets */ - Table->MethodSets = AllocateItem(NonPagedPool, Table->MethodItemSize * Table->MethodSetsCount); + Table->MethodSets = AllocateItem(NonPagedPool, sizeof(KSMETHOD_SET) * Table->MethodSetsCount); if (!Table->MethodSets) { @@ -2514,7 +2529,7 @@ KsMergeAutomationTables( } /* now allocate the property sets */ - Table->EventSets = AllocateItem(NonPagedPool, Table->EventItemSize * Table->EventSetsCount); + Table->EventSets = AllocateItem(NonPagedPool, sizeof(KSEVENT_SET) * Table->EventSetsCount); if (!Table->EventSets) { diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index 2fb69977f58..0013770396b 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -44,6 +44,11 @@ const GUID IID_IKsFilter = {0x3ef6ee44L, 0x0D41, 0x11d2, {0xbe, 0xDA, 0x00, 0xc const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}}; +VOID +IKsFilter_RemoveFilterFromFilterFactory( + IKsFilterImpl * This, + PKSFILTERFACTORY FilterFactory); + DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, KspTopologyPropertyHandler); DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, KspPinPropertyHandler, KspPinPropertyHandler, KspPinPropertyHandler); @@ -506,8 +511,8 @@ IKsFilter_DispatchClose( /* complete irp */ IoCompleteRequest(Irp, IO_NO_INCREMENT); - /* FIXME remove our instance from the filter factory */ - ASSERT(0); + /* remove our instance from the filter factory */ + IKsFilter_RemoveFilterFromFilterFactory(This, This->Factory); /* free object header */ KsFreeObjectHeader(This->ObjectHeader); @@ -605,6 +610,9 @@ KspHandleDataIntersection( MultipleItem = (PKSMULTIPLE_ITEM)(Pin + 1); DataRange = (PKSDATARANGE)(MultipleItem + 1); + /* FIXME make sure its 64 bit aligned */ + ASSERT(((ULONG_PTR)DataRange & 0x3F) == 0); + if (!This->Factory->FilterDescriptor || !This->PinDescriptorCount) { /* no filter / pin descriptor */ @@ -632,7 +640,7 @@ KspHandleDataIntersection( Irp, Pin, DataRange, - (PKSDATAFORMAT)This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRanges, + (PKSDATAFORMAT)This->PinDescriptorsEx[Pin->PinId].PinDescriptor.DataRanges, DataLength, Data, &Length); @@ -643,6 +651,8 @@ KspHandleDataIntersection( break; } DataRange = UlongToPtr(PtrToUlong(DataRange) + DataRange->FormatSize); + /* FIXME make sure its 64 bit aligned */ + ASSERT(((ULONG_PTR)DataRange & 0x3F) == 0); } IoStatus->Status = Status; @@ -718,6 +728,8 @@ IKsFilter_DispatchDeviceIoControl( IKsFilterImpl * This; NTSTATUS Status; PKSFILTER FilterInstance; + UNICODE_STRING GuidString; + PKSPROPERTY Property; /* obtain filter from object header */ Status = IKsFilter_GetFilterFromIrp(Irp, &Filter); @@ -730,6 +742,14 @@ IKsFilter_DispatchDeviceIoControl( /* current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); + /* property was not handled */ + Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; + + RtlStringFromGUID(&Property->Set, &GuidString); + DPRINT("IKsFilter_DispatchDeviceIoControl property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); + RtlFreeUnicodeString(&GuidString); + + if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY) { UNIMPLEMENTED; @@ -1126,12 +1146,72 @@ IKsFilter_AttachFilterToFilterFactory( /* found last entry */ break; } - }while(FilterFactory); + }while(TRUE); /* attach filter factory */ BasicHeader->Next.Filter = &This->Filter; } +VOID +IKsFilter_RemoveFilterFromFilterFactory( + IKsFilterImpl * This, + PKSFILTERFACTORY FilterFactory) +{ + PKSBASIC_HEADER BasicHeader; + PKSFILTER Filter, LastFilter; + + /* get filter factory basic header */ + BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)FilterFactory - sizeof(KSBASIC_HEADER)); + + /* sanity check */ + ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory); + ASSERT(BasicHeader->FirstChild.Filter != NULL); + + + /* set to first entry */ + Filter = BasicHeader->FirstChild.Filter; + LastFilter = NULL; + + do + { + if (Filter == &This->Filter) + { + if (LastFilter) + { + /* get basic header */ + BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)LastFilter - sizeof(KSBASIC_HEADER)); + /* remove filter instance */ + BasicHeader->Next.Filter = This->Header.Next.Filter; + break; + } + else + { + /* remove filter instance */ + BasicHeader->FirstChild.Filter = This->Header.Next.Filter; + break; + } + } + + /* get basic header */ + BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Filter - sizeof(KSBASIC_HEADER)); + /* sanity check */ + ASSERT(BasicHeader->Type == KsObjectTypeFilter); + + LastFilter = Filter; + if (BasicHeader->Next.Filter) + { + /* iterate to next filter factory */ + Filter = BasicHeader->Next.Filter; + } + else + { + /* filter is not in list */ + ASSERT(0); + break; + } + }while(TRUE); +} + NTSTATUS NTAPI KspCreateFilter( From d20419ee58c835285303162d9aba689a1aadec0c Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 8 Apr 2010 21:25:02 +0000 Subject: [PATCH 079/261] [SHELL32] Add missing format specifier, switch parameters as advertised svn path=/trunk/; revision=46781 --- reactos/dll/win32/shell32/fprop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/fprop.c b/reactos/dll/win32/shell32/fprop.c index 529854ea494..4d9345c469b 100644 --- a/reactos/dll/win32/shell32/fprop.c +++ b/reactos/dll/win32/shell32/fprop.c @@ -114,7 +114,7 @@ SH_FileGeneralSetFileType(HWND hwndDlg, WCHAR *filext) { /* the file extension is unknown, so default to string "FileExtension File" */ SendMessageW(hDlgCtrl, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)value); - swprintf(name, value, &filext[1]); + swprintf(name, L"%s %s", &filext[1], value); SendMessageW(hDlgCtrl, WM_SETTEXT, (WPARAM)NULL, (LPARAM)name); return TRUE; } From 13478858b7bbe719db913ce7d56365a264106347 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 8 Apr 2010 22:10:45 +0000 Subject: [PATCH 080/261] [TASKMGR] - Don't try to query a performance index when switching from application to process tab - Query a process index instead: "go to process" works now svn path=/trunk/; revision=46782 --- reactos/base/applications/taskmgr/applpage.c | 5 ++-- reactos/base/applications/taskmgr/perfdata.c | 21 ---------------- reactos/base/applications/taskmgr/procpage.c | 25 +++++++++++++++++++- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/reactos/base/applications/taskmgr/applpage.c b/reactos/base/applications/taskmgr/applpage.c index 3ef6ee9394d..355c3aea51a 100644 --- a/reactos/base/applications/taskmgr/applpage.c +++ b/reactos/base/applications/taskmgr/applpage.c @@ -49,7 +49,7 @@ void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam); void ApplicationPageShowContextMenu1(void); void ApplicationPageShowContextMenu2(void); int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); -int PerfGetIndexByProcessId(DWORD dwProcessId); +int ProcGetIndexByProcessId(DWORD dwProcessId); #if 0 void SwitchToThisWindow ( @@ -878,7 +878,6 @@ void ApplicationPage_OnGotoProcess(void) LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL; LV_ITEM item; int i; - /* NMHDR nmhdr; */ for (i=0; iIndex) == dwProcessId) + { + return i; + } + } + return 0; +} + DWORD GetSelectedProcessId(void) { int Index; @@ -427,7 +448,9 @@ void UpdateProcesses() pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam; if (!ProcessRunning(pData->ProcessId)) { - (void)ListView_DeleteItem(hProcessPageListCtrl, i); + MessageBox(NULL, L"Processs is dead", L"HM?", MB_OK); + if (ListView_DeleteItem(hProcessPageListCtrl, i) == FALSE) + MessageBox(NULL, L"Deletion failed", L"HM!", MB_OK); HeapFree(GetProcessHeap(), 0, pData); } } From 56b61004517b9081ea470042d6fbbcec618918f3 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 8 Apr 2010 22:21:17 +0000 Subject: [PATCH 081/261] [TASKMGR] Remove temp debug output related to another problem svn path=/trunk/; revision=46783 --- reactos/base/applications/taskmgr/procpage.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reactos/base/applications/taskmgr/procpage.c b/reactos/base/applications/taskmgr/procpage.c index df98949a12f..efcaa922e5f 100644 --- a/reactos/base/applications/taskmgr/procpage.c +++ b/reactos/base/applications/taskmgr/procpage.c @@ -448,9 +448,7 @@ void UpdateProcesses() pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam; if (!ProcessRunning(pData->ProcessId)) { - MessageBox(NULL, L"Processs is dead", L"HM?", MB_OK); - if (ListView_DeleteItem(hProcessPageListCtrl, i) == FALSE) - MessageBox(NULL, L"Deletion failed", L"HM!", MB_OK); + (void)ListView_DeleteItem(hProcessPageListCtrl, i); HeapFree(GetProcessHeap(), 0, pData); } } From cbbd840d2ab0e282a215b90f882cd9697b2aef10 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 9 Apr 2010 01:10:34 +0000 Subject: [PATCH 082/261] [NTOSKRNL] - Write the assigned resources to the registry svn path=/trunk/; revision=46784 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 0213d04d13e..93e30dc3729 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -246,6 +246,13 @@ IopStartDevice( RtlInitUnicodeString(&KeyName, L"ActiveService"); Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_SZ, DeviceNode->ServiceName.Buffer, DeviceNode->ServiceName.Length); + if (NT_SUCCESS(Status) && DeviceNode->ResourceList) + { + RtlInitUnicodeString(&KeyName, L"AllocConfig"); + Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_RESOURCE_LIST, + DeviceNode->ResourceList, CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); + } + if (NT_SUCCESS(Status)) IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); From 190d0acef749f8be35a934b71c0bbaf326c1ba34 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Fri, 9 Apr 2010 11:14:56 +0000 Subject: [PATCH 083/261] asm.h: fix definition of HEX macro svn path=/trunk/; revision=46786 --- reactos/include/reactos/asm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/reactos/asm.h b/reactos/include/reactos/asm.h index 30afca482a0..f60a37c79ef 100644 --- a/reactos/include/reactos/asm.h +++ b/reactos/include/reactos/asm.h @@ -73,7 +73,7 @@ ENDM .altmacro /* Hex numbers need to be in 0x1AB format */ -#define HEX(x) 0x##x +#define HEX(y) 0x##y /* Macro values need to be marked */ #define VAL(x) \x From 1528c1220de93a8e1153828d8177396aa05df439 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 9 Apr 2010 18:31:53 +0000 Subject: [PATCH 084/261] [KS] - Return status success from unimplemented IKsClock_DispatchClose - Implement handling of KSPROPERTY_PIN_CONSTRAINEDDATARANGES property - Forward unhandled irps to lower device object - Fix asserts in KspHandleDataIntersection. The function is still a grotesk hack - Simply handling of property requests by merging filter properties into filter descriptor - Implement KsMethodHandler, KsMethodHandlerWithAllocator, KsFastMethodHandler - Fix a bug in KsPinGetFirstCloneStreamPointer - Implement handling of KSPROPSETID_Topology (KspTopologyHandler) svn path=/trunk/; revision=46794 --- reactos/drivers/ksfilter/ks/api.c | 4 +- reactos/drivers/ksfilter/ks/clocks.c | 6 +- reactos/drivers/ksfilter/ks/connectivity.c | 56 +++- reactos/drivers/ksfilter/ks/device.c | 6 +- reactos/drivers/ksfilter/ks/filter.c | 145 ++++++++--- reactos/drivers/ksfilter/ks/irp.c | 2 + reactos/drivers/ksfilter/ks/ksfunc.h | 9 + reactos/drivers/ksfilter/ks/methods.c | 282 ++++++++++++++++++++- reactos/drivers/ksfilter/ks/pin.c | 27 +- reactos/drivers/ksfilter/ks/topology.c | 10 - 10 files changed, 465 insertions(+), 82 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index 2fae3669083..6c0d8813772 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -2195,8 +2195,8 @@ KspCountPropertySets( return AutomationTableA->PropertySetsCount; /* sanity check */ - DPRINT("AutomationTableA EventItemSize %lu PropertySetsCount %lu\n", AutomationTableA->PropertyItemSize, AutomationTableA->PropertySetsCount); - DPRINT("AutomationTableB EventItemSize %lu PropertySetsCount %lu\n", AutomationTableB->PropertyItemSize, AutomationTableB->PropertySetsCount); + DPRINT("AutomationTableA PropertyItemSize %lu PropertySetsCount %lu\n", AutomationTableA->PropertyItemSize, AutomationTableA->PropertySetsCount); + DPRINT("AutomationTableB PropertyItemSize %lu PropertySetsCount %lu\n", AutomationTableB->PropertyItemSize, AutomationTableB->PropertySetsCount); ASSERT(AutomationTableA->PropertyItemSize == AutomationTableB->PropertyItemSize); /* now iterate all property sets and compare their guids */ diff --git a/reactos/drivers/ksfilter/ks/clocks.c b/reactos/drivers/ksfilter/ks/clocks.c index f3e7d7acbb8..2e7ff0e2a39 100644 --- a/reactos/drivers/ksfilter/ks/clocks.c +++ b/reactos/drivers/ksfilter/ks/clocks.c @@ -112,14 +112,12 @@ IKsClock_DispatchClose( { UNIMPLEMENTED - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_NOT_IMPLEMENTED; + return STATUS_SUCCESS; } - - static KSDISPATCH_TABLE DispatchTable = { IKsClock_DispatchDeviceIoControl, diff --git a/reactos/drivers/ksfilter/ks/connectivity.c b/reactos/drivers/ksfilter/ks/connectivity.c index 7c9b8226de2..ea75428632a 100644 --- a/reactos/drivers/ksfilter/ks/connectivity.c +++ b/reactos/drivers/ksfilter/ks/connectivity.c @@ -287,11 +287,13 @@ KsPinPropertyHandler( PKSDATAFORMAT_WAVEFORMATEX WaveFormatIn; PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; NTSTATUS Status = STATUS_NOT_SUPPORTED; + ULONG Count; + const PKSDATARANGE* DataRanges; IoStack = IoGetCurrentIrpStackLocation(Irp); Buffer = Irp->UserBuffer; - DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %u\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id); + //DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %u\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id); switch(Property->Id) { @@ -322,6 +324,7 @@ KsPinPropertyHandler( break; case KSPROPERTY_PIN_DATARANGES: + case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: Pin = (KSP_PIN*)Property; if (Pin->PinId >= DescriptorsCount) { @@ -330,9 +333,20 @@ KsPinPropertyHandler( break; } Size = sizeof(KSMULTIPLE_ITEM); - for (Index = 0; Index < Descriptor[Pin->PinId].DataRangesCount; Index++) + if (Property->Id == KSPROPERTY_PIN_DATARANGES || Descriptor[Pin->PinId].ConstrainedDataRangesCount == 0) { - Size += Descriptor[Pin->PinId].DataRanges[Index]->FormatSize; + DataRanges = Descriptor[Pin->PinId].DataRanges; + Count = Descriptor[Pin->PinId].DataRangesCount; + } + else + { + DataRanges = Descriptor[Pin->PinId].ConstrainedDataRanges; + Count = Descriptor[Pin->PinId].ConstrainedDataRangesCount; + } + + for (Index = 0; Index < Count; Index++) + { + Size += ((DataRanges[Index]->FormatSize + 0x7) & ~0x7); } if (IoStack->Parameters.DeviceIoControl.OutputBufferLength == 0) @@ -354,16 +368,9 @@ KsPinPropertyHandler( break; } - if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSMULTIPLE_ITEM)) - { - /* buffer too small */ - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - /* store descriptor size */ Item->Size = Size; - Item->Count = Descriptor[Pin->PinId].DataRangesCount; + Item->Count = Count; if (IoStack->Parameters.DeviceIoControl.OutputBufferLength == sizeof(KSMULTIPLE_ITEM)) { @@ -374,10 +381,29 @@ KsPinPropertyHandler( /* now copy all dataranges */ Data = (PUCHAR)(Item +1); - for (Index = 0; Index < Descriptor[Pin->PinId].DataRangesCount; Index++) + + /* alignment assert */ + ASSERT(((ULONG_PTR)Data & 0x7) == 0); + + for (Index = 0; Index < Count; Index++) { - RtlMoveMemory(Data, Descriptor[Pin->PinId].DataRanges[Index], Descriptor[Pin->PinId].DataRanges[Index]->FormatSize); - Data = ((PUCHAR)Data + Descriptor[Pin->PinId].DataRanges[Index]->FormatSize); + UNICODE_STRING GuidString; + /* convert the guid to string */ + RtlStringFromGUID(&DataRanges[Index]->MajorFormat, &GuidString); + DPRINT("Index %lu MajorFormat %S\n", Index, GuidString.Buffer); + RtlStringFromGUID(&DataRanges[Index]->SubFormat, &GuidString); + DPRINT("Index %lu SubFormat %S\n", Index, GuidString.Buffer); + RtlStringFromGUID(&DataRanges[Index]->Specifier, &GuidString); + DPRINT("Index %lu Specifier %S\n", Index, GuidString.Buffer); + RtlStringFromGUID(&DataRanges[Index]->Specifier, &GuidString); + DPRINT("Index %lu FormatSize %lu Flags %lu SampleSize %lu Reserved %lu KSDATAFORMAT %lu\n", Index, + DataRanges[Index]->FormatSize, DataRanges[Index]->Flags, DataRanges[Index]->SampleSize, DataRanges[Index]->Reserved, sizeof(KSDATAFORMAT)); + + RtlMoveMemory(Data, DataRanges[Index], DataRanges[Index]->FormatSize); + Data = ((PUCHAR)Data + DataRanges[Index]->FormatSize); + /* alignment assert */ + ASSERT(((ULONG_PTR)Data & 0x7) == 0); + Data = (PVOID)(((ULONG_PTR)Data + 0x7) & ~0x7); } Status = STATUS_SUCCESS; @@ -442,7 +468,9 @@ KsPinPropertyHandler( break; } + //DPRINT("Pin %lu Communication %lu\n", Pin->PinId, Descriptor[Pin->PinId].Communication); *((KSPIN_COMMUNICATION*)Buffer) = Descriptor[Pin->PinId].Communication; + Status = STATUS_SUCCESS; Irp->IoStatus.Information = Size; break; diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c index 982b717e7c8..084728f3c89 100644 --- a/reactos/drivers/ksfilter/ks/device.c +++ b/reactos/drivers/ksfilter/ks/device.c @@ -567,8 +567,12 @@ IKsDevice_Pnp( } default: DPRINT1("unhandled function %u\n", IoStack->MinorFunction); + /* pass the irp down the driver stack */ + Status = KspForwardIrpSynchronous(DeviceObject, Irp); + + Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_NOT_SUPPORTED; + return Status; } } diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index 0013770396b..d5af650d417 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -611,7 +611,7 @@ KspHandleDataIntersection( DataRange = (PKSDATARANGE)(MultipleItem + 1); /* FIXME make sure its 64 bit aligned */ - ASSERT(((ULONG_PTR)DataRange & 0x3F) == 0); + ASSERT(((ULONG_PTR)DataRange & 0x7) == 0); if (!This->Factory->FilterDescriptor || !This->PinDescriptorCount) { @@ -635,30 +635,64 @@ KspHandleDataIntersection( for(Index = 0; Index < MultipleItem->Count; Index++) { + UNICODE_STRING MajorFormat, SubFormat, Specifier; + /* convert the guid to string */ + RtlStringFromGUID(&DataRange->MajorFormat, &MajorFormat); + RtlStringFromGUID(&DataRange->SubFormat, &SubFormat); + RtlStringFromGUID(&DataRange->Specifier, &Specifier); + + DPRINT("Index %lu MajorFormat %S SubFormat %S Specifier %S FormatSize %lu SampleSize %lu Align %lu Flags %lx Reserved %lx DataLength %lu\n", Index, MajorFormat.Buffer, SubFormat.Buffer, Specifier.Buffer, + DataRange->FormatSize, DataRange->SampleSize, DataRange->Alignment, DataRange->Flags, DataRange->Reserved, DataLength); + + /* FIXME implement KsPinDataIntersectionEx */ /* Call miniport's properitary handler */ - Status = This->PinDescriptorsEx[Pin->PinId].IntersectHandler(NULL, /* context */ + Status = This->PinDescriptorsEx[Pin->PinId].IntersectHandler(&This->Filter, Irp, Pin, DataRange, - (PKSDATAFORMAT)This->PinDescriptorsEx[Pin->PinId].PinDescriptor.DataRanges, + This->PinDescriptorsEx[Pin->PinId].PinDescriptor.DataRanges[0], /* HACK */ DataLength, Data, &Length); - if (Status == STATUS_SUCCESS || Status == STATUS_BUFFER_OVERFLOW) + if (Status == STATUS_SUCCESS || Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) { + ASSERT(Length); IoStatus->Information = Length; + if (Status != STATUS_SUCCESS) + Status = STATUS_MORE_ENTRIES; break; } + DataRange = UlongToPtr(PtrToUlong(DataRange) + DataRange->FormatSize); /* FIXME make sure its 64 bit aligned */ - ASSERT(((ULONG_PTR)DataRange & 0x3F) == 0); + ASSERT(((ULONG_PTR)DataRange & 0x7) == 0); } IoStatus->Status = Status; return Status; } +NTSTATUS +NTAPI +KspTopologyPropertyHandler( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + IKsFilterImpl * This; + + /* get filter implementation */ + This = (IKsFilterImpl*)KSPROPERTY_ITEM_IRP_STORAGE(Irp); + + /* sanity check */ + ASSERT(This); + + return KsTopologyPropertyHandler(Irp, Request, Data, &This->Topology); + +} + + NTSTATUS NTAPI KspPinPropertyHandler( @@ -673,6 +707,9 @@ KspPinPropertyHandler( /* get filter implementation */ This = (IKsFilterImpl*)KSPROPERTY_ITEM_IRP_STORAGE(Irp); + /* sanity check */ + ASSERT(This); + /* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -686,7 +723,7 @@ KspPinPropertyHandler( case KSPROPERTY_PIN_COMMUNICATION: case KSPROPERTY_PIN_CATEGORY: case KSPROPERTY_PIN_NAME: - case KSPROPERTY_PIN_PROPOSEDATAFORMAT: + case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: Status = KsPinPropertyHandler(Irp, Request, Data, This->PinDescriptorCount, This->PinDescriptors); break; case KSPROPERTY_PIN_GLOBALCINSTANCES: @@ -702,16 +739,11 @@ KspPinPropertyHandler( case KSPROPERTY_PIN_DATAINTERSECTION: Status = KspHandleDataIntersection(Irp, &Irp->IoStatus, Request, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength, This); break; - case KSPROPERTY_PIN_PHYSICALCONNECTION: - case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: - UNIMPLEMENTED - Status = STATUS_NOT_IMPLEMENTED; - break; default: UNIMPLEMENTED - Status = STATUS_UNSUCCESSFUL; + Status = STATUS_NOT_FOUND; } - DPRINT("KspPinPropertyHandler Pins %lu Request->Id %lu Status %lx\n", This->PinDescriptorCount, Request->Id, Status); + //DPRINT("KspPinPropertyHandler Pins %lu Request->Id %lu Status %lx\n", This->PinDescriptorCount, Request->Id, Status); return Status; @@ -730,6 +762,7 @@ IKsFilter_DispatchDeviceIoControl( PKSFILTER FilterInstance; UNICODE_STRING GuidString; PKSPROPERTY Property; + ULONG SetCount = 0; /* obtain filter from object header */ Status = IKsFilter_GetFilterFromIrp(Irp, &Filter); @@ -742,47 +775,70 @@ IKsFilter_DispatchDeviceIoControl( /* current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* property was not handled */ + /* get property from input buffer */ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; + /* sanity check */ + ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSIDENTIFIER)); + + /* get filter instance */ + FilterInstance = Filter->lpVtbl->GetStruct(Filter); + RtlStringFromGUID(&Property->Set, &GuidString); DPRINT("IKsFilter_DispatchDeviceIoControl property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); RtlFreeUnicodeString(&GuidString); - - if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY) + if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_METHOD) { - UNIMPLEMENTED; + const KSMETHOD_SET *MethodSet = NULL; + ULONG MethodItemSize = 0; - /* release filter interface */ - Filter->lpVtbl->Release(Filter); + /* check if the driver supports method sets */ + if (FilterInstance->Descriptor->AutomationTable && FilterInstance->Descriptor->AutomationTable->MethodSetsCount) + { + SetCount = FilterInstance->Descriptor->AutomationTable->MethodSetsCount; + MethodSet = FilterInstance->Descriptor->AutomationTable->MethodSets; + MethodItemSize = FilterInstance->Descriptor->AutomationTable->MethodItemSize; + } - /* complete and forget irp */ - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_NOT_IMPLEMENTED; + /* call method set handler */ + Status = KspMethodHandlerWithAllocator(Irp, SetCount, MethodSet, NULL, MethodItemSize); } - - /* call property handler supported by ks */ - KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (KSPROPERTY_ITEM*)This; - Status = KspPropertyHandler(Irp, 2, FilterPropertySet, NULL, sizeof(KSPROPERTY_ITEM)); - - if (Status == STATUS_NOT_FOUND) + else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY) { - /* get filter instance */ - FilterInstance = Filter->lpVtbl->GetStruct(Filter); + const KSPROPERTY_SET *PropertySet = NULL; + ULONG PropertyItemSize = 0; - /* check if the driver supports property sets */ + /* check if the driver supports method sets */ if (FilterInstance->Descriptor->AutomationTable && FilterInstance->Descriptor->AutomationTable->PropertySetsCount) { - /* call driver's filter property handler */ - Status = KspPropertyHandler(Irp, - FilterInstance->Descriptor->AutomationTable->PropertySetsCount, - FilterInstance->Descriptor->AutomationTable->PropertySets, - NULL, - FilterInstance->Descriptor->AutomationTable->PropertyItemSize); + SetCount = FilterInstance->Descriptor->AutomationTable->PropertySetsCount; + PropertySet = FilterInstance->Descriptor->AutomationTable->PropertySets; + PropertyItemSize = FilterInstance->Descriptor->AutomationTable->PropertyItemSize; } + + /* needed for our property handlers */ + KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (KSPROPERTY_ITEM*)This; + + /* call property handler */ + Status = KspPropertyHandler(Irp, SetCount, PropertySet, NULL, PropertyItemSize); } + else + { + /* sanity check */ + ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT || + IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_DISABLE_EVENT); + + Status = STATUS_NOT_FOUND; + UNIMPLEMENTED; + } + + RtlStringFromGUID(&Property->Set, &GuidString); + DPRINT("IKsFilter_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information); + RtlFreeUnicodeString(&GuidString); + + /* release filter */ + Filter->lpVtbl->Release(Filter); if (Status != STATUS_PENDING) { @@ -953,6 +1009,7 @@ IKsFilter_CopyFilterDescriptor( const KSFILTER_DESCRIPTOR* FilterDescriptor) { NTSTATUS Status; + KSAUTOMATION_TABLE AutomationTable; This->Filter.Descriptor = AllocateItem(NonPagedPool, sizeof(KSFILTER_DESCRIPTOR)); if (!This->Filter.Descriptor) @@ -969,6 +1026,17 @@ IKsFilter_CopyFilterDescriptor( /* copy filter descriptor fields */ RtlMoveMemory((PVOID)This->Filter.Descriptor, FilterDescriptor, sizeof(KSFILTER_DESCRIPTOR)); + /* zero automation table */ + RtlZeroMemory(&AutomationTable, sizeof(KSAUTOMATION_TABLE)); + + /* setup filter property sets */ + AutomationTable.PropertyItemSize = sizeof(KSPROPERTY_ITEM); + AutomationTable.PropertySetsCount = 2; + AutomationTable.PropertySets = FilterPropertySet; + + /* merge filter automation table */ + Status = KsMergeAutomationTables((PKSAUTOMATION_TABLE*)&This->Filter.Descriptor->AutomationTable, (PKSAUTOMATION_TABLE)FilterDescriptor->AutomationTable, &AutomationTable, This->Filter.Bag); + return Status; } @@ -1303,7 +1371,6 @@ KspCreateFilter( This->lpVtbl = &vt_IKsFilter; This->lpVtblKsControl = &vt_IKsControl; - This->Filter.Descriptor = Factory->FilterDescriptor; This->Factory = Factory; This->FilterFactory = iface; This->FileObject = IoStack->FileObject; diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index e50490aad58..332be5cc389 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -1720,9 +1720,11 @@ FindMatchingCreateItem( PLIST_ENTRY Entry; PCREATE_ITEM_ENTRY CreateItemEntry; +#ifndef MS_KSUSER /* remove '\' slash */ Buffer++; BufferSize -= sizeof(WCHAR); +#endif /* point to first entry */ Entry = ListHead->Flink; diff --git a/reactos/drivers/ksfilter/ks/ksfunc.h b/reactos/drivers/ksfilter/ks/ksfunc.h index 8d0836af7d7..64e2582c4d4 100644 --- a/reactos/drivers/ksfilter/ks/ksfunc.h +++ b/reactos/drivers/ksfilter/ks/ksfunc.h @@ -156,3 +156,12 @@ KspSetFilterFactoriesState( IN PKSIDEVICE_HEADER DeviceHeader, IN BOOLEAN NewState); +NTSTATUS +NTAPI +KspMethodHandlerWithAllocator( + IN PIRP Irp, + IN ULONG MethodSetsCount, + IN const KSMETHOD_SET *MethodSet, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG MethodItemSize OPTIONAL); + diff --git a/reactos/drivers/ksfilter/ks/methods.c b/reactos/drivers/ksfilter/ks/methods.c index 512371a6a29..eed17bd13e5 100644 --- a/reactos/drivers/ksfilter/ks/methods.c +++ b/reactos/drivers/ksfilter/ks/methods.c @@ -8,8 +8,186 @@ #include "priv.h" +NTSTATUS +FindMethodHandler( + IN PIO_STATUS_BLOCK IoStatus, + IN const KSMETHOD_SET* MethodSet, + IN ULONG MethodSetCount, + IN PKSMETHOD Method, + IN ULONG InputBufferLength, + IN ULONG OutputBufferLength, + OUT PVOID OutputBuffer, + OUT PFNKSHANDLER *MethodHandler, + OUT PKSMETHOD_SET * Set) +{ + ULONG Index, ItemIndex; + + /* TODO */ + ASSERT((Method->Flags & KSMETHOD_TYPE_SETSUPPORT) == 0); + + for(Index = 0; Index < MethodSetCount; Index++) + { + ASSERT(MethodSet[Index].Set); + + if (IsEqualGUIDAligned(&Method->Set, MethodSet[Index].Set)) + { + for(ItemIndex = 0; ItemIndex < MethodSet[Index].MethodsCount; ItemIndex++) + { + if (MethodSet[Index].MethodItem[ItemIndex].MethodId == Method->Id) + { + if (MethodSet[Index].MethodItem[ItemIndex].MinMethod > InputBufferLength) + { + /* too small input buffer */ + IoStatus->Information = MethodSet[Index].MethodItem[ItemIndex].MinMethod; + return STATUS_INVALID_PARAMETER; + } + + if (MethodSet[Index].MethodItem[ItemIndex].MinData > OutputBufferLength) + { + /* too small output buffer */ + IoStatus->Information = MethodSet[Index].MethodItem[ItemIndex].MinData; + return STATUS_MORE_ENTRIES; + } + if (Method->Flags & KSMETHOD_TYPE_BASICSUPPORT) + { + PULONG Flags; + PKSPROPERTY_DESCRIPTION Description; + + if (sizeof(ULONG) > OutputBufferLength) + { + /* too small buffer */ + return STATUS_INVALID_PARAMETER; + } + + /* get output buffer */ + Flags = (PULONG)OutputBuffer; + + /* set flags flags */ + *Flags = MethodSet[Index].MethodItem[ItemIndex].Flags; + + IoStatus->Information = sizeof(ULONG); + + if (OutputBufferLength >= sizeof(KSPROPERTY_DESCRIPTION)) + { + /* get output buffer */ + Description = (PKSPROPERTY_DESCRIPTION)OutputBuffer; + + /* store result */ + Description->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION); + Description->PropTypeSet.Set = KSPROPTYPESETID_General; + Description->PropTypeSet.Id = 0; + Description->PropTypeSet.Flags = 0; + Description->MembersListCount = 0; + Description->Reserved = 0; + + IoStatus->Information = sizeof(KSPROPERTY_DESCRIPTION); + } + return STATUS_SUCCESS; + } + *MethodHandler = MethodSet[Index].MethodItem[ItemIndex].MethodHandler; + *Set = (PKSMETHOD_SET)&MethodSet[Index]; + return STATUS_SUCCESS; + } + } + } + } + return STATUS_NOT_FOUND; +} + +NTSTATUS +NTAPI +KspMethodHandlerWithAllocator( + IN PIRP Irp, + IN ULONG MethodSetsCount, + IN const KSMETHOD_SET *MethodSet, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG MethodItemSize OPTIONAL) +{ + PKSMETHOD Method; + PKSMETHOD_SET Set; + PIO_STACK_LOCATION IoStack; + NTSTATUS Status; + PFNKSHANDLER MethodHandler = NULL; + ULONG Index; + LPGUID Guid; + + /* get current irp stack */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* check if inputbuffer at least holds KSMETHOD item */ + if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSMETHOD)) + { + /* invalid parameter */ + Irp->IoStatus.Information = sizeof(KSPROPERTY); + return STATUS_INVALID_BUFFER_SIZE; + } + + /* FIXME probe the input / output buffer if from user mode */ + + /* get input property request */ + Method = (PKSMETHOD)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; + +// DPRINT("KspMethodHandlerWithAllocator Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM)); + + /* sanity check */ + ASSERT(MethodItemSize == 0 || MethodItemSize == sizeof(KSMETHOD_ITEM)); + + /* find the method handler */ + Status = FindMethodHandler(&Irp->IoStatus, MethodSet, MethodSetsCount, Method, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Irp->UserBuffer, &MethodHandler, &Set); + + if (NT_SUCCESS(Status) && MethodHandler) + { + /* call method handler */ + KSMETHOD_SET_IRP_STORAGE(Irp) = Set; + Status = MethodHandler(Irp, Method, Irp->UserBuffer); + + if (Status == STATUS_BUFFER_TOO_SMALL) + { + /* output buffer is too small */ + if (Allocator) + { + /* allocate the requested amount */ + Status = Allocator(Irp, Irp->IoStatus.Information, FALSE); + + /* check if the block was allocated */ + if (!NT_SUCCESS(Status)) + { + /* no memory */ + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* re-call method handler */ + Status = MethodHandler(Irp, Method, Irp->UserBuffer); + } + } + } + else if (IsEqualGUIDAligned(&Method->Set, &GUID_NULL) && Method->Id == 0 && Method->Flags == KSMETHOD_TYPE_SETSUPPORT) + { + // store output size + Irp->IoStatus.Information = sizeof(GUID) * MethodSetsCount; + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GUID) * MethodSetsCount) + { + // buffer too small + return STATUS_MORE_ENTRIES; + } + + // get output buffer + Guid = (LPGUID)Irp->UserBuffer; + + // copy property guids from property sets + for(Index = 0; Index < MethodSetsCount; Index++) + { + RtlMoveMemory(&Guid[Index], MethodSet[Index].Set, sizeof(GUID)); + } + return STATUS_SUCCESS; + } + + /* done */ + return Status; +} + /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS @@ -19,12 +197,11 @@ KsMethodHandler( IN ULONG MethodSetsCount, IN PKSMETHOD_SET MethodSet) { - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + return KspMethodHandlerWithAllocator(Irp, MethodSetsCount, MethodSet, NULL, 0); } /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS @@ -36,12 +213,39 @@ KsMethodHandlerWithAllocator( IN PFNKSALLOCATOR Allocator OPTIONAL, IN ULONG MethodItemSize OPTIONAL) { - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + return KspMethodHandlerWithAllocator(Irp, MethodSetsCount, MethodSet, Allocator, MethodItemSize); } + +NTSTATUS +FindFastMethodHandler( + IN ULONG FastIoCount, + IN const KSFASTMETHOD_ITEM * FastIoTable, + IN PKSMETHOD MethodId, + OUT PFNKSFASTHANDLER * FastPropertyHandler) +{ + ULONG Index; + + /* iterate through all items */ + for(Index = 0; Index < FastIoCount; Index++) + { + if (MethodId->Id == FastIoTable[Index].MethodId) + { + if (FastIoTable[Index].MethodSupported) + { + *FastPropertyHandler = FastIoTable[Index].MethodHandler; + return STATUS_SUCCESS; + } + } + + } + /* no fast property handler found */ + return STATUS_NOT_FOUND; +} + + /* - @unimplemented + @implemented */ KSDDKAPI BOOLEAN @@ -56,6 +260,68 @@ KsFastMethodHandler( IN ULONG MethodSetsCount, IN const KSMETHOD_SET* MethodSet) { - UNIMPLEMENTED; + KSMETHOD MethodRequest; + KPROCESSOR_MODE Mode; + NTSTATUS Status = STATUS_SUCCESS; + ULONG Index; + PFNKSFASTHANDLER FastMethodHandler; + + if (MethodLength < sizeof(KSPROPERTY)) + { + /* invalid request */ + return FALSE; + } + + /* get previous mode */ + Mode = ExGetPreviousMode(); + + if (Mode == KernelMode) + { + /* just copy it */ + RtlMoveMemory(&MethodRequest, Method, sizeof(KSMETHOD)); + } + else + { + /* need to probe the buffer */ + _SEH2_TRY + { + ProbeForRead(Method, sizeof(KSPROPERTY), sizeof(UCHAR)); + RtlMoveMemory(&MethodRequest, Method, sizeof(KSMETHOD)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Exception, get the error code */ + Status = _SEH2_GetExceptionCode(); + }_SEH2_END; + + if (!NT_SUCCESS(Status)) + return FALSE; + } + + /* are there any property sets provided */ + if (MethodSetsCount) + { + /* iterate through all property sets count */ + Index = 0; + do + { + /* does the property id match */ + if (IsEqualGUIDAligned(MethodSet[Index].Set, &MethodRequest.Set)) + { + /* try to find a fast property handler */ + Status = FindFastMethodHandler(MethodSet[Index].FastIoCount, MethodSet[Index].FastIoTable, &MethodRequest, &FastMethodHandler); + + if (NT_SUCCESS(Status)) + { + /* call fast property handler */ + ASSERT(MethodLength == sizeof(KSMETHOD)); /* FIXME check if property length is bigger -> copy params */ + ASSERT(Mode == KernelMode); /* FIXME need to probe usermode output buffer */ + return FastMethodHandler(FileObject, &MethodRequest, sizeof(KSMETHOD), Data, DataLength, IoStatus); + } + } + /* move to next item */ + Index++; + }while(Index < MethodSetsCount); + } return FALSE; } diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c index 0612fc74b9c..682d25e916d 100644 --- a/reactos/drivers/ksfilter/ks/pin.c +++ b/reactos/drivers/ksfilter/ks/pin.c @@ -21,6 +21,7 @@ typedef struct _KSISTREAM_POINTER ULONG Offset; ULONG Length; KSSTREAM_POINTER StreamPointer; + KSPIN_LOCK Lock; }KSISTREAM_POINTER, *PKSISTREAM_POINTER; typedef struct @@ -307,6 +308,7 @@ IKsPin_PinStatePropertyHandler( /* revert to old state */ This->Pin.ClientState = OldState; This->Pin.DeviceState = OldState; + DPRINT("IKsPin_PinStatePropertyHandler failed to set state %lx Result %lx\n", *NewState, Status); DbgBreakPoint(); } else @@ -429,6 +431,7 @@ IKsPin_fnQueryInterface( _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } +DPRINT("IKsPin_fnQueryInterface\n"); DbgBreakPoint(); return STATUS_UNSUCCESSFUL; } @@ -674,6 +677,9 @@ IKsReferenceClock_fnGetTime( IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + + DPRINT1("IKsReferenceClock_fnGetTime\n"); + if (!This->ClockFileObject || !This->ClockTable.GetTime) { Result = 0; @@ -695,6 +701,9 @@ IKsReferenceClock_fnGetPhysicalTime( IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + DPRINT1("IKsReferenceClock_fnGetPhysicalTime\n"); + + if (!This->ClockFileObject || !This->ClockTable.GetPhysicalTime) { Result = 0; @@ -718,6 +727,8 @@ IKsReferenceClock_fnGetCorrelatedTime( IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + DPRINT1("IKsReferenceClock_fnGetCorrelatedTime\n"); + if (!This->ClockFileObject || !This->ClockTable.GetCorrelatedTime) { Result = 0; @@ -741,6 +752,8 @@ IKsReferenceClock_fnGetCorrelatedPhysicalTime( IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); + DPRINT1("IKsReferenceClock_fnGetCorrelatedPhysicalTime\n"); + if (!This->ClockFileObject || !This->ClockTable.GetCorrelatedPhysicalTime) { Result = 0; @@ -1226,6 +1239,7 @@ IKsPin_PrepareStreamHeader( } InterlockedDecrement(&This->IrpCount); + KsDecrementCountedWorker(This->PinWorker); /* get stream header */ if (StreamPointer->Irp->RequestorMode == UserMode) @@ -1374,9 +1388,11 @@ KsStreamPointerUnlock( IN PKSSTREAM_POINTER StreamPointer, IN BOOLEAN Eject) { - UNIMPLEMENTED + PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); + DPRINT("KsStreamPointerUnlock StreamPointer %pEject %lu\n", StreamPointer, Eject); - DbgBreakPoint(); + + Pointer->Irp = NULL; } /* @@ -1687,8 +1703,12 @@ KsPinGetFirstCloneStreamPointer( IKsPinImpl * This; DPRINT("KsPinGetFirstCloneStreamPointer %p\n", Pin); -DbgBreakPoint(); + This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); + + if (!This->ClonedStreamPointer) + return NULL; + /* return first cloned stream pointer */ return &This->ClonedStreamPointer->StreamPointer; } @@ -1709,7 +1729,6 @@ DbgBreakPoint(); /* get stream pointer */ Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); - /* is there a another cloned stream pointer */ if (!Pointer->Next) return NULL; diff --git a/reactos/drivers/ksfilter/ks/topology.c b/reactos/drivers/ksfilter/ks/topology.c index 87eb1e97c98..cc4a88880e7 100644 --- a/reactos/drivers/ksfilter/ks/topology.c +++ b/reactos/drivers/ksfilter/ks/topology.c @@ -270,13 +270,3 @@ KsTopologyPropertyHandler( return Status; } -NTSTATUS -NTAPI -KspTopologyPropertyHandler( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - - return STATUS_NOT_IMPLEMENTED; -} From 7bfc8fa8eaf6b41efe61e8a41cbd501f953cea45 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 9 Apr 2010 21:10:13 +0000 Subject: [PATCH 085/261] [NTOSKRNL] Fix msvc versions of Ke386GetGlobalDescriptorTable and Ke386SetGlobalDescriptorTable. Patch by Jose Catena. See issue #5071 for more details. svn path=/trunk/; revision=46797 --- .../ntoskrnl/include/internal/i386/intrin_i.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/i386/intrin_i.h b/reactos/ntoskrnl/include/internal/i386/intrin_i.h index a78497b1871..94501841149 100644 --- a/reactos/ntoskrnl/include/internal/i386/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/i386/intrin_i.h @@ -136,17 +136,27 @@ Ke386FnInit(VOID) FORCEINLINE VOID -Ke386GetGlobalDescriptorTable(OUT PVOID Descriptor) +__sgdt(OUT PVOID Descriptor) { - __asm sgdt [Descriptor]; + __asm + { + mov eax, Descriptor + sgdt [eax] + } } +#define Ke386GetGlobalDescriptorTable __sgdt FORCEINLINE VOID -Ke386SetGlobalDescriptorTable(IN PVOID Descriptor) +__lgdt(IN PVOID Descriptor) { - __asm lgdt [Descriptor]; + __asm + { + mov eax, Descriptor + lgdt [eax] + } } +#define Ke386SetGlobalDescriptorTable __lgdt FORCEINLINE USHORT From aca1c8384f27eee35c4e0d7f516d5cb17fbba726 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 9 Apr 2010 21:11:32 +0000 Subject: [PATCH 086/261] [NTOSKRNL] - Create registry values for legacy drivers - Handle raw devices properly - Don't set DNF_STARTED before actually calling IopStartDevice - Don't set DNF_STARTED for legacy drivers inside IopCreateDeviceNode - Fixes missing entries in Device Manager for raw devices svn path=/trunk/; revision=46798 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 115 ++++++++++++++++++++++------ 1 file changed, 90 insertions(+), 25 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 93e30dc3729..14969fb18db 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -414,7 +414,10 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, UNICODE_STRING FullServiceName; UNICODE_STRING LegacyPrefix = RTL_CONSTANT_STRING(L"LEGACY_"); UNICODE_STRING UnknownDeviceName = RTL_CONSTANT_STRING(L"UNKNOWN"); - HANDLE TempHandle; + UNICODE_STRING KeyName, ClassName, ClassGUID; + PUNICODE_STRING ServiceName1; + ULONG LegacyValue; + HANDLE InstanceHandle; DPRINT("ParentNode 0x%p PhysicalDeviceObject 0x%p ServiceName %wZ\n", ParentNode, PhysicalDeviceObject, ServiceName); @@ -428,11 +431,13 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, RtlZeroMemory(Node, sizeof(DEVICE_NODE)); if (!ServiceName) - ServiceName = &UnknownDeviceName; + ServiceName1 = &UnknownDeviceName; + else + ServiceName1 = ServiceName; if (!PhysicalDeviceObject) { - FullServiceName.MaximumLength = LegacyPrefix.Length + ServiceName->Length; + FullServiceName.MaximumLength = LegacyPrefix.Length + ServiceName1->Length; FullServiceName.Length = 0; FullServiceName.Buffer = ExAllocatePool(PagedPool, FullServiceName.MaximumLength); if (!FullServiceName.Buffer) @@ -442,7 +447,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, } RtlAppendUnicodeStringToString(&FullServiceName, &LegacyPrefix); - RtlAppendUnicodeStringToString(&FullServiceName, ServiceName); + RtlAppendUnicodeStringToString(&FullServiceName, ServiceName1); Status = PnpRootCreateDevice(&FullServiceName, &PhysicalDeviceObject, &Node->InstancePath); if (!NT_SUCCESS(Status)) @@ -453,14 +458,67 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, } /* Create the device key for legacy drivers */ - Status = IopCreateDeviceKeyPath(&Node->InstancePath, &TempHandle); - if (NT_SUCCESS(Status)) - ZwClose(TempHandle); + Status = IopCreateDeviceKeyPath(&Node->InstancePath, &InstanceHandle); + if (!NT_SUCCESS(Status)) + { + ZwClose(InstanceHandle); + ExFreePool(Node); + ExFreePool(FullServiceName.Buffer); + return Status; + } + Node->ServiceName.Buffer = ExAllocatePool(PagedPool, ServiceName1->Length); + if (!Node->ServiceName.Buffer) + { + ZwClose(InstanceHandle); + ExFreePool(Node); + ExFreePool(FullServiceName.Buffer); + return Status; + } + + Node->ServiceName.MaximumLength = ServiceName1->Length; + Node->ServiceName.Length = 0; + + RtlAppendUnicodeStringToString(&Node->ServiceName, ServiceName1); + + if (ServiceName) + { + RtlInitUnicodeString(&KeyName, L"Service"); + Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_SZ, ServiceName->Buffer, ServiceName->Length); + } + + if (NT_SUCCESS(Status)) + { + RtlInitUnicodeString(&KeyName, L"Legacy"); + + LegacyValue = 1; + Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_DWORD, &LegacyValue, sizeof(LegacyValue)); + if (NT_SUCCESS(Status)) + { + RtlInitUnicodeString(&KeyName, L"Class"); + + RtlInitUnicodeString(&ClassName, L"LegacyDriver"); + Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_SZ, ClassName.Buffer, ClassName.Length); + if (NT_SUCCESS(Status)) + { + RtlInitUnicodeString(&KeyName, L"ClassGUID"); + + RtlInitUnicodeString(&ClassGUID, L"{8ECC055D-047F-11D1-A537-0000F8753ED1}"); + Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_SZ, ClassGUID.Buffer, ClassGUID.Length); + } + } + } + + ZwClose(InstanceHandle); ExFreePool(FullServiceName.Buffer); + if (!NT_SUCCESS(Status)) + { + ExFreePool(Node); + return Status; + } + /* This is for drivers passed on the command line to ntoskrnl.exe */ - IopDeviceNodeSetFlag(Node, DNF_STARTED); IopDeviceNodeSetFlag(Node, DNF_LEGACY_DRIVER); } @@ -2710,14 +2768,8 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode, DPRINT1("%wZ is using parent bus driver (%wZ)\n", &DeviceNode->InstancePath, &ParentDeviceNode->ServiceName); DeviceNode->ServiceName.Length = 0; - DeviceNode->ServiceName.MaximumLength = ParentDeviceNode->ServiceName.MaximumLength; - DeviceNode->ServiceName.Buffer = ExAllocatePool(PagedPool, DeviceNode->ServiceName.MaximumLength); - if (!DeviceNode->ServiceName.Buffer) - return STATUS_SUCCESS; - - RtlCopyUnicodeString(&DeviceNode->ServiceName, &ParentDeviceNode->ServiceName); - - IopDeviceNodeSetFlag(DeviceNode, DNF_LEGACY_DRIVER); + DeviceNode->ServiceName.MaximumLength = 0; + DeviceNode->ServiceName.Buffer = NULL; } else if (ClassGUID.Length != 0) { @@ -2796,10 +2848,23 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode, return STATUS_UNSUCCESSFUL; } #endif + if (IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED) || + IopDeviceNodeHasFlag(DeviceNode, DNF_ADDED) || + IopDeviceNodeHasFlag(DeviceNode, DNF_DISABLED)) + return STATUS_SUCCESS; - if (!IopDeviceNodeHasFlag(DeviceNode, DNF_DISABLED) && - !IopDeviceNodeHasFlag(DeviceNode, DNF_ADDED) && - !IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED)) + if (DeviceNode->ServiceName.Buffer == NULL) + { + /* We don't need to worry about loading the driver because we're + * being driven in raw mode so our parent must be loaded to get here */ + Status = IopStartDevice(DeviceNode); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IopStartDevice(%wZ) failed with status 0x%08x\n", + &DeviceNode->InstancePath, Status); + } + } + else { PLDR_DATA_TABLE_ENTRY ModuleObject; PDRIVER_OBJECT DriverObject; @@ -2844,6 +2909,7 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode, { /* Attach lower level filter drivers. */ IopAttachFilterDrivers(DeviceNode, TRUE); + /* Initialize the function driver for the device node */ Status = IopInitializeDevice(DeviceNode, DriverObject); @@ -2851,9 +2917,13 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode, { /* Attach upper level filter drivers. */ IopAttachFilterDrivers(DeviceNode, FALSE); - IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); Status = IopStartDevice(DeviceNode); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IopStartDevice(%wZ) failed with status 0x%08x\n", + &DeviceNode->InstancePath, Status); + } } else { @@ -2876,11 +2946,6 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode, } } } - else - { - DPRINT("Device %wZ is disabled or already initialized\n", - &DeviceNode->InstancePath); - } return STATUS_SUCCESS; } From f3683186aa6f551568e54e3bc6f70089ca9b0a5b Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 10 Apr 2010 04:11:45 +0000 Subject: [PATCH 087/261] [NTOSKRNL] - Cache the next instance value in the the registry so we don't have to go searching for an unused instance number every time we add a new device svn path=/trunk/; revision=46808 --- reactos/ntoskrnl/io/pnpmgr/pnproot.c | 90 +++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 15 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnproot.c b/reactos/ntoskrnl/io/pnpmgr/pnproot.c index 63a3dd59c70..7a62ed23ca8 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnproot.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnproot.c @@ -139,29 +139,19 @@ PnpRootCreateDevice( WCHAR InstancePath[5]; PPNPROOT_DEVICE Device = NULL; NTSTATUS Status; - ULONG i; UNICODE_STRING PathSep = RTL_CONSTANT_STRING(L"\\"); + ULONG NextInstance; + UNICODE_STRING EnumKeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\" REGSTR_PATH_SYSTEMENUM); + HANDLE EnumHandle, DeviceKeyHandle = INVALID_HANDLE_VALUE; + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + OBJECT_ATTRIBUTES ObjectAttributes; DeviceExtension = PnpRootDeviceObject->DeviceExtension; KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock); DPRINT("Creating a PnP root device for service '%wZ'\n", ServiceName); - /* Search for a free instance ID */ _snwprintf(DevicePath, sizeof(DevicePath) / sizeof(WCHAR), L"%s\\%wZ", REGSTR_KEY_ROOTENUM, ServiceName); - for (i = 0; i < 9999; i++) - { - _snwprintf(InstancePath, sizeof(InstancePath) / sizeof(WCHAR), L"%04lu", i); - Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath, &Device); - if (Status == STATUS_NO_SUCH_DEVICE) - break; - } - if (i == 9999) - { - DPRINT1("Too much legacy devices reported for service '%wZ'\n", ServiceName); - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } /* Initialize a PNPROOT_DEVICE structure */ Device = ExAllocatePoolWithTag(PagedPool, sizeof(PNPROOT_DEVICE), TAG_PNP_ROOT); @@ -177,6 +167,74 @@ PnpRootCreateDevice( Status = STATUS_NO_MEMORY; goto cleanup; } + + Status = IopOpenRegistryKeyEx(&EnumHandle, NULL, &EnumKeyName, KEY_READ); + if (NT_SUCCESS(Status)) + { + InitializeObjectAttributes(&ObjectAttributes, &Device->DeviceID, OBJ_CASE_INSENSITIVE, EnumHandle, NULL); + Status = ZwCreateKey(&DeviceKeyHandle, KEY_SET_VALUE, &ObjectAttributes, 0, NULL, 0, NULL); + ZwClose(EnumHandle); + } + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open registry key\n"); + goto cleanup; + } + +tryagain: + RtlZeroMemory(QueryTable, sizeof(QueryTable)); + QueryTable[0].Name = L"NextInstance"; + QueryTable[0].EntryContext = &NextInstance; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, + (PWSTR)DeviceKeyHandle, + QueryTable, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + { + for (NextInstance = 0; NextInstance <= 9999; NextInstance++) + { + _snwprintf(InstancePath, sizeof(InstancePath) / sizeof(WCHAR), L"%04lu", NextInstance); + Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath, &Device); + if (Status == STATUS_NO_SUCH_DEVICE) + break; + } + + if (NextInstance > 9999) + { + DPRINT1("Too many legacy devices reported for service '%wZ'\n", ServiceName); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + } + + _snwprintf(InstancePath, sizeof(InstancePath) / sizeof(WCHAR), L"%04lu", NextInstance); + Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath, &Device); + if (Status != STATUS_NO_SUCH_DEVICE || NextInstance > 9999) + { + DPRINT1("NextInstance value is corrupt! (%d)\n", NextInstance); + RtlDeleteRegistryValue(RTL_REGISTRY_HANDLE, + (PWSTR)DeviceKeyHandle, + L"NextInstance"); + goto tryagain; + } + + NextInstance++; + Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE, + (PWSTR)DeviceKeyHandle, + L"NextInstance", + REG_DWORD, + &NextInstance, + sizeof(NextInstance)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to write new NextInstance value! (0x%x)\n", Status); + goto cleanup; + } + if (!RtlCreateUnicodeString(&Device->InstanceID, InstancePath)) { Status = STATUS_NO_MEMORY; @@ -243,6 +301,8 @@ cleanup: RtlFreeUnicodeString(&Device->InstanceID); ExFreePoolWithTag(Device, TAG_PNP_ROOT); } + if (DeviceKeyHandle != INVALID_HANDLE_VALUE) + ZwClose(DeviceKeyHandle); return Status; } From 109f0d331ada723a53b9d4ae27b1a71298302bb3 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sat, 10 Apr 2010 09:14:18 +0000 Subject: [PATCH 088/261] [rbuild] MSVC backend: - Fix compilation when using paths with spaces - Fix spec and pspec rules to generate correctly the def and stubs file - Group auto-generated files together - Rename some user macros to more appropriate names - Some cleanup svn path=/trunk/; revision=46809 --- .../tools/rbuild/backend/msvc/projmaker.cpp | 14 +++ .../rbuild/backend/msvc/s_as_mscpp.rules | 2 +- reactos/tools/rbuild/backend/msvc/spec.rules | 30 +++--- .../tools/rbuild/backend/msvc/vcprojmaker.cpp | 99 +++++++++---------- .../rbuild/backend/msvc/vspropsmaker.cpp | 38 ++++--- 5 files changed, 95 insertions(+), 88 deletions(-) diff --git a/reactos/tools/rbuild/backend/msvc/projmaker.cpp b/reactos/tools/rbuild/backend/msvc/projmaker.cpp index efcfd2fb1f5..89bf13bb5ef 100644 --- a/reactos/tools/rbuild/backend/msvc/projmaker.cpp +++ b/reactos/tools/rbuild/backend/msvc/projmaker.cpp @@ -69,6 +69,20 @@ void ProjMaker::_generate_user_configuration() { #if 0 + string computername; + string username; + string vcproj_file_user = ""; + + if (getenv ( "USERNAME" ) != NULL) + username = getenv ( "USERNAME" ); + if (getenv ( "COMPUTERNAME" ) != NULL) + computername = getenv ( "COMPUTERNAME" ); + else if (getenv ( "HOSTNAME" ) != NULL) + computername = getenv ( "HOSTNAME" ); + + if ((computername != "") && (username != "")) + vcproj_file_user = vcproj_file + "." + computername + "." + username + ".user"; + /* User configuration file */ if (vcproj_file_user != "") { diff --git a/reactos/tools/rbuild/backend/msvc/s_as_mscpp.rules b/reactos/tools/rbuild/backend/msvc/s_as_mscpp.rules index d61a5247496..ec4a41b742c 100644 --- a/reactos/tools/rbuild/backend/msvc/s_as_mscpp.rules +++ b/reactos/tools/rbuild/backend/msvc/s_as_mscpp.rules @@ -7,7 +7,7 @@ + @@ -37,18 +44,11 @@ Switch="/I "[value]"" Delimited="true" /> - diff --git a/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp b/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp index 582601b3a77..ecd04e0d22b 100644 --- a/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp +++ b/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp @@ -90,11 +90,11 @@ VCProjMaker::_get_file_path( FileLocation* file, std::string relative_path) } else if(file->directory == IntermediateDirectory) { - return std::string("$(obj)\\") + file->relative_path; + return std::string("$(RootIntDir)\\") + file->relative_path; } else if(file->directory == OutputDirectory) { - return std::string("$(out)\\") + file->relative_path; + return std::string("$(RootOutDir)\\") + file->relative_path; } return std::string(""); @@ -107,51 +107,30 @@ VCProjMaker::_generate_proj_file ( const Module& module ) { size_t i; - string computername; - string username; - // make sure the containers are empty header_files.clear(); includes.clear(); libraries.clear(); common_defines.clear(); - if (getenv ( "USERNAME" ) != NULL) - username = getenv ( "USERNAME" ); - if (getenv ( "COMPUTERNAME" ) != NULL) - computername = getenv ( "COMPUTERNAME" ); - else if (getenv ( "HOSTNAME" ) != NULL) - computername = getenv ( "HOSTNAME" ); - - string vcproj_file_user = ""; - - if ((computername != "") && (username != "")) - vcproj_file_user = vcproj_file + "." + computername + "." + username + ".user"; - printf ( "Creating MSVC project: '%s'\n", vcproj_file.c_str() ); string path_basedir = module.GetPathToBaseDir (); - string vcdir; - - - if ( configuration.UseVSVersionInPath ) - { - vcdir = DEF_SSEP + _get_vc_dir(); - } bool include_idl = false; - vector source_files, resource_files; - vector ifs_list; + vector source_files, resource_files, generated_files; - const IfableData& data = module.non_if_data/**ifs_list.back()*/; + const IfableData& data = module.non_if_data; const vector& files = data.files; for ( i = 0; i < files.size(); i++ ) { string path = _get_file_path(&files[i]->file, module.output->relative_path); string file = path + std::string("\\") + files[i]->file.name; - if ( !stricmp ( Right(file,3).c_str(), ".rc" ) ) + if (files[i]->file.directory != SourceDirectory) + generated_files.push_back ( file ); + else if ( !stricmp ( Right(file,3).c_str(), ".rc" ) ) resource_files.push_back ( file ); else if ( !stricmp ( Right(file,2).c_str(), ".h" ) ) header_files.push_back ( file ); @@ -176,7 +155,7 @@ VCProjMaker::_generate_proj_file ( const Module& module ) const vector& libs = data.libraries; for ( i = 0; i < libs.size(); i++ ) { - string libpath = "$(out)\\" + libs[i]->importedModule->output->relative_path + "\\" + _get_vc_dir() + "\\$(ConfigurationName)\\" + libs[i]->name + ".lib"; + string libpath = "$(RootOutDir)\\" + libs[i]->importedModule->output->relative_path + "\\" + _get_vc_dir() + "\\$(ConfigurationName)\\" + libs[i]->name + ".lib"; libraries.push_back ( libpath ); } const vector& defs = data.defines; @@ -197,10 +176,20 @@ VCProjMaker::_generate_proj_file ( const Module& module ) baseaddr = prop.value; } - if(module.IsSpecDefinitionFile()) + if(module.importLibrary) { - std::string path = _get_file_path(module.importLibrary->source, module.output->relative_path); - source_files.push_back ( path + std::string("\\") + module.importLibrary->source->name ); + std::string ImportLibraryPath = _get_file_path(module.importLibrary->source, module.output->relative_path); + + switch (module.IsSpecDefinitionFile()) + { + case PSpec: + generated_files.push_back("$(IntDir)\\" + ReplaceExtension(module.importLibrary->source->name,".spec")); + case Spec: + generated_files.push_back("$(IntDir)\\" + ReplaceExtension(module.importLibrary->source->name,".stubs.c")); + generated_files.push_back("$(IntDir)\\" + ReplaceExtension(module.importLibrary->source->name,".def")); + default: + source_files.push_back(ImportLibraryPath + std::string("\\") + module.importLibrary->source->name); + } } fprintf ( OUT, "\r\n" ); @@ -263,6 +252,19 @@ VCProjMaker::_generate_proj_file ( const Module& module ) // Write out the project files fprintf ( OUT, "\t\r\n" ); + // Generated files + fprintf ( OUT, "\t\t\r\n" ); + for( i = 0; i < generated_files.size(); i++) + { + string source_file = DosSeparator(generated_files[i]); + + fprintf ( OUT, "\t\t\t\r\n", source_file.c_str() ); + fprintf ( OUT, "\t\t\t\r\n"); + } + fprintf ( OUT, "\t\t\r\n" ); + // Source files fprintf ( OUT, "\t\t\r\n" ); + fprintf ( OUT, "%s\t\tName=\"%s|Win32\"\r\n", indent_tab.c_str(),config.name.c_str() ); + fprintf ( OUT, "%s\t\tExcludedFromBuild=\"true\"\r\n",indent_tab.c_str()); + fprintf ( OUT, ">\r\n" ); +#if 0 fprintf ( OUT, "%s\t\t\r\n", indent_tab.c_str() ); } +#endif fprintf ( OUT, "%s\t\r\n", indent_tab.c_str() ); } //} @@ -430,6 +434,11 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, string intermediatedir = ""; string importLib; + if ( configuration.UseVSVersionInPath ) + { + vcdir = DEF_SSEP + _get_vc_dir(); + } + if(module.IsSpecDefinitionFile()) { importLib = "$(IntDir)\\$(ProjectName).def"; @@ -456,23 +465,18 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, else CfgType = ConfigUnknown; - if ( configuration.UseVSVersionInPath ) - { - vcdir = DEF_SSEP + _get_vc_dir(); - } - fprintf ( OUT, "\t\trelative_path.c_str (), vcdir.c_str () ); - fprintf ( OUT, "\t\t\tIntermediateDirectory=\"$(obj)\\%s%s\\$(ConfigurationName)\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); + fprintf ( OUT, "\t\t\tOutputDirectory=\"$(RootOutDir)\\%s%s\\$(ConfigurationName)\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); + fprintf ( OUT, "\t\t\tIntermediateDirectory=\"$(RootIntDir)\\%s%s\\$(ConfigurationName)\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); } else { - fprintf ( OUT, "\t\t\tOutputDirectory=\"$(out)\\%s%s\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); - fprintf ( OUT, "\t\t\tIntermediateDirectory=\"$(obj)\\%s%s\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); + fprintf ( OUT, "\t\t\tOutputDirectory=\"$(RootOutDir)\\%s%s\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); + fprintf ( OUT, "\t\t\tIntermediateDirectory=\"$(RootIntDir)\\%s%s\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); } fprintf ( OUT, "\t\t\tConfigurationType=\"%d\"\r\n", CfgType ); @@ -751,8 +755,6 @@ VCProjMaker::_generate_makefile_configuration( const Module& module, const MSVCC string outdir; string intdir; - string vcdir; - if ( intenv == "obj-i386" ) intdir = path_basedir + "obj-i386"; /* append relative dir from project dir */ @@ -764,11 +766,6 @@ VCProjMaker::_generate_makefile_configuration( const Module& module, const MSVCC else outdir = outenv; - if ( configuration.UseVSVersionInPath ) - { - vcdir = DEF_SSEP + _get_vc_dir(); - } - fprintf ( OUT, "\t\t& incs = data.includes; for ( i = 0; i < incs.size(); i++ ) { - if ((strncmp(incs[i]->directory->relative_path.c_str(), "include\\crt", 11 ) || - strncmp(incs[i]->directory->relative_path.c_str(), "include\\ddk", 11 ) || - strncmp(incs[i]->directory->relative_path.c_str(), "include\\GL", 10 ) || - strncmp(incs[i]->directory->relative_path.c_str(), "include\\psdk", 12 ) || - strncmp(incs[i]->directory->relative_path.c_str(), "include\\reactos\\wine", 20 )) && + if ((incs[i]->directory->relative_path == "include\\crt" || + incs[i]->directory->relative_path == "include\\ddk" || + incs[i]->directory->relative_path == "include\\GL" || + incs[i]->directory->relative_path == "include\\psdk") && ! use_ros_headers) { continue; } if(incs[i]->directory->directory == SourceDirectory) - fprintf ( OUT, ""$(src)\\"); + fprintf ( OUT, "$(RootSrcDir)\\"); else if (incs[i]->directory->directory == IntermediateDirectory) - fprintf ( OUT, ""$(obj)\\"); + fprintf ( OUT, "$(RootIntDir)\\"); else if (incs[i]->directory->directory == OutputDirectory) - fprintf ( OUT, ""$(out)\\"); + fprintf ( OUT, "$(RootOutDir)\\"); else continue; fprintf ( OUT, incs[i]->directory->relative_path.c_str()); - fprintf ( OUT, "" ; "); + fprintf ( OUT, " ; "); } - fprintf ( OUT, ""$(obj)\\include" ; "); - fprintf ( OUT, ""$(obj)\\include\\reactos" ; "); + fprintf ( OUT, "$(RootIntDir)\\include ; "); + fprintf ( OUT, "$(RootIntDir)\\include\\reactos ; "); if ( !use_ros_headers ) { @@ -180,9 +179,9 @@ PropsMaker::_generate_global_includes() if (getenv ( "BASEDIR" ) != NULL) { string WdkBase = getenv ( "BASEDIR" ); - fprintf ( OUT, ""%s\\inc\\api" ; ", WdkBase.c_str()); - fprintf ( OUT, ""%s\\inc\\crt" ; ", WdkBase.c_str()); - fprintf ( OUT, ""%s\\inc\\ddk" ; ", WdkBase.c_str()); + fprintf ( OUT, "%s\\inc\\api ; ", WdkBase.c_str()); + fprintf ( OUT, "%s\\inc\\crt ; ", WdkBase.c_str()); + fprintf ( OUT, "%s\\inc\\ddk ; ", WdkBase.c_str()); } } fprintf ( OUT, "\"\r\n"); @@ -193,9 +192,6 @@ PropsMaker::_generate_global_includes() void PropsMaker::_generate_global_definitions() { - - string global_defines = ""; - fprintf ( OUT, "\t Date: Sat, 10 Apr 2010 11:44:57 +0000 Subject: [PATCH 089/261] Enable old access check code until the bug that keeps the device installer from working has been fixed. svn path=/trunk/; revision=46811 --- reactos/ntoskrnl/se/semgr.c | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 0cb0da49e07..de374473139 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -377,6 +377,9 @@ SeSetSecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, } } + +#define OLD_ACCESS_CHECK + BOOLEAN NTAPI SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, @@ -389,6 +392,9 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PNTSTATUS AccessStatus) { LUID_AND_ATTRIBUTES Privilege; +#ifdef OLD_ACCESS_CHECK + ACCESS_MASK CurrentAccess, AccessMask; +#endif ACCESS_MASK RemainingAccess; ACCESS_MASK TempAccess; ACCESS_MASK TempGrantedAccess = 0; @@ -426,6 +432,9 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, if (PreviouslyGrantedAccess) RtlMapGenericMask(&PreviouslyGrantedAccess, GenericMapping); +#ifdef OLD_ACCESS_CHECK + CurrentAccess = PreviouslyGrantedAccess; +#endif /* Initialize remaining access rights */ RemainingAccess = DesiredAccess; @@ -490,6 +499,10 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return TRUE; } +#ifdef OLD_ACCESS_CHECK + CurrentAccess = PreviouslyGrantedAccess; +#endif + /* RULE 2: Check token for 'take ownership' privilege */ if (DesiredAccess & WRITE_OWNER) { @@ -505,6 +518,9 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, /* Adjust access rights */ RemainingAccess &= ~WRITE_OWNER; PreviouslyGrantedAccess |= WRITE_OWNER; +#ifdef OLD_ACCESS_CHECK + CurrentAccess |= WRITE_OWNER; +#endif /* Succeed if there are no more rights to grant */ if (RemainingAccess == 0) @@ -618,6 +634,11 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { if (SepSidInToken(Token, Sid)) { +#ifdef OLD_ACCESS_CHECK + *GrantedAccess = 0; + *AccessStatus = STATUS_ACCESS_DENIED; + return FALSE; +#else /* Map access rights from the ACE */ TempAccess = CurrentAce->AccessMask; RtlMapGenericMask(&TempAccess, GenericMapping); @@ -625,18 +646,25 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, /* Leave if a remaining right must be denied */ if (RemainingAccess & TempAccess) break; +#endif } } else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) { if (SepSidInToken(Token, Sid)) { +#ifdef OLD_ACCESS_CHECK + AccessMask = CurrentAce->AccessMask; + RtlMapGenericMask(&AccessMask, GenericMapping); + CurrentAccess |= AccessMask; +#else /* Map access rights from the ACE */ TempAccess = CurrentAce->AccessMask; RtlMapGenericMask(&TempAccess, GenericMapping); /* Remove granted rights */ RemainingAccess &= ~TempAccess; +#endif } } else @@ -649,6 +677,28 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, CurrentAce = (PACE)((ULONG_PTR)CurrentAce + CurrentAce->Header.AceSize); } +#ifdef OLD_ACCESS_CHECK + DPRINT("CurrentAccess %08lx\n DesiredAccess %08lx\n", + CurrentAccess, DesiredAccess); + + *GrantedAccess = CurrentAccess & DesiredAccess; + + if ((*GrantedAccess & ~VALID_INHERIT_FLAGS) == + (DesiredAccess & ~VALID_INHERIT_FLAGS)) + { + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } + else + { + DPRINT1("HACK: Should deny access for caller: granted 0x%lx, desired 0x%lx (generic mapping %p).\n", + *GrantedAccess, DesiredAccess, GenericMapping); + //*AccessStatus = STATUS_ACCESS_DENIED; + //return FALSE; + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } +#else DPRINT("DesiredAccess %08lx\nPreviouslyGrantedAccess %08lx\nRemainingAccess %08lx\n", DesiredAccess, PreviouslyGrantedAccess, RemainingAccess); @@ -674,6 +724,7 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, *AccessStatus = STATUS_SUCCESS; return TRUE; +#endif } static PSID From 66425524eaaa22108c5773c305042abf81c0b1fa Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 10 Apr 2010 12:49:41 +0000 Subject: [PATCH 090/261] [TASKMGR] - Add routine to query process index from performance data - Remove process page index caching, query the index using the new routine - Fixes "ghost processes" in the task manager, which were shown due to data access with invalid indexes - Some changes for improved performance: use local process id's where suitable, only start checking for new processes if the item performance data and listview counts differ See issue #4661 for more details. svn path=/trunk/; revision=46812 --- reactos/base/applications/taskmgr/perfdata.c | 23 ++++ reactos/base/applications/taskmgr/procpage.c | 127 ++++++++++--------- 2 files changed, 91 insertions(+), 59 deletions(-) diff --git a/reactos/base/applications/taskmgr/perfdata.c b/reactos/base/applications/taskmgr/perfdata.c index 92c01672c6f..eab5dac00e5 100644 --- a/reactos/base/applications/taskmgr/perfdata.c +++ b/reactos/base/applications/taskmgr/perfdata.c @@ -356,6 +356,29 @@ ClearInfo: LeaveCriticalSection(&PerfDataCriticalSection); } +ULONG PerfDataGetProcessIndex(ULONG pid) +{ + ULONG idx; + + EnterCriticalSection(&PerfDataCriticalSection); + + for (idx = 0; idx < ProcessCount; idx++) + { + if (PtrToUlong(pPerfData[idx].ProcessId) == pid) + { + break; + } + } + + LeaveCriticalSection(&PerfDataCriticalSection); + + if (idx == ProcessCount) + { + return -1; + } + return idx; +} + ULONG PerfDataGetProcessCount(void) { return ProcessCount; diff --git a/reactos/base/applications/taskmgr/procpage.c b/reactos/base/applications/taskmgr/procpage.c index efcaa922e5f..42bf5949ea7 100644 --- a/reactos/base/applications/taskmgr/procpage.c +++ b/reactos/base/applications/taskmgr/procpage.c @@ -28,7 +28,6 @@ typedef struct { - ULONG Index; ULONG ProcessId; } PROCESS_PAGE_LIST_ITEM, *LPPROCESS_PAGE_LIST_ITEM; @@ -67,7 +66,7 @@ int ProcGetIndexByProcessId(DWORD dwProcessId) item.iItem = i; (void)ListView_GetItem(hProcessPageListCtrl, &item); pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam; - if (PerfDataGetProcessId(pData->Index) == dwProcessId) + if (pData->ProcessId == dwProcessId) { return i; } @@ -92,7 +91,7 @@ DWORD GetSelectedProcessId(void) (void)ListView_GetItem(hProcessPageListCtrl, &lvitem); if (lvitem.lParam) - return PerfDataGetProcessId(((LPPROCESS_PAGE_LIST_ITEM)lvitem.lParam)->Index); + return ((LPPROCESS_PAGE_LIST_ITEM)lvitem.lParam)->ProcessId; } return 0; @@ -240,7 +239,7 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam) break; pData = (LPPROCESS_PAGE_LIST_ITEM)pnmdi->item.lParam; - Index = pData->Index; + Index = PerfDataGetProcessIndex(pData->ProcessId); ColumnIndex = pnmdi->item.iSubItem; PerfDataGetText(Index, ColumnIndex, pnmdi->item.pszText, pnmdi->item.cchTextMax); @@ -435,7 +434,7 @@ void UpdateProcesses() { int i; ULONG l; - LV_ITEM item; + LV_ITEM item; LPPROCESS_PAGE_LIST_ITEM pData; /* Remove old processes */ @@ -452,10 +451,17 @@ void UpdateProcesses() HeapFree(GetProcessHeap(), 0, pData); } } - for (l = 0; l < PerfDataGetProcessCount(); l++) + + /* Check for difference in listview process and performance process counts */ + if (ListView_GetItemCount(hProcessPageListCtrl) != PerfDataGetProcessCount()) { - AddProcess(l); + /* Add new processes by checking against the current items */ + for (l = 0; l < PerfDataGetProcessCount(); l++) + { + AddProcess(l); + } } + if (TaskManagerSettings.SortColumn != -1) { (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL); @@ -503,7 +509,7 @@ void AddProcess(ULONG Index) item.iItem = i; (void)ListView_GetItem(hProcessPageListCtrl, &item); pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam; - if (PerfDataGetProcessId(pData->Index) == pid) + if (pData->ProcessId == pid) { bAlreadyInList = TRUE; break; @@ -512,7 +518,6 @@ void AddProcess(ULONG Index) if (!bAlreadyInList) /* Add */ { pData = (LPPROCESS_PAGE_LIST_ITEM)HeapAlloc(GetProcessHeap(), 0, sizeof(PROCESS_PAGE_LIST_ITEM)); - pData->Index = Index; pData->ProcessId = pid; /* Add the item to the list */ @@ -707,6 +712,8 @@ int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lPara int ret = 0; LPPROCESS_PAGE_LIST_ITEM Param1; LPPROCESS_PAGE_LIST_ITEM Param2; + ULONG IndexParam1; + ULONG IndexParam2; WCHAR text1[260]; WCHAR text2[260]; ULONG l1; @@ -725,165 +732,167 @@ int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lPara Param1 = (LPPROCESS_PAGE_LIST_ITEM)lParam2; Param2 = (LPPROCESS_PAGE_LIST_ITEM)lParam1; } + IndexParam1 = PerfDataGetProcessIndex(Param1->ProcessId); + IndexParam2 = PerfDataGetProcessIndex(Param2->ProcessId); if (TaskManagerSettings.SortColumn == COLUMN_IMAGENAME) { - PerfDataGetImageName(Param1->Index, text1, sizeof (text1) / sizeof (*text1)); - PerfDataGetImageName(Param2->Index, text2, sizeof (text2) / sizeof (*text2)); + PerfDataGetImageName(IndexParam1, text1, sizeof (text1) / sizeof (*text1)); + PerfDataGetImageName(IndexParam2, text2, sizeof (text2) / sizeof (*text2)); ret = _wcsicmp(text1, text2); } else if (TaskManagerSettings.SortColumn == COLUMN_PID) { - l1 = PerfDataGetProcessId(Param1->Index); - l2 = PerfDataGetProcessId(Param2->Index); + l1 = Param1->ProcessId; + l2 = Param2->ProcessId; ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_USERNAME) { - PerfDataGetUserName(Param1->Index, text1, sizeof (text1) / sizeof (*text1)); - PerfDataGetUserName(Param2->Index, text2, sizeof (text2) / sizeof (*text2)); + PerfDataGetUserName(IndexParam1, text1, sizeof (text1) / sizeof (*text1)); + PerfDataGetUserName(IndexParam2, text2, sizeof (text2) / sizeof (*text2)); ret = _wcsicmp(text1, text2); } else if (TaskManagerSettings.SortColumn == COLUMN_SESSIONID) { - l1 = PerfDataGetSessionId(Param1->Index); - l2 = PerfDataGetSessionId(Param2->Index); + l1 = PerfDataGetSessionId(IndexParam1); + l2 = PerfDataGetSessionId(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_CPUUSAGE) { - l1 = PerfDataGetCPUUsage(Param1->Index); - l2 = PerfDataGetCPUUsage(Param2->Index); + l1 = PerfDataGetCPUUsage(IndexParam1); + l2 = PerfDataGetCPUUsage(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_CPUTIME) { - time1 = PerfDataGetCPUTime(Param1->Index); - time2 = PerfDataGetCPUTime(Param2->Index); + time1 = PerfDataGetCPUTime(IndexParam1); + time2 = PerfDataGetCPUTime(IndexParam2); ret = largeintcmp(time1, time2); } else if (TaskManagerSettings.SortColumn == COLUMN_MEMORYUSAGE) { - l1 = PerfDataGetWorkingSetSizeBytes(Param1->Index); - l2 = PerfDataGetWorkingSetSizeBytes(Param2->Index); + l1 = PerfDataGetWorkingSetSizeBytes(IndexParam1); + l2 = PerfDataGetWorkingSetSizeBytes(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_PEAKMEMORYUSAGE) { - l1 = PerfDataGetPeakWorkingSetSizeBytes(Param1->Index); - l2 = PerfDataGetPeakWorkingSetSizeBytes(Param2->Index); + l1 = PerfDataGetPeakWorkingSetSizeBytes(IndexParam1); + l2 = PerfDataGetPeakWorkingSetSizeBytes(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_MEMORYUSAGEDELTA) { - l1 = PerfDataGetWorkingSetSizeDelta(Param1->Index); - l2 = PerfDataGetWorkingSetSizeDelta(Param2->Index); + l1 = PerfDataGetWorkingSetSizeDelta(IndexParam1); + l2 = PerfDataGetWorkingSetSizeDelta(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_PAGEFAULTS) { - l1 = PerfDataGetPageFaultCount(Param1->Index); - l2 = PerfDataGetPageFaultCount(Param2->Index); + l1 = PerfDataGetPageFaultCount(IndexParam1); + l2 = PerfDataGetPageFaultCount(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_PAGEFAULTSDELTA) { - l1 = PerfDataGetPageFaultCountDelta(Param1->Index); - l2 = PerfDataGetPageFaultCountDelta(Param2->Index); + l1 = PerfDataGetPageFaultCountDelta(IndexParam1); + l2 = PerfDataGetPageFaultCountDelta(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_VIRTUALMEMORYSIZE) { - l1 = PerfDataGetVirtualMemorySizeBytes(Param1->Index); - l2 = PerfDataGetVirtualMemorySizeBytes(Param2->Index); + l1 = PerfDataGetVirtualMemorySizeBytes(IndexParam1); + l2 = PerfDataGetVirtualMemorySizeBytes(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_PAGEDPOOL) { - l1 = PerfDataGetPagedPoolUsagePages(Param1->Index); - l2 = PerfDataGetPagedPoolUsagePages(Param2->Index); + l1 = PerfDataGetPagedPoolUsagePages(IndexParam1); + l2 = PerfDataGetPagedPoolUsagePages(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_NONPAGEDPOOL) { - l1 = PerfDataGetNonPagedPoolUsagePages(Param1->Index); - l2 = PerfDataGetNonPagedPoolUsagePages(Param2->Index); + l1 = PerfDataGetNonPagedPoolUsagePages(IndexParam1); + l2 = PerfDataGetNonPagedPoolUsagePages(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_BASEPRIORITY) { - l1 = PerfDataGetBasePriority(Param1->Index); - l2 = PerfDataGetBasePriority(Param2->Index); + l1 = PerfDataGetBasePriority(IndexParam1); + l2 = PerfDataGetBasePriority(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_HANDLECOUNT) { - l1 = PerfDataGetHandleCount(Param1->Index); - l2 = PerfDataGetHandleCount(Param2->Index); + l1 = PerfDataGetHandleCount(IndexParam1); + l2 = PerfDataGetHandleCount(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_THREADCOUNT) { - l1 = PerfDataGetThreadCount(Param1->Index); - l2 = PerfDataGetThreadCount(Param2->Index); + l1 = PerfDataGetThreadCount(IndexParam1); + l2 = PerfDataGetThreadCount(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_USEROBJECTS) { - l1 = PerfDataGetUSERObjectCount(Param1->Index); - l2 = PerfDataGetUSERObjectCount(Param2->Index); + l1 = PerfDataGetUSERObjectCount(IndexParam1); + l2 = PerfDataGetUSERObjectCount(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_GDIOBJECTS) { - l1 = PerfDataGetGDIObjectCount(Param1->Index); - l2 = PerfDataGetGDIObjectCount(Param2->Index); + l1 = PerfDataGetGDIObjectCount(IndexParam1); + l2 = PerfDataGetGDIObjectCount(IndexParam2); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOREADS) { - PerfDataGetIOCounters(Param1->Index, &iocounters1); - PerfDataGetIOCounters(Param2->Index, &iocounters2); + PerfDataGetIOCounters(IndexParam1, &iocounters1); + PerfDataGetIOCounters(IndexParam2, &iocounters2); ull1 = iocounters1.ReadOperationCount; ull2 = iocounters2.ReadOperationCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOWRITES) { - PerfDataGetIOCounters(Param1->Index, &iocounters1); - PerfDataGetIOCounters(Param2->Index, &iocounters2); + PerfDataGetIOCounters(IndexParam1, &iocounters1); + PerfDataGetIOCounters(IndexParam2, &iocounters2); ull1 = iocounters1.WriteOperationCount; ull2 = iocounters2.WriteOperationCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOOTHER) { - PerfDataGetIOCounters(Param1->Index, &iocounters1); - PerfDataGetIOCounters(Param2->Index, &iocounters2); + PerfDataGetIOCounters(IndexParam1, &iocounters1); + PerfDataGetIOCounters(IndexParam2, &iocounters2); ull1 = iocounters1.OtherOperationCount; ull2 = iocounters2.OtherOperationCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOREADBYTES) { - PerfDataGetIOCounters(Param1->Index, &iocounters1); - PerfDataGetIOCounters(Param2->Index, &iocounters2); + PerfDataGetIOCounters(IndexParam1, &iocounters1); + PerfDataGetIOCounters(IndexParam2, &iocounters2); ull1 = iocounters1.ReadTransferCount; ull2 = iocounters2.ReadTransferCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOWRITEBYTES) { - PerfDataGetIOCounters(Param1->Index, &iocounters1); - PerfDataGetIOCounters(Param2->Index, &iocounters2); + PerfDataGetIOCounters(IndexParam1, &iocounters1); + PerfDataGetIOCounters(IndexParam2, &iocounters2); ull1 = iocounters1.WriteTransferCount; ull2 = iocounters2.WriteTransferCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOOTHERBYTES) { - PerfDataGetIOCounters(Param1->Index, &iocounters1); - PerfDataGetIOCounters(Param2->Index, &iocounters2); + PerfDataGetIOCounters(IndexParam1, &iocounters1); + PerfDataGetIOCounters(IndexParam2, &iocounters2); ull1 = iocounters1.OtherTransferCount; ull2 = iocounters2.OtherTransferCount; ret = CMP(ull1, ull2); From 6fb8027ffd2eaae57bb5ca85125c2ec8d21acb26 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sat, 10 Apr 2010 14:12:54 +0000 Subject: [PATCH 091/261] Add declaration for PerfDataGetProcessIndex. Fixes taskmgr build without compilation units. svn path=/trunk/; revision=46813 --- reactos/base/applications/taskmgr/perfdata.h | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/base/applications/taskmgr/perfdata.h b/reactos/base/applications/taskmgr/perfdata.h index 00c2d6dc21a..6bb7005ceaa 100644 --- a/reactos/base/applications/taskmgr/perfdata.h +++ b/reactos/base/applications/taskmgr/perfdata.h @@ -60,6 +60,7 @@ void PerfDataUninitialize(void); void PerfDataRefresh(void); BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData); +ULONG PerfDataGetProcessIndex(ULONG pid); ULONG PerfDataGetProcessCount(void); ULONG PerfDataGetProcessorUsage(void); ULONG PerfDataGetProcessorSystemUsage(void); From 7759232bf57d6921853389e244c466232b742ed4 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 10 Apr 2010 14:58:31 +0000 Subject: [PATCH 092/261] [SHELL32] Handle WM_CLOSE instead of WM_DESTROY to close the dialog See issue #4226 for more details. svn path=/trunk/; revision=46814 --- reactos/dll/win32/shell32/she_ocmenu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/she_ocmenu.c b/reactos/dll/win32/shell32/she_ocmenu.c index 216c6265fbf..1b6adec94aa 100644 --- a/reactos/dll/win32/shell32/she_ocmenu.c +++ b/reactos/dll/win32/shell32/she_ocmenu.c @@ -756,7 +756,7 @@ static INT_PTR CALLBACK OpenWithProgrammDlg(HWND hwndDlg, UINT uMsg, WPARAM wPar break; } break; - case WM_DESTROY: + case WM_CLOSE: FreeListItems(hwndDlg); EndDialog(hwndDlg, 0); return TRUE; From eea4d66908aa0a5d93800b021c5e811b6a02fb72 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 10 Apr 2010 15:51:31 +0000 Subject: [PATCH 093/261] [TASKMGR] - Implement a SID to user name cache, patch by Timo Kreuzer with some changes by me See issue #4844 for more details. svn path=/trunk/; revision=46816 --- reactos/base/applications/taskmgr/perfdata.c | 74 +++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/reactos/base/applications/taskmgr/perfdata.c b/reactos/base/applications/taskmgr/perfdata.c index eab5dac00e5..a1095e5acd6 100644 --- a/reactos/base/applications/taskmgr/perfdata.c +++ b/reactos/base/applications/taskmgr/perfdata.c @@ -40,6 +40,15 @@ SYSTEM_HANDLE_INFORMATION SystemHandleInfo; PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SystemProcessorTimeInfo = NULL; PSID SystemUserSid = NULL; +typedef struct _SIDTOUSERNAME +{ + LIST_ENTRY List; + LPWSTR pszName; + BYTE Data[0]; +} SIDTOUSERNAME, *PSIDTOUSERNAME; + +static LIST_ENTRY SidToUserNameHead = {&SidToUserNameHead, &SidToUserNameHead}; + BOOL PerfDataInitialize(void) { SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY}; @@ -63,6 +72,8 @@ BOOL PerfDataInitialize(void) void PerfDataUninitialize(void) { + PLIST_ENTRY pCur; + PSIDTOUSERNAME pEntry; if (pPerfData != NULL) HeapFree(GetProcessHeap(), 0, pPerfData); @@ -74,6 +85,15 @@ void PerfDataUninitialize(void) FreeSid(SystemUserSid); SystemUserSid = NULL; } + + /* Free user names cache list */ + pCur = SidToUserNameHead.Flink; + while (pCur != &SidToUserNameHead) + { + pEntry = CONTAINING_RECORD(pCur, SIDTOUSERNAME, List); + pCur = pCur->Flink; + HeapFree(GetProcessHeap(), 0, pEntry); + } } static void SidToUserName(PSID Sid, LPWSTR szBuffer, DWORD BufferSize) @@ -86,6 +106,56 @@ static void SidToUserName(PSID Sid, LPWSTR szBuffer, DWORD BufferSize) LookupAccountSidW(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use); } +VOID +WINAPI +CachedGetUserFromSid( + PSID pSid, + LPWSTR pUserName, + PULONG pcwcUserName) +{ + PLIST_ENTRY pCur; + PSIDTOUSERNAME pEntry; + ULONG cbSid, cwcUserName; + + cwcUserName = *pcwcUserName; + + /* Walk through the list */ + for(pCur = SidToUserNameHead.Flink; + pCur != &SidToUserNameHead; + pCur = pCur->Flink) + { + pEntry = CONTAINING_RECORD(pCur, SIDTOUSERNAME, List); + if (EqualSid((PSID)&pEntry->Data, pSid)) + { + wcsncpy(pUserName, pEntry->pszName, cwcUserName); + *pcwcUserName = cwcUserName; + return; + } + } + + /* We didn't find the SID in the list, get the name conventional */ + SidToUserName(pSid, pUserName, cwcUserName); + + /* Allocate a new entry */ + *pcwcUserName = wcslen(pUserName); + cwcUserName = *pcwcUserName + 1; + cbSid = GetLengthSid(pSid); + pEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(SIDTOUSERNAME) + cbSid + cwcUserName * sizeof(WCHAR)); + + /* Copy the Sid and name to our entry */ + CopySid(cbSid, (PSID)&pEntry->Data, pSid); + pEntry->pszName = (LPWSTR)(pEntry->Data + cbSid); + wcsncpy(pEntry->pszName, pUserName, cwcUserName); + + /* Insert the new entry */ + pEntry->List.Flink = &SidToUserNameHead; + pEntry->List.Blink = SidToUserNameHead.Blink; + SidToUserNameHead.Blink->Flink = &pEntry->List; + SidToUserNameHead.Blink = &pEntry->List; + + return; +} + void PerfDataRefresh(void) { ULONG ulSize; @@ -106,6 +176,7 @@ void PerfDataRefresh(void) PSECURITY_DESCRIPTOR ProcessSD; PSID ProcessUser; ULONG Buffer[64]; /* must be 4 bytes aligned! */ + ULONG cwcUserName; /* Get new system time */ status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), 0); @@ -341,7 +412,8 @@ ClearInfo: ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS)); } - SidToUserName(ProcessUser, pPerfData[Idx].UserName, sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0])); + cwcUserName = sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0]); + CachedGetUserFromSid(ProcessUser, pPerfData[Idx].UserName, &cwcUserName); if (ProcessSD != NULL) { From d31ce0d47ba77de0de3eeacc3d08b4185a371f24 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 10 Apr 2010 16:19:30 +0000 Subject: [PATCH 094/261] [TASKMGR] Handle icon list checks after enumerating windows, instead of doing them per window Patch by Timo Kreuzer, bug #1940 svn path=/trunk/; revision=46818 --- reactos/base/applications/taskmgr/applpage.c | 115 ++++++++++--------- 1 file changed, 63 insertions(+), 52 deletions(-) diff --git a/reactos/base/applications/taskmgr/applpage.c b/reactos/base/applications/taskmgr/applpage.c index 355c3aea51a..0c20e810817 100644 --- a/reactos/base/applications/taskmgr/applpage.c +++ b/reactos/base/applications/taskmgr/applpage.c @@ -236,6 +236,13 @@ void UpdateApplicationListControlViewSetting(void) DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter) { + INT i; + BOOL bItemRemoved = FALSE; + LV_ITEM item; + LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL; + HIMAGELIST hImageListLarge; + HIMAGELIST hImageListSmall; + /* Create the event */ hApplicationPageEvent = CreateEventW(NULL, TRUE, TRUE, NULL); @@ -269,6 +276,55 @@ DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter) EnumWindows(EnumWindowsProc, 0); if (noApps) (void)ListView_DeleteAllItems(hApplicationPageListCtrl); + + /* Get the image lists */ + hImageListLarge = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_NORMAL); + hImageListSmall = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_SMALL); + + /* Check to see if we need to remove any items from the list */ + for (i=ListView_GetItemCount(hApplicationPageListCtrl)-1; i>=0; i--) + { + memset(&item, 0, sizeof(LV_ITEM)); + item.mask = LVIF_IMAGE|LVIF_PARAM; + item.iItem = i; + (void)ListView_GetItem(hApplicationPageListCtrl, &item); + + pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam; + if (!IsWindow(pAPLI->hWnd)|| + (wcslen(pAPLI->szTitle) <= 0) || + !IsWindowVisible(pAPLI->hWnd) || + (GetParent(pAPLI->hWnd) != NULL) || + (GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) || + (GetWindowLongPtr(pAPLI->hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)) + { + ImageList_Remove(hImageListLarge, item.iItem); + ImageList_Remove(hImageListSmall, item.iItem); + + (void)ListView_DeleteItem(hApplicationPageListCtrl, item.iItem); + HeapFree(GetProcessHeap(), 0, pAPLI); + bItemRemoved = TRUE; + } + } + + /* + * If an item was removed from the list then + * we need to resync all the items with the + * image list + */ + if (bItemRemoved) + { + for (i=0; i=0; i--) - { - memset(&item, 0, sizeof(LV_ITEM)); - item.mask = LVIF_IMAGE|LVIF_PARAM; - item.iItem = i; - (void)ListView_GetItem(hApplicationPageListCtrl, &item); - - pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam; - if (!IsWindow(pAPLI->hWnd)|| - (wcslen(pAPLI->szTitle) <= 0) || - !IsWindowVisible(pAPLI->hWnd) || - (GetParent(pAPLI->hWnd) != NULL) || - (GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) || - (GetWindowLongPtrW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)) - { - ImageList_Remove(hImageListLarge, item.iItem); - ImageList_Remove(hImageListSmall, item.iItem); - - (void)ListView_DeleteItem(hApplicationPageListCtrl, item.iItem); - HeapFree(GetProcessHeap(), 0, pAPLI); - bItemRemoved = TRUE; - } - } - - /* - * If an item was removed from the list then - * we need to resync all the items with the - * image list - */ - if (bItemRemoved) - { - for (i=0; i Date: Sat, 10 Apr 2010 18:00:17 +0000 Subject: [PATCH 095/261] [KS] - Implement dispatching of enable/disable event properties for filters/pins - Add new pins to list of instantiated pins when a new pin is created - Remove pin on close and decrement instance count. Fixes instantiating pin for 2nd time - Rewrite handling of pin property/method/events - ks is now able to deliver signal statistics in XP SP3 svn path=/trunk/; revision=46824 --- reactos/drivers/ksfilter/ks/filter.c | 101 +++++++++-- reactos/drivers/ksfilter/ks/ksfunc.h | 26 ++- reactos/drivers/ksfilter/ks/methods.c | 3 - reactos/drivers/ksfilter/ks/pin.c | 237 ++++++++++++++------------ 4 files changed, 235 insertions(+), 132 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index d5af650d417..bcac218e848 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -778,12 +778,16 @@ IKsFilter_DispatchDeviceIoControl( /* get property from input buffer */ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - /* sanity check */ - ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSIDENTIFIER)); - /* get filter instance */ FilterInstance = Filter->lpVtbl->GetStruct(Filter); + + /* sanity check */ + ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSIDENTIFIER)); + ASSERT(FilterInstance); + ASSERT(FilterInstance->Descriptor); + ASSERT(FilterInstance->Descriptor->AutomationTable); + RtlStringFromGUID(&Property->Set, &GuidString); DPRINT("IKsFilter_DispatchDeviceIoControl property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); RtlFreeUnicodeString(&GuidString); @@ -794,7 +798,7 @@ IKsFilter_DispatchDeviceIoControl( ULONG MethodItemSize = 0; /* check if the driver supports method sets */ - if (FilterInstance->Descriptor->AutomationTable && FilterInstance->Descriptor->AutomationTable->MethodSetsCount) + if (FilterInstance->Descriptor->AutomationTable->MethodSetsCount) { SetCount = FilterInstance->Descriptor->AutomationTable->MethodSetsCount; MethodSet = FilterInstance->Descriptor->AutomationTable->MethodSets; @@ -810,7 +814,7 @@ IKsFilter_DispatchDeviceIoControl( ULONG PropertyItemSize = 0; /* check if the driver supports method sets */ - if (FilterInstance->Descriptor->AutomationTable && FilterInstance->Descriptor->AutomationTable->PropertySetsCount) + if (FilterInstance->Descriptor->AutomationTable->PropertySetsCount) { SetCount = FilterInstance->Descriptor->AutomationTable->PropertySetsCount; PropertySet = FilterInstance->Descriptor->AutomationTable->PropertySets; @@ -829,8 +833,23 @@ IKsFilter_DispatchDeviceIoControl( ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT || IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_DISABLE_EVENT); - Status = STATUS_NOT_FOUND; - UNIMPLEMENTED; + if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT) + { + /* call enable event handlers */ + Status = KspEnableEvent(Irp, + FilterInstance->Descriptor->AutomationTable->EventSetsCount, + (PKSEVENT_SET)FilterInstance->Descriptor->AutomationTable->EventSets, + &This->Header.EventList, + KSEVENTS_SPINLOCK, + (PVOID)&This->Header.EventListLock, + NULL, + FilterInstance->Descriptor->AutomationTable->EventItemSize); + } + else + { + /* disable event handler */ + Status = KsDisableEvent(Irp, &This->Header.EventList, KSEVENTS_SPINLOCK, &This->Header.EventListLock); + } } RtlStringFromGUID(&Property->Set, &GuidString); @@ -1041,14 +1060,14 @@ IKsFilter_CopyFilterDescriptor( } -NTSTATUS +VOID IKsFilter_AddPin( - IKsFilter * Filter, + PKSFILTER Filter, PKSPIN Pin) { PKSPIN NextPin, CurPin; PKSBASIC_HEADER BasicHeader; - IKsFilterImpl * This = (IKsFilterImpl*)Filter; + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); /* sanity check */ ASSERT(Pin->Id < This->PinDescriptorCount); @@ -1057,7 +1076,8 @@ IKsFilter_AddPin( { /* welcome first pin */ This->FirstPin[Pin->Id] = Pin; - return STATUS_SUCCESS; + This->PinInstanceCount[Pin->Id]++; + return; } /* get first pin */ @@ -1079,8 +1099,58 @@ IKsFilter_AddPin( /* store pin */ BasicHeader->Next.Pin = Pin; +} - return STATUS_SUCCESS; +VOID +IKsFilter_RemovePin( + PKSFILTER Filter, + PKSPIN Pin) +{ + PKSPIN NextPin, CurPin, LastPin; + PKSBASIC_HEADER BasicHeader; + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); + + /* sanity check */ + ASSERT(Pin->Id < This->PinDescriptorCount); + + /* get first pin */ + CurPin = This->FirstPin[Pin->Id]; + + LastPin = NULL; + do + { + /* get next instantiated pin */ + NextPin = KsPinGetNextSiblingPin(CurPin); + + if (CurPin == Pin) + { + if (LastPin) + { + /* get basic header of last pin */ + BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)LastPin - sizeof(KSBASIC_HEADER)); + + BasicHeader->Next.Pin = NextPin; + } + else + { + /* erase last pin */ + This->FirstPin[Pin->Id] = NextPin; + } + /* decrement pin instance count */ + This->PinInstanceCount[Pin->Id]--; + return; + } + + if (!NextPin) + break; + + LastPin = CurPin; + NextPin = CurPin; + + }while(NextPin != NULL); + + /* pin not found */ + ASSERT(0); } @@ -1129,12 +1199,6 @@ IKsFilter_DispatchCreatePin( Status = KspCreatePin(DeviceObject, Irp, This->Header.KsDevice, This->FilterFactory, (IKsFilter*)&This->lpVtbl, Connect, &This->PinDescriptorsEx[Connect->PinId]); DPRINT("IKsFilter_DispatchCreatePin KspCreatePin %lx\n", Status); - - if (NT_SUCCESS(Status)) - { - /* successfully created pin, increment pin instance count */ - This->PinInstanceCount[Connect->PinId]++; - } } else { @@ -1471,6 +1535,7 @@ KsFilterReleaseProcessingMutex( KeReleaseMutex(&This->ProcessingMutex, FALSE); } + /* @implemented */ diff --git a/reactos/drivers/ksfilter/ks/ksfunc.h b/reactos/drivers/ksfilter/ks/ksfunc.h index 64e2582c4d4..75d73ea4aab 100644 --- a/reactos/drivers/ksfilter/ks/ksfunc.h +++ b/reactos/drivers/ksfilter/ks/ksfunc.h @@ -122,11 +122,6 @@ KspCreatePin( IN PKSPIN_CONNECT Connect, IN KSPIN_DESCRIPTOR_EX* Descriptor); -NTSTATUS -IKsFilter_AddPin( - IKsFilter * Filter, - PKSPIN Pin); - NTSTATUS KspAddCreateItemToList( OUT PLIST_ENTRY ListHead, @@ -165,3 +160,24 @@ KspMethodHandlerWithAllocator( IN PFNKSALLOCATOR Allocator OPTIONAL, IN ULONG MethodItemSize OPTIONAL); +VOID +IKsFilter_AddPin( + PKSFILTER Filter, + PKSPIN Pin); + +VOID +IKsFilter_RemovePin( + PKSFILTER Filter, + PKSPIN Pin); + +NTSTATUS +KspEnableEvent( + IN PIRP Irp, + IN ULONG EventSetsCount, + IN PKSEVENT_SET EventSet, + IN OUT PLIST_ENTRY EventsList OPTIONAL, + IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, + IN PVOID EventsLock OPTIONAL, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG EventItemSize OPTIONAL); + diff --git a/reactos/drivers/ksfilter/ks/methods.c b/reactos/drivers/ksfilter/ks/methods.c index eed17bd13e5..6263ce0b7bb 100644 --- a/reactos/drivers/ksfilter/ks/methods.c +++ b/reactos/drivers/ksfilter/ks/methods.c @@ -22,9 +22,6 @@ FindMethodHandler( { ULONG Index, ItemIndex; - /* TODO */ - ASSERT((Method->Flags & KSMETHOD_TYPE_SETSUPPORT) == 0); - for(Index = 0; Index < MethodSetCount; Index++) { ASSERT(MethodSet[Index].Set); diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c index 682d25e916d..aa39c8deae1 100644 --- a/reactos/drivers/ksfilter/ks/pin.c +++ b/reactos/drivers/ksfilter/ks/pin.c @@ -151,11 +151,14 @@ IKsPin_PinMasterClock( /* get the object header */ ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; + /* sanity check */ + ASSERT(ObjectHeader); + /* locate ks pin implemention from KSPIN offset */ This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); - /* acquire control mutex */ - KeWaitForSingleObject(This->BasicHeader.ControlMutex, Executive, KernelMode, FALSE, NULL); + /* sanity check */ + ASSERT(This); Handle = (PHANDLE)Data; @@ -226,10 +229,7 @@ IKsPin_PinMasterClock( } } - /* release processing mutex */ - KeReleaseMutex(This->BasicHeader.ControlMutex, FALSE); - - DPRINT("IKsPin_PinStatePropertyHandler Status %lx\n", Status); + DPRINT("IKsPin_PinMasterClock Status %lx\n", Status); return Status; } @@ -1907,86 +1907,6 @@ IKsPin_DispatchKsStream( return Status; } - -NTSTATUS -IKsPin_DispatchKsProperty( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - IKsPinImpl * This) -{ - NTSTATUS Status; - PKSPROPERTY Property; - PIO_STACK_LOCATION IoStack; - UNICODE_STRING GuidString; - ULONG PropertySetsCount = 0, PropertyItemSize = 0; - const KSPROPERTY_SET* PropertySets = NULL; - - /* sanity check */ - ASSERT(This->Pin.Descriptor); - - /* get current irp stack */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - - if (This->Pin.Descriptor->AutomationTable) - { - /* use available driver property sets */ - PropertySetsCount = This->Pin.Descriptor->AutomationTable->PropertySetsCount; - PropertySets = This->Pin.Descriptor->AutomationTable->PropertySets; - PropertyItemSize = This->Pin.Descriptor->AutomationTable->PropertyItemSize; - } - - - /* try driver provided property sets */ - Status = KspPropertyHandler(Irp, - PropertySetsCount, - PropertySets, - NULL, - PropertyItemSize); - - if (Status != STATUS_NOT_FOUND) - { - /* property was handled by driver */ - if (Status != STATUS_PENDING) - { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - return Status; - } - - /* try our properties */ - Status = KspPropertyHandler(Irp, - sizeof(PinPropertySet) / sizeof(KSPROPERTY_SET), - PinPropertySet, - NULL, - 0); - - if (Status != STATUS_NOT_FOUND) - { - /* property was handled by driver */ - if (Status != STATUS_PENDING) - { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - return Status; - } - - /* property was not handled */ - Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - - RtlStringFromGUID(&Property->Set, &GuidString); - DPRINT("IKsPin_DispatchKsProperty Unhandled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); - RtlFreeUnicodeString(&GuidString); - - Irp->IoStatus.Status = STATUS_NOT_FOUND; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_NOT_FOUND; - -} - NTSTATUS NTAPI IKsPin_DispatchDeviceIoControl( @@ -1996,6 +1916,10 @@ IKsPin_DispatchDeviceIoControl( PIO_STACK_LOCATION IoStack; PKSIOBJECT_HEADER ObjectHeader; IKsPinImpl * This; + NTSTATUS Status; + UNICODE_STRING GuidString; + PKSPROPERTY Property; + ULONG SetCount = 0; /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -2010,23 +1934,93 @@ IKsPin_DispatchDeviceIoControl( /* locate ks pin implemention from KSPIN offset */ This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); - if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY) + /* current irp stack */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* get property from input buffer */ + Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; + + /* sanity check */ + ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSIDENTIFIER)); + ASSERT(This->Pin.Descriptor->AutomationTable); + + RtlStringFromGUID(&Property->Set, &GuidString); + DPRINT("IKsPin_DispatchDeviceIoControl property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); + RtlFreeUnicodeString(&GuidString); + + + if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_METHOD) { - /* handle ks properties */ - return IKsPin_DispatchKsProperty(DeviceObject, Irp, This); + const KSMETHOD_SET *MethodSet = NULL; + ULONG MethodItemSize = 0; + + /* check if the driver supports method sets */ + if (This->Pin.Descriptor->AutomationTable->MethodSetsCount) + { + SetCount = This->Pin.Descriptor->AutomationTable->MethodSetsCount; + MethodSet = This->Pin.Descriptor->AutomationTable->MethodSets; + MethodItemSize = This->Pin.Descriptor->AutomationTable->MethodItemSize; + } + + /* call method set handler */ + Status = KspMethodHandlerWithAllocator(Irp, SetCount, MethodSet, NULL, MethodItemSize); + } + else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY) + { + const KSPROPERTY_SET *PropertySet = NULL; + ULONG PropertyItemSize = 0; + + /* check if the driver supports method sets */ + if (This->Pin.Descriptor->AutomationTable->PropertySetsCount) + { + SetCount = This->Pin.Descriptor->AutomationTable->PropertySetsCount; + PropertySet = This->Pin.Descriptor->AutomationTable->PropertySets; + PropertyItemSize = This->Pin.Descriptor->AutomationTable->PropertyItemSize; + } + + /* needed for our property handlers */ + KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (KSPROPERTY_ITEM*)This; + + /* call property handler */ + Status = KspPropertyHandler(Irp, SetCount, PropertySet, NULL, PropertyItemSize); + } + else + { + /* sanity check */ + ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT || + IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_DISABLE_EVENT); + + if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT) + { + /* call enable event handlers */ + Status = KspEnableEvent(Irp, + This->Pin.Descriptor->AutomationTable->EventSetsCount, + (PKSEVENT_SET)This->Pin.Descriptor->AutomationTable->EventSets, + &This->BasicHeader.EventList, + KSEVENTS_SPINLOCK, + (PVOID)&This->BasicHeader.EventListLock, + NULL, + This->Pin.Descriptor->AutomationTable->EventItemSize); + } + else + { + /* disable event handler */ + Status = KsDisableEvent(Irp, &This->BasicHeader.EventList, KSEVENTS_SPINLOCK, &This->BasicHeader.EventListLock); + } } - if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM || - IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_READ_STREAM) + RtlStringFromGUID(&Property->Set, &GuidString); + DPRINT("IKsPin_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information); + RtlFreeUnicodeString(&GuidString); + + if (Status != STATUS_PENDING) { - /* handle ks properties */ - return IKsPin_DispatchKsStream(DeviceObject, Irp, This); + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); } - UNIMPLEMENTED; - Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_NOT_IMPLEMENTED; + /* done */ + return Status; } NTSTATUS @@ -2053,9 +2047,6 @@ IKsPin_Close( /* locate ks pin implemention fro KSPIN offset */ This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); - /* acquire filter control mutex */ - KsFilterAcquireControl(&This->Pin); - if (This->Pin.Descriptor->Dispatch->Close) { /* call pin close routine */ @@ -2069,7 +2060,8 @@ IKsPin_Close( return Status; } - /* FIXME remove pin from filter pin list and decrement reference count */ + /* remove pin from filter pin list and decrement reference count */ + IKsFilter_RemovePin(This->Filter->lpVtbl->GetStruct(This->Filter), &This->Pin); if (Status != STATUS_PENDING) { @@ -2079,9 +2071,6 @@ IKsPin_Close( } } - /* release filter control mutex */ - KsFilterReleaseControl(&This->Pin); - return Status; } @@ -2228,6 +2217,7 @@ KspCreatePin( ULONG Index; ULONG FrameSize = 0; ULONG NumFrames = 0; + KSAUTOMATION_TABLE AutomationTable; /* sanity checks */ ASSERT(Descriptor->Dispatch); @@ -2314,6 +2304,8 @@ KspCreatePin( This->BasicHeader.KsDevice = KsDevice; This->BasicHeader.Type = KsObjectTypePin; This->BasicHeader.Parent.KsFilter = Filter->lpVtbl->GetStruct(Filter); + InitializeListHead(&This->BasicHeader.EventList); + KeInitializeSpinLock(&This->BasicHeader.EventListLock); ASSERT(This->BasicHeader.Parent.KsFilter); @@ -2350,11 +2342,43 @@ KspCreatePin( /* initialize object bag */ Device->lpVtbl->InitializeObjectBag(Device, This->Pin.Bag, NULL); + /* allocate pin descriptor */ + This->Pin.Descriptor = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR_EX)); + if (!This->Pin.Descriptor) + { + /* not enough memory */ + KsFreeObjectBag(This->Pin.Bag); + FreeItem(This); + FreeItem(CreateItem); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* copy pin descriptor */ + RtlMoveMemory((PVOID)This->Pin.Descriptor, Descriptor, sizeof(KSPIN_DESCRIPTOR_EX)); + + /* initialize automation table */ + RtlZeroMemory(&AutomationTable, sizeof(KSAUTOMATION_TABLE)); + + AutomationTable.PropertyItemSize = sizeof(KSPROPERTY_ITEM); + AutomationTable.PropertySets = PinPropertySet; + AutomationTable.PropertySetsCount = sizeof(PinPropertySet) / sizeof(KSPROPERTY_SET); + + /* merge in pin property sets */ + Status = KsMergeAutomationTables((PKSAUTOMATION_TABLE*)&This->Pin.Descriptor->AutomationTable, (PKSAUTOMATION_TABLE)Descriptor->AutomationTable, &AutomationTable, This->Pin.Bag); + + if (!NT_SUCCESS(Status)) + { + /* not enough memory */ + KsFreeObjectBag(This->Pin.Bag); + FreeItem(This); + FreeItem(CreateItem); + return Status; + } + /* get format */ DataFormat = (PKSDATAFORMAT)(Connect + 1); /* initialize pin descriptor */ - This->Pin.Descriptor = Descriptor; This->Pin.Context = NULL; This->Pin.Id = Connect->PinId; This->Pin.Communication = Descriptor->PinDescriptor.Communication; @@ -2482,7 +2506,7 @@ KspCreatePin( } /* FIXME add pin instance to filter instance */ - + IKsFilter_AddPin(Filter->lpVtbl->GetStruct(Filter), &This->Pin); if (Descriptor->Dispatch && Descriptor->Dispatch->SetDataFormat) { @@ -2505,6 +2529,7 @@ KspCreatePin( if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) { /* failed to create pin, release resources */ + IKsFilter_RemovePin(Filter->lpVtbl->GetStruct(Filter), &This->Pin); KsFreeObjectHeader((KSOBJECT_HEADER)This->ObjectHeader); KsFreeObjectBag((KSOBJECT_BAG)This->Pin.Bag); FreeItem(This); From 232f47a639b5456f6007e879456712a08c5fc5b4 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sat, 10 Apr 2010 18:38:02 +0000 Subject: [PATCH 096/261] Bug 5217: Italian translation updates by Paolo Devoti Bug 5282: Czech translation update by Radek Liska svn path=/trunk/; revision=46825 --- reactos/base/applications/paint/lang/it-IT.rc | 6 +- reactos/dll/win32/devmgr/lang/cs-CZ.rc | 8 +- reactos/dll/win32/netcfgx/lang/cs-CZ.rc | 209 +++++++++--------- reactos/dll/win32/netid/lang/cs-CZ.rc | 23 +- reactos/dll/win32/netid/lang/it-IT.rc | 10 +- reactos/dll/win32/netshell/lang/cs-CZ.rc | 78 +++---- reactos/dll/win32/setupapi/lang/cs-CZ.rc | 30 +-- reactos/dll/win32/shell32/lang/cs-CZ.rc | 106 ++++----- reactos/dll/win32/shell32/lang/it-IT.rc | 2 +- reactos/dll/win32/syssetup/lang/it-IT.rc | 10 +- reactos/dll/win32/userenv/lang/cs-CZ.rc | 22 +- 11 files changed, 232 insertions(+), 272 deletions(-) diff --git a/reactos/base/applications/paint/lang/it-IT.rc b/reactos/base/applications/paint/lang/it-IT.rc index d7b7c9ee218..2c381068586 100644 --- a/reactos/base/applications/paint/lang/it-IT.rc +++ b/reactos/base/applications/paint/lang/it-IT.rc @@ -60,8 +60,8 @@ BEGIN MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "Show grid", IDM_VIEWSHOWGRID - MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE + MENUITEM "Mostra griglia", IDM_VIEWSHOWGRID + MENUITEM "Mostra miniature", IDM_VIEWSHOWMINIATURE END MENUITEM "Visualizza a schermo intero\tCtrl+F", IDM_VIEWFULLSCREEN END @@ -201,5 +201,5 @@ BEGIN IDS_OPENFILTER, "Bitmap files (*.bmp;*.dib)\1*.bmp;*.dib\1All files (*.*)\1*.*\1" IDS_SAVEFILTER, "24 bit bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1" IDS_FILESIZE, "%d bytes" - IDS_PRINTRES, "%d x %d pixels per meter" + IDS_PRINTRES, "%d x %d pixels per metro" END diff --git a/reactos/dll/win32/devmgr/lang/cs-CZ.rc b/reactos/dll/win32/devmgr/lang/cs-CZ.rc index 2c29b447a76..aa7a56e21c5 100644 --- a/reactos/dll/win32/devmgr/lang/cs-CZ.rc +++ b/reactos/dll/win32/devmgr/lang/cs-CZ.rc @@ -1,6 +1,6 @@ /* FILE: dll/win32/devmgr/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2008-06-24 + * UPDATED: 2010-01-07 */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -202,7 +202,7 @@ END IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Details" +CAPTION "Detaily" FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_DEVICON, 7, 7, 20, 20 @@ -215,7 +215,7 @@ END IDD_DEVICERESOURCES DIALOGEX DISCARDABLE 0, 0, 252, 218 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Resources" +CAPTION "Prostøedky" FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_DEVICON, 7, 7, 20, 20 @@ -224,7 +224,7 @@ END IDD_DEVICEPOWER DIALOGEX DISCARDABLE 0, 0, 252, 218 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Power" +CAPTION "Napájení" FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_DEVICON, 7, 7, 20, 20 diff --git a/reactos/dll/win32/netcfgx/lang/cs-CZ.rc b/reactos/dll/win32/netcfgx/lang/cs-CZ.rc index 887cb443c8d..5aff39c2e5b 100644 --- a/reactos/dll/win32/netcfgx/lang/cs-CZ.rc +++ b/reactos/dll/win32/netcfgx/lang/cs-CZ.rc @@ -1,12 +1,17 @@ -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT +/* FILE: dll/win32/netcfgx/lang/cs-CZ.rc + * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) + * UPDATED: 2010-03-14 + * THANKS TO: potapnik, who translated part of this file + */ +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT IDD_TCPIP_BASIC_DLG DIALOGEX DISCARDABLE 0, 0, 246, 228 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Obecné nastavení" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Konfigurace IP adres mùže probìhnout automaticky, pokud to Vaše sí dovoluje. V opaèném pøípadì kontaktujte správce sítì pro správné nastavení.", -1, 9, 9, 228, 27 + LTEXT "Konfigurace IP adres mùže probìhnout automaticky, pokud to sí dovoluje. V opaèném pøípadì kontaktujte správce sítì pro správné nastavení.", -1, 9, 9, 228, 27 CONTROL "Získat IP adresu automaticky", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP, 14, 43, 210, 12 GROUPBOX "", -1, 9, 61, 228, 70, BS_GROUPBOX CONTROL "&Použít následující IP adresu:", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON, 14, 59, 105, 12 @@ -28,43 +33,43 @@ END IDD_TCPIP_ALTCF_DLG DIALOGEX DISCARDABLE 0, 0, 246, 228 STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION -CAPTION "Alternate Configuration" +CAPTION "Alternativní konfigurace" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "If this computer is used on more than one network, enter the alternate IP settings below", -1, 9, 9, 220, 20 - CONTROL "Au&tomatic private IP address", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 40, 210, 12 + LTEXT "Pokud je tento poèítaè používán ve více než jedné síti, lze zadat alternativní nastavení níže", -1, 9, 9, 220, 20 + CONTROL "Au&tomatická privátní IP adresa", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 40, 210, 12 GROUPBOX "", -1, 9, 55, 228, 80, BS_GROUPBOX - CONTROL "U&ser configured", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 55, 70, 12 - LTEXT "&IP address:", -1, 14, 75, 135, 8 + CONTROL "&Uživatelské nastavení", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 55, 70, 12 + LTEXT "&IP adresa:", -1, 14, 75, 135, 8 CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 150, 75, 80, 12 - LTEXT "S&ubnet mask:", -1, 14, 95, 135, 8 + LTEXT "&Maska podsítì:", -1, 14, 95, 135, 8 CONTROL "",IDC_SUBNETMASK,"SysIPAddress32",WS_TABSTOP, 150, 95, 80, 12 - LTEXT "&Default gateway:", -1, 14, 115, 135, 8 + LTEXT "&Výchozí brána:", -1, 14, 115, 135, 8 CONTROL "",IDC_DEFGATEWAY,"SysIPAddress32",WS_TABSTOP, 150, 115, 80, 12 - LTEXT "&Preferred DNS server:", -1, 14, 150, 135, 8 + LTEXT "&Preferovaný DNS server:", -1, 14, 150, 135, 8 CONTROL "",IDC_DNS1,"SysIPAddress32",WS_TABSTOP, 150, 150, 80, 12 - LTEXT "&Alternate DNS server:", -1, 14, 165, 180, 8 + LTEXT "&Alternativní DNS server:", -1, 14, 165, 180, 8 CONTROL "",IDC_DNS2,"SysIPAddress32",WS_TABSTOP, 150, 165, 80, 12 END IDD_TCPIP_ADVIP_DLG DIALOGEX DISCARDABLE 0, 0, 247, 247 STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION -CAPTION "IP Settings" +CAPTION "IP nastavení" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "IP addresses", -1, 5, 5, 240, 90 + GROUPBOX "IP adresy", -1, 5, 5, 240, 90 CONTROL "", IDC_IPLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 15, 210, 55 - PUSHBUTTON "Add...", IDC_IPADD, 60, 75, 50, 14, WS_TABSTOP - PUSHBUTTON "Edit...", IDC_IPMOD, 120, 75, 50, 14, WS_TABSTOP - PUSHBUTTON "Remove", IDC_IPDEL, 180, 75, 50, 14, WS_TABSTOP - GROUPBOX "Default gateways:", -1, 5, 100, 240, 90 + PUSHBUTTON "Pøidat...", IDC_IPADD, 60, 75, 50, 14, WS_TABSTOP + PUSHBUTTON "Upravit...", IDC_IPMOD, 120, 75, 50, 14, WS_TABSTOP + PUSHBUTTON "Odebrat", IDC_IPDEL, 180, 75, 50, 14, WS_TABSTOP + GROUPBOX "Výchozí brány:", -1, 5, 100, 240, 90 CONTROL "", IDC_GWLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 110, 210, 55 - PUSHBUTTON "Add...", IDC_GWADD, 60, 170, 50, 14, WS_TABSTOP - PUSHBUTTON "Edit...", IDC_GWMOD, 120, 170, 50, 14, WS_TABSTOP - PUSHBUTTON "Remove", IDC_GWDEL, 180, 170, 50, 14, WS_TABSTOP + PUSHBUTTON "Pøidat...", IDC_GWADD, 60, 170, 50, 14, WS_TABSTOP + PUSHBUTTON "Upravit...", IDC_GWMOD, 120, 170, 50, 14, WS_TABSTOP + PUSHBUTTON "Odebrat", IDC_GWDEL, 180, 170, 50, 14, WS_TABSTOP GROUPBOX "", -1, 5, 200, 240, 30 - CHECKBOX "Automatic metric", IDC_AUTOMETRIC, 9, 200, 90, 12, BS_AUTOCHECKBOX | WS_TABSTOP - LTEXT "Interface metric:", -1, 15, 215, 90, 12 + CHECKBOX "Automatická metrika", IDC_AUTOMETRIC, 9, 200, 90, 12, BS_AUTOCHECKBOX | WS_TABSTOP + LTEXT "Metrika rozhraní:", -1, 15, 215, 90, 12 EDITTEXT IDC_METRIC, 110, 212, 50, 12, WS_TABSTOP | ES_NUMBER END @@ -74,158 +79,158 @@ CAPTION "DNS" FONT 8, "MS Shell Dlg" BEGIN LISTBOX IDC_DNSADDRLIST, 5, 15, 180, 60, LBS_NOTIFY - LTEXT "D&NS server addresses, in order of use:", -1, 5, 5, 180, 12 - PUSHBUTTON "Up", IDC_DNSADDRUP, 190, 30, 50, 14, WS_TABSTOP - PUSHBUTTON "Down", IDC_DNSADDRDOWN, 190, 50, 50, 14, WS_TABSTOP - PUSHBUTTON "&Add...", IDC_DNSADDRADD, 30, 70, 50, 14, WS_TABSTOP - PUSHBUTTON "&Edit...", IDC_DNSADDRMOD, 100, 70, 50, 14, WS_TABSTOP - PUSHBUTTON "Remo&ve", IDC_DNSADDRDEL, 170, 70, 50, 14, WS_TABSTOP - LTEXT "The following three settings are applied to all connections with TCP/IP enabled. For resolution of unqualified names:", -1, 5, 90, 220, 24 - CONTROL "Append &primary and connection specific DNS suffixes", IDC_PRIMSUFFIX, "BUTTON", BS_AUTORADIOBUTTON, 5, 110, 160, 12 - CHECKBOX "Append parent suffi&xes of the primary DNS suffix", IDC_TOPPRIMSUFFIX, 15, 125, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CONTROL "Append t&hese DNS suffixes(in order):", IDC_SELSUFFIX, "BUTTON", BS_AUTORADIOBUTTON, 5, 140, 190, 12 + LTEXT "&Adresy DNS serverù v poøadí využití:", -1, 5, 5, 180, 12 + PUSHBUTTON "Nahoru", IDC_DNSADDRUP, 190, 30, 50, 14, WS_TABSTOP + PUSHBUTTON "Dolù", IDC_DNSADDRDOWN, 190, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "&Pøidat...", IDC_DNSADDRADD, 30, 70, 50, 14, WS_TABSTOP + PUSHBUTTON "&Upravit...", IDC_DNSADDRMOD, 100, 70, 50, 14, WS_TABSTOP + PUSHBUTTON "&Odebrat", IDC_DNSADDRDEL, 170, 70, 50, 14, WS_TABSTOP + LTEXT "Následující tøi nastavení jsou aplikována na všechna pøipojení s povoleným TCP/IP. Pøi rezoluci nekvalifikovaných jmen:", -1, 5, 90, 220, 24 + CONTROL "Pøipojit p&rimární a pøipojením dané DNS pøípony", IDC_PRIMSUFFIX, "BUTTON", BS_AUTORADIOBUTTON, 5, 110, 160, 12 + CHECKBOX "Pøipojit rodièovské pøípony primární DNS pøípony", IDC_TOPPRIMSUFFIX, 15, 125, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CONTROL "Pøipojit &tyto DNS pøípony (v tomto poøadí):", IDC_SELSUFFIX, "BUTTON", BS_AUTORADIOBUTTON, 5, 140, 190, 12 LISTBOX IDC_DNSSUFFIXLIST, 5, 155, 180, 60, LBS_NOTIFY - PUSHBUTTON "Up", IDC_DNSSUFFIXUP, 190, 170, 50, 14, WS_TABSTOP - PUSHBUTTON "Down", IDC_DNSSUFFIXDOWN, 190, 190, 50, 14, WS_TABSTOP - PUSHBUTTON "&Add...", IDC_DNSSUFFIXADD, 30, 210, 50, 14, WS_TABSTOP - PUSHBUTTON "&Edit...", IDC_DNSSUFFIXMOD, 100, 210, 50, 14, WS_TABSTOP - PUSHBUTTON "Remo&ve", IDC_DNSSUFFIXDEL, 170, 210, 50, 14, WS_TABSTOP - LTEXT "DNS &suffix for this connection:", -1, 5, 225, 110, 14 + PUSHBUTTON "Nahoru", IDC_DNSSUFFIXUP, 190, 170, 50, 14, WS_TABSTOP + PUSHBUTTON "Dolù", IDC_DNSSUFFIXDOWN, 190, 190, 50, 14, WS_TABSTOP + PUSHBUTTON "&Pøidat...", IDC_DNSSUFFIXADD, 30, 210, 50, 14, WS_TABSTOP + PUSHBUTTON "&Upravit...", IDC_DNSSUFFIXMOD, 100, 210, 50, 14, WS_TABSTOP + PUSHBUTTON "&Odebrat", IDC_DNSSUFFIXDEL, 170, 210, 50, 14, WS_TABSTOP + LTEXT "DNS pøípo&na tohoto pøipojení:", -1, 5, 225, 110, 14 EDITTEXT IDC_SUFFIX, 120, 225, 100, 12, WS_TABSTOP - CHECKBOX "&Register this connection's addresses in DNS", IDC_REGSUFFIX, 15, 240, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "&Use this connection's DNS suffix in DNS registration", IDC_USESUFFIX, 15, 255, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "Registrovat &adresy tohoto pøipojení v DNS", IDC_REGSUFFIX, 15, 240, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "P&oužít DNS pøíponu tohoto pøipojení pøi DNS registraci", IDC_USESUFFIX, 15, 255, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP END IDD_TCPIP_ADVOPT_DLG DIALOGEX DISCARDABLE 0, 0, 247, 247 STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION -CAPTION "Options" +CAPTION "Volby" FONT 8, "MS Shell Dlg" BEGIN LISTBOX IDC_OPTLIST, 5, 30, 230, 70 - LTEXT "&Optional settings", -1, 5, 15, 130, 12 - PUSHBUTTON "&Properties", IDC_OPTPROP, 160, 100, 70, 14, WS_TABSTOP - GROUPBOX "Description:", -1, 5, 120, 240, 70 + LTEXT "&Volitelná nastavení", -1, 5, 15, 130, 12 + PUSHBUTTON "&Podrobnosti", IDC_OPTPROP, 160, 100, 70, 14, WS_TABSTOP + GROUPBOX "Popis:", -1, 5, 120, 240, 70 LTEXT "", IDC_OPTDESC, 15, 130, 220, 33 END IDD_TCPIPADDIP_DLG DIALOGEX DISCARDABLE 0, 0, 200, 70 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP Address" +CAPTION "TCP/IP adresa" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 100, 15, 80, 12 - LTEXT "IP address:", -1, 5, 15, 70, 12 - LTEXT "Subnet mask:", -1, 5, 30, 70, 12 + LTEXT "IP adresa:", -1, 5, 15, 70, 12 + LTEXT "Maska podsítì:", -1, 5, 30, 70, 12 CONTROL "",IDC_SUBNETMASK,"SysIPAddress32", WS_TABSTOP, 100, 30, 80, 12 - PUSHBUTTON "", IDC_OK, 50, 50, 50, 14, WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "OK", IDC_OK, 50, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "Storno", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP END IDD_TCPIPGW_DLG DIALOGEX DISCARDABLE 0, 0, 200, 80 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP Gateway Address" +CAPTION "TCP/IP adresa brány" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 100, 15, 80, 12 - LTEXT "Gateway:", -1, 5, 15, 70, 12 - CHECKBOX "Automatic metric", IDC_USEMETRIC, 15, 30, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP - LTEXT "&Metric:", IDC_METRICTXT, 5, 45, 45, 12, WS_DISABLED + LTEXT "Brána:", -1, 5, 15, 70, 12 + CHECKBOX "Automatická metrika", IDC_USEMETRIC, 15, 30, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + LTEXT "&Metrika:", IDC_METRICTXT, 5, 45, 45, 12, WS_DISABLED EDITTEXT IDC_METRIC, 100, 45, 50, 12, WS_TABSTOP | ES_NUMBER | WS_DISABLED PUSHBUTTON "", IDC_OK, 50, 60, 50, 14, WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 110, 60, 50, 14, WS_TABSTOP + PUSHBUTTON "Storno", IDCANCEL, 110, 60, 50, 14, WS_TABSTOP END IDD_TCPIPDNS_DLG DIALOGEX DISCARDABLE 0, 0, 200, 80 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP DNS Server" +CAPTION "TCP/IP DNS server" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 5, 25, 80, 12 LTEXT "DNS server:", -1, 5, 10, 120, 12 PUSHBUTTON "", IDC_OK, 50, 50, 50, 14, WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "Storno", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP END IDD_TCPIPSUFFIX_DLG DIALOGEX DISCARDABLE 0, 0, 200, 80 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP Domain Suffix" +CAPTION "TCP/IP doménová pøípona" FONT 8, "MS Shell Dlg" BEGIN EDITTEXT IDC_SUFFIX, 5, 25, 190, 12, WS_TABSTOP - LTEXT "Domain suffix:", -1, 5, 10, 120, 12 + LTEXT "Doménová pøípona:", -1, 5, 10, 120, 12 PUSHBUTTON "", IDC_OK, 50, 50, 50, 14, WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "Storno", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP END IDD_TCPIP_FILTER_DLG DIALOGEX DISCARDABLE 0, 0, 305, 220 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP Filtering" +CAPTION "TCP/IP filtrování" FONT 8, "MS Shell Dlg" BEGIN - CHECKBOX "Enable TCP/IP-Filtering (All adapters)", IDC_USE_FILTER, 15, 5, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "Zapnout filtrování TCP/IP (všechny adaptéry)", IDC_USE_FILTER, 15, 5, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP GROUPBOX "", -1, 5, 30, 90, 150 - CONTROL "Permit All", IDC_TCP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 30, 70, 12 - CONTROL "Permit Only", IDC_TCP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 44, 70, 12 + CONTROL "Povolit vše", IDC_TCP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 30, 70, 12 + CONTROL "Povolit pouze", IDC_TCP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 44, 70, 12 CONTROL "", IDC_TCP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 11, 62, 72, 75 - PUSHBUTTON "Add", IDC_TCP_ADD, 15, 141, 50, 14, WS_TABSTOP - PUSHBUTTON "Remove", IDC_TCP_DEL, 15, 161, 50, 14, WS_TABSTOP + PUSHBUTTON "Pøidat", IDC_TCP_ADD, 15, 141, 50, 14, WS_TABSTOP + PUSHBUTTON "Odebrat", IDC_TCP_DEL, 15, 161, 50, 14, WS_TABSTOP GROUPBOX "", -1, 105, 30, 90, 150 - CONTROL "Permit All", IDC_UDP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 115, 30, 70, 12 - CONTROL "Permit Only", IDC_UDP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 115, 44, 70, 12 + CONTROL "Povolit vše", IDC_UDP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 115, 30, 70, 12 + CONTROL "Povolit pouze", IDC_UDP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 115, 44, 70, 12 CONTROL "", IDC_UDP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 111, 62, 72, 75 - PUSHBUTTON "Add", IDC_UDP_ADD, 115, 141, 50, 14, WS_TABSTOP - PUSHBUTTON "Remove", IDC_UDP_DEL, 115, 161, 50, 14, WS_TABSTOP + PUSHBUTTON "Pøidat", IDC_UDP_ADD, 115, 141, 50, 14, WS_TABSTOP + PUSHBUTTON "Odebrat", IDC_UDP_DEL, 115, 161, 50, 14, WS_TABSTOP GROUPBOX "", -1, 205, 30, 90, 150 - CONTROL "Permit All", IDC_IP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 215, 30, 70, 12 - CONTROL "Permit Only", IDC_IP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 215, 44, 70, 12 + CONTROL "Povolit vše", IDC_IP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 215, 30, 70, 12 + CONTROL "Povolit pouze", IDC_IP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 215, 44, 70, 12 CONTROL "", IDC_IP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 211, 62, 72, 75 - PUSHBUTTON "Add", IDC_IP_ADD, 215, 141, 50, 14, WS_TABSTOP - PUSHBUTTON "Remove", IDC_IP_DEL, 215, 161, 50, 14, WS_TABSTOP + PUSHBUTTON "Pøidat", IDC_IP_ADD, 215, 141, 50, 14, WS_TABSTOP + PUSHBUTTON "Odebrat", IDC_IP_DEL, 215, 161, 50, 14, WS_TABSTOP PUSHBUTTON "OK", IDC_OK, 150, 190, 50, 14, WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 210, 190, 50, 14, WS_TABSTOP + PUSHBUTTON "Storno", IDCANCEL, 210, 190, 50, 14, WS_TABSTOP END IDD_TCPIP_PORT_DLG DIALOGEX DISCARDABLE 0, 0, 200, 60 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add Filter" +CAPTION "Pøidat filtr" FONT 8, "MS Shell Dlg" BEGIN EDITTEXT IDC_PORT_VAL, 5, 30, 70, 12, WS_TABSTOP | ES_NUMBER LTEXT "", IDC_PORT_DESC, 5, 15, 40, 12 PUSHBUTTON "OK", IDC_OK, 120, 15, 50, 14, WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 120, 30, 50, 14, WS_TABSTOP + PUSHBUTTON "Storno", IDCANCEL, 120, 30, 50, 14, WS_TABSTOP END STRINGTABLE BEGIN - IDS_NET_CONNECT "Network connection" - IDS_NO_IPADDR_SET "The adapter requires at least one IP address. Please enter one." - IDS_NO_SUBMASK_SET "You have entered an address that is missing its subnet mask. Please add a subnet mask." - IDS_TCPFILTERDESC "TCP/IP filtering allows you to control the type of TCP/IP network traffic that reaches your computer." - IDS_TCPFILTER "TCP/IP Filtering" - IDS_IPADDR "IP address" - IDS_SUBMASK "Subnet mask" - IDS_GATEWAY "Gateway" - IDS_METRIC "Metric" - IDS_DHCPACTIVE "DHCP Enabled" - IDS_AUTOMATIC "Automatic" - IDS_NOITEMSEL "You have not selected an item. Select one first." + IDS_NET_CONNECT "Síové pøipojení" + IDS_NO_IPADDR_SET "Adaptér vyžaduje zadání alespoò jedné IP adresy." + IDS_NO_SUBMASK_SET "K zadané adrese je nutné doplnit masku podsítì." + IDS_TCPFILTERDESC "TCP/IP filtrování dovoluje kontrolovat typ TCP/IP síového provozu, který se dostane k tomuto poèítaèi." + IDS_TCPFILTER "TCP/IP filtrování" + IDS_IPADDR "IP adresa" + IDS_SUBMASK "Maska podsítì" + IDS_GATEWAY "Brána" + IDS_METRIC "Metrika" + IDS_DHCPACTIVE "DHCP zapnuto" + IDS_AUTOMATIC "Automaticky" + IDS_NOITEMSEL "Nebyla vybrána žádná položka." IDS_TCPIP "ReactOS-TCP/IP" - IDS_ADD "Add" + IDS_ADD "Pøidat" IDS_MOD "OK" - IDS_TCP_PORTS "TCP Ports" - IDS_UDP_PORTS "UDP Ports" - IDS_IP_PROTO "IP protocols" - IDS_PORT_RANGE "Port numbers must be greater than 0 and less than 65536. Please enter a number within this range." - IDS_PROT_RANGE "Protocol numbers must be greater than 0 and less than 256. Please enter a number within this range." - IDS_DUP_NUMBER "The number you are trying to add is already in the list. Please enter a different number." - IDS_DISABLE_FILTER "Disabling this global TCP/IP setting will affect all adapters." - IDS_NO_SUFFIX "The current setting of search method requires at least one DNS suffix. Please enter one or change the setting." - IDS_DOMAIN_SUFFIX "Domain suffix is not a valid suffix." - IDS_DNS_SUFFIX "The DNS domain name ""%s"" is not a valid DNS name." - IDS_DUP_SUFFIX "The DNS suffix is already on the list." - IDS_DUP_IPADDR "The IP address is already on the list." - IDS_DUP_GW "The default gateway is already on the list." + IDS_TCP_PORTS "TCP porty" + IDS_UDP_PORTS "UDP porty" + IDS_IP_PROTO "IP protokoly" + IDS_PORT_RANGE "Èísla portù musí být zadána vyšší než 0 a nižší než 65536." + IDS_PROT_RANGE "Èísla protokolù musí být zadána vyšší než 0 a nižší než 256." + IDS_DUP_NUMBER "Pøidávané èíslo se už nachází v seznamu. Je nutné zadat jiné èíslo." + IDS_DISABLE_FILTER "Vypnutí tohoto globálního nastavení TCP/IP ovlivní všechny adaptéry." + IDS_NO_SUFFIX "Souèasné nastavení metod vyhledávání vyžaduje alespoò jednu DNS pøíponu. Je nutné ji zadat nebo zmìnit nastavení." + IDS_DOMAIN_SUFFIX "Zadaná doménová pøípona není platná." + IDS_DNS_SUFFIX "DNS doménové jméno ""%s"" není platné." + IDS_DUP_SUFFIX "DNS pøípona se už nachází v seznamu." + IDS_DUP_IPADDR "IP adresa se už nachází v seznamu." + IDS_DUP_GW "Výchozí brána se už nachází v seznamu." END diff --git a/reactos/dll/win32/netid/lang/cs-CZ.rc b/reactos/dll/win32/netid/lang/cs-CZ.rc index 886ad7ac864..41a04f6c041 100644 --- a/reactos/dll/win32/netid/lang/cs-CZ.rc +++ b/reactos/dll/win32/netid/lang/cs-CZ.rc @@ -1,6 +1,6 @@ /* FILE: dll/win32/netid/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2008-06-26 + * UPDATED: 2010-03-14 */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -18,10 +18,9 @@ BEGIN LTEXT "(Implicitní)", IDC_COMPUTERNAME, 98, 68, 144, 11 LTEXT "Pracovní skupina:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 LTEXT "(prázdné)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 - LTEXT "Pokud chcete použít Prùvodce síovou identifikací k pøipojení se k doménì a vytvoøení místního uživatele, kliknìte na ""Síová ID"".", IDC_STATIC, 6, 113, 172, 24 - //musi zustat jako sitova ID, jinak se nevejde na tlacitko! - PUSHBUTTON "&Síová ID...", IDC_NETWORK_ID, 190, 114, 58, 15 - LTEXT "Pokud chcete pøejmenovat tento poèítaè nebo se pøipojit k doménì, kliknìte na ""Zmìnit"".", IDC_STATIC, 6, 149, 170, 17 + LTEXT "Kliknutím na ""Síová ID"" lze použít Prùvodce síovou identifikací k pøipojení se k doménì a vytvoøení místního uživatele.", IDC_STATIC, 6, 113, 172, 24 + PUSHBUTTON "&Síová ID...", IDC_NETWORK_ID, 190, 114, 58, 15 //FIXME nic vic nez "sitova ID" se nevejde na tlacitko! + LTEXT "Kliknutím na ""Zmìnit"" lze pøejmenovat tento poèítaè nebo se pøipojit k doménì.", IDC_STATIC, 6, 149, 170, 17 PUSHBUTTON "&Zmìnit...",IDC_NETWORK_PROPERTY, 190, 149, 58, 15 LTEXT "Poznámka: Identifikaci tohoto poèítaèe mohou zmìnit pouze administrátoøi.", IDC_STATIC, 6, 179, 300, 9 END @@ -31,7 +30,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_CAPTIO CAPTION "Zmìna názvu poèítaèe" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "(message goes here)", 1017, 7, 5, 218, 30 + LTEXT "(sem patøí zpráva)", 1017, 7, 5, 218, 30 LTEXT "&Název poèítaèe:", -1, 7, 41, 219, 8 EDITTEXT 1002, 7, 53, 218, 14, ES_AUTOHSCROLL | ES_OEMCONVERT LTEXT "Úplný název poèítaèe:", 1016, 7, 72, 218, 10 @@ -41,7 +40,7 @@ BEGIN AUTORADIOBUTTON "&Domény:", 1008, 17, 132, 192, 10, WS_GROUP AUTORADIOBUTTON "&Pracovní skupiny:", 1004, 17, 161, 191, 10 EDITTEXT 116, 28, 144, 181, 14, ES_AUTOHSCROLL | WS_GROUP - PUSHBUTTON "Najít moj&i doménu", 1010, 7, 203, 109, 14, NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "Najít &moji doménu", 1010, 7, 203, 109, 14, NOT WS_VISIBLE | WS_DISABLED EDITTEXT 1007, 28, 172, 181, 14, ES_UPPERCASE | ES_AUTOHSCROLL | ES_OEMCONVERT DEFPUSHBUTTON "OK", 1, 121, 203, 50, 14, WS_GROUP PUSHBUTTON "Storno", 2, 176, 203, 50, 14 @@ -65,7 +64,7 @@ END STRINGTABLE BEGIN 1 "* Neznámé *" - 2 "WORKGROUP" + 2 "SKUPINA" 3 "Pøi pokusu o naètení informací o èlenství v doménì nastala následující chyba:" 4 "Zmìna názvu poèítaèe" 5 "Pracovní skupina:" @@ -73,12 +72,12 @@ BEGIN 22 "Vítejte v pracovní skupinì %1." 23 "Vítejte v doménì %1." 24 "Aby se zmìny mohly projevit, musí být poèítaè restartován." - 25 "You can change the name and the membership of this computer. Changes may affect access to network resources." + 25 "Lze zmìnit název a èlenství tohoto poèítaèe. Zmìny mohou mít vliv na pøístup k síovým prostøedkùm." 1021 "Poznámka: Identifikaci tohoto poèítaèe mohou zmìnit pouze administrátoøi." 1022 "Poznámka: Identifikace poèítaèe nemùže být zmìnìna z následujících dùvodù:" - 1030 "The new computer name ""%s"" contains characters which are not allowed. Characters which are not allowed include ` ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' \" , . < > / and ?" + 1030 "Nový název poèítaèe ""%s"" obsahuje nepovolené znaky. Mezi nepovolené znaky patøí ` ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' \" , . < > / ?" 3210 "&Detaily >>" 3220 "<< &Detaily" - 4000 "Information" - 4001 "Can't set new a computer name!" + 4000 "Informace" + 4001 "Nelze nastavit nový název poèítaèe!" END diff --git a/reactos/dll/win32/netid/lang/it-IT.rc b/reactos/dll/win32/netid/lang/it-IT.rc index 26af2b20588..a85b3795367 100644 --- a/reactos/dll/win32/netid/lang/it-IT.rc +++ b/reactos/dll/win32/netid/lang/it-IT.rc @@ -67,13 +67,13 @@ BEGIN 6 "Dominio:" 22 "Benvenuto al gruppo di lavoro %1." 23 "Benvenuto al dominio %1." - 24 "Il computer deve essre riavviato per rendere operative queste modifiche." - 25 "You can change the name and the membership of this computer. Changes may affect access to network resources." + 24 "Il computer deve essere riavviato per rendere operative queste modifiche." + 25 "Potete modificare il nome e il dominio di questo computer. Le modifiche potrebbero influenzare l'accesso alle risorse di rete." 1021 "Nota: Solo gli Amministratori possono cambiare l'identificazione di questo computer." 1022 "Nota: L'identificazione di questo computer non può essere cambiata perchè:" - 1030 "The new computer name ""%s"" contains characters which are not allowed. Characters which are not allowed include ` ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' \" , . < > / and ?" + 1030 "Il nuovo nome del computer ""%s"" contiene dei caratteri non permessi. I caratteri vietati sono `? ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' \" , . < > / " 3210 "&Dettagli >>" 3220 "<< &Dettagli" - 4000 "Information" - 4001 "Can't set new a computer name!" + 4000 "Informazioni" + 4001 "Impossibile assegnare il nuovo nome del computer!" END diff --git a/reactos/dll/win32/netshell/lang/cs-CZ.rc b/reactos/dll/win32/netshell/lang/cs-CZ.rc index db5e3ea00b6..b98ecf7c9b8 100644 --- a/reactos/dll/win32/netshell/lang/cs-CZ.rc +++ b/reactos/dll/win32/netshell/lang/cs-CZ.rc @@ -16,12 +16,12 @@ BEGIN GROUPBOX "Popis", -1, 9, 153, 230, 46, BS_GROUPBOX LTEXT "Tak tady bude popis komponenty...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP CHECKBOX "Po pøipojení zobrazit ikonu na hlavním panelu", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "&Notify me when this connection has limited or no connectivity", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Upozornit, když toto pøipojení bude mít omezenou nebo žádnou konektivitu", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP END IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "General" +CAPTION "Obecné nastavení" FONT 8, "MS Shell Dlg" BEGIN END @@ -65,62 +65,62 @@ BEGIN RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8 RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8 - PUSHBUTTON "&Detaily...", IDC_DETAILS, 22, 76, 62, 14 + PUSHBUTTON "&Podrobnosti...", IDC_DETAILS, 22, 76, 62, 14 END IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Network Connection Details" +CAPTION "Podrobnosti síového pøipojení" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Network Connection &Details:", -1, 15, 9, 170, 12 + LTEXT "&Podrobnosti síového pøipojení:", -1, 15, 9, 170, 12 CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130 - PUSHBUTTON "&Close", IDC_CLOSE, 125, 165, 62, 14 + PUSHBUTTON "&zavøít", IDC_CLOSE, 125, 165, 62, 14 END STRINGTABLE DISCARDABLE BEGIN - IDS_PHYSICAL_ADDRESS "Physical Address" - IDS_IP_ADDRESS "IP Address" - IDS_SUBNET_MASK "Subnet Mask" - IDS_DEF_GATEWAY "Default Gateway" - IDS_DHCP_SERVER "DHCP Server" - IDS_LEASE_OBTAINED "Lease Obtained" - IDS_LEASE_EXPIRES "Lease Expires" - IDS_DNS_SERVERS "DNS Servers" - IDS_WINS_SERVERS "WINS Servers" - IDS_PROPERTY "Property" - IDS_VALUE "Value" - IDS_NETWORKCONNECTION "Network Connection" - IDS_SHV_COLUMN_NAME "Name" - IDS_SHV_COLUMN_TYPE "Type" + IDS_PHYSICAL_ADDRESS "Fyzická adresa" + IDS_IP_ADDRESS "IP Adresa" + IDS_SUBNET_MASK "Maska podsítì" + IDS_DEF_GATEWAY "Výchozí brána" + IDS_DHCP_SERVER "DHCP server" + IDS_LEASE_OBTAINED "Zapùjèeno" + IDS_LEASE_EXPIRES "Zapùjèení vyprší" + IDS_DNS_SERVERS "DNS servery" + IDS_WINS_SERVERS "WINS servery" + IDS_PROPERTY "Vlastnost" + IDS_VALUE "Hodnota" + IDS_NETWORKCONNECTION "Síová pøipojení" + IDS_SHV_COLUMN_NAME "Název" + IDS_SHV_COLUMN_TYPE "Typ" IDS_SHV_COLUMN_STATE "Status" - IDS_SHV_COLUMN_DEVNAME "Device Name" - IDS_SHV_COLUMN_PHONE "Phone # or Host Address" - IDS_SHV_COLUMN_OWNER "Owner" - IDS_TYPE_ETHERNET "LAN or High-Speed Internet" - IDS_STATUS_NON_OPERATIONAL "Disabled" - IDS_STATUS_UNREACHABLE "Not Connected" - IDS_STATUS_DISCONNECTED "Network cable unplugged" - IDS_STATUS_CONNECTING "Acquiring network address" - IDS_STATUS_CONNECTED "Connected" - IDS_STATUS_OPERATIONAL "Connected" + IDS_SHV_COLUMN_DEVNAME "Název zaøízení" + IDS_SHV_COLUMN_PHONE "Telefonní èíslo nebo adresa hostitele" + IDS_SHV_COLUMN_OWNER "Vlastník" + IDS_TYPE_ETHERNET "LAN nebo vysokorychlostní internet" + IDS_STATUS_NON_OPERATIONAL "Vypnuto" + IDS_STATUS_UNREACHABLE "Nepøipojeno" + IDS_STATUS_DISCONNECTED "Síový kabel byl odpojen" + IDS_STATUS_CONNECTING "Získávám síovou adresu" + IDS_STATUS_CONNECTED "Pøipojeno" + IDS_STATUS_OPERATIONAL "Pøipojeno" - IDS_NET_ACTIVATE "Enable" - IDS_NET_DEACTIVATE "Disable" + IDS_NET_ACTIVATE "Zapnout" + IDS_NET_DEACTIVATE "Vypnout" IDS_NET_STATUS "Status" - IDS_NET_REPAIR "Repair" - IDS_NET_CREATELINK "Create Shortcut" - IDS_NET_DELETE "Delete" - IDS_NET_RENAME "Rename" - IDS_NET_PROPERTIES "Properties" + IDS_NET_REPAIR "Opravit" + IDS_NET_CREATELINK "Vytvoøit zástupce" + IDS_NET_DELETE "Smazat" + IDS_NET_RENAME "Pøejmenovat" + IDS_NET_PROPERTIES "Vlasnosti" IDS_FORMAT_BIT "%u Bit/s" IDS_FORMAT_KBIT "%u KBit/s" IDS_FORMAT_MBIT "%u MBit/s" IDS_FORMAT_GBIT "%u GBit/s" - IDS_DURATION_DAY "%d Day %s" - IDS_DURATION_DAYS "%d Days %s" + IDS_DURATION_DAY "%d Den %s" + IDS_DURATION_DAYS "%d Dnù %s" IDS_ASSIGNED_DHCP "Pøiøazeno DHCP" IDS_ASSIGNED_MANUAL "Ruènì nastaveno" END diff --git a/reactos/dll/win32/setupapi/lang/cs-CZ.rc b/reactos/dll/win32/setupapi/lang/cs-CZ.rc index 29573ac581d..c1ee9fd7c09 100644 --- a/reactos/dll/win32/setupapi/lang/cs-CZ.rc +++ b/reactos/dll/win32/setupapi/lang/cs-CZ.rc @@ -1,23 +1,7 @@ -/* Hey, Emacs, open this file with -*- coding: cp1250 -*- - * - * Czech resources for SETUPAPI - * - * Copyright 2001 Andreas Mohr - * Copyright 2004 David Kredba - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +/* FILE: dll/win32/setupapi/lang/cs-CZ.rc + * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) + * THANKS TO: David Kredba + * UPDATED: 2010-01-07 */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -39,7 +23,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_QUERY_REBOOT_TEXT "Your computer needs to be rebooted to finish installation. Do you want to proceed?" - IDS_QUERY_REBOOT_CAPTION "Reboot" - IDS_INF_FILE "Setup Information" + IDS_QUERY_REBOOT_TEXT "Aby mohla být instalace dokonèena, musí být poèítaè restartován. Pokraèovat?" + IDS_QUERY_REBOOT_CAPTION "Restartovat" + IDS_INF_FILE "Instalaèní informace" END diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index 8b8383f23b4..f2e2dd2aeea 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -1,21 +1,7 @@ -/* - * Copyright 1998 Juergen Schmied - * Copyright 2003 Filip Navara - * Copyright 2008 Radek Liska - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +/* FILE: dll/win32/shell32/lang/cs-CZ.rc + * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) + * UPDATED: 2010-04-05 + * THANKS TO: navaraf, who translated major part of this file */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -208,18 +194,18 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 3, 30, 30, WS_VISIBLE EDITTEXT 14001, 70, 9, 158, 14, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 8, 35, 50, 10 - LTEXT "Folder", 14005, 68, 35, 160, 10 - LTEXT "Location:", 14006, 8, 53, 50, 10 + LTEXT "Typ souboru:", 14004, 8, 35, 50, 10 + LTEXT "Složka", 14005, 68, 35, 160, 10 + LTEXT "Umístìní:", 14006, 8, 53, 50, 10 LTEXT "", 14007, 68, 53, 315, 10 - LTEXT "Size:", 14008, 8, 72, 45, 10 + LTEXT "Velikost:", 14008, 8, 72, 45, 10 LTEXT "", 14009, 68, 72, 315, 10 - LTEXT "Contains:", 14010, 8, 93, 45, 10 + LTEXT "Obsahuje:", 14010, 8, 93, 45, 10 LTEXT "", 14011, 68, 93, 160, 10 - LTEXT "Created:", 14014, 8, 118, 45, 10 + LTEXT "Vytvoøeno:", 14014, 8, 118, 45, 10 LTEXT "", 14015, 68, 118, 160, 10 - AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 - AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 + AUTOCHECKBOX "&Jen pro ètení", 14021, 45, 150, 67, 10 + AUTOCHECKBOX "&Skrytý", 14022, 126, 150, 50, 10 END SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 205 @@ -546,7 +532,7 @@ END FORMAT_DLG DIALOGEX 50, 50, 184, 218 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Format" +CAPTION "Formátování" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "&Spustit", IDOK, 53, 198, 60, 14 @@ -567,14 +553,14 @@ END CHKDSK_DLG DIALOGEX 50, 50, 194, 120 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Check Disk" +CAPTION "Zkontrolovat disk" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "Start", IDOK, 53, 100, 60, 14 - GROUPBOX "Check disk options", -1, 7, 6, 179, 50 - PUSHBUTTON "Cancel", IDCANCEL, 118, 100, 60, 14 - AUTOCHECKBOX "Automatically fix file system errors", 14000, 16, 15, 155, 10 - AUTOCHECKBOX "&Scan for and attempt recovery of bad sectors", 14001, 16, 30, 165, 10 + GROUPBOX "Možnosti kontroly disku", -1, 7, 6, 179, 50 + PUSHBUTTON "Storno", IDCANCEL, 118, 100, 60, 14 + AUTOCHECKBOX "Automaticky opravovat chyby souborového systému", 14000, 16, 15, 155, 10 + AUTOCHECKBOX "&Vyhledat a pokusit se obnovit vadné sektory", 14001, 16, 30, 165, 10 CONTROL "", 14002, "MSCTLS_PROGRESS32", 16, 7, 60, 170, 8 LTEXT "", 14003, 60, 80, 170, 10 END @@ -607,17 +593,17 @@ BEGIN IDS_SHV_COLUMN9 "Komentáø" IDS_SHV_COLUMN10 "Vlastník" IDS_SHV_COLUMN11 "Skupina" - IDS_SHV_COLUMN12 "Filename" - IDS_SHV_COLUMN13 "Category" + IDS_SHV_COLUMN12 "Název souboru" + IDS_SHV_COLUMN13 "Kategorie" IDS_SHV_COLUMN_DELFROM "Pùvodní umístìní" IDS_SHV_COLUMN_DELDATE "Odstranìno" IDS_SHV_COLUMN_FONTTYPE "Fonttype" - IDS_SHV_COLUMN_WORKGROUP "Workgroup" - IDS_SHV_NETWORKLOCATION "Network Location" - IDS_SHV_COLUMN_DOCUMENTS "Documents" + IDS_SHV_COLUMN_WORKGROUP "Pracovní skupina" + IDS_SHV_NETWORKLOCATION "Síové umístìní" + IDS_SHV_COLUMN_DOCUMENTS "Dokumenty" IDS_SHV_COLUMN_STATUS "Status" - IDS_SHV_COLUMN_COMMENTS "Comments" - IDS_SHV_COLUMN_LOCATION "Location" + IDS_SHV_COLUMN_COMMENTS "Komentáøe" + IDS_SHV_COLUMN_LOCATION "Umístìní" IDS_SHV_COLUMN_MODEL "Model" /* special folders */ @@ -625,7 +611,7 @@ BEGIN IDS_MYCOMPUTER "Tento poèítaè" IDS_RECYCLEBIN_FOLDER_NAME "Koš" IDS_CONTROLPANEL "Ovládací panely" - IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_ADMINISTRATIVETOOLS "Nástroje správy" /* context menus */ IDS_VIEW_LARGE "&Vedle sebe" @@ -634,15 +620,15 @@ BEGIN IDS_VIEW_DETAILS "&Podrobnosti" IDS_SELECT "Vybrat" IDS_OPEN "Otevøít" - IDS_CREATELINK "Vytvoøit zástupc&e" + IDS_CREATELINK "Vytvoøit zástupc&e" IDS_COPY "&Kopírovat" IDS_DELETE "O&dstranit" IDS_PROPERTIES "&Vlastnosti" IDS_CUT "Vyj&mout" - IDS_RESTORE "Restore" - IDS_FORMATDRIVE "Format..." - IDS_RENAME "Rename" - IDS_INSERT "Insert" + IDS_RESTORE "Obnovit" + IDS_FORMATDRIVE "Formátovat..." + IDS_RENAME "Pøejmenovat" + IDS_INSERT "Vložit" IDS_CREATEFOLDER_DENIED "Nelze vytvoøit novou složku, protože pøístup byl odepøen." IDS_CREATEFOLDER_CAPTION "Chyba pøi pokusu vytvoøit nový adresáø" @@ -666,8 +652,8 @@ BEGIN IDS_RESTART_PROMPT "Opravdu chcete restartovat systém?" IDS_SHUTDOWN_TITLE "Vypnout" IDS_SHUTDOWN_PROMPT "Opravdu chcete vypnout poèítaè?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" + IDS_LOGOFF_TITLE "Odhlásit se" + IDS_LOGOFF_PROMPT "Opravdu se chcete odhlásit?" /* shell folder path default values */ IDS_PROGRAMS "Nabídka Start\\Programy" @@ -737,19 +723,19 @@ BEGIN IDS_LNK_FILE "Zástupce" IDS_SYS_FILE "Systémový soubor" - IDS_OPEN_VERB "Open" - IDS_RUNAS_VERB "Run as " - IDS_EDIT_VERB "Edit" - IDS_FIND_VERB "Find" - IDS_PRINT_VERB "Print" - IDS_PLAY_VERB "Play" - IDS_PREVIEW_VERB "Preview" + IDS_OPEN_VERB "Otevøít" + IDS_RUNAS_VERB "Spustit jako " + IDS_EDIT_VERB "Upravit" + IDS_FIND_VERB "Najít" + IDS_PRINT_VERB "Tisknout" + IDS_PLAY_VERB "Pøehrát" + IDS_PREVIEW_VERB "Náhled" - IDS_FILE_FOLDER "%u Files, %u Folders" - IDS_PRINTERS "Printers" - IDS_FONTS "Fonts" - IDS_INSTALLNEWFONT "Install New Font..." + IDS_FILE_FOLDER "%u souborù, %u složek" + IDS_PRINTERS "Tiskárny" + IDS_FONTS "Fonty" + IDS_INSTALLNEWFONT "Nainstalovat nový font..." - IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" - IDS_COPY_OF "Copy of" + IDS_DEFAULT_CLUSTER_SIZE "Výchozí alokaèní velikost" + IDS_COPY_OF "Kopie " END diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index ba31b5a98ac..afddebe5c6f 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -751,5 +751,5 @@ BEGIN IDS_INSTALLNEWFONT "Installazione nuovi Font..." IDS_DEFAULT_CLUSTER_SIZE "Dimensione predefinita di allocazione" - IDS_COPY_OF "Copy of" + IDS_COPY_OF "Copia di" END diff --git a/reactos/dll/win32/syssetup/lang/it-IT.rc b/reactos/dll/win32/syssetup/lang/it-IT.rc index ba3f9988707..bc76a2eaca5 100644 --- a/reactos/dll/win32/syssetup/lang/it-IT.rc +++ b/reactos/dll/win32/syssetup/lang/it-IT.rc @@ -213,7 +213,7 @@ BEGIN IDS_GAMES "Giochi" IDS_CMT_SOLITAIRE "Solitario" IDS_CMT_WINEMINE "Campo minato" - IDS_CMT_SPIDER "Spider Solitaire" + IDS_CMT_SPIDER "Spider" END STRINGTABLE @@ -235,7 +235,7 @@ BEGIN IDS_SYS_ENTERTAINMENT "Divertimento" IDS_CMT_MPLAY32 "Esegui Multimedia Player" IDS_CMT_SNDVOL32 "Esegui Controllo Volume" - IDS_CMT_SNDREC32 "Launch Sound Recorder" + IDS_CMT_SNDREC32 "Esegui il Registratore di suonoi" END STRINGTABLE @@ -255,7 +255,7 @@ STRINGTABLE BEGIN IDS_SHORT_CMD "Prompt dei comandi.lnk" IDS_SHORT_EXPLORER "ReactOS Explorer.lnk" - IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk" + IDS_SHORT_DOWNLOADER "ReactOS gestione applicazioni.lnk" IDS_SHORT_SERVICE "Service Manager.lnk" IDS_SHORT_DEVICE "Device Manager.lnk" IDS_SHORT_MPLAY32 "Multimedia Player.lnk" @@ -271,12 +271,12 @@ BEGIN IDS_SHORT_RDESKTOP "Remote Desktop.lnk" IDS_SHORT_KBSWITCH "Layout di tastiera.lnk" IDS_SHORT_EVENTVIEW "Visualizzatore Eventi.lnk" - IDS_SHORT_MSCONFIG "Configuratione del sistema.lnk" + IDS_SHORT_MSCONFIG "Configurazione del sistema.lnk" IDS_SHORT_SNDVOL32 "Controllo Volume.lnk" IDS_SHORT_SNDREC32 "Audiorecorder.lnk" IDS_SHORT_DXDIAG "ReactX Diagnostica.lnk" IDS_SHORT_PAINT "Paint.lnk" - IDS_SHORT_SPIDER "Spider Solitaire.lnk" + IDS_SHORT_SPIDER "Spider.lnk" END STRINGTABLE diff --git a/reactos/dll/win32/userenv/lang/cs-CZ.rc b/reactos/dll/win32/userenv/lang/cs-CZ.rc index a582d533aab..4067447b058 100644 --- a/reactos/dll/win32/userenv/lang/cs-CZ.rc +++ b/reactos/dll/win32/userenv/lang/cs-CZ.rc @@ -1,20 +1,6 @@ -/* - * Copyright (C) 2004 Eric Kohl - * 2008 Radek Liska - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +/* FILE: dll/win32/devmgr/lang/cs-CZ.rc + * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) + * UPDATED: 2010-01-07 */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -36,7 +22,7 @@ BEGIN IDS_TEMPLATES "Šablony" IDS_RECENT "Poslední dokumenty" IDS_SENDTO "SendTo" - IDS_PRINTHOOD "okolní tiskárny" + IDS_PRINTHOOD "Okolní tiskárny" IDS_NETHOOD "Okolní sí" IDS_LOCALSETTINGS "Local Settings" IDS_LOCALAPPDATA "Local Settings\\Data Aplikací" From a16ef45831da4c400d36a4596f8f056ab5877e3b Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 10 Apr 2010 19:24:21 +0000 Subject: [PATCH 097/261] [USETUP] Switch KDSERIAL debug builds to new boot method, old boot method tends to bugcheck svn path=/trunk/; revision=46826 --- reactos/base/setup/usetup/bootsup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/setup/usetup/bootsup.c b/reactos/base/setup/usetup/bootsup.c index fe835ff5a1e..7abbcb1f4a0 100644 --- a/reactos/base/setup/usetup/bootsup.c +++ b/reactos/base/setup/usetup/bootsup.c @@ -428,7 +428,7 @@ CreateFreeLoaderIniForReactos(PWCHAR IniPath, /* ReactOS_KdSerial */ CreateFreeLoaderEntry(IniCache, IniSection, L"ReactOS_KdSerial", L"\"ReactOS (RosDbg)\"", - L"ReactOS", ArcPath, + L"Windows2003", ArcPath, L"/DEBUG /DEBUGPORT=COM1 /BAUDRATE=115200 /SOS /KDSERIAL"); /* ReactOS_LogFile */ From 386c534e6cc1359e268712c69cafd14fdae8c5ba Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 11 Apr 2010 01:40:15 +0000 Subject: [PATCH 098/261] [CDROM] - ULONG -> ULONG_PTR svn path=/trunk/; revision=46834 --- reactos/drivers/storage/class/cdrom/cdrom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/storage/class/cdrom/cdrom.c b/reactos/drivers/storage/class/cdrom/cdrom.c index e5a51493139..ef462658d7e 100644 --- a/reactos/drivers/storage/class/cdrom/cdrom.c +++ b/reactos/drivers/storage/class/cdrom/cdrom.c @@ -5127,7 +5127,7 @@ Return Value: // The data buffer must be aligned. // - srb->DataBuffer = (PVOID) (((ULONG) (context + 1) + (alignment - 1)) & + srb->DataBuffer = (PVOID) (((ULONG_PTR) (context + 1) + (alignment - 1)) & ~(alignment - 1)); @@ -5877,7 +5877,7 @@ Return Value: irpStack = IoGetCurrentIrpStackLocation(irp); if (irpStack->Parameters.Others.Argument3) { - ULONG count; + ULONG_PTR count; // // Decrement the countdown timer and put the IRP back in the list. @@ -6497,7 +6497,7 @@ Return Value: PIO_STACK_LOCATION irpStack; NTSTATUS status; BOOLEAN retry; - ULONG retryCount; + ULONG_PTR retryCount; ULONG lastSector; PIRP originalIrp; PCDROM_DATA cddata; From 91d15df7c5fbf6f293be5d6d9e074dfdefa05925 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 11 Apr 2010 10:39:20 +0000 Subject: [PATCH 099/261] [WIN32K] - Handle keyboard input when no windows are present - Patch by Andrey Ivanov with changes suggested in the bug report See issue #3560 for more details. svn path=/trunk/; revision=46836 --- .../subsystems/win32/win32k/ntuser/input.c | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index f0790e19a7b..6b02f2d270e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -713,6 +713,7 @@ KeyboardThreadMain(PVOID StartContext) for (;NumKeys;memcpy(&KeyInput, &NextKeyInput, sizeof(KeyInput)), NumKeys--) { + PKBL keyboardLayout = NULL; lParam = 0; IntKeyboardUpdateLeds(KeyboardDeviceHandle, @@ -783,29 +784,30 @@ KeyboardThreadMain(PVOID StartContext) } /* Find the target thread whose locale is in effect */ - FocusQueue = IntGetFocusMessageQueue(); + FocusQueue = IntGetFocusMessageQueue(); - /* This might cause us to lose hot keys, which are important - * (ctrl-alt-del secure attention sequence). Not sure if it - * can happen though. - */ - if (!FocusQueue) - continue; + if (FocusQueue) + { + msg.hwnd = FocusQueue->FocusWindow; + + FocusThread = FocusQueue->Thread; + if (FocusThread && FocusThread->Tcb.Win32Thread) + { + keyboardLayout = ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout; + } + } + if (!keyboardLayout) + { + keyboardLayout = W32kGetDefaultKeyLayout(); + } msg.lParam = lParam; - msg.hwnd = FocusQueue->FocusWindow; - - FocusThread = FocusQueue->Thread; - - if (!(FocusThread && FocusThread->Tcb.Win32Thread && - ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout)) - continue; /* This function uses lParam to fill wParam according to the * keyboard layout in use. */ W32kKeyProcessMessage(&msg, - ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout->KBTables, + keyboardLayout->KBTables, KeyInput.Flags & KEY_E0 ? 0xE0 : (KeyInput.Flags & KEY_E1 ? 0xE1 : 0)); @@ -827,6 +829,11 @@ KeyboardThreadMain(PVOID StartContext) continue; /* Eat key up motion too */ } + if (!FocusQueue) + { + /* There is no focused window to receive a keyboard message */ + continue; + } /* * Post a keyboard message. */ From a4f5e7b91227ac98805a39c490d23a0d3beed7f8 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 11 Apr 2010 12:18:27 +0000 Subject: [PATCH 100/261] [ISAPNP] - Comment it out from the bootloader. - Remove it from machine.inf. - This "driver" introduces significant delay at every boot due to i/o space scanning every time at every boot, however there is no real benefit (it always fails). Inclusion of this driver into default boot process might be reconsidered only after it starts providing some advantages. For now please test this driver in your own working copies. svn path=/trunk/; revision=46837 --- reactos/boot/bootdata/txtsetup.sif | 4 ++-- reactos/media/inf/machine.inf | Bin 45566 -> 45620 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/boot/bootdata/txtsetup.sif b/reactos/boot/bootdata/txtsetup.sif index 4da20f331da..35f1c761937 100644 --- a/reactos/boot/bootdata/txtsetup.sif +++ b/reactos/boot/bootdata/txtsetup.sif @@ -37,10 +37,10 @@ ramdisk.sys=,,,,,,x,,,,,,4 ext2.sys=,,,,,,x,,,,,,4 [HardwareIdsDatabase] -*PNP0A00 = isapnp +;*PNP0A00 = isapnp *PNP0A03 = pci *PNP0C08 = acpi -PCI\CC_0601 = isapnp +;PCI\CC_0601 = isapnp PCI\CC_0604 = pci [BootBusExtenders.Load] diff --git a/reactos/media/inf/machine.inf b/reactos/media/inf/machine.inf index ce3f8658bd0285b1ad9b8532e5acf16a8fb95ffb..ecc90375e8d1de8d54b6cc66e14fa58f09e17e72 100644 GIT binary patch delta 35 rcmezOm}$!srVT10jMkIwg`_9ji3Ckn5s{i4C8V@@nn=oACN2g5>ZA)u delta 31 ncmdn;gz4X7rVT10lO2SlCOe1(O+Fybw)vb$%3PNJ|F{?c)P@YN From 5d13bbcc06d90923ac22ec23550e24270fde214f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 11 Apr 2010 16:08:20 +0000 Subject: [PATCH 101/261] [NTOSKRNL] - Make legacy device keys volatile svn path=/trunk/; revision=46840 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 10 ++++++---- reactos/ntoskrnl/io/pnpmgr/pnpreport.c | 3 ++- reactos/ntoskrnl/io/pnpmgr/pnproot.c | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 14969fb18db..e5aee2001db 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -63,6 +63,7 @@ IopUpdateResourceMapForPnPDevice( NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, + IN ULONG CreateOptions, OUT PHANDLE Handle); PDEVICE_NODE @@ -226,7 +227,7 @@ IopStartDevice( } } - Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, &InstanceHandle); + Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceHandle); if (!NT_SUCCESS(Status)) return Status; @@ -458,7 +459,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, } /* Create the device key for legacy drivers */ - Status = IopCreateDeviceKeyPath(&Node->InstancePath, &InstanceHandle); + Status = IopCreateDeviceKeyPath(&Node->InstancePath, REG_OPTION_VOLATILE, &InstanceHandle); if (!NT_SUCCESS(Status)) { ZwClose(InstanceHandle); @@ -761,6 +762,7 @@ IopTraverseDeviceTree(PDEVICETREE_TRAVERSE_CONTEXT Context) NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, + IN ULONG CreateOptions, OUT PHANDLE Handle) { UNICODE_STRING EnumU = RTL_CONSTANT_STRING(ENUM_ROOT); @@ -811,7 +813,7 @@ IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, &ObjectAttributes, 0, NULL, - 0, + CreateOptions, NULL); /* Close parent key handle, we don't need it anymore */ @@ -2244,7 +2246,7 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, /* * Create registry key for the instance id, if it doesn't exist yet */ - Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, &InstanceKey); + Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceKey); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create the instance key! (Status %lx)\n", Status); diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpreport.c b/reactos/ntoskrnl/io/pnpmgr/pnpreport.c index c75e566b0d4..239dcb0511d 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpreport.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpreport.c @@ -15,6 +15,7 @@ NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, + IN ULONG CreateOptions, OUT PHANDLE Handle); NTSTATUS @@ -196,7 +197,7 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, IopActionConfigureChildServices(DeviceNode, DeviceNode->Parent); /* Open a handle to the instance path key */ - Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, &InstanceKey); + Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceKey); if (!NT_SUCCESS(Status)) return Status; diff --git a/reactos/ntoskrnl/io/pnpmgr/pnproot.c b/reactos/ntoskrnl/io/pnpmgr/pnproot.c index 7a62ed23ca8..c755c0fc0b8 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnproot.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnproot.c @@ -172,7 +172,7 @@ PnpRootCreateDevice( if (NT_SUCCESS(Status)) { InitializeObjectAttributes(&ObjectAttributes, &Device->DeviceID, OBJ_CASE_INSENSITIVE, EnumHandle, NULL); - Status = ZwCreateKey(&DeviceKeyHandle, KEY_SET_VALUE, &ObjectAttributes, 0, NULL, 0, NULL); + Status = ZwCreateKey(&DeviceKeyHandle, KEY_SET_VALUE, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL); ZwClose(EnumHandle); } From 26d1db9190c7c986fb01fad1d56462bf264701cd Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sun, 11 Apr 2010 16:10:49 +0000 Subject: [PATCH 102/261] [NTOS]: Some PnP ABI refactoring for future patches/work. [NTOS]: Switch to PnP Add Device routine, currently mostly a copy of the original ReactOS code. However, PnP now tries to open all the required registry keys before attempting to start the device. Failures are reported and load cancelled. More work TBD. svn path=/trunk/; revision=46841 --- reactos/ntoskrnl/include/internal/io.h | 23 ++++ reactos/ntoskrnl/io/iomgr/device.c | 18 +++ reactos/ntoskrnl/io/iomgr/driver.c | 10 +- reactos/ntoskrnl/io/pnpmgr/pnpinit.c | 112 +++++++++++++++++ reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 166 ++++++++++++------------- 5 files changed, 237 insertions(+), 92 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index dc80ff249a5..4f2b236156c 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -509,6 +509,14 @@ typedef struct _DEVICETREE_TRAVERSE_CONTEXT // // PNP Routines // +NTSTATUS +NTAPI +PipCallDriverAddDevice( + IN PDEVICE_NODE DeviceNode, + IN BOOLEAN LoadDriver, + IN PDRIVER_OBJECT DriverObject +); + VOID PnpInit( VOID @@ -563,6 +571,15 @@ IopFreeDeviceNode( ); NTSTATUS +NTAPI +IopSynchronousCall( + IN PDEVICE_OBJECT DeviceObject, + IN PIO_STACK_LOCATION IoStackLocation, + OUT PVOID *Information +); + +NTSTATUS +NTAPI IopInitiatePnpIrp( IN PDEVICE_OBJECT DeviceObject, IN PIO_STATUS_BLOCK IoStatusBlock, @@ -694,6 +711,12 @@ IoInitSystem( // // Device/Volume Routines // +VOID +NTAPI +IopReadyDeviceObjects( + IN PDRIVER_OBJECT Driver +); + NTSTATUS FASTCALL IopInitializeDevice( diff --git a/reactos/ntoskrnl/io/iomgr/device.c b/reactos/ntoskrnl/io/iomgr/device.c index 7434970734f..b9176ce276b 100644 --- a/reactos/ntoskrnl/io/iomgr/device.c +++ b/reactos/ntoskrnl/io/iomgr/device.c @@ -25,6 +25,24 @@ extern LIST_ENTRY IopTapeFsListHead; /* PRIVATE FUNCTIONS **********************************************************/ +VOID +NTAPI +IopReadyDeviceObjects(IN PDRIVER_OBJECT Driver) +{ + PAGED_CODE(); + PDEVICE_OBJECT DeviceObject; + + /* Set the driver as initialized */ + Driver->Flags |= DRVO_INITIALIZED; + DeviceObject = Driver->DeviceObject; + while (DeviceObject) + { + /* Set every device as initialized too */ + DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + DeviceObject = DeviceObject->NextDevice; + } +} + VOID NTAPI IopDeleteDevice(IN PVOID ObjectBody) diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index 18202bfd5e4..1ab54458526 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -438,7 +438,6 @@ IopInitializeDriverModule( UNICODE_STRING RegistryKey; PDRIVER_INITIALIZE DriverEntry; PDRIVER_OBJECT Driver; - PDEVICE_OBJECT DeviceObject; NTSTATUS Status; DriverEntry = ModuleObject->EntryPoint; @@ -495,14 +494,7 @@ IopInitializeDriverModule( } /* Set the driver as initialized */ - Driver->Flags |= DRVO_INITIALIZED; - DeviceObject = Driver->DeviceObject; - while (DeviceObject) - { - /* Set every device as initialized too */ - DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; - DeviceObject = DeviceObject->NextDevice; - } + IopReadyDeviceObjects(Driver); if (PnpSystemInit) IopReinitializeDrivers(); diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpinit.c b/reactos/ntoskrnl/io/pnpmgr/pnpinit.c index 8c5607289a6..24c8ba6753c 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpinit.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpinit.c @@ -219,4 +219,116 @@ Quickie: return i; } +NTSTATUS +NTAPI +PipCallDriverAddDevice(IN PDEVICE_NODE DeviceNode, + IN BOOLEAN LoadDriver, + IN PDRIVER_OBJECT DriverObject) +{ + NTSTATUS Status; + HANDLE EnumRootKey, SubKey, ControlKey, ClassKey, PropertiesKey; + UNICODE_STRING ClassGuid, Properties; + UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT); + UNICODE_STRING ControlClass = + RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class"); + PKEY_VALUE_FULL_INFORMATION KeyValueInformation = NULL; + PWCHAR Buffer; + + /* Open enumeration root key */ + Status = IopOpenRegistryKeyEx(&EnumRootKey, + NULL, + &EnumRoot, + KEY_READ); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); + return Status; + } + + /* Open instance subkey */ + Status = IopOpenRegistryKeyEx(&SubKey, + EnumRootKey, + &DeviceNode->InstancePath, + KEY_READ); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); + ZwClose(EnumRootKey); + return Status; + } + + /* Get class GUID */ + Status = IopGetRegistryValue(SubKey, + REGSTR_VAL_CLASSGUID, + &KeyValueInformation); + if (NT_SUCCESS(Status)) + { + /* Convert to unicode string */ + Buffer = (PVOID)((ULONG_PTR)KeyValueInformation + KeyValueInformation->DataOffset); + PnpRegSzToString(Buffer, KeyValueInformation->DataLength, &ClassGuid.Length); + ClassGuid.MaximumLength = KeyValueInformation->DataLength; + ClassGuid.Buffer = Buffer; + + /* Open the key */ + Status = IopOpenRegistryKeyEx(&ControlKey, + NULL, + &ControlClass, + KEY_READ); + if (!NT_SUCCESS(Status)) + { + /* No class key */ + DPRINT1("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); + ClassKey = NULL; + } + else + { + /* Open the class key */ + Status = IopOpenRegistryKeyEx(&ClassKey, + ControlKey, + &ClassGuid, + KEY_READ); + ZwClose(ControlKey); + if (!NT_SUCCESS(Status)) + { + /* No class key */ + DPRINT1("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); + ClassKey = NULL; + } + } + + /* Check if we made it till here */ + if (ClassKey) + { + /* Get the device properties */ + RtlInitUnicodeString(&Properties, REGSTR_KEY_DEVICE_PROPERTIES); + Status = IopOpenRegistryKeyEx(&PropertiesKey, + ClassKey, + &Properties, + KEY_READ); + if (!NT_SUCCESS(Status)) + { + /* No properties */ + DPRINT("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); + PropertiesKey = NULL; + } + } + + /* Free the registry data */ + ExFreePool(KeyValueInformation); + } + + /* Do ReactOS-style setup */ + IopAttachFilterDrivers(DeviceNode, TRUE); + Status = IopInitializeDevice(DeviceNode, DriverObject); + if (NT_SUCCESS(Status)) + { + IopAttachFilterDrivers(DeviceNode, FALSE); + IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + Status = IopStartDevice(DeviceNode); + } + + /* Return status */ + return Status; +} + /* EOF */ diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index e5aee2001db..8862fd87bcd 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -618,69 +618,90 @@ IopFreeDeviceNode(PDEVICE_NODE DeviceNode) } NTSTATUS -IopInitiatePnpIrp(PDEVICE_OBJECT DeviceObject, - PIO_STATUS_BLOCK IoStatusBlock, - ULONG MinorFunction, - PIO_STACK_LOCATION Stack OPTIONAL) +NTAPI +IopSynchronousCall(IN PDEVICE_OBJECT DeviceObject, + IN PIO_STACK_LOCATION IoStackLocation, + OUT PVOID *Information) { - PDEVICE_OBJECT TopDeviceObject; - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; - KEVENT Event; - PIRP Irp; - - /* Always call the top of the device stack */ - TopDeviceObject = IoGetAttachedDeviceReference(DeviceObject); - - KeInitializeEvent( - &Event, - NotificationEvent, - FALSE); - - Irp = IoBuildSynchronousFsdRequest( - IRP_MJ_PNP, - TopDeviceObject, - NULL, - 0, - NULL, - &Event, - IoStatusBlock); - - /* PNP IRPs are initialized with a status code of STATUS_NOT_SUPPORTED */ - Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - Irp->IoStatus.Information = 0; - - if (MinorFunction == IRP_MN_FILTER_RESOURCE_REQUIREMENTS) - { - Irp->IoStatus.Information = (ULONG_PTR)Stack->Parameters.FilterResourceRequirements.IoResourceRequirementList; - } - - IrpSp = IoGetNextIrpStackLocation(Irp); - IrpSp->MinorFunction = (UCHAR)MinorFunction; - - if (Stack) - { - RtlCopyMemory(&IrpSp->Parameters, - &Stack->Parameters, - sizeof(Stack->Parameters)); - } - - Status = IoCallDriver(TopDeviceObject, Irp); - if (Status == STATUS_PENDING) - { - KeWaitForSingleObject(&Event, - Executive, - KernelMode, - FALSE, - NULL); - Status = IoStatusBlock->Status; - } - - ObDereferenceObject(TopDeviceObject); - - return Status; + PIRP Irp; + PIO_STACK_LOCATION IrpStack; + IO_STATUS_BLOCK IoStatusBlock; + KEVENT Event; + NTSTATUS Status; + PDEVICE_OBJECT TopDeviceObject; + PAGED_CODE(); + + /* Call the top of the device stack */ + TopDeviceObject = IoGetAttachedDeviceReference(DeviceObject); + + /* Allocate an IRP */ + Irp = IoAllocateIrp(TopDeviceObject->StackSize, FALSE); + if (!Irp) return STATUS_INSUFFICIENT_RESOURCES; + + /* Initialize to failure */ + Irp->IoStatus.Status = IoStatusBlock.Status = STATUS_NOT_SUPPORTED; + Irp->IoStatus.Information = IoStatusBlock.Information = 0; + + /* Initialize the event */ + KeInitializeEvent(&Event, SynchronizationEvent, FALSE); + + /* Set them up */ + Irp->UserIosb = &IoStatusBlock; + Irp->UserEvent = &Event; + + /* Queue the IRP */ + Irp->Tail.Overlay.Thread = PsGetCurrentThread(); + IoQueueThreadIrp(Irp); + + /* Copy-in the stack */ + IrpStack = IoGetNextIrpStackLocation(Irp); + *IrpStack = *IoStackLocation; + + /* Call the driver */ + Status = IoCallDriver(TopDeviceObject, Irp); + if (Status == STATUS_PENDING) + { + /* Wait for it */ + KeWaitForSingleObject(&Event, + Executive, + KernelMode, + FALSE, + NULL); + Status = IoStatusBlock.Status; + } + + /* Return the information */ + *Information = (PVOID)IoStatusBlock.Information; + return Status; } +NTSTATUS +NTAPI +IopInitiatePnpIrp(IN PDEVICE_OBJECT DeviceObject, + IN OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG MinorFunction, + IN PIO_STACK_LOCATION Stack OPTIONAL) +{ + IO_STACK_LOCATION IoStackLocation; + + /* Fill out the stack information */ + RtlZeroMemory(&IoStackLocation, sizeof(IO_STACK_LOCATION)); + IoStackLocation.MajorFunction = IRP_MJ_PNP; + IoStackLocation.MinorFunction = MinorFunction; + if (Stack) + { + /* Copy the rest */ + RtlCopyMemory(&IoStackLocation.Parameters, + &Stack->Parameters, + sizeof(Stack->Parameters)); + } + + /* Do the PnP call */ + IoStatusBlock->Status = IopSynchronousCall(DeviceObject, + &IoStackLocation, + (PVOID)&IoStatusBlock->Information); + return IoStatusBlock->Status; +} NTSTATUS IopTraverseDeviceTreeNode(PDEVICETREE_TRAVERSE_CONTEXT Context) @@ -2909,29 +2930,8 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode, /* Driver is loaded and initialized at this point */ if (NT_SUCCESS(Status)) { - /* Attach lower level filter drivers. */ - IopAttachFilterDrivers(DeviceNode, TRUE); - - /* Initialize the function driver for the device node */ - Status = IopInitializeDevice(DeviceNode, DriverObject); - - if (NT_SUCCESS(Status)) - { - /* Attach upper level filter drivers. */ - IopAttachFilterDrivers(DeviceNode, FALSE); - - Status = IopStartDevice(DeviceNode); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopStartDevice(%wZ) failed with status 0x%08x\n", - &DeviceNode->InstancePath, Status); - } - } - else - { - DPRINT1("IopInitializeDevice(%wZ) failed with status 0x%08x\n", - &DeviceNode->InstancePath, Status); - } + /* Initialize the device, including all filters */ + Status = PipCallDriverAddDevice(DeviceNode, FALSE, DriverObject); } else { From 5d6b19c9a0f64fd1b79e17d752c51674309a85ea Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 11 Apr 2010 16:21:29 +0000 Subject: [PATCH 103/261] [NTOSKRNL] - Store the allocated resources for reported devices svn path=/trunk/; revision=46842 --- reactos/ntoskrnl/io/pnpmgr/pnpreport.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpreport.c b/reactos/ntoskrnl/io/pnpmgr/pnpreport.c index 239dcb0511d..4995b16fd65 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpreport.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpreport.c @@ -266,9 +266,6 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, /* Write the resource information to the registry */ IopSetDeviceInstanceData(InstanceKey, DeviceNode); - /* Close the instance key handle */ - ZwClose(InstanceKey); - /* If the caller didn't get the resources assigned for us, do it now */ if (!ResourceAssigned) { @@ -278,7 +275,19 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, { Status = IopTranslateDeviceResources(DeviceNode, RequiredLength); if (NT_SUCCESS(Status)) + { Status = IopUpdateResourceMapForPnPDevice(DeviceNode); + if (NT_SUCCESS(Status) && DeviceNode->ResourceList) + { + RtlInitUnicodeString(&ValueName, L"AllocConfig"); + Status = ZwSetValueKey(InstanceKey, + &ValueName, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceList, + CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); + } + } } IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); @@ -286,10 +295,14 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, if (!NT_SUCCESS(Status)) { DPRINT("Assigning resources failed: 0x%x\n", Status); + ZwClose(InstanceKey); return Status; } } + /* Close the instance key handle */ + ZwClose(InstanceKey); + /* Report the device's enumeration to umpnpmgr */ IopQueueTargetDeviceEvent(&GUID_DEVICE_ENUMERATED, &DeviceNode->InstancePath); From e511742ca6105c9bbb409332284143047cafbfe3 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 11 Apr 2010 16:23:57 +0000 Subject: [PATCH 104/261] [NTOSKRNL] - Don't set the DNF_STARTED flag before calling IopStartDevice svn path=/trunk/; revision=46843 --- reactos/ntoskrnl/io/pnpmgr/pnpinit.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpinit.c b/reactos/ntoskrnl/io/pnpmgr/pnpinit.c index 24c8ba6753c..afa54eb5ad9 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpinit.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpinit.c @@ -323,7 +323,6 @@ PipCallDriverAddDevice(IN PDEVICE_NODE DeviceNode, if (NT_SUCCESS(Status)) { IopAttachFilterDrivers(DeviceNode, FALSE); - IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); Status = IopStartDevice(DeviceNode); } From d568475220437109561c8a329b257124673fe8e6 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 11 Apr 2010 17:31:17 +0000 Subject: [PATCH 105/261] [NTOSKRNL] - Use IopDeviceNodeSetFlag to set the DNF_HAS_BOOT_CONFIG flag - Set DNF_START_FAILED and print a warning if we fail to start a device - Clear the DNF_ASSIGNING_RESOURCES flag before failing - TODO: Release device resources when start fails svn path=/trunk/; revision=46844 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 8862fd87bcd..644338ee502 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -147,7 +147,7 @@ IopStartDevice( IO_STACK_LOCATION Stack; ULONG RequiredLength; NTSTATUS Status; - HANDLE InstanceHandle, ControlHandle; + HANDLE InstanceHandle = INVALID_HANDLE_VALUE, ControlHandle = INVALID_HANDLE_VALUE; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; @@ -162,6 +162,7 @@ IopStartDevice( if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED) { DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); + IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); return Status; } else if (NT_SUCCESS(Status)) @@ -192,6 +193,9 @@ IopStartDevice( } IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + if (!NT_SUCCESS(Status)) + goto ByeBye; + DPRINT("Sending IRP_MN_START_DEVICE to driver\n"); Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->ResourceList; Stack.Parameters.StartDevice.AllocatedResourcesTranslated = DeviceNode->ResourceListTranslated; @@ -213,7 +217,9 @@ IopStartDevice( if (!NT_SUCCESS(Status)) { - DPRINT("IopInitiatePnpIrp() failed\n"); + DPRINT1("IRP_MN_START_DEVICE failed for %wZ\n", &DeviceNode->InstancePath); + IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); + goto ByeBye; } else { @@ -229,7 +235,7 @@ IopStartDevice( Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceHandle); if (!NT_SUCCESS(Status)) - return Status; + goto ByeBye; RtlInitUnicodeString(&KeyName, L"Control"); InitializeObjectAttributes(&ObjectAttributes, @@ -239,10 +245,7 @@ IopStartDevice( NULL); Status = ZwCreateKey(&ControlHandle, KEY_SET_VALUE, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL); if (!NT_SUCCESS(Status)) - { - ZwClose(InstanceHandle); - return Status; - } + goto ByeBye; RtlInitUnicodeString(&KeyName, L"ActiveService"); Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_SZ, DeviceNode->ServiceName.Buffer, DeviceNode->ServiceName.Length); @@ -254,11 +257,17 @@ IopStartDevice( DeviceNode->ResourceList, CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); } +ByeBye: if (NT_SUCCESS(Status)) IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + else + IopDeviceNodeSetFlag(DeviceNode, DNF_START_FAILED); - ZwClose(ControlHandle); - ZwClose(InstanceHandle); + if (ControlHandle != INVALID_HANDLE_VALUE) + ZwClose(ControlHandle); + + if (InstanceHandle != INVALID_HANDLE_VALUE) + ZwClose(InstanceHandle); return Status; } @@ -2497,7 +2506,7 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, { DeviceNode->BootResources = (PCM_RESOURCE_LIST)IoStatusBlock.Information; - DeviceNode->Flags |= DNF_HAS_BOOT_CONFIG; + IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); } else { From ec9ebec239dfbb4de339861cec89b1ab2f98ce56 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sun, 11 Apr 2010 21:25:50 +0000 Subject: [PATCH 106/261] [NTOS]: Rename IopBusTypeGuidList to PnpBusTypeGuidList to match Windows 2003 PnP Namespace instead of Windows 2000. [NTOS]: Use PnpBusTypeGuidList->Lock instead of PnpBusTypeGuidListLock. [NTOS]: Implement PipAllocateDeviceNode for setting up device nodes and linking them to a PDO. Only used for Root PnP now. Main ABI change is that allocate in ReactOS right now includes "insert". These will be seperate in the new PnP ABI. [NTOS]: Implement IopInitializePnpServices to replace PnpInit. Mostly the same work is done, but using new PnP ABI. [NTOS]: Implement new helper: IopCreateRegistryKeyEx. svn path=/trunk/; revision=46845 --- reactos/ntoskrnl/include/internal/io.h | 38 ++- reactos/ntoskrnl/io/iomgr/iomgr.c | 5 +- reactos/ntoskrnl/io/pnpmgr/pnpinit.c | 171 +++++++++++++- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 305 ++++++++++++++++--------- reactos/ntoskrnl/io/pnpmgr/pnproot.c | 2 + 5 files changed, 398 insertions(+), 123 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 4f2b236156c..1faff6bfcea 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -517,8 +517,9 @@ PipCallDriverAddDevice( IN PDRIVER_OBJECT DriverObject ); -VOID -PnpInit( +NTSTATUS +NTAPI +IopInitializePlugPlayServices( VOID ); @@ -557,6 +558,12 @@ IopGetSystemPowerDeviceObject( IN PDEVICE_OBJECT *DeviceObject ); +PDEVICE_NODE +NTAPI +PipAllocateDeviceNode( + IN PDEVICE_OBJECT PhysicalDeviceObject +); + NTSTATUS IopCreateDeviceNode( IN PDEVICE_NODE ParentNode, @@ -644,14 +651,32 @@ IopOpenRegistryKeyEx( NTSTATUS NTAPI -IopGetRegistryValue(IN HANDLE Handle, - IN PWSTR ValueName, - OUT PKEY_VALUE_FULL_INFORMATION *Information); +IopGetRegistryValue( + IN HANDLE Handle, + IN PWSTR ValueName, + OUT PKEY_VALUE_FULL_INFORMATION *Information +); +NTSTATUS +NTAPI +IopCreateRegistryKeyEx( + OUT PHANDLE Handle, + IN HANDLE BaseHandle OPTIONAL, + IN PUNICODE_STRING KeyName, + IN ACCESS_MASK DesiredAccess, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL +); // // PnP Routines // +NTSTATUS +NTAPI +IopUpdateRootKey( + VOID +); + NTSTATUS NTAPI PiInitCacheGroupInformation( @@ -1138,6 +1163,7 @@ IopStartRamdisk( // extern POBJECT_TYPE IoCompletionType; extern PDEVICE_NODE IopRootDeviceNode; +extern KSPIN_LOCK IopDeviceTreeLock; extern ULONG IopTraceLevel; extern GENERAL_LOOKASIDE IopMdlLookasideList; extern GENERIC_MAPPING IopCompletionMapping; @@ -1147,6 +1173,8 @@ extern HAL_DISPATCH _HalDispatchTable; extern LIST_ENTRY IopErrorLogListHead; extern ULONG IopNumTriageDumpDataBlocks; extern PVOID IopTriageDumpDataBlocks[64]; +extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList; +extern PDRIVER_OBJECT IopRootDriverObject; // // Inlined Functions diff --git a/reactos/ntoskrnl/io/iomgr/iomgr.c b/reactos/ntoskrnl/io/iomgr/iomgr.c index e52f2fe54ab..a0f16bb15a4 100644 --- a/reactos/ntoskrnl/io/iomgr/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr/iomgr.c @@ -488,10 +488,7 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (!IopCreateRootDirectories()) return FALSE; /* Initialize PnP manager */ - PnpInit(); - - /* Setup the group cache */ - if (!NT_SUCCESS(PiInitCacheGroupInformation())) return FALSE; + IopInitializePlugPlayServices(); /* Load boot start drivers */ IopInitializeBootDrivers(); diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpinit.c b/reactos/ntoskrnl/io/pnpmgr/pnpinit.c index afa54eb5ad9..deced326832 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpinit.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpinit.c @@ -14,11 +14,34 @@ /* GLOBALS ********************************************************************/ +typedef struct _IOPNP_DEVICE_EXTENSION +{ + PWCHAR CompatibleIdList; + ULONG CompatibleIdListSize; +} IOPNP_DEVICE_EXTENSION, *PIOPNP_DEVICE_EXTENSION; + PUNICODE_STRING PiInitGroupOrderTable; ULONG PiInitGroupOrderTableCount; - +INTERFACE_TYPE PnpDefaultInterfaceType; + /* FUNCTIONS ******************************************************************/ +INTERFACE_TYPE +NTAPI +IopDetermineDefaultInterfaceType(VOID) +{ + /* FIXME: ReactOS doesn't support MicroChannel yet */ + return Isa; +} + +NTSTATUS +NTAPI +IopInitializeArbiters(VOID) +{ + /* FIXME: TODO */ + return STATUS_SUCCESS; +} + NTSTATUS NTAPI PiInitCacheGroupInformation(VOID) @@ -330,4 +353,150 @@ PipCallDriverAddDevice(IN PDEVICE_NODE DeviceNode, return Status; } +NTSTATUS +NTAPI +IopInitializePlugPlayServices(VOID) +{ + NTSTATUS Status; + ULONG Disposition; + HANDLE KeyHandle, EnumHandle, ParentHandle, TreeHandle; + UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET"); + PDEVICE_OBJECT Pdo; + + /* Initialize locks and such */ + KeInitializeSpinLock(&IopDeviceTreeLock); + + /* Get the default interface */ + PnpDefaultInterfaceType = IopDetermineDefaultInterfaceType(); + + /* Initialize arbiters */ + Status = IopInitializeArbiters(); + if (!NT_SUCCESS(Status)) return Status; + + /* Setup the group cache */ + Status = PiInitCacheGroupInformation(); + if (!NT_SUCCESS(Status)) return Status; + + /* Open the current control set */ + Status = IopOpenRegistryKeyEx(&KeyHandle, + NULL, + &KeyName, + KEY_ALL_ACCESS); + if (!NT_SUCCESS(Status)) return Status; + + /* Create the enum key */ + RtlInitUnicodeString(&KeyName, REGSTR_KEY_ENUM); + Status = IopCreateRegistryKeyEx(&EnumHandle, + KeyHandle, + &KeyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + &Disposition); + if (!NT_SUCCESS(Status)) return Status; + + /* Check if it's a new key */ + if (Disposition == REG_CREATED_NEW_KEY) + { + /* FIXME: DACLs */ + DPRINT1("Need to build DACL\n"); + } + + /* Create the root key */ + ParentHandle = EnumHandle; + RtlInitUnicodeString(&KeyName, REGSTR_KEY_ROOTENUM); + Status = IopCreateRegistryKeyEx(&EnumHandle, + ParentHandle, + &KeyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + &Disposition); + NtClose(ParentHandle); + if (!NT_SUCCESS(Status)) return Status; + NtClose(EnumHandle); + + /* Open the root key now */ + RtlInitUnicodeString(&KeyName, L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET\\ENUM"); + Status = IopOpenRegistryKeyEx(&EnumHandle, + NULL, + &KeyName, + KEY_ALL_ACCESS); + if (NT_SUCCESS(Status)) + { + /* Create the root dev node */ + RtlInitUnicodeString(&KeyName, REGSTR_VAL_ROOT_DEVNODE); + Status = IopCreateRegistryKeyEx(&TreeHandle, + EnumHandle, + &KeyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + NULL); + NtClose(EnumHandle); + if (NT_SUCCESS(Status)) NtClose(TreeHandle); + } + + /* Create the root driver */ + Status = IoCreateDriver(NULL, PnpRootDriverEntry); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IoCreateDriverObject() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } + + /* Create the root PDO */ + Status = IoCreateDevice(IopRootDriverObject, + sizeof(IOPNP_DEVICE_EXTENSION), + NULL, + FILE_DEVICE_CONTROLLER, + 0, + FALSE, + &Pdo); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IoCreateDevice() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } + + /* This is a bus enumerated device */ + Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; + + /* Create the root device node */ + IopRootDeviceNode = PipAllocateDeviceNode(Pdo); + + /* Set flags */ + IopRootDeviceNode->Flags |= DNF_STARTED + DNF_PROCESSED + DNF_ENUMERATED + + DNF_MADEUP + DNF_NO_RESOURCE_REQUIRED + + DNF_ADDED; + + /* Create instance path */ + RtlCreateUnicodeString(&IopRootDeviceNode->InstancePath, + REGSTR_VAL_ROOT_DEVNODE); + + /* Call the add device routine */ + IopRootDriverObject->DriverExtension->AddDevice(IopRootDriverObject, + IopRootDeviceNode->PhysicalDeviceObject); + + /* Initialize PnP-Event notification support */ + Status = IopInitPlugPlayEvents(); + if (!NT_SUCCESS(Status)) return Status; + + /* Report the device to the user-mode pnp manager */ + IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, + &IopRootDeviceNode->InstancePath); + + /* Initialize the Bus Type GUID List */ + PnpBusTypeGuidList = ExAllocatePool(PagedPool, sizeof(IO_BUS_TYPE_GUID_LIST)); + RtlZeroMemory(PnpBusTypeGuidList, sizeof(IO_BUS_TYPE_GUID_LIST)); + ExInitializeFastMutex(&PnpBusTypeGuidList->Lock); + + /* Launch the firmware mapper */ + Status = IopUpdateRootKey(); + if (!NT_SUCCESS(Status)) return Status; + + /* Close the handle to the control set */ + NtClose(KeyHandle); + + /* We made it */ + return STATUS_SUCCESS; +} + /* EOF */ diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 644338ee502..439795c603a 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -29,8 +29,7 @@ extern BOOLEAN PnpSystemInit; /* DATA **********************************************************************/ PDRIVER_OBJECT IopRootDriverObject; -FAST_MUTEX IopBusTypeGuidListLock; -PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList = NULL; +PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList = NULL; #if defined (ALLOC_PRAGMA) #pragma alloc_text(INIT, PnpInit) @@ -340,14 +339,14 @@ IopGetBusTypeGuidIndex(LPGUID BusTypeGuid) PVOID NewList; /* Acquire the lock */ - ExAcquireFastMutex(&IopBusTypeGuidListLock); + ExAcquireFastMutex(&PnpBusTypeGuidList->Lock); /* Loop all entries */ - while (i < IopBusTypeGuidList->GuidCount) + while (i < PnpBusTypeGuidList->GuidCount) { /* Try to find a match */ if (RtlCompareMemory(BusTypeGuid, - &IopBusTypeGuidList->Guids[i], + &PnpBusTypeGuidList->Guids[i], sizeof(GUID)) == sizeof(GUID)) { /* Found it */ @@ -358,43 +357,43 @@ IopGetBusTypeGuidIndex(LPGUID BusTypeGuid) } /* Check if we have to grow the list */ - if (IopBusTypeGuidList->GuidCount) + if (PnpBusTypeGuidList->GuidCount) { /* Calculate the new size */ NewSize = sizeof(IO_BUS_TYPE_GUID_LIST) + - (sizeof(GUID) * IopBusTypeGuidList->GuidCount); + (sizeof(GUID) * PnpBusTypeGuidList->GuidCount); /* Allocate the new copy */ NewList = ExAllocatePool(PagedPool, NewSize); if (!NewList) { /* Fail */ - ExFreePool(IopBusTypeGuidList); + ExFreePool(PnpBusTypeGuidList); goto Quickie; } /* Now copy them, decrease the size too */ NewSize -= sizeof(GUID); - RtlCopyMemory(NewList, IopBusTypeGuidList, NewSize); + RtlCopyMemory(NewList, PnpBusTypeGuidList, NewSize); /* Free the old list */ - ExFreePool(IopBusTypeGuidList); + ExFreePool(PnpBusTypeGuidList); /* Use the new buffer */ - IopBusTypeGuidList = NewList; + PnpBusTypeGuidList = NewList; } /* Copy the new GUID */ - RtlCopyMemory(&IopBusTypeGuidList->Guids[IopBusTypeGuidList->GuidCount], + RtlCopyMemory(&PnpBusTypeGuidList->Guids[PnpBusTypeGuidList->GuidCount], BusTypeGuid, sizeof(GUID)); /* The new entry is the index */ - FoundIndex = (USHORT)IopBusTypeGuidList->GuidCount; - IopBusTypeGuidList->GuidCount++; + FoundIndex = (USHORT)PnpBusTypeGuidList->GuidCount; + PnpBusTypeGuidList->GuidCount++; Quickie: - ExReleaseFastMutex(&IopBusTypeGuidListLock); + ExReleaseFastMutex(&PnpBusTypeGuidList->Lock); return FoundIndex; } @@ -1671,7 +1670,7 @@ IopCreateResourceListFromRequirements( { PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); } *ResourceList = ExAllocatePool(PagedPool, Size); @@ -1821,8 +1820,8 @@ IopAssignDeviceResources( for (i = 0; i < DeviceNode->BootResources->Count; i++) { pPartialResourceList = &DeviceNode->BootResources->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); for (j = 0; j < pPartialResourceList->Count; j++) { if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) @@ -1865,8 +1864,8 @@ IopAssignDeviceResources( for (i = 0; i < DeviceNode->ResourceList->Count; i++) { pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); } Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); @@ -3153,7 +3152,7 @@ IopEnumerateDetectedDevices( BootResourcesLength = pValueInformation->DataLength; else BootResourcesLength = ParentBootResourcesLength - + pValueInformation->DataLength + + pValueInformation->DataLength - Header; BootResources = ExAllocatePool(PagedPool, BootResourcesLength); if (!BootResources) @@ -3585,7 +3584,8 @@ cleanup: #endif } -static NTSTATUS INIT_FUNCTION +NTSTATUS +NTAPI IopUpdateRootKey(VOID) { UNICODE_STRING EnumU = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Enum"); @@ -3692,6 +3692,131 @@ IopOpenRegistryKeyEx(PHANDLE KeyHandle, return Status; } +NTSTATUS +NTAPI +IopCreateRegistryKeyEx(OUT PHANDLE Handle, + IN HANDLE RootHandle OPTIONAL, + IN PUNICODE_STRING KeyName, + IN ACCESS_MASK DesiredAccess, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + ULONG KeyDisposition, RootHandleIndex = 0, i = 1, NestedCloseLevel = 0, Length; + HANDLE HandleArray[2]; + BOOLEAN Recursing = TRUE; + PWCHAR pp, p, p1; + UNICODE_STRING KeyString; + NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); + + /* P1 is start, pp is end */ + p1 = KeyName->Buffer; + pp = (PVOID)((ULONG_PTR)p1 + KeyName->Length); + + /* Create the target key */ + InitializeObjectAttributes(&ObjectAttributes, + KeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + RootHandle, + NULL); + Status = ZwCreateKey(&HandleArray[i], + DesiredAccess, + &ObjectAttributes, + 0, + NULL, + CreateOptions, + &KeyDisposition); + + /* Now we check if this failed */ + if ((Status == STATUS_OBJECT_NAME_NOT_FOUND) && (RootHandle)) + { + /* Target key failed, so we'll need to create its parent. Setup array */ + HandleArray[0] = NULL; + HandleArray[1] = RootHandle; + + /* Keep recursing for each missing parent */ + while (Recursing) + { + /* And if we're deep enough, close the last handle */ + if (NestedCloseLevel > 1) ZwClose(HandleArray[RootHandleIndex]); + + /* We're setup to ping-pong between the two handle array entries */ + RootHandleIndex = i; + i = (i + 1) & 1; + + /* Clear the one we're attempting to open now */ + HandleArray[i] = NULL; + + /* Process the parent key name */ + for (p = p1; ((p < pp) && (*p != OBJ_NAME_PATH_SEPARATOR)); p++); + Length = (p - p1) * sizeof(WCHAR); + + /* Is there a parent name? */ + if (Length) + { + /* Build the unicode string for it */ + KeyString.Buffer = p1; + KeyString.Length = KeyString.MaximumLength = Length; + + /* Now try opening the parent */ + InitializeObjectAttributes(&ObjectAttributes, + &KeyString, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + HandleArray[RootHandleIndex], + NULL); + Status = ZwCreateKey(&HandleArray[i], + DesiredAccess, + &ObjectAttributes, + 0, + NULL, + CreateOptions, + &KeyDisposition); + if (NT_SUCCESS(Status)) + { + /* It worked, we have one more handle */ + NestedCloseLevel++; + } + else + { + /* Parent key creation failed, abandon loop */ + Recursing = FALSE; + continue; + } + } + else + { + /* We don't have a parent name, probably corrupted key name */ + Status = STATUS_INVALID_PARAMETER; + Recursing = FALSE; + continue; + } + + /* Now see if there's more parents to create */ + p1 = p + 1; + if ((p == pp) || (p1 == pp)) + { + /* We're done, hopefully successfully, so stop */ + Recursing = FALSE; + } + } + + /* Outer loop check for handle nesting that requires closing the top handle */ + if (NestedCloseLevel > 1) ZwClose(HandleArray[RootHandleIndex]); + } + + /* Check if we broke out of the loop due to success */ + if (NT_SUCCESS(Status)) + { + /* Return the target handle (we closed all the parent ones) and disposition */ + *Handle = HandleArray[i]; + if (Disposition) *Disposition = KeyDisposition; + } + + /* Return the success state */ + return Status; +} + NTSTATUS NTAPI IopGetRegistryValue(IN HANDLE Handle, @@ -3737,95 +3862,6 @@ IopGetRegistryValue(IN HANDLE Handle, return STATUS_SUCCESS; } -static NTSTATUS INIT_FUNCTION -NTAPI -PnpDriverInitializeEmpty(IN struct _DRIVER_OBJECT *DriverObject, IN PUNICODE_STRING RegistryPath) -{ - return STATUS_SUCCESS; -} - -VOID INIT_FUNCTION -PnpInit(VOID) -{ - PDEVICE_OBJECT Pdo; - NTSTATUS Status; - - DPRINT("PnpInit()\n"); - - KeInitializeSpinLock(&IopDeviceTreeLock); - ExInitializeFastMutex(&IopBusTypeGuidListLock); - - /* Initialize the Bus Type GUID List */ - IopBusTypeGuidList = ExAllocatePool(NonPagedPool, sizeof(IO_BUS_TYPE_GUID_LIST)); - if (!IopBusTypeGuidList) { - DPRINT1("ExAllocatePool() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, STATUS_NO_MEMORY, 0, 0, 0); - } - - RtlZeroMemory(IopBusTypeGuidList, sizeof(IO_BUS_TYPE_GUID_LIST)); - ExInitializeFastMutex(&IopBusTypeGuidList->Lock); - - /* Initialize PnP-Event notification support */ - Status = IopInitPlugPlayEvents(); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopInitPlugPlayEvents() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - /* - * Create root device node - */ - - Status = IopCreateDriver(NULL, PnpDriverInitializeEmpty, NULL, 0, 0, &IopRootDriverObject); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IoCreateDriverObject() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - Status = IoCreateDevice(IopRootDriverObject, 0, NULL, FILE_DEVICE_CONTROLLER, - 0, FALSE, &Pdo); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IoCreateDevice() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - Status = IopCreateDeviceNode(NULL, Pdo, NULL, &IopRootDeviceNode); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Insufficient resources\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - if (!RtlCreateUnicodeString(&IopRootDeviceNode->InstancePath, - L"HTREE\\ROOT\\0")) - { - DPRINT1("Failed to create the instance path!\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, STATUS_NO_MEMORY, 0, 0, 0); - } - - /* Report the device to the user-mode pnp manager */ - IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, - &IopRootDeviceNode->InstancePath); - - IopRootDeviceNode->PhysicalDeviceObject->Flags |= DO_BUS_ENUMERATED_DEVICE; - PnpRootDriverEntry(IopRootDriverObject, NULL); - IopRootDeviceNode->PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; - IopRootDriverObject->DriverExtension->AddDevice( - IopRootDriverObject, - IopRootDeviceNode->PhysicalDeviceObject); - - /* Move information about devices detected by Freeloader to SYSTEM\CurrentControlSet\Root\ */ - Status = IopUpdateRootKey(); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopUpdateRootKey() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } -} - RTL_GENERIC_COMPARE_RESULTS NTAPI PiCompareInstancePath(IN PRTL_AVL_TABLE Table, @@ -3913,6 +3949,49 @@ PpInitSystem(VOID) } } +LONG IopNumberDeviceNodes; + +PDEVICE_NODE +NTAPI +PipAllocateDeviceNode(IN PDEVICE_OBJECT PhysicalDeviceObject) +{ + PDEVICE_NODE DeviceNode; + PAGED_CODE(); + + /* Allocate it */ + DeviceNode = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_NODE), 'donD'); + if (!DeviceNode) return DeviceNode; + + /* Statistics */ + InterlockedIncrement(&IopNumberDeviceNodes); + + /* Set it up */ + RtlZeroMemory(DeviceNode, sizeof(DEVICE_NODE)); + DeviceNode->InterfaceType = InterfaceTypeUndefined; + DeviceNode->BusNumber = -1; + DeviceNode->ChildInterfaceType = InterfaceTypeUndefined; + DeviceNode->ChildBusNumber = -1; + DeviceNode->ChildBusTypeIndex = -1; +// KeInitializeEvent(&DeviceNode->EnumerationMutex, SynchronizationEvent, TRUE); + InitializeListHead(&DeviceNode->DeviceArbiterList); + InitializeListHead(&DeviceNode->DeviceTranslatorList); + InitializeListHead(&DeviceNode->TargetDeviceNotify); + InitializeListHead(&DeviceNode->DockInfo.ListEntry); + InitializeListHead(&DeviceNode->PendedSetInterfaceState); + + /* Check if there is a PDO */ + if (PhysicalDeviceObject) + { + /* Link it and remove the init flag */ + DeviceNode->PhysicalDeviceObject = PhysicalDeviceObject; + ((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode = DeviceNode; + PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + } + + /* Return the node */ + return DeviceNode; +} + /* PUBLIC FUNCTIONS **********************************************************/ /* @@ -3953,7 +4032,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, case DevicePropertyBusTypeGuid: /* Sanity check */ if ((DeviceNode->ChildBusTypeIndex != 0xFFFF) && - (DeviceNode->ChildBusTypeIndex < IopBusTypeGuidList->GuidCount)) + (DeviceNode->ChildBusTypeIndex < PnpBusTypeGuidList->GuidCount)) { /* Return the GUID */ *ResultLength = sizeof(GUID); @@ -3966,7 +4045,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, /* Copy the GUID */ RtlCopyMemory(PropertyBuffer, - &(IopBusTypeGuidList->Guids[DeviceNode->ChildBusTypeIndex]), + &(PnpBusTypeGuidList->Guids[DeviceNode->ChildBusTypeIndex]), sizeof(GUID)); return STATUS_SUCCESS; } diff --git a/reactos/ntoskrnl/io/pnpmgr/pnproot.c b/reactos/ntoskrnl/io/pnpmgr/pnproot.c index c755c0fc0b8..30c612f1fc3 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnproot.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnproot.c @@ -1185,6 +1185,8 @@ PnpRootDriverEntry( { DPRINT("PnpRootDriverEntry(%p %wZ)\n", DriverObject, RegistryPath); + IopRootDriverObject = DriverObject; + DriverObject->DriverExtension->AddDevice = PnpRootAddDevice; DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl; From 8b6a58978fc6b4aa3cb002032522402226eda5ec Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Apr 2010 19:39:50 +0000 Subject: [PATCH 107/261] [HAL] Fix a possible overflow of the hal heap in HalpMapPhysicalMemory64 and simplify the code. svn path=/trunk/; revision=46849 --- reactos/hal/halx86/generic/halinit.c | 36 +++++++++++++--------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/reactos/hal/halx86/generic/halinit.c b/reactos/hal/halx86/generic/halinit.c index 4309ac1a16e..db54eb59d63 100644 --- a/reactos/hal/halx86/generic/halinit.c +++ b/reactos/hal/halx86/generic/halinit.c @@ -145,33 +145,31 @@ HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress, /* Start at the current HAL heap base */ BaseAddress = HalpHeapStart; + VirtualAddress = BaseAddress; /* Loop until we have all the pages required */ while (UsedPages < PageCount) { - /* Begin a new loop cycle */ - UsedPages = 0; - VirtualAddress = BaseAddress; - /* If this overflows past the HAL heap, it means there's no space */ - if (BaseAddress == NULL) return NULL; + if (VirtualAddress == NULL) return NULL; - /* Loop until we have all the pages required in a single run */ - while (UsedPages < PageCount) + /* Get the PTE for this address */ + PointerPte = HalAddressToPte(VirtualAddress); + + /* Go to the next page */ + VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE); + + /* Check if the page is available */ + if (PointerPte->Valid) { - /* Get the PTE for this address and check if it's available */ - PointerPte = HalAddressToPte(VirtualAddress); - if (*(PULONG)PointerPte) - { - /* PTE has data, skip it and start with a new base address */ - BaseAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE); - break; - } - - /* PTE is available, keep going on this run */ - VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE); - UsedPages++; + /* PTE has data, skip it and start with a new base address */ + BaseAddress = VirtualAddress; + UsedPages = 0; + continue; } + + /* PTE is available, keep going on this run */ + UsedPages++; } /* Take the base address of the page plus the actual offset in the address */ From c85b9b7fadcb2b026d2c2394a286849df64ad994 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 12 Apr 2010 19:43:07 +0000 Subject: [PATCH 108/261] [KERNEL32] Daniel Zimmerman: Update GetShortPathNameW to Wine See issue #4553 for more details. svn path=/trunk/; revision=46850 --- reactos/dll/win32/kernel32/file/dir.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/kernel32/file/dir.c b/reactos/dll/win32/kernel32/file/dir.c index 97c04470e75..848d4f8f543 100644 --- a/reactos/dll/win32/kernel32/file/dir.c +++ b/reactos/dll/win32/kernel32/file/dir.c @@ -741,7 +741,7 @@ GetShortPathNameW ( } /* check for drive letter */ - if (longpath[1] == ':' ) + if (longpath[0] != '/' && longpath[1] == ':' ) { tmpshortpath[0] = longpath[0]; tmpshortpath[1] = ':'; @@ -772,7 +772,7 @@ GetShortPathNameW ( tmplen = p - (longpath + lp); lstrcpynW(tmpshortpath + sp, longpath + lp, tmplen + 1); /* Check, if the current element is a valid dos name */ - if (tmplen <= 8+1+3+1) + if (tmplen <= 8+1+3) { BOOLEAN spaces; memcpy(ustr_buf, longpath + lp, tmplen * sizeof(WCHAR)); From 846afbdef51f397a8f6b8a26657922a7a5a81ded Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 12 Apr 2010 19:47:09 +0000 Subject: [PATCH 109/261] [SHELL32] - Add prepared file association failure text plus some translations from Wine - Prevents completely empty message boxes See issue #4572 for more details. svn path=/trunk/; revision=46851 --- reactos/dll/win32/shell32/lang/bg-BG.rc | 2 ++ reactos/dll/win32/shell32/lang/ca-ES.rc | 2 ++ reactos/dll/win32/shell32/lang/cs-CZ.rc | 2 ++ reactos/dll/win32/shell32/lang/da-DK.rc | 2 ++ reactos/dll/win32/shell32/lang/de-DE.rc | 2 ++ reactos/dll/win32/shell32/lang/el-GR.rc | 2 ++ reactos/dll/win32/shell32/lang/en-GB.rc | 2 ++ reactos/dll/win32/shell32/lang/en-US.rc | 2 ++ reactos/dll/win32/shell32/lang/es-ES.rc | 2 ++ reactos/dll/win32/shell32/lang/fi-FI.rc | 2 ++ reactos/dll/win32/shell32/lang/fr-FR.rc | 2 ++ reactos/dll/win32/shell32/lang/hu-HU.rc | 2 ++ reactos/dll/win32/shell32/lang/it-IT.rc | 2 ++ reactos/dll/win32/shell32/lang/ja-JP.rc | 1 + reactos/dll/win32/shell32/lang/ko-KR.rc | 2 ++ reactos/dll/win32/shell32/lang/nl-NL.rc | 2 ++ reactos/dll/win32/shell32/lang/no-NO.rc | 4 +++- reactos/dll/win32/shell32/lang/pl-PL.rc | 2 ++ reactos/dll/win32/shell32/lang/pt-BR.rc | 2 ++ reactos/dll/win32/shell32/lang/pt-PT.rc | 2 ++ reactos/dll/win32/shell32/lang/ro-RO.rc | 2 ++ reactos/dll/win32/shell32/lang/ru-RU.rc | 2 ++ reactos/dll/win32/shell32/lang/sk-SK.rc | 2 ++ reactos/dll/win32/shell32/lang/sl-SI.rc | 2 ++ reactos/dll/win32/shell32/lang/sv-SE.rc | 2 ++ reactos/dll/win32/shell32/lang/tr-TR.rc | 2 ++ reactos/dll/win32/shell32/lang/uk-UA.rc | 2 ++ reactos/dll/win32/shell32/lang/zh-CN.rc | 2 ++ reactos/dll/win32/shell32/lang/zh-TW.rc | 2 ++ 29 files changed, 58 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index 63fe6968565..13a9bdb9f44 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -752,6 +752,8 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Ïîäðàçáèðàí ðàçïðåäåëèòåëåí ðàçìåð" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index 567cbc1533b..214028e7d8e 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index f2e2dd2aeea..1f4fc948540 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -738,4 +738,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Výchozí alokaèní velikost" IDS_COPY_OF "Kopie " + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index baa177f4631..9ad423c95e4 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -740,4 +740,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index a07af8785d3..5610af6fa30 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -755,4 +755,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Standardgröße" IDS_COPY_OF "Kopie von" + + IDS_SHLEXEC_NOASSOC "Es ist kein Programm mit diesem Dateityp verknüpft." END diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index 4a18d144671..a269d68ed2f 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -752,4 +752,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index e25cedd5e08..5d8f02c9a47 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index b24ed529a28..6e8aef34ee0 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index 8bbf95ef8c8..f26e1d4b616 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -754,4 +754,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Tamaño asignado por defecto" IDS_COPY_OF "Copia de" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index d34a695da49..6469ce1b7b5 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index ae5b34b4973..3d4932fc081 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -755,4 +755,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Taille d'allocation par défaut" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "Aucun programme Windows n'est configuré pour ouvrir ce type de fichier." END diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index 79964671b28..e45819a2d47 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -754,4 +754,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index afddebe5c6f..8372b351e75 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -752,4 +752,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Dimensione predefinita di allocazione" IDS_COPY_OF "Copia di" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index 3b083005517..c09ba106660 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -751,4 +751,5 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "ƒfƒtƒHƒ‹ƒg ƒAƒƒP[ƒVƒ‡ƒ“ ƒTƒCƒY" IDS_COPY_OF "ƒRƒs[ `" + END diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index 96f8656e3eb..98981f74213 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index 95c4465e1f5..1689e2a3bae 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "Er is geen Windows-programma geconfigureerd om dit soort bestanden te openen." END diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index e659e3f8175..f02aa64fecd 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -752,6 +752,8 @@ BEGIN IDS_FONTS "Skrifttyper" IDS_INSTALLNEWFONT "Installere nye skrifttyper..." - IDS_DEFAULT_CLUSTER_SIZE "Standard tildelingsstørrelse" + IDS_DEFAULT_CLUSTER_SIZE "Standard tildelingsstørrelse" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "Intet Windows-program er satt opp til å åpne denne filtypen." END diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index 7ef8add35dc..c9a4d40a48b 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -758,4 +758,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Domyœlny rozmiar jednostki alokacji" IDS_COPY_OF "Kopia" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index a2d235b4883..7679014ff37 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -753,4 +753,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "Nici un program Windows nu este configurat sa deschida fi?iere de acest tip." END diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index 34f98f578cb..2d99ca47e97 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -754,4 +754,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Tamanho da unidade de atribuição" IDS_COPY_OF "Cópia de" + + IDS_SHLEXEC_NOASSOC "Não existe um programa Windows configurado para abrir este tipo de ficheiro." END diff --git a/reactos/dll/win32/shell32/lang/ro-RO.rc b/reactos/dll/win32/shell32/lang/ro-RO.rc index a479927320e..fb24c2ba437 100644 --- a/reactos/dll/win32/shell32/lang/ro-RO.rc +++ b/reactos/dll/win32/shell32/lang/ro-RO.rc @@ -753,6 +753,8 @@ BEGIN IDS_INSTALLNEWFONT "Instalare font nou..." IDS_DEFAULT_CLUSTER_SIZE "Mărime de alocare implicită" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END #pragma code_page(default) diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index d1c3b42f31b..daf4f2ce16b 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -750,4 +750,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Âûäåëÿåìûé ïî óìîë÷àíèþ ðàçìåð" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 24867f74690..897564b799a 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -757,4 +757,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Predvolená alokaèná ve¾kos" //Default allocation size IDS_COPY_OF "Kópia" //Copy of + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 3d33693efcd..9789ec3841c 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "Noben Okenski program ni nastavljen, da bi odpiral ta tip datotek." END diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index 1bc2f6fa121..4ddd5c36520 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index 0ec3378ff17..633936f625a 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -751,4 +751,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index 620bd261f0b..807a7c9afa3 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -752,4 +752,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Ðîçì³ð êëàñòåðà çà ïðîìîâ÷àííÿì" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index 152903feb42..aa54e3eecb6 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -739,5 +739,7 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index feb21894ceb..fcf7abf9f7b 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -752,6 +752,8 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" + + IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END #pragma code_page(default) From 195355c7fa1c228e8a976f2a0a4608cb99586e7a Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Mon, 12 Apr 2010 19:49:32 +0000 Subject: [PATCH 110/261] [NTOS]: Try moving towards new ABI. Lots of debug spam will be generated by various device node flags in incorrect states, and hacks that had to be made to maintain current functionality. Also document things being done at the wrong place. One small step... svn path=/trunk/; revision=46852 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 153 +++++++++++++++++++++------- 1 file changed, 116 insertions(+), 37 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 439795c603a..9fb57d86d18 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -138,6 +138,114 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, return STATUS_SUCCESS; } +VOID +NTAPI +IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) +{ + IO_STACK_LOCATION Stack; + PDEVICE_NODE DeviceNode; + NTSTATUS Status; + PVOID Dummy; + + /* Get the device node */ + DeviceNode = IopGetDeviceNode(DeviceObject); + + /* Build the I/O stack locaiton */ + RtlZeroMemory(&Stack, sizeof(IO_STACK_LOCATION)); + Stack.MajorFunction = IRP_MJ_PNP; + Stack.MinorFunction = IRP_MN_START_DEVICE; + + /* Check if we didn't already report the resources */ + // if (!DeviceNode->Flags & DNF_RESOURCE_REPORTED) + { + /* Report them */ + if (DeviceNode->Flags & DNF_RESOURCE_REPORTED) + { + DPRINT1("Warning: Setting resource pointers even though DNF_RESOURCE_REPORTED is set\n"); + } + Stack.Parameters.StartDevice.AllocatedResources = + DeviceNode->ResourceList; + Stack.Parameters.StartDevice.AllocatedResourcesTranslated = + DeviceNode->ResourceListTranslated; + } + + /* I don't think we set this flag yet */ + ASSERT(!(DeviceNode->Flags & DNF_STOPPED)); + + /* Do the call */ + Status = IopSynchronousCall(DeviceObject, &Stack, &Dummy); + if (!NT_SUCCESS(Status)) + { + /* FIXME: TODO */ + DPRINT1("Warning: PnP Start failed\n"); + //ASSERT(FALSE); + return; + } + + /* Otherwise, mark us as started */ + DeviceNode->Flags |= DNF_STARTED; + + /* We now need enumeration */ + DeviceNode->Flags |= DNF_NEED_ENUMERATION_ONLY; +} + +NTSTATUS +NTAPI +IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode) +{ + PDEVICE_OBJECT DeviceObject; + NTSTATUS Status; + PAGED_CODE(); + + /* Sanity check */ + // ASSERT((DeviceNode->Flags & DNF_ADDED)); + if (!(DeviceNode->Flags & DNF_ADDED)) DPRINT1("Warning: Starting a device node without DNF_ADDED\n"); + ASSERT((DeviceNode->Flags & (DNF_RESOURCE_ASSIGNED | + DNF_RESOURCE_REPORTED | + DNF_NO_RESOURCE_REQUIRED | + DNF_NO_RESOURCE_REQUIRED))); + ASSERT((!(DeviceNode->Flags & (DNF_HAS_PROBLEM | + DNF_STARTED | + DNF_START_REQUEST_PENDING)))); + + /* Get the device object */ + DeviceObject = DeviceNode->PhysicalDeviceObject; + + /* Check if we're not started yet */ + //if (!DeviceNode->Flags & DNF_STARTED) + { + /* Start us */ + IopStartDevice2(DeviceObject); + } + + /* Do we need to query IDs? This happens in the case of manual reporting */ + //if (DeviceNode->Flags & DNF_NEED_QUERY_IDS) + //{ + // DPRINT1("Warning: Device node has DNF_NEED_QUERY_IDS\n"); + /* And that case shouldn't happen yet */ + // ASSERT(FALSE); + //} + + /* Make sure we're started, and check if we need enumeration */ + if ((DeviceNode->Flags & DNF_STARTED) && + (DeviceNode->Flags & DNF_NEED_ENUMERATION_ONLY)) + { + /* Enumerate us */ + //Status = IopEnumerateDevice(DeviceObject); + IoSynchronousInvalidateDeviceRelations(DeviceObject, BusRelations); + IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); + Status = STATUS_SUCCESS; + } + else + { + /* Nothing to do */ + Status = STATUS_SUCCESS; + } + + /* Return */ + return Status; +} + NTSTATUS IopStartDevice( PDEVICE_NODE DeviceNode) @@ -195,47 +303,16 @@ IopStartDevice( if (!NT_SUCCESS(Status)) goto ByeBye; - DPRINT("Sending IRP_MN_START_DEVICE to driver\n"); - Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->ResourceList; - Stack.Parameters.StartDevice.AllocatedResourcesTranslated = DeviceNode->ResourceListTranslated; - - /* - * Windows NT Drivers receive IRP_MN_START_DEVICE in a critical region and - * actually _depend_ on this!. This is because NT will lock the Device Node - * with an ERESOURCE, which of course requires APCs to be disabled. - */ - KeEnterCriticalRegion(); - - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_START_DEVICE, - &Stack); - - KeLeaveCriticalRegion(); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("IRP_MN_START_DEVICE failed for %wZ\n", &DeviceNode->InstancePath); - IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); - goto ByeBye; - } - else - { - if (IopDeviceNodeHasFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY)) - { - DPRINT("Device needs enumeration, invalidating bus relations\n"); - /* Invalidate device relations synchronously - (otherwise there will be dirty read of DeviceNode) */ - IopEnumerateDevice(DeviceNode->PhysicalDeviceObject); - IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); - } - } + /* New PnP ABI */ + IopStartAndEnumerateDevice(DeviceNode); + /* FIX: Should be done in new device instance code */ Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceHandle); if (!NT_SUCCESS(Status)) goto ByeBye; + /* FIX: Should be done in IoXxxPrepareDriverLoading */ + // { RtlInitUnicodeString(&KeyName, L"Control"); InitializeObjectAttributes(&ObjectAttributes, &KeyName, @@ -248,7 +325,9 @@ IopStartDevice( RtlInitUnicodeString(&KeyName, L"ActiveService"); Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_SZ, DeviceNode->ServiceName.Buffer, DeviceNode->ServiceName.Length); - + // } + + /* FIX: Should be done somewhere in resoure code? */ if (NT_SUCCESS(Status) && DeviceNode->ResourceList) { RtlInitUnicodeString(&KeyName, L"AllocConfig"); From 79fef6c915a259e36dbb1a42026934812d6d81fd Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 12 Apr 2010 20:13:39 +0000 Subject: [PATCH 111/261] [USERENV] Revert r43057: setting environment variables per process is not useful here, a higher authority has to do this globally See issue #4008 for more details. svn path=/trunk/; revision=46853 --- reactos/dll/win32/userenv/setup.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/reactos/dll/win32/userenv/setup.c b/reactos/dll/win32/userenv/setup.c index 796325c7b0c..ca422dd5e9f 100644 --- a/reactos/dll/win32/userenv/setup.c +++ b/reactos/dll/win32/userenv/setup.c @@ -674,10 +674,6 @@ InitializeProfiles(VOID) } } - SetEnvironmentVariableW(L"ProgramFiles", szProfilesPath); - SetEnvironmentVariableW(L"CommonProgramFiles", szCommonFilesDirPath); - - DPRINT("Success\n"); return TRUE; From 31515fdd20fd0b67a4b7989d0b7f6e497e497eaa Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 12 Apr 2010 20:45:38 +0000 Subject: [PATCH 112/261] [RTL] Revert s(w)printf changes of r44970 See issue #5125 for more details. svn path=/trunk/; revision=46855 --- reactos/lib/rtl/sprintf.c | 60 +++++++++++++++++++++++--------------- reactos/lib/rtl/swprintf.c | 58 +++++++++++++++++++++--------------- 2 files changed, 71 insertions(+), 47 deletions(-) diff --git a/reactos/lib/rtl/sprintf.c b/reactos/lib/rtl/sprintf.c index 42aca6c3511..52f46f8a3d3 100644 --- a/reactos/lib/rtl/sprintf.c +++ b/reactos/lib/rtl/sprintf.c @@ -27,33 +27,40 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #define REMOVEHEX 256 /* use 256 as remve 0x frim BASE 16 */ -typedef union { - struct { - unsigned int mantissal:32; - unsigned int mantissah:20; - unsigned int exponent:11; - unsigned int sign:1; - }; - long long AsLongLong; +typedef struct { + unsigned int mantissal:32; + unsigned int mantissah:20; + unsigned int exponent:11; + unsigned int sign:1; } double_t; -/* We depend on this being true */ -C_ASSERT(sizeof(double_t) == sizeof(double)); - static __inline int -_isinf(double_t x) +_isinf(double __x) { - return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0 )); + union + { + double* __x; + double_t* x; + } x; + + x.__x = &__x; + return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 && x.x->mantissal == 0 )); } static __inline int -_isnan(double_t x) +_isnan(double __x) { - return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 )); + union + { + double* __x; + double_t* x; + } x; + x.__x = &__x; + return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); } @@ -173,13 +180,14 @@ number(char * buf, char * end, long long num, int base, int size, int precision, } static char * -numberf(char * buf, char * end, double_t num, int base, int size, int precision, int type) +numberf(char * buf, char * end, double num, int base, int size, int precision, int type) { char c,sign,tmp[66]; const char *digits; const char *small_digits = "0123456789abcdefghijklmnopqrstuvwxyz"; const char *large_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; + long long x; /* FIXME the float version of number is direcly copy of number @@ -193,9 +201,9 @@ numberf(char * buf, char * end, double_t num, int base, int size, int precision, c = (type & ZEROPAD) ? '0' : ' '; sign = 0; if (type & SIGN) { - if (num.sign) { + if (num < 0) { sign = '-'; - num.sign = 0; + num = -num; size--; } else if (type & PLUS) { sign = '+'; @@ -212,11 +220,15 @@ numberf(char * buf, char * end, double_t num, int base, int size, int precision, size--; } i = 0; - if (num.AsLongLong == 0) + if (num == 0) tmp[i++] = '0'; - else while (num.AsLongLong != 0) + else while (num != 0) { - tmp[i++] = digits[do_div(&num.AsLongLong,base)]; + x = num; + tmp[i++] = digits[do_div(&x,base)]; +#ifndef _M_ARM // Missing __floatdidf in CeGCC 0.55 -- GCC 4.4 + num=x; +#endif } if (i > precision) precision = i; @@ -377,7 +389,7 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) { int len; unsigned long long num; - double_t _double; + double _double; int base; char *str, *end; @@ -591,7 +603,7 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) case 'f': case 'g': case 'G': - _double = va_arg(args, double_t); + _double = (double)va_arg(args, double); if ( _isnan(_double) ) { s = "Nan"; len = 3; @@ -622,7 +634,7 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) } else { if ( precision == -1 ) precision = 6; - str = numberf(str, end, _double, base, field_width, precision, flags); + str = numberf(str, end, (int)_double, base, field_width, precision, flags); } continue; diff --git a/reactos/lib/rtl/swprintf.c b/reactos/lib/rtl/swprintf.c index 3d6488b92b6..64d7d65397a 100644 --- a/reactos/lib/rtl/swprintf.c +++ b/reactos/lib/rtl/swprintf.c @@ -27,33 +27,40 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #define REMOVEHEX 256 /* use 256 as remve 0x frim BASE 16 */ -typedef union { - struct { - unsigned int mantissal:32; - unsigned int mantissah:20; - unsigned int exponent:11; - unsigned int sign:1; - }; - long long AsLongLong; +typedef struct { + unsigned int mantissal:32; + unsigned int mantissah:20; + unsigned int exponent:11; + unsigned int sign:1; } double_t; -/* We depend on this being true */ -C_ASSERT(sizeof(double_t) == sizeof(double)); - static __inline int -_isinf(double_t x) +_isinf(double __x) { - return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0 )); + union + { + double* __x; + double_t* x; + } x; + + x.__x = &__x; + return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 && x.x->mantissal == 0 )); } static __inline int -_isnan(double_t x) +_isnan(double __x) { - return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 )); + union + { + double* __x; + double_t* x; + } x; + x.__x = &__x; + return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); } @@ -172,13 +179,14 @@ number(wchar_t * buf, wchar_t * end, long long num, int base, int size, int prec } static wchar_t * -numberf(wchar_t * buf, wchar_t * end, double_t num, int base, int size, int precision, int type) +numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precision, int type) { wchar_t c, sign, tmp[66]; const wchar_t *digits; const wchar_t *small_digits = L"0123456789abcdefghijklmnopqrstuvwxyz"; const wchar_t *large_digits = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; + long long x; /* FIXME the float version of number is direcly copy of number @@ -193,9 +201,9 @@ numberf(wchar_t * buf, wchar_t * end, double_t num, int base, int size, int prec c = (type & ZEROPAD) ? L'0' : L' '; sign = 0; if (type & SIGN) { - if (num.sign) { + if (num < 0) { sign = L'-'; - num.sign = 0; + num = -num; size--; } else if (type & PLUS) { sign = L'+'; @@ -212,11 +220,15 @@ numberf(wchar_t * buf, wchar_t * end, double_t num, int base, int size, int prec size--; } i = 0; - if (num.AsLongLong == 0) + if (num == 0) tmp[i++] = L'0'; - else while (num.AsLongLong != 0) + else while (num != 0) { - tmp[i++] = digits[do_div(&num.AsLongLong,base)]; + x = num; + tmp[i++] = digits[do_div(&x,base)]; +#ifndef _M_ARM // Missing __floatdidf in CeGCC 0.55 -- GCC 4.4 + num = x; +#endif } if (i > precision) precision = i; @@ -382,7 +394,7 @@ int __cdecl _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list ar const char *s; const wchar_t *sw; const wchar_t *ss; - double_t _double; + double _double; int flags; /* flags to number() */ @@ -588,7 +600,7 @@ int __cdecl _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list ar case 'f': case 'g': case 'G': - _double = va_arg(args, double_t); + _double = (double)va_arg(args, double); if ( _isnan(_double) ) { ss = L"Nan"; From de40f8d7d76e7ae9c96d5159065dbf488b79f296 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Apr 2010 22:28:22 +0000 Subject: [PATCH 113/261] [FREELDR] - Don't prefix amd64 symbol names with underscores - Cleanup unused amd64 functions - Fix amd64 GDT entries - Fix amd64 APIC_BASE svn path=/trunk/; revision=46856 --- .../boot/freeldr/freeldr/arch/amd64/arch.S | 76 +++--- .../boot/freeldr/freeldr/arch/amd64/boot.S | 6 +- .../boot/freeldr/freeldr/arch/amd64/drvmap.S | 8 +- .../boot/freeldr/freeldr/arch/amd64/i386cpu.S | 6 +- .../boot/freeldr/freeldr/arch/amd64/i386pnp.S | 6 +- .../freeldr/freeldr/arch/amd64/i386trap.S | 4 +- .../boot/freeldr/freeldr/arch/amd64/int386.S | 2 +- .../boot/freeldr/freeldr/arch/amd64/loader.c | 246 +----------------- reactos/boot/freeldr/freeldr/arch/amd64/mb.S | 24 +- .../freeldr/include/arch/amd64/amd64.h | 2 +- .../freeldr/freeldr/windows/amd64/wlmemory.c | 39 +-- 11 files changed, 89 insertions(+), 330 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/arch.S b/reactos/boot/freeldr/freeldr/arch/amd64/arch.S index 0f6c257e34a..9def109221c 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/arch.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/arch.S @@ -21,22 +21,22 @@ RealEntryPoint: mov ss, ax /* checkPoint Charlie - where it all began... */ - mov si, offset _CheckPoint0 + mov si, offset CheckPoint0 call writestr - + /* Setup a real mode stack */ mov sp, stack16 /* Zero BootDrive and BootPartition */ xor eax, eax - mov _BootDrive, eax - mov _BootPartition, eax + mov BootDrive, eax + mov BootPartition, eax /* Store the boot drive */ - mov _BootDrive, dl + mov BootDrive, dl /* Store the boot partition */ - mov _BootPartition, dh + mov BootPartition, dh /* Load the GDT */ lgdt gdtptr @@ -46,13 +46,13 @@ RealEntryPoint: call x86_16_EnableA20 /* checkPoint Charlie - where it all began... */ - mov si, offset _CheckPoint1 + mov si, offset CheckPoint1 call writestr call x86_16_BuildPageTables /* checkPoint Charlie - where it all began... */ - mov si, offset _CheckPoint2 + mov si, offset CheckPoint2 call writestr /* Check if CPU supports CPUID */ @@ -89,26 +89,26 @@ RealEntryPoint: /* X64 Processor */ /* checkPoint Charlie - where it all began... */ - mov si, offset _CheckPoint3 + mov si, offset CheckPoint3 call writestr - jmp _switch64 + jmp switch64 NO_X64_SUPPORT_DETECTED: - mov si, offset _NotAnX64Processor // Loading message + mov si, offset NotAnX64Processor // Loading message call writestr - jmp _fail + jmp fail NO_CPUID_SUPPORT_DETECTED: - mov si, offset _NoCPUIDSupport // Loading message - call writestr + mov si, offset NoCPUIDSupport // Loading message + call writestr -_fail: - jmp _fail +fail: + jmp fail nop nop -_switch64: +switch64: call x86_16_SwitchToLong .code64 @@ -119,7 +119,7 @@ _switch64: /* GO! */ xor rcx, rcx - call _BootMain + call BootMain /* Checkpoint */ // mov ax, LMODE_DS @@ -174,14 +174,14 @@ x86_16_BuildPageTables: push es /* Get segment of pml4 */ - mov eax, offset _pml4_startup + mov eax, offset pml4_startup shr eax, 4 mov es, ax cld xor di, di /* One entry in the PML4 pointing to PDP */ - mov eax, offset _pdp_startup + mov eax, offset pdp_startup or eax, 0x00f stosd /* clear rest */ @@ -190,7 +190,7 @@ x86_16_BuildPageTables: rep stosd /* One entry in the PDP pointing to PD */ - mov eax, offset _pd_startup + mov eax, offset pd_startup or eax, 0x00f stosd /* clear rest */ @@ -268,7 +268,7 @@ x86_16_SwitchToLong: mov eax, 0x00a0 // Set PAE and PGE: 10100000b mov cr4, eax - mov edx, offset _pml4_startup // Point cr3 at PML4 + mov edx, offset pml4_startup // Point cr3 at PML4 mov cr3, edx mov ecx, 0xC0000080 // Specify EFER MSR @@ -405,42 +405,42 @@ gdtptr: .long gdt /* Base Address */ -.global _BootDrive -_BootDrive: +.global BootDrive +BootDrive: .long 0 -.global _BootPartition -_BootPartition: +.global BootPartition +BootPartition: .long 0 -.global _NotAnX64Processor -_NotAnX64Processor: +.global NotAnX64Processor +NotAnX64Processor: .ascii "FreeLoader: No x64-compatible CPU detected! Exiting..." .byte 0x0d, 0x0a, 0 -.global _NoCPUIDSupport -_NoCPUIDSupport: +.global NoCPUIDSupport +NoCPUIDSupport: .ascii "FreeLoader: No CPUID instruction support detected! Exiting..." .byte 0x0d, 0x0a, 0 /////////////////////////// Checkpoint messages /////////////////////////////// -.global _CheckPoint0 -_CheckPoint0: +.global CheckPoint0 +CheckPoint0: .ascii "Starting FreeLoader..." .byte 0x0d, 0x0a, 0 -.global _CheckPoint1 -_CheckPoint1: +.global CheckPoint1 +CheckPoint1: .ascii "FreeLoader[16-bit]: building page tables..." .byte 0x0d, 0x0a, 0 -.global _CheckPoint2 -_CheckPoint2: +.global CheckPoint2 +CheckPoint2: .ascii "FreeLoader[16-bit]: checking CPU for x64 long mode..." .byte 0x0d, 0x0a, 0 -.global _CheckPoint3 -_CheckPoint3: +.global CheckPoint3 +CheckPoint3: .ascii "FreeLoader: Switching to x64 long mode..." .byte 0x0d, 0x0a, 0 diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/boot.S b/reactos/boot/freeldr/freeldr/arch/amd64/boot.S index ce7bb355c90..eb3ba3c3c64 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/boot.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/boot.S @@ -24,14 +24,14 @@ #include -EXTERN(_ChainLoadBiosBootSectorCode) +EXTERN(ChainLoadBiosBootSectorCode) .code64 call x86_64_SwitchToReal .code16 /* Set the boot drive */ - mov dl, _BootDrive + mov dl, BootDrive /* Load segment registers */ cli @@ -46,7 +46,7 @@ EXTERN(_ChainLoadBiosBootSectorCode) // ljmpl $0x0000,$0x7C00 jmp 0x7c00:0x0000 -EXTERN(_SoftReboot) +EXTERN(SoftReboot) .code64 call x86_64_SwitchToReal diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S b/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S index d6b081ca60b..6871fe0f62d 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/drvmap.S @@ -24,7 +24,7 @@ #include -EXTERN(_DriveMapInt13HandlerStart) +EXTERN(DriveMapInt13HandlerStart) Int13Handler: pushw %bp @@ -82,7 +82,7 @@ CallOldInt13Handler: /* Call old int 13h handler with new drive number */ .byte 0x9a /* lcall */ -EXTERN(_DriveMapOldInt13HandlerAddress) +EXTERN(DriveMapOldInt13HandlerAddress) .word 0 .word 0 @@ -105,7 +105,7 @@ CallersFlags: PassedInDriveNumber: .byte 0 -EXTERN(_DriveMapInt13HandlerMapList) +EXTERN(DriveMapInt13HandlerMapList) Int13HandlerMapCount: .byte 0 @@ -129,4 +129,4 @@ Int13HandlerDrive4: Int13HandlerDriveNew4: .byte 0 -EXTERN(_DriveMapInt13HandlerEnd) +EXTERN(DriveMapInt13HandlerEnd) diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S index 6dfb91dbf4a..ee3ee6fe256 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/i386cpu.S @@ -33,7 +33,7 @@ * 0x00000400: Found 80486 CPU without CPUID support */ -EXTERN(_CpuidSupported) +EXTERN(CpuidSupported) .code32 pushl %ecx /* save ECX */ @@ -80,7 +80,7 @@ NoCpuid: * VOID GetCpuid(U32 Level, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx); */ -EXTERN(_GetCpuid) +EXTERN(GetCpuid) .code32 pushl %ebp @@ -123,7 +123,7 @@ EXTERN(_GetCpuid) * U64 RDTSC(VOID); */ -EXTERN(_RDTSC) +EXTERN(RDTSC) .code32 rdtsc ret diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S index ff0ae71eb1a..19589275bac 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/i386pnp.S @@ -35,7 +35,7 @@ _pnp_bios_entry_point: _pnp_bios_data_segment: .word 0 -EXTERN(_PnpBiosSupported) +EXTERN(PnpBiosSupported) .code64 push rdi @@ -113,7 +113,7 @@ _pnp_node_size: _pnp_node_count: .word 0 -EXTERN(_PnpBiosGetDeviceNodeCount) +EXTERN(PnpBiosGetDeviceNodeCount) .code64 push rbp @@ -182,7 +182,7 @@ _pnp_buffer_offset: _pnp_node_number: .byte 0 -EXTERN(_PnpBiosGetDeviceNode) +EXTERN(PnpBiosGetDeviceNode) .code64 push rbp diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S b/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S index 833fcc37104..195bf097cd0 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/i386trap.S @@ -273,7 +273,7 @@ i386CommonExceptionHandler: SAVE_CPU_REGS pushl $SCREEN_ATTR - call _MachVideoClearScreen + call MachVideoClearScreen add $4,%esp movl $i386ExceptionHandlerText,%esi @@ -485,7 +485,7 @@ i386PrintChar: pushl $SCREEN_ATTR andl $0xff,%eax pushl %eax - call _MachVideoPutChar + call MachVideoPutChar addl $16,%esp ret diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/int386.S b/reactos/boot/freeldr/freeldr/arch/amd64/int386.S index 1c1f2dbdf0a..a22e409c61c 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/int386.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/int386.S @@ -63,7 +63,7 @@ Int386_regsout: /* * int Int386(int ivec, REGS* in, REGS* out); */ -EXTERN(_Int386) +EXTERN(Int386) .code64 /* Get the function parameters */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/loader.c b/reactos/boot/freeldr/freeldr/arch/amd64/loader.c index 9ca6f858644..cad77bf48d6 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/amd64/loader.c @@ -39,33 +39,6 @@ EnableA20() /* Already done */ } -void -DumpLoaderBlock() -{ - DbgPrint("LoaderBlock @ %p.\n", &LoaderBlock); - DbgPrint("Flags = 0x%x.\n", LoaderBlock.Flags); - DbgPrint("MemLower = 0x%p.\n", (PVOID)LoaderBlock.MemLower); - DbgPrint("MemHigher = 0x%p.\n", (PVOID)LoaderBlock.MemHigher); - DbgPrint("BootDevice = 0x%x.\n", LoaderBlock.BootDevice); - DbgPrint("CommandLine = %s.\n", LoaderBlock.CommandLine); - DbgPrint("ModsCount = 0x%x.\n", LoaderBlock.ModsCount); - DbgPrint("ModsAddr = 0x%p.\n", LoaderBlock.ModsAddr); - DbgPrint("Syms = 0x%s.\n", LoaderBlock.Syms); - DbgPrint("MmapLength = 0x%x.\n", LoaderBlock.MmapLength); - DbgPrint("MmapAddr = 0x%p.\n", (PVOID)LoaderBlock.MmapAddr); - DbgPrint("RdLength = 0x%x.\n", LoaderBlock.RdLength); - DbgPrint("RdAddr = 0x%p.\n", (PVOID)LoaderBlock.RdAddr); - DbgPrint("DrivesCount = 0x%x.\n", LoaderBlock.DrivesCount); - DbgPrint("DrivesAddr = 0x%p.\n", (PVOID)LoaderBlock.DrivesAddr); - DbgPrint("ConfigTable = 0x%x.\n", LoaderBlock.ConfigTable); - DbgPrint("BootLoaderName = 0x%x.\n", LoaderBlock.BootLoaderName); - DbgPrint("PageDirectoryStart = 0x%p.\n", (PVOID)LoaderBlock.PageDirectoryStart); - DbgPrint("PageDirectoryEnd = 0x%p.\n", (PVOID)LoaderBlock.PageDirectoryEnd); - DbgPrint("KernelBase = 0x%p.\n", (PVOID)LoaderBlock.KernelBase); - DbgPrint("ArchExtra = 0x%p.\n", (PVOID)LoaderBlock.ArchExtra); - -} - /*++ * FrLdrStartup * INTERNAL @@ -86,222 +59,7 @@ VOID NTAPI FrLdrStartup(ULONG Magic) { - /* Disable Interrupts */ - _disable(); - - /* Re-initalize EFLAGS */ - __writeeflags(0); - - /* Initialize the page directory */ - FrLdrSetupPageDirectory(); - - /* Set the new PML4 */ - __writecr3((ULONGLONG)pPML4); - - FrLdrSetupGdtIdt(); - - LoaderBlock.FrLdrDbgPrint = DbgPrint; - -// DumpLoaderBlock(); - - DbgPrint("Jumping to kernel @ %p.\n", KernelEntryPoint); - - /* Jump to Kernel */ - (*KernelEntryPoint)(Magic, &LoaderBlock); - + DbgPrint("ReactOS loader is unsupported! Halting.\n", KernelEntryPoint); + for(;;); } -PPAGE_DIRECTORY_AMD64 -FrLdrGetOrCreatePageDir(PPAGE_DIRECTORY_AMD64 pDir, ULONG Index) -{ - PPAGE_DIRECTORY_AMD64 pSubDir; - - if (!pDir) - return NULL; - - if (!pDir->Pde[Index].Valid) - { - pSubDir = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); - if (!pSubDir) - return NULL; - RtlZeroMemory(pSubDir, PAGE_SIZE); - pDir->Pde[Index].PageFrameNumber = PtrToPfn(pSubDir); - pDir->Pde[Index].Valid = 1; - pDir->Pde[Index].Write = 1; - } - else - { - pSubDir = (PPAGE_DIRECTORY_AMD64)((ULONGLONG)(pDir->Pde[Index].PageFrameNumber) * PAGE_SIZE); - } - return pSubDir; -} - -BOOLEAN -FrLdrMapSinglePage(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress) -{ - PPAGE_DIRECTORY_AMD64 pDir3, pDir2, pDir1; - ULONG Index; - - pDir3 = FrLdrGetOrCreatePageDir(pPML4, VAtoPXI(VirtualAddress)); - pDir2 = FrLdrGetOrCreatePageDir(pDir3, VAtoPPI(VirtualAddress)); - pDir1 = FrLdrGetOrCreatePageDir(pDir2, VAtoPDI(VirtualAddress)); - - if (!pDir1) - return FALSE; - - Index = VAtoPTI(VirtualAddress); - if (pDir1->Pde[Index].Valid) - { - return FALSE; - } - - pDir1->Pde[Index].Valid = 1; - pDir1->Pde[Index].Write = 1; - pDir1->Pde[Index].PageFrameNumber = PhysicalAddress / PAGE_SIZE; - - return TRUE; -} - -ULONG -FrLdrMapRangeOfPages(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress, ULONG cPages) -{ - ULONG i; - - for (i = 0; i < cPages; i++) - { - if (!FrLdrMapSinglePage(VirtualAddress, PhysicalAddress)) - { - return i; - } - VirtualAddress += PAGE_SIZE; - PhysicalAddress += PAGE_SIZE; - } - return i; -} - - -/*++ - * FrLdrSetupPageDirectory - * INTERNAL - * - * Sets up the ReactOS Startup Page Directory. - * - * Params: - * None. - * - * Returns: - * None. - *--*/ -VOID -FASTCALL -FrLdrSetupPageDirectory(VOID) -{ - ULONG KernelPages; - PVOID UserSharedData; - - /* Allocate a Page for the PML4 */ - pPML4 = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); - - ASSERT(pPML4); - - /* The page tables are located at 0xfffff68000000000 - * We create a recursive self mapping through all 4 levels at - * virtual address 0xfffff6fb7dbedf68 */ - pPML4->Pde[VAtoPXI(PXE_BASE)].Valid = 1; - pPML4->Pde[VAtoPXI(PXE_BASE)].Write = 1; - pPML4->Pde[VAtoPXI(PXE_BASE)].PageFrameNumber = PtrToPfn(pPML4); - - /* Setup low memory pages */ - if (FrLdrMapRangeOfPages(0, 0, 1024) < 1024) - { - DbgPrint("Could not map low memory pages.\n"); - } - - /* Setup kernel pages */ - KernelPages = (ROUND_TO_PAGES(NextModuleBase - KERNEL_BASE_PHYS) / PAGE_SIZE); - if (FrLdrMapRangeOfPages(KernelBase, KERNEL_BASE_PHYS, KernelPages) != KernelPages) - { - DbgPrint("Could not map %d kernel pages.\n", KernelPages); - } - - /* Setup a page for the idt */ - pIdt = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); - IdtBase = KernelBase + KernelPages * PAGE_SIZE; - if (!FrLdrMapSinglePage(IdtBase, (ULONGLONG)pIdt)) - { - DbgPrint("Could not map idt page.\n", KernelPages); - } - - /* Setup a page for the gdt & tss */ - pGdt = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); - GdtBase = IdtBase + PAGE_SIZE; - TssBase = GdtBase + 20 * sizeof(ULONG64); // FIXME: don't hardcode - if (!FrLdrMapSinglePage(GdtBase, (ULONGLONG)pGdt)) - { - DbgPrint("Could not map gdt page.\n", KernelPages); - } - - /* Setup KUSER_SHARED_DATA page */ - UserSharedData = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); - if (!FrLdrMapSinglePage(KI_USER_SHARED_DATA, (ULONG64)UserSharedData)) - { - DbgPrint("Could not map KUSER_SHARED_DATA page.\n", KernelPages); - } - - /* Map APIC page */ - if (!FrLdrMapSinglePage(APIC_BASE, APIC_PHYS_BASE)) - { - DbgPrint("Could not map APIC page.\n"); - } - -} - -VOID -FrLdrSetupGdtIdt() -{ - PKGDTENTRY64 Entry; - KDESCRIPTOR Desc; - - RtlZeroMemory(pGdt, PAGE_SIZE); - - /* Setup KGDT_64_R0_CODE */ - Entry = KiGetGdtEntry(pGdt, KGDT_64_R0_CODE); - *(PULONG64)Entry = 0x00209b0000000000ULL; - - /* Setup KGDT_64_R0_SS */ - Entry = KiGetGdtEntry(pGdt, KGDT_64_R0_SS); - *(PULONG64)Entry = 0x00cf93000000ffffULL; - - /* Setup KGDT_64_DATA */ - Entry = KiGetGdtEntry(pGdt, KGDT_64_DATA); - *(PULONG64)Entry = 0x00cff3000000ffffULL; - - /* Setup KGDT_64_R3_CODE */ - Entry = KiGetGdtEntry(pGdt, KGDT_64_R3_CODE); - *(PULONG64)Entry = 0x0020fb0000000000ULL; - - /* Setup KGDT_32_R3_TEB */ - Entry = KiGetGdtEntry(pGdt, KGDT_32_R3_TEB); - *(PULONG64)Entry = 0xff40f3fd50003c00ULL; - - /* Setup TSS entry */ - Entry = KiGetGdtEntry(pGdt, KGDT_TSS); - KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0); - - /* Setup the gdt descriptor */ - Desc.Limit = 12 * sizeof(ULONG64) - 1; - Desc.Base = (PVOID)GdtBase; - - /* Set the new Gdt */ - __lgdt(&Desc.Limit); - DbgPrint("Gdtr.Base = %p\n", Desc.Base); - - /* Setup the idt descriptor */ - Desc.Limit = 12 * sizeof(ULONG64) - 1; - Desc.Base = (PVOID)IdtBase; - - /* Set the new Idt */ - __lidt(&Desc.Limit); - DbgPrint("Idtr.Base = %p\n", Desc.Base); - -} diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/mb.S b/reactos/boot/freeldr/freeldr/arch/amd64/mb.S index 368338ed33b..2d515e90053 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/mb.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/mb.S @@ -29,35 +29,35 @@ * This boots the kernel */ .code64 - .globl _PageDirectoryStart + .globl PageDirectoryStart - .globl _pml4_startup - .globl _pdp_startup - .globl _pd_startup + .globl pml4_startup + .globl pdp_startup + .globl pd_startup - .globl _PageDirectoryEnd + .globl PageDirectoryEnd // // Boot information structure // -EXTERN(_reactos_memory_map_descriptor_size) +EXTERN(reactos_memory_map_descriptor_size) .long 0 -EXTERN(_reactos_memory_map) +EXTERN(reactos_memory_map) .rept (32 * /*sizeof(memory_map_t)*/24) .byte 0 .endr .bss -_PageDirectoryStart: -_pml4_startup: +PageDirectoryStart: +pml4_startup: .fill 4096, 1, 0 -_pdp_startup: +pdp_startup: .fill 4096, 1, 0 -_pd_startup: +pd_startup: .fill 4096, 1, 0 -_PageDirectoryEnd: +PageDirectoryEnd: diff --git a/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h b/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h index af46178d9db..9068e00f90a 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h +++ b/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h @@ -45,7 +45,7 @@ #define HYPERSPACE_BASE 0xfffff70000000000ULL #define HAL_BASE 0xffffffff80000000ULL -#define APIC_BASE 0xfffffffffee00000ULL // FIXME +#define APIC_BASE 0xFFFFFFFFFFFE0000ULL #define APIC_PHYS_BASE 0xfee00000 diff --git a/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c index 3e3288a682a..5f979c4ca7b 100644 --- a/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c @@ -252,28 +252,36 @@ WinLdrSetupGdt(PVOID GdtBase, ULONG64 TssBase) PKGDTENTRY64 Entry; KDESCRIPTOR GdtDesc; - /* Setup KGDT_64_R0_CODE */ - Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_CODE); + /* Setup KGDT64_NULL */ + Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL); + *(PULONG64)Entry = 0x0000000000000000ULL; + + /* Setup KGDT64_R0_CODE */ + Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_CODE); *(PULONG64)Entry = 0x00209b0000000000ULL; - /* Setup KGDT_64_R0_SS */ - Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_SS); + /* Setup KGDT64_R0_DATA */ + Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_DATA); *(PULONG64)Entry = 0x00cf93000000ffffULL; - /* Setup KGDT_64_DATA */ - Entry = KiGetGdtEntry(GdtBase, KGDT_64_DATA); + /* Setup KGDT64_R3_CMCODE */ + Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMCODE); + *(PULONG64)Entry = 0x00cffb000000ffffULL; + + /* Setup KGDT64_R3_DATA */ + Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_DATA); *(PULONG64)Entry = 0x00cff3000000ffffULL; - /* Setup KGDT_64_R3_CODE */ - Entry = KiGetGdtEntry(GdtBase, KGDT_64_R3_CODE); + /* Setup KGDT64_R3_CODE */ + Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CODE); *(PULONG64)Entry = 0x0020fb0000000000ULL; - /* Setup KGDT_32_R3_TEB */ - Entry = KiGetGdtEntry(GdtBase, KGDT_32_R3_TEB); + /* Setup KGDT64_R3_CMTEB */ + Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMTEB); *(PULONG64)Entry = 0xff40f3fd50003c00ULL; /* Setup TSS entry */ - Entry = KiGetGdtEntry(GdtBase, KGDT_TSS); + Entry = KiGetGdtEntry(GdtBase, KGDT64_SYS_TSS); KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0); /* Setup GDT descriptor */ @@ -333,15 +341,8 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG64 Pcr, IN ULONG64 Tss) /* LDT is unused */ // __lldt(0); - /* Load selectors for DS/ES/FS/GS/SS */ - Ke386SetDs(KGDT_64_DATA | RPL_MASK); // 0x2b - Ke386SetEs(KGDT_64_DATA | RPL_MASK); // 0x2b - Ke386SetFs(KGDT_32_R3_TEB | RPL_MASK); // 0x53 - Ke386SetGs(KGDT_64_DATA | RPL_MASK); // 0x2b - Ke386SetSs(KGDT_64_R0_SS); // 0x18 - /* Load TSR */ - __ltr(KGDT_TSS); + __ltr(KGDT64_SYS_TSS); DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n"); } From e24364da67dfc58f812949019f9412114691aa14 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Apr 2010 22:31:42 +0000 Subject: [PATCH 114/261] [NDK] - Fix KGDT64 selector names svn path=/trunk/; revision=46857 --- reactos/include/ndk/amd64/ketypes.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/reactos/include/ndk/amd64/ketypes.h b/reactos/include/ndk/amd64/ketypes.h index b57242055d4..8e4d4215514 100644 --- a/reactos/include/ndk/amd64/ketypes.h +++ b/reactos/include/ndk/amd64/ketypes.h @@ -58,12 +58,14 @@ Author: // #define RPL_MASK 0x0003 #define MODE_MASK 0x0001 -#define KGDT_64_R0_CODE 0x0010 -#define KGDT_64_R0_SS 0x0018 -#define KGDT_64_DATA 0x0028 // 2b -#define KGDT_64_R3_CODE 0x0030 // 33 -#define KGDT_TSS 0x0040 -#define KGDT_32_R3_TEB 0x0050 // 53 +#define KGDT64_NULL 0x0000 +#define KGDT64_R0_CODE 0x0010 +#define KGDT64_R0_DATA 0x0018 +#define KGDT64_R3_CMCODE 0x0020 +#define KGDT64_R3_DATA 0x0028 +#define KGDT64_R3_CODE 0x0030 +#define KGDT64_SYS_TSS 0x0040 +#define KGDT64_R3_CMTEB 0x0050 // From f6c641bb39b0fbc2d5a3629733bdd812da36cc84 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 13 Apr 2010 15:19:35 +0000 Subject: [PATCH 115/261] [NTOSKRNL] Add back FASTCALL macro in the pspec file for amd64 builds svn path=/trunk/; revision=46859 --- reactos/ntoskrnl/ntoskrnl.pspec | 175 ++++++++++++++++---------------- 1 file changed, 90 insertions(+), 85 deletions(-) diff --git a/reactos/ntoskrnl/ntoskrnl.pspec b/reactos/ntoskrnl/ntoskrnl.pspec index 5016dbd2b87..12973661b81 100644 --- a/reactos/ntoskrnl/ntoskrnl.pspec +++ b/reactos/ntoskrnl/ntoskrnl.pspec @@ -1,5 +1,10 @@ #include #undef i386 +#ifndef __x86_64__ +#define FASTCALL fastcall +#else +#define FASTCALL stdcall +#endif @ stdcall CcCanIWrite(ptr long long long) @ stdcall CcCopyRead(ptr ptr long long ptr ptr) @@ -57,13 +62,13 @@ @ stdcall DbgQueryDebugFilterState(long long) @ stdcall DbgSetDebugFilterState(long long long) @ stdcall -arch=x86_64 ExAcquireFastMutex(ptr) -@ fastcall ExAcquireFastMutexUnsafe(ptr) +@ FASTCALL ExAcquireFastMutexUnsafe(ptr) @ stdcall ExAcquireResourceExclusiveLite(ptr long) @ stdcall ExAcquireResourceSharedLite(ptr long) -@ fastcall ExAcquireRundownProtection(ptr) ExfAcquireRundownProtection -@ fastcall ExAcquireRundownProtectionCacheAware(ptr) ExfAcquireRundownProtectionCacheAware -@ fastcall ExAcquireRundownProtectionCacheAwareEx(ptr long) ExfAcquireRundownProtectionCacheAwareEx -@ fastcall ExAcquireRundownProtectionEx(ptr long) ExfAcquireRundownProtectionEx +@ FASTCALL ExAcquireRundownProtection(ptr) ExfAcquireRundownProtection +@ FASTCALL ExAcquireRundownProtectionCacheAware(ptr) ExfAcquireRundownProtectionCacheAware +@ FASTCALL ExAcquireRundownProtectionCacheAwareEx(ptr long) ExfAcquireRundownProtectionCacheAwareEx +@ FASTCALL ExAcquireRundownProtectionEx(ptr long) ExfAcquireRundownProtectionEx @ stdcall ExAcquireSharedStarveExclusive(ptr long) @ stdcall ExAcquireSharedWaitForExclusive(ptr long) @ stdcall ExAllocateCacheAwareRundownProtection(long long) @@ -80,7 +85,7 @@ @ stdcall ExDeleteResourceLite(ptr) @ extern ExDesktopObjectType @ stdcall ExDisableResourceBoostLite(ptr) -@ fastcall ExEnterCriticalRegionAndAcquireFastMutexUnsafe(ptr) +@ FASTCALL ExEnterCriticalRegionAndAcquireFastMutexUnsafe(ptr) @ stdcall ExEnterCriticalRegionAndAcquireResourceExclusive(ptr) @ stdcall ExEnterCriticalRegionAndAcquireResourceShared(ptr) @ stdcall ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(ptr) @@ -99,33 +104,33 @@ @ stdcall ExInitializeNPagedLookasideList(ptr ptr ptr long long long long) @ stdcall ExInitializePagedLookasideList(ptr ptr ptr long long long long) @ stdcall ExInitializeResourceLite(ptr) -@ fastcall ExInitializeRundownProtection(ptr) ExfInitializeRundownProtection +@ FASTCALL ExInitializeRundownProtection(ptr) ExfInitializeRundownProtection @ stdcall ExInitializeRundownProtectionCacheAware(ptr long) @ stdcall ExInitializeZone(ptr long ptr long) @ stdcall ExInterlockedAddLargeInteger(ptr long long ptr) #ifndef __x86_64__ -@ fastcall ExInterlockedAddLargeStatistic(ptr long) +@ FASTCALL ExInterlockedAddLargeStatistic(ptr long) #endif @ stdcall ExInterlockedAddUlong(ptr long ptr) #ifndef __x86_64__ -@ fastcall ExInterlockedCompareExchange64(ptr ptr ptr ptr) +@ FASTCALL ExInterlockedCompareExchange64(ptr ptr ptr ptr) @ stdcall ExInterlockedDecrementLong(ptr ptr) @ stdcall ExInterlockedExchangeUlong(ptr long ptr) #endif @ stdcall ExInterlockedExtendZone(ptr ptr long ptr) #ifndef __x86_64__ -@ fastcall ExInterlockedFlushSList(ptr) +@ FASTCALL ExInterlockedFlushSList(ptr) @ stdcall ExInterlockedIncrementLong(ptr ptr) #endif @ stdcall ExInterlockedInsertHeadList(ptr ptr ptr) @ stdcall ExInterlockedInsertTailList(ptr ptr ptr) @ stdcall ExInterlockedPopEntryList(ptr ptr) #ifndef __x86_64__ -@ fastcall ExInterlockedPopEntrySList(ptr ptr) +@ FASTCALL ExInterlockedPopEntrySList(ptr ptr) #endif @ stdcall ExInterlockedPushEntryList(ptr ptr ptr) #ifndef __x86_64__ -@ fastcall ExInterlockedPushEntrySList(ptr ptr ptr) +@ FASTCALL ExInterlockedPushEntrySList(ptr ptr ptr) #endif @ stdcall ExInterlockedRemoveHeadList(ptr ptr) @ stdcall ExIsProcessorFeaturePresent(long) @@ -141,22 +146,22 @@ @ stdcall ExRaiseException(ptr) RtlRaiseException @ stdcall ExRaiseHardError(long long long ptr long ptr) @ stdcall ExRaiseStatus(long) RtlRaiseStatus -@ fastcall ExReInitializeRundownProtection(ptr) ExfReInitializeRundownProtection -@ fastcall ExReInitializeRundownProtectionCacheAware(ptr) ExfReInitializeRundownProtectionCacheAware +@ FASTCALL ExReInitializeRundownProtection(ptr) ExfReInitializeRundownProtection +@ FASTCALL ExReInitializeRundownProtectionCacheAware(ptr) ExfReInitializeRundownProtectionCacheAware @ stdcall ExRegisterCallback(ptr ptr ptr) @ stdcall ExReinitializeResourceLite(ptr) @ stdcall -arch=x86_64 ExReleaseFastMutex(ptr) -@ fastcall ExReleaseFastMutexUnsafe(ptr) -@ fastcall ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(ptr) -@ fastcall ExReleaseResourceAndLeaveCriticalRegion(ptr) +@ FASTCALL ExReleaseFastMutexUnsafe(ptr) +@ FASTCALL ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(ptr) +@ FASTCALL ExReleaseResourceAndLeaveCriticalRegion(ptr) @ stdcall ExReleaseResourceForThreadLite(ptr long) -@ fastcall ExReleaseResourceLite(ptr) -@ fastcall ExReleaseRundownProtection(ptr) ExfReleaseRundownProtection -@ fastcall ExReleaseRundownProtectionCacheAware(ptr) ExfReleaseRundownProtectionCacheAware -@ fastcall ExReleaseRundownProtectionCacheAwareEx(ptr long) ExfReleaseRundownProtectionCacheAwareEx -@ fastcall ExReleaseRundownProtectionEx(ptr long) ExfReleaseRundownProtectionEx -@ fastcall ExRundownCompleted(ptr) ExfRundownCompleted -@ fastcall ExRundownCompletedCacheAware(ptr) ExfRundownCompletedCacheAware +@ FASTCALL ExReleaseResourceLite(ptr) +@ FASTCALL ExReleaseRundownProtection(ptr) ExfReleaseRundownProtection +@ FASTCALL ExReleaseRundownProtectionCacheAware(ptr) ExfReleaseRundownProtectionCacheAware +@ FASTCALL ExReleaseRundownProtectionCacheAwareEx(ptr long) ExfReleaseRundownProtectionCacheAwareEx +@ FASTCALL ExReleaseRundownProtectionEx(ptr long) ExfReleaseRundownProtectionEx +@ FASTCALL ExRundownCompleted(ptr) ExfRundownCompleted +@ FASTCALL ExRundownCompletedCacheAware(ptr) ExfRundownCompletedCacheAware @ extern ExSemaphoreObjectType _ExSemaphoreObjectType @ stdcall ExSetResourceOwnerPointer(ptr ptr) @ stdcall ExSetTimerResolution(long long) @@ -167,37 +172,37 @@ @ stdcall ExUnregisterCallback(ptr) @ stdcall ExUuidCreate(ptr) @ stdcall ExVerifySuite(long) -@ fastcall ExWaitForRundownProtectionRelease(ptr) ExfWaitForRundownProtectionRelease -@ fastcall ExWaitForRundownProtectionReleaseCacheAware(ptr) ExfWaitForRundownProtectionReleaseCacheAware +@ FASTCALL ExWaitForRundownProtectionRelease(ptr) ExfWaitForRundownProtectionRelease +@ FASTCALL ExWaitForRundownProtectionReleaseCacheAware(ptr) ExfWaitForRundownProtectionReleaseCacheAware @ extern ExWindowStationObjectType -@ fastcall ExfAcquirePushLockExclusive(ptr) -@ fastcall ExfAcquirePushLockShared(ptr) +@ FASTCALL ExfAcquirePushLockExclusive(ptr) +@ FASTCALL ExfAcquirePushLockShared(ptr) #ifndef __x86_64__ -@ fastcall ExfInterlockedAddUlong(ptr long ptr) -@ fastcall ExfInterlockedCompareExchange64(ptr ptr ptr) -@ fastcall ExfInterlockedInsertHeadList(ptr ptr ptr) -@ fastcall ExfInterlockedInsertTailList(ptr ptr ptr) -@ fastcall ExfInterlockedPopEntryList(ptr ptr) -@ fastcall ExfInterlockedPushEntryList(ptr ptr ptr) -@ fastcall ExfInterlockedRemoveHeadList(ptr ptr) +@ FASTCALL ExfInterlockedAddUlong(ptr long ptr) +@ FASTCALL ExfInterlockedCompareExchange64(ptr ptr ptr) +@ FASTCALL ExfInterlockedInsertHeadList(ptr ptr ptr) +@ FASTCALL ExfInterlockedInsertTailList(ptr ptr ptr) +@ FASTCALL ExfInterlockedPopEntryList(ptr ptr) +@ FASTCALL ExfInterlockedPushEntryList(ptr ptr ptr) +@ FASTCALL ExfInterlockedRemoveHeadList(ptr ptr) #endif -@ fastcall ExfReleasePushLock(ptr) -@ fastcall ExfReleasePushLockExclusive(ptr) -@ fastcall ExfReleasePushLockShared(ptr) -@ fastcall ExfTryToWakePushLock(ptr) -@ fastcall ExfUnblockPushLock(ptr ptr) +@ FASTCALL ExfReleasePushLock(ptr) +@ FASTCALL ExfReleasePushLockExclusive(ptr) +@ FASTCALL ExfReleasePushLockShared(ptr) +@ FASTCALL ExfTryToWakePushLock(ptr) +@ FASTCALL ExfUnblockPushLock(ptr ptr) @ stdcall -arch=x86_64 ExpInterlockedFlushSList(ptr) @ stdcall -arch=x86_64 ExpInterlockedPopEntrySList(ptr ptr) @ stdcall -arch=x86_64 ExpInterlockedPushEntrySList(ptr ptr) -@ fastcall -arch=i386 Exfi386InterlockedDecrementLong(ptr) -@ fastcall -arch=i386 Exfi386InterlockedExchangeUlong(ptr long) -@ fastcall -arch=i386 Exfi386InterlockedIncrementLong(ptr) +@ FASTCALL -arch=i386 Exfi386InterlockedDecrementLong(ptr) +@ FASTCALL -arch=i386 Exfi386InterlockedExchangeUlong(ptr long) +@ FASTCALL -arch=i386 Exfi386InterlockedIncrementLong(ptr) @ stdcall -arch=i386 Exi386InterlockedDecrementLong(ptr) @ stdcall -arch=i386 Exi386InterlockedExchangeUlong(ptr long long) @ stdcall -arch=i386 Exi386InterlockedIncrementLong(ptr) -@ fastcall -arch=i386 ExiAcquireFastMutex(ptr) ExAcquireFastMutex -@ fastcall -arch=i386 ExiReleaseFastMutex(ptr) ExReleaseFastMutex -@ fastcall -arch=i386 ExiTryToAcquireFastMutex(ptr) ExTryToAcquireFastMutex +@ FASTCALL -arch=i386 ExiAcquireFastMutex(ptr) ExAcquireFastMutex +@ FASTCALL -arch=i386 ExiReleaseFastMutex(ptr) ExReleaseFastMutex +@ FASTCALL -arch=i386 ExiTryToAcquireFastMutex(ptr) ExTryToAcquireFastMutex @ stdcall FsRtlAcquireFileExclusive(ptr) ;FsRtlAddBaseMcbEntry @ stdcall FsRtlAddLargeMcbEntry(ptr long long long long long long) @@ -318,7 +323,7 @@ @ stdcall FsRtlUninitializeMcb(ptr) @ stdcall FsRtlUninitializeOplock(ptr) @ extern HalDispatchTable _HalDispatchTable -@ fastcall HalExamineMBR(ptr long long ptr) +@ FASTCALL HalExamineMBR(ptr long long ptr) @ extern HalPrivateDispatchTable ;HeadlessDispatch @ stdcall InbvAcquireDisplayOwnership() @@ -335,13 +340,13 @@ @ stdcall InbvSolidColorFill(long long long long long) @ extern InitSafeBootMode #ifndef __x86_64__ -@ fastcall InterlockedCompareExchange(ptr long long) -@ fastcall InterlockedDecrement(ptr) -@ fastcall InterlockedExchange(ptr long) -@ fastcall InterlockedExchangeAdd(ptr long) -@ fastcall InterlockedIncrement(ptr) -@ fastcall InterlockedPopEntrySList(ptr) -@ fastcall InterlockedPushEntrySList(ptr ptr) +@ FASTCALL InterlockedCompareExchange(ptr long long) +@ FASTCALL InterlockedDecrement(ptr) +@ FASTCALL InterlockedExchange(ptr long) +@ FASTCALL InterlockedExchangeAdd(ptr long) +@ FASTCALL InterlockedIncrement(ptr) +@ FASTCALL InterlockedPopEntrySList(ptr) +@ FASTCALL InterlockedPushEntrySList(ptr ptr) #else @ stdcall InitializeSListHead(ptr) RtlInitializeSListHead #endif @@ -356,7 +361,7 @@ @ stdcall IoAllocateIrp(long long) @ stdcall IoAllocateMdl(ptr long long long ptr) @ stdcall IoAllocateWorkItem(ptr) -@ fastcall IoAssignDriveLetters(ptr ptr ptr ptr) +@ FASTCALL IoAssignDriveLetters(ptr ptr ptr ptr) @ stdcall IoAssignResources(ptr ptr ptr ptr ptr ptr) @ stdcall IoAttachDevice(ptr ptr ptr) @ stdcall IoAttachDeviceByPointer(ptr ptr) @@ -437,7 +442,7 @@ @ stdcall IoGetFileObjectGenericMapping() @ stdcall IoGetInitialStack() @ stdcall IoGetLowerDeviceObject(ptr) -@ fastcall IoGetPagingIoPriority(ptr) +@ FASTCALL IoGetPagingIoPriority(ptr) @ stdcall IoGetRelatedDeviceObject(ptr) @ stdcall IoGetRequestorProcess(ptr) @ stdcall IoGetRequestorProcessId(ptr) @@ -469,7 +474,7 @@ @ stdcall IoRaiseInformationalHardError(long ptr ptr) @ stdcall IoReadDiskSignature(ptr long ptr) @ extern IoReadOperationCount -@ fastcall IoReadPartitionTable(ptr long long ptr) +@ FASTCALL IoReadPartitionTable(ptr long long ptr) @ stdcall IoReadPartitionTableEx(ptr ptr) @ extern IoReadTransferCount @ stdcall IoRegisterBootDriverReinitialization(ptr ptr ptr) @@ -500,7 +505,7 @@ @ stdcall IoSetHardErrorOrVerifyDevice(ptr ptr) @ stdcall IoSetInformation(ptr ptr long ptr) @ stdcall IoSetIoCompletion(ptr ptr ptr long ptr long) -@ fastcall IoSetPartitionInformation(ptr long long long) +@ FASTCALL IoSetPartitionInformation(ptr long long long) @ stdcall IoSetPartitionInformationEx(ptr long ptr) @ stdcall IoSetShareAccess(long long ptr ptr) @ stdcall IoSetStartIoAttributes(ptr long long) @@ -543,11 +548,11 @@ @ stdcall IoWMIWriteEvent(ptr) @ stdcall IoWriteErrorLogEntry(ptr) @ extern IoWriteOperationCount -@ fastcall IoWritePartitionTable(ptr long long long ptr) +@ FASTCALL IoWritePartitionTable(ptr long long long ptr) @ stdcall IoWritePartitionTableEx(ptr ptr) @ extern IoWriteTransferCount -@ fastcall IofCallDriver(ptr ptr) -@ fastcall IofCompleteRequest(ptr long) +@ FASTCALL IofCallDriver(ptr ptr) +@ FASTCALL IofCompleteRequest(ptr long) @ stdcall KdChangeOption(long long ptr long ptr ptr) @ extern KdDebuggerEnabled _KdDebuggerEnabled @ extern KdDebuggerNotPresent _KdDebuggerNotPresent @@ -562,13 +567,13 @@ @ stdcall -arch=i386 Ke386IoSetAccessProcess(ptr long) @ stdcall -arch=i386 Ke386QueryIoAccessMap(long ptr) @ stdcall -arch=i386 Ke386SetIoAccessMap(long ptr) -@ fastcall KeAcquireGuardedMutex(ptr) -@ fastcall KeAcquireGuardedMutexUnsafe(ptr) -@ fastcall KeAcquireInStackQueuedSpinLockAtDpcLevel(ptr ptr) -@ fastcall KeAcquireInStackQueuedSpinLockForDpc(ptr ptr) +@ FASTCALL KeAcquireGuardedMutex(ptr) +@ FASTCALL KeAcquireGuardedMutexUnsafe(ptr) +@ FASTCALL KeAcquireInStackQueuedSpinLockAtDpcLevel(ptr ptr) +@ FASTCALL KeAcquireInStackQueuedSpinLockForDpc(ptr ptr) @ stdcall KeAcquireInterruptSpinLock(ptr) @ stdcall KeAcquireSpinLockAtDpcLevel(ptr) -@ fastcall KeAcquireSpinLockForDpc(ptr) +@ FASTCALL KeAcquireSpinLockForDpc(ptr) @ stdcall -arch=x86_64 KeAcquireSpinLockRaiseToDpc(ptr) @ stdcall KeAddSystemServiceTable(ptr ptr long ptr long) @ stdcall KeAreAllApcsDisabled() @@ -612,7 +617,7 @@ @ stdcall KeInitializeDeviceQueue(ptr) @ stdcall KeInitializeDpc(ptr ptr ptr) @ stdcall KeInitializeEvent(ptr long long) -@ fastcall KeInitializeGuardedMutex(ptr) +@ FASTCALL KeInitializeGuardedMutex(ptr) @ stdcall KeInitializeInterrupt(ptr ptr ptr ptr long long long long long long long) @ stdcall KeInitializeMutant(ptr long) @ stdcall KeInitializeMutex(ptr long) @@ -663,10 +668,10 @@ @ stdcall KeRegisterBugCheckCallback(ptr ptr ptr long ptr) @ stdcall KeRegisterBugCheckReasonCallback(ptr ptr ptr ptr) @ stdcall KeRegisterNmiCallback(ptr ptr) -@ fastcall KeReleaseGuardedMutex(ptr) -@ fastcall KeReleaseGuardedMutexUnsafe(ptr) -@ fastcall KeReleaseInStackQueuedSpinLockForDpc(ptr) -@ fastcall KeReleaseInStackQueuedSpinLockFromDpcLevel(ptr) +@ FASTCALL KeReleaseGuardedMutex(ptr) +@ FASTCALL KeReleaseGuardedMutexUnsafe(ptr) +@ FASTCALL KeReleaseInStackQueuedSpinLockForDpc(ptr) +@ FASTCALL KeReleaseInStackQueuedSpinLockFromDpcLevel(ptr) @ stdcall KeReleaseInterruptSpinLock(ptr long) @ stdcall KeReleaseMutant(ptr long long long) @ stdcall KeReleaseMutex(ptr long) @@ -674,7 +679,7 @@ #ifdef __x86_64__ @ stdcall KeReleaseSpinLock(ptr long) #endif -@ fastcall KeReleaseSpinLockForDpc(ptr long) +@ FASTCALL KeReleaseSpinLockForDpc(ptr long) @ stdcall KeReleaseSpinLockFromDpcLevel(ptr) @ stdcall KeRemoveByKeyDeviceQueue(ptr long) @ stdcall KeRemoveByKeyDeviceQueueIfBusy(ptr long) @@ -710,10 +715,10 @@ @ stdcall KeStackAttachProcess(ptr ptr) @ stdcall KeSynchronizeExecution(ptr ptr ptr) @ stdcall KeTerminateThread(long) -@ fastcall KeTestSpinLock(ptr) +@ FASTCALL KeTestSpinLock(ptr) @ extern KeTickCount -@ fastcall KeTryToAcquireGuardedMutex(ptr) -@ fastcall KeTryToAcquireSpinLockAtDpcLevel(ptr) +@ FASTCALL KeTryToAcquireGuardedMutex(ptr) +@ FASTCALL KeTryToAcquireSpinLockAtDpcLevel(ptr) @ stdcall KeUnstackDetachProcess(ptr) @ stdcall KeUpdateRunTime(ptr long) @ fastcall KeUpdateSystemTime(ptr long long) @@ -721,11 +726,11 @@ @ stdcall KeWaitForMultipleObjects(long ptr long long long long ptr ptr) @ stdcall KeWaitForMutexObject(ptr long long long ptr) KeWaitForSingleObject @ stdcall KeWaitForSingleObject(ptr long long long ptr) -@ fastcall KefAcquireSpinLockAtDpcLevel(ptr) -@ fastcall KefReleaseSpinLockFromDpcLevel(ptr) +@ FASTCALL KefAcquireSpinLockAtDpcLevel(ptr) +@ FASTCALL KefReleaseSpinLockFromDpcLevel(ptr) @ stdcall -arch=i386 Kei386EoiHelper() @ fastcall -arch=i386 KiEoiHelper(ptr) /* FIXME: Evaluate decision */ -@ fastcall KiAcquireSpinLock(ptr) +@ FASTCALL KiAcquireSpinLock(ptr) @ extern KiBugCheckData @ stdcall KiCheckForKernelApcDelivery() ;KiCheckForSListAddress @@ -734,7 +739,7 @@ @ stdcall -arch=i386 KiDispatchInterrupt() @ extern KiEnableTimerWatchdog @ stdcall KiIpiServiceRoutine(ptr ptr) -@ fastcall KiReleaseSpinLock(ptr) +@ FASTCALL KiReleaseSpinLock(ptr) @ cdecl KiUnexpectedInterrupt() #ifdef _M_IX86 @ stdcall Kii386SpinOnSpinLock(ptr long) @@ -928,8 +933,8 @@ ;ObSetHandleAttributes@12 @ stdcall ObSetSecurityDescriptorInfo(ptr ptr ptr ptr long ptr) @ stdcall ObSetSecurityObjectByPointer(ptr long ptr) -@ fastcall ObfDereferenceObject(ptr) -@ fastcall ObfReferenceObject(ptr) +@ FASTCALL ObfDereferenceObject(ptr) +@ FASTCALL ObfReferenceObject(ptr) ;PfxFindPrefix ;PfxInitialize ;PfxInsertPrefix @@ -1251,7 +1256,7 @@ @ stdcall RtlOemStringToUnicodeString(ptr ptr long) @ stdcall RtlOemToUnicodeN(wstr long ptr ptr long) @ stdcall RtlPinAtomInAtomTable(ptr ptr) -@ fastcall RtlPrefetchMemoryNonTemporal(ptr long) +@ FASTCALL RtlPrefetchMemoryNonTemporal(ptr long) @ stdcall RtlPrefixString(ptr ptr long) @ stdcall RtlPrefixUnicodeString(ptr ptr long) @ stdcall RtlQueryAtomInAtomTable(ptr ptr ptr ptr ptr ptr) @@ -1298,8 +1303,8 @@ ;RtlTraceDatabaseUnlock ;RtlTraceDatabaseValidate #ifndef __x86_64__ -@ fastcall RtlUlongByteSwap(long) -@ fastcall RtlUlonglongByteSwap(long long) +@ FASTCALL RtlUlongByteSwap(long) +@ FASTCALL RtlUlonglongByteSwap(long long) #endif @ stdcall RtlUnicodeStringToAnsiSize(ptr) RtlxUnicodeStringToAnsiSize @ stdcall RtlUnicodeStringToAnsiString(ptr ptr long) @@ -1324,7 +1329,7 @@ @ stdcall RtlUpperChar(long) @ stdcall RtlUpperString(ptr ptr) #ifndef __x86_64__ -@ fastcall RtlUshortByteSwap(long) +@ FASTCALL RtlUshortByteSwap(long) #endif @ stdcall RtlValidRelativeSecurityDescriptor(ptr long long) @ stdcall RtlValidSecurityDescriptor(ptr) From c100c972c16e08b4dd6bdafafdde1e733ada3812 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 13 Apr 2010 16:26:48 +0000 Subject: [PATCH 116/261] [HAL] - Give mini-hal it's own rbuild file - fix amd64 rbuild svn path=/trunk/; revision=46860 --- reactos/hal/halx86/directory.rbuild | 9 ++--- reactos/hal/halx86/hal_generic.rbuild | 52 +++++---------------------- reactos/hal/halx86/hal_mini.rbuild | 44 +++++++++++++++++++++++ reactos/hal/halx86/halamd64.rbuild | 18 +++++++--- 4 files changed, 70 insertions(+), 53 deletions(-) create mode 100644 reactos/hal/halx86/hal_mini.rbuild diff --git a/reactos/hal/halx86/directory.rbuild b/reactos/hal/halx86/directory.rbuild index 7cea4c006fa..9c8c482a2c7 100644 --- a/reactos/hal/halx86/directory.rbuild +++ b/reactos/hal/halx86/directory.rbuild @@ -3,14 +3,15 @@ - - - + + + + - + diff --git a/reactos/hal/halx86/hal_generic.rbuild b/reactos/hal/halx86/hal_generic.rbuild index 166bb930404..8dd5f7bc57d 100644 --- a/reactos/hal/halx86/hal_generic.rbuild +++ b/reactos/hal/halx86/hal_generic.rbuild @@ -16,7 +16,6 @@ sysbus.c beep.c - bios.c cmos.c display.c dma.c @@ -29,6 +28,7 @@ timer.c usage.c + bios.c portio.c systimer.S @@ -36,9 +36,16 @@ + + . x86bios.c + halinit.c + irq.S + misc.c + apic.c systimer.S + usage.c @@ -46,47 +53,4 @@ hal.h - - - include - include - - - - - - - bushndlr.c - isabus.c - halbus.c - pcibus.c - pcidata.c - sysbus.c - - beep.c - bios.c - cmos.c - dma.c - display.c - drive.c - misc.c - profil.c - reboot.c - spinlock.c - sysinfo.c - timer.c - usage.c - - - portio.c - systimer.S - - - - - halinit_up.c - pic.c - processor.c - - diff --git a/reactos/hal/halx86/hal_mini.rbuild b/reactos/hal/halx86/hal_mini.rbuild new file mode 100644 index 00000000000..a7baed44639 --- /dev/null +++ b/reactos/hal/halx86/hal_mini.rbuild @@ -0,0 +1,44 @@ + + + + + include + include + + + + + + + bushndlr.c + isabus.c + halbus.c + pcibus.c + pcidata.c + sysbus.c + + beep.c + bios.c + cmos.c + dma.c + display.c + drive.c + misc.c + profil.c + reboot.c + spinlock.c + sysinfo.c + timer.c + usage.c + + portio.c + systimer.S + + + + halinit_up.c + pic.c + processor.c + + + diff --git a/reactos/hal/halx86/halamd64.rbuild b/reactos/hal/halx86/halamd64.rbuild index 0b60f7615dc..ad96c0f1cf9 100644 --- a/reactos/hal/halx86/halamd64.rbuild +++ b/reactos/hal/halx86/halamd64.rbuild @@ -12,17 +12,25 @@ hal_generic hal_generic_acpi - hal_generic_up ntoskrnl - + x86emu - + + spinlock.c + + + + processor.c + + + + mps.S - + From 9032acdcf88e107fad66dc299fefbc7b3a97b0b5 Mon Sep 17 00:00:00 2001 From: Marc Piulachs Date: Tue, 13 Apr 2010 21:59:21 +0000 Subject: [PATCH 117/261] My first commit in a very long time. I'm releasing the source code of my C# implementation of Rbuild by popular demand :) I would have preferred to release the code under a BSD licence but there is a small portion of ancient Nant GPL code that would have been to be rewritten first. There are two executables (SysGen.Designer) and (SysGen.Make) SysGen.Designer is a windows forms tool that allows to generate customized reactos images, it is similar in concept to Windows CE Platfom Builder. SysGen.Make is the actual Rbuild clone, It has three main parts, the .rbuild file parser + in-memory tree representation, the backends , and the auto generated files. The Mingw backend used to work 1'5 years ago and produced a 100% valid makefile.auto but have to be updated to be able to build a recent revision. Rewriting parts of it to take advantage of C# 3.5 extension methods would probably reduce the code by 50%. The other two parts are quite stable. This code was only a proof of concept and was never intended to be released so there is a ton of unpolished code and hacks required by the current C++ implementation that should be removed. How to test it: Select SysGen.Make as the Start-up Project in Visual Studio and edit Program.cs to point to the correct path to ReactOS-i386.rbuild Edit SysGenEngine.cs:639 to enable/disable specific backends, The HtmlBackend in \SysGen.BuildEngine\Backends\Html\HtmlBackend.cs is a very simple illustration of how powerful this framework is. Happy hacking! svn path=/trunk/; revision=46862 --- .../tools/sysgen/FileSystemTreeView/App.ico | Bin 0 -> 1078 bytes .../sysgen/FileSystemTreeView/AssemblyInfo.cs | 58 + .../sysgen/FileSystemTreeView/Backup/App.ico | Bin 0 -> 1078 bytes .../FileSystemTreeView/Backup/AssemblyInfo.cs | 58 + .../Backup/FileSystemTreeView.cs | 201 ++ .../Backup/FileSystemTreeView.csproj | 143 + .../Backup/FileSystemTreeView.csproj.user | 48 + .../Backup/FileSystemTreeView.resx | 42 + .../sysgen/FileSystemTreeView/Backup/Form1.cs | 178 ++ .../FileSystemTreeView/Backup/Form1.resx | 193 ++ .../FileSystemTreeView/Backup/ShellIcon.cs | 79 + .../Backup/icons/folder.ico | Bin 0 -> 1406 bytes .../FileSystemTreeView/FileSystemTreeView.cs | 202 ++ .../FileSystemTreeView.csproj | 124 + .../FileSystemTreeView.csproj.user | 58 + .../FileSystemTreeView.resx | 42 + .../FileSystemTreeView/FileSystemTreeView.suo | Bin 0 -> 2560 bytes .../tools/sysgen/FileSystemTreeView/Form1.cs | 178 ++ .../sysgen/FileSystemTreeView/Form1.resx | 193 ++ .../sysgen/FileSystemTreeView/ShellIcon.cs | 79 + .../sysgen/FileSystemTreeView/UpgradeLog.XML | 19 + .../_UpgradeReport_Files/UpgradeReport.css | 207 ++ .../_UpgradeReport_Files/UpgradeReport.xslt | 232 ++ .../UpgradeReport_Minus.gif | Bin 0 -> 69 bytes .../UpgradeReport_Plus.gif | Bin 0 -> 71 bytes .../bin/Debug/DirectoryTreeView.exe | Bin 0 -> 32768 bytes .../bin/Debug/DirectoryTreeView.pdb | Bin 0 -> 28160 bytes .../bin/Debug/DirectoryTreeView.vshost.exe | Bin 0 -> 5632 bytes .../FileSystemTreeView/icons/folder.ico | Bin 0 -> 1406 bytes .../Controls/CatalogTriStateTreeView.cs | 220 ++ .../Controls/ModuleFiltersListView.cs | 91 + .../RosBuilder/Controls/NewItemListView.cs | 114 + .../RosBuilder/Controls/PlatformTreeView.cs | 306 ++ .../RosBuilder/Controls/ProjectTreeView.cs | 161 + .../Controls/RegistryEditor.Designer.cs | 118 + .../RosBuilder/Controls/RegistryEditor.cs | 18 + .../RosBuilder/Controls/RegistryEditor.resx | 120 + .../tools/sysgen/RosBuilder/Form1.Designer.cs | 38 + reactos/tools/sysgen/RosBuilder/Form1.cs | 18 + reactos/tools/sysgen/RosBuilder/Form1.resx | 120 + .../Inspectors/PlatformInspector.cs | 155 + .../sysgen/RosBuilder/MainForm.Designer.cs | 654 ++++ reactos/tools/sysgen/RosBuilder/MainForm.cs | 362 +++ reactos/tools/sysgen/RosBuilder/MainForm.resx | 353 +++ .../tools/sysgen/RosBuilder/ModuleFilter.cs | 295 ++ .../sysgen/RosBuilder/NewItemForm.Designer.cs | 135 + .../tools/sysgen/RosBuilder/NewItemForm.cs | 28 + .../tools/sysgen/RosBuilder/NewItemForm.resx | 120 + .../RosBuilder/PlatformCatalogReader.cs | 206 ++ .../sysgen/RosBuilder/PlatformController.cs | 86 + reactos/tools/sysgen/RosBuilder/Program.cs | 109 + .../sysgen/RosBuilder/Project/Project.cs | 267 ++ .../RosBuilder/Project/ProjectReader.cs | 319 ++ .../RosBuilder/Project/ProjectWriter.cs | 170 + .../sysgen/RosBuilder/ProjectController.cs | 222 ++ .../RosBuilder/Properties/AssemblyInfo.cs | 33 + .../Properties/Resources.Designer.cs | 63 + .../RosBuilder/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../RosBuilder/Properties/Settings.settings | 7 + .../sysgen/RosBuilder/SysGen.Designer.csproj | 148 + .../RosBuilder/SysGen.Designer.csproj.user | 5 + .../sysgen/RosBuilder/Util/FileAssociation.cs | 244 ++ .../sysgen/RosFramework/Base/RBuildElement.cs | 311 ++ .../Collections/RBuildAPIStatusCollection.cs | 53 + .../Collections/RBuildAuthorCollection.cs | 20 + .../RBuildBuildFamilyCollection.cs | 20 + .../RBuildContributorCollection.cs | 20 + .../RBuildDebugChannelCollection.cs | 35 + .../Collections/RBuildDefineCollection.cs | 25 + .../RBuildExportedFunctionsCollection.cs | 10 + .../Collections/RBuildFamilyCollection.cs | 10 + .../Collections/RBuildFileCollection.cs | 17 + .../Collections/RBuildFolderCollection.cs | 17 + .../RBuildIncludeFolderCollection.cs | 10 + .../RBuildInstallFolderCollection.cs | 28 + .../Collections/RBuildLanguageCollection.cs | 20 + .../RBuildLocalizationFileCollection.cs | 25 + .../Collections/RBuildModuleCollection.cs | 82 + .../Collections/RBuildModuleInfoCollection.cs | 20 + .../RBuildPlatformFileCollection.cs | 17 + .../Collections/RBuildPropertyCollection.cs | 108 + .../Collections/RBuildSourceFileCollection.cs | 60 + .../Interfaces/IRBuildInstallable.cs | 13 + .../Interfaces/IRBuildModulesContainer.cs | 10 + .../RosFramework/Interfaces/IRBuildNamed.cs | 10 + .../Interfaces/IRBuildSourceFilesContainer.cs | 10 + .../tools/sysgen/RosFramework/Misc/Utility.cs | 17 + .../NotImplementedYet/RBuildModuleGroup.cs | 23 + .../NotImplementedYet/RBuildPatch.cs | 24 + .../RosFramework/Obsolete/PlatformCatalog.cs | 92 + .../RosFramework/Obsolete/RosArchitecture.cs | 43 + .../RosFramework/Obsolete/RosOSImage.cs | 209 ++ .../RosFramework/Obsolete/RosPlatform.cs | 78 + .../RosFramework/Obsolete/SoftwareCatalog.cs | 80 + .../RosFramework/Properties/AssemblyInfo.cs | 35 + .../sysgen/RosFramework/RBuildAPIInfo.cs | 37 + .../tools/sysgen/RosFramework/RBuildAuthor.cs | 38 + .../sysgen/RosFramework/RBuildAutoRegister.cs | 106 + .../RosFramework/RBuildBootstrapFile.cs | 52 + .../sysgen/RosFramework/RBuildBuildFamily.cs | 25 + .../tools/sysgen/RosFramework/RBuildCDFile.cs | 14 + .../sysgen/RosFramework/RBuildCDFileBase.cs | 11 + .../RosFramework/RBuildCompilationUnit.cs | 24 + .../sysgen/RosFramework/RBuildContributor.cs | 93 + .../sysgen/RosFramework/RBuildDebugChannel.cs | 74 + .../RosFramework/RBuildExportFunction.cs | 47 + .../tools/sysgen/RosFramework/RBuildFamily.cs | 18 + .../tools/sysgen/RosFramework/RBuildFile.cs | 441 +++ .../RosFramework/RBuildImportLibrary.cs | 38 + .../RosFramework/RBuildInfInstallerFile.cs | 18 + .../sysgen/RosFramework/RBuildInstallFile.cs | 38 + .../RosFramework/RBuildInstallFolder.cs | 30 + .../sysgen/RosFramework/RBuildLanguage.cs | 48 + .../RosFramework/RBuildLocalizationFile.cs | 34 + .../sysgen/RosFramework/RBuildMetadata.cs | 18 + .../tools/sysgen/RosFramework/RBuildModule.cs | 1210 ++++++++ .../sysgen/RosFramework/RBuildModuleGroup.cs | 24 + .../sysgen/RosFramework/RBuildModuleInfo.cs | 60 + .../sysgen/RosFramework/RBuildPlatform.cs | 133 + .../sysgen/RosFramework/RBuildPlatformFile.cs | 84 + .../sysgen/RosFramework/RBuildProject.cs | 163 + .../sysgen/RosFramework/RBuildProperty.cs | 104 + .../sysgen/RosFramework/RBuildRegistryKey.cs | 67 + .../tools/sysgen/RosFramework/RBuildSetup.cs | 52 + .../sysgen/RosFramework/RBuildSetupFile.cs | 52 + .../sysgen/RosFramework/RBuildSolution.cs | 21 + .../tools/sysgen/RosFramework/RBuildTarget.cs | 274 ++ .../RosFramework/RBuildUnAttendSetup.cs | 102 + .../SysGen.RBuild.Framework.csproj | 117 + .../SysGen.RBuild.Framework.csproj.user | 5 + .../tools/sysgen/SYSGen/Backends/Backend.cs | 10 + .../SYSGen/Backends/Catalog/CatalogBackend.cs | 12 + .../SYSGen/Backends/Mingw/MingwBackend.cs | 12 + reactos/tools/sysgen/SYSGen/Program.cs | 13 + .../sysgen/SYSGen/Properties/AssemblyInfo.cs | 33 + reactos/tools/sysgen/SYSGen/SYSGen.csproj | 56 + .../Attributes/BuildElementArrayAttribute.cs | 33 + .../Attributes/BuildElementAttribute.cs | 50 + .../Attributes/ElementNameAttribute.cs | 45 + .../Attributes/FunctionAttribute.cs | 60 + .../Attributes/FunctionSetAttribute.cs | 90 + .../Attributes/TaskAttributeAttribute.cs | 43 + .../Attributes/TaskFileSetAttribute.cs | 33 + .../Attributes/TaskNameAttribute.cs | 46 + .../Attributes/TaskOptionSetAttribute.cs | 32 + .../Attributes/TaskPropertyAttribute.cs | 66 + .../Attributes/TaskValueAttribute.cs | 19 + .../Validators/Base/ValidatorAttribute.cs | 16 + .../Validators/BooleanValidatorAttribute.cs | 21 + .../Validators/Int32ValidatorAttribute.cs | 54 + .../Validators/StringValidatorAttribute.cs | 35 + .../Validators/UriValidatorAttribute.cs | 26 + .../APIDocumentation/APIDocumentation.cs | 395 +++ .../Backends/Base/Backend.cs | 81 + .../Backends/Base/CompilerBaseBacked.cs | 160 + .../Backends/Base/HtmlDocumenterBaseBacked.cs | 97 + .../BaseAddress/BaseAddressReportBackend.cs | 127 + .../Backends/BuildLogReport/BuildLogReport.cs | 109 + .../Backends/Catalog/CatalogBackend.cs | 69 + .../Backends/Html/HtmlBackend.cs | 2743 +++++++++++++++++ .../Backends/MSVisualStudio/MSVisualStudio.cs | 45 + .../MSVisualStudio/VisualStudio/Solution.cs | 703 +++++ .../Backends/Mingw/CompilableFile.cs | 621 ++++ .../Backends/Mingw/MingwBackend.cs | 504 +++ .../Mingw/MingwRBuildElementHandler.cs | 923 ++++++ .../Backends/Mingw/Misc/MakefileWriter.cs | 99 + .../Base/MingwRBuildModuleHandler.cs | 10 + .../MingwBootLoaderModuleHandler.cs | 35 + .../MingwBootSectorModuleHandler.cs | 33 + .../MingwBuildToolModuleHandler.cs | 43 + .../MingwCabinetModuleHandler.cs | 39 + .../MingwEmbeddedTypeLibModuleHandler.cs | 42 + .../MingwHostStaticLibraryModuleHandler.cs | 17 + .../MingwIdlHeaderModuleHandler.cs | 43 + .../MingwKernelModeDLLModuleHandler.cs | 69 + .../MingwKernelModeDriverModuleHandler.cs | 59 + .../MingwKernelModuleHandler.cs | 68 + .../MingwMessageHeaderModuleHandler.cs | 50 + .../MingwNativeCUIModuleHandler.cs | 44 + .../MingwNativeDLLModuleHandler.cs | 49 + .../MingwObjectLibraryModuleHandler.cs | 58 + .../MingwPackageModuleHandler.cs | 39 + .../MingwRBuildProjectHandler.cs | 37 + .../MingwRpcClientHeaderModuleHandler.cs | 42 + .../MingwRpcProxyModuleHandler.cs | 42 + .../MingwRpcServerHeaderModuleHandler.cs | 49 + .../MingwStaticLibraryModuleHandler.cs | 61 + .../MingwWin32CUIModuleHandler.cs | 45 + .../MingwWin32DLLModuleHandler.cs | 64 + .../MingwWin32GUIModuleHandler.cs | 54 + .../MingwWin32OCXModuleHandler.cs | 54 + .../Base/MingwRBuildTargetHandler.cs | 307 ++ .../ProjectTreeReport/ProjectTreeReport.cs | 66 + .../Backends/RBuildDB/RBuildDBBackend.cs | 102 + .../Backends/RGenStats/RGenStatBackend.cs | 110 + .../Backends/WarningReport/WarningReport.cs | 82 + .../Collections/BackendCollection.cs | 22 + .../Collections/DefineCollection.cs | 23 + .../Collections/FileHandlerCollection.cs | 24 + .../Collections/LogListenerCollection.cs | 14 + .../Collections/TaskBuilderCollection.cs | 33 + .../Collections/TaskCollection.cs | 10 + .../Elements/Base/Element.cs | 306 ++ .../Exceptions/BuildException.cs | 101 + .../Exceptions/ValidationException.cs | 62 + .../Base/AutoGeneratedCFileWriter.cs | 30 + .../Base/AutoGeneratedFileWriter.cs | 39 + .../Base/AutoGeneratedInfFileWriter.cs | 54 + .../FileWriters/BuildNumberFileWriter.cs | 45 + .../FileWriters/CompilationUnitFileWriter.cs | 42 + .../FileWriters/DefinitionFileWriter.cs | 21 + .../FileWriters/DffFileWriter.cs | 139 + .../FileWriters/HeaderCreditsFileWriter.cs | 36 + .../FileWriters/HeaderRosCfgFileWriter.cs | 26 + .../SysSetupComponentSetupFileWriter.cs | 84 + .../FileWriters/SysSetupFileWriter.cs | 92 + .../FileWriters/TxtCreditsFileWriter.cs | 52 + .../FileWriters/TxtSetupFileWriter.cs | 137 + .../FileWriters/TxtSetupHiveFileWriter.cs | 59 + .../FileWriters/UnAttendSetupFileWriter.cs | 46 + .../Handlers/SysSetupFileHandler.cs | 138 + .../Interfaces/IBuildStatusMailReporter.cs | 10 + .../Interfaces/IDirectory.cs | 16 + .../SysGen.BuildEngine/Interfaces/IElement.cs | 21 + .../Interfaces/IFileHandler.cs | 35 + .../Interfaces/IRBuildInstallable.cs | 13 + .../Interfaces/ISysGenObject.cs | 21 + .../SysGen.BuildEngine/Interfaces/ITask.cs | 18 + .../Interfaces/ITaskContainer.cs | 12 + .../sysgen/SysGen.BuildEngine/Location.cs | 89 + .../sysgen/SysGen.BuildEngine/LocationMap.cs | 211 ++ .../sysgen/SysGen.BuildEngine/Log/Log.cs | 215 ++ .../Log/Loggers/ConsoleLogger.cs | 22 + .../Log/Loggers/StringLogger.cs | 36 + .../Log/Loggers/XmlLogger.cs | 193 ++ .../SysGen.BuildEngine/Plugins/TaskBuilder.cs | 72 + .../SysGen.BuildEngine/Plugins/TaskFactory.cs | 136 + .../Properties/AssemblyInfo.cs | 15 + .../SysGen.Framework.csproj | 381 +++ .../SysGen.Framework.csproj.user | 19 + .../SysGen.BuildEngine/SysGenConversion.cs | 26 + .../SysGenDependencyTracker.cs | 118 + .../sysgen/SysGen.BuildEngine/SysGenEngine.cs | 825 +++++ .../SysGen.BuildEngine/SysGenPathResolver.cs | 36 + .../SysGen.BuildEngine/Tasks/Base/Task.cs | 257 ++ .../Tasks/Base/TaskContainer.cs | 29 + .../Tasks/BuiltIn/Build/XIFallbackTask.cs | 11 + .../Tasks/BuiltIn/Build/XIIncludeTask.cs | 148 + .../Tasks/BuiltIn/Logic/IfNotTask.cs | 49 + .../Tasks/BuiltIn/Logic/IfTask.cs | 134 + .../Tasks/RBuild/AutoFilesTask.cs | 63 + .../Tasks/RBuild/AutoInstallFilesTask.cs | 15 + .../Tasks/RBuild/AutoManifest.cs | 15 + .../Tasks/RBuild/AutoRegisterTask.cs | 33 + .../Tasks/RBuild/AutoResource.cs | 15 + .../Tasks/RBuild/Base/AuthorBaseTask.cs | 26 + .../Tasks/RBuild/Base/AutoFilesTask.cs | 19 + .../Tasks/RBuild/Base/CDFileBaseTask.cs | 42 + .../Tasks/RBuild/Base/FileBaseTask.cs | 47 + .../RBuild/Base/FileSystemInfoBaseTask.cs | 119 + .../Tasks/RBuild/Base/FolderBaseTask.cs | 15 + .../Tasks/RBuild/Base/PlatformFileBaseTask.cs | 37 + .../Tasks/RBuild/Base/PropertyBaseTask.cs | 38 + .../RBuild/Base/RbuildElementBaseTask.cs | 16 + .../Tasks/RBuild/Base/ValueBaseTask.cs | 16 + .../Tasks/RBuild/BaseAdressTask.cs | 17 + .../Tasks/RBuild/BootSector.cs | 44 + .../Tasks/RBuild/BootstrapFileTask.cs | 40 + .../Tasks/RBuild/BootstrapTask.cs | 52 + .../Tasks/RBuild/BuildFamilyTask.cs | 27 + .../Tasks/RBuild/CDFileTask.cs | 20 + .../Tasks/RBuild/CompilationUnitTask.cs | 58 + .../Tasks/RBuild/CompilerFlagTask.cs | 14 + .../Tasks/RBuild/ComponentTask.cs | 12 + .../Tasks/RBuild/ContributorTask.cs | 42 + .../Tasks/RBuild/DebugChannelTask.cs | 54 + .../Tasks/RBuild/DefineTask.cs | 45 + .../Tasks/RBuild/DependencyTask.cs | 27 + .../Tasks/RBuild/DeveloperTask.cs | 16 + .../Tasks/RBuild/DirectoryTask.cs | 59 + .../Tasks/RBuild/FamilyTask.cs | 28 + .../Tasks/RBuild/FileTask.cs | 50 + .../Tasks/RBuild/GroupTask.cs | 13 + .../Tasks/RBuild/ImportLibraryTask.cs | 50 + .../Tasks/RBuild/IncludeTask.cs | 42 + .../Tasks/RBuild/InstalFolder.cs | 31 + .../Tasks/RBuild/InstallComponent.cs | 39 + .../Tasks/RBuild/InstallFileTask.cs | 31 + .../Tasks/RBuild/InstallWallPaperFileTask.cs | 16 + .../Tasks/RBuild/LanguageTask.cs | 24 + .../Tasks/RBuild/LibraryTask.cs | 51 + .../Tasks/RBuild/LinkerFlagTask.cs | 14 + .../Tasks/RBuild/LinkerScriptTask.cs | 36 + .../Tasks/RBuild/LocalizationTask.cs | 41 + .../Tasks/RBuild/MantainterTask.cs | 16 + .../Tasks/RBuild/MetadataTask.cs | 27 + .../Tasks/RBuild/ModuleStateTask.cs | 34 + .../Tasks/RBuild/ModuleTask.cs | 588 ++++ .../Tasks/RBuild/Modules/BuildTool.cs | 17 + .../Tasks/RBuild/Modules/Cabinet.cs | 17 + .../Tasks/RBuild/Modules/Kernel.cs | 17 + .../Tasks/RBuild/Modules/KernelModeDLL.cs | 17 + .../Tasks/RBuild/Modules/KernelModeDriver.cs | 17 + .../Tasks/RBuild/Modules/NativeCUI.cs | 17 + .../Tasks/RBuild/Modules/NativeDLL.cs | 17 + .../Tasks/RBuild/Modules/ObjectLibrary.cs | 17 + .../Tasks/RBuild/Modules/Package.cs | 17 + .../Tasks/RBuild/Modules/StaticLibrary.cs | 17 + .../Tasks/RBuild/Modules/Win32CUI.cs | 17 + .../Tasks/RBuild/Modules/Win32Dll.cs | 17 + .../Tasks/RBuild/Modules/Win32GUI.cs | 17 + .../Tasks/RBuild/Modules/Win32OCX.cs | 17 + .../Tasks/RBuild/Modules/Win32SCR.cs | 17 + .../Tasks/RBuild/OverrideModuleTask.cs | 52 + .../Tasks/RBuild/PCHTask.cs | 43 + .../RBuild/Platform/PlatformAutorunTask.cs | 21 + .../Platform/PlatformDebugChannelTask.cs | 66 + .../Platform/PlatformDescriptionTask.cs | 16 + .../RBuild/Platform/PlatformLanguageTask.cs | 25 + .../RBuild/Platform/PlatformModuleTask.cs | 25 + .../Tasks/RBuild/Platform/PlatformNameTask.cs | 16 + .../Platform/PlatformScreenSaverTask.cs | 28 + .../RBuild/Platform/PlatformShellTask.cs | 29 + .../RBuild/Platform/PlatformWallpaperTask.cs | 37 + .../Tasks/RBuild/ProjectTask.cs | 70 + .../Tasks/RBuild/PropertyTask.cs | 24 + .../Tasks/RBuild/RBuildTask.cs | 10 + .../Tasks/RBuild/ReDefineTask.cs | 16 + .../Tasks/RBuild/RequiresTask.cs | 27 + .../Tasks/RBuild/SetupTask.cs | 45 + .../Tasks/RBuild/TargetTask.cs | 18 + .../Tasks/RBuild/WallPaperTask.cs | 26 + reactos/tools/sysgen/SysGen.Make/Program.cs | 42 + .../SysGen.Make/Properties/AssemblyInfo.cs | 33 + .../sysgen/SysGen.Make/SysGen.Make.csproj | 58 + .../SysGen.Make/SysGen.Make.csproj.user | 6 + .../tools/sysgen/SysGen.Make/SysGen.Make.sln | 20 + .../tools/sysgen/SysGen.Make/SysGen.Make.suo | Bin 0 -> 182272 bytes .../sysgen/SysGen.Make/SysGen.Make/Program.cs | 13 + .../SysGen.Make/Properties/AssemblyInfo.cs | 33 + .../SysGen.Make/SysGen.Make.csproj | 47 + .../Collections/CommandCollection.cs | 10 + .../Commands/Base/Command.cs | 16 + .../Commands/WhoIsCommand.cs | 11 + .../Properties/AssemblyInfo.cs | 33 + .../SysGen.RBuild.IRCBot.csproj | 64 + .../tools/sysgen/SysGen.RBuild.IRCBot/cIRC.cs | 72 + reactos/tools/sysgen/SysGen.sln | 66 + .../sysgen/TriStateTreeView/AssemblyInfo.cs | 55 + .../sysgen/TriStateTreeView/LICENSING.txt | 41 + .../TriStateTreeView/License_CPLv05.txt | 86 + .../sysgen/TriStateTreeView/License_GPLv2.txt | 342 ++ .../TriStateTreeView/License_LGPLv21.txt | 506 +++ .../tools/sysgen/TriStateTreeView/SysGen.sln | 75 + .../tools/sysgen/TriStateTreeView/SysGen.suo | Bin 0 -> 207872 bytes .../TriStateTreeView/TriStateTreeView.cs | 458 +++ .../TriStateTreeView/TriStateTreeView.csproj | 116 + .../TriStateTreeView/TriStateTreeView.resx | 166 + .../TriStateTreeViewDemo/App.ico | Bin 0 -> 1078 bytes .../TriStateTreeViewDemo/Backup/App.ico | Bin 0 -> 1078 bytes .../TriStateTreeViewDemo/Backup/Form1.cs | 117 + .../TriStateTreeViewDemo/Backup/Form1.resx | 139 + .../Backup/TriStateTreeViewDemo.csproj | 119 + .../Backup1/AssemblyInfo.cs | 55 + .../Backup1/TriStateTreeView.cs | 458 +++ .../Backup1/TriStateTreeView.csproj | 120 + .../Backup1/TriStateTreeView.resx | 166 + .../Controls/FileSystemTriStateTreeView.cs | 158 + .../TriStateTreeViewDemo/Form1.cs | 213 ++ .../TriStateTreeViewDemo/Form1.resx | 120 + .../TriStateTreeViewDemo/RBuildModule.cs | 61 + .../TriStateTreeViewDemo/RCWriter.cs | 50 + .../TriStateTreeViewDemo.csproj | 124 + .../TriStateTreeViewDemo.csproj.user | 5 + .../TriStateTreeViewDemo.suo | Bin 0 -> 2560 bytes .../TriStateTreeViewDemo/UpgradeLog.XML | 14 + .../TriStateTreeViewDemo/UpgradeLog2.XML | 14 + .../_UpgradeReport_Files/UpgradeReport.css | 207 ++ .../_UpgradeReport_Files/UpgradeReport.xslt | 232 ++ .../UpgradeReport_Minus.gif | Bin 0 -> 69 bytes .../UpgradeReport_Plus.gif | Bin 0 -> 71 bytes .../TriStateTreeViewTests/NUnit/.gitignore | 0 .../TriStateTreeViewTests.cs | 258 ++ .../TriStateTreeViewTests.csproj | 110 + reactos/tools/sysgen/style.css | 105 + 386 files changed, 35340 insertions(+) create mode 100644 reactos/tools/sysgen/FileSystemTreeView/App.ico create mode 100644 reactos/tools/sysgen/FileSystemTreeView/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/App.ico create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.cs create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.csproj create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.csproj.user create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.resx create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/Form1.cs create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/Form1.resx create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/ShellIcon.cs create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Backup/icons/folder.ico create mode 100644 reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.cs create mode 100644 reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.csproj create mode 100644 reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.csproj.user create mode 100644 reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.resx create mode 100644 reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.suo create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Form1.cs create mode 100644 reactos/tools/sysgen/FileSystemTreeView/Form1.resx create mode 100644 reactos/tools/sysgen/FileSystemTreeView/ShellIcon.cs create mode 100644 reactos/tools/sysgen/FileSystemTreeView/UpgradeLog.XML create mode 100644 reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport.css create mode 100644 reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport.xslt create mode 100644 reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport_Minus.gif create mode 100644 reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport_Plus.gif create mode 100644 reactos/tools/sysgen/FileSystemTreeView/bin/Debug/DirectoryTreeView.exe create mode 100644 reactos/tools/sysgen/FileSystemTreeView/bin/Debug/DirectoryTreeView.pdb create mode 100644 reactos/tools/sysgen/FileSystemTreeView/bin/Debug/DirectoryTreeView.vshost.exe create mode 100644 reactos/tools/sysgen/FileSystemTreeView/icons/folder.ico create mode 100644 reactos/tools/sysgen/RosBuilder/Controls/CatalogTriStateTreeView.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Controls/ModuleFiltersListView.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Controls/NewItemListView.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Controls/PlatformTreeView.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Controls/ProjectTreeView.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.Designer.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.resx create mode 100644 reactos/tools/sysgen/RosBuilder/Form1.Designer.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Form1.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Form1.resx create mode 100644 reactos/tools/sysgen/RosBuilder/Inspectors/PlatformInspector.cs create mode 100644 reactos/tools/sysgen/RosBuilder/MainForm.Designer.cs create mode 100644 reactos/tools/sysgen/RosBuilder/MainForm.cs create mode 100644 reactos/tools/sysgen/RosBuilder/MainForm.resx create mode 100644 reactos/tools/sysgen/RosBuilder/ModuleFilter.cs create mode 100644 reactos/tools/sysgen/RosBuilder/NewItemForm.Designer.cs create mode 100644 reactos/tools/sysgen/RosBuilder/NewItemForm.cs create mode 100644 reactos/tools/sysgen/RosBuilder/NewItemForm.resx create mode 100644 reactos/tools/sysgen/RosBuilder/PlatformCatalogReader.cs create mode 100644 reactos/tools/sysgen/RosBuilder/PlatformController.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Program.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Project/Project.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Project/ProjectReader.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Project/ProjectWriter.cs create mode 100644 reactos/tools/sysgen/RosBuilder/ProjectController.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Properties/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Properties/Resources.Designer.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Properties/Resources.resx create mode 100644 reactos/tools/sysgen/RosBuilder/Properties/Settings.Designer.cs create mode 100644 reactos/tools/sysgen/RosBuilder/Properties/Settings.settings create mode 100644 reactos/tools/sysgen/RosBuilder/SysGen.Designer.csproj create mode 100644 reactos/tools/sysgen/RosBuilder/SysGen.Designer.csproj.user create mode 100644 reactos/tools/sysgen/RosBuilder/Util/FileAssociation.cs create mode 100644 reactos/tools/sysgen/RosFramework/Base/RBuildElement.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildAPIStatusCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildAuthorCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildBuildFamilyCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildContributorCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildDebugChannelCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildDefineCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildExportedFunctionsCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildFamilyCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildFileCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildFolderCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildIncludeFolderCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildInstallFolderCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildLanguageCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildLocalizationFileCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildModuleCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildModuleInfoCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildPlatformFileCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildPropertyCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Collections/RBuildSourceFileCollection.cs create mode 100644 reactos/tools/sysgen/RosFramework/Interfaces/IRBuildInstallable.cs create mode 100644 reactos/tools/sysgen/RosFramework/Interfaces/IRBuildModulesContainer.cs create mode 100644 reactos/tools/sysgen/RosFramework/Interfaces/IRBuildNamed.cs create mode 100644 reactos/tools/sysgen/RosFramework/Interfaces/IRBuildSourceFilesContainer.cs create mode 100644 reactos/tools/sysgen/RosFramework/Misc/Utility.cs create mode 100644 reactos/tools/sysgen/RosFramework/NotImplementedYet/RBuildModuleGroup.cs create mode 100644 reactos/tools/sysgen/RosFramework/NotImplementedYet/RBuildPatch.cs create mode 100644 reactos/tools/sysgen/RosFramework/Obsolete/PlatformCatalog.cs create mode 100644 reactos/tools/sysgen/RosFramework/Obsolete/RosArchitecture.cs create mode 100644 reactos/tools/sysgen/RosFramework/Obsolete/RosOSImage.cs create mode 100644 reactos/tools/sysgen/RosFramework/Obsolete/RosPlatform.cs create mode 100644 reactos/tools/sysgen/RosFramework/Obsolete/SoftwareCatalog.cs create mode 100644 reactos/tools/sysgen/RosFramework/Properties/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildAPIInfo.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildAuthor.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildAutoRegister.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildBootstrapFile.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildBuildFamily.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildCDFile.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildCDFileBase.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildCompilationUnit.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildContributor.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildDebugChannel.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildExportFunction.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildFamily.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildFile.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildImportLibrary.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildInfInstallerFile.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildInstallFile.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildInstallFolder.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildLanguage.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildLocalizationFile.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildMetadata.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildModule.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildModuleGroup.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildModuleInfo.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildPlatform.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildPlatformFile.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildProject.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildProperty.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildRegistryKey.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildSetup.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildSetupFile.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildSolution.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildTarget.cs create mode 100644 reactos/tools/sysgen/RosFramework/RBuildUnAttendSetup.cs create mode 100644 reactos/tools/sysgen/RosFramework/SysGen.RBuild.Framework.csproj create mode 100644 reactos/tools/sysgen/RosFramework/SysGen.RBuild.Framework.csproj.user create mode 100644 reactos/tools/sysgen/SYSGen/Backends/Backend.cs create mode 100644 reactos/tools/sysgen/SYSGen/Backends/Catalog/CatalogBackend.cs create mode 100644 reactos/tools/sysgen/SYSGen/Backends/Mingw/MingwBackend.cs create mode 100644 reactos/tools/sysgen/SYSGen/Program.cs create mode 100644 reactos/tools/sysgen/SYSGen/Properties/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/SYSGen/SYSGen.csproj create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/BuildElementArrayAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/BuildElementAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/ElementNameAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/FunctionAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/FunctionSetAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskAttributeAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskFileSetAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskNameAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskOptionSetAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskPropertyAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskValueAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/Base/ValidatorAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/BooleanValidatorAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/Int32ValidatorAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/StringValidatorAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/UriValidatorAttribute.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/APIDocumentation/APIDocumentation.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/Backend.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/CompilerBaseBacked.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/HtmlDocumenterBaseBacked.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/BaseAddress/BaseAddressReportBackend.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/BuildLogReport/BuildLogReport.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Catalog/CatalogBackend.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Html/HtmlBackend.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/MSVisualStudio/MSVisualStudio.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/MSVisualStudio/VisualStudio/Solution.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/CompilableFile.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/MingwBackend.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/MingwRBuildElementHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/Misc/MakefileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/Base/MingwRBuildModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBootLoaderModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBootSectorModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBuildToolModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwCabinetModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwEmbeddedTypeLibModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwHostStaticLibraryModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwIdlHeaderModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModeDLLModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModeDriverModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwMessageHeaderModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwNativeCUIModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwNativeDLLModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwObjectLibraryModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwPackageModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRBuildProjectHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcClientHeaderModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcProxyModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcServerHeaderModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwStaticLibraryModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32CUIModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32DLLModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32GUIModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32OCXModuleHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/TargetsHandlers/Base/MingwRBuildTargetHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/ProjectTreeReport/ProjectTreeReport.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/RBuildDB/RBuildDBBackend.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/RGenStats/RGenStatBackend.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Backends/WarningReport/WarningReport.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Collections/BackendCollection.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Collections/DefineCollection.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Collections/FileHandlerCollection.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Collections/LogListenerCollection.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Collections/TaskBuilderCollection.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Collections/TaskCollection.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Elements/Base/Element.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Exceptions/BuildException.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Exceptions/ValidationException.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedCFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedInfFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/BuildNumberFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/CompilationUnitFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/DefinitionFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/DffFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/HeaderCreditsFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/HeaderRosCfgFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/SysSetupComponentSetupFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/SysSetupFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtCreditsFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtSetupFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtSetupHiveFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/UnAttendSetupFileWriter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Handlers/SysSetupFileHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IBuildStatusMailReporter.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IDirectory.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IElement.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IFileHandler.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IRBuildInstallable.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ISysGenObject.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ITask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ITaskContainer.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Location.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/LocationMap.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Log/Log.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/ConsoleLogger.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/StringLogger.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/XmlLogger.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Plugins/TaskBuilder.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Plugins/TaskFactory.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Properties/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/SysGen.Framework.csproj create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/SysGen.Framework.csproj.user create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/SysGenConversion.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/SysGenDependencyTracker.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/SysGenEngine.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/SysGenPathResolver.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/Base/Task.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/Base/TaskContainer.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Build/XIFallbackTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Build/XIIncludeTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Logic/IfNotTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Logic/IfTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoFilesTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoInstallFilesTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoManifest.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoRegisterTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoResource.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/AuthorBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/AutoFilesTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/CDFileBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FileBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FileSystemInfoBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FolderBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/PlatformFileBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/PropertyBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/RbuildElementBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/ValueBaseTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BaseAdressTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootSector.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootstrapFileTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootstrapTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BuildFamilyTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CDFileTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CompilationUnitTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CompilerFlagTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ComponentTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ContributorTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DebugChannelTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DefineTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DependencyTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DeveloperTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DirectoryTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/FamilyTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/FileTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/GroupTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ImportLibraryTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/IncludeTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstalFolder.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallComponent.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallFileTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallWallPaperFileTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LanguageTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LibraryTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LinkerFlagTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LinkerScriptTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LocalizationTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/MantainterTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/MetadataTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleStateTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/BuildTool.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Cabinet.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Kernel.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/KernelModeDLL.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/KernelModeDriver.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/NativeCUI.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/NativeDLL.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/ObjectLibrary.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Package.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/StaticLibrary.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32CUI.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32Dll.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32GUI.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32OCX.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32SCR.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/OverrideModuleTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/PCHTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformAutorunTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformDebugChannelTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformDescriptionTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformLanguageTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformModuleTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformNameTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformScreenSaverTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformShellTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformWallpaperTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ProjectTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/PropertyTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/RBuildTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ReDefineTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/RequiresTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/SetupTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/TargetTask.cs create mode 100644 reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/WallPaperTask.cs create mode 100644 reactos/tools/sysgen/SysGen.Make/Program.cs create mode 100644 reactos/tools/sysgen/SysGen.Make/Properties/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/SysGen.Make/SysGen.Make.csproj create mode 100644 reactos/tools/sysgen/SysGen.Make/SysGen.Make.csproj.user create mode 100644 reactos/tools/sysgen/SysGen.Make/SysGen.Make.sln create mode 100644 reactos/tools/sysgen/SysGen.Make/SysGen.Make.suo create mode 100644 reactos/tools/sysgen/SysGen.Make/SysGen.Make/Program.cs create mode 100644 reactos/tools/sysgen/SysGen.Make/SysGen.Make/Properties/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/SysGen.Make/SysGen.Make/SysGen.Make.csproj create mode 100644 reactos/tools/sysgen/SysGen.RBuild.IRCBot/Collections/CommandCollection.cs create mode 100644 reactos/tools/sysgen/SysGen.RBuild.IRCBot/Commands/Base/Command.cs create mode 100644 reactos/tools/sysgen/SysGen.RBuild.IRCBot/Commands/WhoIsCommand.cs create mode 100644 reactos/tools/sysgen/SysGen.RBuild.IRCBot/Properties/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/SysGen.RBuild.IRCBot/SysGen.RBuild.IRCBot.csproj create mode 100644 reactos/tools/sysgen/SysGen.RBuild.IRCBot/cIRC.cs create mode 100644 reactos/tools/sysgen/SysGen.sln create mode 100644 reactos/tools/sysgen/TriStateTreeView/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/LICENSING.txt create mode 100644 reactos/tools/sysgen/TriStateTreeView/License_CPLv05.txt create mode 100644 reactos/tools/sysgen/TriStateTreeView/License_GPLv2.txt create mode 100644 reactos/tools/sysgen/TriStateTreeView/License_LGPLv21.txt create mode 100644 reactos/tools/sysgen/TriStateTreeView/SysGen.sln create mode 100644 reactos/tools/sysgen/TriStateTreeView/SysGen.suo create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.csproj create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.resx create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/App.ico create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/App.ico create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/Form1.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/Form1.resx create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/TriStateTreeViewDemo.csproj create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/AssemblyInfo.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.csproj create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.resx create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Controls/FileSystemTriStateTreeView.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Form1.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Form1.resx create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/RBuildModule.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/RCWriter.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.csproj create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.csproj.user create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.suo create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/UpgradeLog.XML create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/UpgradeLog2.XML create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport.css create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport.xslt create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport_Minus.gif create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport_Plus.gif create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/NUnit/.gitignore create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/TriStateTreeViewTests.cs create mode 100644 reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/TriStateTreeViewTests.csproj create mode 100644 reactos/tools/sysgen/style.css diff --git a/reactos/tools/sysgen/FileSystemTreeView/App.ico b/reactos/tools/sysgen/FileSystemTreeView/App.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a5525fd794f7a7c5c8e6187f470ea3af38cd2b6 GIT binary patch literal 1078 zcmeHHJr05}7=1t!Hp3A*8IHkVf+j?-!eHY14Gtcw1Eb*_9>Bq^zETJ@GKj{_2j4$w zo9}xCh!8{T3=X##Skq>ikMjsvB|y%crWBM2iW(4pI}c%z6%lW!=~4v77#3{z!dmB1 z__&l)-{KUYR+|8|;wB^R|9ET$J@(@=#rd^=)qs85?vAy(PSF5CyNkus435LVkZ$rj zNw|JG-P7^hF<(;#o*Vk}5R#e|^13tBbQkeF?djULtvqyxd3<{9 literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/FileSystemTreeView/AssemblyInfo.cs b/reactos/tools/sysgen/FileSystemTreeView/AssemblyInfo.cs new file mode 100644 index 00000000000..9f89a3282c5 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/App.ico b/reactos/tools/sysgen/FileSystemTreeView/Backup/App.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a5525fd794f7a7c5c8e6187f470ea3af38cd2b6 GIT binary patch literal 1078 zcmeHHJr05}7=1t!Hp3A*8IHkVf+j?-!eHY14Gtcw1Eb*_9>Bq^zETJ@GKj{_2j4$w zo9}xCh!8{T3=X##Skq>ikMjsvB|y%crWBM2iW(4pI}c%z6%lW!=~4v77#3{z!dmB1 z__&l)-{KUYR+|8|;wB^R|9ET$J@(@=#rd^=)qs85?vAy(PSF5CyNkus435LVkZ$rj zNw|JG-P7^hF<(;#o*Vk}5R#e|^13tBbQkeF?djULtvqyxd3<{9 literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/AssemblyInfo.cs b/reactos/tools/sysgen/FileSystemTreeView/Backup/AssemblyInfo.cs new file mode 100644 index 00000000000..9f89a3282c5 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Backup/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.cs b/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.cs new file mode 100644 index 00000000000..e6c055e9b12 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.cs @@ -0,0 +1,201 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.ComponentModel; +using System.Collections; +using System.Drawing; + +namespace C2C.FileSystem +{ + /// + /// Summary description for DirectoryTreeView. + /// + /// + + public class FileSystemTreeView : TreeView + { + private bool _showFiles = true; + private ImageList _imageList = new ImageList(); + private Hashtable _systemIcons = new Hashtable(); + + public static readonly int Folder = 0; + + public FileSystemTreeView() + { + this.ImageList = _imageList; + this.MouseDown += new MouseEventHandler(FileSystemTreeView_MouseDown); + this.BeforeExpand += new TreeViewCancelEventHandler(FileSystemTreeView_BeforeExpand); + } + + void FileSystemTreeView_MouseDown(object sender, MouseEventArgs e) + { + TreeNode node = this.GetNodeAt(e.X, e.Y); + + if (node == null) + return; + + this.SelectedNode = node; //select the node under the mouse + } + + void FileSystemTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) + { + if( e.Node is FileNode ) return; + + DirectoryNode node = (DirectoryNode)e.Node; + + if (!node.Loaded) + { + node.Nodes[0].Remove(); //remove the fake child node used for virtualization + node.LoadDirectory(); + if( this._showFiles == true ) + node.LoadFiles(); + } + } + + public void Load( string directoryPath ) + { + if( Directory.Exists( directoryPath ) == false ) + throw new DirectoryNotFoundException( "Directory Not Found" ); + + _systemIcons.Clear(); + _imageList.Images.Clear(); + Nodes.Clear(); + + Icon folderIcon = new Icon( typeof( FileSystemTreeView ), "icons.folder.ico"); + + _imageList.Images.Add( folderIcon ); + _systemIcons.Add( FileSystemTreeView.Folder, 0 ); + + DirectoryNode node = new DirectoryNode( this, new DirectoryInfo( directoryPath ) ); + node.Expand(); + } + + public int GetIconImageIndex( string path ) + { + string extension = Path.GetExtension( path ); + + if( _systemIcons.ContainsKey( extension ) == false ) + { + Icon icon = ShellIcon.GetSmallIcon( path ); + _imageList.Images.Add( icon ); + _systemIcons.Add( extension, _imageList.Images.Count-1 ); + } + + return (int)_systemIcons[ Path.GetExtension( path )]; + } + + public bool ShowFiles + { + get{ return this._showFiles; } + set{ this._showFiles = value; } + } + } + + public class DirectoryNode : TreeNode + { + private DirectoryInfo _directoryInfo; + + public DirectoryNode( DirectoryNode parent, DirectoryInfo directoryInfo ) : base( directoryInfo.Name ) + { + this._directoryInfo = directoryInfo; + + this.ImageIndex = FileSystemTreeView.Folder; + this.SelectedImageIndex = this.ImageIndex; + + parent.Nodes.Add( this ); + + Virtualize(); + } + + public DirectoryNode( FileSystemTreeView treeView, DirectoryInfo directoryInfo ) : base( directoryInfo.Name ) + { + this._directoryInfo = directoryInfo; + + this.ImageIndex = FileSystemTreeView.Folder; + this.SelectedImageIndex = this.ImageIndex; + + treeView.Nodes.Add( this ); + + Virtualize(); + + } + + void Virtualize() + { + int fileCount = 0; + + try + { + if( this.TreeView.ShowFiles == true ) + fileCount = this._directoryInfo.GetFiles().Length; + + if( (fileCount + this._directoryInfo.GetDirectories().Length) > 0 ) + new FakeChildNode( this ); + } + catch + { + } + } + + public void LoadDirectory() + { + foreach( DirectoryInfo directoryInfo in _directoryInfo.GetDirectories() ) + { + new DirectoryNode( this, directoryInfo ); + } + } + + public void LoadFiles() + { + foreach( FileInfo file in _directoryInfo.GetFiles() ) + { + new FileNode( this, file ); + } + } + + public bool Loaded + { + get + { + if( this.Nodes.Count != 0 ) + { + if( this.Nodes[0] is FakeChildNode ) + return false; + } + + return true; + } + } + + public new FileSystemTreeView TreeView + { + get{ return (FileSystemTreeView)base.TreeView; } + } + } + + public class FileNode : TreeNode + { + private FileInfo _fileInfo; + private DirectoryNode _directoryNode; + + public FileNode( DirectoryNode directoryNode, FileInfo fileInfo ) : base( fileInfo.Name ) + { + this._directoryNode = directoryNode; + this._fileInfo = fileInfo; + + this.ImageIndex = ((FileSystemTreeView)_directoryNode.TreeView).GetIconImageIndex( _fileInfo.FullName ); + this.SelectedImageIndex = this.ImageIndex; + + _directoryNode.Nodes.Add( this ); + } + } + + public class FakeChildNode : TreeNode + { + public FakeChildNode( TreeNode parent ) : base() + { + parent.Nodes.Add( this ); + } + } + +} diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.csproj b/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.csproj new file mode 100644 index 00000000000..ccafd2eb14c --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.csproj @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.csproj.user b/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.csproj.user new file mode 100644 index 00000000000..69ac1936f52 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.csproj.user @@ -0,0 +1,48 @@ + + + + + + + + + + + + diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.resx b/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.resx new file mode 100644 index 00000000000..3f337e081da --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Backup/FileSystemTreeView.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/Form1.cs b/reactos/tools/sysgen/FileSystemTreeView/Backup/Form1.cs new file mode 100644 index 00000000000..b825eb838c0 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Backup/Form1.cs @@ -0,0 +1,178 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; +using C2C.FileSystem; + +namespace DirectoryTreeView +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TextBox txtDirectory; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button btnDirectory; + private C2C.FileSystem.FileSystemTreeView tree; + private System.Windows.Forms.Panel treePanel; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.btnDirectory = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.txtDirectory = new System.Windows.Forms.TextBox(); + this.treePanel = new System.Windows.Forms.Panel(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.Controls.Add(this.btnDirectory); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.txtDirectory); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(721, 57); + this.panel1.TabIndex = 0; + // + // btnDirectory + // + this.btnDirectory.Location = new System.Drawing.Point(615, 27); + this.btnDirectory.Name = "btnDirectory"; + this.btnDirectory.Size = new System.Drawing.Size(30, 21); + this.btnDirectory.TabIndex = 2; + this.btnDirectory.Text = "..."; + this.btnDirectory.Click += new System.EventHandler(this.btnDirectory_Click); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(9, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(102, 18); + this.label1.TabIndex = 1; + this.label1.Text = "Directory:"; + // + // txtDirectory + // + this.txtDirectory.Location = new System.Drawing.Point(9, 27); + this.txtDirectory.Name = "txtDirectory"; + this.txtDirectory.Size = new System.Drawing.Size(603, 20); + this.txtDirectory.TabIndex = 0; + this.txtDirectory.Text = ""; + this.txtDirectory.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtDirectory_KeyDown); + this.txtDirectory.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtDirectory_KeyPress); + // + // treePanel + // + this.treePanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.treePanel.Location = new System.Drawing.Point(0, 57); + this.treePanel.Name = "treePanel"; + this.treePanel.Size = new System.Drawing.Size(721, 530); + this.treePanel.TabIndex = 1; + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(721, 587); + this.Controls.Add(this.treePanel); + this.Controls.Add(this.panel1); + this.Name = "Form1"; + this.Text = "Demo Application"; + this.Load += new System.EventHandler(this.Form1_Load); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.Run(new Form1()); + } + + private void Form1_Load(object sender, System.EventArgs e) + { + tree = new C2C.FileSystem.FileSystemTreeView(); + treePanel.Controls.Add( tree ); + tree.Dock = DockStyle.Fill; + //tree.ShowFiles = false; + } + + + private void btnDirectory_Click(object sender, System.EventArgs e) + { + FolderBrowserDialog dlg = new FolderBrowserDialog(); + + if( dlg.ShowDialog() == DialogResult.OK ) + { + txtDirectory.Text = dlg.SelectedPath; + tree.Load( txtDirectory.Text ); + } + } + + private void txtDirectory_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) + { + + + } + + private void txtDirectory_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) + { + if( e.KeyData == Keys.Enter ) + { + if( System.IO.Directory.Exists( txtDirectory.Text ) == false ) + { + MessageBox.Show( "Directory Does Not Exist", "Invalid Directory", MessageBoxButtons.OK, MessageBoxIcon.Information ); + return; + } + tree.Load( txtDirectory.Text ); + } + } + } +} diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/Form1.resx b/reactos/tools/sysgen/FileSystemTreeView/Backup/Form1.resx new file mode 100644 index 00000000000..161c002f2c3 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Backup/Form1.resx @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + True + + + Private + + + 3, 3 + + + True + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + True + + + Private + + + 3, 3 + + + True + + + Private + + + False + + + (Default) + + + False + + + False + + + 3, 3 + + + True + + + 80 + + + Form1 + + + True + + + Private + + \ No newline at end of file diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/ShellIcon.cs b/reactos/tools/sysgen/FileSystemTreeView/Backup/ShellIcon.cs new file mode 100644 index 00000000000..6dd9f867916 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Backup/ShellIcon.cs @@ -0,0 +1,79 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; + +namespace C2C.FileSystem +{ + /// + /// Summary description for ShellIcon. + /// + /// + /// Summary description for ShellIcon. Get a small or large Icon with an easy C# function call + /// that returns a 32x32 or 16x16 System.Drawing.Icon depending on which function you call + /// either GetSmallIcon(string fileName) or GetLargeIcon(string fileName) + /// + public class ShellIcon + { + [StructLayout(LayoutKind.Sequential)] + public struct SHFILEINFO + { + public IntPtr hIcon; + public IntPtr iIcon; + public uint dwAttributes; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string szDisplayName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] + public string szTypeName; + }; + + + class Win32 + { + public const uint SHGFI_ICON = 0x100; + public const uint SHGFI_LARGEICON = 0x0; // 'Large icon + public const uint SHGFI_SMALLICON = 0x1; // 'Small icon + + + [DllImport("shell32.dll")] + public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); + } + + + public ShellIcon() + { + // + // TODO: Add constructor logic here + // + } + + + public static Icon GetSmallIcon(string fileName) + { + IntPtr hImgSmall; //the handle to the system image list + SHFILEINFO shinfo = new SHFILEINFO(); + + + //Use this to get the small Icon + hImgSmall = Win32.SHGetFileInfo(fileName, 0, ref shinfo,(uint)Marshal.SizeOf(shinfo),Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON); + + + //The icon is returned in the hIcon member of the shinfo struct + return System.Drawing.Icon.FromHandle(shinfo.hIcon); + } + + + public static Icon GetLargeIcon(string fileName) + { + IntPtr hImgLarge; //the handle to the system image list + SHFILEINFO shinfo = new SHFILEINFO(); + + + //Use this to get the large Icon + hImgLarge = Win32.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON); + + + //The icon is returned in the hIcon member of the shinfo struct + return System.Drawing.Icon.FromHandle(shinfo.hIcon); + } + } +} diff --git a/reactos/tools/sysgen/FileSystemTreeView/Backup/icons/folder.ico b/reactos/tools/sysgen/FileSystemTreeView/Backup/icons/folder.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9e4b0b4a38001b92f3820c44b00a942347f8889 GIT binary patch literal 1406 zcmeH{Jr2S!4255u{$}dL%*ZWZgW zSJ~0$)`{av1{9yF0)2s13XA|uXbfRYb8)Ac@=NTNN7U=u$4*a+#n}Se3ozf{@UUoZ z4el=sYZ)IjbYSSfUv)sFh$Jdf7#zHD<^)wB@1^t1vDUhzxU}rZspSC9hxdVv>DXtN z#+W$&!(aRN=jYr{x}Op16AASttW3PXx^$BA%a%hzhjJzFL+rPA^HbBNv>lBj@eN@5 B9CiQz literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.cs b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.cs new file mode 100644 index 00000000000..f3da9388b71 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.cs @@ -0,0 +1,202 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.ComponentModel; +using System.Collections; +using System.Drawing; + +namespace C2C.FileSystem +{ + /// + /// Summary description for DirectoryTreeView. + /// + /// + + public class FileSystemTreeView : TreeView + { + private bool _showFiles = true; + private ImageList _imageList = new ImageList(); + private Hashtable _systemIcons = new Hashtable(); + + public static readonly int Folder = 0; + + public FileSystemTreeView() + { + this.CheckBoxes = true; + this.ImageList = _imageList; + this.MouseDown += new MouseEventHandler(FileSystemTreeView_MouseDown); + this.BeforeExpand += new TreeViewCancelEventHandler(FileSystemTreeView_BeforeExpand); + } + + void FileSystemTreeView_MouseDown(object sender, MouseEventArgs e) + { + TreeNode node = this.GetNodeAt(e.X, e.Y); + + if (node == null) + return; + + this.SelectedNode = node; //select the node under the mouse + } + + void FileSystemTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) + { + if( e.Node is FileNode ) return; + + DirectoryNode node = (DirectoryNode)e.Node; + + if (!node.Loaded) + { + node.Nodes[0].Remove(); //remove the fake child node used for virtualization + node.LoadDirectory(); + if( this._showFiles == true ) + node.LoadFiles(); + } + } + + public void Load( string directoryPath ) + { + if( Directory.Exists( directoryPath ) == false ) + throw new DirectoryNotFoundException( "Directory Not Found" ); + + _systemIcons.Clear(); + _imageList.Images.Clear(); + Nodes.Clear(); + + Icon folderIcon = new Icon( typeof( FileSystemTreeView ), "icons.folder.ico"); + + _imageList.Images.Add( folderIcon ); + _systemIcons.Add( FileSystemTreeView.Folder, 0 ); + + DirectoryNode node = new DirectoryNode( this, new DirectoryInfo( directoryPath ) ); + node.Expand(); + } + + public int GetIconImageIndex( string path ) + { + string extension = Path.GetExtension( path ); + + if( _systemIcons.ContainsKey( extension ) == false ) + { + Icon icon = ShellIcon.GetSmallIcon( path ); + _imageList.Images.Add( icon ); + _systemIcons.Add( extension, _imageList.Images.Count-1 ); + } + + return (int)_systemIcons[ Path.GetExtension( path )]; + } + + public bool ShowFiles + { + get{ return this._showFiles; } + set{ this._showFiles = value; } + } + } + + public class DirectoryNode : TreeNode + { + private DirectoryInfo _directoryInfo; + + public DirectoryNode( DirectoryNode parent, DirectoryInfo directoryInfo ) : base( directoryInfo.Name ) + { + this._directoryInfo = directoryInfo; + + this.ImageIndex = FileSystemTreeView.Folder; + this.SelectedImageIndex = this.ImageIndex; + + parent.Nodes.Add( this ); + + Virtualize(); + } + + public DirectoryNode( FileSystemTreeView treeView, DirectoryInfo directoryInfo ) : base( directoryInfo.Name ) + { + this._directoryInfo = directoryInfo; + + this.ImageIndex = FileSystemTreeView.Folder; + this.SelectedImageIndex = this.ImageIndex; + + treeView.Nodes.Add( this ); + + Virtualize(); + + } + + void Virtualize() + { + int fileCount = 0; + + try + { + if( this.TreeView.ShowFiles == true ) + fileCount = this._directoryInfo.GetFiles().Length; + + if( (fileCount + this._directoryInfo.GetDirectories().Length) > 0 ) + new FakeChildNode( this ); + } + catch + { + } + } + + public void LoadDirectory() + { + foreach( DirectoryInfo directoryInfo in _directoryInfo.GetDirectories() ) + { + new DirectoryNode( this, directoryInfo ); + } + } + + public void LoadFiles() + { + foreach( FileInfo file in _directoryInfo.GetFiles() ) + { + new FileNode( this, file ); + } + } + + public bool Loaded + { + get + { + if( this.Nodes.Count != 0 ) + { + if( this.Nodes[0] is FakeChildNode ) + return false; + } + + return true; + } + } + + public new FileSystemTreeView TreeView + { + get{ return (FileSystemTreeView)base.TreeView; } + } + } + + public class FileNode : TreeNode + { + private FileInfo _fileInfo; + private DirectoryNode _directoryNode; + + public FileNode( DirectoryNode directoryNode, FileInfo fileInfo ) : base( fileInfo.Name ) + { + this._directoryNode = directoryNode; + this._fileInfo = fileInfo; + + this.ImageIndex = ((FileSystemTreeView)_directoryNode.TreeView).GetIconImageIndex( _fileInfo.FullName ); + this.SelectedImageIndex = this.ImageIndex; + + _directoryNode.Nodes.Add( this ); + } + } + + public class FakeChildNode : TreeNode + { + public FakeChildNode( TreeNode parent ) : base() + { + parent.Nodes.Add( this ); + } + } + +} diff --git a/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.csproj b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.csproj new file mode 100644 index 00000000000..66d811ad0ab --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.csproj @@ -0,0 +1,124 @@ + + + Local + 8.0.50727 + 2.0 + {83281176-6B39-4EB8-8CDC-82F018DEED68} + Debug + AnyCPU + App.ico + + + DirectoryTreeView + + + JScript + Grid + IE50 + false + WinExe + C2C.FileSystem + OnBuildSuccess + + + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + System.DirectoryServices + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + + Code + + + Component + + + Form + + + Code + + + FileSystemTreeView.cs + + + Form1.cs + + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.csproj.user b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.csproj.user new file mode 100644 index 00000000000..d9bb8387dbc --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.csproj.user @@ -0,0 +1,58 @@ + + + 7.10.3077 + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.resx b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.resx new file mode 100644 index 00000000000..3f337e081da --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.suo b/reactos/tools/sysgen/FileSystemTreeView/FileSystemTreeView.suo new file mode 100644 index 0000000000000000000000000000000000000000..df5e95f4d885bd8c4655ffd0810e2258e0b7a61e GIT binary patch literal 2560 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*3Bx2!nwD0|OI~0pkDr|NlQkkbwcn90fxt z1pWfu3W`4%9zsqZbt)A?Ac!F!2um0g7+e|hfOHWzD+eeV3@lxW!J@egAz*c>3}HaIRG>cM kROvA!15IFH*e3V3O&mxMwEeKuK~kV0DW+6El2K$a0k4%X7XSbN literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/FileSystemTreeView/Form1.cs b/reactos/tools/sysgen/FileSystemTreeView/Form1.cs new file mode 100644 index 00000000000..b825eb838c0 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Form1.cs @@ -0,0 +1,178 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; +using C2C.FileSystem; + +namespace DirectoryTreeView +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TextBox txtDirectory; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button btnDirectory; + private C2C.FileSystem.FileSystemTreeView tree; + private System.Windows.Forms.Panel treePanel; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.btnDirectory = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.txtDirectory = new System.Windows.Forms.TextBox(); + this.treePanel = new System.Windows.Forms.Panel(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.Controls.Add(this.btnDirectory); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.txtDirectory); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(721, 57); + this.panel1.TabIndex = 0; + // + // btnDirectory + // + this.btnDirectory.Location = new System.Drawing.Point(615, 27); + this.btnDirectory.Name = "btnDirectory"; + this.btnDirectory.Size = new System.Drawing.Size(30, 21); + this.btnDirectory.TabIndex = 2; + this.btnDirectory.Text = "..."; + this.btnDirectory.Click += new System.EventHandler(this.btnDirectory_Click); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(9, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(102, 18); + this.label1.TabIndex = 1; + this.label1.Text = "Directory:"; + // + // txtDirectory + // + this.txtDirectory.Location = new System.Drawing.Point(9, 27); + this.txtDirectory.Name = "txtDirectory"; + this.txtDirectory.Size = new System.Drawing.Size(603, 20); + this.txtDirectory.TabIndex = 0; + this.txtDirectory.Text = ""; + this.txtDirectory.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtDirectory_KeyDown); + this.txtDirectory.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtDirectory_KeyPress); + // + // treePanel + // + this.treePanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.treePanel.Location = new System.Drawing.Point(0, 57); + this.treePanel.Name = "treePanel"; + this.treePanel.Size = new System.Drawing.Size(721, 530); + this.treePanel.TabIndex = 1; + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(721, 587); + this.Controls.Add(this.treePanel); + this.Controls.Add(this.panel1); + this.Name = "Form1"; + this.Text = "Demo Application"; + this.Load += new System.EventHandler(this.Form1_Load); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.Run(new Form1()); + } + + private void Form1_Load(object sender, System.EventArgs e) + { + tree = new C2C.FileSystem.FileSystemTreeView(); + treePanel.Controls.Add( tree ); + tree.Dock = DockStyle.Fill; + //tree.ShowFiles = false; + } + + + private void btnDirectory_Click(object sender, System.EventArgs e) + { + FolderBrowserDialog dlg = new FolderBrowserDialog(); + + if( dlg.ShowDialog() == DialogResult.OK ) + { + txtDirectory.Text = dlg.SelectedPath; + tree.Load( txtDirectory.Text ); + } + } + + private void txtDirectory_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) + { + + + } + + private void txtDirectory_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) + { + if( e.KeyData == Keys.Enter ) + { + if( System.IO.Directory.Exists( txtDirectory.Text ) == false ) + { + MessageBox.Show( "Directory Does Not Exist", "Invalid Directory", MessageBoxButtons.OK, MessageBoxIcon.Information ); + return; + } + tree.Load( txtDirectory.Text ); + } + } + } +} diff --git a/reactos/tools/sysgen/FileSystemTreeView/Form1.resx b/reactos/tools/sysgen/FileSystemTreeView/Form1.resx new file mode 100644 index 00000000000..161c002f2c3 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/Form1.resx @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + True + + + Private + + + 3, 3 + + + True + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + True + + + Private + + + 3, 3 + + + True + + + Private + + + False + + + (Default) + + + False + + + False + + + 3, 3 + + + True + + + 80 + + + Form1 + + + True + + + Private + + \ No newline at end of file diff --git a/reactos/tools/sysgen/FileSystemTreeView/ShellIcon.cs b/reactos/tools/sysgen/FileSystemTreeView/ShellIcon.cs new file mode 100644 index 00000000000..6dd9f867916 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/ShellIcon.cs @@ -0,0 +1,79 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; + +namespace C2C.FileSystem +{ + /// + /// Summary description for ShellIcon. + /// + /// + /// Summary description for ShellIcon. Get a small or large Icon with an easy C# function call + /// that returns a 32x32 or 16x16 System.Drawing.Icon depending on which function you call + /// either GetSmallIcon(string fileName) or GetLargeIcon(string fileName) + /// + public class ShellIcon + { + [StructLayout(LayoutKind.Sequential)] + public struct SHFILEINFO + { + public IntPtr hIcon; + public IntPtr iIcon; + public uint dwAttributes; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string szDisplayName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] + public string szTypeName; + }; + + + class Win32 + { + public const uint SHGFI_ICON = 0x100; + public const uint SHGFI_LARGEICON = 0x0; // 'Large icon + public const uint SHGFI_SMALLICON = 0x1; // 'Small icon + + + [DllImport("shell32.dll")] + public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); + } + + + public ShellIcon() + { + // + // TODO: Add constructor logic here + // + } + + + public static Icon GetSmallIcon(string fileName) + { + IntPtr hImgSmall; //the handle to the system image list + SHFILEINFO shinfo = new SHFILEINFO(); + + + //Use this to get the small Icon + hImgSmall = Win32.SHGetFileInfo(fileName, 0, ref shinfo,(uint)Marshal.SizeOf(shinfo),Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON); + + + //The icon is returned in the hIcon member of the shinfo struct + return System.Drawing.Icon.FromHandle(shinfo.hIcon); + } + + + public static Icon GetLargeIcon(string fileName) + { + IntPtr hImgLarge; //the handle to the system image list + SHFILEINFO shinfo = new SHFILEINFO(); + + + //Use this to get the large Icon + hImgLarge = Win32.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON); + + + //The icon is returned in the hIcon member of the shinfo struct + return System.Drawing.Icon.FromHandle(shinfo.hIcon); + } + } +} diff --git a/reactos/tools/sysgen/FileSystemTreeView/UpgradeLog.XML b/reactos/tools/sysgen/FileSystemTreeView/UpgradeLog.XML new file mode 100644 index 00000000000..e913238577e --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/UpgradeLog.XML @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport.css b/reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport.css new file mode 100644 index 00000000000..fae98af0a86 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport.css @@ -0,0 +1,207 @@ +BODY +{ + BACKGROUND-COLOR: white; + FONT-FAMILY: "Verdana", sans-serif; + FONT-SIZE: 100%; + MARGIN-LEFT: 0px; + MARGIN-TOP: 0px +} +P +{ + FONT-FAMILY: "Verdana", sans-serif; + FONT-SIZE: 70%; + LINE-HEIGHT: 12pt; + MARGIN-BOTTOM: 0px; + MARGIN-LEFT: 10px; + MARGIN-TOP: 10px +} +.note +{ + BACKGROUND-COLOR: #ffffff; + COLOR: #336699; + FONT-FAMILY: "Verdana", sans-serif; + FONT-SIZE: 100%; + MARGIN-BOTTOM: 0px; + MARGIN-LEFT: 0px; + MARGIN-TOP: 0px; + PADDING-RIGHT: 10px +} +.infotable +{ + BACKGROUND-COLOR: #f0f0e0; + BORDER-BOTTOM: #ffffff 0px solid; + BORDER-COLLAPSE: collapse; + BORDER-LEFT: #ffffff 0px solid; + BORDER-RIGHT: #ffffff 0px solid; + BORDER-TOP: #ffffff 0px solid; + FONT-SIZE: 70%; + MARGIN-LEFT: 10px +} +.issuetable +{ + BACKGROUND-COLOR: #ffffe8; + BORDER-COLLAPSE: collapse; + COLOR: #000000; + FONT-SIZE: 100%; + MARGIN-BOTTOM: 10px; + MARGIN-LEFT: 13px; + MARGIN-TOP: 0px +} +.issuetitle +{ + BACKGROUND-COLOR: #ffffff; + BORDER-BOTTOM: #dcdcdc 1px solid; + BORDER-TOP: #dcdcdc 1px; + COLOR: #003366; + FONT-WEIGHT: normal +} +.header +{ + BACKGROUND-COLOR: #cecf9c; + BORDER-BOTTOM: #ffffff 1px solid; + BORDER-LEFT: #ffffff 1px solid; + BORDER-RIGHT: #ffffff 1px solid; + BORDER-TOP: #ffffff 1px solid; + COLOR: #000000; + FONT-WEIGHT: bold +} +.issuehdr +{ + BACKGROUND-COLOR: #E0EBF5; + BORDER-BOTTOM: #dcdcdc 1px solid; + BORDER-TOP: #dcdcdc 1px solid; + COLOR: #000000; + FONT-WEIGHT: normal +} +.issuenone +{ + BACKGROUND-COLOR: #ffffff; + BORDER-BOTTOM: 0px; + BORDER-LEFT: 0px; + BORDER-RIGHT: 0px; + BORDER-TOP: 0px; + COLOR: #000000; + FONT-WEIGHT: normal +} +.content +{ + BACKGROUND-COLOR: #e7e7ce; + BORDER-BOTTOM: #ffffff 1px solid; + BORDER-LEFT: #ffffff 1px solid; + BORDER-RIGHT: #ffffff 1px solid; + BORDER-TOP: #ffffff 1px solid; + PADDING-LEFT: 3px +} +.issuecontent +{ + BACKGROUND-COLOR: #ffffff; + BORDER-BOTTOM: #dcdcdc 1px solid; + BORDER-TOP: #dcdcdc 1px solid; + PADDING-LEFT: 3px +} +A:link +{ + COLOR: #cc6633; + TEXT-DECORATION: underline +} +A:visited +{ + COLOR: #cc6633; +} +A:active +{ + COLOR: #cc6633; +} +A:hover +{ + COLOR: #cc3300; + TEXT-DECORATION: underline +} +H1 +{ + BACKGROUND-COLOR: #003366; + BORDER-BOTTOM: #336699 6px solid; + COLOR: #ffffff; + FONT-SIZE: 130%; + FONT-WEIGHT: normal; + MARGIN: 0em 0em 0em -20px; + PADDING-BOTTOM: 8px; + PADDING-LEFT: 30px; + PADDING-TOP: 16px +} +H2 +{ + COLOR: #000000; + FONT-SIZE: 80%; + FONT-WEIGHT: bold; + MARGIN-BOTTOM: 3px; + MARGIN-LEFT: 10px; + MARGIN-TOP: 20px; + PADDING-LEFT: 0px +} +H3 +{ + COLOR: #000000; + FONT-SIZE: 80%; + FONT-WEIGHT: bold; + MARGIN-BOTTOM: -5px; + MARGIN-LEFT: 10px; + MARGIN-TOP: 20px +} +H4 +{ + COLOR: #000000; + FONT-SIZE: 70%; + FONT-WEIGHT: bold; + MARGIN-BOTTOM: 0px; + MARGIN-TOP: 15px; + PADDING-BOTTOM: 0px +} +UL +{ + COLOR: #000000; + FONT-SIZE: 70%; + LIST-STYLE: square; + MARGIN-BOTTOM: 0pt; + MARGIN-TOP: 0pt +} +OL +{ + COLOR: #000000; + FONT-SIZE: 70%; + LIST-STYLE: square; + MARGIN-BOTTOM: 0pt; + MARGIN-TOP: 0pt +} +LI +{ + LIST-STYLE: square; + MARGIN-LEFT: 0px +} +.expandable +{ + CURSOR: hand +} +.expanded +{ + color: black +} +.collapsed +{ + DISPLAY: none +} +.foot +{ +BACKGROUND-COLOR: #ffffff; +BORDER-BOTTOM: #cecf9c 1px solid; +BORDER-TOP: #cecf9c 2px solid +} +.settings +{ +MARGIN-LEFT: 25PX; +} +.help +{ +TEXT-ALIGN: right; +margin-right: 10px; +} diff --git a/reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport.xslt b/reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport.xslt new file mode 100644 index 00000000000..83f4304ab60 --- /dev/null +++ b/reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport.xslt @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ Solution: + Project: + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + src + + + + + + + + + + + + +
FilenameStatusErrorsWarnings
+ javascript:document.images[''].click()src + + + + Converted + + + + Converted + +
+ + files + + + 1 file + + + Converted:
+ Not converted +
+
+
+ + + + : + + + + + + + + + Conversion Report + <xsl:if test="Properties/Property[@Name='LogNumber']"> + <xsl:value-of select="Properties/Property[@Name='LogNumber']/@Value"/> + </xsl:if> + + + + +

Conversion Report -

+ +

+ Time of Conversion:
+

+ + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + +
+ Conversion Settings +

+ + +
+
diff --git a/reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport_Minus.gif b/reactos/tools/sysgen/FileSystemTreeView/_UpgradeReport_Files/UpgradeReport_Minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..17751cb2fd5c284dfe984adc4c769982f73a0a66 GIT binary patch literal 69 zcmZ?wbhEHb23ky~TYXIqG7FYlP literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/FileSystemTreeView/bin/Debug/DirectoryTreeView.exe b/reactos/tools/sysgen/FileSystemTreeView/bin/Debug/DirectoryTreeView.exe new file mode 100644 index 0000000000000000000000000000000000000000..c893a8ea1219632646c606c327780e5da4d2a98b GIT binary patch literal 32768 zcmeHQ3wRvGk*=9t%|0y4mTXHhmeCqxBU|>y!ZyZ$!LsCsK$2yzFm^D=EA2>Hyt|{! z?Aj7O6DbcK36~EDkAsjqLLecRO9Bb6JRlAM5;)>7KuEZJJd%)ngyc(rFWdzJXWw7d zvoA^Jec#9Bw$0RZRaaM6S9e$UboYvm4_`(eBJ$!ne36XmI@D{1>`W>YPlZ}HM?y&}W`?Iu4Ib-??pjaO zu6d{;a_5F@X}_WhZHne6>H;OCsGU(aJ}P*n(5EZCnZo)@H~Mu}eXab#S$fv6m$f7nG-H!kT-(GU@8kPCj`n{pUYIBgE6fp<3pAWiD(>J3an zh-g>XcI-Z2qT47U%(DwmL0F6C3fpGF0we26H{fBuAv^_PEz!CHv=l8_pk#rP1xgku zS)gQrk_Ac@C|RInfszGE7WjW;fo1$%jlkcgI+f9_8;KsNCDMQgh>Q~#6AjO0j<**U z>katw41#$v%~)1OD-eUMN~+Qh&B8{5u2)xSzDqgQPzlD6hSUapy&J(QZ6D&^hANQD z8_B=;ZRKa_N63G)(q(b4K6C#xNY)#wMK!$vU*-mDNYGKI58;iyf=cpKAJT%x(z&GX zWB!?fRk)Z{qw1x58epFwa(k9}X+CNqL3d_@x*s<4>dsLd#iux;b2vIhqS!wO?uThW z72XPt?&BO5EF6SI)Ju_$21(z?Lacg8EhMwRNysd`kX&Ph@>#2^oq52lWAY>$#v8Kc z=Lw-lVTk(G4z_24)`C2}+FGa()+aQ;Omm8)G2MpIa?+Ske{}t?TD={dVdE^C}@RAwqyW-(W$QB{T+L5C#_X9?4nDmr(DIoal7q#Dgo z*j`MtKT@C<6QsRDRZy--HBQP_drtjSl@^wQRE{&UIU3OUx#y|g#`)a-<5Hw|s{Utx z5`{OY&SGDluPSPTN~tDmSf*;j*{Urx4`f$2$b0b#E z*jTIYJ3=wg7iIK{lR!B&`{5tq0ZvA?{m=x_Q#cB*2M4tVQD$m5l_R>ok2xC9XBjzU zV1OCUT3`*$SrVif&N?Q+G{`G;@`!JPSFI%7YqcW5YprLV4FEv{j!oH1Z}jU%16;mq z3!Tn|o@L4wm=b~+cuIZdA$E)~uim)cYcV;Eol+gfhjTMP{}35g8_3nx>44T50HDCf z889GMS7rAZ791m+p6%|TYfu(2_+7DWxqs;tJD|~!(+&aW>-*RwRtF1HcCb2G`eq?C zba8wO$A1bLdc#&k?IzBR?c5+dCtFT(7*;p4DR~#n0Qpi_M5`8PVWcC?hi`apZ_`(Z#Y;BK#ad;d%55DnfM_uTJyKu<|;1?m(R;O73IY| zJ!xK@;0*}#48~mpj|eLUpfsQ7lGGr{K)L+D@>T~M%cw?LSG79|=eB1#CPbvUkGsie zYY(CQB#dio&wf>To9xXmsZx{d$>lXGB zjExK6BzR?~(R5f}L%R-wg5szF4>w2%57RlUMYBu@(JN_pa<`E0cGWB4BHp_sw9T}gxRqLSe0UlETM}x?B+?n%T$3_0X*-%&66(tICgOc( zm?PcRZZox}ch#!s%D$B+G_78~!d!OZ>iH83%cRorq?s)}Vy4+n^>|qO^IZNGTmopd zlHm?B*=yR(>9ig1&7@6dNk}og532RMMYY<|z46pQI1)eK%!&`Y#CKE7vgQ3N`&ach zHN{pgi!P5Q-C{N-tlnrMett9!gN9u@wx#;5_toBA&8__3^7cP|(s<;Oi+com(1Dy8F=GH{bKh>n|Q`>aKceR%^{`b8n1zyRUu2JO9PM8rx>x z5*Yg4Z54C2e6!-E$6u=O{8^h``Sd9>uAF;a&88)@7yN$zCztos^{sy{{B-+Mu&S6Zw}wZ(}d@zpsn%}J&(4I;e91& zI}sm7o)vg*M!Eyq7m>CS^n;*b*-q0DuSQxq=vN{BGUyRJ2Z8s4{#C^91^tg$h%Y&o z(lkhM2nu7tYf?W&DMJZRJIJCKQu^_jSh#ahxU^B6!3O(Y+KA*hm_I+BA)63E^7)YR zFXI{7kv~NPC^8CYQVaAurm%>1Xwiqngh+_u!!H50Z$b6iiEO)(6r($kII}RZ6Zw-! zx(f-R!h{IQj^bKJHwwwBdhd9qZd5KxBiPb2p~C>Im8Jt=T39G4%f$7ur6z4q+k*TD zz*Gp=3CqRM_kg8vn%tcddJ}7mmHaOVte)@LpTAAd!bYUeeSK* z@nD^ORB@I<6>dOss5p6Iu{VM#JcMFXZ@bvjuw*`Ze3s(A_tZp|Y?Eet-!ou2s#r>) z@*l&8MyNP>qVk^r(=o+Nll7u`_}EyHmew|L7b#oUw>I#6WIT5AjK%dma3sd@wZ0FG zp~)l`*1aFQEej`OnrMMRur^G_I+-2Hun~1qnugKi-%aoLAv@GMQue|c+yvGoM`oQ^ zk1rv^T7tjfPol&8=1>mjNNw-iyvZNXRPWAeN1CUZ$G0b%$e2AnoMjTrc z0B>0($&1z7^5ffE+FE_C?On^E1izmP;wQkOz05zkYFRU27lo!JdlGRc9Wl{j(X?e3 zwPa;q#z|XAcLCRl7Mg;Ff(4GyL{pPJO2KGqpskg+Ls&1(k1rNPmS{n#F01HeBfPz4 zmqHT&YpXd+knnT5q1wDUgb$RIECy zAx1+y6;F@2}0QCnc(+m}4Q8ND@tO=}74R`|&V9*)_-bQzwcY13F`M*QqE zrm^lhtdfOs9Sj^`khaXgnFVQ02F^N2JKn%%Drw6N>;RLt!oXfMX)BF-ew|>1__fNI z$FCEOWB9dtiVlsmGIpL#y5`3`34E;-_d%V;KiKM(Y=~zDY}@^xSU!Hx2d`FY zW3@H+9zGFDZTy}-13%dF2fQc3?RY-$`{tr4fV=O@I`uXdyn+==;Q0=TWH_nm|xxZ=4`G}X7N*nM%yqx&*B8Z;>JiMObMIQ2H?=A?9 zzkWDh_F+K*-^>KYezCQt;0%*`KAJ=Oy=%_oOf!_o&#p7p6oxo)R*9f!#4I1@d z>sxF6#D zpF+3~P$uypu43St6nch+Uu1fa#{H@cvb@51I`)aCA{FO(Nb5zuO1vus%K)22Gtr|s z?c;*YqPc=yDp(DAnL%^3xq$No9;b!Kn7%@r54a9++h_+U+eWtw90b(pQkfAyr?n#f zb!`*i_q2AvhqNxhgOd8H){Xep`X0cq>LY-U>-*^h`jtM0_zj+$0RQH>576sHmgGd2(D;-6Hf{oEP&^PPoXDW@pBiQsss=OZy)~+!B zV<@kVu5_`dJ$D1UU15;F_s>2|;}`XQi3 z4-1^(XP%<~HF_`civujdk8engRtj7Ps8gH7Zz_mCAo0hAzApF`dY-O;?_>CF!0q${ zi9aOpQGx#<@Ye!g5csmd*92-B=M4ZpNwWc;#W>+!8bE507HRX1-{RC{vGD>mf&N!& z20TPt0I#6g!m|TCFo-z!!_`9BBCt(hv*OX7!bkoN?G0nP7RBd(wYEd6@y*pf0y)Pb zzR$S_>_$|J6Z8pxungIV@ z;4i_sLwnA*ovsB>kiMWz^GCF=Nc=YKbpH;-&-C|zryuYml=h#eJ*0igKcqdX-Q&+_ zBcl13zMsNy(3+sbL8JzJ zKi9^vaq^UQEhtyeBGQ6rDZMKA2hi(-FM_8rcn#vifmgI9y+7E4vJ|Hkd=~r{AaxP_ zBjT^2Ej0aF`dZKjcxP~`{+h;l7tzz6CcR02%FWCDp_Uc`)=?v1h?e0bt%Xk3!|)*t zX9%1laJj&f1)eSN41p1WyQvxc`*2DoLEsZ~4`?$mPBqL19>nKhoa)fkN1sBL01a#K z!=pU9h@J>e`!Ze#YG*~o8ESN$Aj%6Xx+Z7U*;R+4RbWlQp_uQBDiM%Nc>yEzV(})J z+pwZKfL$P_HzLj&dR6XII;>bGVV+8@aog;}-ttJdZJOKS=H9S5Y*J*pVOlR?SH_2|%L@AWdlNFq2>cpiAVNj9iZnI@Do`?yS zz4JkCft!2JgMPG)k8rw2hM=0dHG7j(jK)3Oi39O7#A4Zo4@fv&iSozXDAUJ;k|ZXtc^q?n>KD}>uGD*+zIn=w7q%j z#`Ohwq@%gLJ&T)ZHVt+PE$WJ<%mfWFY$D$HUuWSsZaAH56Kaq4f+NAOiPmM(X|zah zI+bTgqpHL}$#RX;g2NUoh5dH4GV-@rsdO}+GHv41A4zb~8V)wNO=`o|cAPJSn7Lfk z0d88q2LhUHEXJjcd)lpNtf=sw7TmbmO}KN@Wt)zZ=P#^6Pd1tPj?B_(?M+dSGidE) z>p0Ywj1HLXIQ*aV5r0{I-X^E!#%*2~!T4(lKwz+;7Ef*s(3wjV2ELyjvV&*UnnCYHKt~yQ;mZ!Tl zYTKM29MUs-V%cFS=(f0>&PW?carx%w!j-|eJjTqJ6rHV&@Pn4?b3Ogp-j^>!#)_-T zRspf#pt2Xf-iR_+V#Zl6#YDVuE{+H8G*vMy--jd-ueo z7Heq4=A+YzNnJJ^T;C)K+{>e>k%>7lO8Vmi8Jx7CXH86QHJv^?J~Vk^cRXEa2iKOZ z@#sLx!qG<`hMU=&85rQ6nis8T_}=AV>SX=YR&_Bg%!h;3 zbBr*2o5P~*(Ge?CU{{5o0e1|yAz7OXbUHJYjHWPtW8%A8;c(%A?1JnL&os-A562Sl zgwFXmkQ$_zIDwq%4ifs~)Yr=@_6caZF8;X~+EhwIGhH!AL^vY6OtgO$F z;lUmeybd+TV$^E&?T(~JP(vQ3j8T^rPo)KIxBA4+f++hz3&B_&iF8MM)u8A6?8lYw zRA$4~l2|P7D#fuBreJi5|H=Bv$r!}HN>R<3v=!l#`E^kTN2jg=aK!M{f^uQvl5nvx zlQdl`M7o>12W{K|$QhNIhlb$3Ro&2YART^-uTUx9xz5JyYTD?+35#u;Oj?+B1W_-R zpGae+VC{A3;_^)P9%fA1kqKfB)XfpQb7gTto%eRMei%;Pp$<$S=q5Y?=A&xDD@>GG znTr%-v<#YkyO9NBgDsz*GxC1F(9&<}>kAo+{5w}-yC}bdHkxVnmCdSaMBKWH`(!qW zu;=B-xE{wOWdpuJL0iqFwFfuqvTk1NmGkSJR(gY#NyXL=_nG2xs3l=WZ8a;76D+lM zNXD1z0XVMe!x}SIFp4qWv21fEuOS|8QZ^XZ52sC>hx4LOEf^d$mpfeGEJ&`=P`FPP zReXsAv|I&bp5no&e4n6V6Im=}TPHs^7EF~gIl8tiAoHq*7o=PV7VK~&Yoa*NT-joG z_HVgTH)IkC8LY+2*Kiz@v=i=^)d3^COXIyBH^ulWD{d*xZ$rL4kioKINSi2u zj+;o!%VPa9kP(A^tPShImt^}9OMuE(V#A`Rg)f)>$IFiCSW&h1V-Gf7e%DpUol5?@ z&fmFh_KII!;tAmf%dMyNe6;e3;7QoltD0S*8@0L-(2WY-#ly!Af)^2dhL_b=1g2M( zw6(@P??W*4qGp)Gc`GT#hYe$X_+f0IVFngoXK`y}z!E zYgFs=d1@=mt7fa@&#TwXo|-YQUeo2lS9BTVj^4)fs?o2hNXar9GfaO7z}d~g6*o;0n~x)t*DyqhXlzbTk*H_33`>Pk5_3fT-9OB>HtE=%Pra*QZt0 z%2^SvsF9ER1V^xghHy0R4tML-XW7xAPAipjyO=XE3komJ3f#Z@rz68Tc>ZY@9(>Ag zjkHF-d(Zu0|1mo@T)gEopZ?tspL>LPT29&-vHH_{;V8SXab|C2P zk0T!|>4qCFM7>n9P=0(7eioZe#JhG3_azJXuh&!$+GsO&?t1X< z#QjJ79V&!-ye}S7cL6k-_T?w!CJ(<)lT@`?R#2=^TLCplXaMK%95~c&CoT zvE&8pMk@ad*Fk#0&Z2PK>U{%3HR!}Um2q$lOd{z?;aP^;9qQi-+_+nY{7cY!T8^Lh zG9By}vYa8vb9XSo7s9g^H^=h4+hiBfDd6GXVDs&f<7pNCEk|sH#7_XmpzxQ|`-&a^B_j8_uLU^+M`~c#Uhf(g_+_BXQ5Yczk&wXxpb*;8> zvnccGyMAv{&9|{#HOt2PmEZ%=vMBIS8!e)|4MgKHsvfqEPNC3ru@cXGI{q@7!g$`} zdAbxz7ARSuWPy?eN){+tpkx8Dz%KPWy)Im9DTR^+N){+tpk#rP1xgkuS)gQrk_Ac@ SC|RInfszGE7Wn(L!2bXNXl9N8 literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/FileSystemTreeView/bin/Debug/DirectoryTreeView.pdb b/reactos/tools/sysgen/FileSystemTreeView/bin/Debug/DirectoryTreeView.pdb new file mode 100644 index 0000000000000000000000000000000000000000..0baced4e8e9e86abb083c6062289db2e9d5e84c3 GIT binary patch literal 28160 zcmeI436zx8mB+v8ZVF^=78Mb(+4rWKwZVm^yFpq3QE-Wafrc)i$EFLr8$rh;6{86n zN6CyDFgW9aN)nuyafv86#33fma5A`!cur;}W=tmWU|hzW_kC4!8jyK4)Q>-IrxQ~GWqTO+R}P$*gKr=8$6fxZJXRq)R_qw)6MXz} z5m=bwUpsxSCGg?Wi>5!{@#UTy76iL4e4yaI-7_!P^t<1@)N{jh8}4$?*RSZg{N>4^dBp7?0V58j&4dHTG+DI=~B zj>DtjG4NQp6z&RlgFC{V;FI9aa2L2c+yhpgz(Z@3S9GJFbrD%=-74eke@4)=%8 zfCs>5!X@xPco3{DZU{US9sv)BhruIZhIK;Iv6}zo#jn0S?Zw*`HrDsN4wi&6Wpu!fY4$I&p`yV`~Xj+Opr+y6G2YmfenN#Iz`f4lwvj7@Bw-8okC z|D(bM`^UZb(#yB(e!BXB$C~A;wbOARfnzoQV_(1X{KmVR@9MwzpCAXSDYDN5G!}I`GbccQpSM`d2+|(E=U? ztgUNK%uhDACYl$`YG_O>xVEJ=v1(y+B5`R$V(p>@D-(^4wab!CrOR4^VA-@qdU~KD zt8J0x6lpOVpy(yPx3o&Kw`*giV*=>B`&`r&IojcFW5LjI0N<;J^$8msPERCmqy ze%|YHK1&vokJ1vbC&|m_{n|&bZBgE+ETefPN1u1g*zK<>ujH$Gl@`rQu$_)T0^2*; z%pS9gnsrgStToxJJG`Qz7pA}U{9|AE*V-LJPbzrk`;RYC{<%SoSp!96E{Z+aL3;)J zM7)6AIfB6xpec~xl_j^x+=Yr3G7l1p# zE5T>Mj=>W2suTB!rSK5A8J-A_Ht`>jPi<)(iuAbz*7`e<$?JdW#Xny1_vpX;fFq&9 z>3_2JvMTB6pF;nmbIZ8mx??u$_`F2xf>m{P7bEVJps?p2a2<&%3@IN{1`$%aV$QOIqUrrrHk0uAB zOq(0rL`BEQT*RdxYBOMrbLyH`B(zf#)EFNnVG-q2#^;m2SL*7l=d;M`raq&0@oJ;9 z1dd4mAI_=&wyxazFTI!kOYf!s(tGLuc2N2+y;r|?fYN{Iz4ZSdz@yRsNtD+!h^gRU z@ElNk8EvHsgChP$!e4_c@R5s*En8^Qk##JzA@ZAN!=kDnNNFBwK-EpWse2Bny61xF zx^D`6-5-!9+hpbt>t^le9pE66!uZBBSv=bl*h?fQ>gvi1Ly+Bjod5bmd8;og5aWt89NkzS}8)>d@ypP0S(r_(u$a5}6` zV%R8mr2D&{J8#1tcl$f*Iwbaj_}zXCbCPxSH4V)Px#ZW{{e1%+PEk%}d_F%8_MqrE zCP&Airn1tfD7~C`m6zUSr5ibD{b?`w8SP$AC1VJ0cKsXVe4})^AgK4nHe)0X~!=w*ZcFV;Fr)SG#Hh5jwUAjn?$Jd%z2!yQLd zHW@y!^du|YjJ=%r{KsJZ+-yBKTTT_^8aJPL-y=RA#Z$Y1#^CR!2x>iUWDK1sr!qdD z9|v|a=QuuTKef-SgRPB>$=@?X_ri1SGSpIjZ9T~NbWdUY+7;kH!Yjd2@Xx`sz(%kN zTm^RIfBIZInYE%b?O^y+6Ytx%_A__;N$OGit3kDYH7LItl`!pNuT1;bfNG!dnD(y& zI|i*e+8>(H{+pDsb~6^*TnTv}Ecz1lXs*5tvc!U~f=p3x1K1n<{W}Lz>;ZV#L23wi z6R0()czp5T>x65-Z-6sh{CVJd!n47f!CLSZ@O+m($02@p@J-^a4ExjXEHS5-=)EZ2b!a?V7q+kCf^w4UzG zyq%>xQ7d2M;%rYW^jolx!Huc_x|e#@-}}H~Q0;3C-A}j=_y9P@#mmNTAv^(m5S$1; z3|4^5W6H{I1R=eT)}1w=9JZedcjFB+<#QBrKDWLo;3kZtyUQy(s46--J4kYP{x7Bt(NYWMKWicW1er`y*7lTC@H*15_0M5D%$E?1pw zY{cJbNH(?PJYUL&pL@8oBZJqNwRSXr3=g?}`3mVUV>EXxvz-6@rjy4glh6KRZsVtR zaPm0#>B!=_$u%vBn&jFhvTHBuLmj$zQ60XV_c!Q=%p_#)l|tXr`vvLrAZS7y%K1t6 zsq@{KcDVKPMOEeqS;S`?VoX&D9GY!? zmp@m?w-RB8LZTD#zxCsipF@iJzKed>lV5p#y4MTTBxm21u8Py?_-e_<`b4w6VDsnT zX!_C4*)%_AECiAC*pu{sveRkZ^&L+CeO^CKum5iCW%zRvWmbCV&v`kd)A484wI-Tc zP)o{5zWb=)M*2LR@I2Q?FP~_+275JW)^z^sI`bUh&r9{pvq*aEiG3ly)yqhJ;)0dQ zwUM*HF8WwTIhFDG{P|fMs%-6fGM@jS~b28^N~7(Fn)ybar%No z33FacjRpIG^84`bQ}WyTgG)flP|q;NF&Wk!>;Slk{aMd>hQagU#U@VuV%u=GHWt3$ zt$r+lMJ3dS`O^F0#%CA|(w6Zhc$)C^25E~vWGZp z2V=%2Dv$htUHSlF|4p0tNEtq_!pK4I#v7T81EYRa8DZk&)um>D?YE+A)!lzc|KzLZ)&7o@+k2PxSE#*tbGR)fpI8t?{i7I-^&9*AFR z?#%5Nv??U?3+UgOu;#rld^s#1_$>HJxNq3^&E&T>FBaNO^-XJ5bOCLs?{h%)eIBSY zk;b6;xR5aGQm2Dd33w5R>;q(;x)fXhUIrrj)M}78C+{irgAqek#ufB?G(5|MJ0k@z z-?PbM?M^JTTZP0i=Z3DJPW4eJy%JiVau{oJMCg}V+Y!?pjiG2Af9C2CYMeq_hiVvU z>QH;uCdBBQCG4N{zz}jt#rY)JbTr@MuzsuRd(LJFD!~d0&4KG-J)hbN?}Oiki|AB; z_-uF~yc%8)Z-IBfx_jU)lhSPeFX|g+`;8gT80uQ<)D;s~J-)g$?VFkX$;5l{}E|IW8z-W)s<{m*RYMAQGY z4Z9$5?fm9MOUoylA8&I$a5hIik|)+fd~w9)WV9K%E16B6U9igf{GZl7sr^VksI^@& zW5?8A9nZ8+iF7W}esnt69qbSG087AAK+Z0yLcH8U%({J-qn|<5y%n~5eeQeL(Ug@= zi~(8W#O*uL~8r0uW+ zfAk#cfHjXZ8lmEg+&N19mCt5X&@_L0~0F-;Hly z0ag*N0joiLZR67~1(9v)TCf(}0GX|1HmzO zsUe{J?{ZN7cNKUUcm*gwHwi8R)$uFAJHao4_k)YU$G~Nvo?q63uY(EjJ#aaA09*m~ zD6r3HhJy`+r-Q3N`MOQu5-ic|gp4pq16OP`flOM%@JVw{UC zF~soP^9{y|=*{yTt+kuo*o!!yN(Nf5(p_uwW8q#9)!kcN9e)X`j@!V&;O!tfWS+bD zv!(6tP~%^!?i*q2yTyzjN6?(Dm@`9ny1MTIWgj+zeL%0Pn+W$Md^b1>{0=w++zeKM ztar-EmzBKGT*#gk$0HBPFMS4AU#-6u3;nnP;)bXYbT4&DRu8y3{n=9X$J)@Cv8M#h z8IwL3ddQV~7?e#@-+O_SGxrnU1=WV)hlAfEJOcbacow(~JO}(cP;>DE5M2z=VK+AA z_T!QT@XuIo;_m&_jB$QIS|=EtGgQg{zD3wZSU&6`SdOZm>plwahJOKn2p2Qy6X7}V zYIr@o4bDxKnbDNbCdpRvY>N(;esDRJ$fU}QphlhtRpyZ=l0|D?Yj6mxH6)#z4QsBJ zz>Tohv%b^a@1$|>?PAb-=qhX5jDHd`lpM}MF@*z36ZUlRFSvYHyYSU6-y|3RZ^%~p zUw7qx=)z~Xe5bka+b%rS%v3pYqlJ8!5j5*1qsA{J(G~1fb`ZC9v+U^jx|I zo)0gASHi7u3ceNA-PRUZ&pCI%@~2*be+lo0KZJ`ALowVR9sy5;D`ELi@-gLqu7>p< znVu`&0k_kqFM$C;_nvCyB-9RX{ldAU7td^JZN7H#{A7b(Wb73THR)274(M!t~Y>$hpH%=mN}tus?5@&yN9#-_P4 zxK`2r7v<3#Ej8Uu>EyGbLSSgY+TDe1X%K zv1zVMh3c~Me+qrDW$Xh?pWnv2{8Q6y=svy3yd39V@Qd`zrr9z?9~Eg`6y}g?p`Yu7 zo_*Od$fgtq>5F;)+Ftaf2|q5I*Y>dt$FS7Z@!PiQ$a+b^*JJZL`QQloIo^dl3(Xv) z=gY>qysXgyu1($N7Up=!?%S~Gu3TiD?m{?)W)9L1o_!gc=E|^6y*{kOzbFhc9|HR_ zHqDipm|h#Nm@@8RF7x5@+jy6sdGKS`obl}=^X#|8tgGBh!25>Up*oQd(HqX4`*Rta z=jMF;j=j7tz4mmzvNpqOW_m5zG`E(PX0D}n{g=)<*&Jv3?`?&(32qGane$ta!@d`I z`_5kI_bB;_1ws1Zr?1<_+q%ox2M0O3y4U1)4648foj3It+SVD5Mzq`oI&@LZse;qFR`*1!**fsR!yV9WA+&Z!a zU(-_Nqx#bD$0dU5@fDLMlucpFHgxDVip^b+GHzxsR2w5+UlX`n{2t&U6rU_+0a;T8Y-VMt76im2{S1-_UTex%Nx@3k!(_$;{CXz z=}OZZIc=piljg4!d>bmS&$qzi6o9hRwiD;yugFf*{kFf`&Q8<4HSVRM>@?jwyCrf^ zd%C0Y`kP%&cfE(w|D~=yUtU4gA(<8NVHS*e4S(Zt9pQb1FOM)yu+N!;qPa`f_;mj* zCyDc8FfOkjYsvUAm~k!5%f>C&*R%2~%!|nOcVUjWV9sA|kxEGdlEjx`5mrz~VXV0w z9Z!nP2m!n!n_tSg5!R@WZ_?WC3;X&1FK1|h~0&hS%+?-k5!X@xPShF}79s&=A)qg$D7zU4oN5LmD={pHt2HCbj@3Zo})KGSs-V6P9 z8)qm$&;`%bsK@^nI$f()7K_X)beiIemXfYg&|@rr*Vor4gY$bQL>(Z2Bdvyh<2H zJpbGn?#y2xQ_;ZxZkZcCJ$IzRTI!6!@SlBZJ7!7Xj?(hj6&F7_OH1aNox4jr4f?{Y z^%vdt&0qiHfA0Br;>OKsXu8ULUwd3r-73CCZ8qMO3BEMkytFaNTaQP&6SwdGSyS*Q z4QfA~1Lw23&26+Umg;MiccvX$*QEU{T$9osBr9ou8T!CO4GX{f1rGjlzDVoO|!Prgq~qltDz9r~?B;$Ix=|OT07mVmN>1Z}RE2drlP`Q)*5X zG<6uR8guNZqj#!d-Lh;?4GGnWTdHBHf%>4@X-9-MYENnj=gbf*dm1jLN#cftptQL=|aWNfvWlQP?*hWf2t+?Lo}%k$q{6hp9nL zgjRO$01v%$;r&I$YdXI8&)FG$2N&cn{PM~EIUlboSblZ6|HQ<{cD(w-H$Pi{GB!Q7 z|H6B@KUnhF)GHNJoBn(6mQTf)Ia@0-J4*9+&;GPbIdCa>RcoH#{Qln`m|0=hKQWNC z!#y@@!#j(1Un%|Q)aTD`kDfW+w4v>(rqa#M$bmyo{cgLmeRW{M$FpYm3da-W&f8x& z0nLKxvau(Eo?AGHIeD_NCo>0YuLwR+p^ze1#Ifrt(TcT2#Y;+-Fe_7rvIeo7wS(yA zX#bP}I_Nou6?Iv{Lq2$0&05=B9YEWMekRLTn0AN-P|#J@A{QJ}x~7y8++mAT5@Rw| z@Q22sG9U6Nxk<0GsfFs1h&|K+JVrkSo|br>`a#cB7|RvrMHFKBr(Uw zl5-@k@UiBtzD8d*9q>KoTQAp`O~3WAt@psmrLqha^n)4xjBMH^@f9F@n1~ujPf^Cu z1X8hoxc8RIqmNGBB-e08_V!a4+g72m#M~*saoB2`Xc84k`hJPumRK&aTH=EeACjm` zG$d}7*dy^#;3Rrn;NPL;}jK9&ZX=lbcdYSfRoToq2>!3ASPn#8u z^5_H5<0%vLR4N9}qQ$`Zh^$7XR0mux@nJd(I!OC~-=*IJ!;-UI&T=Kai#`PZNxBT& zOIH;?y#RZey+d~b$L>D*2U4BLHo7PZt&wf=(v$RGXdorBqSlVYO|go)+z#9IG|?@n z%JQ6^2HUVasx`un?b_|0)?&DE-3)s1h+%8%Ad2nU;Mif|y42~0ZO1f16zp+5(Mk28 zEh6lZ7WQn1YIVa(4rq;W%QHHKR%v&}3{yBk;dB{LLCFE;>z)xZOvCFb_i!dcaZe1+ z7VReV8n#8{t}8l2X3u)jvj&QWL{kF+Vd_0WBWeu|C7jb5g=@zhHd-g*o}-(Cj2hjF z#`S2LwxI3_6TXN_8!^$tUW;&C*dJ1wvR7@j+fFBZw=LZqR*HQcc5v8%N;}r$7|{;z zRXI0nx6BteC@kn? zx7}3wC`~t$^_JixeXZ}r;oYm_b%)++Tlw0>+HX%C`+@-Ake_bp%{*%iWKZ&%~jNE(TX9o*6g%-Rh7EHhP*OlHTd*KJ4?D*a4-;jvD#}$T zOIQn=@p>DHr7y*I8$Y743XSBB{D^C1B}AnPX@5AP4(=bd(sp9DBln=DmYb$353H*? z$g9&OB6vF%DKvX%LSbW(nz&Qd#HFe-r=+-e5z#jlnlL1prkZH9Lb+*IH9O7$Qj&K* zi1dqo@D0qF`iTGURq zl$y==AvIxC2iL{8P9EfJ^b+N0<`}+a;gbg`1N`W1H1*>kDp+;uS4JU@0csxjmC)CT zpTKMnR`9n2umfBdeGU9>R4z4m@TcTs(x)CoK$mlQycQmW;RnyOu?i1|k+nM%lbG(k zU)oNsIsglXDI;B4QqNAHkZxdK@%Jm&3M+mh+d;;>sRJgjdxC zjKDHcB4+hTNzOL=or(eXIE%yQ&!joDM74@5pgblnV%bN-JGR6=O_ohmcu4Tp%XjSM5Nh|8#A5K!MWx={dKuZ TBcLY!&!}P9UAq3eeA)j4ZC9R* literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/FileSystemTreeView/icons/folder.ico b/reactos/tools/sysgen/FileSystemTreeView/icons/folder.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9e4b0b4a38001b92f3820c44b00a942347f8889 GIT binary patch literal 1406 zcmeH{Jr2S!4255u{$}dL%*ZWZgW zSJ~0$)`{av1{9yF0)2s13XA|uXbfRYb8)Ac@=NTNN7U=u$4*a+#n}Se3ozf{@UUoZ z4el=sYZ)IjbYSSfUv)sFh$Jdf7#zHD<^)wB@1^t1vDUhzxU}rZspSC9hxdVv>DXtN z#+W$&!(aRN=jYr{x}Op16AASttW3PXx^$BA%a%hzhjJzFL+rPA^HbBNv>lBj@eN@5 B9CiQz literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/RosBuilder/Controls/CatalogTriStateTreeView.cs b/reactos/tools/sysgen/RosBuilder/Controls/CatalogTriStateTreeView.cs new file mode 100644 index 00000000000..c4309b01166 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Controls/CatalogTriStateTreeView.cs @@ -0,0 +1,220 @@ +using System; +using System.Drawing; +using System.Text; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; + +using SIL.FieldWorks.Common.Controls; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; + +namespace TriStateTreeViewDemo +{ + public class CatalogTriStateTreeView : TriStateTreeView + { + private ISysGenDesigner m_SysGenDesigner = null; + private TreeNode m_PlatformNode = null; + + public CatalogTriStateTreeView() + { + } + + private void CatalogTriStateTreeView_BeforeCheck(object sender, TreeViewCancelEventArgs e) + { + if (m_SysGenDesigner.SysGenEngine.Project != null) + { + if (e.Node is ModuleTreeNode) + { + //Get the underlying module + ModuleTreeNode moduleNode = e.Node as ModuleTreeNode; + + if (GetChecked(e.Node) == CheckState.Unchecked) + { + //Add the selected node and dependencies + m_SysGenDesigner.PlatformController.Add(moduleNode.Module); + } + else + { + //Remove the module from our platform + m_SysGenDesigner.PlatformController.Remove(moduleNode.Module); + } + + //Update current module status + UpdateCatalogTree(); + } + else if (e.Node is FolderTreeNode) + { + if (m_AutoUpdatingParents == false) + { + //e.Cancel = (AddTreeNodeModules(e.Node) == false); + } + } + } + else + { + MessageBox.Show("Cannot modify a catalog tree without platform associated"); + } + } + + public void SetCatalog(ISysGenDesigner sysGenDesigner) + { + //Set the software catalog + m_SysGenDesigner = sysGenDesigner; + + //Load the platform tree catalog + LoadCatalogTree(); + UpdateCatalogTree(); + + NodeMouseClick += new TreeNodeMouseClickEventHandler(CatalogTriStateTreeView_NodeMouseClick); + } + + void CatalogTriStateTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + ModuleTreeNode moduleNode = e.Node as ModuleTreeNode; + + if (moduleNode != null) + m_SysGenDesigner.InspectedObject = moduleNode.Module; + } + + private void LoadCatalogTree() + { + m_PlatformNode = new TreeNode(); + + LoadPlatformModules(m_PlatformNode, m_SysGenDesigner.SysGenEngine.ProjectTask); + + Nodes.Clear(); + Nodes.Add(m_PlatformNode); + + m_PlatformNode.Text = RootNodeText; + m_PlatformNode.Expand(); + } + + private void UpdateCatalogTree() + { + BeginUpdate(); + BeforeCheck -= new TreeViewCancelEventHandler(CatalogTriStateTreeView_BeforeCheck); + + m_PlatformNode.Text = RootNodeText; + m_PlatformNode.Expand(); + + UpdatePlatformModules(m_PlatformNode); + + EndUpdate(); + BeforeCheck += new TreeViewCancelEventHandler(CatalogTriStateTreeView_BeforeCheck); + } + + private string RootNodeText + { + get + { + return string.Format("Catalog ({0} Modules-{1} Available)", + m_SysGenDesigner.PlatformController.Project.Platform.Modules.Count, + m_SysGenDesigner.PlatformController.Project.Modules.Count); + } + } + + private void UpdatePlatformModules(TreeNode node) + { + if (node is ModuleTreeNode) + { + //Get the underlying module + ModuleTreeNode moduleNode = node as ModuleTreeNode; + + if (moduleNode != null) + { + if (m_SysGenDesigner.PlatformController.Project.Platform.Modules.Contains(moduleNode.Module)) + { + SetChecked(moduleNode, CheckState.Checked); + } + else + { + SetChecked(moduleNode, CheckState.Unchecked); + } + } + } + else + { + foreach (TreeNode subNode in node.Nodes) + { + UpdatePlatformModules(subNode); + } + } + } + + private void LoadPlatformModules(TreeNode node, Task task) + { + if (task is ModuleTask) + { + RBuildModule module = ((ModuleTask)task).Module; + + node.Nodes.Add(new ModuleTreeNode(module)); + } + else if (task is ITaskContainer) + { + if (task is DirectoryTask) + { + FolderTreeNode taskNode = new FolderTreeNode(((DirectoryTask)task).Name); + + node.Nodes.Add(taskNode); + + foreach (Task innerTask in ((ITaskContainer)task).ChildTasks) + { + LoadPlatformModules(taskNode, innerTask); + } + } + else + { + foreach (Task innerTask in ((ITaskContainer)task).ChildTasks) + { + LoadPlatformModules(node, innerTask); + } + } + } + } + + public abstract class CatalogTreeNode : TreeNode + { + public abstract string NodeName { get; } + } + + public class ModuleTreeNode : CatalogTreeNode + { + RBuildModule m_Module = null; + + public ModuleTreeNode(RBuildModule module) + { + m_Module = module; + Text = module.Name; + } + + public RBuildModule Module + { + get { return m_Module; } + } + + public override string NodeName + { + get { return Module.Name; } + } + } + + public class FolderTreeNode : CatalogTreeNode + { + private string m_FolderName = null; + + public FolderTreeNode(string name) + { + m_FolderName = name; + Text = name; + } + + public override string NodeName + { + get { return m_FolderName; } + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Controls/ModuleFiltersListView.cs b/reactos/tools/sysgen/RosBuilder/Controls/ModuleFiltersListView.cs new file mode 100644 index 00000000000..2228f2b729d --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Controls/ModuleFiltersListView.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; + +namespace TriStateTreeViewDemo +{ + public class ModuleFiltersListViewItem : ListViewItem + { + private ModuleFilter m_ModuleFilter = null; + + public ModuleFiltersListViewItem(ModuleFilter filter) + { + m_ModuleFilter = filter; + + Text = filter.Name; + SubItems.Add(filter.Modules.Count.ToString()); + } + + public ModuleFilter Filter + { + get { return m_ModuleFilter; } + } + } + + public class ModuleFiltersListView : ListView + { + private ISysGenDesigner m_SysGenDesigner = null; + + public ModuleFiltersListView() + { + View = View.Details; + + FullRowSelect = true; + CheckBoxes = true; + + Columns.Add("Name", 200); + Columns.Add("Modules", 100); + } + + public void SetCatalog(ISysGenDesigner sysGenDesigner) + { + //Set the software catalog + m_SysGenDesigner = sysGenDesigner; + //m_SysGenDesigner.PlatformController.PlatformModulesUpdated += new EventHandler(PlatformController_PlatformModulesUpdated); + + foreach (ModuleFilter filter in sysGenDesigner.ModuleFilterController.ModuleFilters) + { + Items.Add(new ModuleFiltersListViewItem(filter)); + } + } + + //protected override void OnItemCheck(ItemCheckEventArgs ice) + //{ + // base.OnItemCheck(ice); + //} + + //protected override void OnItemChecked(ItemCheckedEventArgs e) + //{ + // base.OnItemChecked(e); + //} + + private void PlatformController_PlatformModulesUpdated(object sender, EventArgs e) + { + BeginUpdate(); + + foreach (ModuleFiltersListViewItem filterItem in Items) + { + foreach (RBuildModule module in m_SysGenDesigner.ProjectController.Project.Platform.Modules) + { + if (!filterItem.Filter.Modules.Contains(module)) + { + filterItem.Checked = false; + break; + } + } + + filterItem.Checked = true; + } + + EndUpdate(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Controls/NewItemListView.cs b/reactos/tools/sysgen/RosBuilder/Controls/NewItemListView.cs new file mode 100644 index 00000000000..e2e28dc11f5 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Controls/NewItemListView.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; + +namespace TriStateTreeViewDemo +{ + public abstract class NewItemListViewItem : ListViewItem + { + protected ISysGenDesigner m_SysGenDesigner = null; + + public NewItemListViewItem(ISysGenDesigner designer) + { + m_SysGenDesigner = designer; + } + + public abstract string Description { get; } + public abstract string DefaultFileName { get; } + + public virtual void Apply() + { + } + } + + public class ModuleFiltersNewItemListViewItem : NewItemListViewItem + { + private ModuleFilter m_ModuleFilter = null; + + public ModuleFiltersNewItemListViewItem(ISysGenDesigner designer ,ModuleFilter filter): base(designer) + { + m_ModuleFilter = filter; + + Text = filter.Name; + } + + public override string Description + { + get { return m_ModuleFilter.Name; } + } + + public override string DefaultFileName + { + get { return null; } + } + + public override void Apply() + { + m_SysGenDesigner.ModuleFilterController.Apply(m_ModuleFilter); + } + } + + public class LanguageNewItemListViewItem : NewItemListViewItem + { + private RBuildLanguage m_Language = null; + + public LanguageNewItemListViewItem(ISysGenDesigner designer, RBuildLanguage language) + : base(designer) + { + m_Language = language; + + Text = language.Name; + } + + public override string Description + { + get { return m_Language.Name; } + } + + public override string DefaultFileName + { + get { return null; } + } + + public override void Apply() + { + m_SysGenDesigner.ProjectController.AddLanguage(m_Language); + } + } + + public class DebugChannelNewItemListViewItem : NewItemListViewItem + { + private RBuildDebugChannel m_DebugChannel = null; + + public DebugChannelNewItemListViewItem(ISysGenDesigner designer, RBuildDebugChannel channel) + : base(designer) + { + m_DebugChannel = channel; + + Text = channel.Name; + } + + public override string Description + { + get { return m_DebugChannel.Name; } + } + + public override string DefaultFileName + { + get { return null; } + } + + public override void Apply() + { + m_SysGenDesigner.ProjectController.AddDebugChannel(m_DebugChannel); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Controls/PlatformTreeView.cs b/reactos/tools/sysgen/RosBuilder/Controls/PlatformTreeView.cs new file mode 100644 index 00000000000..1f12d95df50 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Controls/PlatformTreeView.cs @@ -0,0 +1,306 @@ +using System; +using System.Drawing; +using System.Text; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; + +using SIL.FieldWorks.Common.Controls; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; + +namespace TriStateTreeViewDemo +{ + public class PlatformTreeView : TriStateTreeView + { + private ISysGenDesigner m_SysGenDesigner = null; + private PlatformTreeNode m_PlatformNode = null; + + public PlatformTreeView() + { + } + + private void CatalogTriStateTreeView_BeforeCheck(object sender, TreeViewCancelEventArgs e) + { + if (m_SysGenDesigner.ProjectController.Project != null) + { + if (e.Node is ModuleTreeNode) + { + //Get the underlying module + ModuleTreeNode moduleNode = e.Node as ModuleTreeNode; + + if (GetChecked(e.Node) == CheckState.Unchecked) + { + //Add the selected node and dependencies + m_SysGenDesigner.ProjectController.Add(moduleNode.Module); + } + else + { + //Remove the module from our platform + m_SysGenDesigner.ProjectController.Remove(moduleNode.Module); + } + + } + else if (e.Node is FolderTreeNode) + { + } + } + else + { + MessageBox.Show("Cannot modify a catalog tree without platform associated"); + } + + /* cancel the paint event*/ + e.Cancel = true; + } + + public void SetCatalog(ISysGenDesigner sysGenDesigner) + { + //Set the software catalog + m_SysGenDesigner = sysGenDesigner; + + m_SysGenDesigner.ProjectController.PlatformModulesUpdated += new EventHandler(PlatformController_PlatformModulesUpdated); + + //Load the platform tree catalog + LoadCatalogTree(); + UpdateCatalogTree(); + + NodeMouseClick += new TreeNodeMouseClickEventHandler(CatalogTriStateTreeView_NodeMouseClick); + } + + void PlatformController_PlatformModulesUpdated(object sender, EventArgs e) + { + //Update current module status + UpdateCatalogTree(); + } + + void CatalogTriStateTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + CatalogTreeNode catalogNode = e.Node as CatalogTreeNode; + + if (catalogNode != null) + m_SysGenDesigner.InspectedObject = catalogNode.NodeObject; + } + + private void LoadCatalogTree() + { + m_PlatformNode = new PlatformTreeNode(m_SysGenDesigner.ProjectController.Project.Platform); + + LoadPlatformModules(m_PlatformNode); + //LoadPlatformModules(m_PlatformNode, m_SysGenDesigner.SysGenEngine.ProjectTask); + + Nodes.Clear(); + Nodes.Add(m_PlatformNode); + + m_PlatformNode.Text = RootNodeText; + m_PlatformNode.Expand(); + } + + private void UpdateCatalogTree() + { + BeginUpdate(); + BeforeCheck -= new TreeViewCancelEventHandler(CatalogTriStateTreeView_BeforeCheck); + + m_PlatformNode.Text = RootNodeText; + m_PlatformNode.Expand(); + + UpdatePlatformModules(m_PlatformNode); + + EndUpdate(); + BeforeCheck += new TreeViewCancelEventHandler(CatalogTriStateTreeView_BeforeCheck); + } + + private string RootNodeText + { + get + { + return string.Format("Catalog ({0} Modules-{1} Available)", + m_SysGenDesigner.ProjectController.Project.Platform.Modules.Count, + m_SysGenDesigner.ProjectController.Project.Modules.Count); + } + } + + private void UpdatePlatformModules(TreeNode node) + { + if (node is ModuleTreeNode) + { + //Get the underlying module + ModuleTreeNode moduleNode = node as ModuleTreeNode; + + if (moduleNode != null) + { + if (m_SysGenDesigner.ProjectController.Project.Platform.Modules.Contains(moduleNode.Module)) + { + SetChecked(moduleNode, CheckState.Checked); + } + else + { + SetChecked(moduleNode, CheckState.Unchecked); + } + } + } + else + { + foreach (TreeNode subNode in node.Nodes) + { + UpdatePlatformModules(subNode); + } + } + } + + private void LoadPlatformModules(TreeNode node) + { + foreach (RBuildModule module in m_SysGenDesigner.ProjectController.AvailableModules) + { + TreeNode parent = node; + + foreach (string part in module.CatalogPath.Split(new char[] { '\\' })) + { + if (part.Length > 0) + { + parent = GetFolderNode(parent, part); + } + } + + parent.Nodes.Add(new ModuleTreeNode(module)); + } + } + + private TreeNode GetFolderNode(TreeNode parent, string name) + { + foreach (TreeNode node in parent.Nodes) + { + CatalogTreeNode folderNode = node as CatalogTreeNode; + + if (folderNode != null) + { + if (folderNode.NodeName == name) + { + return folderNode; + } + } + } + + FolderTreeNode newNode = new FolderTreeNode(name); + + parent.Nodes.Add(newNode); + + return newNode; + } + + //private void LoadPlatformModules(TreeNode node, Task task) + //{ + // foreach (string path in + // /* + // if (task is ModuleTask) + // { + // RBuildModule module = ((ModuleTask)task).Module; + + // node.Nodes.Add(new ModuleTreeNode(module)); + // } + // else if (task is ITaskContainer) + // { + // if (task is DirectoryTask) + // { + // FolderTreeNode taskNode = new FolderTreeNode(((DirectoryTask)task).Name); + + // node.Nodes.Add(taskNode); + + // foreach (Task innerTask in ((ITaskContainer)task).ChildTasks) + // { + // LoadPlatformModules(taskNode, innerTask); + // } + // } + // else + // { + // foreach (Task innerTask in ((ITaskContainer)task).ChildTasks) + // { + // LoadPlatformModules(node, innerTask); + // } + // } + // } + // */ + //} + + public abstract class CatalogTreeNode : TreeNode + { + public abstract string NodeName { get; } + public abstract object NodeObject { get;} + } + + public class PlatformTreeNode : CatalogTreeNode + { + RBuildPlatform m_Platform = null; + + public PlatformTreeNode(RBuildPlatform platform) + { + m_Platform = platform; + Text = platform.Name; + } + + public RBuildPlatform Platform + { + get { return m_Platform; } + } + + public override string NodeName + { + get { return m_Platform.Name; } + } + + public override object NodeObject + { + get { return Platform; } + } + } + + public class ModuleTreeNode : CatalogTreeNode + { + RBuildModule m_Module = null; + + public ModuleTreeNode(RBuildModule module) + { + m_Module = module; + Text = module.Name; + } + + public RBuildModule Module + { + get { return m_Module; } + } + + public override string NodeName + { + get { return Module.Name; } + } + + public override object NodeObject + { + get { return Module; } + } + } + + public class FolderTreeNode : CatalogTreeNode + { + private string m_FolderName = null; + + public FolderTreeNode(string name) + { + m_FolderName = name; + Text = name; + } + + public override string NodeName + { + get { return m_FolderName; } + } + + public override object NodeObject + { + get { return NodeName; } + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Controls/ProjectTreeView.cs b/reactos/tools/sysgen/RosBuilder/Controls/ProjectTreeView.cs new file mode 100644 index 00000000000..35f827319a4 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Controls/ProjectTreeView.cs @@ -0,0 +1,161 @@ +using System; +using System.Windows.Forms; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; + +namespace TriStateTreeViewDemo +{ + public class ProjectTreeView : TreeView + { + private ISysGenDesigner m_SysGenDesigner = null; + private TreeNode m_Project = new TreeNode("Project"); + private TreeNode m_Platforms = new TreeNode("Platform"); + private TreeNode m_Languages = new TreeNode("Languages"); + private TreeNode m_DebugChannels = new TreeNode("Debug Channels"); + //private TreeNode m_Filters = new TreeNode("Filters"); + private TreeNode m_Files = new TreeNode("Files"); + private TreeNode m_Registry = new TreeNode("Registry"); + //private TreeNode m_Filters = new TreeNode("Filters"); + + public ProjectTreeView() + { + } + + public void SetCatalog(ISysGenDesigner sysGenDesigner) + { + //Set the software catalog + m_SysGenDesigner = sysGenDesigner; + m_SysGenDesigner.ProjectController.ProjectLoaded += new EventHandler(PlatformController_ProjectLoaded); + m_SysGenDesigner.ProjectController.ProjectUpdated += new EventHandler(PlatformController_ProjectUpdated); + + + LoadProject(); + } + + void PlatformController_ProjectLoaded(object sender, EventArgs e) + { + LoadProject(); + UpdateProject(); + } + + void PlatformController_ProjectUpdated(object sender, EventArgs e) + { + UpdateProject(); + } + + private void LoadProject() + { + Nodes.Clear(); + + m_Project = new ProjectTreeNode(m_SysGenDesigner.ProjectController.SysGenProject); + m_Project.Nodes.Add(m_Platforms); + m_Project.Nodes.Add(m_Languages); + m_Project.Nodes.Add(m_DebugChannels); +// m_Project.Nodes.Add(m_Filters); + m_Project.Nodes.Add(m_Files); + m_Project.Nodes.Add(m_Registry); + m_Project.Expand(); + + Nodes.Add(m_Project); + } + + private void UpdateProject() + { + m_Languages.Nodes.Clear(); + m_DebugChannels.Nodes.Clear(); + + foreach (RBuildLanguage language in m_SysGenDesigner.ProjectController.Project.Platform.Languages) + { + m_Languages.Nodes.Add(language.Name); + } + + foreach (RBuildDebugChannel channel in m_SysGenDesigner.ProjectController.Project.Platform.DebugChannels) + { + m_DebugChannels.Nodes.Add(channel.Name); + } + } + + public abstract class CatalogTreeNode : TreeNode + { + public abstract string NodeName { get; } + public abstract object NodeObject { get;} + } + + public class ProjectTreeNode : CatalogTreeNode + { + Project m_Platform = null; + + public ProjectTreeNode(Project platform) + { + m_Platform = platform; + Text = platform.FileName; + } + + public Project Platform + { + get { return m_Platform; } + } + + public override string NodeName + { + get { return m_Platform.Name; } + } + + public override object NodeObject + { + get { return Platform; } + } + } + + public class ModuleTreeNode : CatalogTreeNode + { + RBuildModule m_Module = null; + + public ModuleTreeNode(RBuildModule module) + { + m_Module = module; + Text = module.Name; + } + + public RBuildModule Module + { + get { return m_Module; } + } + + public override string NodeName + { + get { return Module.Name; } + } + + public override object NodeObject + { + get { return Module; } + } + } + + public class FolderTreeNode : CatalogTreeNode + { + private string m_FolderName = null; + + public FolderTreeNode(string name) + { + m_FolderName = name; + Text = name; + } + + public override string NodeName + { + get { return m_FolderName; } + } + + public override object NodeObject + { + get { return NodeName; } + } + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.Designer.cs b/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.Designer.cs new file mode 100644 index 00000000000..1c20f5713ba --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.Designer.cs @@ -0,0 +1,118 @@ +namespace RosBuilder.Controls +{ + partial class RegistryEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.listView1 = new System.Windows.Forms.ListView(); + this.treeView1 = new System.Windows.Forms.TreeView(); + this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader2 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader3 = new System.Windows.Forms.ColumnHeader(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.treeView1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.listView1); + this.splitContainer1.Size = new System.Drawing.Size(623, 542); + this.splitContainer1.SplitterDistance = 207; + this.splitContainer1.TabIndex = 0; + // + // listView1 + // + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3}); + this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView1.Location = new System.Drawing.Point(0, 0); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(412, 542); + this.listView1.TabIndex = 0; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // treeView1 + // + this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeView1.Location = new System.Drawing.Point(0, 0); + this.treeView1.Name = "treeView1"; + this.treeView1.Size = new System.Drawing.Size(207, 542); + this.treeView1.TabIndex = 0; + // + // columnHeader1 + // + this.columnHeader1.Text = "Name"; + this.columnHeader1.Width = 159; + // + // columnHeader2 + // + this.columnHeader2.Text = "Type"; + this.columnHeader2.Width = 130; + // + // columnHeader3 + // + this.columnHeader3.Text = "Data"; + // + // RegistryEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "RegistryEditor"; + this.Size = new System.Drawing.Size(623, 542); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView treeView1; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.cs b/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.cs new file mode 100644 index 00000000000..738adfbefc0 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +namespace RosBuilder.Controls +{ + public partial class RegistryEditor : UserControl + { + public RegistryEditor() + { + InitializeComponent(); + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.resx b/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.resx new file mode 100644 index 00000000000..19dc0dd8b39 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Controls/RegistryEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Form1.Designer.cs b/reactos/tools/sysgen/RosBuilder/Form1.Designer.cs new file mode 100644 index 00000000000..04418fb8104 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Form1.Designer.cs @@ -0,0 +1,38 @@ +namespace RosBuilder +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "Form1"; + } + + #endregion + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Form1.cs b/reactos/tools/sysgen/RosBuilder/Form1.cs new file mode 100644 index 00000000000..a11fbad5119 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Form1.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace RosBuilder +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Form1.resx b/reactos/tools/sysgen/RosBuilder/Form1.resx new file mode 100644 index 00000000000..19dc0dd8b39 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Inspectors/PlatformInspector.cs b/reactos/tools/sysgen/RosBuilder/Inspectors/PlatformInspector.cs new file mode 100644 index 00000000000..7d798289853 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Inspectors/PlatformInspector.cs @@ -0,0 +1,155 @@ +using System; +using System.Windows.Forms; +using System.ComponentModel; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace TriStateTreeViewDemo +{ + public class PlatformInspector + { + private RBuildPlatform m_Platform = null; + + public PlatformInspector(RBuildPlatform platform) + { + m_Platform = platform; + } + + [Category("Info")] + public string Name + { + get { return m_Platform.Name; } + set { m_Platform.Name = value; } + } + + [Category("Info")] + public string Description + { + get { return m_Platform.Description; } + set { m_Platform.Description = value; } + } + + [Category("Applications")] + [Description("The module to be used as a shell for the platform")] + public string Shell + { + set + { + if (value != string.Empty) + { + try + { + RBuildModule module = m_Platform.Modules.GetByName(value); + + if (module == null) + throw new ArgumentException("Unknown '" + value + "' shell module"); + + if (module.Type != ModuleType.Win32CUI && + module.Type != ModuleType.Win32GUI) + throw new ArgumentException("Only Win32 GUI and CUI applications can be set as shell"); + + /* set the shell to use */ + m_Platform.Shell = module; + } + catch (ArgumentException e) + { + MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + get + { + if (m_Platform.Shell != null) + return m_Platform.Shell.Name; + + return string.Empty; + } + } + + [Category("Applications")] + [Description("The module to be used as a screensaver for the platform")] + public string Screensaver + { + set + { + if (value != string.Empty) + { + try + { + RBuildModule module = m_Platform.Modules.GetByName(value); + + if (module == null) + throw new ArgumentException("Unknown '" + value + "' screen saver module"); + + if (module.Type != ModuleType.Win32SCR) + throw new ArgumentException("Only Win32 SCR applications can be set as shell"); + + /* set the shell to use */ + m_Platform.Screensaver = module; + } + catch (ArgumentException e) + { + MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + get + { + if (m_Platform.Screensaver != null) + return m_Platform.Screensaver.Name; + + return string.Empty; + } + } + + //public IList DebugChannels + //{ + // get { return m_Platform.DebugChannels; } + //} + + [Category("Appareance")] + [Description("The module to be used as a screensaver for the platform")] + public string Wallpaper + { + set + { + if (value != string.Empty) + { + RBuildWallpaperFile iW = new RBuildWallpaperFile(); + + iW.Name = value; + + m_Platform.Wallpaper = iW; + + //foreach (RBuildModule module in m_Platform.Modules) + //{ + // foreach (RBuildFile file in module.Files) + // { + // RBuildInstallWallpaperFile wallpaper = file as RBuildInstallWallpaperFile; + + // if (wallpaper != null) + // { + // if (wallpaper.ID.ToLower() == value.ToLower()) + // { + // m_Platform.Wallpaper = wallpaper; + // } + // } + // } + //} + + // specified wallpaper not found + //throw new ArgumentException(); + } + } + get + { + if (m_Platform.Wallpaper != null) + return m_Platform.Wallpaper.ID; + + return string.Empty; + } + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/MainForm.Designer.cs b/reactos/tools/sysgen/RosBuilder/MainForm.Designer.cs new file mode 100644 index 00000000000..9ebe4ebeefd --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/MainForm.Designer.cs @@ -0,0 +1,654 @@ +namespace TriStateTreeViewDemo +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.saveConfigToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.cmbArchitecture = new System.Windows.Forms.ToolStripComboBox(); + this.cmbDebug = new System.Windows.Forms.ToolStripComboBox(); + this.cmbOptimization = new System.Windows.Forms.ToolStripComboBox(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.printPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.platformToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addFiltersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addLanguagesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addDebToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.customizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.indexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pgProperties = new System.Windows.Forms.PropertyGrid(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.tvPlatform = new TriStateTreeViewDemo.PlatformTreeView(); + this.tvProject = new TriStateTreeViewDemo.ProjectTreeView(); + this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.statusStrip1.SuspendLayout(); + this.toolStrip1.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabel1}); + this.statusStrip1.Location = new System.Drawing.Point(0, 601); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(820, 22); + this.statusStrip1.TabIndex = 5; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.toolStripSeparator8, + this.saveConfigToolStripButton, + this.cmbArchitecture, + this.cmbDebug, + this.cmbOptimization, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(0, 24); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(820, 25); + this.toolStrip1.TabIndex = 6; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Size = new System.Drawing.Size(23, 22); + this.newToolStripButton.Text = "&New"; + this.newToolStripButton.Click += new System.EventHandler(this.newToolStripButton_Click); + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openToolStripButton.Text = "&Open"; + this.openToolStripButton.Click += new System.EventHandler(this.openToolStripButton_Click); + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveToolStripButton.Text = "&Save"; + this.saveToolStripButton.Click += new System.EventHandler(this.saveToolStripButton_Click); + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(6, 25); + // + // cutToolStripButton + // + this.cutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Size = new System.Drawing.Size(23, 22); + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Size = new System.Drawing.Size(23, 22); + this.copyToolStripButton.Text = "&Copy"; + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + this.toolStripSeparator8.Size = new System.Drawing.Size(6, 25); + // + // saveConfigToolStripButton + // + this.saveConfigToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.saveConfigToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveConfigToolStripButton.Image"))); + this.saveConfigToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveConfigToolStripButton.Name = "saveConfigToolStripButton"; + this.saveConfigToolStripButton.Size = new System.Drawing.Size(69, 22); + this.saveConfigToolStripButton.Text = "&Save Config"; + this.saveConfigToolStripButton.Click += new System.EventHandler(this.saveConfigToolStripButton_Click); + // + // cmbArchitecture + // + this.cmbArchitecture.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbArchitecture.Name = "cmbArchitecture"; + this.cmbArchitecture.Size = new System.Drawing.Size(150, 25); + // + // cmbDebug + // + this.cmbDebug.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbDebug.Name = "cmbDebug"; + this.cmbDebug.Size = new System.Drawing.Size(75, 25); + // + // cmbOptimization + // + this.cmbOptimization.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOptimization.Name = "cmbOptimization"; + this.cmbOptimization.Size = new System.Drawing.Size(75, 25); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // helpToolStripButton + // + this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Size = new System.Drawing.Size(23, 22); + this.helpToolStripButton.Text = "He&lp"; + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.platformToolStripMenuItem, + this.editToolStripMenuItem, + this.toolsToolStripMenuItem, + this.helpToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(820, 24); + this.menuStrip1.TabIndex = 7; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.toolStripSeparator2, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripSeparator3, + this.printToolStripMenuItem, + this.printPreviewToolStripMenuItem, + this.toolStripSeparator4, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripMenuItem.Image"))); + this.newToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newToolStripMenuItem.Size = new System.Drawing.Size(151, 22); + this.newToolStripMenuItem.Text = "&New"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripMenuItem.Image"))); + this.openToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openToolStripMenuItem.Size = new System.Drawing.Size(151, 22); + this.openToolStripMenuItem.Text = "&Open"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(148, 6); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem.Image"))); + this.saveToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(151, 22); + this.saveToolStripMenuItem.Text = "&Save"; + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(151, 22); + this.saveAsToolStripMenuItem.Text = "Save &As"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(148, 6); + // + // printToolStripMenuItem + // + this.printToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripMenuItem.Image"))); + this.printToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripMenuItem.Name = "printToolStripMenuItem"; + this.printToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P))); + this.printToolStripMenuItem.Size = new System.Drawing.Size(151, 22); + this.printToolStripMenuItem.Text = "&Print"; + // + // printPreviewToolStripMenuItem + // + this.printPreviewToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printPreviewToolStripMenuItem.Image"))); + this.printPreviewToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printPreviewToolStripMenuItem.Name = "printPreviewToolStripMenuItem"; + this.printPreviewToolStripMenuItem.Size = new System.Drawing.Size(151, 22); + this.printPreviewToolStripMenuItem.Text = "Print Pre&view"; + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(148, 6); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(151, 22); + this.exitToolStripMenuItem.Text = "E&xit"; + // + // platformToolStripMenuItem + // + this.platformToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addFiltersToolStripMenuItem, + this.addLanguagesToolStripMenuItem, + this.addDebToolStripMenuItem}); + this.platformToolStripMenuItem.Name = "platformToolStripMenuItem"; + this.platformToolStripMenuItem.Size = new System.Drawing.Size(59, 20); + this.platformToolStripMenuItem.Text = "&Platform"; + // + // addFiltersToolStripMenuItem + // + this.addFiltersToolStripMenuItem.Name = "addFiltersToolStripMenuItem"; + this.addFiltersToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.addFiltersToolStripMenuItem.Text = "&Add Filters"; + this.addFiltersToolStripMenuItem.Click += new System.EventHandler(this.addFiltersToolStripMenuItem_Click); + // + // addLanguagesToolStripMenuItem + // + this.addLanguagesToolStripMenuItem.Name = "addLanguagesToolStripMenuItem"; + this.addLanguagesToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.addLanguagesToolStripMenuItem.Text = "&Add Languages"; + this.addLanguagesToolStripMenuItem.Click += new System.EventHandler(this.addLanguagesToolStripMenuItem_Click); + // + // addDebToolStripMenuItem + // + this.addDebToolStripMenuItem.Name = "addDebToolStripMenuItem"; + this.addDebToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.addDebToolStripMenuItem.Text = "&Add Debug Channels"; + this.addDebToolStripMenuItem.Click += new System.EventHandler(this.addDebToolStripMenuItem_Click); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.undoToolStripMenuItem, + this.redoToolStripMenuItem, + this.toolStripSeparator5, + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem, + this.toolStripSeparator6, + this.selectAllToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.editToolStripMenuItem.Text = "&Edit"; + // + // undoToolStripMenuItem + // + this.undoToolStripMenuItem.Name = "undoToolStripMenuItem"; + this.undoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); + this.undoToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.undoToolStripMenuItem.Text = "&Undo"; + // + // redoToolStripMenuItem + // + this.redoToolStripMenuItem.Name = "redoToolStripMenuItem"; + this.redoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); + this.redoToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.redoToolStripMenuItem.Text = "&Redo"; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(147, 6); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripMenuItem.Image"))); + this.cutToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.cutToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.cutToolStripMenuItem.Text = "Cu&t"; + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripMenuItem.Image"))); + this.copyToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.copyToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.copyToolStripMenuItem.Text = "&Copy"; + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripMenuItem.Image"))); + this.pasteToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.pasteToolStripMenuItem.Text = "&Paste"; + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(147, 6); + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.selectAllToolStripMenuItem.Text = "Select &All"; + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.customizeToolStripMenuItem, + this.optionsToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.toolsToolStripMenuItem.Text = "&Tools"; + // + // customizeToolStripMenuItem + // + this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; + this.customizeToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.customizeToolStripMenuItem.Text = "&Customize"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.optionsToolStripMenuItem.Text = "&Options"; + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.contentsToolStripMenuItem, + this.indexToolStripMenuItem, + this.searchToolStripMenuItem, + this.toolStripSeparator7, + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20); + this.helpToolStripMenuItem.Text = "&Help"; + // + // contentsToolStripMenuItem + // + this.contentsToolStripMenuItem.Name = "contentsToolStripMenuItem"; + this.contentsToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.contentsToolStripMenuItem.Text = "&Contents"; + // + // indexToolStripMenuItem + // + this.indexToolStripMenuItem.Name = "indexToolStripMenuItem"; + this.indexToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.indexToolStripMenuItem.Text = "&Index"; + // + // searchToolStripMenuItem + // + this.searchToolStripMenuItem.Name = "searchToolStripMenuItem"; + this.searchToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.searchToolStripMenuItem.Text = "&Search"; + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(126, 6); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.aboutToolStripMenuItem.Text = "&About..."; + // + // pgProperties + // + this.pgProperties.Dock = System.Windows.Forms.DockStyle.Fill; + this.pgProperties.Location = new System.Drawing.Point(0, 0); + this.pgProperties.Name = "pgProperties"; + this.pgProperties.Size = new System.Drawing.Size(348, 304); + this.pgProperties.TabIndex = 9; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 49); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tvPlatform); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); + this.splitContainer1.Size = new System.Drawing.Size(820, 552); + this.splitContainer1.SplitterDistance = 468; + this.splitContainer1.TabIndex = 11; + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.tvProject); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.pgProperties); + this.splitContainer2.Size = new System.Drawing.Size(348, 552); + this.splitContainer2.SplitterDistance = 244; + this.splitContainer2.TabIndex = 0; + // + // tvPlatform + // + this.tvPlatform.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvPlatform.ImageIndex = 1; + this.tvPlatform.Location = new System.Drawing.Point(0, 0); + this.tvPlatform.Name = "tvPlatform"; + this.tvPlatform.SelectedImageIndex = 1; + this.tvPlatform.Size = new System.Drawing.Size(468, 552); + this.tvPlatform.TabIndex = 1; + // + // tvProject + // + this.tvProject.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvProject.Location = new System.Drawing.Point(0, 0); + this.tvProject.Name = "tvProject"; + this.tvProject.Size = new System.Drawing.Size(348, 244); + this.tvProject.TabIndex = 10; + // + // toolStripStatusLabel1 + // + this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; + this.toolStripStatusLabel1.Size = new System.Drawing.Size(109, 17); + this.toolStripStatusLabel1.Text = "toolStripStatusLabel1"; + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(820, 623); + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.toolStrip1); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Name = "MainForm"; + this.Text = "SysGen Platform Designer"; + this.Load += new System.EventHandler(this.MainForm_Load); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + this.splitContainer2.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private TriStateTreeViewDemo.PlatformTreeView tvPlatform; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton saveConfigToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + private System.Windows.Forms.ToolStripComboBox cmbArchitecture; + private System.Windows.Forms.ToolStripComboBox cmbDebug; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem printToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem printPreviewToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem undoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem redoToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem customizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem contentsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem indexToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.PropertyGrid pgProperties; + private System.Windows.Forms.ToolStripComboBox cmbOptimization; + private ProjectTreeView tvProject; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.ToolStripMenuItem platformToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addFiltersToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addLanguagesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addDebToolStripMenuItem; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; + } +} + diff --git a/reactos/tools/sysgen/RosBuilder/MainForm.cs b/reactos/tools/sysgen/RosBuilder/MainForm.cs new file mode 100644 index 00000000000..c001ba7d016 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/MainForm.cs @@ -0,0 +1,362 @@ +using System; +using System.Xml; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using TriStateTreeViewDemo; + +using SysGen.Framework.Catalog; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Log; +using SysGen.BuildEngine.Framework; +using SysGen.RBuild.Framework; + +namespace TriStateTreeViewDemo +{ + public interface ISysGenDesigner + { + ModuleFilterController ModuleFilterController { get; } + ProjectController ProjectController { get; } + object InspectedObject { set; } + } + + public partial class MainForm : Form, ISysGenDesigner + { + ProjectController m_ProjectController = null; + ModuleFilterController m_FilterController = null; + + public MainForm() + { + InitializeComponent(); + + m_ProjectController = new ProjectController(this); + m_FilterController = new ModuleFilterController(this); + + tvPlatform.SetCatalog(this); + tvProject.SetCatalog(this); + tvProject.DoubleClick += new EventHandler(tvProject_DoubleClick); + //lvModuleFilters.SetCatalog(this); + } + + private void button1_Click(object sender, EventArgs e) + { + //m_project = new RBuildProject(); + + m_ProjectController = new ProjectController(this); + m_FilterController = new ModuleFilterController(this); + + tvPlatform.SetCatalog(this); + tvProject.SetCatalog(this); + //lvModuleFilters.SetCatalog(this); + + //PlatformCatalogReader m_Reader = new PlatformCatalogReader(@"C:\Ros\trunk\reactos\rbuilddb.xml"); + + /* + BuildLog.Listeners.Clear(); + + m_SysGenEngine.SetDefaults = false; + m_SysGenEngine.RunBackends = false; + m_SysGenEngine.CleanCustomConfigs(); + m_SysGenEngine.ReadBuildFiles(); + + m_PlatformController = new PlatformController(this); + m_FilterController = new ModuleFilterController(this); + + catalogTriStateTreeView1.SetCatalog(this); + lvModuleFilters.SetCatalog(this); + */ + + } + + void tvProject_DoubleClick(object sender, EventArgs e) + { + } + + private void button2_Click(object sender, EventArgs e) + { + using (XmlTextWriter writer = new XmlTextWriter(@"c:\pkg.rbuild", Encoding.ASCII)) + { + writer.Indentation = 4; + writer.Formatting = Formatting.Indented; + + // Starts a new document + writer.WriteStartDocument(); + writer.WriteStartElement("module"); + writer.WriteAttributeString("name", ""); + writer.WriteAttributeString("type", "modulegroup"); + + foreach (RBuildModule module in m_ProjectController.Project.Platform.Modules) + { + writer.WriteElementString("requires", module.Name); + } + + writer.WriteEndElement(); + writer.WriteEndDocument(); + } + + } + + private void button3_Click(object sender, EventArgs e) + { + } + + public ModuleFilterController ModuleFilterController + { + get { return m_FilterController; } + } + + public ProjectController ProjectController + { + get { return m_ProjectController; } + } + + private void lvModuleFilters_SelectedIndexChanged(object sender, EventArgs e) + { + + } + + //private void lvModuleFilters_ItemCheck(object sender, ItemCheckEventArgs e) + //{ + // ModuleFiltersListViewItem filerListViewItem = lvModuleFilters.FocusedItem as ModuleFiltersListViewItem; + + // if (filerListViewItem != null) + // { + // if (e.NewValue == CheckState.Checked) + // { + // m_FilterController.Apply(filerListViewItem.Filter); + // } + // } + //} + + private void MainForm_Load(object sender, EventArgs e) + { + cmbArchitecture.Items.Add("x86 - (i486)"); + cmbArchitecture.Items.Add("x86 - (i586)"); + cmbArchitecture.Items.Add("x86 - (Pentium)"); + cmbArchitecture.Items.Add("x86 - (Pentium2)"); + cmbArchitecture.Items.Add("x86 - (Pentium3)"); + cmbArchitecture.Items.Add("x86 - (Pentium4)"); + cmbArchitecture.Items.Add("x86 - (athlon-xp)"); + cmbArchitecture.Items.Add("x86 - (athlon-mp)"); + cmbArchitecture.Items.Add("x86 - (k6-2)"); + cmbArchitecture.Items.Add("x86 - Xbox"); + cmbArchitecture.Items.Add("Power PC"); + cmbArchitecture.Items.Add("ARM"); + cmbArchitecture.SelectedIndex = 2; + + cmbDebug.Items.Add("Debug"); + cmbDebug.Items.Add("Release"); + cmbDebug.SelectedIndex = 0; + + cmbOptimization.Items.Add("Level 0"); + cmbOptimization.Items.Add("Level 1"); + cmbOptimization.Items.Add("Level 2"); + cmbOptimization.Items.Add("Level 3"); + cmbOptimization.Items.Add("Level 4"); + cmbOptimization.Items.Add("Level 5"); + cmbOptimization.SelectedIndex = 1; + } + + public object InspectedObject + { + set + { + if (value is RBuildPlatform) + { + pgProperties.SelectedObject = new PlatformInspector(m_ProjectController.Project.Platform); + } + else + pgProperties.SelectedObject = value; + } + } + + private void openToolStripButton_Click(object sender, EventArgs e) + { + m_ProjectController.Open(); + } + + private void saveToolStripButton_Click(object sender, EventArgs e) + { + m_ProjectController.Save(); + } + + private void saveConfigToolStripButton_Click(object sender, EventArgs e) + { + //if (MessageBox.Show("Your platform does not have a default shell selected ¿are you sure you want to continue?", + // "Question", + // MessageBoxButtons.YesNo, + // MessageBoxIcon.Question) == DialogResult.OK) + //{ + // Creates an XML file is not exist + using (XmlTextWriter writer = new XmlTextWriter(m_ProjectController.SysGenProject.Source + @"\config.rbuild", Encoding.ASCII)) + { + writer.Indentation = 4; + writer.Formatting = Formatting.Indented; + + // Starts a new document + writer.WriteStartDocument(); + writer.WriteStartElement("group"); + + writer.WriteComment("Platform information"); + writer.WriteElementString("platformname", m_ProjectController.Project.Platform.Name); + writer.WriteElementString("platformdescription", m_ProjectController.Project.Platform.Description); + + writer.WriteComment("Default applications"); + + if (m_ProjectController.Project.Platform.Shell != null) + { + writer.WriteElementString("platformshell", m_ProjectController.Project.Platform.Shell.Name); + } + + if (m_ProjectController.Project.Platform.Screensaver != null) + { + writer.WriteElementString("platformscreensaver", m_ProjectController.Project.Platform.Screensaver.Name); + } + + if (m_ProjectController.Project.Platform.Wallpaper != null) + { + writer.WriteElementString("platformwallpaper", m_ProjectController.Project.Platform.Wallpaper.ID); + } + + writer.WriteComment("Modules incuded in the platform"); + foreach (RBuildModule module in m_ProjectController.Project.Platform.Modules) + { + writer.WriteElementString("platformmodule", module.Name); + } + + writer.WriteComment("Languages incuded in the platform"); + foreach (RBuildLanguage language in m_ProjectController.Project.Platform.Languages) + { + writer.WriteElementString("platformlanguage", language.Name); + } + + writer.WriteComment("Debug Channels incuded in the platform"); + foreach (RBuildDebugChannel debugChannel in m_ProjectController.Project.Platform.DebugChannels) + { + writer.WriteElementString("platformdebugchhanel", debugChannel.Name); + } + + writer.WriteComment("Platform RBuild Properties"); + writer.WriteComment("Properties"); + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "SARCH"); + writer.WriteAttributeString("value", ""); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "OARCH"); + writer.WriteAttributeString("value", "pentium"); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "OPTIMIZE"); + writer.WriteAttributeString("value", ((int)m_ProjectController.SysGenProject.OptimizeLevel).ToString()); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "KDBG"); + writer.WriteAttributeString("value", m_ProjectController.SysGenProject.KDebug ? "1" : "0"); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "DBG"); + writer.WriteAttributeString("value", m_ProjectController.SysGenProject.Debug ? "1" : "0"); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "GDB"); + writer.WriteAttributeString("value", m_ProjectController.SysGenProject.GDB ? "1" : "0"); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "NSWPAT"); + writer.WriteAttributeString("value", m_ProjectController.SysGenProject.NSWPAT ? "1" : "0"); + writer.WriteEndElement(); + + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", "_WINKD_"); + writer.WriteAttributeString("value", m_ProjectController.SysGenProject.WINKD ? "1" : "0"); + writer.WriteEndElement(); + + writer.WriteEndElement(); + writer.WriteEndDocument(); + // } + } + } + + private void newToolStripButton_Click(object sender, EventArgs e) + { + m_ProjectController.New(); + } + + private void addFiltersToolStripMenuItem_Click(object sender, EventArgs e) + { + using (NewItemForm newItem = new NewItemForm()) + { + foreach (ModuleFilter filter in ModuleFilterController.ModuleFilters) + { + newItem.ListView.Items.Add(new ModuleFiltersNewItemListViewItem(this, filter)); + } + + if (newItem.ShowDialog() == DialogResult.OK) + { + foreach (ListViewItem lvItem in newItem.ListView.SelectedItems) + { + NewItemListViewItem item = lvItem as NewItemListViewItem; + + if (item != null) + item.Apply(); + } + } + } + } + + private void addLanguagesToolStripMenuItem_Click(object sender, EventArgs e) + { + using (NewItemForm newItem = new NewItemForm()) + { + foreach (RBuildLanguage language in m_ProjectController.Project.Languages) + { + newItem.ListView.Items.Add(new LanguageNewItemListViewItem(this, language)); + } + + if (newItem.ShowDialog() == DialogResult.OK) + { + foreach (ListViewItem lvItem in newItem.ListView.SelectedItems) + { + NewItemListViewItem item = lvItem as NewItemListViewItem; + + if (item != null) + item.Apply(); + } + } + } + } + + private void addDebToolStripMenuItem_Click(object sender, EventArgs e) + { + using (NewItemForm newItem = new NewItemForm()) + { + foreach (RBuildDebugChannel channel in m_ProjectController.Project.DebugChannels) + { + newItem.ListView.Items.Add(new DebugChannelNewItemListViewItem(this, channel)); + } + + if (newItem.ShowDialog() == DialogResult.OK) + { + foreach (ListViewItem lvItem in newItem.ListView.SelectedItems) + { + NewItemListViewItem item = lvItem as NewItemListViewItem; + + if (item != null) + item.Apply(); + } + } + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/MainForm.resx b/reactos/tools/sysgen/RosBuilder/MainForm.resx new file mode 100644 index 00000000000..222877d4dd7 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/MainForm.resx @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 127, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + + 226, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAY5JREFUOE+d081L + AkEUAPD1T+hYhzoERV77OHUo8JBBt+4RRkSQ4U0SunaJOkSRKQWZWCiF5kdroa0WRAoRFXXoEEkWCUFY + Wbvrvnqz7NK6OxANPIZh5v1m3uyOKZK5AaamiaLICILACDzPtDXXM+3mRlPtGnWMAK15g4fQabVBYDej + 20QFdtJXVGBxg4Xk8aWMRDhjJLh/TgUW1hPQ1T+ihmEZgXieCghiFRBRIEPAFzkxBO4fSsByOfBsRkkE + 4xkoFEv6Mla3szoAF2Jy+E2A0KMc/nyRINe3BS2yspXSAf4YR5Kfq/LUE1QJopxEU8qSP6kD5nwxFUAE + A0E8hdM1rz0BXtDvhheHwMEnwKkkJ2OPAJMuw+TUDB2QJAneKzxgCRNnHwTBUJJd3ijYx8fowBcvwstr + BXIXdxBOZAmCu2JgssMxBGvOOmNA+d5KP+sJw17qiJRjn3bDwOAocF4LQMWtRTABf9W/hLWjFcpsA0Fc + tm76+6C+vJ+J4b4WgmAp/0bMTXVg6ekFNrQM3y3xMcC3lb+tAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/ModuleFilter.cs b/reactos/tools/sysgen/RosBuilder/ModuleFilter.cs new file mode 100644 index 00000000000..0853aeec8a1 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/ModuleFilter.cs @@ -0,0 +1,295 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.BuildEngine; +using SysGen.BuildEngine.Framework; +using SysGen.RBuild.Framework; + +namespace TriStateTreeViewDemo +{ + public class ModuleFilterController + { + private List m_ModuleFilters = new List(); + private ISysGenDesigner m_SysGenDesigner = null; + + public ModuleFilterController(ISysGenDesigner engine) + { + //The engine... + m_SysGenDesigner = engine; + + RegisterDinamicFilters(); + RegisterModuleGroups(); + InitializeFilters(); + } + + private void RegisterDinamicFilters() + { + m_ModuleFilters.Add(new AllModuleFilter()); + m_ModuleFilters.Add(new AllWin32CUIModuleFilter()); + m_ModuleFilters.Add(new AllWin32GUIModuleFilter()); + m_ModuleFilters.Add(new AllScreenSaversModuleFilter()); + m_ModuleFilters.Add(new AllKeyboardLayoutsModuleFilter()); + m_ModuleFilters.Add(new AllDriversModuleFilter()); + m_ModuleFilters.Add(new AllDllsModuleFilter()); + } + + private void RegisterModuleGroups() + { + foreach (RBuildModule module in m_SysGenDesigner.ProjectController.AvailableModules) + { + if (module.Type == ModuleType.ModuleGroup) + { + m_ModuleFilters.Add(new PackageModuleFilter(module)); + } + } + } + + private void InitializeFilters() + { + foreach (ModuleFilter filter in m_ModuleFilters) + { + filter.Designer = m_SysGenDesigner; + filter.Initialize(); + } + } + + public List ModuleFilters + { + get { return m_ModuleFilters; } + } + + public void Apply(ModuleFilter filter) + { + m_SysGenDesigner.ProjectController.Add(filter.Modules); + } + + public void Remove(ModuleFilter filter) + { + //m_SysGenDesigner.PlatformController.Remove(filter.Modules); + } + } + + public abstract class ModuleFilter + { + protected ISysGenDesigner m_Project = null; + protected RBuildModuleCollection m_Modules = new RBuildModuleCollection(); + + public ModuleFilter() + { + } + + public virtual void Initialize() + { + ExecuteRule(); + } + + public abstract void ExecuteRule(); + + public RBuildModuleCollection Modules + { + get { return m_Modules; } + } + + public ISysGenDesigner Designer + { + get { return m_Project; } + set { m_Project = value; } + } + + public abstract string Name { get; } + + public override string ToString() + { + return string.Format("{0} - ({1} modules)", + Name, + Modules.Count); + } + } + + public class PackageModuleFilter : ModuleFilter + { + RBuildModule m_Module = null; + + public PackageModuleFilter(RBuildModule module) + { + //Save the underlaying module... + m_Module = module; + } + + public override string Name + { + get { return (m_Module.Description != null) ? m_Module.Description : m_Module.Name; } + } + + public override void ExecuteRule() + { + Modules.Add(m_Module.Needs); + } + } + + public class AllModuleFilter : ModuleFilter + { + public AllModuleFilter() + { + } + + public override string Name + { + get { return "All"; } + } + + public override void ExecuteRule() + { + foreach (RBuildModule module in Designer.ProjectController.AvailableModules) + { + if (Modules.Contains(module) == false) + Modules.Add(module); + } + } + } + + public class AllWin32CUIModuleFilter : ModuleFilter + { + public AllWin32CUIModuleFilter() + { + } + + public override string Name + { + get { return "All Console Applications"; } + } + + public override void ExecuteRule() + { + foreach (RBuildModule module in Designer.ProjectController.AvailableModules) + { + if (module.Type == ModuleType.Win32CUI) + { + if (Modules.Contains(module) == false) + Modules.Add(module); + } + } + } + } + + public class AllWin32GUIModuleFilter : ModuleFilter + { + public AllWin32GUIModuleFilter() + { + } + + public override string Name + { + get { return "All Graphical Applications"; } + } + + public override void ExecuteRule() + { + foreach (RBuildModule module in Designer.ProjectController.AvailableModules) + { + if (module.Type == ModuleType.Win32GUI) + { + if (Modules.Contains(module) == false) + Modules.Add(module); + } + } + } + } + + public class AllScreenSaversModuleFilter : ModuleFilter + { + public AllScreenSaversModuleFilter() + { + } + + public override string Name + { + get { return "All ScreenSavers"; } + } + + public override void ExecuteRule() + { + foreach (RBuildModule module in Designer.ProjectController.AvailableModules) + { + if (module.Type == ModuleType.Win32SCR) + { + if (Modules.Contains(module) == false) + Modules.Add(module); + } + } + } + } + + public class AllKeyboardLayoutsModuleFilter : ModuleFilter + { + public AllKeyboardLayoutsModuleFilter() + { + } + + public override string Name + { + get { return "All Keyboard Layouts"; } + } + + public override void ExecuteRule() + { + foreach (RBuildModule module in Designer.ProjectController.AvailableModules) + { + if (module.Type == ModuleType.KeyboardLayout) + { + if (Modules.Contains(module) == false) + Modules.Add(module); + } + } + } + } + + public class AllDriversModuleFilter : ModuleFilter + { + public AllDriversModuleFilter() + { + } + + public override string Name + { + get { return "All Drivers"; } + } + + public override void ExecuteRule() + { + foreach (RBuildModule module in Designer.ProjectController.AvailableModules) + { + if (module.Type == ModuleType.KernelModeDriver) + { + if (Modules.Contains(module) == false) + Modules.Add(module); + } + } + } + } + + public class AllDllsModuleFilter : ModuleFilter + { + public AllDllsModuleFilter() + { + } + + public override string Name + { + get { return "All Dlls"; } + } + + public override void ExecuteRule() + { + foreach (RBuildModule module in Designer.ProjectController.AvailableModules) + { + if (module.Type == ModuleType.Win32DLL) + { + if (Modules.Contains(module) == false) + Modules.Add(module); + } + } + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/NewItemForm.Designer.cs b/reactos/tools/sysgen/RosBuilder/NewItemForm.Designer.cs new file mode 100644 index 00000000000..81bcb58e30d --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/NewItemForm.Designer.cs @@ -0,0 +1,135 @@ +namespace TriStateTreeViewDemo +{ + partial class NewItemForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lbItems = new System.Windows.Forms.Label(); + this.lvAddItem = new System.Windows.Forms.ListView(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.lbDescription = new System.Windows.Forms.Label(); + this.lbName = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // lbItems + // + this.lbItems.AutoSize = true; + this.lbItems.Location = new System.Drawing.Point(12, 24); + this.lbItems.Name = "lbItems"; + this.lbItems.Size = new System.Drawing.Size(78, 13); + this.lbItems.TabIndex = 0; + this.lbItems.Text = "Available Items"; + // + // lvAddItem + // + this.lvAddItem.Location = new System.Drawing.Point(12, 40); + this.lvAddItem.Name = "lvAddItem"; + this.lvAddItem.Size = new System.Drawing.Size(583, 236); + this.lvAddItem.TabIndex = 1; + this.lvAddItem.UseCompatibleStateImageBehavior = false; + this.lvAddItem.View = System.Windows.Forms.View.List; + this.lvAddItem.DoubleClick += new System.EventHandler(this.lvAddItem_DoubleClick); + // + // btnAdd + // + this.btnAdd.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnAdd.Location = new System.Drawing.Point(439, 348); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Size = new System.Drawing.Size(75, 23); + this.btnAdd.TabIndex = 2; + this.btnAdd.Text = "Add"; + this.btnAdd.UseVisualStyleBackColor = true; + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(520, 348); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 3; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + // + // lbDescription + // + this.lbDescription.AutoSize = true; + this.lbDescription.Location = new System.Drawing.Point(12, 279); + this.lbDescription.Name = "lbDescription"; + this.lbDescription.Size = new System.Drawing.Size(79, 13); + this.lbDescription.TabIndex = 4; + this.lbDescription.Text = "Select any item"; + // + // lbName + // + this.lbName.AutoSize = true; + this.lbName.Location = new System.Drawing.Point(9, 308); + this.lbName.Name = "lbName"; + this.lbName.Size = new System.Drawing.Size(35, 13); + this.lbName.TabIndex = 5; + this.lbName.Text = "&Name"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(53, 305); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(542, 20); + this.textBox1.TabIndex = 6; + // + // NewItemForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(607, 383); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.lbName); + this.Controls.Add(this.lbDescription); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnAdd); + this.Controls.Add(this.lvAddItem); + this.Controls.Add(this.lbItems); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "NewItemForm"; + this.Text = "Add Item"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbItems; + private System.Windows.Forms.ListView lvAddItem; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Label lbDescription; + private System.Windows.Forms.Label lbName; + private System.Windows.Forms.TextBox textBox1; + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/NewItemForm.cs b/reactos/tools/sysgen/RosBuilder/NewItemForm.cs new file mode 100644 index 00000000000..4101b0c988c --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/NewItemForm.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace TriStateTreeViewDemo +{ + public partial class NewItemForm : Form + { + public NewItemForm() + { + InitializeComponent(); + } + + public ListView ListView + { + get { return lvAddItem; } + } + + private void lvAddItem_DoubleClick(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/NewItemForm.resx b/reactos/tools/sysgen/RosBuilder/NewItemForm.resx new file mode 100644 index 00000000000..19dc0dd8b39 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/NewItemForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/PlatformCatalogReader.cs b/reactos/tools/sysgen/RosBuilder/PlatformCatalogReader.cs new file mode 100644 index 00000000000..7a847340622 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/PlatformCatalogReader.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections; +using System.Diagnostics; +using System.Text; +using System.Xml; +using System.Collections.Generic; + +using SysGen.RBuild.Framework; + +namespace SysGen.Framework.Catalog +{ + public class PlatformCatalogReader + { + XmlDocument doc = new XmlDocument(); + + RBuildProject m_Project = new RBuildProject(); + + public PlatformCatalogReader(string filename) + { + doc.Load(filename); + } + + public RBuildProject Project + { + get { return m_Project; } + } + + public void Read() + { + + foreach (XmlNode node in doc.SelectSingleNode("/catalog/modules").ChildNodes) + { + RBuildModule module = new RBuildModule(); + + module.Type = (ModuleType)Enum.Parse(typeof(ModuleType), node.Attributes["type"].Value.ToString()); + module.Name = node.Attributes["name"].Value.ToString(); + module.Folder.Base = node.Attributes["base"].Value.ToString(); + module.CatalogPath = node.Attributes["path"].Value.ToString(); + module.Description = node.Attributes["desc"].Value.ToString(); + + m_Project.Modules.Add(module); + } + + foreach (XmlNode node in doc.SelectSingleNode("/catalog/modules").ChildNodes) + { + RBuildModule module = m_Project.Modules.GetByName(node.Attributes["name"].Value.ToString()); + + foreach (XmlNode snode in node.SelectSingleNode("libraries").ChildNodes) + { + module.Libraries.Add(m_Project.Modules.GetByName(snode.InnerText)); + } + + foreach (XmlNode snode in node.SelectSingleNode("dependencies").ChildNodes) + { + module.Dependencies.Add(m_Project.Modules.GetByName(snode.InnerText)); + } + + foreach (XmlNode snode in node.SelectSingleNode("requeriments").ChildNodes) + { + module.Requeriments.Add(m_Project.Modules.GetByName(snode.InnerText)); + } + } + + foreach (XmlNode node in doc.SelectSingleNode("/catalog/languages").ChildNodes) + { + RBuildLanguage language = new RBuildLanguage(); + + language.Name = node.Attributes["name"].Value.ToString(); + + m_Project.Languages.Add(language); + } + + foreach (XmlNode node in doc.SelectSingleNode("/catalog/debugchannels").ChildNodes) + { + RBuildDebugChannel language = new RBuildDebugChannel(); + + language.Name = node.Attributes["name"].Value.ToString(); + + m_Project.DebugChannels.Add(language); + } + + /* + RBuildModuleInfoCollection modules = new RBuildModuleInfoCollection(); + + + WhitespaceHandling = WhitespaceHandling.None; + + ReadStartElement("modules"); + while (Name == "module") + { + RBuildModuleInfo module = new RBuildModuleInfo(); + + MoveToFirstAttribute(); + do + { + switch (Name) + { + case "name": + module.Name = Value; + break; + case "type": + module.Type = (ModuleType)Enum.Parse(typeof(ModuleType), Value); + break; + case "base": + module.Base = Value; + break; + case "desc": + module.CatalogPath = Value; + break; + case "path": + module.CatalogPath = Value; + break; + } + + } + while (MoveToNextAttribute()); + + MoveToElement(); + + //Read(); + //Read(); + + if (Name == "libraries") + { + if (!IsEmptyElement) + { + ReadStartElement("libraries"); + while (Name == "library") + { + ReadStartElement("library"); + module.Libraries.Add(ReadContentAsString()); + ReadEndElement(); + } + ReadEndElement(); + } + else + ReadStartElement("libraries"); + } + + if (Name == "dependencies") + { + if (!IsEmptyElement) + { + ReadStartElement("dependencies"); + while (Name == "dependency") + { + ReadStartElement("dependency"); + module.Dependencies.Add(ReadContentAsString()); + ReadEndElement(); + } + ReadEndElement(); + } + else + ReadStartElement("dependencies"); + } + + if (Name == "requeriments") + { + if (!IsEmptyElement) + { + ReadStartElement("requeriments"); + while (Name == "requires") + { + ReadStartElement("requires"); + module.Requirements.Add(ReadContentAsString()); + ReadEndElement(); + } + ReadEndElement(); + } + else + ReadStartElement("requeriments"); + } + + modules.Add(module); + + Read(); + } + + ReadEndElement(); + + foreach (RBuildModuleInfo moduleInfo in modules) + { + RBuildModule module = new RBuildModule(); + + module.Type = moduleInfo.Type; + module.Name = moduleInfo.Name; + + m_Modules.Add(module); + } + + foreach (RBuildModuleInfo moduleInfo in modules) + { + RBuildModule module = m_Modules.GetByName(moduleInfo.Name); + + foreach (string library in moduleInfo.Libraries) + module.Libraries.Add(m_Modules.GetByName(library)); + + foreach (string library in moduleInfo.Dependencies) + module.Dependencies.Add(m_Modules.GetByName(library)); + + foreach (string library in moduleInfo.Requirements) + module.Requeriments.Add(m_Modules.GetByName(library)); + }*/ + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/PlatformController.cs b/reactos/tools/sysgen/RosBuilder/PlatformController.cs new file mode 100644 index 00000000000..1d710cb372f --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/PlatformController.cs @@ -0,0 +1,86 @@ +using System; +using System.Windows.Forms; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; + +namespace TriStateTreeViewDemo +{ + public class PlatformController + { + private ISysGenDesigner m_SysGenDesigner = null; + + public PlatformController(ISysGenDesigner engine) + { + m_SysGenDesigner = engine; + } + + public ProjectTask ProjectTask + { + get { return m_SysGenDesigner.SysGenEngine.ProjectTask; } + } + + public RBuildProject Project + { + get { return m_SysGenDesigner.SysGenEngine.Project; } + } + + public void Remove(RBuildModule module) + { + } + + public void Add(RBuildModule module) + { + SysGenDependencyTracker dependencyTracker = new SysGenDependencyTracker(module , Project.Platform.Modules); + + if (AskAddModulesToPlatform(dependencyTracker.Missing)) + { + Project.Platform.Modules.Add(dependencyTracker.Dependencies); + } + } + + public void Add(RBuildModuleCollection modules) + { + SysGenDependencyTracker dependencyTracker = new SysGenDependencyTracker(modules, Project.Platform.Modules); + + if (AskAddModulesToPlatform(dependencyTracker.Missing)) + { + Project.Platform.Modules.Add(dependencyTracker.Dependencies); + } + } + + public bool AskAddModulesToPlatform(RBuildModuleCollection missingDependencies) + { + if (missingDependencies.Count > 0) + { + StringBuilder str = new StringBuilder(); + + str.AppendFormat("This action requieres adding {0} dependecies no present in your platform :", missingDependencies.Count); + str.AppendLine(); + str.AppendLine(); + + foreach (RBuildModule dependency in missingDependencies) + { + str.AppendFormat("{0} on '{1}' \n", + dependency.Name, + dependency.Base); + } + + str.AppendLine(); + str.AppendLine("¿Do you want to add this dependencies?"); + + if (MessageBox.Show(str.ToString(), "RosBuilder", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) + { + return true; + } + } + else + return true; + + return false; + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Program.cs b/reactos/tools/sysgen/RosBuilder/Program.cs new file mode 100644 index 00000000000..6d9cbcb5b1f --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Program.cs @@ -0,0 +1,109 @@ +using System; +using System.Reflection; +using System.Collections.Generic; +using System.Windows.Forms; + +using TriStateTreeViewDemo; + +namespace TriStateTreeViewDemo +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main(string[] args) + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + MainForm mainForm = new MainForm(); + + if (args.Length == 0) + { + //Create file associations from .dnml files to the script engine + CreateFileAssociation(); + } + else if (args[0].ToLower() == "remove") + { + //Remove file associations for .dnml files to the script engine + RemoveFileAssociation(); + } + else + { + mainForm.ProjectController.Open(args[0]); + + if (args.Length > 1) + { + if (args[1].ToLower() == "x86") + { + MessageBox.Show("86"); + } + else if (args[1].ToLower() == "ppc") + { + MessageBox.Show("ppc"); + } + else if (args[1].ToLower() == "arm") + { + MessageBox.Show("arm"); + } + else + { + MessageBox.Show("Unknown Architecture"); + } + + if (args.Length > 2) + { + if (args[2].ToLower() == "debug") + { + mainForm.ProjectController.SysGenProject.Debug = true; + } + else if (args[2].ToLower() == "release") + { + mainForm.ProjectController.SysGenProject.Debug = false; + } + else + { + MessageBox.Show("Unknown Target Mode"); + } + } + } + } + + //Run the application + Application.Run(mainForm); + } + + internal static void CreateFileAssociation() + { + FileAssociation FA = new FileAssociation(); + FA.Extension = "sgpd"; + FA.ContentType = "application/sysgenproject"; + FA.FullName = "SysGenProject"; + FA.ProperName = "SysGenProject"; + FA.AddCommand("open", "\"" + Assembly.GetExecutingAssembly().Location + "\" \" %1\""); + FA.AddCommand("edit", "notepad.exe %1"); + FA.AddCommand("Generate x86", "\"" + Assembly.GetExecutingAssembly().Location + "\" \" %1\" X86 RELEASE"); + FA.AddCommand("Generate x86 [DEBUG]", "\"" + Assembly.GetExecutingAssembly().Location + "\" \" %1\" X86 DEBUG"); + FA.IconPath = Assembly.GetExecutingAssembly().Location; + FA.IconIndex = 0; + FA.Create(); + } + + internal static void RemoveFileAssociation() + { + FileAssociation FA = new FileAssociation(); + FA.Extension = "sgpd"; + FA.ContentType = "application/sysgenproject"; + FA.FullName = "SysGenProject"; + FA.ProperName = "SysGenProject"; + FA.AddCommand("open", Assembly.GetExecutingAssembly().Location + " %1"); + FA.AddCommand("edit", "notepad.exe %1"); + FA.AddCommand("edit123", "notepad.exe %1"); + FA.IconPath = Assembly.GetExecutingAssembly().Location; + FA.IconIndex = 0; + FA.Remove(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Project/Project.cs b/reactos/tools/sysgen/RosBuilder/Project/Project.cs new file mode 100644 index 00000000000..f024dc385a5 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Project/Project.cs @@ -0,0 +1,267 @@ +using System; +using System.Collections.Specialized; +using System.Collections.Generic; +using System.Xml; +using System.Collections; +using System.IO; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace TriStateTreeViewDemo +{ + public enum TargetArchitectureType + { + X86, + X86_i486, + X86_i586, + X86_Pentium, + X86_Pentium2, + X86_Pentium3, + X86_Pentium4, + X86_AthlonXP, + X86_AthlonMP, + X86_Xbox, + PPC, + ARM + } + + public enum OptimizeLevelType : int + { + Level_0 = 0, + Level_1 = 1, + Level_2 = 2, + Level_3 = 3, + Level_4 = 4, + Level_5 = 5 + } + + public class Project : RBuildPlatform + { + RBuildProject m_Project = null; + + string m_FilePath; // full path to this project, including filename + string m_FileName = "Unnamed"; + + //MovieOptions movieOptions; + //CompilerOptions compilerOptions; + //PathCollection classpaths; + //PathCollection compileTargets; + //HiddenPathCollection hiddenPaths; + //AssetCollection libraryAssets; + bool traceEnabled; // selected configuration + + public bool NoOutput; // Disable file building + public string InputPath; // For code injection + public string OutputPath; + public string PreBuildEvent; + public string PostBuildEvent; + public string TestMovieCommand; + public bool AlwaysRunPostBuild; + public bool ShowHiddenPaths; + + public string Source; + + public Project(RBuildProject project,string path) + { + m_FilePath = path; + m_FileName = Path.GetFileName(path); + m_Project = project; + m_Project.Platform = this; + } + + public Project(RBuildProject project) + { + m_Project = project; + m_Project.Platform = this; + } + + public RBuildProject RBuildProject + { + get { return m_Project; } + } + + public virtual bool UsesInjection { get { return false; } } + public virtual bool HasLibraries { get { return false; } } + public virtual void ValidateBuild(out string error) { error = null; } + + #region Simple Properties + + public string ProjectPath { get { return m_FilePath; } set { m_FilePath = value; } } + //public string Name { get { return Path.GetFileNameWithoutExtension(path).Replace(' ', '-'); } } + public string Directory { get { return Path.GetDirectoryName(m_FilePath); } } + public Boolean TraceEnabled { set { traceEnabled = value; } get { return traceEnabled; } } + + public string FileName + { + get { return m_FileName; } + } + + //// we only provide getters for these to preserve the original pointer + //public MovieOptions MovieOptions { get { return movieOptions; } } + //public PathCollection Classpaths { get { return classpaths; } } + //public PathCollection CompileTargets { get { return compileTargets; } } + //public HiddenPathCollection HiddenPaths { get { return hiddenPaths; } } + //public AssetCollection LibraryAssets { get { return libraryAssets; } } + + //public CompilerOptions CompilerOptions + //{ + // get { return compilerOptions; } + // set { compilerOptions = value; } + //} + + //public PathCollection AbsoluteClasspaths + //{ + // get + // { + // PathCollection absolute = new PathCollection(); + // foreach (string cp in classpaths) + // absolute.Add(GetAbsolutePath(cp)); + // return absolute; + // } + //} + + //public string OutputPathAbsolute { get { return GetAbsolutePath(OutputPath); } } + + public bool CanBuild + { + get { return OutputPath != null && OutputPath.Length > 0; } + } + + #endregion + + #region Methods + + // all the Set/Is methods expect absolute paths (as opposed to the way they're + // actually stored) + + //public void SetPathHidden(string path, bool isHidden) + //{ + // path = GetRelativePath(path); + + // if (isHidden) + // { + // hiddenPaths.Add(path); + // compileTargets.RemoveAtOrBelow(path); // can't compile hidden files + // libraryAssets.RemoveAtOrBelow(path); // can't embed hidden resources + // } + // else hiddenPaths.Remove(path); + //} + + //public bool IsPathHidden(string path) + //{ + // return hiddenPaths.IsHidden(GetRelativePath(path)); + //} + + public void SetCompileTarget(string path, bool isCompileTarget) + { + //if (isCompileTarget) + // compileTargets.Add(GetRelativePath(path)); + //else + // compileTargets.Remove(GetRelativePath(path)); + } + + //public bool IsCompileTarget(string path) { return compileTargets.Contains(GetRelativePath(path)); } + + public void SetLibraryAsset(string path, bool isLibraryAsset) + { + //if (isLibraryAsset) + // libraryAssets.Add(GetRelativePath(path)); + //else + // libraryAssets.Remove(GetRelativePath(path)); + } + + //public bool IsLibraryAsset(string path) { return libraryAssets.Contains(GetRelativePath(path)); } +// public LibraryAsset GetAsset(string path) { return libraryAssets[GetRelativePath(path)]; } + + public void ChangeAssetPath(string fromPath, string toPath) + { + //if (IsLibraryAsset(fromPath)) + //{ + // //LibraryAsset asset = libraryAssets[GetRelativePath(fromPath)]; + // //libraryAssets.Remove(asset); + // //asset.Path = GetRelativePath(toPath); + // //libraryAssets.Add(asset); + //} + } + + //public bool IsInput(string path) { return GetRelativePath(path) == InputPath; } + //public bool IsOutput(string path) { return GetRelativePath(path) == OutputPath; } + + /// + /// Call this when you delete a path so we can remove all our references to it + /// + public void NotifyPathsDeleted(string path) + { + //path = GetRelativePath(path); + //hiddenPaths.Remove(path); + //compileTargets.RemoveAtOrBelow(path); + //libraryAssets.RemoveAtOrBelow(path); + } + + /// + /// Returns the path to the "obj\" subdirectory, creating it if necessary. + /// + public string GetObjDirectory() + { + string objPath = Path.Combine(this.Directory, "obj"); + if (!System.IO.Directory.Exists(objPath)) + System.IO.Directory.CreateDirectory(objPath); + return objPath; + } + + #endregion + + #region Relative Path Helpers + + //public string GetRelativePath(string path) + //{ + // return ProjectPaths.GetRelativePath(this.Directory,path); + //} + + //public string GetAbsolutePath(string path) + //{ + // return ProjectPaths.GetAbsolutePath(this.Directory,path); + //} + + #endregion + + public Project Load() + { + ProjectReader reader = new ProjectReader(this, ProjectPath); + + try + { + return reader.ReadProject(); + } + catch (XmlException exception) + { + string format = string.Format("Error in Project '{0}' line {1}, position {2}.", + ProjectPath, + exception.LineNumber, + exception.LinePosition); + + throw new Exception(format, exception); + } + finally + { + reader.Close(); + } + } + + public void Save() + { + ProjectWriter writer = new ProjectWriter(this, ProjectPath); + + try + { + writer.WriteProject(); + writer.Flush(); + } + finally + { + writer.Close(); + } + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Project/ProjectReader.cs b/reactos/tools/sysgen/RosBuilder/Project/ProjectReader.cs new file mode 100644 index 00000000000..4fec3546bc6 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Project/ProjectReader.cs @@ -0,0 +1,319 @@ +using System; +using System.Windows.Forms; +using System.Collections; +using System.Diagnostics; +using System.Text; +using System.Xml; +using System.Collections.Generic; + +using SysGen.RBuild.Framework; + +namespace TriStateTreeViewDemo +{ + public class ProjectReader : XmlTextReader + { + Project project; + + public ProjectReader(Project project, string filename) + : base(filename) + { + this.project = project; + WhitespaceHandling = WhitespaceHandling.None; + } + + protected Project Project { get { return project; } } + + public virtual Project ReadProject() + { + MoveToContent(); + + while (Read()) + ProcessNode(Name); + + return project; + } + + private void ReadModules() + { + RBuildModule module = null; + + ReadStartElement("modules"); + while (Name == "module") + { + try + { + module = project.RBuildProject.Modules.GetByName(GetAttribute("name")); + + if (module == null) + throw new Exception("Unkown module '" + Value + "'"); + + project.Modules.Add(module); + + //project.SysGenDesinger.PlatformController.Project.Platform.Modules.Add(module); + } + catch (Exception e) + { + MessageBox.Show( + e.Message, + "Error", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + + //project.Modules.Add(GetAttribute("name")); + + // continue reading + Read(); + } + + ReadEndElement(); + } + + private void ReadLanguages() + { + RBuildLanguage language = null; + + ReadStartElement("languages"); + while (Name == "language") + { + try + { + language = project.RBuildProject.Languages.GetByName(GetAttribute("name")); + + if (language == null) + throw new Exception("Unkown language '" + Value + "'"); + + project.Languages.Add(language); + } + catch (Exception e) + { + MessageBox.Show(e.Message, + "Error", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + + // continue reading + Read(); + } + + ReadEndElement(); + } + + //private void ReadRSLPaths() + //{ + // //project.CompilerOptions.RSLPaths = ReadLibrary("rslPaths"); + //} + + //private void ReadExternalLibraryPaths() + //{ + // //project.CompilerOptions.ExternalLibraryPaths = ReadLibrary("externalLibraryPaths"); + //} + + //private void ReadLibrayPath() + //{ + // //project.CompilerOptions.LibraryPaths = ReadLibrary("libraryPaths"); + //} + + //private void ReadIncludeLibraries() + //{ + // //project.CompilerOptions.IncludeLibraries = ReadLibrary("includeLibraries"); + //} + + //private string[] ReadLibrary(string name) + //{ + // ReadStartElement(name); + // List elements = new List(); + // while (Name == "element") + // { + // elements.Add(GetAttribute("path")); + // Read(); + // } + // ReadEndElement(); + // string[] result = new string[elements.Count]; + // elements.CopyTo(result); + // return result; + //} + + public void ReadApplications() + { + ReadStartElement("applications"); + while (Name == "option") + { + MoveToFirstAttribute(); + switch (Name) + { + case "shell": + project.Shell = Project.RBuildProject.Modules.GetByName(Value); + break; + case "screensaver": + project.Screensaver = Project.RBuildProject.Modules.GetByName(Value); + break; + case "wallpaper": + //project.Wallpaper = Value; + break; + } + Read(); + } + ReadEndElement(); + } + + //protected virtual void ProcessNode(string name) + //{ + // switch (name) + // { + // case "output": ReadOutputOptions(); break; + // // case "classpaths": ReadClasspaths(); break; + // // case "compileTargets": ReadCompileTargets(); break; + // // case "hiddenPaths": ReadHiddenPaths(); break; + // // case "preBuildCommand": ReadPreBuildCommand(); break; + // // case "postBuildCommand": ReadPostBuildCommand(); break; + // // case "options": ReadProjectOptions(); break; + // } + //} + + // process AS3-specific stuff + protected virtual void ProcessNode(string name) + { + if (NodeType == XmlNodeType.Element) + { + switch (name) + { + //case "build": ReadBuildOptions(); break; + //case "includeLibraries": ReadIncludeLibraries(); break; + //case "libraryPaths": ReadLibrayPath(); break; + //case "externalLibraryPaths": ReadExternalLibraryPaths(); break; + case "modules": + ReadModules(); + break; + case "languages": + ReadLanguages(); + break; + case "applications": + ReadApplications(); + break; + case "output": + ReadOutputOptions(); + break; + case "options": + ReadProjectOptions(); + break; + //default: + // base.ProcessNode(name); break; + } + } + } + + public void ReadOutputOptions() + { + ReadStartElement("output"); + while (Name == "movie") + { + MoveToFirstAttribute(); + switch (Name) + { + case "name": + project.Name = Value; + break; + case "desc": + project.Description = Value; + break; + //case "path": project.OutputPath = OSPath(Value); break; + //case "fps": project.MovieOptions.Fps = IntValue; break; + //case "width": project.MovieOptions.Width = IntValue; break; + //case "height": project.MovieOptions.Height = IntValue; break; + //case "version": project.MovieOptions.Version = IntValue; break; + //case "background": project.MovieOptions.Background = Value; break; + } + Read(); + } + ReadEndElement(); + } + + //public void ReadClasspaths() + //{ + // ReadStartElement("classpaths"); + // //ReadPaths("class",project.Classpaths); + // ReadEndElement(); + //} + + //public void ReadCompileTargets() + //{ + // ReadStartElement("compileTargets"); + // //ReadPaths("compile",project.CompileTargets); + // ReadEndElement(); + //} + + //public void ReadHiddenPaths() + //{ + // ReadStartElement("hiddenPaths"); + // //ReadPaths("hidden",project.HiddenPaths); + // ReadEndElement(); + //} + + //public void ReadPreBuildCommand() + //{ + // if (!IsEmptyElement) + // { + // ReadStartElement("preBuildCommand"); + // project.PreBuildEvent = OSPath(ReadString().Trim()); + // ReadEndElement(); + // } + //} + + public void ReadPostBuildCommand() + { + //project.AlwaysRunPostBuild = Convert.ToBoolean(GetAttribute("alwaysRun")); + + //if (!IsEmptyElement) + //{ + // ReadStartElement("postBuildCommand"); + // project.PostBuildEvent = OSPath(ReadString().Trim()); + // ReadEndElement(); + //} + } + + public void ReadProjectOptions() + { + ReadStartElement("options"); + while (Name == "option") + { + MoveToFirstAttribute(); + switch (Name) + { + case "debug": + project.Debug = BoolValue; + break; + case "kdebug": + project.KDebug = BoolValue; + break; + case "source": + project.Source = Value; + break; + } + Read(); + } + ReadEndElement(); + } + + public bool BoolValue { get { return Convert.ToBoolean(Value); } } + public int IntValue { get { return Convert.ToInt32(Value); } } + + //public void ReadPaths(string pathNodeName, IAddPaths paths) + //{ + // while (Name == pathNodeName) + // { + // paths.Add(OSPath(GetAttribute("path"))); + // Read(); + // } + //} + + //protected string OSPath(string path) + //{ + // if (path != null) + // return path.Replace('\\',System.IO.Path.DirectorySeparatorChar); + // else + // return null; + //} + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Project/ProjectWriter.cs b/reactos/tools/sysgen/RosBuilder/Project/ProjectWriter.cs new file mode 100644 index 00000000000..1061c326395 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Project/ProjectWriter.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections; +using System.IO; +using System.Diagnostics; +using System.Text; +using System.Xml; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Framework; + +namespace TriStateTreeViewDemo +{ + public class ProjectWriter : XmlTextWriter + { + Project m_Project; + + public ProjectWriter(Project project, string filename) : base(filename,Encoding.UTF8) + { + m_Project = project; + Formatting = Formatting.Indented; + } + + protected Project Project { get { return m_Project; } } + + public void WriteProject() + { + WriteStartDocument(); + WriteStartElement("project"); + WriteOutputOptions(); + WriteBuildOptions(); + WriteProjectOptions(); + WriteEndElement(); + WriteEndDocument(); + } + + public void WriteOutputOptions() + { + WriteComment(" Output SWF options "); + WriteStartElement("output"); + WriteOption("movie", "name", m_Project.Name); + WriteOption("movie", "desc", m_Project.Description); + WriteEndElement(); + } + + public void WriteBuildOptions() + { + WriteComment(" Build options "); + WriteStartElement("build"); + + if (Project.Modules.Count > 0) + { + WriteStartElement("modules"); + foreach (RBuildModule module in Project.Modules) + { + WriteStartElement("module"); + WriteAttributeString("name", module.Name); + WriteEndElement(); + } + WriteEndElement(); + } + + WriteEndElement(); + + if (Project.Languages.Count > 0) + { + WriteComment(" Build options "); + WriteStartElement("languages"); + foreach (RBuildLanguage language in Project.Languages) + { + WriteStartElement("language"); + WriteAttributeString("name", language.Name); + WriteEndElement(); + } + WriteEndElement(); + } + + if (Project.DebugChannels.Count > 0) + { + WriteStartElement("debugchhanels"); + foreach (RBuildDebugChannel channel in Project.DebugChannels) + { + WriteStartElement("debugchannel"); + WriteAttributeString("name", channel.Name); + WriteEndElement(); + } + WriteEndElement(); + } + + WriteStartElement("applications"); + + if (m_Project.Shell != null) + WriteOption("Shell", m_Project.Shell.Name); + + if (m_Project.Screensaver != null) + WriteOption("Screensaver", m_Project.Screensaver.Name); + + if (m_Project.Wallpaper != null) + WriteOption("Wallpaper", m_Project.Wallpaper.Name); + + WriteEndElement(); + } + + public void WriteClasspaths() + { + WriteComment(" Other classes to be compiled into your SWF "); + WriteStartElement("classpaths"); + //WritePaths(project.Classpaths,"class"); + WriteEndElement(); + } + + public void WriteCompileTargets() + { + WriteComment(" Class files to compile (other referenced classes will automatically be included) "); + WriteStartElement("compileTargets"); + //WritePaths(project.CompileTargets,"compile"); + WriteEndElement(); + } + + public void WriteHiddenPaths() + { + WriteComment(" Paths to exclude from the Project Explorer tree "); + WriteStartElement("hiddenPaths"); + //WritePaths(project.HiddenPaths,"hidden"); + WriteEndElement(); + } + + public void WritePreBuildCommand() + { + WriteComment(" Executed before build "); + WriteStartElement("preBuildCommand"); + if (m_Project.PreBuildEvent.Length > 0) + WriteString(m_Project.PreBuildEvent); + WriteEndElement(); + } + + public void WritePostBuildCommand() + { + WriteComment(" Executed after build "); + WriteStartElement("postBuildCommand"); + WriteAttributeString("alwaysRun",m_Project.AlwaysRunPostBuild.ToString()); + if (m_Project.PostBuildEvent.Length > 0) + WriteString(m_Project.PostBuildEvent); + WriteEndElement(); + + } + + public void WriteProjectOptions() + { + WriteComment(" Other project options "); + WriteStartElement("options"); + WriteOption("debug",m_Project.Debug); + WriteOption("kdebug",m_Project.KDebug); + WriteOption("source", @"c:\ros\trunk\reactos" /*project.Source*/); + WriteEndElement(); + } + + public void WriteOption(string optionName, object optionValue) + { + WriteOption("option", optionName, optionValue); + } + + public void WriteOption(string nodeName, string optionName, object optionValue) + { + WriteStartElement(nodeName); + WriteAttributeString(optionName, optionValue.ToString()); + WriteEndElement(); + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/ProjectController.cs b/reactos/tools/sysgen/RosBuilder/ProjectController.cs new file mode 100644 index 00000000000..c77491d236f --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/ProjectController.cs @@ -0,0 +1,222 @@ +using System; +using System.Windows.Forms; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; +using SysGen.Framework.Catalog; + +namespace TriStateTreeViewDemo +{ + public class ProjectController + { + private ISysGenDesigner m_SysGenDesigner = null; + private RBuildProject m_Project = null; + + public event EventHandler PlatformModulesUpdated; + public event EventHandler ProjectLoaded; + public event EventHandler ProjectSaved; + public event EventHandler ProjectUpdated; + + public ProjectController(ISysGenDesigner engine) + { + m_SysGenDesigner = engine; + + PlatformCatalogReader m_Catalog = new PlatformCatalogReader(@"C:\Ros\trunk\reactos\rbuilddb.xml"); + m_Catalog.Read(); + + m_Project = m_Catalog.Project; + + New(); + } + + public void New() + { + m_Project.Platform = new Project(m_Project); + + if (ProjectLoaded != null) + ProjectLoaded(this, EventArgs.Empty); + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + } + + public void Open(string file) + { + SysGenProject = new Project(m_Project, file); + SysGenProject.Load(); + + if (ProjectLoaded != null) + ProjectLoaded(this, EventArgs.Empty); + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + } + + public void Open() + { + using (OpenFileDialog openFile = new OpenFileDialog()) + { + openFile.Title = "Open SysGen Designer Project File"; + //openFile.InitialDirectory = m_SysGenEngine.BaseDirectory; + openFile.Filter = "SysGen Project File|*.sgpd"; + + if (openFile.ShowDialog() == DialogResult.OK) + { + SysGenProject = new Project(m_Project, openFile.FileName); + SysGenProject.Load(); + + if (ProjectLoaded != null) + ProjectLoaded(this, EventArgs.Empty); + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + } + } + } + + public void Save() + { + using (SaveFileDialog saveFile = new SaveFileDialog()) + { + saveFile.Title = "Save SysGen Designer Project File"; + //saveFile.InitialDirectory = m_SysGenEngine.BaseDirectory; + saveFile.Filter = "SysGen Project File|*.sgpd"; + + if (saveFile.ShowDialog() == DialogResult.OK) + { + SysGenProject.ProjectPath = saveFile.FileName; + SysGenProject.Save(); + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + + if (ProjectSaved != null) + ProjectSaved(this, EventArgs.Empty); + } + } + } + + public RBuildModuleCollection AvailableModules + { + get { return m_Project.Modules; } + } + + public RBuildProject Project + { + get { return m_Project; } + } + + public Project SysGenProject + { + get { return Project.Platform as Project; } + set { Project.Platform = value; } + } + + public void Remove(RBuildModule module) + { + SysGenDependencyTracker dependencyTracker = new SysGenDependencyTracker(Project, module); + + if (dependencyTracker.Using.Count > 0) + { + string s = string.Format("Cannot remove module '{0}' because '{1}' modules depends on it", + module.Name, + dependencyTracker.Using.Count); + + MessageBox.Show(s, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + Project.Platform.Modules.Remove(module); + } + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + } + + public void Add(RBuildModule module) + { + SysGenDependencyTracker dependencyTracker = new SysGenDependencyTracker(Project , module); + + if (AskAddModulesToPlatform(dependencyTracker.Missing)) + { + Project.Platform.Modules.Add(dependencyTracker.DependsOn); + Project.Platform.Modules.Add(module); + } + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + } + + public void Add(RBuildModuleCollection modules) + { + SysGenDependencyTracker dependencyTracker = new SysGenDependencyTracker(Project, modules); + + if (AskAddModulesToPlatform(dependencyTracker.Missing)) + { + Project.Platform.Modules.Add(dependencyTracker.DependsOn); + Project.Platform.Modules.Add(modules); + } + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + } + + public void AddLanguage(RBuildLanguage language) + { + if (Project.Platform.Languages.Contains(language) == false) + Project.Platform.Languages.Add(language); + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + + if (ProjectUpdated != null) + ProjectUpdated(this, EventArgs.Empty); + } + + public void AddDebugChannel(RBuildDebugChannel channel) + { + if (Project.Platform.DebugChannels.Contains(channel) == false) + Project.Platform.DebugChannels.Add(channel); + + if (PlatformModulesUpdated != null) + PlatformModulesUpdated(this, EventArgs.Empty); + + if (ProjectUpdated != null) + ProjectUpdated(this, EventArgs.Empty); + } + + public bool AskAddModulesToPlatform(RBuildModuleCollection missingDependencies) + { + if (missingDependencies.Count > 0) + { + StringBuilder str = new StringBuilder(); + + str.AppendFormat("This action requieres adding {0} dependecies no present in your platform :", missingDependencies.Count); + str.AppendLine(); + str.AppendLine(); + + foreach (RBuildModule dependency in missingDependencies) + { + str.AppendFormat("{0} on '{1}' \n", + dependency.Name, + dependency.Base); + } + + str.AppendLine(); + str.AppendLine("¿Do you want to add this dependencies?"); + + if (MessageBox.Show(str.ToString(), "RosBuilder", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) + { + return true; + } + } + else + return true; + + return false; + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Properties/AssemblyInfo.cs b/reactos/tools/sysgen/RosBuilder/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..0b59df60ad1 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("RosBuilder")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sand")] +[assembly: AssemblyProduct("RosBuilder")] +[assembly: AssemblyCopyright("Copyright © Sand 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8f4d0b84-8882-4b89-8e3c-8ce5238d603f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/reactos/tools/sysgen/RosBuilder/Properties/Resources.Designer.cs b/reactos/tools/sysgen/RosBuilder/Properties/Resources.Designer.cs new file mode 100644 index 00000000000..268c5602106 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4927 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace RosBuilder.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RosBuilder.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Properties/Resources.resx b/reactos/tools/sysgen/RosBuilder/Properties/Resources.resx new file mode 100644 index 00000000000..af7dbebbace --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Properties/Settings.Designer.cs b/reactos/tools/sysgen/RosBuilder/Properties/Settings.Designer.cs new file mode 100644 index 00000000000..71b700b5e99 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4927 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace RosBuilder.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/reactos/tools/sysgen/RosBuilder/Properties/Settings.settings b/reactos/tools/sysgen/RosBuilder/Properties/Settings.settings new file mode 100644 index 00000000000..39645652af6 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/reactos/tools/sysgen/RosBuilder/SysGen.Designer.csproj b/reactos/tools/sysgen/RosBuilder/SysGen.Designer.csproj new file mode 100644 index 00000000000..3e94b2c1469 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/SysGen.Designer.csproj @@ -0,0 +1,148 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {78A0F196-A5BD-469A-B901-B269671AFB0A} + WinExe + Properties + RosBuilder + RosBuilder + + + 2.0 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + Component + + + Component + + + Component + + + UserControl + + + RegistryEditor.cs + + + Form + + + Form1.cs + + + Form + + + MainForm.cs + + + + Form + + + NewItemForm.cs + + + Code + + + + + + + + + + Designer + RegistryEditor.cs + + + Designer + Form1.cs + + + Designer + MainForm.cs + + + Designer + NewItemForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26} + SysGen.RBuild.Framework + + + {8F5F8375-4097-4952-B860-784EB9961ABE} + SysGen.Framework + + + {99CEE41D-B76D-4102-B0AD-C81069509D17} + TriStateTreeView + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/SysGen.Designer.csproj.user b/reactos/tools/sysgen/RosBuilder/SysGen.Designer.csproj.user new file mode 100644 index 00000000000..6a34e7dcdf5 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/SysGen.Designer.csproj.user @@ -0,0 +1,5 @@ + + + ShowAllFiles + + \ No newline at end of file diff --git a/reactos/tools/sysgen/RosBuilder/Util/FileAssociation.cs b/reactos/tools/sysgen/RosBuilder/Util/FileAssociation.cs new file mode 100644 index 00000000000..f60b10d4603 --- /dev/null +++ b/reactos/tools/sysgen/RosBuilder/Util/FileAssociation.cs @@ -0,0 +1,244 @@ +using System; +using System.Security; +using System.Collections; +using Microsoft.Win32; + +namespace TriStateTreeViewDemo +{ + /// List of commands. + internal struct CommandList + { + /// + /// Holds the names of the commands. + /// + public ArrayList Captions; + /// + /// Holds the commands. + /// + public ArrayList Commands; + } + /// Properties of the file association. + internal struct FileType + { + /// + /// Holds the command names and the commands. + /// + public CommandList Commands; + /// + /// Holds the extension of the file type. + /// + public string Extension; + /// + /// Holds the proper name of the file type. + /// + public string ProperName; + /// + /// Holds the full name of the file type. + /// + public string FullName; + /// + /// Holds the name of the content type of the file type. + /// + public string ContentType; + /// + /// Holds the path to the resource with the icon of this file type. + /// + public string IconPath; + /// + /// Holds the icon index in the resource file. + /// + public short IconIndex; + } + /// Creates file associations for your programs. + /// The following example creates a file association for the type XYZ with a non-existent program. + ///


VB.NET code
+ /// + /// Dim FA as New FileAssociation + /// FA.Extension = "xyz" + /// FA.ContentType = "application/myprogram" + /// FA.FullName = "My XYZ Files!" + /// FA.ProperName = "XYZ File" + /// FA.AddCommand("open", "C:\mydir\myprog.exe %1") + /// FA.Create + /// + ///
C# code
+ /// + /// FileAssociation FA = new FileAssociation(); + /// FA.Extension = "xyz"; + /// FA.ContentType = "application/myprogram"; + /// FA.FullName = "My XYZ Files!"; + /// FA.ProperName = "XYZ File"; + /// FA.AddCommand("open", "C:\\mydir\\myprog.exe %1"); + /// FA.Create(); + /// + ///
+ public class FileAssociation + { + /// Initializes an instance of the FileAssociation class. + public FileAssociation() + { + FileInfo = new FileType(); + FileInfo.Commands.Captions = new ArrayList(); + FileInfo.Commands.Commands = new ArrayList(); + } + /// Gets or sets the proper name of the file type. + /// A String representing the proper name of the file type. + public string ProperName + { + get + { + return FileInfo.ProperName; + } + set + { + FileInfo.ProperName = value; + } + } + /// Gets or sets the full name of the file type. + /// A String representing the full name of the file type. + public string FullName + { + get + { + return FileInfo.FullName; + } + set + { + FileInfo.FullName = value; + } + } + /// Gets or sets the content type of the file type. + /// A String representing the content type of the file type. + public string ContentType + { + get + { + return FileInfo.ContentType; + } + set + { + FileInfo.ContentType = value; + } + } + /// Gets or sets the extension of the file type. + /// A String representing the extension of the file type. + /// If the extension doesn't start with a dot ("."), a dot is automatically added. + public string Extension + { + get + { + return FileInfo.Extension; + } + set + { + if (value.Substring(0, 1) != ".") + value = "." + value; + FileInfo.Extension = value; + } + } + /// Gets or sets the index of the icon of the file type. + /// A short representing the index of the icon of the file type. + public short IconIndex + { + get + { + return FileInfo.IconIndex; + } + set + { + FileInfo.IconIndex = value; + } + } + /// Gets or sets the path of the resource that contains the icon for the file type. + /// A String representing the path of the resource that contains the icon for the file type. + /// This resource can be an executable or a DLL. + public string IconPath + { + get + { + return FileInfo.IconPath; + } + set + { + FileInfo.IconPath = value; + } + } + /// Adds a new command to the command list. + /// The name of the command. + /// The command to execute. + /// Caption -or- Command is null (VB.NET: Nothing). + public void AddCommand(string Caption, string Command) + { + if (Caption == null || Command == null) + throw new ArgumentNullException(); + FileInfo.Commands.Captions.Add(Caption); + FileInfo.Commands.Commands.Add(Command); + } + /// Creates the file association. + /// Extension -or- ProperName is null (VB.NET: Nothing). + /// Extension -or- ProperName is empty. + /// The user does not have registry write access. + public void Create() + { + // remove the extension to avoid incompatibilities [such as DDE links] + try + { + Remove(); + } + catch (ArgumentException) {} // the extension doesn't exist + + // create the exception + if (Extension == "" || ProperName == "") + throw new ArgumentException(); + int cnt; + + try + { + RegistryKey RegKey = Registry.ClassesRoot.CreateSubKey(Extension); + RegKey.SetValue("", ProperName); + + if (ContentType != null && ContentType != "") + RegKey.SetValue("Content Type", ContentType); + + RegKey.Close(); + RegKey = Registry.ClassesRoot.CreateSubKey(ProperName); + RegKey.SetValue("", FullName); + RegKey.Close(); + + if (IconPath != "") + { + RegKey = Registry.ClassesRoot.CreateSubKey(ProperName + "\\" + "DefaultIcon"); + RegKey.SetValue("", IconPath + "," + IconIndex.ToString()); + RegKey.Close(); + } + + for (cnt = 0; cnt < FileInfo.Commands.Captions.Count; cnt++) + { + RegKey = Registry.ClassesRoot.CreateSubKey(ProperName + "\\" + "Shell" + "\\" + (String)FileInfo.Commands.Captions[cnt]); + RegKey = RegKey.CreateSubKey("Command"); + RegKey.SetValue("", FileInfo.Commands.Commands[cnt]); + RegKey.Close(); + } + } + catch + { + throw new SecurityException(); + } + } + /// Removes the file association. + /// Extension -or- ProperName is null (VB.NET: Nothing). + /// Extension -or- ProperName is empty -or- the specified extension doesn't exist. + /// The user does not have registry delete access. + public void Remove() + { + if (Extension == null || ProperName == null) + throw new ArgumentNullException(); + if (Extension == "" || ProperName == "") + throw new ArgumentException(); + Registry.ClassesRoot.DeleteSubKeyTree(Extension); + Registry.ClassesRoot.DeleteSubKeyTree(ProperName); + } + /// Holds the properties of the file type. + private FileType FileInfo; + } +} diff --git a/reactos/tools/sysgen/RosFramework/Base/RBuildElement.cs b/reactos/tools/sysgen/RosFramework/Base/RBuildElement.cs new file mode 100644 index 00000000000..3376bd00ed7 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Base/RBuildElement.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public abstract class RBuildElement : IRBuildNamed + { + protected string m_RBuild = null; + protected string m_Name = null; + protected string m_Base = null; + protected string m_Path = null; + protected string m_XmlFile = null; + + protected List m_AssemblyFlags = new List(); + protected List m_CompilerFlags = new List(); + protected List m_LinkerFlags = new List(); + protected RBuildIncludeFolderCollection m_Includes = new RBuildIncludeFolderCollection(); + protected RBuildPlatformFileCollection m_Files = new RBuildPlatformFileCollection(); + protected RBuildDefineCollection m_Defines = new RBuildDefineCollection(); + protected RBuildPropertyCollection m_Properties = new RBuildPropertyCollection(); + protected RBuildFolderCollection m_Folders = new RBuildFolderCollection(); + protected RBuildFolder m_Folder = new RBuildFolder(); + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public virtual RBuildFolder Folder + { + get { return m_Folder; } + set { m_Folder = value; } + } + + public string XmlFile + { + get { return m_XmlFile; } + set { m_XmlFile = value; } + } + + public string Path + { + get { return m_Path; } + set { m_Path = value; } + } + + public string Base + { + get { return Folder.FullPath; } + } + + public string RBuildPath + { + get { return System.IO.Path.Combine(Base, RBuildFile); } + } + + public string RBuildFile + { + get { return m_RBuild; } + set { m_RBuild = value; } + } + + public Uri BaseURI + { + get { return new Uri(Base, UriKind.Relative); } + } + + public string BaseParent + { + get { return Base.Replace(System.IO.Path.DirectorySeparatorChar + Name , string.Empty); } + } + + public string FolderFullPath + { + get { return System.IO.Path.Combine(Path, Base); } + } + + public RBuildFolderCollection Folders + { + get { return m_Folders; } + } + + public RBuildPlatformFileCollection Files + { + get { return m_Files; } + } + + public RBuildPropertyCollection Properties + { + get { return m_Properties; } + } + + public List CompilerFlags + { + get { return m_CompilerFlags; } + } + + public List LinkerFlags + { + get { return m_LinkerFlags; } + } + + public List AssemblyFlags + { + get { return m_AssemblyFlags; } + } + + public RBuildDefineCollection Defines + { + get { return m_Defines; } + } + + public RBuildIncludeFolderCollection IncludeFolders + { + get { return m_Includes; } + set { m_Includes = value; } + } + + public string MakeFilePreCondition + { + get { return string.Format("{0}_PRECONDITION", Name); } + } + + public string MakeFileRCFlags + { + get { return string.Format("{0}_RCFLAGS", Name); } + } + + public string MakeFileWIDLFlags + { + get { return string.Format("{0}_WIDLFLAGS", Name); } + } + + public string MakeFileLFlags + { + get { return string.Format("{0}_LFLAGS", Name); } + } + + public string MakeFileNASMFlags + { + get { return string.Format("{0}_NASMFLAGS", Name); } + } + + public string MakeFileFoldersMacro + { + get { return string.Format("$({0}_FOLDERS)", Name); } + } + + public string MakeFileFolders + { + get { return string.Format("{0}_FOLDERS", Name); } + } + + public string MakeFileCFlags + { + get { return string.Format("{0}_CFLAGS", Name); } + } + + public string MakeFileObjs + { + get { return string.Format("{0}_OBJS", Name); } + } + + public string MakeFileSources + { + get { return string.Format("{0}_SOURCES", Name); } + } + + public string MakeFileHeaders + { + get { return string.Format("{0}_HEADERS", Name); } + } + + public string MakeFileMakeTarget + { + get { return string.Format("{0}", Name); } + } + + public string MakeFileFlagDebugTarget + { + get { return string.Format("{0}_flagdebug", Name); } + } + + public string MakeFileInfoTarget + { + get { return string.Format("{0}_info", Name); } + } + + public string MakeFileCleanTarget + { + get { return string.Format("{0}_clean", Name); } + } + + public string MakeFileDependsTarget + { + get { return string.Format("{0}_depends", Name); } + } + + public string MakeFileInstallTarger + { + get { return string.Format("{0}_install", Name); } + } + + public string MakeFileHeadersMacro + { + get { return string.Format("$({0}_HEADERS)", Name); } + } + + public string MakeFileMCHeadersMacro + { + get { return string.Format("$({0}_MCHEADERS)", Name); } + } + + public string MakeFileMCHeaders + { + get { return string.Format("{0}_MCHEADERS", Name); } + } + + public string MakeFileRPCHeadersMacro + { + get { return string.Format("$({0}_RPCHEADERS)", Name); } + } + + public string MakeFileRPCHeaders + { + get { return string.Format("{0}_RPCHEADERS", Name); } + } + + public string MakeFileRPCSourcesMacro + { + get { return string.Format("$({0}_RPCSOURCES)", Name); } + } + + public string MakeFileRPCSources + { + get { return string.Format("{0}_RPCSOURCES", Name); } + } + + public string MakeFilePCHMacro + { + get { return string.Format("$({0}_PCH)", Name); } + } + + public string MakeFilePCHHeaders + { + get { return string.Format("{0}_PCH", Name); } + } + + public string MakeFileNASMMacro + { + get { return string.Format("$({0}_NASMFLAGS)", Name); } + } + + public string MakeFileCFlagsMacro + { + get { return string.Format("$({0}_CFLAGS)", Name); } + } + + public string MakeFileLFlagsMacro + { + get { return string.Format("$({0}_LFLAGS)", Name); } + } + + public string MakeFileWIDLFlagsMacro + { + get { return string.Format("$({0}_WIDLFLAGS)", Name); } + } + + public string MakeFileObjsMacro + { + get { return string.Format("$({0}_OBJS)", Name); } + } + + public string MakeFileSourcesMacro + { + get { return string.Format("$({0}_SOURCES)", Name); } + } + + public string MakeFilePreConditionMacro + { + get { return string.Format("$({0}_PRECONDITION)", Name); } + } + + public string MakeFileRCFlagsMacro + { + get { return string.Format("$({0}_RCFLAGS)", Name); } + } + + public abstract void SaveAs(string file); + + public override bool Equals(object obj) + { + if (obj is RBuildElement) + { + RBuildElement element = obj as RBuildElement; + + if (element.Name == Name) + return true; + } + + return false; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildAPIStatusCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildAPIStatusCollection.cs new file mode 100644 index 00000000000..e877521ee0c --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildAPIStatusCollection.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildAPIStatusCollection : List + { + public int Percentage + { + get + { + if (TotalFunctions == 0) + return 100; + + return ((100 * ImplementedFunctionsCount) / TotalFunctions); + } + } + + public int TotalFunctions + { + get { return (ImplementedFunctionsCount + UnImplementedFunctionsCount); } + } + + public int ImplementedFunctionsCount + { + get + { + int count = 0; + + foreach (RBuildAPIInfo info in this) + if (info.Implemented == true) + count++; + + return count; + } + } + + public int UnImplementedFunctionsCount + { + get + { + int count = 0; + + foreach (RBuildAPIInfo info in this) + if (info.Implemented == false) + count++; + + return count; + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildAuthorCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildAuthorCollection.cs new file mode 100644 index 00000000000..e9f588ae119 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildAuthorCollection.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildAuthorCollection : List + { + public RBuildAuthor GetByName(string alias) + { + foreach (RBuildAuthor author in this) + { + if (author.Contributor.Alias == alias) + return author; + } + + return null; + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildBuildFamilyCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildBuildFamilyCollection.cs new file mode 100644 index 00000000000..c2f0b416a42 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildBuildFamilyCollection.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildBuildFamilyCollection : List + { + public RBuildBuildFamily GetByName(string name) + { + foreach (RBuildBuildFamily family in this) + { + if (family.Name == name) + return family; + } + + return null; + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildContributorCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildContributorCollection.cs new file mode 100644 index 00000000000..ee8e5530b7e --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildContributorCollection.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildContributorCollection : List + { + public RBuildContributor GetByName(string alias) + { + foreach (RBuildContributor contributor in this) + { + if (contributor.Alias == alias) + return contributor; + } + + return null; + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildDebugChannelCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildDebugChannelCollection.cs new file mode 100644 index 00000000000..8f45b25cfb1 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildDebugChannelCollection.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildDebugChannelCollection : List + { + public RBuildDebugChannel GetByName(string name) + { + foreach (RBuildDebugChannel channel in this) + { + if (channel.Name == name) + return channel; + } + + return null; + } + + public string Text + { + get + { + StringBuilder sBuilder = new StringBuilder(); + + foreach (RBuildDebugChannel channel in this) + { + sBuilder.Append(channel.Text); + } + + return sBuilder.ToString(); + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildDefineCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildDefineCollection.cs new file mode 100644 index 00000000000..7281ab8a556 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildDefineCollection.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace SysGen.RBuild.Framework +{ + public class RBuildDefineCollection : List + { + public bool IsDefined(string name) + { + foreach (RBuildDefine define in this) + { + if (define.Name == name) + return true; + } + + return false; + } + + public void Add(string name) + { + Add(new RBuildDefine(name)); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildExportedFunctionsCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildExportedFunctionsCollection.cs new file mode 100644 index 00000000000..c3d17463fad --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildExportedFunctionsCollection.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildExportedFunctionsCollection : List + { + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildFamilyCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildFamilyCollection.cs new file mode 100644 index 00000000000..66ea4355fd4 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildFamilyCollection.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildFamilyCollection : List + { + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildFileCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildFileCollection.cs new file mode 100644 index 00000000000..08e47dd24be --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildFileCollection.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildFileCollection : List + { + public void Add(RBuildFileCollection files) + { + foreach (RBuildFile file in files) + { + Add(file); + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildFolderCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildFolderCollection.cs new file mode 100644 index 00000000000..09faabaa28f --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildFolderCollection.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildFolderCollection : List + { + public void Add(RBuildFolderCollection folders) + { + foreach (RBuildFolder folder in folders) + { + Add(folder); + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildIncludeFolderCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildIncludeFolderCollection.cs new file mode 100644 index 00000000000..96b63771fe8 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildIncludeFolderCollection.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildIncludeFolderCollection : List + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildInstallFolderCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildInstallFolderCollection.cs new file mode 100644 index 00000000000..e9620346126 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildInstallFolderCollection.cs @@ -0,0 +1,28 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildInstallFolderCollection : List + { + public RBuildInstallFolder GetByName(string name) + { + foreach (RBuildInstallFolder folder in this) + { + if (NormalizeFolderName(folder.Name) == NormalizeFolderName(name)) + return folder; + } + + return null; + } + + private string NormalizeFolderName(string path) + { + return path.Replace( + Path.AltDirectorySeparatorChar, + Path.DirectorySeparatorChar); + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildLanguageCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildLanguageCollection.cs new file mode 100644 index 00000000000..d81f0506a49 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildLanguageCollection.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildLanguageCollection : List + { + public RBuildLanguage GetByName(string culture) + { + foreach (RBuildLanguage language in this) + { + if (language.Name == culture) + return language; + } + + return null; + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildLocalizationFileCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildLocalizationFileCollection.cs new file mode 100644 index 00000000000..7e005d00616 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildLocalizationFileCollection.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildLocalizationFileCollection : List + { + public bool ContainsLocalization(string culture) + { + return GetByName(culture) != null; + } + + public RBuildLocalizationFile GetByName(string culture) + { + foreach (RBuildLocalizationFile file in this) + { + if (file.IsoName == culture) + return file; + } + + return null; + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildModuleCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildModuleCollection.cs new file mode 100644 index 00000000000..2c472e74f07 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildModuleCollection.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class ModulePreferenceComparer : IComparer + { + public int Compare(RBuildModule x, RBuildModule y) + { + if (x.Type == y.Type) + return 0; + + if (x.Type == ModuleType.BuildTool) + return -1; + + return 1; + } + } + + public class RBuildModuleCollection : List + { + public event EventHandler OnModuleAdded; + + public void Add(RBuildModuleCollection modules) + { + foreach (RBuildModule module in modules) + { + Add(module); + } + } + + public new void Add(RBuildModule module) + { + if (module == null) + throw new Exception("Could not add a null instance"); + + if (GetByName(module.Name) == null) + { + base.Add(module); + } + + if (OnModuleAdded != null) + OnModuleAdded(this, EventArgs.Empty); + } + + public void Add(string moduleName) + { + RBuildModule module = GetByName(moduleName); + + if (module == null) + throw new Exception(string.Format("Unknown '{0}' module", moduleName)); + + Add(module); + } + + public void Add(int index, RBuildModule moduleName) + { + base.Insert(index, moduleName); + } + + public void DisableAll() + { + foreach (RBuildModule module in this) + { + // Disable module + module.Enabled = false; + } + } + + public RBuildModule GetByName(string name) + { + foreach (RBuildModule module in this) + { + if (module.Name == name) + return module; + } + + return null; + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildModuleInfoCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildModuleInfoCollection.cs new file mode 100644 index 00000000000..4670f093936 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildModuleInfoCollection.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildModuleInfoCollection : List + { + public RBuildModuleInfo GetByName(string name) + { + foreach (RBuildModuleInfo module in this) + { + if (module.Name == name) + return module; + } + + return null; + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildPlatformFileCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildPlatformFileCollection.cs new file mode 100644 index 00000000000..7ccf135cefc --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildPlatformFileCollection.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildPlatformFileCollection : List + { + public void Add(RBuildPlatformFileCollection files) + { + foreach (RBuildPlatformFile file in files) + { + Add(file); + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildPropertyCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildPropertyCollection.cs new file mode 100644 index 00000000000..f3a4769258f --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildPropertyCollection.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Text.RegularExpressions; + +namespace SysGen.RBuild.Framework +{ + public class RBuildPropertyCollection : List + { + /// + /// Adds a property that cannot be changed. + /// + /// + /// Properties added with this method can never be changed. Note that + /// they are removed if the Clear method is called. + /// + /// Name of property + /// Value of property + public virtual void AddReadOnly(string name, string value) + { + Add(name, value, true); + } + + /// + /// Adds a property to the collection. + /// + /// Name of property + /// Value of property + public virtual void Add(string name, string value) + { + Add(name, value, false); + } + + /// + /// Adds a property to the collection. + /// + /// Name of property + /// Value of property + public virtual void Add(string name, bool value) + { + Add(name, value.ToString()); + } + + /// + /// Adds a property to the collection. + /// + /// Name of property + /// Value of property + public virtual void Add(string name, string value, bool readOnly) + { + if (!PropertyExists(name)) + { + Add(new RBuildProperty(name, value , readOnly)); + } + } + + /// + /// Adds a property to the collection. + /// + /// Name of property + /// Value of property + public virtual void Add(string name, string value, bool readOnly, bool isInternal) + { + if (!PropertyExists(name)) + { + Add(new RBuildProperty(name, value, readOnly,isInternal)); + } + } + + /// + /// Returns true if a property is listed as read only + /// + /// Property to check + /// true if readonly, false otherwise + public virtual bool IsReadOnlyProperty(string name) + { + if (PropertyExists(name)) + return this[name].ReadOnly; + return false; + } + + /// + /// Returns true if a property exists + /// + /// Property to check + /// true if exists, false otherwise + public bool PropertyExists(string name) + { + return (this[name] != null); + } + + /// + /// Indexer property. + /// + public virtual RBuildProperty this[string name] + { + get + { + foreach (RBuildProperty property in this) + if (property.Name == name) + return property; + + return null; + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Collections/RBuildSourceFileCollection.cs b/reactos/tools/sysgen/RosFramework/Collections/RBuildSourceFileCollection.cs new file mode 100644 index 00000000000..7175bac8e8a --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Collections/RBuildSourceFileCollection.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class SourceCodePreferenceComparer : IComparer + { + public int Compare(RBuildSourceFile x, RBuildSourceFile y) + { + if (x.First != y.First) + { + if (x.First) + return -1; + else + return 1; + } + + if (x.Extension == y.Extension) + return 0; + + if (x.IsWidl) + return -1; + else if (y.IsWidl) + return 1; + + if (x.IsAssembler) + return 1; + else if (y.IsAssembler) + return -1; + + if (x.IsNASM) + return 1; + else if (y.IsNASM) + return -1; + + return 0; + } + } + + public class RBuildSourceFileCollection : List + { + public bool ContainsASM + { + get + { + foreach (RBuildSourceFile file in this) + { + if ((file.IsAssembler) || (file.IsNASM)) + { + return true; + } + } + + // This module does not contain C++ code + return false; + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildInstallable.cs b/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildInstallable.cs new file mode 100644 index 00000000000..4e5a8467d0b --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildInstallable.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public interface IRBuildInstallable + { + string InstallBase { get; set; } + + RBuildInstallFolder InstallFolder { get; set; } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildModulesContainer.cs b/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildModulesContainer.cs new file mode 100644 index 00000000000..9bc5f9902f3 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildModulesContainer.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace SysGen.RBuild.Framework +{ + public interface IRBuildModulesContainer + { + RBuildSourceFileCollection Modules { get; } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildNamed.cs b/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildNamed.cs new file mode 100644 index 00000000000..34252cab108 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildNamed.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace SysGen.RBuild.Framework +{ + public interface IRBuildNamed + { + string Name { get; } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildSourceFilesContainer.cs b/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildSourceFilesContainer.cs new file mode 100644 index 00000000000..78eccd72cdb --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Interfaces/IRBuildSourceFilesContainer.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace SysGen.RBuild.Framework +{ + public interface IRBuildSourceFilesContainer + { + RBuildSourceFileCollection SourceFiles { get; } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Misc/Utility.cs b/reactos/tools/sysgen/RosFramework/Misc/Utility.cs new file mode 100644 index 00000000000..da5200b907d --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Misc/Utility.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + class Utility + { + public static string GetSafeString (string str) + { + str = str.Replace(" ", string.Empty); + str = str.Replace(".", string.Empty); + + return str; + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/NotImplementedYet/RBuildModuleGroup.cs b/reactos/tools/sysgen/RosFramework/NotImplementedYet/RBuildModuleGroup.cs new file mode 100644 index 00000000000..6cc00b2fe2a --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/NotImplementedYet/RBuildModuleGroup.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework.NotImplementedYet +{ + public class RBuildModuleGroup + { + private RBuildModuleCollection m_Modules = new RBuildModuleCollection(); + private string m_Name = null; + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public RBuildModuleCollection Modules + { + get { return m_Modules; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/NotImplementedYet/RBuildPatch.cs b/reactos/tools/sysgen/RosFramework/NotImplementedYet/RBuildPatch.cs new file mode 100644 index 00000000000..0b8b9c22b82 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/NotImplementedYet/RBuildPatch.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework.NotImplementedYet +{ + public class RBuildPatch + { + private string m_Filename = null; + private string m_Name = null; + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string FileName + { + get { return m_Filename; } + set { m_Filename = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Obsolete/PlatformCatalog.cs b/reactos/tools/sysgen/RosFramework/Obsolete/PlatformCatalog.cs new file mode 100644 index 00000000000..4d8fcfbaf41 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Obsolete/PlatformCatalog.cs @@ -0,0 +1,92 @@ +using System; +using System.Xml; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class PlatformCatalog + { + public List m_Platform = new List(); + public SoftwareCatalog m_SoftwareCatalog = new SoftwareCatalog(); + + public PlatformCatalog() + { + } + + public List Platforms + { + get { return m_Platform; } + } + + public SoftwareCatalog SoftwareCatalog + { + get { return m_SoftwareCatalog; } + set { m_SoftwareCatalog = value; } + } + + public RosPlatform GetPlatformByName(string name) + { + foreach (RosPlatform platform in Platforms) + { + if (platform.Name == name) + { + return platform; + } + } + + throw new Exception("Platform not found in catalog"); + } + + public void LoadFromFile(string file) + { + XmlDocument doc = new XmlDocument(); + + //Load the file in to memory + doc.Load(file); + + //Load modules ... + foreach (XmlNode node in doc.SelectNodes("/platforms/platform")) + { + RosPlatform platform = new RosPlatform(); + + platform.Name = node.Attributes["name"].InnerText; + + if (node.Attributes["base"] != null) + { + platform.Base = node.Attributes["base"].InnerText; + } + + m_Platform.Add(platform); + } + + foreach (XmlNode comp in doc.SelectNodes("/platforms/platform")) + { + // Get the component name.... + string name = comp.Attributes["name"].InnerText; + + RosPlatform platform = GetPlatformByName(name); + + if (platform.Base != null) + { + platform.ParentPlatform = GetPlatformByName(platform.Base); + + foreach (RBuildModule module in platform.ParentModules) + { + platform.Modules.Add(module); + } + } + + foreach (XmlNode dep in comp.SelectNodes("modules/module")) + { + // Gets the dependency name + name = dep.Attributes["name"].InnerText; + + RBuildModule module = SoftwareCatalog.Modules.GetByName(name); + + platform.Modules.Add(module); + } + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Obsolete/RosArchitecture.cs b/reactos/tools/sysgen/RosFramework/Obsolete/RosArchitecture.cs new file mode 100644 index 00000000000..593a0373a1a --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Obsolete/RosArchitecture.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RosArchitecture + { + private string m_Name = null; + private string m_Sub = null; + private string m_Optimization = null; + + public RosArchitecture () + { + m_Name = "i386"; + m_Sub = string.Empty; + m_Optimization = "pentium"; + } + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string SubArchitecture + { + get { return m_Sub; } + set { m_Sub = value; } + } + + public string Optimization + { + get { return m_Optimization; } + set { m_Optimization = value; } + } + + public string SafeName + { + get { return Utility.GetSafeString(m_Name).ToUpper(); } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/Obsolete/RosOSImage.cs b/reactos/tools/sysgen/RosFramework/Obsolete/RosOSImage.cs new file mode 100644 index 00000000000..7890b26cf26 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Obsolete/RosOSImage.cs @@ -0,0 +1,209 @@ +using System; +using System.Xml; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildOSImage + { + private RosPlatform m_Platform = null; + private RBuildLanguage m_Language = null; + private RosArchitecture m_Architecture = null; + + private Dictionary m_Properties = new Dictionary(); + private List m_Defines = new List(); + private List m_Includes = new List(); + + private bool m_Debug = false; + //private bool m_KernelDebugger = false; + //private bool m_GDBDebugger = false; + + private bool m_MakeBootCD = false; + private bool m_MakeLiveCD = false; + + public RBuildOSImage() + { + Properties.Add("SARCH", ""); + Properties.Add("OARCH", "pentium"); + Properties.Add("OPTIMIZE", "1"); + Properties.Add("MP", "0"); + Properties.Add("KDBG", "0"); + Properties.Add("DBG", "0"); + Properties.Add("GDB", "0"); + Properties.Add("NSWPAT", "0"); + Properties.Add("NTLPC", "1"); + Properties.Add("_WINKD_", "0"); + + Defines.Add ("_M_IX86"); + Defines.Add ("_X86_"); + Defines.Add ("__i386__"); + Defines.Add ("_REACTOS_"); + + Includes.Add("."); + Includes.Add("include"); + Includes.Add("include/psdk"); + Includes.Add("include/dxsdk"); + Includes.Add("include/crt"); + Includes.Add("include/ddk"); + Includes.Add("include/GL"); + Includes.Add("include/ndk"); + Includes.Add("include/reactos"); + Includes.Add("include/reactos/libs"); + } + + public bool MakeLiveCD + { + get { return m_MakeLiveCD; } + set { m_MakeLiveCD = value; } + } + + public bool MakeBootCD + { + get { return m_MakeBootCD; } + set { m_MakeBootCD = value; } + } + + public RBuildLanguage Language + { + get { return m_Language; } + set { m_Language = value; } + } + + public RosPlatform Platform + { + get { return m_Platform; } + set { m_Platform = value; } + } + + public RosArchitecture Architecture + { + get { return m_Architecture; } + set { m_Architecture = value; } + } + + public Dictionary Properties + { + get { return m_Properties; } + } + + public List Defines + { + get { return m_Defines; } + } + + public List Includes + { + get { return m_Includes; } + } + + public string ReleaseType + { + get + { + if (m_Debug) + return "DBG"; + + return "RELEASE"; + } + } + + public string ImageType + { + get + { + if (m_MakeBootCD) + return "BootCD"; + + return "LiveCD"; + } + } + + public void SaveAs(string file) + { + // Creates an XML file is not exist + using (XmlTextWriter writer = new XmlTextWriter(file, Encoding.ASCII)) + { + writer.Indentation = 4; + writer.Formatting = Formatting.Indented; + + // Starts a new document + writer.WriteStartDocument(); + writer.WriteStartElement("project"); + writer.WriteAttributeString("name", "ReactOS"); + writer.WriteAttributeString("makefile", "makefile.auto"); + writer.WriteAttributeString("xmlns", "xi", null, "http://www.w3.org/2001/XInclude"); + + writer.WriteComment("Generic Properties"); + foreach (KeyValuePair property in Properties) + { + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", property.Key); + writer.WriteAttributeString("value", property.Value); + writer.WriteEndElement(); + } + + foreach (string define in Defines) + { + writer.WriteStartElement("define"); + writer.WriteAttributeString("name", define); + writer.WriteEndElement(); + } + + writer.WriteStartElement("xi:include"); + writer.WriteAttributeString("href", "baseaddress.rbuild"); + writer.WriteEndElement(); + + writer.WriteStartElement("xi:include"); + writer.WriteAttributeString("href", "boot/bootdata/bootdata.rbuild"); + writer.WriteEndElement(); + + writer.WriteElementString("compilerflag", "-Os"); + writer.WriteElementString("compilerflag", "-ftracer"); + writer.WriteElementString("compilerflag", "-momit-leaf-frame-pointer"); + writer.WriteElementString("compilerflag", "-mpreferred-stack-boundary=2"); + + writer.WriteElementString("compilerflag", "-Wno-strict-aliasing"); + writer.WriteElementString("compilerflag", "-Wpointer-arith"); + writer.WriteElementString("linkerflag", "-enable-stdcall-fixup"); + + foreach (string include in Includes) + { + writer.WriteStartElement("include"); + writer.WriteAttributeString("root", "intermediate"); + writer.WriteString(include); + writer.WriteEndElement(); + + writer.WriteStartElement("include"); + writer.WriteString(include); + writer.WriteEndElement(); + } + + foreach (RBuildModule module in Platform.Modules) + { + writer.WriteStartElement("xi:include"); + writer.WriteAttributeString("href", module.RBuildFile); + writer.WriteEndElement(); + } + + writer.WriteEndElement(); //Project + writer.WriteEndDocument(); + } + + string a = Name; + } + + public string Name + { + get { + return ""; + //return string.Format("{0}_{1}{2}_{3}_{4}.iso", + // Platform.SafeName, + // Architecture.SafeName , + // Language.CultureInfo.ThreeLetterISOLanguageName, + // ImageType, + // ReleaseType); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/Obsolete/RosPlatform.cs b/reactos/tools/sysgen/RosFramework/Obsolete/RosPlatform.cs new file mode 100644 index 00000000000..2864a425bbf --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Obsolete/RosPlatform.cs @@ -0,0 +1,78 @@ +using System; +using System.Xml; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RosPlatform + { + private List m_Modules = new List(); + + private string m_Name = null; + private string m_Base = null; + + private RosPlatform m_ParentPlatform = null; + + public RosPlatform() + { + m_Name = "ReactOS Core"; + } + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string Base + { + get { return m_Base; } + set { m_Base = value; } + } + + public RosPlatform ParentPlatform + { + get { return m_ParentPlatform; } + set { m_ParentPlatform = value; } + } + + public string SafeName + { + get { return Utility.GetSafeString(m_Name); } + } + + public void SaveAs(string file) + { + + } + + public List Modules + { + get { return m_Modules; } + } + + public List ParentModules + { + get + { + List modules = new List(); + + if (ParentPlatform != null) + { + foreach (RBuildModule module in ParentPlatform.Modules) + { + modules.Add(module); + } + + foreach (RBuildModule module in ParentPlatform.ParentModules) + { + modules.Add(module); + } + } + + return modules; + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Obsolete/SoftwareCatalog.cs b/reactos/tools/sysgen/RosFramework/Obsolete/SoftwareCatalog.cs new file mode 100644 index 00000000000..5169cf21a55 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Obsolete/SoftwareCatalog.cs @@ -0,0 +1,80 @@ +using System; +using System.Xml; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class SoftwareCatalog + { + public RBuildModuleCollection m_Modules = new RBuildModuleCollection(); + + public SoftwareCatalog() + { + } + + public RBuildModuleCollection Modules + { + get { return m_Modules; } + } + + public void LoadFromFile(string file) + { + XmlDocument doc = new XmlDocument(); + + //Load the file in to memory + doc.Load(file); + + //Load modules ... + foreach (XmlNode node in doc.SelectNodes("/modules/module")) + { + RBuildModule module; + + module = new RBuildModule(); + module.Metadata = new RBuildMetadata(); + + module.Name = node.Attributes["name"].Value; + //module.Base = node.Attributes["base"].Value; + module.Metadata.Description = node.Attributes["desc"].Value; + //module.Rbuild = node.Attributes["rbuild"].Value; + + /* + foreach (XmlNode dep in node.SelectNodes("provides/provide")) + { + string value = dep.SelectSingleNode("value").InnerText; + string type = dep.SelectSingleNode("type").InnerText; + + module.Provides.Add(value, type); + }*/ + + m_Modules.Add(module); + } + + foreach (XmlNode comp in doc.SelectNodes("/modules/module")) + { + // Get the component name.... + string componentName = comp.Attributes["name"].Value; + + foreach (XmlNode dep in comp.SelectNodes("dependencies/dependency")) + { + // Gets the dependency name + string dependencyName = dep.Attributes["name"].Value; + + foreach (RBuildModule dependency in m_Modules) + { + if (dependency.Name == dependencyName) + { + foreach (RBuildModule module in m_Modules) + { + if (module.Name == componentName) + { + module.Libraries.Add(dependency); + } + } + } + } + } + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/Properties/AssemblyInfo.cs b/reactos/tools/sysgen/RosFramework/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..c9902b14d7b --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("RosFramework")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sand")] +[assembly: AssemblyProduct("RosFramework")] +[assembly: AssemblyCopyright("Copyright © Sand 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("bc0dfcae-52a0-41f1-83b6-df64128d52b7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/reactos/tools/sysgen/RosFramework/RBuildAPIInfo.cs b/reactos/tools/sysgen/RosFramework/RBuildAPIInfo.cs new file mode 100644 index 00000000000..dc175f72398 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildAPIInfo.cs @@ -0,0 +1,37 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildAPIInfo + { + private string m_Name; + private string m_File; + private bool m_Implemented; + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string File + { + get { return m_File; } + set { m_File = value; } + } + + public bool Implemented + { + get { return m_Implemented; } + set { m_Implemented = value; } + } + + public string HtmlDocFileName + { + get { return string.Format("{0}.htm", Name); } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildAuthor.cs b/reactos/tools/sysgen/RosFramework/RBuildAuthor.cs new file mode 100644 index 00000000000..eb504b687d6 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildAuthor.cs @@ -0,0 +1,38 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public enum AuthorRole + { + Developer, + Mantainer, + Translator + } + + public class RBuildAuthor + { + private AuthorRole m_AuthorRole = AuthorRole.Developer; + private RBuildContributor m_Contributor = null; + + /// + /// The underlying contributor. + /// + public RBuildContributor Contributor + { + get { return m_Contributor; } + set { m_Contributor = value; } + } + + /// + /// The author role. + /// + public AuthorRole Role + { + get { return m_AuthorRole; } + set { m_AuthorRole = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildAutoRegister.cs b/reactos/tools/sysgen/RosFramework/RBuildAutoRegister.cs new file mode 100644 index 00000000000..8bc526a5f01 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildAutoRegister.cs @@ -0,0 +1,106 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + /// + /// Type of registration + /// + public enum AutoRegisterType : int + { + DllRegisterServer = 1, + DllInstall = 2, + Both = 3 + } + + public enum SetupApiFolder : int + { + SourceDrive = 1, //(the directory from which the INF file was installed) + OS = 10, //(%SystemRoot%) + System = 11, //(%SystemRoot%\system32) + Drivers = 12, //(%SystemRoot%\system32\drivers) + Inf = 17, //(%SystemRoot%\inf) + Help = 18, //(%SystemRoot%\Help) + Fonts = 20, //(%SystemRoot%\Fonts) + Root = 24, //(%SystemDrive%) + Shared = 25, //(%ALLUSERSPROFILE%\Shared Documents) + UserProfile = 53 //(%USERPROFILE%) + } + + public enum SetupApiShellFolder : int + { + AllUsersApplicationData, // 16419 %ALLUSERSPROFILE%\Application Data + AllUsersDesktop, // 16409 %ALLUSERSPROFILE%\Desktop + AllUsersMyDocuments, // 16430 %ALLUSERSPROFILE%\Documents + AllUsersMyMusic, // 16437 %ALLUSERSPROFILE%\Documents\My Music + AllUsersMyPictures, // 16438 %ALLUSERSPROFILE%\Documents\My Pictures + AllUsersMyVideos, // 16439 %ALLUSERSPROFILE%\Documents\My Videos + AllUsersFavourites, // 16415 %ALLUSERSPROFILE%\Favorites + AllUsersStartMenu, // 16406 %ALLUSERSPROFILE%\Start Menu + AllUsersStartMenuPrograms, // 16407 %ALLUSERSPROFILE%\Start Menu\Programs + AllUsersStartMenuAdministrativeTools, // 16431 %ALLUSERSPROFILE%\Start Menu\Programs\Administrative Tools + AllUsersStartMenuStartup, // 16408 %ALLUSERSPROFILE%\Start Menu\Programs\Startup + AllUsersTemplates, // 16429 %ALLUSERSPROFILE%\Templates + UserApplicationData, // 16410 %USERPROFILE%\Application Data + UserCookies, // 16417 %USERPROFILE%\Cookies + UserDesktop, // 16384 %USERPROFILE%\Desktop + UserDesktop2, // 16400 %USERPROFILE%\Desktop + UserFavourites, // 16390 %USERPROFILE%\Favorites + UserLocalSettingsApplicationData, // 16412 %USERPROFILE%\Local Settings\Application Data + UserLocalSettingsMSCDBruning, // 16443 %USERPROFILE%\Local Settings\Application Data\Microsoft\CD Burning + UserHistory, // 16418 %USERPROFILE%\Local Settings\History + UserTemporaryInternetFiles, // 16416 %USERPROFILE%\Local Settings\Temporary Internet Files + UserMyDocuments, // 16389 %USERPROFILE%\My Documents + UserMyMusic, // 16397 %USERPROFILE%\My Documents\My Music + UserMyPictures, // 16423 %USERPROFILE%\My Documents\My Pictures + UserMyVideos, // 16398 %USERPROFILE%\My Documents\My Videos + UserNetHood, // 16403 %USERPROFILE%\NetHood + UserPrintHood, // 16411 %USERPROFILE%\PrintHood + UserRecent, // 16392 %USERPROFILE%\Recent + UserSendTo, // 16393 %USERPROFILE%\SendTo + UserStartMenu, // 16395 %USERPROFILE%\Start Menu + UserStartMenuPrograms, // 16386 %USERPROFILE%\Start Menu\Programs + UserStartMenuAdministrativeTools, // 16432 %USERPROFILE%\Start Menu\Programs\Administrative Tools + UserStartMenuStartup, // 16391 %USERPROFILE%\Start Menu\Programs\Startup + UserTemplates, // 16405 %USERPROFILE%\Templates + ProgramFiles, // 16422 %ProgramFiles% + ProgramFilesCommonFiles, // 16427 %ProgramFiles%\Common Files + SystenResources, // 16440 %SystemRoot%\Resources + SystemEnglishResources // 16441 %SystemRoot%\Resources\0409 + } + + /// + /// An autoregister element specifies that the generated executable should be + /// registered in the registry during second stage setup. + /// + public class RBuildAutoRegister + { + private AutoRegisterType m_AutoRegisterType = AutoRegisterType.Both; + private string m_InfSection = null; + + /// + /// Name of section in syssetup.inf. + /// + public string InfSection + { + get { return m_InfSection; } + set { m_InfSection = value; } + } + + /// + /// Type of registration. + /// + public AutoRegisterType Type + { + get { return m_AutoRegisterType; } + set { m_AutoRegisterType = value; } + } + + public int RegistrationType + { + get { return (int)Type; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildBootstrapFile.cs b/reactos/tools/sysgen/RosFramework/RBuildBootstrapFile.cs new file mode 100644 index 00000000000..07771b10d46 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildBootstrapFile.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + /// + /// A bootstrap element specifies that the generated file should + /// be put on the bootable CD as a bootstrap file. + /// + public class RBuildBootstrapFile : RBuildCDFileBase + { + public RBuildBootstrapFile() + { + } + + public RBuildBootstrapFile(string basePath , string name) + { + Base = basePath; + Name = name; + } + + //public override RBuildFile CDNewFile + //{ + // get + // { + // RBuildFile file = (RBuildFile)Clone(); + + // file.Name = NewName; + // file.Base = InstallBase; + // file.Root = PathRoot.CDOutput; + + // return file; + // } + //} + + //public virtual RBuildFile CDNewFile + //{ + // get + // { + // RBuildFile file = (RBuildFile)Clone(); + + // file.Name = NewName; + // file.Base = InstallBase; + // file.Root = PathRoot.CDOutput; + + // return file; + // } + //} + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildBuildFamily.cs b/reactos/tools/sysgen/RosFramework/RBuildBuildFamily.cs new file mode 100644 index 00000000000..24014e0e2c7 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildBuildFamily.cs @@ -0,0 +1,25 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildBuildFamily + { + private string m_Name = null; + private string m_Description = null; + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string Description + { + get { return m_Description; } + set { m_Description = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildCDFile.cs b/reactos/tools/sysgen/RosFramework/RBuildCDFile.cs new file mode 100644 index 00000000000..e8b34f00252 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildCDFile.cs @@ -0,0 +1,14 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + /// + /// A cdfile element specifies the name of a file that is to be put on the bootable CD. + /// + public class RBuildCDFile : RBuildCDFileBase + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildCDFileBase.cs b/reactos/tools/sysgen/RosFramework/RBuildCDFileBase.cs new file mode 100644 index 00000000000..5f07e283027 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildCDFileBase.cs @@ -0,0 +1,11 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildCDFileBase : RBuildOutputFile /*RBuildPlatformFile*/ + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildCompilationUnit.cs b/reactos/tools/sysgen/RosFramework/RBuildCompilationUnit.cs new file mode 100644 index 00000000000..2b1348b8c7b --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildCompilationUnit.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + /// + /// A compilationunit element specifies that one or more source code + /// files are to be compiled as a single compilation unit. + /// + public class RBuildCompilationUnitFile : RBuildSourceFile , IRBuildSourceFilesContainer + { + private RBuildSourceFileCollection m_SourceFiles = new RBuildSourceFileCollection(); + + /// + /// Gets the collection of . + /// + public RBuildSourceFileCollection SourceFiles + { + get { return m_SourceFiles; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildContributor.cs b/reactos/tools/sysgen/RosFramework/RBuildContributor.cs new file mode 100644 index 00000000000..a881176f071 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildContributor.cs @@ -0,0 +1,93 @@ +using System; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildContributor + { + private string m_FirstName = null; + private string m_LastName = null; + private string m_Alias = null; + private string m_City = null; + private string m_Country = null; + private string m_Mail = null; + private string m_Website = null; + private bool m_Active = true; + + public string FirstName + { + get { return m_FirstName; } + set { m_FirstName = value; } + } + + public string Website + { + get { return m_Website; } + set { m_Website = value; } + } + + public string LastName + { + get { return m_LastName; } + set { m_LastName = value; } + } + + public string Alias + { + get { return m_Mail; } + set { m_Mail = value; } + } + + public string Mail + { + get { return m_Alias; } + set { m_Alias = value; } + } + + public string City + { + get { return m_City; } + set { m_City = value; } + } + + public string Country + { + get { return m_Country; } + set { m_Country = value; } + } + + public bool Active + { + get { return m_Active; } + set { m_Active = value; } + } + + public string FullName + { + get { return string.Format("{0} {1}", FirstName, LastName); } + } + + public string HtmlDocFileName + { + get { return string.Format("{0}.htm", Alias); } + } + + public bool HasAlias + { + get { return ((Alias != null) && (Alias.Length > 0)); } + } + + public bool HasMail + { + get { return ((Mail != null) && (Mail.Length > 0)); } + } + + public bool HasLocation + { + get { return ((City != null) && (City.Length > 0) && (Country != null) && (Country.Length > 0)); } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildDebugChannel.cs b/reactos/tools/sysgen/RosFramework/RBuildDebugChannel.cs new file mode 100644 index 00000000000..6125c49bd48 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildDebugChannel.cs @@ -0,0 +1,74 @@ +using System; +using System.Text; +using System.IO; +using System.Collections.Generic; + +namespace SysGen.RBuild.Framework +{ + public class RBuildDebugChannel + { + private string m_Name = null; + private bool m_Warn = true; + private bool m_Error = true; + private bool m_Trace = false; + private bool m_Fixme = true; + + public RBuildDebugChannel() + { + } + + public RBuildDebugChannel(string name) + { + m_Name = name; + } + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public bool Warn + { + get { return m_Warn; } + set { m_Warn = value; } + } + + public bool Error + { + get { return m_Error; } + set { m_Error = value; } + } + + public bool Trace + { + get { return m_Trace; } + set { m_Trace = value; } + } + + public bool Fixme + { + get { return m_Fixme; } + set { m_Fixme = value; } + } + + public string Text + { + get + { + StringBuilder sBuilder = new StringBuilder(); + + if (Warn) + sBuilder.AppendFormat("warn+{0},", Name); + if (Error) + sBuilder.AppendFormat("err+{0},", Name); + if (Trace) + sBuilder.AppendFormat("trace+{0},", Name); + if (Fixme) + sBuilder.AppendFormat("fix+{0},", Name); + + return sBuilder.ToString(); + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildExportFunction.cs b/reactos/tools/sysgen/RosFramework/RBuildExportFunction.cs new file mode 100644 index 00000000000..9e1868a01f5 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildExportFunction.cs @@ -0,0 +1,47 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public enum CallingConventionType + { + None, + StdCall, + Pascal, + VarArgs + } + + public class RBuildExportFunction + { + private string m_Ordinal; + private string m_FunctionName; + private CallingConventionType m_CallingConvention = CallingConventionType.None; + private bool m_Stub; + + public string Ordinal + { + get { return m_Ordinal; } + set { m_Ordinal = value; } + } + + public string FunctionName + { + get { return m_FunctionName; } + set { m_FunctionName = value; } + } + + public CallingConventionType CallingConvention + { + get { return m_CallingConvention; } + set { m_CallingConvention = value; } + } + + public bool IsStub + { + get { return m_Stub; } + set { m_Stub = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildFamily.cs b/reactos/tools/sysgen/RosFramework/RBuildFamily.cs new file mode 100644 index 00000000000..067453a19df --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildFamily.cs @@ -0,0 +1,18 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildFamily + { + private string m_FamilyName = null; + + public string Name + { + get { return m_FamilyName; } + set { m_FamilyName = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildFile.cs b/reactos/tools/sysgen/RosFramework/RBuildFile.cs new file mode 100644 index 00000000000..ed070b95ecf --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildFile.cs @@ -0,0 +1,441 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public enum PathRoot + { + Default, + SourceCode, + Output, + Intermediate, + CDOutput, + Temporary, + Install, + BootCD, + LiveCD, + Platform + } + + public enum SourceType + { + Unknown, + C, + CPP, + IDL, + Assembler, + NASM, + WineBuild, + WindResource, + MessageTable, + Header + } + + public class RBuildFolder : RBuildFileSystemInfo + { + private List m_Contents = new List(); + + public RBuildFolder() + { + } + + public RBuildFolder(RBuildFolder parentFolder , string name) + { + Root = parentFolder.Root; + Base = parentFolder.Base; + Name = name; + } + + public RBuildFolder(PathRoot rootPath) + { + Root = rootPath; + //Base = "."; + } + + public RBuildFolder (PathRoot rootPath, string basePath) + { + Root = rootPath; + Base = basePath; + } + + public RBuildFolder Parent + { + get + { + RBuildFolder folder = null; + + folder = new RBuildFolder(); + folder.Base = Path.GetDirectoryName(FullPath); + folder.Name = ""; + folder.Root = Root; + + return folder; + // return new RBuildFolder(Root, Path.GetDirectoryName(Base), Name); + } + } + + public List Contents + { + get { return m_Contents; } + } + + public override string ToString() + { + return string.Format("{0} - {1}", Root, FullPath); + } + } + + public class RBuildSourceFile : RBuildFile, IComparable + { + private bool m_First = false; + private string m_Switches = string.Empty; + + public string Switches + { + get { return m_Switches; } + set { m_Switches = value; } + } + + public bool First + { + get { return m_First; } + set { m_First = value; } + } + + public SourceType Type + { + get + { + if (IsC) + return SourceType.C; + if (IsCPP) + return SourceType.CPP; + if (IsAssembler) + return SourceType.Assembler; + if (IsNASM) + return SourceType.NASM; + if (IsWidl) + return SourceType.IDL; + if (IsWindResource) + return SourceType.WindResource; + if (IsWineBuild) + return SourceType.WineBuild; + if (IsMessageTable) + return SourceType.MessageTable; + if (IsHeader) + return SourceType.Header; + + return SourceType.Unknown; + } + } + + public bool CompilableObject + { + get + { + if (IsWidl) + return false; + if (IsMessageTable) + return false; + + return true; + } + } + + public bool IsCPP + { + get + { + switch (Extension) + { + case ".cc": + case ".cpp": + case ".cxx": + return true; + default: + return false; + } + } + } + + public bool IsWidl + { + get + { + if (Extension == ".idl") + return true; + + return false; + } + } + + public bool IsMessageTable + { + get + { + if (Extension == ".mc") + return true; + + return false; + } + } + + public bool IsHeader + { + get + { + if (Extension == ".h") + return true; + + return false; + } + } + + public bool IsWineBuild + { + get + { + if (Extension == ".spec") + return true; + + return false; + } + } + + public bool IsWindResource + { + get + { + if (Extension == ".rc") + return true; + + return false; + } + } + + public bool IsNASM + { + get + { + if (Extension == ".asm") + return true; + + return false; + } + } + + public bool IsAssembler + { + get + { + if (Extension == ".s") + return true; + + return false; + } + } + + public bool IsC + { + get + { + if (Extension == ".c") + return true; + + return false; + } + } + + public bool IsCompilable + { + get { return (IsC || IsCPP || IsAssembler || IsNASM || IsWidl || IsWindResource || IsWineBuild || IsHeader); } + } + + public override string ToString() + { + return string.Format("{0} {1}" , Name , Type); + } + + #region IComparable Members + + public int CompareTo(object obj) + { + RBuildSourceFile source = (RBuildSourceFile)obj; + + if (First != source.First) + { + if (source.First) + return 1; + else + return -1; + } + + return 0; + } + + #endregion + } + + public class RBuildFile : RBuildFileSystemInfo + { + public RBuildFile() + { + } + + public RBuildFile(RBuildElement element) + : base (element) + { + } + + public string Extension + { + get { return Path.GetExtension(Name).Trim().ToLower(); } + } + + public override object Clone() + { + RBuildFile file = new RBuildFile(); + + file.Base = Base; + file.Name = Name; + file.Root = Root; + file.Enabled = Enabled; + + return file; + } + + public RBuildFolder Folder + { + get { return new RBuildFolder(Root, Base); } + } + } + + /// + /// Represents the base class for source-code , installable file , folder , include folder , cdfile taks ... from a build. + /// + public abstract class RBuildFileSystemInfo : ICloneable + { + protected RBuildElement m_Element = null; + protected PathRoot m_Root = PathRoot.Default; + protected string m_Name = string.Empty; //"."; + protected string m_Base = string.Empty; //null; + protected bool m_Enabled = true; + + public RBuildFileSystemInfo(RBuildElement element) + { + m_Element = element; + } + + public RBuildFileSystemInfo() + { + } + + private string NormalizePath(string path) + { + return path.Replace( + Path.AltDirectorySeparatorChar, + Path.DirectorySeparatorChar); + } + + public string FullPath + { + get { + + if (Base == null || Name == null) + { + int i = 10; + } + + return NormalizePath(Path.Combine(Base, Name)); + } + } + + public string Name + { + get { return m_Name; } + set + { + if (value == null) + { + int i = 10; + } + m_Name = value; } + } + + public string Base + { + get { return m_Base; } + set + { + if (value == null) + { + int i = 10; + } + m_Base = value; + } + } + + public bool Enabled + { + get { return m_Enabled; } + set { m_Enabled = value; } + } + + //TODO : ELIMINAR + public RBuildElement Element + { + get { return m_Element; } + set { m_Element = value; } + } + + public virtual PathRoot Root + { + get { return m_Root; } + set { m_Root = value; } + } + + public string[] BasePathParts + { + get { return Base.Split(new char[] { '\\' }); } + } + + public override bool Equals(object obj) + { + if (obj is RBuildFileSystemInfo) + { + RBuildFileSystemInfo rfsInfo = obj as RBuildFileSystemInfo; + + if ((rfsInfo.Base == Base) && + (rfsInfo.Root == Root) && + (rfsInfo.Name == Name)) + { + return true; + } + + if ((rfsInfo.FullPath == FullPath) && (rfsInfo.Root == Root)) + { + return true; + } + } + + // The instances are not equal + return false; + } + + public override int GetHashCode() + { + return Base.GetHashCode() ^ Name.GetHashCode() ^ Root.GetHashCode (); + } + + #region ICloneable Members + + public virtual object Clone() + { + throw new Exception("The method or operation is not implemented."); + } + + #endregion + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildImportLibrary.cs b/reactos/tools/sysgen/RosFramework/RBuildImportLibrary.cs new file mode 100644 index 00000000000..04d9508d25f --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildImportLibrary.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + /// + /// An importlibrary element specifies that an import library should be + /// generated which other modules can use to link with the current module. + /// + public sealed class RBuildImportLibrary : RBuildFile + { + private string m_DllName = null; + + /// + /// Creates a new instance of the . + /// + public RBuildImportLibrary() + { + } + + public string DllName + { + get { return m_DllName; } + set { m_DllName = value; } + } + + public bool IsSpecFile + { + get { return Name.EndsWith(".spec.def"); } + } + + public string Definition + { + get { return Name; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildInfInstallerFile.cs b/reactos/tools/sysgen/RosFramework/RBuildInfInstallerFile.cs new file mode 100644 index 00000000000..0eec49b37ae --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildInfInstallerFile.cs @@ -0,0 +1,18 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildInfInstallerFile : RBuildFile + { + private string m_InstallSection = "DefaultInstall"; + + public string InstallSection + { + get { return m_InstallSection; } + set { m_InstallSection = value; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildInstallFile.cs b/reactos/tools/sysgen/RosFramework/RBuildInstallFile.cs new file mode 100644 index 00000000000..a401e126969 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildInstallFile.cs @@ -0,0 +1,38 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildInstallFile : RBuildPlatformFile + { + } + + public class RBuildWallpaperFile : RBuildInstallFile + { + private string m_ID = null; + + public RBuildWallpaperFile() + { + } + + public RBuildWallpaperFile(string file) + { + Name = file; + } + + public string ID + { + get + { + if (m_ID == null || + m_ID == string.Empty) + return base.Name; + + return m_ID; + } + set { m_ID = value; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildInstallFolder.cs b/reactos/tools/sysgen/RosFramework/RBuildInstallFolder.cs new file mode 100644 index 00000000000..acc7918b249 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildInstallFolder.cs @@ -0,0 +1,30 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildInstallFolder : RBuildFolder + { + private string m_ID = null; + + public RBuildInstallFolder() + { + Root = PathRoot.Install; + } + + public RBuildInstallFolder(string id, string name) + { + ID = id; + Name = name; + Root = PathRoot.Install; + } + + public string ID + { + get { return m_ID; } + set { m_ID = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildLanguage.cs b/reactos/tools/sysgen/RosFramework/RBuildLanguage.cs new file mode 100644 index 00000000000..0e0be1389f2 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildLanguage.cs @@ -0,0 +1,48 @@ +using System; +using System.Globalization; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildLanguage + { + private string m_Name = null; + private string m_LCID = null; + + private CultureInfo m_CultureInfo = null; + + public RBuildLanguage() + { + } + + public RBuildLanguage(string name) + { + //IsoName = name; + Name = name; + } + + public string LCID + { + get { return m_LCID; } + set { m_LCID = value; } + } + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public CultureInfo CultureInfo + { + get { return m_CultureInfo; } + } + + //public string IsoName + //{ + // get { return m_CultureInfo.Name; } + // set { m_CultureInfo = CultureInfo.GetCultureInfo(value); } + //} + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildLocalizationFile.cs b/reactos/tools/sysgen/RosFramework/RBuildLocalizationFile.cs new file mode 100644 index 00000000000..cbc46aa5c99 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildLocalizationFile.cs @@ -0,0 +1,34 @@ +using System; +using System.Globalization; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildLocalizationFile : RBuildFile + { + private bool m_Dirty = false; + private CultureInfo m_CultureInfo = null; + + public RBuildLocalizationFile() + { + } + + public CultureInfo CultureInfo + { + get { return m_CultureInfo; } + } + + public bool Dirty + { + get { return m_Dirty; } + set { m_Dirty = value; } + } + + public string IsoName + { + get { return m_CultureInfo.Name; } + set { m_CultureInfo = CultureInfo.GetCultureInfo(value); } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildMetadata.cs b/reactos/tools/sysgen/RosFramework/RBuildMetadata.cs new file mode 100644 index 00000000000..e828dbdc725 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildMetadata.cs @@ -0,0 +1,18 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildMetadata + { + private string m_Description = null; + + public string Description + { + get { return m_Description; } + set { m_Description = value; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildModule.cs b/reactos/tools/sysgen/RosFramework/RBuildModule.cs new file mode 100644 index 00000000000..f7fcb2f504d --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildModule.cs @@ -0,0 +1,1210 @@ +using System; +using System.Xml; +using System.IO; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Text; +using System.ComponentModel; + +namespace SysGen.RBuild.Framework +{ + public enum ModuleType + { + BuildTool = 0, + StaticLibrary = 1, + ObjectLibrary = 2, + Kernel = 3, + KernelModeDLL = 4, + KernelModeDriver = 5, + NativeDLL = 6, + NativeCUI = 7, + Win32DLL = 8, + Win32OCX = 9, + Win32CUI = 10, + Win32GUI = 11, + BootLoader = 12, + BootSector = 13, + Iso = 14, + LiveIso = 15, + Test = 16, + RpcServer = 17, + RpcClient = 18, + Alias = 19, + BootProgram = 20, + Win32SCR = 21, + IdlHeader = 23, + IsoRegTest = 24, + LiveIsoRegTest = 25, + EmbeddedTypeLib = 26, + ElfExecutable = 27, + RpcProxy = 28, + HostStaticLibrary = 29, + Cabinet = 30, + Package = 50, + ModuleGroup = 51, + PlatformProfile = 52, + KeyboardLayout, + MessageHeader, + IdlInterface + } + + [DefaultPropertyAttribute("Name")] + public class RBuildModule : RBuildElement, IRBuildSourceFilesContainer//, IRBuildInstallable + { + private string m_InstallBase = "."; + private string m_InstallName = null; + private string m_BaseAddress = null; + private string m_EntryPoint = null; + private string m_AliasOf = null; + private string m_Extension = null; + private string m_BuildType = null; + private string m_Description = null; + private string m_LCID = null; + private string m_CDLabel = null; + private string m_OutputName = null; + private string m_CatalogPath = null; + + private ModuleType m_Type = ModuleType.Win32CUI; + + protected bool m_Enabled = true; + protected bool m_Unicode = false; + protected bool m_AllowWarnings = false; + protected bool m_IsStartupLib = false; + protected bool m_UnderscoreSymbols = false; + protected bool m_MangledSymbols = false; + protected bool m_HostBuild = false; + + //protected RBuildInfInstallerFile m_InfInstallComponent = null; + protected RBuildFile m_LinkerScript = null; + protected RBuildSourceFile m_PrecompiledHeader = null; + protected RBuildAutoRegister m_AutoRegister = null; + protected RBuildSetupFile m_RBuildSetup = null; + protected RBuildImportLibrary m_ImportLibrary = null; + protected RBuildMetadata m_Metadata = null; + //protected RBuildInstallFolder m_InstallFolder = null; + protected RBuildBootstrapFile m_Bootstrap = null; + protected RBuildModule m_BootSectorModule = null; + + private RBuildFamilyCollection m_Families = new RBuildFamilyCollection(); + private RBuildAPIStatusCollection m_ApiInfo = new RBuildAPIStatusCollection(); + private RBuildModuleCollection m_Dependencies = new RBuildModuleCollection(); + private RBuildModuleCollection m_Libraries = new RBuildModuleCollection(); + private RBuildModuleCollection m_Requeriments = new RBuildModuleCollection(); + private RBuildSourceFileCollection m_SourceFiles = new RBuildSourceFileCollection(); + private RBuildLocalizationFileCollection m_LocalizationFiles = new RBuildLocalizationFileCollection(); + private RBuildExportedFunctionsCollection m_ExportedFunctions = new RBuildExportedFunctionsCollection(); + private RBuildAuthorCollection m_Authors = new RBuildAuthorCollection(); + private List m_RegistryKeys = new List(); + private List m_CompilationUnits = new List(); + + //public void GenerateFromPath(string path) + //{ + // m_Base = path; + + // m_Path = System.IO.Path.GetFileName(path); + // m_Name = System.IO.Path.GetFileName(path); + //} + + public RBuildSourceFile PreCompiledHeader + { + get + { + foreach (RBuildSourceFile file in SourceFiles) + { + if (file.Type == SourceType.Header) + return file; + } + + return null; + } + } + + public RBuildFile LinkerScript + { + get { return m_LinkerScript; } + set { m_LinkerScript = value; } + } + + public RBuildBootstrapFile Bootstrap + { + get { return m_Bootstrap; } + set { m_Bootstrap = value; } + } + + public bool IsBootstrap + { + get { return Bootstrap != null; } + } + + //Hack: + public bool IsSpecialIncludedBootStrap + { + get { return (Name == "ntdll"); } + } + + //Hack:: + public bool IsSpecialExcludedBootStrap + { + get { return (Name == "hal"); } + } + + public RBuildModule BootSector + { + get { return m_BootSectorModule; } + set { m_BootSectorModule = value; } + } + + //public RBuildInstallFolder InstallFolder + //{ + // get { return m_InstallFolder; } + // set { m_InstallFolder = value; } + //} + + public RBuildMetadata Metadata + { + get { return m_Metadata; } + set { m_Metadata = value; } + } + + public string Extension + { + get + { + if ((m_Extension == null) || (m_Extension == string.Empty)) + return DefaultExtension; + + return m_Extension; + } + set { m_Extension = value; } + } + + public string DefaultExtension + { + get + { + switch (Type) + { + case ModuleType.StaticLibrary: + case ModuleType.HostStaticLibrary: + return ".a"; + case ModuleType.ObjectLibrary: + return ".o"; + case ModuleType.Kernel: + case ModuleType.NativeCUI: + case ModuleType.Win32CUI: + case ModuleType.Win32GUI: + return ".exe"; + case ModuleType.Win32SCR: + return ".scr"; + case ModuleType.KeyboardLayout: + case ModuleType.KernelModeDLL: + case ModuleType.NativeDLL: + case ModuleType.Win32DLL: + return ".dll"; + case ModuleType.Win32OCX: + return ".ocx"; + case ModuleType.KernelModeDriver: + case ModuleType.BootLoader: + return ".sys"; + case ModuleType.BootSector: + return ".o"; + case ModuleType.Iso: + case ModuleType.LiveIso: + case ModuleType.IsoRegTest: + case ModuleType.LiveIsoRegTest: + return ".iso"; + case ModuleType.Test: + return ".exe"; + case ModuleType.RpcServer: + case ModuleType.RpcClient: + case ModuleType.RpcProxy: + return ".o"; + case ModuleType.BuildTool: + return ".exe"; + case ModuleType.Alias: + case ModuleType.BootProgram: + case ModuleType.IdlHeader: + case ModuleType.MessageHeader: + case ModuleType.Package: + case ModuleType.ModuleGroup: + case ModuleType.PlatformProfile: + return string.Empty; + case ModuleType.EmbeddedTypeLib: + return ".tlb"; + case ModuleType.Cabinet: + return ".cab"; + default: + throw new Exception("Unknown module type"); + } + } + } + + public string CatalogPath + { + get + { + if (m_CatalogPath == null) + return Folder.Parent.FullPath; + + return m_CatalogPath; + } + set { m_CatalogPath = value; } + } + + public RBuildImportLibrary ImportLibrary + { + get { return m_ImportLibrary; } + set { m_ImportLibrary = value; } + } + + public string AliasOf + { + get { return m_AliasOf; } + set { m_AliasOf = value; } + } + + public string BuildType + { + get + { + if (m_BuildType == null) + m_BuildType = "BOOTPROG"; + + return m_BuildType; + } + set { m_BuildType = value; } + } + + public string BaseAddress + { + get + { + if ((m_BaseAddress == null) || (m_BaseAddress == string.Empty)) + return DefaultBaseAdress; + + return m_BaseAddress; + } + set { m_BaseAddress = value; } + } + + public string EntryPoint + { + get + { + if (string.IsNullOrEmpty(m_EntryPoint)) + return DefaultEntrypoint; + + return m_EntryPoint; + } + set { m_EntryPoint = value; } + } + + public bool NoEntryPoint + { + get { return (EntryPoint == "0") || (EntryPoint == "0x0"); } + } + + public string LinkerEntryPoint + { + get + { + if (NoEntryPoint) + return EntryPoint; + + return string.Format("_{0}", EntryPoint); + } + } + + public string HtmlDocFileName + { + get { return string.Format("{0}.htm", Name); } + } + + public bool IsDefaultBaseAdress + { + get { return (BaseAddress == DefaultBaseAdress); } + } + + public bool IsDefaultEntryPoint + { + get { return (EntryPoint == DefaultEntrypoint); } + } + + public bool PCH + { + get { return (PreCompiledHeader != null); } + } + + public bool CPlusPlus + { + get + { + foreach (RBuildSourceFile file in SourceFiles) + { + if ((file.Extension == ".cpp") || + (file.Extension == ".cc") || + (file.Extension == ".cxx")) + { + return true; + } + } + + // This module does not contain C++ code + return false; + } + } + + public bool IsRPC + { + get + { + switch (Type) + { + case ModuleType.RpcClient: + case ModuleType.RpcServer: + case ModuleType.RpcProxy: + return true; + default: + return false; + } + } + } + + public bool IsLibrary + { + get + { + switch (Type) + { + case ModuleType.StaticLibrary: + case ModuleType.ObjectLibrary: + case ModuleType.HostStaticLibrary: //HACK + return true; + default: + return false; + } + } + } + + public bool HasInstallBase + { + get { return InstallBase != null; } + } + + public bool IsInstallable + { + get { return (IsDLL) || (IsApplication); } + } + + public bool IsApplication + { + get + { + switch (Type) + { + case ModuleType.NativeCUI: + case ModuleType.Win32CUI: + case ModuleType.Win32SCR: + case ModuleType.Win32GUI: + return true; + case ModuleType.KeyboardLayout: + case ModuleType.Kernel: + case ModuleType.KernelModeDLL: + case ModuleType.KernelModeDriver: + case ModuleType.NativeDLL: + case ModuleType.Win32DLL: + case ModuleType.Win32OCX: + case ModuleType.Test: + case ModuleType.BuildTool: + case ModuleType.HostStaticLibrary: + case ModuleType.StaticLibrary: + case ModuleType.ObjectLibrary: + case ModuleType.BootLoader: + case ModuleType.BootSector: + case ModuleType.BootProgram: + case ModuleType.Iso: + case ModuleType.LiveIso: + case ModuleType.IsoRegTest: + case ModuleType.LiveIsoRegTest: + case ModuleType.RpcServer: + case ModuleType.RpcClient: + case ModuleType.RpcProxy: + case ModuleType.Alias: + case ModuleType.IdlHeader: + case ModuleType.MessageHeader: + case ModuleType.EmbeddedTypeLib: + case ModuleType.Cabinet: + case ModuleType.Package: + case ModuleType.ModuleGroup: + case ModuleType.PlatformProfile: + return false; + default: + throw new Exception("Unknown Module Type"); + } + } + } + + public bool IsDLL + { + get + { + switch (Type) + { + case ModuleType.Kernel: + case ModuleType.KernelModeDLL: + case ModuleType.KernelModeDriver: + case ModuleType.NativeDLL: + case ModuleType.Win32DLL: + case ModuleType.Win32OCX: + case ModuleType.KeyboardLayout: + return true; + case ModuleType.NativeCUI: + case ModuleType.Win32CUI: + case ModuleType.Test: + case ModuleType.Win32SCR: + case ModuleType.Win32GUI: + case ModuleType.BuildTool: + case ModuleType.HostStaticLibrary: + case ModuleType.StaticLibrary: + case ModuleType.ObjectLibrary: + case ModuleType.BootLoader: + case ModuleType.BootSector: + case ModuleType.BootProgram: + case ModuleType.Iso: + case ModuleType.LiveIso: + case ModuleType.IsoRegTest: + case ModuleType.LiveIsoRegTest: + case ModuleType.RpcServer: + case ModuleType.RpcClient: + case ModuleType.RpcProxy: + case ModuleType.Alias: + case ModuleType.IdlHeader: + case ModuleType.MessageHeader: + case ModuleType.EmbeddedTypeLib: + case ModuleType.Cabinet: + case ModuleType.Package: + case ModuleType.ModuleGroup: + case ModuleType.PlatformProfile: + return false; + default: + throw new Exception("Unknown Module Type"); + } + } + } + + public string DefaultBaseAdress + { + get + { + switch (Type) + { + case ModuleType.Kernel: + return "0x80800000"; + case ModuleType.Win32DLL: + case ModuleType.Win32OCX: + return "0x10000000"; + case ModuleType.NativeDLL: + case ModuleType.NativeCUI: + case ModuleType.Win32CUI: + case ModuleType.Test: + return "0x00400000"; + case ModuleType.Win32SCR: + case ModuleType.Win32GUI: + return "0x00400000"; + case ModuleType.KeyboardLayout: + case ModuleType.KernelModeDLL: + case ModuleType.KernelModeDriver: + return "0x00010000"; + case ModuleType.BuildTool: + case ModuleType.HostStaticLibrary: + case ModuleType.StaticLibrary: + case ModuleType.ObjectLibrary: + case ModuleType.BootLoader: + case ModuleType.BootSector: + case ModuleType.Iso: + case ModuleType.LiveIso: + case ModuleType.IsoRegTest: + case ModuleType.LiveIsoRegTest: + case ModuleType.RpcServer: + case ModuleType.RpcClient: + case ModuleType.RpcProxy: + case ModuleType.Alias: + case ModuleType.BootProgram: + case ModuleType.IdlHeader: + case ModuleType.MessageHeader: + case ModuleType.EmbeddedTypeLib: + case ModuleType.Cabinet: + case ModuleType.Package: + case ModuleType.ModuleGroup: + case ModuleType.PlatformProfile: + return string.Empty; + default: + throw new Exception("Unknown Module Type"); + } + } + } + + public string DefaultEntrypoint + { + get + { + switch (Type) + { + case ModuleType.Kernel: + return "KiSystemStartup"; + case ModuleType.KeyboardLayout: + case ModuleType.KernelModeDLL: + case ModuleType.KernelModeDriver: + return "DriverEntry@8"; + case ModuleType.NativeDLL: + return "DllMainCRTStartup@12"; + case ModuleType.NativeCUI: + return "NtProcessStartup@4"; + case ModuleType.Win32DLL: + case ModuleType.Win32OCX: + return "DllMain@12"; + case ModuleType.Win32CUI: + case ModuleType.Test: + { + if (Unicode) + return "wmainCRTStartup"; + return "mainCRTStartup"; + } + case ModuleType.Win32SCR: + case ModuleType.Win32GUI: + { + if (Unicode) + return "wWinMainCRTStartup"; + return "WinMainCRTStartup"; + } + case ModuleType.HostStaticLibrary: + case ModuleType.BuildTool: + case ModuleType.StaticLibrary: + case ModuleType.ObjectLibrary: + case ModuleType.BootLoader: + case ModuleType.BootSector: + case ModuleType.Iso: + case ModuleType.LiveIso: + case ModuleType.IsoRegTest: + case ModuleType.LiveIsoRegTest: + case ModuleType.RpcServer: + case ModuleType.RpcClient: + case ModuleType.RpcProxy: + case ModuleType.Alias: + case ModuleType.BootProgram: + case ModuleType.IdlHeader: + case ModuleType.MessageHeader: + case ModuleType.EmbeddedTypeLib: + case ModuleType.Cabinet: + case ModuleType.Package: + case ModuleType.ModuleGroup: + case ModuleType.PlatformProfile: + return string.Empty; + default: + throw new Exception("Unknown Module Type"); + } + } + } + + public bool IsBuildable + { + get { return Type != ModuleType.Package && Type != ModuleType.ModuleGroup && Type != ModuleType.PlatformProfile; } + } + + public bool IncludeInAllTarget + { + get + { + if (Type == ModuleType.BootSector || + Type == ModuleType.Iso || + Type == ModuleType.LiveIso || + Type == ModuleType.IsoRegTest || + Type == ModuleType.LiveIsoRegTest || + Type == ModuleType.Test || + Type == ModuleType.Alias) + { + return false; + } + + return true; + } + } + + public bool LinksToCRuntimeLibrary + { + get + { + foreach (RBuildModule module in Libraries) + { + if ((module.Name == "libcntpr") || + (module.Name == "crt")) + { + return true; + } + } + + return false; + } + } + + /// + /// Default root to use when someone references + /// this module by using include + /// + public PathRoot IncludeDefaultRoot + { + get + { + switch (Type) + { + case ModuleType.RpcClient: + case ModuleType.RpcServer: + case ModuleType.RpcProxy: + return PathRoot.Intermediate; + default: + return PathRoot.SourceCode; + } + } + } + + /// + /// Gets the folder to be used when another object + /// references this module + /// + public PathRoot ReferenceDefaultRoot + { + get + { + switch (Type) + { + case ModuleType.RpcClient: + case ModuleType.RpcServer: + case ModuleType.RpcProxy: + case ModuleType.IdlHeader: + case ModuleType.MessageHeader: + case ModuleType.BootSector: + case ModuleType.StaticLibrary: + case ModuleType.HostStaticLibrary: + return PathRoot.Intermediate; + default: + return PathRoot.Output; + } + } + } + + /// + /// Gets the folder to be used when another objects + /// references the target file generated by this module + /// + public PathRoot TargetDefaultRoot + { + get + { + switch (Type) + { + case ModuleType.Iso: + case ModuleType.LiveIso: + case ModuleType.IsoRegTest: + case ModuleType.LiveIsoRegTest: + return PathRoot.Default; + case ModuleType.RpcClient: + case ModuleType.RpcServer: + case ModuleType.RpcProxy: + case ModuleType.IdlHeader: + case ModuleType.MessageHeader: + case ModuleType.BootSector: + case ModuleType.StaticLibrary: + case ModuleType.EmbeddedTypeLib: + case ModuleType.HostStaticLibrary: + return PathRoot.Intermediate; + default: + return PathRoot.Output; + } + } + } + + public bool Enabled + { + get { return m_Enabled; } + set { m_Enabled = value; } + } + + public bool MangledSymbols + { + get { return m_MangledSymbols; } + set { m_MangledSymbols = value; } + } + + public bool IsStartupLib + { + get { return m_IsStartupLib; } + set { m_IsStartupLib = value; } + } + + public bool UnderscoreSymbols + { + get { return m_UnderscoreSymbols; } + set { m_UnderscoreSymbols = value; } + } + + public bool Unicode + { + get { return m_Unicode; } + set { m_Unicode = value; } + } + + public bool AllowWarnings + { + get { return m_AllowWarnings; } + set { m_AllowWarnings = value; } + } + + /* + public RBuildFolder Folder + { + get { return new RBuildFolder(PathRoot.SourceCode, Base); } + } + */ + + /// + /// Gets the collection of . + /// + public RBuildSourceFileCollection SourceFiles + { + get { return m_SourceFiles; } + set { m_SourceFiles = value; } + } + + public RBuildLocalizationFileCollection LocalizationFiles + { + get { return m_LocalizationFiles; } + set { m_LocalizationFiles = value; } + } + + public List RegistryKeys + { + get { return m_RegistryKeys; } + set { m_RegistryKeys = value; } + } + + public RBuildAuthorCollection Authors + { + get { return m_Authors; } + set { m_Authors = value; } + } + + public List CompilationUnits + { + get { return m_CompilationUnits; } + } + + public RBuildExportedFunctionsCollection ExportedFunctions + { + get { return m_ExportedFunctions; } + } + + public RBuildAPIStatusCollection ApiInfo + { + get { return m_ApiInfo; } + } + + public RBuildFamilyCollection Families + { + get { return m_Families; } + } + + public string ModulePath + { + get { return m_Path + @"\"; } + } + + public RBuildFolder TargetFolder + { + get + { + RBuildFolder folder = null; + + folder = new RBuildFolder(); + folder.Root = TargetDefaultRoot; + + //Las ISO son excepciones a la regla , generan su resultado en el raiz y no en la carpeta + //del módulo donde se encuentran + if (Type != ModuleType.Iso && + Type != ModuleType.LiveIso && + Type != ModuleType.IsoRegTest && + Type != ModuleType.LiveIsoRegTest) + { + folder.Name = Folder.Name; + folder.Base = Folder.Base; + } + + return folder; + } + } + + public RBuildFile TargetFile + { + get + { + RBuildFile file = null; + + file = new RBuildFile(); + file.Name = TargetName; + file.Base = TargetFolder.FullPath; + file.Root = TargetFolder.Root; + + return file; + } + } + + public RBuildFile Install + { + get + { + RBuildFile file = null; + + file = new RBuildFile(); + file.Base = InstallBase; + file.Name = InstallName; + file.Root = PathRoot.Install; + + return file; + } + } + + public RBuildFile PlatformInstall + { + get + { + RBuildFile file = null; + + file = new RBuildFile(); + file.Base = "%SystemRoot%\\" + InstallBase; + file.Name = InstallName; + file.Root = PathRoot.Platform; + + return file; + } + } + + public RBuildFile Dependency + { + get + { + RBuildFile file = null; + + file = new RBuildFile(); + file.Base = Folder.FullPath; + file.Name = DependencyName; + file.Root = PathRoot.Intermediate; // ReferenceDefaultRoot; + + return file; + } + } + + public string CDLabel + { + get { return "ReactOS"; } + set { m_CDLabel = value; } + } + + public string TargetName + { + get + { + if (OutputName != null) + return OutputName; + + if (InstallName != null) + return InstallName; + + return string.Format("{0}{1}", Name, Extension); + } + } + + public string DependencyName + { + get + { + if (HasImportLibrary) + return string.Format("lib{0}.a" , Name); + + //Get the regular name + return string.Format("{0}.a" , Name); + } + } + + public string InstallBase + { + get { return m_InstallBase; } + set { m_InstallBase = value; } + } + + public string InstallName + { + get { return m_InstallName; } + set { m_InstallName = value; } + } + + public string OutputName + { + get { return m_OutputName; } + set { m_OutputName = value; } + } + + public bool Host + { + get { return m_HostBuild; } + set { m_HostBuild = value; } + } + + public bool HasImportLibrary + { + get { return (ImportLibrary != null) && (Type != ModuleType.StaticLibrary); } + } + + public bool HasMessageTables + { + get + { + foreach (RBuildSourceFile source in SourceFiles) + if (source.Type == SourceType.MessageTable) + return true; + + return false; + } + } + + public bool HasIDLs + { + get + { + foreach (RBuildSourceFile source in SourceFiles) + if (source.Type == SourceType.IDL) + return true; + + return false; + } + } + + ///* + //public string[] BaseLocation + //{ + // get { return Base.Split(new char[] { '\\' }); } + //} + + //public string[] PathLocation + //{ + // get + // { + // Uri uri = new Uri(Base , UriKind.Relative); + + // return Base.Split(new char[] { '\\' }); + + // /* + // DirectoryInfo info = new DirectoryInfo(Base); + // return info.Parent.FullName.Split(new char[] { '\\' }); + // */ + // } + //} + //*/ + + public bool IsModuleInRoot + { + get { return Path == string.Empty; } + } + + public string Description + { + get { return m_Description; } + set { m_Description = value; } + } + + public string LCID + { + get { return m_LCID; } + set { m_LCID = value; } + } + + public RBuildModuleCollection Dependencies + { + get { return m_Dependencies; } + } + + public RBuildModuleCollection Requeriments + { + get { return m_Requeriments; } + } + + public RBuildModuleCollection Libraries + { + get { return m_Libraries; } + } + + public RBuildModuleCollection Needs + { + get + { + RBuildModuleCollection modules = new RBuildModuleCollection(); + + modules.Add(Dependencies); + modules.Add(Libraries); + modules.Add(Requeriments); + + return modules; + } + } + + public ModuleType Type + { + get { return m_Type; } + set { m_Type = value; } + } + + public RBuildSetupFile Setup + { + get { return m_RBuildSetup; } + set { m_RBuildSetup = value; } + } + + public RBuildAutoRegister AutoRegister + { + get { return m_AutoRegister; } + set { m_AutoRegister = value; } + } + + public string MakeFileTargetMacro + { + get { return string.Format("$({0}_TARGET)", Name); } + } + + public string MakeFileTarget + { + get { return string.Format("{0}_TARGET", Name); } + } + + public string MakeFileLibs + { + get { return string.Format("{0}_LIBS", Name); } + } + + public string MakeFileLinkDeps + { + get { return string.Format("{0}_LINKDEPS", Name); } + } + + public string MakeFileLinkDepsMacro + { + get { return string.Format("$({0}_LINKDEPS)", Name); } + } + + public string MakeFileLibsMacro + { + get { return string.Format("$({0}_LIBS)", Name); } + } + + public override void SaveAs(string moduleFile) + { + // Creates an XML file is not exist + using (XmlTextWriter writer = new XmlTextWriter(moduleFile, Encoding.ASCII)) + { + writer.Indentation = 4; + writer.Formatting = Formatting.Indented; + + // Starts a new document + writer.WriteStartDocument(); + + writer.WriteComment("File autogenerated by RosBuilder 0.1"); + writer.WriteStartElement("module"); + + writer.WriteAttributeString("name", Name); + writer.WriteAttributeString("type", Type.ToString()); + writer.WriteAttributeString("installbase", InstallBase); + writer.WriteAttributeString("installname", InstallName); + writer.WriteAttributeString("unicode", Unicode.ToString()); + writer.WriteAttributeString("allowwarnings", AllowWarnings.ToString()); + writer.WriteAttributeString("underscoresymbols", UnderscoreSymbols.ToString()); + writer.WriteAttributeString("baseadress", BaseAddress); + writer.WriteAttributeString("entrypoint", EntryPoint); + writer.WriteAttributeString("extension", Extension); + writer.WriteAttributeString("isstartuplib", IsStartupLib.ToString()); + writer.WriteAttributeString("mangledsymbols", MangledSymbols.ToString()); + + writer.WriteStartElement("include"); + writer.WriteAttributeString("base", Name); + writer.WriteString("."); + writer.WriteEndElement(); + + foreach (RBuildFolder include in IncludeFolders) + { + writer.WriteStartElement("include"); + writer.WriteAttributeString("base", include.Base); + writer.WriteString(include.Name); + writer.WriteEndElement(); + } + + foreach (RBuildDefine define in Defines) + { + writer.WriteStartElement("define"); + writer.WriteAttributeString("name", define.Name); + + if (define.Name != string.Empty) + { + writer.WriteString(define.Value); + } + + writer.WriteEndElement(); + } + + foreach (RBuildModule dependency in Dependencies) + { + writer.WriteStartElement("dependency"); + writer.WriteString(dependency.Name); + writer.WriteEndElement(); + } + + foreach (RBuildModule library in Libraries) + { + writer.WriteStartElement("library"); + writer.WriteString(library.Name); + writer.WriteEndElement(); + } + + foreach (RBuildSourceFile sourceFile in SourceFiles) + { + if (sourceFile.IsCompilable) + { + if (sourceFile.Switches != string.Empty) + { + writer.WriteAttributeString("switches", sourceFile.Switches); + } + + writer.WriteStartElement("file"); + writer.WriteString(sourceFile.Name); + writer.WriteEndElement(); + } + } + + if (PreCompiledHeader != null) + { + writer.WriteStartElement("pch"); + writer.WriteString(PreCompiledHeader.Name); + writer.WriteEndElement(); + } + + writer.WriteEndDocument(); + } + } + + public override string ToString() + { + return string.Format("Module : '{0}' Type : {1} Base : '{2}' Libraries : '{3}' Dependencies : '{4}' Requeriments : '{5}'", + Name, + Type, + Base, + Libraries.Count, + Dependencies.Count, + Requeriments.Count); + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildModuleGroup.cs b/reactos/tools/sysgen/RosFramework/RBuildModuleGroup.cs new file mode 100644 index 00000000000..a3c57c26c8a --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildModuleGroup.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildModuleGroup + { + private string m_Name = null; + private RBuildModuleCollection m_Modules = new RBuildModuleCollection(); + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public RBuildModuleCollection Modules + { + get { return m_Modules; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildModuleInfo.cs b/reactos/tools/sysgen/RosFramework/RBuildModuleInfo.cs new file mode 100644 index 00000000000..c4c944e87fc --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildModuleInfo.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildModuleInfo + { + private string m_Name = string.Empty; + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + private string m_Base = string.Empty; + + public string Base + { + get { return m_Base; } + set { m_Base = value; } + } + private string m_CatalogPath = string.Empty; + + public string CatalogPath + { + get { return m_CatalogPath; } + set { m_CatalogPath = value; } + } + private ModuleType m_Type = ModuleType.BuildTool; + + public ModuleType Type + { + get { return m_Type; } + set { m_Type = value; } + } + + List m_Libraries = new List(); + List m_Dependencies = new List(); + List m_Requirements = new List(); + + public List Libraries + { + get { return m_Libraries; } + set { m_Libraries = value; } + } + + public List Dependencies + { + get { return m_Dependencies; } + set { m_Dependencies = value; } + } + + public List Requirements + { + get { return m_Requirements; } + set { m_Requirements = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildPlatform.cs b/reactos/tools/sysgen/RosFramework/RBuildPlatform.cs new file mode 100644 index 00000000000..8940398da6e --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildPlatform.cs @@ -0,0 +1,133 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public enum OptimizeLevelType : int + { + Level_0 = 0, + Level_1 = 1, + Level_2 = 2, + Level_3 = 3, + Level_4 = 4, + Level_5 = 5 + } + + public class RBuildPlatform + { + private string m_Name = "Unamed Platform"; + private string m_Description = "This Platform has not yet a description"; + private bool m_Debug = true; + private bool m_KDebug = true; + private bool m_GDB = false; + private bool m_NSWPAT = false; + private bool m_WINKD = false; + private OptimizeLevelType m_OptimizeLevelType = OptimizeLevelType.Level_1; + private RBuildModule m_ShellModule = null; + private RBuildModule m_ScreenSaverModule = null; + private RBuildLanguage m_Language = null; + private RBuildWallpaperFile m_Wallpaper = null; + private RBuildModuleCollection m_Modules = new RBuildModuleCollection(); + private RBuildModuleCollection m_Autorun = new RBuildModuleCollection(); + private RBuildLanguageCollection m_Languages = new RBuildLanguageCollection(); + private RBuildDebugChannelCollection m_DebugChannels = new RBuildDebugChannelCollection(); + + public RBuildPlatform() + { + } + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string Description + { + get { return m_Description; } + set { m_Description = value; } + } + + public RBuildDebugChannelCollection DebugChannels + { + get { return m_DebugChannels; } + } + + public RBuildModule Shell + { + get { return m_ShellModule; } + set { m_ShellModule = value; } + } + + public RBuildModule Screensaver + { + get { return m_ScreenSaverModule; } + set { m_ScreenSaverModule = value; } + } + + public RBuildLanguage Language + { + get { return m_Language; } + set { m_Language = value; } + } + + public RBuildWallpaperFile Wallpaper + { + get { return m_Wallpaper; } + set { m_Wallpaper = value; } + } + + public RBuildModuleCollection Modules + { + get { return m_Modules; } + } + + public RBuildModuleCollection AutorunModules + { + get { return m_Autorun; } + } + + public RBuildLanguageCollection Languages + { + get { return m_Languages; } + } + + public bool Debug + { + get { return m_Debug; } + set { m_Debug = value; } + } + + public bool KDebug + { + get { return m_KDebug; } + set { m_KDebug = value; } + } + + public bool GDB + { + get { return m_GDB; } + set { m_GDB = value; } + } + + public bool NSWPAT + { + get { return m_NSWPAT; } + set { m_NSWPAT = value; } + } + + public bool WINKD + { + get { return m_WINKD; } + set { m_WINKD = value; } + } + + public OptimizeLevelType OptimizeLevel + { + get { return m_OptimizeLevelType; } + set { m_OptimizeLevelType = value; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/RBuildPlatformFile.cs b/reactos/tools/sysgen/RosFramework/RBuildPlatformFile.cs new file mode 100644 index 00000000000..2e300fd4f30 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildPlatformFile.cs @@ -0,0 +1,84 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildOutputFile : RBuildFile //, IRBuildInstallable + { + private string m_InstallBase = "."; //"."; + private string m_NewName = null; + + public string NewName + { + get + { + if (m_NewName == null) + return m_Name; + return m_NewName; + } + set { m_NewName = value; } + } + + public string InstallBase + { + get { return m_InstallBase; } + set { m_InstallBase = value; } + } + + public virtual RBuildFile CDNewFile + { + get + { + RBuildFile file = (RBuildFile)Clone(); + + file.Name = NewName; + file.Base = InstallBase; + file.Root = PathRoot.CDOutput; + + return file; + } + } + + public virtual RBuildFile NewFile + { + get + { + RBuildFile file = (RBuildFile)Clone(); + + file.Name = NewName; + file.Base = InstallBase; + file.Root = Root; + + return file; + } + } + } + + public class RBuildPlatformFile : RBuildOutputFile + { + //protected RBuildInstallFolder m_InstallFolder = null; + + //public RBuildInstallFolder InstallFolder + //{ + // get { return m_InstallFolder; } + // set { m_InstallFolder = value; } + //} + + public RBuildFile PlatformInstall + { + get + { + RBuildFile file = null; + + file = new RBuildFile(); + file.Base = "%SystemRoot%\\" + InstallBase; + file.Name = Name; + file.Root = PathRoot.Platform; + + return file; + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildProject.cs b/reactos/tools/sysgen/RosFramework/RBuildProject.cs new file mode 100644 index 00000000000..c771b923d95 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildProject.cs @@ -0,0 +1,163 @@ +using System; +using System.Text; +using System.Xml; +using System.Collections.Generic; + +namespace SysGen.RBuild.Framework +{ + /// + /// There can be one project per top-level XML build file. + /// A project can only be defined in a top-level xml build file. + /// + public class RBuildProject : RBuildElement + { + private RBuildContributorCollection m_Contributors = new RBuildContributorCollection(); + private RBuildModuleCollection m_Modules = new RBuildModuleCollection(); + private RBuildLanguageCollection m_Languages = new RBuildLanguageCollection(); + private RBuildInstallFolderCollection m_InstallFolders = new RBuildInstallFolderCollection(); + private RBuildBuildFamilyCollection m_BuildFamilies = new RBuildBuildFamilyCollection(); + private RBuildPlatform m_Platform = new RBuildPlatform(); + private RBuildDebugChannelCollection m_DebugChannels = new RBuildDebugChannelCollection(); + + private string m_PackagesFile = "obj-i386/reactos.dff"; + private string m_MakeFile = "makefile.auto"; + + public RBuildProject() + { + Folder = new RBuildFolder(PathRoot.SourceCode); + } + + /// + /// Filename of the GNU makefile that is to be created. + /// + public string MakeFile + { + get { return m_MakeFile; } + set { m_MakeFile = value; } + } + + public string PackagesFile + { + get { return m_PackagesFile; } + set { m_PackagesFile = value; } + } + + public RBuildDebugChannelCollection DebugChannels + { + get { return m_DebugChannels; } + } + + public RBuildPlatform Platform + { + get { return m_Platform; } + set { m_Platform = value; } + } + + public RBuildBuildFamilyCollection BuildFamilies + { + get { return m_BuildFamilies; } + set { m_BuildFamilies = value; } + } + + public RBuildInstallFolderCollection InstallFolders + { + get { return m_InstallFolders; } + set { m_InstallFolders = value; } + } + + public RBuildContributorCollection Contributors + { + get { return m_Contributors; } + set { m_Contributors = value; } + } + + public RBuildModuleCollection Modules + { + get { return m_Modules; } + } + + public RBuildLanguageCollection Languages + { + get { return m_Languages; } + } + + public string MakeFileGCCOptions + { + get { return string.Format("{0}_GCCOPTIONS", Name); } + } + + public string MakeFileGCCOptionsMacro + { + get { return string.Format("$({0}_GCCOPTIONS)", Name); } + } + + public override void SaveAs(string projectFile) + { + // Creates an XML file is not exist + using (XmlTextWriter writer = new XmlTextWriter(projectFile, Encoding.ASCII)) + { + writer.Indentation = 4; + writer.Formatting = Formatting.Indented; + + // Starts a new document + writer.WriteStartDocument(); + writer.WriteStartElement("project"); + writer.WriteAttributeString("name", Name); + writer.WriteAttributeString("makefile", MakeFile); + writer.WriteAttributeString("xmlns", "xi", null, "http://www.w3.org/2001/XInclude"); + + /* + writer.WriteComment("Generic Properties"); + foreach (KeyValuePair property in Properties) + { + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", property.Key); + writer.WriteAttributeString("value", property.Value); + writer.WriteEndElement(); + } + + foreach (string define in Defines) + { + writer.WriteStartElement("define"); + writer.WriteAttributeString("name", define); + writer.WriteEndElement(); + }*/ + + writer.WriteStartElement("xi:include"); + writer.WriteAttributeString("href", "baseaddress.rbuild"); + writer.WriteEndElement(); + + writer.WriteStartElement("xi:include"); + writer.WriteAttributeString("href", "boot/bootdata/bootdata.rbuild"); + writer.WriteEndElement(); + + writer.WriteElementString("compilerflag", "-Os"); + writer.WriteElementString("compilerflag", "-ftracer"); + writer.WriteElementString("compilerflag", "-momit-leaf-frame-pointer"); + writer.WriteElementString("compilerflag", "-mpreferred-stack-boundary=2"); + + writer.WriteElementString("compilerflag", "-Wno-strict-aliasing"); + writer.WriteElementString("compilerflag", "-Wpointer-arith"); + writer.WriteElementString("linkerflag", "-enable-stdcall-fixup"); + + foreach (RBuildFolder folder in IncludeFolders) + { + writer.WriteStartElement("include"); + writer.WriteAttributeString("root", folder.Root.ToString()); + writer.WriteString(folder.Name); + writer.WriteEndElement(); + } + + foreach (RBuildModule module in Modules) + { + writer.WriteStartElement("xi:include"); + writer.WriteAttributeString("href", module.RBuildFile); + writer.WriteEndElement(); + } + + writer.WriteEndElement(); //Project + writer.WriteEndDocument(); + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildProperty.cs b/reactos/tools/sysgen/RosFramework/RBuildProperty.cs new file mode 100644 index 00000000000..bbc996f00e0 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildProperty.cs @@ -0,0 +1,104 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildProperty : RBuildValueKey + { + public RBuildProperty(string name, string value) + : base(name, value) + { + } + + public RBuildProperty(string name, string value, bool readOnly) + : base(name, value, readOnly) + { + } + + public RBuildProperty(string name, string value, bool readOnly, bool isInternal) + : base(name, value, readOnly, isInternal) + { + } + } + + public class RBuildBaseAdress : RBuildProperty + { + public RBuildBaseAdress(string name, string value) + : base(name, value, true) + { + } + } + + public class RBuildDefine : RBuildValueKey + { + public RBuildDefine(string name) + : base(name, string.Empty, true) + { + } + + public RBuildDefine(string name, string value) + : base(name, value, true) + { + } + } + + public abstract class RBuildValueKey + { + protected string m_Name = null; + protected string m_Value = null; + protected bool m_ReadOnly = false; + protected bool m_IsInternal = false; + + public RBuildValueKey(string name, string value) + { + m_Name = name; + m_Value = value; + } + + public RBuildValueKey(string name, string value, bool readOnly) + { + m_Name = name; + m_Value = value; + m_ReadOnly = readOnly; + } + + public RBuildValueKey(string name, string value, bool readOnly, bool isInternal) + { + m_Name = name; + m_Value = value; + m_ReadOnly = readOnly; + m_IsInternal = isInternal; + } + + public bool IsEmpty + { + get { return string.IsNullOrEmpty(Value); } + } + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string Value + { + get { return m_Value; } + set { m_Value = value; } + } + + public bool ReadOnly + { + get { return m_ReadOnly; } + set { m_ReadOnly = value; } + } + + public bool Internal + { + get { return m_IsInternal; } + set { m_IsInternal = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildRegistryKey.cs b/reactos/tools/sysgen/RosFramework/RBuildRegistryKey.cs new file mode 100644 index 00000000000..2f573be5409 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildRegistryKey.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using Microsoft.Win32; + +namespace SysGen.RBuild.Framework +{ + public class RBuildRegistryKey + { + private bool m_Enabled = true; + private bool m_LiveCD = true; + private bool m_BootCD = true; + + private string m_KeyName = null; + private string m_KeyValue = null; + + private RegistryHive m_RegistryHive = RegistryHive.ClassesRoot; + private RegistryValueKind m_RegistryValueKind = RegistryValueKind.Unknown; + + public RBuildRegistryKey() + { + } + + public bool LiveCD + { + get { return m_LiveCD; } + set { m_LiveCD = value; } + } + + public bool BootCD + { + get { return m_BootCD; } + set { m_BootCD = value; } + } + + public bool Enabled + { + get { return m_Enabled; } + set { m_Enabled = value; } + } + + public string KeyName + { + get { return m_KeyName; } + set { m_KeyName = value; } + } + + public string KeyValue + { + get { return m_KeyValue; } + set { m_KeyValue = value; } + } + + public RegistryHive RegistryHive + { + get { return m_RegistryHive; } + set { m_RegistryHive = value; } + } + + public RegistryValueKind RegistryValueKind + { + get { return m_RegistryValueKind; } + set { m_RegistryValueKind = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildSetup.cs b/reactos/tools/sysgen/RosFramework/RBuildSetup.cs new file mode 100644 index 00000000000..42dc5c18ed7 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildSetup.cs @@ -0,0 +1,52 @@ +//using System; +//using System.IO; +//using System.Collections.Generic; +//using System.Text; + +//namespace SysGen.RBuild.Framework +//{ +// public enum SetupType +// { +// Device, +// Component +// } + +// public class RBuildSetup : RBuildPlatformFile +// { +// private SetupType m_SetupType = SetupType.Component; +// private bool m_InstallAlways = true; +// private string m_InstallSection = "DefaultInstall"; + +// public SetupType SetupType +// { +// get { return m_SetupType; } +// set { m_SetupType = value; } +// } + +// public string InstallSection +// { +// get { return m_InstallSection; } +// set { m_InstallSection = value; } +// } + +// public string DefaultInstallSection +// { +// get +// { +// switch (SetupType) +// { +// case SetupType.Device: +// return "DefaultInstall"; +// default: +// return "DefaultInstall"; +// } +// } +// } + +// public bool InstallAlways +// { +// get { return m_InstallAlways; } +// set { m_InstallAlways = value; } +// } +// } +//} diff --git a/reactos/tools/sysgen/RosFramework/RBuildSetupFile.cs b/reactos/tools/sysgen/RosFramework/RBuildSetupFile.cs new file mode 100644 index 00000000000..6bd9aee38c9 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildSetupFile.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public enum SetupType + { + Device, + Component + } + + public class RBuildSetupFile : RBuildPlatformFile + { + private SetupType m_SetupType = SetupType.Component; + private bool m_InstallAlways = true; + private string m_InstallSection = "DefaultInstall"; + + public SetupType SetupType + { + get { return m_SetupType; } + set { m_SetupType = value; } + } + + public string InstallSection + { + get { return m_InstallSection; } + set { m_InstallSection = value; } + } + + public string DefaultInstallSection + { + get + { + switch (SetupType) + { + case SetupType.Device: + return "DefaultInstall"; + default: + return "DefaultInstall"; + } + } + } + + public bool InstallAlways + { + get { return m_InstallAlways; } + set { m_InstallAlways = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildSolution.cs b/reactos/tools/sysgen/RosFramework/RBuildSolution.cs new file mode 100644 index 00000000000..32d10134769 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildSolution.cs @@ -0,0 +1,21 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class RBuildSolution + { + private List m_Projects = null; + + /// + /// The projects this solution contains. + /// + public List Projects + { + get { return m_Projects; } + set { m_Projects = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildTarget.cs b/reactos/tools/sysgen/RosFramework/RBuildTarget.cs new file mode 100644 index 00000000000..adf726165e3 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildTarget.cs @@ -0,0 +1,274 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public enum TargetType + { + LiveCD, + BootCD + } + + public enum TargetDebugOutputType + { + COM1, + COM2, + Screen, + Bochs + } + + public enum TargetDebugType + { + None, + Debug, + KernelDebug + } + + public enum TargetWindowsPlatformType + { + WindowsNT4 = 0x400, + Windows2000 = 0x500, + WindowsXP = 0x501, + Windows2003 = 0x0502, + WindowsVista = 0x600 + } + + public enum TargetWindowsSPType + { + NoServicePack, + ServicePack1 = 0x100, + ServicePack2 = 0x200, + ServicePack3 = 0x300, + ServicePack4 = 0x400, + ServicePack5 = 0x500, + ServicePack6 = 0x600, + ServicePack7 = 0x700, + ServicePack8 = 0x800, + ServicePack9 = 0x900 + } + + public enum TargetPlatformType + { + NT4, /* Windows NT 4.0 */ + NT4_SP1, + NT4_SP2, + NT4_SP3, + NT4_SP4, + NT4_SP5, + NT4_SP6, + NT5, /* Windows 2000 */ + NT5_SP1, + NT5_SP2, + NT5_SP3, + NT5_SP4, + NT51, /* Windows XP */ + NT51_SP1, + NT51_SP2, + NT52, /* Windows 2003 */ + NT52_SP1, + NT52_SP2, + NT6 /* Windows Vista */ + } + + public enum TargetArchitectureType + { + X86, + X86_i486, + X86_i586, + X86_Pentium, + X86_Pentium2, + X86_Pentium3, + X86_Pentium4, + X86_AthlonXP, + X86_AthlonMP, + X86_Xbox, + PPC + } + + public enum TargetOptimizeLevelType + { + Level_0, + Level_1, + Level_2, + Level_3, + Level_4, + Level_5 + } + + public class RBuildTarget + { + private string m_Name = null; + + private bool m_RegTest = false; + private bool m_Multiprocessor = false; + + private TargetType m_Type = TargetType.BootCD; + private TargetDebugType m_DebugType = TargetDebugType.None; + private TargetPlatformType m_PlatformType = TargetPlatformType.NT5_SP4; + private TargetDebugOutputType m_DebugOutputType = TargetDebugOutputType.COM1; + private TargetArchitectureType m_ArchitectureType = TargetArchitectureType.X86_Pentium; + private TargetOptimizeLevelType m_OptimizeLevelType = TargetOptimizeLevelType.Level_1; + + public RBuildTarget() + { + } + + public RBuildTarget(string name) + { + m_Name = name; + } + + public RBuildTarget(string name, TargetType type) + { + m_Name = name; + m_Type = type; + } + + public RBuildTarget(string name, TargetType type, TargetDebugType debugType) + { + m_Name = name; + m_Type = type; + m_DebugType = debugType; + } + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public bool MultiProcessor + { + get { return m_Multiprocessor; } + set { m_Multiprocessor = value; } + } + + public bool RegressionTest + { + get { return m_RegTest; } + set { m_RegTest = value; } + } + + public bool Debug + { + get { return ((DebugType == TargetDebugType.Debug) || (DebugType == TargetDebugType.KernelDebug)); } + } + + public bool KernelDebug + { + get { return (DebugType == TargetDebugType.KernelDebug); } + } + + public TargetType Type + { + get { return m_Type; } + set { m_Type = value; } + } + + public TargetDebugType DebugType + { + get { return m_DebugType; } + set { m_DebugType = value; } + } + + public TargetDebugOutputType DebugOutputType + { + get { return m_DebugOutputType; } + set { m_DebugOutputType = value; } + } + + public TargetPlatformType PlatformType + { + get { return m_PlatformType; } + set { m_PlatformType = value; } + } + + public TargetArchitectureType ArchitectureType + { + get { return m_ArchitectureType; } + set { m_ArchitectureType = value; } + } + + public TargetOptimizeLevelType OptimizeType + { + get { return m_OptimizeLevelType; } + set { m_OptimizeLevelType = value; } + } + + public TargetWindowsSPType WindowsServicePack + { + get + { + switch (PlatformType) + { + case TargetPlatformType.NT4: + case TargetPlatformType.NT5: + case TargetPlatformType.NT51: + case TargetPlatformType.NT52: + case TargetPlatformType.NT6: + return TargetWindowsSPType.NoServicePack; + case TargetPlatformType.NT4_SP1: + case TargetPlatformType.NT5_SP1: + case TargetPlatformType.NT51_SP1: + case TargetPlatformType.NT52_SP1: + return TargetWindowsSPType.ServicePack1; + case TargetPlatformType.NT4_SP2: + case TargetPlatformType.NT5_SP2: + case TargetPlatformType.NT51_SP2: + case TargetPlatformType.NT52_SP2: + return TargetWindowsSPType.ServicePack2; + case TargetPlatformType.NT4_SP3: + case TargetPlatformType.NT5_SP3: + return TargetWindowsSPType.ServicePack3; + case TargetPlatformType.NT4_SP4: + case TargetPlatformType.NT5_SP4: + return TargetWindowsSPType.ServicePack4; + case TargetPlatformType.NT4_SP5: + return TargetWindowsSPType.ServicePack5; + case TargetPlatformType.NT4_SP6: + return TargetWindowsSPType.ServicePack6; + default: + throw new Exception(""); + } + } + } + + public TargetWindowsPlatformType WindowsPlatfom + { + get + { + switch (PlatformType) + { + case TargetPlatformType.NT4: + case TargetPlatformType.NT4_SP1: + case TargetPlatformType.NT4_SP2: + case TargetPlatformType.NT4_SP3: + case TargetPlatformType.NT4_SP4: + case TargetPlatformType.NT4_SP5: + case TargetPlatformType.NT4_SP6: + return TargetWindowsPlatformType.WindowsNT4; + case TargetPlatformType.NT5: + case TargetPlatformType.NT5_SP1: + case TargetPlatformType.NT5_SP2: + case TargetPlatformType.NT5_SP3: + case TargetPlatformType.NT5_SP4: + return TargetWindowsPlatformType.Windows2000; + case TargetPlatformType.NT51: + case TargetPlatformType.NT51_SP1: + case TargetPlatformType.NT51_SP2: + return TargetWindowsPlatformType.WindowsXP; + case TargetPlatformType.NT52: + case TargetPlatformType.NT52_SP1: + case TargetPlatformType.NT52_SP2: + return TargetWindowsPlatformType.Windows2003; + case TargetPlatformType.NT6: + return TargetWindowsPlatformType.WindowsVista; + default: + throw new Exception(""); + } + } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/RBuildUnAttendSetup.cs b/reactos/tools/sysgen/RosFramework/RBuildUnAttendSetup.cs new file mode 100644 index 00000000000..a240dbda757 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/RBuildUnAttendSetup.cs @@ -0,0 +1,102 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public enum InstallType : int + { + SkipMBRInstall = 0, + FloppyMBRInstall = 1, + HDDMBRInstall = 2 + } + + public class RBuildUnAttendSetup + { + private InstallType m_InstallType = InstallType.HDDMBRInstall; + private int m_DestinationDiskNumber = 0; + private int m_DestinationPartitionNumber = 1; + private bool m_FormatPartition; + private bool m_AutoPartition; + private bool m_DisableVmwDriverInstall; + private bool m_Enabled = false; + private string m_InstallDirectory; + private string m_FullName; + private string m_OrgName; + private string m_ComputerName; + private string m_AdminPassword; + + public InstallType InstallType + { + get { return m_InstallType; } + set { m_InstallType = value; } + } + + public int DestinationDiskNumber + { + get { return m_DestinationDiskNumber; } + set { m_DestinationDiskNumber = value; } + } + + public int DestinationPartitionNumber + { + get { return m_DestinationPartitionNumber; } + set { m_DestinationPartitionNumber = value; } + } + + public string InstallDirectory + { + get { return m_InstallDirectory; } + set { m_InstallDirectory = value; } + } + + public string FullName + { + get { return m_FullName; } + set { m_FullName = value; } + } + + public string OrgName + { + get { return m_OrgName; } + set { m_OrgName = value; } + } + + public string ComputerName + { + get { return m_ComputerName; } + set { m_ComputerName = value; } + } + + public string AdminPassword + { + get { return m_AdminPassword; } + set { m_AdminPassword = value; } + } + + public bool FormatPartition + { + get { return m_FormatPartition; } + set { m_FormatPartition = value; } + } + + public bool AutoPartition + { + get { return m_AutoPartition; } + set { m_AutoPartition = value; } + } + + public bool DisableVmwDriverInstall + { + get { return m_DisableVmwDriverInstall; } + set { m_DisableVmwDriverInstall = value; } + } + + public bool Enabled + { + get { return m_Enabled; } + set { m_Enabled = value; } + } + } +} diff --git a/reactos/tools/sysgen/RosFramework/SysGen.RBuild.Framework.csproj b/reactos/tools/sysgen/RosFramework/SysGen.RBuild.Framework.csproj new file mode 100644 index 00000000000..6ccaf2fe069 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/SysGen.RBuild.Framework.csproj @@ -0,0 +1,117 @@ + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26} + Library + Properties + SysGen.RBuild.Framework + SysGen.RBuild.Framework + + + 2.0 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/RosFramework/SysGen.RBuild.Framework.csproj.user b/reactos/tools/sysgen/RosFramework/SysGen.RBuild.Framework.csproj.user new file mode 100644 index 00000000000..6a34e7dcdf5 --- /dev/null +++ b/reactos/tools/sysgen/RosFramework/SysGen.RBuild.Framework.csproj.user @@ -0,0 +1,5 @@ + + + ShowAllFiles + + \ No newline at end of file diff --git a/reactos/tools/sysgen/SYSGen/Backends/Backend.cs b/reactos/tools/sysgen/SYSGen/Backends/Backend.cs new file mode 100644 index 00000000000..849137aa76d --- /dev/null +++ b/reactos/tools/sysgen/SYSGen/Backends/Backend.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SYSGen.Backends +{ + public abstract class Backend + { + } +} diff --git a/reactos/tools/sysgen/SYSGen/Backends/Catalog/CatalogBackend.cs b/reactos/tools/sysgen/SYSGen/Backends/Catalog/CatalogBackend.cs new file mode 100644 index 00000000000..52bd011dd41 --- /dev/null +++ b/reactos/tools/sysgen/SYSGen/Backends/Catalog/CatalogBackend.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SYSGen.Backends; + +namespace SYSGen.Backends.Catalog +{ + class CatalogBackend : Backend + { + } +} diff --git a/reactos/tools/sysgen/SYSGen/Backends/Mingw/MingwBackend.cs b/reactos/tools/sysgen/SYSGen/Backends/Mingw/MingwBackend.cs new file mode 100644 index 00000000000..73c2ae3a7bd --- /dev/null +++ b/reactos/tools/sysgen/SYSGen/Backends/Mingw/MingwBackend.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SYSGen.Backends; + +namespace SYSGen.Backends.Mingw +{ + class MingwBackend : Backend + { + } +} diff --git a/reactos/tools/sysgen/SYSGen/Program.cs b/reactos/tools/sysgen/SYSGen/Program.cs new file mode 100644 index 00000000000..c49fc075055 --- /dev/null +++ b/reactos/tools/sysgen/SYSGen/Program.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SYSGen +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/reactos/tools/sysgen/SYSGen/Properties/AssemblyInfo.cs b/reactos/tools/sysgen/SYSGen/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..04c75a90f62 --- /dev/null +++ b/reactos/tools/sysgen/SYSGen/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SYSGen")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sand")] +[assembly: AssemblyProduct("SYSGen")] +[assembly: AssemblyCopyright("Copyright © Sand 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("eb4b0be6-5b08-4933-b932-61bf335383db")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/reactos/tools/sysgen/SYSGen/SYSGen.csproj b/reactos/tools/sysgen/SYSGen/SYSGen.csproj new file mode 100644 index 00000000000..93452a30484 --- /dev/null +++ b/reactos/tools/sysgen/SYSGen/SYSGen.csproj @@ -0,0 +1,56 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {5AEA291F-D79C-4FC1-AA60-96C591658B85} + Exe + Properties + SYSGen + sysgen + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26} + RosFramework + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/BuildElementArrayAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/BuildElementArrayAttribute.cs new file mode 100644 index 00000000000..3e2e2155fe8 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/BuildElementArrayAttribute.cs @@ -0,0 +1,33 @@ +// NAnt - A .NET build tool +// Copyright (C) 2001 Gerry Shaw +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Ian MacLean ( ian@maclean.ms ) + +namespace SysGen.BuildEngine.Attributes +{ + using System; + using System.Reflection; + + /// Indicates that property should be treated as a xml arrayList for the task. + [AttributeUsage(AttributeTargets.Property, Inherited=true)] + public class BuildElementArrayAttribute : BuildElementAttribute { + + public BuildElementArrayAttribute(string name) : base(name) { + + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/BuildElementAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/BuildElementAttribute.cs new file mode 100644 index 00000000000..5b453a063f2 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/BuildElementAttribute.cs @@ -0,0 +1,50 @@ +// NAnt - A .NET build tool +// Copyright (C) 2001 Gerry Shaw +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Ian MacLean ( ian@maclean.ms ) + +namespace SysGen.BuildEngine.Attributes +{ + + using System; + using System.Reflection; + + /// Indicates that field should be treated as a xml file set for the task. + [AttributeUsage(AttributeTargets.Property, Inherited=true)] + public class BuildElementAttribute : Attribute + { + + string _name; + bool _required; + + public BuildElementAttribute(string name) + { + Name = name; + } + + public string Name + { + get { return _name; } + set { _name = value; } + } + public bool Required + { + get { return _required; } + set { _required = value; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/ElementNameAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/ElementNameAttribute.cs new file mode 100644 index 00000000000..a52f72ef520 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/ElementNameAttribute.cs @@ -0,0 +1,45 @@ +// NAnt - A .NET build tool +// Copyright (C) 2001 Gerry Shaw +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Ian MacLean (ian_maclean@another.com) + +namespace SysGen.BuildEngine.Attributes { + + using System; + using System.Reflection; + + /// Indicates that class should be treated as a NAnt element. + /// + /// Attach this attribute to a subclass of Element to have NAnt be able + /// to recognize it. The name should be short but must not confict + /// with any other element already in use. + /// + [AttributeUsage(AttributeTargets.Class, Inherited=false, AllowMultiple=false)] + public class ElementNameAttribute : Attribute { + + string _name; + + public ElementNameAttribute(string name) { + _name = name; + } + + public string Name { + get { return _name; } + set { _name = value; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/FunctionAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/FunctionAttribute.cs new file mode 100644 index 00000000000..506cab8a400 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/FunctionAttribute.cs @@ -0,0 +1,60 @@ +namespace SysGen.BuildEngine.Attributes +{ + using System; + using System.Reflection; + + /// + /// Indicates that the method should be exposed as a function in NAnt build + /// files. + /// + /// + /// Attach this attribute to a method of a class that derives from + /// to have NAnt be able to recognize it. + /// + [AttributeUsage(AttributeTargets.Method, Inherited=false, AllowMultiple=false)] + public sealed class FunctionAttribute : Attribute { + #region Public Instance Constructors + + /// + /// Initializes a new instance of the + /// class with the specified name. + /// + /// The name of the function. + /// is . + /// is a zero-length . + public FunctionAttribute(string name) { + if (name == null) { + throw new ArgumentNullException("name"); + } + + if (name.Trim().Length == 0) { + throw new ArgumentOutOfRangeException("name", name, "A zero-length string is not an allowed value."); + } + + _name = name; + } + + #endregion Public Instance Constructors + + #region Public Instance Properties + + /// + /// Gets or sets the name of the function. + /// + /// + /// The name of the function. + /// + public string Name { + get { return _name; } + set { _name = value; } + } + + #endregion Public Instance Properties + + #region Private Instance Fields + + private string _name; + + #endregion Private Instance Fields + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/FunctionSetAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/FunctionSetAttribute.cs new file mode 100644 index 00000000000..0ac033f07e0 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/FunctionSetAttribute.cs @@ -0,0 +1,90 @@ +namespace SysGen.BuildEngine.Attributes +{ + using System; + using System.Reflection; + + /// + /// Indicates that class should be treated as a set of functions. + /// + /// + /// Attach this attribute to a class that derives from + /// to have NAnt be able to recognize it as containing custom functions. + /// + [AttributeUsage(AttributeTargets.Class, Inherited=false, AllowMultiple=false)] + public sealed class FunctionSetAttribute : Attribute { + #region Public Instance Constructors + + /// + /// Initializes a new instance of the + /// class with the specified name. + /// + /// The prefix used to distinguish the functions. + /// The category of the functions. + /// + /// is . + /// -or- + /// is . + /// + /// + /// is a zero-length . + /// -or- + /// is a zero-length . + /// + public FunctionSetAttribute(string prefix, string category) { + if (prefix == null) { + throw new ArgumentNullException("prefix"); + } + if (category == null) { + throw new ArgumentNullException("category"); + } + + if (prefix.Trim().Length == 0) { + throw new ArgumentOutOfRangeException("prefix", prefix, "A zero-length string is not an allowed value."); + } + if (category.Trim().Length == 0) { + throw new ArgumentOutOfRangeException("category", category, "A zero-length string is not an allowed value."); + } + + _prefix = prefix; + _category = category; + } + + #endregion Public Instance Constructors + + #region Public Instance Properties + + /// + /// Gets or sets the category of the function set. + /// + /// + /// The name of the category of the function set. + /// + /// + /// This will be displayed in the user docs. + /// + public string Category { + get { return _category; } + set { _category = value; } + } + + /// + /// Gets or sets the prefix of all functions in this function set. + /// + /// + /// The prefix of the functions in this function set. + /// + public string Prefix { + get { return _prefix; } + set { _prefix = value; } + } + + #endregion Public Instance Properties + + #region Private Instance Fields + + private string _prefix; + private string _category; + + #endregion Private Instance Fields + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskAttributeAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskAttributeAttribute.cs new file mode 100644 index 00000000000..3242801bf09 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskAttributeAttribute.cs @@ -0,0 +1,43 @@ +namespace SysGen.BuildEngine.Attributes +{ + using System; + using System.Reflection; + + /// Indicates that field should be treated as a xml attribute for the task. + /// + /// Examples of how to specify task attributes + /// + /// // task XmlType default is string + /// [TaskAttribute("out", Required=true)] + /// string _out = null; // assign default value here + /// + /// [TaskAttribute("optimize")] + /// [BooleanValidator()] + /// // during ExecuteTask you can safely use Convert.ToBoolean(_optimize) + /// string _optimize = Boolean.FalseString; + /// + /// [TaskAttribute("warnlevel")] + /// [Int32Validator(0,4)] // limit values to 0-4 + /// // during ExecuteTask you can safely use Convert.ToInt32(_optimize) + /// string _warnlevel = "0"; + /// + /// [FileSet("sources")] + /// FileSet _sources = new FileSet(); + /// + /// NOTE: Attribute values must be of type of string if you want + /// to be able to have macros. The field stores the exact value during + /// InitializeTask. Just before ExecuteTask is called NAnt will expand + /// all the macros with the current values. + /// + [AttributeUsage( AttributeTargets.Property, Inherited=true)] + public class TaskAttributeAttribute : TaskPropertyAttribute { + + public TaskAttributeAttribute(string name) : base(name){ + } + + public override TaskPropertyLocation Location + { + get { return TaskPropertyLocation.Attribute; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskFileSetAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskFileSetAttribute.cs new file mode 100644 index 00000000000..fd9ad0cad05 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskFileSetAttribute.cs @@ -0,0 +1,33 @@ +// NAnt - A .NET build tool +// Copyright (C) 2001 Gerry Shaw +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Gerry Shaw (gerry_shaw@yahoo.com) +// Ian MacLean ( ian@maclean.ms ) + +namespace SysGen.BuildEngine.Attributes { + + using System; + using System.Reflection; + + /// Indicates that field should be treated as a xml file set for the task. + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited=true)] + public class FileSetAttribute : BuildElementAttribute { + + public FileSetAttribute(string name) : base(name) { + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskNameAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskNameAttribute.cs new file mode 100644 index 00000000000..d46357f6892 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskNameAttribute.cs @@ -0,0 +1,46 @@ +namespace SysGen.BuildEngine.Attributes +{ + using System; + using System.Reflection; + + /// Indicates that class should be treated as a task. + /// + /// Attach this attribute to a subclass of Task to have NAnt be able + /// to recognize it. The name should be short but must not confict + /// with any other task already in use. + /// + [AttributeUsage(AttributeTargets.Class, Inherited=false, AllowMultiple=false)] + public class TaskNameAttribute : Attribute + { + private string m_Namespace = null; + private string m_Name = null; + + public TaskNameAttribute(string name) + { + m_Name = name; + } + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string Namespace + { + get { return m_Namespace; } + set { m_Namespace = value; } + } + + public string FullTaskName + { + get + { + if (Namespace != null) + return string.Format("{0}:{1}", Namespace, Name); + + return Name; + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskOptionSetAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskOptionSetAttribute.cs new file mode 100644 index 00000000000..c62c48f3312 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskOptionSetAttribute.cs @@ -0,0 +1,32 @@ +// NAnt - A .NET build tool +// Copyright (C) 2001 Gerry Shaw +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Tomas Restrepo (tomasr@mvps.org) + +namespace SysGen.BuildEngine.Attributes { + + using System; + using System.Reflection; + + /// Indicates that field should be treated as a xml option set for the task. + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited=true)] + public class OptionSetAttribute : BuildElementAttribute { + + public OptionSetAttribute(string name) : base(name) { + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskPropertyAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskPropertyAttribute.cs new file mode 100644 index 00000000000..6ee83ec2058 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskPropertyAttribute.cs @@ -0,0 +1,66 @@ +using System; +using System.Reflection; + +namespace SysGen.BuildEngine.Attributes +{ + public enum TaskPropertyLocation + { + Attribute, + Node + } + + /// Indicates that field should be treated as a xml attribute for the task. + /// + /// Examples of how to specify task attributes + /// + /// // task XmlType default is string + /// [BuildAttribute("out", Required=true)] + /// string _out = null; // assign default value here + /// + /// [BuildAttribute("optimize")] + /// [BooleanValidator()] + /// // during ExecuteTask you can safely use Convert.ToBoolean(_optimize) + /// string _optimize = Boolean.FalseString; + /// + /// [BuildAttribute("warnlevel")] + /// [Int32Validator(0,4)] // limit values to 0-4 + /// // during ExecuteTask you can safely use Convert.ToInt32(_optimize) + /// string _warnlevel = "0"; + /// + /// [FileSet("sources")] + /// FileSet _sources = new FileSet(); + /// + /// NOTE: Attribute values must be of type of string if you want + /// to be able to have macros. The field stores the exact value during + /// InitializeTask. Just before ExecuteTask is called NAnt will expand + /// all the macros with the current values. + /// + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field , Inherited=true)] + public abstract class TaskPropertyAttribute : Attribute + { + string _name; + bool _required = false; + bool _expandProperties = true; + + public TaskPropertyAttribute(string name) { + _name = name; + } + + public string Name { + get { return _name; } + set { _name = value; } + } + + public bool Required { + get { return _required; } + set { _required = value; } + } + + public bool ExpandProperties { + get { return _expandProperties; } + set { _expandProperties = value; } + } + + public abstract TaskPropertyLocation Location { get; } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskValueAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskValueAttribute.cs new file mode 100644 index 00000000000..9a00b764e17 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/TaskValueAttribute.cs @@ -0,0 +1,19 @@ +using System; +using System.Reflection; + +namespace SysGen.BuildEngine.Attributes +{ + [AttributeUsage(AttributeTargets.Property, Inherited = true)] + public class TaskValueAttribute : TaskPropertyAttribute + { + public TaskValueAttribute() + : base(null) + { + } + + public override TaskPropertyLocation Location + { + get { return TaskPropertyLocation.Node; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/Base/ValidatorAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/Base/ValidatorAttribute.cs new file mode 100644 index 00000000000..21592caa508 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/Base/ValidatorAttribute.cs @@ -0,0 +1,16 @@ +namespace SysGen.BuildEngine.Attributes +{ + using System; + using System.Reflection; + + public abstract class ValidatorAttribute : Attribute + { + /// + /// Validates the object. + /// + /// The object to be validated + /// Throws a ValidationException when validation fails. + /// Returns an indication of the result. + public abstract bool Validate(object value); + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/BooleanValidatorAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/BooleanValidatorAttribute.cs new file mode 100644 index 00000000000..a77c4044db3 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/BooleanValidatorAttribute.cs @@ -0,0 +1,21 @@ +namespace SysGen.BuildEngine.Attributes +{ + using System; + using System.Reflection; + + /// + /// Indicates that field should be able to be converted into a Boolean. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property , Inherited=true)] + public class BooleanValidatorAttribute : ValidatorAttribute + { + public BooleanValidatorAttribute() + { + } + + public override bool Validate(object value) + { + return SysGenConversion.ToBolean(value); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/Int32ValidatorAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/Int32ValidatorAttribute.cs new file mode 100644 index 00000000000..0336016ff3d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/Int32ValidatorAttribute.cs @@ -0,0 +1,54 @@ +using System; +using System.Reflection; + +namespace SysGen.BuildEngine.Attributes +{ + /// + /// Indicates that field should be able to be converted into a Int32 within the given range. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = true)] + public class Int32ValidatorAttribute : ValidatorAttribute + { + int _minValue = Int32.MinValue; + int _maxValue = Int32.MaxValue; + + public Int32ValidatorAttribute() + { + } + + public Int32ValidatorAttribute(int minValue, int maxValue) + { + MinValue = minValue; + MaxValue = maxValue; + } + + public int MinValue + { + get { return _minValue; } + set { _minValue = value; } + } + + public int MaxValue + { + get { return _maxValue; } + set { _maxValue = value; } + } + + public override bool Validate(object value) + { + try + { + Int32 intValue = Convert.ToInt32(value); + if (intValue < MinValue || intValue > MaxValue) + { + throw new ValidationException(String.Format("Cannot resolve '{0}' to integer between '{1}' and '{2}'.", value.ToString(), MinValue, MaxValue)); + } + } + catch (Exception) + { + throw new ValidationException(String.Format("Cannot resolve '{0}' to integer value.", value.ToString())); + } + return true; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/StringValidatorAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/StringValidatorAttribute.cs new file mode 100644 index 00000000000..be617dee875 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/StringValidatorAttribute.cs @@ -0,0 +1,35 @@ +using System; +using System.Reflection; + +namespace SysGen.BuildEngine.Attributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = true)] + public class StringValidatorAttribute : ValidatorAttribute + { + private bool m_AllowEmpty = true; + private bool m_AllowSpaces = true; + + public override bool Validate(object value) + { + if (!AllowSpaces && string.Equals(value, " ")) + throw new ValidationException("No spaces allowed"); + + if (!AllowEmpty && value.ToString().Length == 0) + throw new ValidationException("No empty string allowed"); + + return true; + } + + public bool AllowEmpty + { + get { return m_AllowEmpty; } + set { m_AllowEmpty = value; } + } + + public bool AllowSpaces + { + get { return m_AllowSpaces; } + set { m_AllowSpaces = value; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/UriValidatorAttribute.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/UriValidatorAttribute.cs new file mode 100644 index 00000000000..54da6e52690 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Attributes/Validators/UriValidatorAttribute.cs @@ -0,0 +1,26 @@ +using System; +using System.Reflection; + +namespace SysGen.BuildEngine.Attributes +{ + /// + /// Indicates that field should be able to be converted into a Uri. + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = true)] + public class UriValidatorAttribute : ValidatorAttribute + { + public override bool Validate(object value) + { + try + { + Uri uriValue = new Uri(value.ToString(), UriKind.Relative); + } + catch (Exception) + { + throw new ValidationException(String.Format("Cannot resolve '{0}' to Uri.", value.ToString())); + } + + return true; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/APIDocumentation/APIDocumentation.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/APIDocumentation/APIDocumentation.cs new file mode 100644 index 00000000000..330f3d65ef6 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/APIDocumentation/APIDocumentation.cs @@ -0,0 +1,395 @@ +using System; +using System.Text.RegularExpressions; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; +using SysGen.BuildEngine.Backends; + +namespace SysGen.BuildEngine.Backends +{ + public class APIDocumentation : HtmlDocumenterBaseBacked + { + public APIDocumentation(SysGenEngine sysgen) + : base(sysgen) + { + if (Directory.Exists(@"C:\rosLib")) + Directory.Delete(@"C:\rosLib", true); + + Directory.CreateDirectory(@"C:\rosLib"); + + File.Copy(@"c:\style.css", @"c:\rosLib\style.css"); + } + + protected override string FriendlyName + { + get { return "APIDocumentation Report"; } + } + + private void WriteModuleFunctions() + { + foreach (RBuildModule module in Project.Modules) + { + if (module.IsDLL || module.IsLibrary) + { + foreach (RBuildAPIInfo apiInfo in module.ApiInfo) + { + using (StreamWriter sw = new StreamWriter(@"C:\roslib\" + apiInfo.HtmlDocFileName)) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Module"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("{0} Function", apiInfo.Name); + writer.RenderEndTag(); + + if (apiInfo.Implemented) + { + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Function '{0}' on '{1}' is currently implemented.", + apiInfo.Name, + apiInfo.File); + writer.RenderEndTag(); + } + else + { + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Function '{0}' on '{1}' is currently un-implemented.", + apiInfo.Name, + apiInfo.File); + writer.RenderEndTag(); + } + } + } + } + } + } + } + + private void WriteModules() + { + foreach (RBuildModule module in Project.Modules) + { + if (module.IsDLL || module.IsLibrary) + { + using (StreamWriter sw = new StreamWriter(@"C:\roslib\" + module.HtmlDocFileName)) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Module"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("{0}", module.Name); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Module {0} has a total of {1} functions , {2} implemented and {3} un-implemented ({4}%)", + module.Name, + module.ApiInfo.TotalFunctions, + module.ApiInfo.ImplementedFunctionsCount, + module.ApiInfo.UnImplementedFunctionsCount, + module.ApiInfo.Percentage); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("{0} Functions", module.Name); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildAPIInfo apiInfo in module.ApiInfo) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute("href", apiInfo.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(apiInfo.Name); + writer.RenderEndTag(); + + if (!apiInfo.Implemented) + { + writer.RenderBeginTag(HtmlTextWriterTag.B); + writer.Write("(UnImplemented)"); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + } + } + + private void WriteWelcome() + { + using (StreamWriter sw = new StreamWriter(@"C:\roslib\welcome.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Warnings"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("ReactOS API Documentation"); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Welcome to the ReactOS API documentation website."); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.H1); + writer.Write("Implementation status Color Key"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "5"); + writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + for (int i = 0; i <= 100; i = i + 5) + { + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct" + i); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write("{0}%" , i); + writer.RenderEndTag(); + } + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Native DLLs"); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Modules) + { + if (module.Type == ModuleType.NativeDLL) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute("href", module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Win32 DLLs"); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Modules) + { + if (module.Type == ModuleType.Win32DLL) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute("href", module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void WriteHeader() + { + using (StreamWriter sw = new StreamWriter(@"C:\roslib\header.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + writer.WriteLine("

ReactOS API Documentation

"); + } + } + } + + private void WriteFrameSet() + { + using (StreamWriter sw = new StreamWriter(@"C:\roslib\default.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + writer.WriteLine(""); + writer.WriteLine(""); + writer.WriteLine(""); + writer.WriteLine(""); + writer.WriteLine(""); + writer.WriteLine(""); + writer.WriteLine(""); + } + } + } + + private void ReadApiStatusFile() + { + XmlDocument doc = new XmlDocument(); + + //Load the file in to memory + doc.Load(@"C:\Ros\clean\reactos\apistatus.xml"); + + foreach (XmlNode comp in doc.SelectNodes("/components/component")) + { + // Get the component name.... + string modulename = comp.Attributes["name"].InnerText; + + RBuildModule module = Project.Modules.GetByName(modulename); + + if (module != null) + { + foreach (XmlNode dep in comp.SelectNodes("functions/f")) + { + // Gets the dependency name + string name = dep.Attributes["n"].InnerText; + string file = dep.Attributes["f"].InnerText; + bool imp = Boolean.Parse(dep.Attributes["i"].InnerText); + + RBuildAPIInfo apiInfo = new RBuildAPIInfo(); + + apiInfo.Name = name; + apiInfo.File = file; + apiInfo.Implemented = imp; + + module.ApiInfo.Add(apiInfo); + } + } + } + } + + protected override void Generate() + { + ReadApiStatusFile(); + WriteFrameSet(); + WriteHeader(); + WriteWelcome(); + WriteModules(); + WriteModuleFunctions(); + + using (StreamWriter sw = new StreamWriter(@"C:\roslib\tree.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Warnings"); + + writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "2"); + writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "2"); + writer.AddAttribute(HtmlTextWriterAttribute.Border, "0"); + //writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + foreach (RBuildModule module in Project.Modules) + { + if ((module.IsDLL) || (module.IsLibrary)) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + + if ((module.ApiInfo.Percentage >= 0) && (module.ApiInfo.Percentage <= 5)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct0"); + if ((module.ApiInfo.Percentage >= 5) && (module.ApiInfo.Percentage <= 10)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct5"); + if ((module.ApiInfo.Percentage >= 10) && (module.ApiInfo.Percentage <= 15)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct10"); + if ((module.ApiInfo.Percentage >= 15) && (module.ApiInfo.Percentage <= 20)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct15"); + if ((module.ApiInfo.Percentage >= 20) && (module.ApiInfo.Percentage <= 25)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct20"); + if ((module.ApiInfo.Percentage >= 25) && (module.ApiInfo.Percentage <= 30)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct25"); + if ((module.ApiInfo.Percentage >= 30) && (module.ApiInfo.Percentage <= 35)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct30"); + if ((module.ApiInfo.Percentage >= 35) && (module.ApiInfo.Percentage <= 40)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct35"); + if ((module.ApiInfo.Percentage >= 40) && (module.ApiInfo.Percentage <= 45)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct40"); + if ((module.ApiInfo.Percentage >= 45) && (module.ApiInfo.Percentage <= 50)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct45"); + if ((module.ApiInfo.Percentage >= 50) && (module.ApiInfo.Percentage <= 55)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct50"); + if ((module.ApiInfo.Percentage >= 55) && (module.ApiInfo.Percentage <= 60)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct55"); + if ((module.ApiInfo.Percentage >= 60) && (module.ApiInfo.Percentage <= 65)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct60"); + if ((module.ApiInfo.Percentage >= 65) && (module.ApiInfo.Percentage <= 70)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct65"); + if ((module.ApiInfo.Percentage >= 70) && (module.ApiInfo.Percentage <= 75)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct70"); + if ((module.ApiInfo.Percentage >= 75) && (module.ApiInfo.Percentage <= 80)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct75"); + if ((module.ApiInfo.Percentage >= 80) && (module.ApiInfo.Percentage <= 85)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct80"); + if ((module.ApiInfo.Percentage >= 85) && (module.ApiInfo.Percentage <= 90)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct85"); + if ((module.ApiInfo.Percentage >= 90) && (module.ApiInfo.Percentage <= 95)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct90"); + if ((module.ApiInfo.Percentage >= 95) && (module.ApiInfo.Percentage <= 100)) + writer.AddAttribute(HtmlTextWriterAttribute.Class, "pct100"); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + + if (module.ApiInfo.Count > 0) + { + writer.AddAttribute("href", module.HtmlDocFileName); + writer.AddAttribute("target", "content"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + + writer.Write(" (I:{0} U:{1} P:{2}%)", + module.ApiInfo.ImplementedFunctionsCount, + module.ApiInfo.UnImplementedFunctionsCount, + module.ApiInfo.Percentage); + } + else + { + writer.Write(module.Name); + } + + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + if (module.ApiInfo.Count > 0) + { + foreach (RBuildAPIInfo apiInfo in module.ApiInfo) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute("href", apiInfo.HtmlDocFileName); + writer.AddAttribute("target", "content"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(apiInfo.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + else + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write("No documentation available yet"); + writer.RenderEndTag(); + } + writer.RenderEndTag(); + + + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/Backend.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/Backend.cs new file mode 100644 index 00000000000..5811c6fc253 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/Backend.cs @@ -0,0 +1,81 @@ +using System; +using System.Reflection; +using System.Diagnostics; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Log; + +namespace SysGen.BuildEngine.Backends +{ + public abstract class Backend + { + private SysGenEngine m_SysGenEngine = null; + + public Backend(SysGenEngine sysgen) + { + m_SysGenEngine = sysgen; + } + + public SysGenEngine SysGen + { + get { return m_SysGenEngine; } + } + + public RBuildProject Project + { + get { return m_SysGenEngine.Project; } + } + + public string AppInfo + { + get { return string.Format("{0} {1}", AppName, AppVersion); } + } + + public string AppName + { + get { return "SysGen"; } + } + + public string AppVersion + { + get + { + FileVersionInfo info = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location); + + return string.Format("{0}.{1}.{2}", + info.FileMajorPart, + info.FileMinorPart, + info.FileBuildPart); + } + } + + protected abstract string FriendlyName { get;} + //protected abstract string Name { get;} + + public void Run() + { + BuildLog.WriteLine(); + BuildLog.Write("[Backend] {0} running ...", FriendlyName); + + try + { + //Run current Backend + Generate(); + + //Report OK + BuildLog.Write("{0,30}", "[OK]"); + } + catch (Exception e) + { + //Report OK + BuildLog.Write("{0,30}", "[FAIL]"); + throw; + } + } + + protected abstract void Generate(); + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/CompilerBaseBacked.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/CompilerBaseBacked.cs new file mode 100644 index 00000000000..9c1d05417e9 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/CompilerBaseBacked.cs @@ -0,0 +1,160 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.BuildEngine.Framework; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public abstract class CompilerBaseBacked : Backend + { + public CompilerBaseBacked(SysGenEngine sysgen) + : base(sysgen) + { + //Initialize(); + } + + protected override void Generate() + { + CheckCompiler(); + GenerateRosCfg(); + GenerateFolders(); + //GenerateBuildNumber(); + //GenerateCompilationUnits(); + GenerateTxtSetupCustomHive(); + GenerateSysSetup(); + GenerateTxtSetup(); + GenerateDffSetup(); + } + + protected virtual void GenerateCompilationUnits() + { + foreach (RBuildModule module in SysGen.Project.Modules) + { + foreach (RBuildCompilationUnitFile unit in module.CompilationUnits) + { + using (CompilationUnitFileWriter writer = new CompilationUnitFileWriter(module , unit , SysGen.ResolveRBuildFilePath(unit))) + { + writer.WriteFile(); + } + } + } + } + + protected virtual void GenerateRosCfg() + { + Directory.CreateDirectory (Project.Path + "\\obj-i386\\include\\reactos"); + + using (HeaderRosCfgFileWriter writer = new HeaderRosCfgFileWriter(SysGen.Project, Project.Path + "\\obj-i386\\include\\reactos\\roscfg.h")) + { + writer.WriteFile(); + } + } + + protected virtual void GenerateDffSetup() + { + using (DffFileWriter writer = new DffFileWriter(Project, Project.Path + "\\obj-i386\\reactos.dff")) + { + writer.WriteFile(); + } + } + + protected virtual void GenerateBuildNumber() + { + using (DffFileWriter writer = new DffFileWriter(SysGen.Project, "c:\\buildno.h")) + { + writer.WriteFile(); + } + } + + protected virtual void GenerateTxtSetup() + { + using (TxtSetupFileWriter writer = new TxtSetupFileWriter(SysGen.Project, "c:\\txtsetup.sif")) + { + writer.WriteFile(); + } + } + + protected virtual void GenerateTxtSetupCustomHive() + { + //using (DesktopComponentSetupFileWriter writer = new DesktopComponentSetupFileWriter(SysGen.Project, Project.Path + "\\output-i386\\wallpaper.inf")) + //{ + // writer.WriteFile(); + + // RBuildSetup s = new RBuildSetup(); + + // s.InstallBase = "inf"; + // s.Name = "wallpaper.inf"; + // s.Root = PathRoot.Output; + + // Project.Files.Add(s); + //} + + //using (ShellComponentSetupFileWriter writer = new ShellComponentSetupFileWriter(SysGen.Project, Project.Path + "\\output-i386\\shell.inf")) + //{ + // writer.WriteFile(); + + // RBuildSetup s1 = new RBuildSetup(); + + // s1.InstallBase = "inf"; + // s1.Name = "shell.inf"; + // s1.Root = PathRoot.Output; + + // Project.Files.Add(s1); + //} + + using (TxtSetupHiveFileWriter writer = new TxtSetupHiveFileWriter(SysGen.Project, Project.Path + "\\output-i386\\hivecst.inf")) + { + writer.WriteFile(); + } + + RBuildBootstrapFile bs = new RBuildBootstrapFile(); + + bs.InstallBase = "reactos"; + bs.Name = "hivecst.inf"; + bs.Root = PathRoot.Output; + + Project.Files.Add(bs); + } + + protected virtual void GenerateSysSetup() + { + Directory.CreateDirectory(Project.Path + "\\output-i386\\media\\inf"); + + using (SysSetupFileWriter writer = new SysSetupFileWriter(SysGen.Project, Project.Path + "\\output-i386\\media\\inf\\syssetup.inf")) + { + writer.WriteFile(); + } + } + + private void GenerateFolders() + { + //foreach (RBuildModule module in Project.Modules) + //{ + // foreach (RBuildFolder folder in module.Folders) + // { + // if (folders.Contains(folder) == false) + // folders.Add(folder); + // } + //} + + //foreach (RBuildFolder folder in Project.Folders) + //{ + // if (folders.Contains(folder) == false) + // folders.Add(folder); + //} + + //foreach (RBuildFolder folder in folders) + //{ + // GenerateFolder(makefile, folder); + //} + } + + protected virtual void CheckCompiler() + { + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/HtmlDocumenterBaseBacked.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/HtmlDocumenterBaseBacked.cs new file mode 100644 index 00000000000..aac5117de0d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Base/HtmlDocumenterBaseBacked.cs @@ -0,0 +1,97 @@ +using System; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.BuildEngine; +using SysGen.BuildEngine.Framework; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public abstract class HtmlDocumenterBaseBacked : Backend + { + public HtmlDocumenterBaseBacked(SysGenEngine sysgen) + : base(sysgen) + { + } + + public string ReportFileExtension + { + get { return "htm"; } + } + + protected string GetHtmlFileName(IRBuildNamed namedObject) + { + return string.Format("{0}.{1}", + namedObject.Name, + ReportFileExtension); + } + + protected void WriteDocumentStart(HtmlTextWriter writer, string title) + { + writer.RenderBeginTag(HtmlTextWriterTag.Html);// + writer.RenderBeginTag(HtmlTextWriterTag.Head);// + writer.RenderBeginTag(HtmlTextWriterTag.Title); // + writer.Write(title); + writer.RenderEndTag(); // + writer.AddAttribute(HtmlTextWriterAttribute.Rel, "stylesheet"); + writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css"); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "style.css"); + writer.RenderBeginTag(HtmlTextWriterTag.Link); + writer.RenderEndTag(); + + writer.RenderEndTag(); // + writer.RenderBeginTag(HtmlTextWriterTag.Body);// + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "header"); + writer.RenderBeginTag(HtmlTextWriterTag.Div); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "default.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("ReactOS RBuild Documentation"); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.P); + + if (!Project.Properties["ARCH"].IsEmpty) + { + if (!Project.Properties["SARCH"].IsEmpty) + { + writer.Write("RBuild Documentation for the '{0}' architecture, sub-architecture '{1}'. Project used '{2}'", + Project.Properties["ARCH"].Value, + Project.Properties["SARCH"].Value, + Project.RBuildFile); + } + else + { + writer.Write("RBuild Documentation for the '{0}' architecture. Project used '{1}'", + Project.Properties["ARCH"].Value, + Project.RBuildFile); + } + } + + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + protected void WriteDocumentEnd(HtmlTextWriter writer) + { + writer.WriteBreak(); + writer.AddAttribute(HtmlTextWriterAttribute.Class, "footer"); + writer.RenderBeginTag(HtmlTextWriterTag.Div); + WriteDocumentLastUpdate(writer); + writer.RenderEndTag(); + + writer.RenderEndTag(); // + writer.RenderEndTag(); // + } + + protected void WriteDocumentLastUpdate(HtmlTextWriter writer) + { + //writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Document last updated on {0}", DateTime.Now); + //writer.RenderEndTag(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/BaseAddress/BaseAddressReportBackend.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/BaseAddress/BaseAddressReportBackend.cs new file mode 100644 index 00000000000..df0cf9ebc2d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/BaseAddress/BaseAddressReportBackend.cs @@ -0,0 +1,127 @@ +using System; +using System.Globalization; +using System.Text.RegularExpressions; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; +using SysGen.BuildEngine.Backends; + +namespace SysGen.BuildEngine.Backends +{ + public class BaseAddressReportBackend : Backend + { + private List m_Modules = new List (); + + public class BaseAddressModule + { + private FileInfo m_FileInfo = null; + private RBuildModule m_Module = null; + + public BaseAddressModule(RBuildModule module , string file) + { + m_Module = module; + m_FileInfo = new FileInfo(file); + } + + public string Name + { + get { return m_Module.Name; } + } + + public string BaseAddress + { + get { return m_Module.BaseAddress; } + } + + public long Size + { + get { return m_FileInfo.Length; } + } + + public string HexBaseAddressStart + { + get { return m_Module.BaseAddress.Replace("0x", string.Empty); } + } + + public long BaseAddressStart + { + get { return Int64.Parse(HexBaseAddressStart, NumberStyles.AllowHexSpecifier); } + } + + public long BaseAddressEnd + { + get { return m_FileInfo.Length + BaseAddressStart; } + } + } + + public BaseAddressReportBackend(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "Base Address Report"; } + } + + protected override void Generate() + { + foreach (RBuildModule module in Project.Modules) + { + if (module.Type == ModuleType.Win32DLL || + module.Type == ModuleType.Win32OCX) + { + if (module.BaseAddress != module.DefaultBaseAdress) + { + BaseAddressModule baseAddressModule = new BaseAddressModule(module , SysGen.ResolveRBuildFilePath (module.TargetFile)); + + Console.WriteLine(baseAddressModule.Name); + + Console.WriteLine(" {0} {1}", + baseAddressModule.BaseAddressStart, + baseAddressModule.BaseAddressEnd); + + m_Modules.Add (baseAddressModule); + } + } + + + } + + using (StreamWriter sw = new StreamWriter(Directory.GetCurrentDirectory() + "\\overlapping.txt")) + { + foreach (BaseAddressModule module in m_Modules) + { + foreach (BaseAddressModule testModule in m_Modules) + { + if (module.Name != testModule.Name) + { + if ((testModule.BaseAddressStart >= module.BaseAddressStart && testModule.BaseAddressStart <= module.BaseAddressEnd) || + (testModule.BaseAddressEnd >= module.BaseAddressStart && testModule.BaseAddressEnd <= module.BaseAddressEnd) || + (testModule.BaseAddressStart <= module.BaseAddressStart && testModule.BaseAddressEnd >= module.BaseAddressEnd)) + { + sw.WriteLine("- Module '{0}' [size '{1} and base address '{2}' [start:{3} end:{4}] is provably being overlapped by module '{5}' [size '{6} and base address '{7}' [start:{3} end:{8}]", + module.Name, + module.Size, + module.BaseAddress, + module.BaseAddressStart, + module.BaseAddressEnd, + testModule.Name, + testModule.Size, + testModule.BaseAddress, + testModule.BaseAddressStart, + testModule.BaseAddressEnd); + } + } + } + } + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/BuildLogReport/BuildLogReport.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/BuildLogReport/BuildLogReport.cs new file mode 100644 index 00000000000..af1fb660479 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/BuildLogReport/BuildLogReport.cs @@ -0,0 +1,109 @@ +using System; +using System.Text.RegularExpressions; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.BuildEngine.Backends; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public class BuildLogReportEntry + { + public string File; + public string Message; + public string Position; + public string Type; + } + + public class BuildLogReport : Backend + { + private List m_Errors = new List(); + + public BuildLogReport(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "Build Log analizer"; } + } + + private List Errors + { + get { return m_Errors; } + } + + protected override void Generate() + { + using (StreamReader sr = new StreamReader(@"C:\Ros\Trunk\reactos\RosBE-Logs\BuildLog-4.1.3-20070210-0630.txt")) + { + Regex regex = new Regex(@"(.*?):(.*?): (.*?): (.*?)$", + RegexOptions.IgnoreCase | + RegexOptions.Multiline | + RegexOptions.Compiled); + + MatchCollection matches = regex.Matches(sr.ReadToEnd()); + foreach (Match match in matches) + { + BuildLogReportEntry error = new BuildLogReportEntry(); + + error.File = match.Groups[1].ToString(); + error.Position = match.Groups[2].ToString(); + error.Type = match.Groups[3].ToString(); + error.Message = match.Groups[4].ToString(); + + Errors.Add(error); + } + } + + using (StreamWriter sw = new StreamWriter(@"C:\rosbuildwarnings.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + writer.WriteLine("{0} Warnings" , Errors.Count); + + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("File"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Line/Column"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Error"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (BuildLogReportEntry report in m_Errors) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(report.File); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(report.Position); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(report.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(report.Message); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Catalog/CatalogBackend.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Catalog/CatalogBackend.cs new file mode 100644 index 00000000000..9e2a499d2b0 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Catalog/CatalogBackend.cs @@ -0,0 +1,69 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.BuildEngine.Backends; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public class CatalogBackend : Backend + { + public CatalogBackend(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "Component catalog"; } + } + + private string CatalogFile + { + get { return Path.Combine(SysGen.BaseDirectory, "catalog.xml"); } + } + + protected override void Generate() + { + // Creates an XML file is not exist + using (XmlTextWriter writer = new XmlTextWriter(CatalogFile, Encoding.ASCII)) + { + writer.Indentation = 4; + writer.Formatting = Formatting.Indented; + + // Starts a new document + writer.WriteStartDocument(); + writer.WriteComment("File autogenerated by " + AppInfo); + writer.WriteStartElement("modules"); + + foreach (RBuildModule module in Project.Modules) + { + writer.WriteStartElement("module"); + writer.WriteAttributeString("name", module.Name); + writer.WriteAttributeString("type", module.Type.ToString()); + writer.WriteAttributeString("base", module.Base); + writer.WriteAttributeString("path", module.Path); + writer.WriteAttributeString("desc", module.Description); + + writer.WriteStartElement("dependencies"); + foreach (RBuildModule library in module.Libraries) + { + writer.WriteStartElement("dependency"); + writer.WriteAttributeString("name", library.Name); + writer.WriteEndElement(); + } + writer.WriteEndElement(); + + writer.WriteEndElement(); + } + + writer.WriteEndElement(); + writer.WriteEndDocument(); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Html/HtmlBackend.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Html/HtmlBackend.cs new file mode 100644 index 00000000000..02f40a102f9 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Html/HtmlBackend.cs @@ -0,0 +1,2743 @@ +using System; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using System.Drawing; + +using SysGen.BuildEngine.Backends; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public class HtmlBackend : HtmlDocumenterBaseBacked + { + public HtmlBackend(SysGenEngine sysgen) + : base(sysgen) + { + try + { + if (Directory.Exists(@"C:\rosDoc")) + Directory.Delete(@"C:\rosDoc", true); + + Directory.CreateDirectory(@"C:\rosDoc"); + + File.Copy(@"c:\style.css", @"c:\rosDoc\style.css"); + } + catch (Exception) + { + } + } + + protected override string FriendlyName + { + get { return "HTML Report"; } + } + + private void GenerateFrontPage() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\default.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "RBuild Auto Documentation"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Modules"); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "platform.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Platform"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Quick platform overview."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "modules.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Modules"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("ReactOS is a modular operating system, made of components that collaborate with each other."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "baseaddresses.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Base Addresses"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Memory address serving as a reference point for other addresses."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "dllbaseaddresses.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("DLL Base Addresses"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Base addresses used in ReactOS dlls."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "properties.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Properties"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Properties used during the build process."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "defines.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Project Defines"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Global defines."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "depmap.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Dependency map"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Graphically represents interdependencies between modules."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "files.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Files"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Files included for current platform."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "installfolders.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Install Folders"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Install folders created during ReactOS setup."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "installfiles.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Install Files"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Install files created during ReactOS setup."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "authors.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Authors"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Individuals who have contributed time and energy to supporting the ReactOS Project."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "unicodemodules.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Unicode"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Modules supporting UNICODE builds"); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "localizations.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Localizations"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Languages and cultures currently supported by ReactOS"); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "codestats.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Stats"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Basic ReactOS code base statistics"); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "warnings.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("RBuild Warnings"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Warnings and inconsistencies detected by rbuild."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "buildsummary.htm"); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("Build Summary"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write("Options and build settings per module."); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateDependencyMap() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\depmap.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Module Dependency Map"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Module Dependency Map"); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.B); + writer.Write("Direct Dependencies :"); + writer.RenderEndTag(); + writer.Write("Dependencies and libraries this module is using"); + + writer.RenderBeginTag(HtmlTextWriterTag.Br); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.B); + writer.Write("Full Dependencies :"); + writer.RenderEndTag(); + writer.Write("Dependencies and libraries this module and it's dependencies are using"); + + SysGenDependencyTracker dependencyTracker = null; + + foreach (RBuildModule module in Project.Platform.Modules) + { + dependencyTracker = new SysGenDependencyTracker(Project, module); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("{0}", module.Name); + writer.RenderEndTag(); + + writer.AddAttribute("name", module.Name); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Blockquote); + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Direct Dependencies"); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule dependency in module.Needs) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "#" + dependency.Name); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("{0} - ({1} Dependencies , {2} Libraries , {3} Requeriments)", + dependency.Name, + dependency.Dependencies.Count, + dependency.Libraries.Count, + dependency.Requeriments.Count); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Full Dependencies"); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule dependency in dependencyTracker.DependsOn) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, "#" + dependency.Name); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write("{0} - ({1} Dependencies , {2} Libraries , {3} Requeriments)", + dependency.Name, + dependency.Dependencies.Count, + dependency.Libraries.Count, + dependency.Requeriments.Count); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + } + } + + private void GenerateModulesBuildSummary() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\buildsummary.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Modules"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Modules"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Module"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Libraries"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Dependencies"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("CFLAGS"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("LFLAGS"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + + foreach (RBuildModule library in module.Libraries) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, library.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(library.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + + foreach (RBuildModule dependency in module.Dependencies) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, dependency.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(dependency.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + + foreach (string flag in module.CompilerFlags) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write(flag); + writer.RenderEndTag(); + } + + foreach (string flag in Project.CompilerFlags) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write(flag); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + + foreach (string flag in module.LinkerFlags) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write(flag); + writer.RenderEndTag(); + } + + foreach (string flag in Project.LinkerFlags) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write(flag); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateModules() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\modules.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Modules"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Modules"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Module"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Unicode"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("C++"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("PCH"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Target"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Install Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Install Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("RBuild"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Unicode); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.CPlusPlus); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.PCH); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.InstallBase); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.InstallName); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.RBuildPath); + writer.RenderEndTag(); + + writer.RenderEndTag(); + } + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateStats() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\codestats.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Stats"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Stats"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Modules"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(Project.Modules.Count); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateWarnings() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\warnings.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Warnings"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Warnings"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Unicode == false) + { + if ((module.Defines.IsDefined("UNICODE")) || + (module.Defines.IsDefined("_UNICODE")) || + (module.Defines.IsDefined("_UNICODE_"))) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.WriteLine("Module '{0}' has unicode defines but 'Unicode' property set to 'False'", module.Name); + writer.RenderEndTag(); + } + } + + foreach (RBuildDefine define in Project.Defines) + { + if (module.Defines.IsDefined(define.Name)) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.WriteLine("Module '{0}' defines '{1}' already inherited from project ", module.Name, define.Name); + writer.RenderEndTag(); + } + } + + foreach (string flag in Project.CompilerFlags) + { + if (module.CompilerFlags.Contains(flag)) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.WriteLine("Module '{0}' has compiler flag '{1}' already inherited from project ", module.Name, flag); + writer.RenderEndTag(); + } + } + + foreach (string flag in Project.LinkerFlags) + { + if (module.LinkerFlags.Contains(flag)) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.WriteLine("Module '{0}' has linker flag '{1}' already inherited from project ", module.Name, flag); + writer.RenderEndTag(); + } + } + + foreach (RBuildFolder include in module.IncludeFolders) + { + if (Project.IncludeFolders.Contains(include)) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.WriteLine("Module '{0}' includes folder '({1}){2}' already inherited from project ", module.Name, include.Root, include.FullPath); + writer.RenderEndTag(); + } + + if (include.Root == PathRoot.Default || + include.Root == PathRoot.SourceCode) + { + if (SysGen.RBuildFolderExists(include) == false) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.WriteLine("Module '{0}' includes folder '({1}){2}' which could not be found ", module.Name, include.Root, include.FullPath); + writer.RenderEndTag(); + } + } + } + } + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateFiles() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\files.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Modules"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Files"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Path"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Install Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("New Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildOutputFile file in Project.Files) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.FullPath); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.InstallBase); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.NewFile.FullPath); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.GetType().Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateBaseAddresses() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\baseaddresses.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "BaseAdress"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Base Adress"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Value"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildProperty property in SysGen.Project.Properties) + { + if (property is RBuildBaseAdress) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(property.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(property.Value); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateDllBaseAddresses() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\dllbaseaddresses.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Dll's base addresses"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Dll's base addresses"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Module"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base Adress"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Is Default"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.IsDLL) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.BaseAddress); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.IsDefaultBaseAdress); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + } + } + } + + private void GenerateDefines() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\defines.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Project Defines"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Project Defines"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Value"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildDefine define in Project.Defines) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(define.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(define.Value); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateProperties() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\properties.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Properties"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Properties"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Value"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Read-Only"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Internal"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildProperty property in SysGen.Project.Properties) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(property.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(property.Value); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(property.ReadOnly); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(property.Internal); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(property.GetType().Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateInstallFiles() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\installfiles.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Install Files"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Install Files"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("ID"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Enabled) + { + if (module.IsInstallable) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.InstallBase); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.TargetFile.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + + foreach (RBuildOutputFile file in module.Files) + { + RBuildPlatformFile platformFile = file as RBuildPlatformFile; + + if (platformFile != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(platformFile.InstallBase); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(platformFile.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + } + + foreach (RBuildOutputFile file in Project.Files) + { + RBuildPlatformFile platformFile = file as RBuildPlatformFile; + + if (platformFile != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(platformFile.InstallBase); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(platformFile.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateInstallFolders() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\installfolders.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Folders"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Install Folders"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("ID"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildInstallFolder folder in Project.InstallFolders) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(folder.ID); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(folder.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateAuthors() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\authors.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Authors"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("ReactOS Authors"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Alias"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Mail"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("City"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Country"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Active"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildContributor contributor in Project.Contributors) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + + if (contributor.Alias != null) + { + writer.AddAttribute(HtmlTextWriterAttribute.Href, contributor.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(contributor.Alias); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(contributor.FullName); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(contributor.Mail); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(contributor.City); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(contributor.Country); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(contributor.Active); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateContributors() + { + foreach (RBuildContributor contributor in Project.Contributors) + { + if (contributor.Alias != null) + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\" + contributor.HtmlDocFileName)) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Authors"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("ReactOS Authors"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Module"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Roles"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Authors.GetByName(contributor.Alias) != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildAuthor author in module.Authors) + { + if (author.Contributor == contributor) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write(author.Role); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + } + } + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + } + } + + private void GenerateLocalizations() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\localizations.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Translations"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Available Languages"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("ID"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("ThreeLetter ISO"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildLanguage language in Project.Languages) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(language.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(language.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(language.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Localization by Module"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Module"); + writer.RenderEndTag(); + + foreach (RBuildLanguage language in Project.Languages) + { + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write(language.Name); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildLanguage language in Project.Languages) + { + RBuildLocalizationFile localization = module.LocalizationFiles.GetByName(language.Name); + + if (localization != null) + { + if (localization.Dirty) + { + writer.AddAttribute(HtmlTextWriterAttribute.Class, "Red"); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write("Yes"); + writer.RenderEndTag(); + } + else + { + writer.AddAttribute(HtmlTextWriterAttribute.Class, "Green"); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write("Yes"); + writer.RenderEndTag(); + } + } + else + { + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write("No"); + writer.RenderEndTag(); + } + } + + writer.RenderEndTag(); + } + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + private void GenerateModulePages() + { + foreach (RBuildModule module in Project.Platform.Modules) + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\" + module.HtmlDocFileName)) + { + // Creates an XML file is not exist + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, module.Name); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Module : {0}", module.Name); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Base); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Entry Point"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.EntryPoint); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("C++"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.CPlusPlus); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base Adress"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.BaseAddress); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Unicode"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Unicode); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Target Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Type.ToString()); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + + if (module.Families.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Families this module belong"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildFamily family in module.Families) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, ""); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(family.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (module.Folders.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Folders"); + writer.RenderEndTag(); + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildFolder folder in module.Folders) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(folder.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(folder.FullPath); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (module.IsBuildable) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Output Files"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("File"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + if (module.TargetFile != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.TargetFile.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.TargetFile.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.TargetFile.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (module.Install != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Install.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Install.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Install.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (module.PlatformInstall != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.PlatformInstall.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.PlatformInstall.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.PlatformInstall.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (module.Authors.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Authors"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Alias"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Full Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Mail"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Role"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildAuthor author in module.Authors) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, author.Contributor.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(author.Contributor.Alias); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(author.Contributor.FullName); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(author.Contributor.Mail); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(author.Role); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (module.Metadata != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Metadata"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Description"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Metadata.Description); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (module.AutoRegister != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("COM Auto register"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Register Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.AutoRegister.Type.ToString()); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("SysSetup INF Section"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.AutoRegister.InfSection); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (module.ImportLibrary != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("DLL Import"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.ImportLibrary.Root); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.ImportLibrary.Base); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Definition"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.ImportLibrary.Definition); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Import Dll Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.ImportLibrary.DllName); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (module.Bootstrap != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("CD Bootstrap"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Install Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Bootstrap.InstallBase); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Path"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Bootstrap.FullPath); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("New name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Bootstrap.NewName); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (module.Dependencies.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Dependencies"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildModule dependency in module.Dependencies) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, dependency.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(dependency.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (module.Libraries.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Libraries"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildModule dependency in module.Libraries) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, dependency.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(dependency.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (module.Requeriments.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Requeriments"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildModule dependency in module.Requeriments) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, dependency.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(dependency.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + SysGenDependencyTracker dependencyTracker = new SysGenDependencyTracker(Project,module); + + if (dependencyTracker.DependsOn.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Depdends On"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildModule dependency in dependencyTracker.DependsOn) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, dependency.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(dependency.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (dependencyTracker.DependencyOf.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Dependency Of"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildModule dependency in dependencyTracker.DependencyOf) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, dependency.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(dependency.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(dependency.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Include Folders"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildFolder folder in module.IncludeFolders) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(folder.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(folder.FullPath); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + foreach (RBuildFolder folder in Project.IncludeFolders) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(folder.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(folder.FullPath); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.TrueString); + writer.RenderEndTag(); + + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + if (module.LocalizationFiles.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Localizations"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("ISO Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Resource"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Outdated"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildLocalizationFile localization in module.LocalizationFiles) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(localization.CultureInfo.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(localization.CultureInfo.EnglishName); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(localization.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(localization.Dirty); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (module.Defines.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Defines"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Value"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildDefine define in module.Defines) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(define.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(define.Value); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + foreach (RBuildDefine define in Project.Defines) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(define.Name); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(define.Value); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.TrueString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + writer.RenderEndTag(); + } + + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Linker Flags"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Flag"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (string flag in module.LinkerFlags) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(flag); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + foreach (string flag in Project.LinkerFlags) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(flag); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.TrueString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + if (module.LinkerScript != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Linker Script"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.LinkerScript.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.LinkerScript.FullPath); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderEndTag(); + } + + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("CompilerFlags Flags"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Flag"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Inherited"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (string flag in module.CompilerFlags) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(flag); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + foreach (string flag in Project.CompilerFlags) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(flag); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.TrueString); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + if (module.Files.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Files"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Path"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Install Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("New Name"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildOutputFile file in module.Files) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.FullPath); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.InstallBase); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.NewFile.FullPath); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.GetType().Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + } + + if (module.SourceFiles.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Source Files"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Source Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Switches"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + foreach (RBuildSourceFile file in module.SourceFiles) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.FullPath); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(file.Switches); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderEndTag(); + + if (module.PreCompiledHeader != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Precompiled Header"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Root"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Source Type"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.PreCompiledHeader.Root); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.PreCompiledHeader.Type); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.PreCompiledHeader.FullPath); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderEndTag(); + } + } + + WriteDocumentEnd(writer); + } + } + } + } + + private void GenerateUnicodeModules() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\unicodemodules.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Unicode"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Unicode Modules"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Module"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Unicode) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Type); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write("Non-Unicode Modules"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Module"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Base"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Type"); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (!module.Unicode) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.Name); + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Base); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(module.Type); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + + writer.RenderEndTag(); + + + WriteDocumentEnd(writer); + } + } + } + + private void GeneratePlatformFrontPage() + { + using (StreamWriter sw = new StreamWriter(@"C:\rosDoc\platform.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteDocumentStart(writer, "Platform"); + + writer.RenderBeginTag(HtmlTextWriterTag.H2); + writer.Write(Project.Platform.Name); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.P); + writer.Write(Project.Platform.Description); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Modules"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.WriteLine("{0} out of {1}", Project.Platform.Modules.Count, Project.Modules.Count); + writer.RenderEndTag(); + writer.RenderEndTag(); + + if (Project.Platform.Shell != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Shell"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(Project.Platform.Shell.InstallName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (Project.Platform.Screensaver != null) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Screen Saver"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(Project.Platform.Screensaver.InstallName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (Project.Platform.Languages.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Languages"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildLanguage language in Project.Platform.Languages) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write(language.Name); + writer.RenderEndTag(); + } + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + if (Project.Platform.DebugChannels.Count > 0) + { + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Debug Channels"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildDebugChannel channel in Project.Platform.DebugChannels) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write(channel.Name); + writer.RenderEndTag(); + } + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Platform Profiles"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.ModuleGroup) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.Write(module.Description); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Debug Build"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.TrueString); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Kernel Debug"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(bool.FalseString); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.H3); + writer.Write("Files"); + writer.RenderEndTag(); + + writer.AddAttribute(HtmlTextWriterAttribute.Class, "table"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("GUI Applications"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Console Applications"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Dlls"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Drivers"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("Keyboard Layouts"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("KernelMode DLLs"); + writer.RenderEndTag(); + writer.RenderBeginTag(HtmlTextWriterTag.Th); + writer.Write("OCX & TypeLibs"); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.Win32GUI) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.Win32CUI) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.Win32DLL) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.KernelModeDriver) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.KeyboardLayout) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.KernelModeDLL) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.Win32OCX || module.Type == ModuleType.EmbeddedTypeLib) + { + writer.RenderBeginTag(HtmlTextWriterTag.Li); + writer.AddAttribute(HtmlTextWriterAttribute.Href, module.HtmlDocFileName); + writer.RenderBeginTag(HtmlTextWriterTag.A); + writer.Write(module.TargetName); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + + writer.RenderEndTag(); + + WriteDocumentEnd(writer); + } + } + } + + protected override void Generate() + { + GenerateFrontPage(); + GeneratePlatformFrontPage(); + GenerateModules(); + GenerateProperties(); + GenerateModulesBuildSummary(); + GenerateStats(); + //GenerateDependencyMap(); + GenerateWarnings(); + GenerateFiles(); + GenerateBaseAddresses(); + GenerateDllBaseAddresses(); + GenerateDefines(); + GenerateInstallFolders(); + GenerateInstallFiles(); + GenerateAuthors(); + GenerateContributors(); + GenerateLocalizations(); + GenerateModulePages(); + GenerateUnicodeModules(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/MSVisualStudio/MSVisualStudio.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/MSVisualStudio/MSVisualStudio.cs new file mode 100644 index 00000000000..c1744aad138 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/MSVisualStudio/MSVisualStudio.cs @@ -0,0 +1,45 @@ +using System; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.BuildEngine.Framework.VisualStudio; +using SysGen.BuildEngine.Backends; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public class MSVisualStudio : Backend + { + public MSVisualStudio(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "Visual Studio 6.0-2005"; } + } + + protected override void Generate() + { + VSSolution solution = new VSSolution(); + + solution.Name = "ReactOS"; + solution.FileName = "reactos.sln"; + + foreach (RBuildModule module in SysGen.Project.Modules) + { + VSProject project = new VSProject(); + + //project.Name = module.Name; + project.FileName = module.Name + ".vcproj"; + + solution.Projects.Add(project); + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/MSVisualStudio/VisualStudio/Solution.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/MSVisualStudio/VisualStudio/Solution.cs new file mode 100644 index 00000000000..00ececbee87 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/MSVisualStudio/VisualStudio/Solution.cs @@ -0,0 +1,703 @@ +using System; +using System.IO; +using System.Xml; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.BuildEngine.Framework.VisualStudio +{ + public enum VisualStudioVersion + { + VS6, + VS2002, + VS2003, + VS2005 + } + + #region ProjectFile + public class ProjectFile + { + private string relPath = ""; + private string basePath = ""; + private string buildAction = ""; + private string subType = ""; + + public string AbsolutePath + { + get + { + return Path.Combine(basePath, relPath); + } + } + public string AbsoluteDirectory + { + get + { + return Path.GetDirectoryName(Path.Combine(basePath, relPath)); + } + } + + public string RelativePath + { + get + { + return relPath; + } + } + + public string BasePath + { + get + { + return basePath; + } + } + public string BuildAction + { + get + { + return buildAction; + } + } + public string SubType + { + get + { + return subType; + } + } + + public override string ToString() + { + StringBuilder buff = new StringBuilder("\nProject File:"); + buff.Append("\n\tRelativePath:"); + buff.Append(relPath); + buff.Append("\n\tBuildAction:"); + buff.Append(buildAction); + buff.Append("\n\tSubType:"); + buff.Append(subType); + buff.Append("\n\tBasePath:"); + buff.Append(basePath); + return buff.ToString(); + } + + public ProjectFile( + string relPath, + string buildAction, + string subType, + string basePath) + { + this.relPath = relPath; + this.buildAction = buildAction; + this.subType = subType; + this.basePath = basePath; + } + } + #endregion + + #region ProjectFileCollection + public class ProjectFileCollection : ReadOnlyCollectionBase + { + public ProjectFile this[int index] + { + get + { + return (ProjectFile)this.InnerList[index]; + } + } + + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append("\nProjectFileCollection"); + foreach (ProjectFile pf in this.InnerList) + { + buff.Append(pf.ToString()); + } + return buff.ToString(); + } + + public ProjectFileCollection(ProjectFile[] projectFileArray) + { + foreach (ProjectFile projectFile in projectFileArray) + { + this.InnerList.Add(projectFile); + } + } + + + } + #endregion + + #region ProjectReference + public class ProjectReference + { + private string name = ""; + private string assemblyName = ""; + private string hintPath = ""; + private string basePath = ""; + + public string Name + { + get + { + return this.name; + + } + } + public string AssemblyName + { + get + { + return this.assemblyName; + } + } + public string HintPath + { + get + { + return this.hintPath; + } + } + public string AbsolutePath + { + get + { + return Path.Combine(this.basePath, this.hintPath); + } + } + + public string BasePath + { + get + { + return this.basePath; + } + } + public override string ToString() + { + StringBuilder buff = new StringBuilder("\nReference:"); + buff.Append("\n\tName"); + buff.Append(name); + buff.Append("\n\tAssemblyName"); + buff.Append(assemblyName); + buff.Append("\n\tHintPath:"); + buff.Append(hintPath); + buff.Append("\n\tBasePath:"); + buff.Append(basePath); + return buff.ToString(); + } + + public ProjectReference(string name, + string assemblyName, + string hintPath, + string basePath) + { + this.name = name; + this.assemblyName = assemblyName; + this.hintPath = hintPath; + this.basePath = basePath; + } + + } + #endregion + + #region ProjectReferenceCollection + public class ProjectReferenceCollection : ReadOnlyCollectionBase + { + public ProjectReference this[int index] + { + get + { + return (ProjectReference)this.InnerList[index]; + } + } + + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append("\nProjectReferenceCollection"); + foreach (ProjectReference pr in this.InnerList) + { + buff.Append(pr.ToString()); + } + return buff.ToString(); + } + + public ProjectReferenceCollection(ProjectReference[] + projectReferenceArray) + { + foreach (ProjectReference projectReference in projectReferenceArray) + { + this.InnerList.Add(projectReference); + } + } + + } + #endregion + + #region ProjectConfigItem + public class ProjectConfigItem + { + private string key = ""; + private string keyValue = ""; + + public string Key + { + get + { + return key; + } + } + public string Value + { + get + { + return keyValue; + } + } + + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append("\nProjectConfigItem:"); + buff.Append("\n\tKey:"); + buff.Append(key); + buff.Append("\n\tValue:"); + buff.Append(keyValue); + return buff.ToString(); + } + + public ProjectConfigItem(string key, string keyValue) + { + this.key = key; + this.keyValue = keyValue; + + } + } + #endregion + + #region ProjectConfigItemCollection + public class ProjectConfigItemCollection : ReadOnlyCollectionBase + { + private string basePath = ""; + + public string Name + { + get + { + string name = ""; + foreach (ProjectConfigItem pc in this.InnerList) + { + if (pc.Key.Equals("Name")) + { + name = pc.Value; + break; + } + } + return name; + } + } + + public string OutputRelPath + { + get + { + string relPath = ""; + foreach (ProjectConfigItem pc in this.InnerList) + { + if (pc.Key.Equals("OutputPath")) + { + relPath = pc.Value; + break; + } + } + return relPath; + } + } + + public string OutputAbsolutePath + { + get + { + string absPath = OutputRelPath; + absPath = Path.Combine(this.basePath, absPath); + return absPath.Replace("\\.\\", ""); + } + } + + public ProjectConfigItem this[int index] + { + get + { + return (ProjectConfigItem)this.InnerList[index]; + } + } + + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append("\nProjectConfigItemCollection:"); + foreach (ProjectConfigItem pc in this.InnerList) + { + buff.Append(pc.ToString()); + } + return buff.ToString(); + } + + public ProjectConfigItemCollection(ProjectConfigItem[] + projectConfigItemArray, string basePath) + { + this.basePath = basePath; + foreach (ProjectConfigItem pc in projectConfigItemArray) + { + this.InnerList.Add(pc); + } + + } + } + #endregion + + #region ProjectConfigCollection + public class ProjectConfigCollection : ReadOnlyCollectionBase + { + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append("\nProjectConfigCollection:"); + foreach (ProjectConfigItemCollection pc in this.InnerList) + { + buff.Append(pc.ToString()); + } + return buff.ToString(); + } + + public ProjectConfigItemCollection this[int index] + { + get + { + return (ProjectConfigItemCollection)this.InnerList[index]; + } + } + + public ProjectConfigCollection(XmlNodeList configItems, string basePath) + { + if (configItems.Count > 0) + { + foreach (XmlNode configItem in configItems) + { + // create an array of items: + ProjectConfigItem[] projectConfigItemArray = new + ProjectConfigItem[configItem.Attributes.Count]; + int i = 0; + foreach (XmlAttribute attrib in configItem.Attributes) + { + projectConfigItemArray[i] = new + ProjectConfigItem(attrib.Name, attrib.Value); + i++; + } + // create a ProjectConfigItemCollection: + ProjectConfigItemCollection projectConfigItemCollection = new + ProjectConfigItemCollection(projectConfigItemArray, basePath); + this.InnerList.Add(projectConfigItemCollection); + } + } + } + } + #endregion + + #region Project + public class VSProject : VSItem + { + private string basePath = ""; + private string projectBasePath = ""; + private string projectFileName = ""; + private string projectGuid = ""; + private string projectConfigurationGuid = ""; + private string projectName = ""; + private string projectType = ""; + private ProjectConfigCollection configCollection = null; + private ProjectReferenceCollection referenceCollection = null; + private ProjectFileCollection fileCollection = null; + + public string AbsolutePath + { + get + { + return Path.Combine(basePath, projectFileName); + } + } + + public string AbsoluteDirectory + { + get + { + return basePath; + } + } + + public ProjectConfigCollection Configurations + { + get + { + return configCollection; + } + } + public ProjectReferenceCollection ReferenceCollection + { + get + { + return referenceCollection; + } + } + public ProjectFileCollection FileCollection + { + get + { + return fileCollection; + } + } + + public string RelPath + { + get + { + return projectFileName; + } + } + + public string Guid + { + get + { + return projectGuid; + } + } + + public string ConfigurationGuid + { + get + { + return projectConfigurationGuid; + } + } + + public string Name + { + get + { + return projectName; + } + } + + public string ProjectType + { + get + { + return projectType; + } + } + + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append("\nProject:"); + buff.Append("\n\tName:"); + buff.Append(projectName); + buff.Append("\n\tFileName:"); + buff.Append(projectFileName); + buff.Append("\n\tBasePath:"); + buff.Append(basePath); + buff.Append("\n\tGuid:"); + buff.Append(projectGuid); + buff.Append("\nConfiguration:"); + buff.Append(configCollection.ToString()); + buff.Append("\nReferences:"); + buff.Append(referenceCollection.ToString()); + buff.Append("\nFiles:"); + buff.Append(fileCollection.ToString()); + return buff.ToString(); + } + } + #endregion + + #region ProjectCollection + public class ProjectCollection : List + { + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append("\nProject Collection:"); + foreach (VSProject p in this) + { + buff.Append(p.ToString()); + } + return buff.ToString(); + } + } + #endregion + + #region Solution + public class VSSolution : VSItem + { + private string solutionFileName = ""; + private string solutionDirectory = ""; + private string solutionFileVersion = ""; + private ProjectCollection projectCollection = null; + + public string LongestSharedPath + { + get + { + // find the longest path which is shared by all of the + // objects in the project (if any) + string longestSharedPath = solutionDirectory; + foreach (VSProject p in projectCollection) + { + string projectDir = p.AbsoluteDirectory; + longestSharedPath = getMinimumSharedPath(longestSharedPath, + projectDir); + foreach (ProjectFile pf in p.FileCollection) + { + string fileDir = pf.AbsoluteDirectory; + longestSharedPath = getMinimumSharedPath(longestSharedPath, + fileDir); + } + } + return longestSharedPath; + } + } + + private string getMinimumSharedPath( + string sharedPath, + string newPath + ) + { + string retSharedPath = ""; + if (sharedPath.Length > 0) + { + string[] sharedPathParts = sharedPath.Split( + (new char[] {Path.DirectorySeparatorChar, + Path.AltDirectorySeparatorChar })); + string[] newPathParts = newPath.Split( + (new char[] {Path.DirectorySeparatorChar, + Path.AltDirectorySeparatorChar})); + int max = Math.Min(sharedPathParts.Length, newPathParts.Length); + int sharedCount = 0; + for (int i = 0; i < max; i++) + { + if + (!sharedPathParts[i].ToUpper().Equals(newPathParts[i].ToUpper()) + ) + { + break; + } + else + { + sharedCount = i + 1; + } + } + if (sharedCount == 0) + { + return ""; + } + else + { + for (int i = 0; i < sharedCount; i++) + { + if (retSharedPath.Length > 0) + { + retSharedPath += Path.DirectorySeparatorChar; + } + retSharedPath += sharedPathParts[i]; + } + } + } + return retSharedPath; + } + + public string FileVersion + { + get + { + return solutionFileVersion; + } + } + + public ProjectCollection Projects + { + get + { + return projectCollection; + } + } + + public string FileName + { + get + { + return solutionFileName; + } + set + { + solutionFileName = value; + } + } + + public string BasePath + { + get + { + return solutionDirectory; + } + } + + public override string ToString() + { + StringBuilder s = new StringBuilder(); + s.Append("\nSolution:"); + s.Append("\nFileName:"); + s.Append(solutionFileName); + s.Append("\nVersion:"); + s.Append(solutionFileVersion); + if (projectCollection != null) + { + s.Append(projectCollection.ToString()); + } + return s.ToString(); + } + + public VSSolution() + { + } + + public VSSolution(string fileName) + { + solutionFileName = fileName; + } + } + #endregion + + public class VSItem + { + private string m_Name = null; + private string m_FileName = null; + + public string Name + { + get { return m_Name; } + set { m_Name = value; } + } + + public string FileName + { + get { return m_FileName; } + set { m_FileName = value; } + } + + public void SaveAs(VisualStudioVersion version) + { + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/CompilableFile.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/CompilableFile.cs new file mode 100644 index 00000000000..c4451fceeab --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/CompilableFile.cs @@ -0,0 +1,621 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Tasks; + +namespace SysGen.BuildEngine.Backends +{ + public class BackedBuildIncludeFolder : BackedBuildFolder + { + public BackedBuildIncludeFolder(RBuildFolder folder, SysGenEngine sysgen) + : base(sysgen) + { + m_RBuildFile = folder; + } + } + + public class BackendBuildFile : BackendBuildFileSystemInfo + { + public BackendBuildFile(SysGenEngine sysgen) + : base(sysgen) + { + m_RBuildFile = new RBuildFile(); + } + + public string GetPathWithNewExtension(PathRoot root, string newExtension) + { + return GetPath(root, BuildFile.Name, newExtension); + } + + public string GetPathWithNewName(PathRoot root, string newName) + { + return GetPath(root, newName, Path.GetExtension(BuildFile.Name)); + } + + public string GetPath(PathRoot root, string newName, string newExtension) + { + return Path.Combine(SysGen.GetPathRoot(root), Path.ChangeExtension(newName, newExtension)); + } + + public string IntermediateFolderFullPath + { + get { return Path.Combine(SysGen.GetPathRoot(PathRoot.Intermediate), BuildFile.Base) /*+ @"\."*/; } + } + + public string BaseFolderFullPath + { + get { return Path.Combine(SysGen.GetPathRoot(PathRoot.SourceCode), BuildFile.Base) /*+ @"\."*/; } + } + + public RBuildFile BuildFile + { + get { return m_RBuildFile as RBuildFile; } + } + } + + public class BackedBuildFolder : BackendBuildFileSystemInfo + { + public BackedBuildFolder(RBuildFolder folder, SysGenEngine sysgen) + : base(sysgen) + { + m_RBuildFile = folder; + } + + public BackedBuildFolder(SysGenEngine sysgen) + : base(sysgen) + { + m_RBuildFile = new RBuildFolder(); + } + + public RBuildFolder BuildFolder + { + get { return m_RBuildFile as RBuildFolder; } + } + } + + public abstract class BackendBuildFileSystemInfo + { + protected RBuildFileSystemInfo m_RBuildFile = null; + protected SysGenEngine m_SysGenEngine = null; + + public BackendBuildFileSystemInfo(SysGenEngine sysgen) + { + m_SysGenEngine = sysgen; + } + + public SysGenEngine SysGen + { + get { return m_SysGenEngine; } + } + + public string RelativePath + { + get { return SysGen.NormalizePath(m_RBuildFile.FullPath); } + } + + public string GetPath(PathRoot root) + { + return Path.Combine(SysGen.GetPathRoot(root), RelativePath); + } + + public string OriginalFullPath + { + get { return Path.Combine(SysGen.GetPathRoot(m_RBuildFile.Root), RelativePath); } + } + + public string BaseFullPath + { + get { return Path.Combine(SysGen.BaseDirectory, RelativePath); } + } + + public string IntermediateFullPath + { + get { return Path.Combine(SysGen.IntermediateDirectory, RelativePath); } + } + + public string OutputFullPath + { + get { return Path.Combine(SysGen.OutputDirectory, RelativePath); } + } + + public string BootCDOutputDirectory + { + get { return Path.Combine(SysGen.BootCDOutputDirectory, RelativePath); } + } + + public string TemporaryFullPath + { + get { return Path.Combine(SysGen.TemporaryDirectory, RelativePath); } + } + + public string InstallFullPath + { + get { return Path.Combine(SysGen.InstallDirectory, RelativePath); } + } + + public RBuildModule Module + { + get { return m_RBuildFile.Element as RBuildModule; } + } + } + + public class SourceFile : BackendBuildModule + { + RBuildSourceFile m_File = null; + BackendBuildFile m_SourceCodeFile = null; + BackendBuildFile m_SourceCodeObjectFile = null; + BackendBuildFile m_SourceCodeActualFile = null; + BackendBuildFile m_SourceCodeHeaderFile = null; + BackendBuildFile m_SourceCodePCHeaderFile = null; + BackendBuildFile m_SourceRpcClientHeaderFile = null; + BackendBuildFile m_SourceRpcServerHeaderFile = null; + BackendBuildFile m_SourceMessageTableHeaderFile = null; + BackendBuildFile m_SourceMessageTableResourceFile = null; + BackendBuildFile m_PCH = null; + BackendBuildFile m_PCHTemp = null; + + public SourceFile(RBuildSourceFile file, RBuildModule module, SysGenEngine sysgen) + : base(module, sysgen) + { + m_File = file; + + m_SourceCodeFile = new BackendBuildFile(sysgen); + m_SourceCodeFile.BuildFile.Name = file.Name; + m_SourceCodeFile.BuildFile.Element = module; + m_SourceCodeFile.BuildFile.Base = file.Base; + m_SourceCodeFile.BuildFile.Root = file.Root; + + m_SourceCodeObjectFile = new BackendBuildFile(sysgen); + m_SourceCodeObjectFile.BuildFile.Name = GetObjectFileName(file); + m_SourceCodeObjectFile.BuildFile.Element = module; + m_SourceCodeObjectFile.BuildFile.Base = file.Base; + + m_SourceCodeActualFile = new BackendBuildFile(sysgen); + m_SourceCodeActualFile.BuildFile.Name = GetActualSourceFile(file); + m_SourceCodeActualFile.BuildFile.Element = module; + m_SourceCodeActualFile.BuildFile.Base = file.Base; + + m_SourceCodeHeaderFile = new BackendBuildFile(sysgen); + m_SourceCodeHeaderFile.BuildFile.Name = GetHeaderFile(file); + m_SourceCodeHeaderFile.BuildFile.Element = module; + m_SourceCodeHeaderFile.BuildFile.Base = file.Base; + + m_SourceRpcClientHeaderFile = new BackendBuildFile(sysgen); + m_SourceRpcClientHeaderFile.BuildFile.Name = GetRpcClientHeaderFile(file); + m_SourceRpcClientHeaderFile.BuildFile.Element = module; + m_SourceRpcClientHeaderFile.BuildFile.Base = file.Base; + + m_SourceRpcServerHeaderFile = new BackendBuildFile(sysgen); + m_SourceRpcServerHeaderFile.BuildFile.Name = GetRpcServerHeaderFile(file); + m_SourceRpcServerHeaderFile.BuildFile.Element = module; + m_SourceRpcServerHeaderFile.BuildFile.Base = file.Base; + + m_SourceMessageTableHeaderFile = new BackendBuildFile(sysgen); + m_SourceMessageTableHeaderFile.BuildFile.Name = GetMessageTableHeaderFile(file); + m_SourceMessageTableHeaderFile.BuildFile.Element = module; + m_SourceMessageTableHeaderFile.BuildFile.Base = /*file.Base; //*/ "include/reactos"; + + m_SourceMessageTableResourceFile = new BackendBuildFile(sysgen); + m_SourceMessageTableResourceFile.BuildFile.Name = GetMessageTableResourceFile(file); + m_SourceMessageTableResourceFile.BuildFile.Element = module; + m_SourceMessageTableResourceFile.BuildFile.Base = file.Base; + } + + public string GetMessageTableResourceFile(RBuildFile file) + { + return Path.GetFileNameWithoutExtension(file.Name) + ".rc"; + } + + public string GetMessageTableHeaderFile(RBuildFile file) + { + return Path.GetFileNameWithoutExtension(file.Name) + ".h"; + } + + public string GetRpcServerHeaderFile(RBuildFile file) + { + return Path.GetFileNameWithoutExtension(file.Name) + "_s.h"; + } + + public string GetRpcClientHeaderFile(RBuildFile file) + { + return Path.GetFileNameWithoutExtension(file.Name) + "_c.h"; + } + + public string GetRpcProxyHeaderFile(RBuildFile file) + { + return Path.GetFileNameWithoutExtension(file.Name) + "_p.h"; + } + + private string GetHeaderFile(RBuildFile file) + { + switch (file.Extension) + { + case ".idl": + { + if (Module.Type == ModuleType.RpcServer) + return GetRpcServerHeaderFile(file); + + if (Module.Type == ModuleType.RpcClient) + return GetRpcClientHeaderFile(file); + + if (Module.Type == ModuleType.RpcProxy) + return GetRpcProxyHeaderFile(file); + + return Path.ChangeExtension(file.Name, ".h"); + } + break; + default: + return file.Name; + } + } + + private string GetActualSourceFile(RBuildFile file) + { + switch (file.Extension) + { + case ".spec": + return Path.ChangeExtension(file.Name, ".stubs.c"); + break; + case ".idl": + { + if (Module.Type == ModuleType.RpcServer) + return Path.GetFileNameWithoutExtension(file.Name) + "_s.c"; + + if (Module.Type == ModuleType.RpcClient) + return Path.GetFileNameWithoutExtension(file.Name) + "_c.c"; + + if (Module.Type == ModuleType.RpcProxy) + return Path.GetFileNameWithoutExtension(file.Name) + "_p.c"; + + return Path.ChangeExtension(file.Name, ".h"); + } + break; + default: + return file.Name; + } + } + + private string GetObjectFileName(RBuildFile file) + { + string filename = null; + switch (file.Extension) + { + case ".h": + filename = Path.ChangeExtension(file.Name, ".h.gch"); + break; + case ".mc": + filename = Path.ChangeExtension(file.Name, ".rc"); + break; + case ".rc": + filename = Path.ChangeExtension(file.Name, ".coff"); + break; + case ".spec": + filename = Path.ChangeExtension(file.Name, ".stubs.o"); + break; + case ".idl": + { + if (Module.Type == ModuleType.RpcServer) + return Path.GetFileNameWithoutExtension(file.Name) + "_s.o"; + + if (Module.Type == ModuleType.RpcClient) + return Path.GetFileNameWithoutExtension(file.Name) + "_c.o"; + + if (Module.Type == ModuleType.RpcProxy) + return Path.GetFileNameWithoutExtension(file.Name) + "_p.o"; + + /* + if (Module.Type == ModuleType.EmbeddedTypeLib) + return Path.GetFileNameWithoutExtension(file.Name) + ".tlb"; + */ + + filename = Path.ChangeExtension(file.Name, ".h"); + } + break; + //case ".c": + //case ".cpp": + //case ".cxx": + // { + // filename = Path.ChangeExtension(file.Name, ".o"); + // } + // break; + default: + filename = Path.ChangeExtension(file.Name, ".o"); + + //HACK: + if (Module.Type == ModuleType.BootSector) + return filename; + + //filename = string.Format("{1}_{0}{2}", + // Module.Name, + // Path.GetFileNameWithoutExtension(filename), + // Path.GetExtension(filename)); + break; + } + + if (file.Extension == ".mc" || + file.Extension == ".rc" || + file.Extension == ".c" || + file.Extension == ".cpp" || + file.Extension == ".cxx" || + file.Extension == ".asm" || + file.Extension == ".s") + { + filename = string.Format("{0}_{1}{2}", + Path.GetFileNameWithoutExtension(filename), + Module.Name, + Path.GetExtension(filename)); + } + else if (file.Extension == ".h") + { + return filename; + } + + return filename; + } + + public BackendBuildFile SourceCodeFile + { + get { return m_SourceCodeFile; } + } + + public BackendBuildFile SourceCodeHeaderFile + { + get { return m_SourceCodeHeaderFile; } + } + + public BackendBuildFile SourceCodeObjectFile + { + get { return m_SourceCodeObjectFile; } + } + + public BackendBuildFile SourceCodeActualFile + { + get { return m_SourceCodeActualFile; } + } + + public BackendBuildFile SourceRpcClientHeaderFile + { + get { return m_SourceRpcClientHeaderFile; } + } + + public BackendBuildFile SourceRpcServerHeaderFile + { + get { return m_SourceRpcServerHeaderFile; } + } + + public BackendBuildFile SourceCodePCHeaderFile + { + get { return m_SourceCodePCHeaderFile; } + } + + public RBuildSourceFile File + { + get { return m_File; } + } + + public BackendBuildFile MessageTableHeaderFile + { + get { return m_SourceMessageTableHeaderFile; } + } + + public BackendBuildFile MessageTableResourceFile + { + get { return m_SourceMessageTableResourceFile; } + } + } + + public class LibraryModule : BackendBuildModule + { + BackendBuildFile m_Dependency = null; + + public LibraryModule(RBuildModule module, SysGenEngine sysgen) : base (module , sysgen) + { + m_Dependency = new BackendBuildFile(sysgen); + m_Dependency.BuildFile.Name = module.DependencyName; + m_Dependency.BuildFile.Element = module; + m_Dependency.BuildFile.Base = module.Base; + } + + public BackendBuildFile Dependency + { + get { return m_Dependency; } + } + } + + public class BackendBuildModule + { + SysGenEngine m_SysGenEngine = null; + RBuildModule m_Module = null; + BackendBuildFile m_Target = null; + BackendBuildFile m_TargetNoStrip = null; + BackendBuildFile m_Dependency = null; + BackendBuildFile m_Definition = null; + + public BackendBuildModule(RBuildModule module, SysGenEngine sysgen) + { + m_Module = module; + m_SysGenEngine = sysgen; + + m_Target = new BackendBuildFile(sysgen); + m_Target.BuildFile.Name = module.TargetFile.Name; //module.TargetName; + m_Target.BuildFile.Element = module; + m_Target.BuildFile.Base = module.TargetFile.Base; //module.Base; + + m_TargetNoStrip = new BackendBuildFile(sysgen); + m_TargetNoStrip.BuildFile.Name = GetNoStripTargetName(module); + m_TargetNoStrip.BuildFile.Element = module; + m_TargetNoStrip.BuildFile.Base = module.Base; + + m_Dependency = new BackendBuildFile(sysgen); + m_Dependency.BuildFile.Name = module.DependencyName; + m_Dependency.BuildFile.Element = module; + m_Dependency.BuildFile.Base = module.Base; + + + m_Definition = new BackendBuildFile(sysgen); + m_Definition.BuildFile.Element = module; + + if (module.ImportLibrary == null) + { + m_Definition.BuildFile.Name = "tools/rbuild/empty.def"; + m_Definition.BuildFile.Base = sysgen.BaseDirectory; + } + else + { + if (IsWineModule) + m_Definition.BuildFile.Root = PathRoot.Intermediate; + + m_Definition.BuildFile.Name = module.ImportLibrary.Definition; + m_Definition.BuildFile.Base = module.ImportLibrary.Base; + } + } + + public bool IsWineModule + { + get + { + if (Module.ImportLibrary == null) + return false; + + return ((Module.ImportLibrary.Definition != null) && + (Module.ImportLibrary.Definition != string.Empty) && + (Module.ImportLibrary.Definition.Contains(".spec.def"))); + } + } + + public string GetNoStripTargetName(RBuildModule module) + { + return string.Format("{0}.nostrip{1}", + Path.GetFileNameWithoutExtension(module.TargetName), + Path.GetExtension(module.TargetName)); + } + + public string LibTempFileName + { + get + { + if (m_Module.Type == ModuleType.StaticLibrary) + return m_Module.TargetName; + + return Path.ChangeExtension(m_Module.TargetName, ".temp.a"); + } + } + + public string ExpTempFileName + { + get + { + if (m_Module.Type == ModuleType.StaticLibrary) + return m_Module.TargetName; + + return Path.ChangeExtension(m_Module.TargetName, ".temp.exp"); + } + } + + public string JunkTempFileName + { + get + { + if (m_Module.Type == ModuleType.StaticLibrary) + return m_Module.TargetName; + + return Path.ChangeExtension(m_Module.TargetName, ".junk.tmp"); + } + } + + public string RcTempFileName + { + get + { + if (m_Module.Type == ModuleType.StaticLibrary) + return m_Module.TargetName; + + return Path.ChangeExtension(m_Module.TargetName, ".rci.tmp"); + } + } + + public string ResTempFileName + { + get + { + if (m_Module.Type == ModuleType.StaticLibrary) + return m_Module.TargetName; + + return Path.ChangeExtension(m_Module.TargetName, ".res.tmp"); + } + } + + public string JunkTempFileNameFullPath + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.SourceCode), JunkTempFileName); } + } + + public string RcTempFileNameFullPath + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.Temporary), RcTempFileName); } + } + + public string ResTempFileNameFullPath + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.Intermediate), ResTempFileName); } + } + + public string ExpTempFileNameFullPath + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.SourceCode), ExpTempFileName); } + } + + public string LibTempFileNameFullPath + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.Intermediate), LibTempFileName); } + } + + public string ModuleIntermediateLocation + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.Intermediate), Module.Base); } + } + + public string ModuleOutputLocation + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.Output), Module.Base); } + } + + public string ModuleBaseIntermediateLocation + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.Intermediate), Module.Base); } + } + + public string ModuleBaseOutputLocation + { + get { return Path.Combine(m_SysGenEngine.GetPathRoot(PathRoot.Output), Module.Base); } + } + + public RBuildModule Module + { + get { return m_Module; } + } + + public BackendBuildFile Target + { + get { return m_Target; } + } + + public BackendBuildFile Dependency + { + get { return m_Dependency; } + } + + public BackendBuildFile Definition + { + get { return m_Definition; } + } + + public BackendBuildFile TargetNoStrip + { + get { return m_TargetNoStrip; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/MingwBackend.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/MingwBackend.cs new file mode 100644 index 00000000000..356dde7aa9a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/MingwBackend.cs @@ -0,0 +1,504 @@ +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +using SysGen.BuildEngine; +using SysGen.BuildEngine.Backends; +using SysGen.BuildEngine.Framework; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwBackend : CompilerBaseBacked + { + public const string ECHO_AR_MACRO = "$(ECHO_AR)"; + public const string ECHO_CC_MACRO = "$(ECHO_CC)"; + public const string ECHO_LD_MACRO = "$(ECHO_LD)"; + public const string ECHO_WRC_MACRO = "$(ECHO_WRC)"; + + public const string EMPTY_DEF_FILE = "tools\\rbuild\\empty.def"; + + protected bool m_UsePipe = false; + protected bool m_UsePch = false; + protected bool m_ManualBinUtilsSetting = false; + + protected List m_ModuleHandlers = new List(); + + public MingwBackend(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "MINGW32 Backend"; } + } + + private void WriteXmlRBuildFiles(MakefileWriter makefile, RBuildProject project) + { + foreach (string xmlBuildFile in SysGen.BuildFiles) + { + makefile.WriteIndentedLine(xmlBuildFile); + } + } + + protected List ModuleHandlers + { + get { return m_ModuleHandlers; } + } + + protected override void Generate() + { + base.Generate(); + + using (MakefileWriter makefile = new MakefileWriter(Directory.GetCurrentDirectory() + "\\" + Project.MakeFile)) + { + makefile.WriteComplexComment("THIS FILE IS AUTOMATICALLY GENERATED, EDIT " + Project.XmlFile + " INSTEAD"); + makefile.WriteLine(); + + makefile.WriteProperty("nasm", "nasm"); + makefile.WriteProperty("ARCH", "i386"); + + foreach (RBuildProperty property in SysGen.Project.Properties) + { + if (property.Internal == false) + { + if (property.Value != null) + { + makefile.WriteProperty( + property.Name.ToString(), + property.Value.ToString()); + } + } + } + + makefile.WriteComplexComment("XML rbuild files"); + + makefile.WritePropertyListStart("XMLBUILDFILES"); + WriteXmlRBuildFiles(makefile, Project); + makefile.WritePropertyListEnd(); + + MingwRBuildElementHandler projectHandler = new MingwRBuildProjectHandler(Project); + + projectHandler.Makefile = makefile; + projectHandler.SysGen = SysGen; + projectHandler.GenerateMakeFile(); + + //BackendBuildModule cModule; + SourceFile cFile; + MingwRBuildModuleHandler moduleHandler = null; + + foreach (RBuildModule module in SysGen.Project.Platform.Modules) + { + makefile.WritePropertyListStart(module.MakeFileSources); + foreach (RBuildSourceFile file in module.SourceFiles) + { + makefile.WriteIndentedLine(file.FullPath); + } + makefile.WritePropertyListEnd(); + } + + foreach (RBuildModule module in SysGen.Project.Platform.Modules) + { + if (module.Type == ModuleType.RpcClient) + { + makefile.WritePropertyListStart(module.MakeFileRPCHeaders); + + foreach (RBuildSourceFile file in module.SourceFiles) + { + cFile = new SourceFile(file, module, SysGen); + + if (cFile.File.IsWidl) + { + makefile.WriteIndentedLine(cFile.SourceRpcClientHeaderFile.IntermediateFullPath); + } + } + + makefile.WritePropertyListEnd(); + makefile.WritePropertyListStart(module.MakeFileRPCSources); + + foreach (RBuildSourceFile file in module.SourceFiles) + { + cFile = new SourceFile(file, module, SysGen); + + if (cFile.File.IsWidl) + { + makefile.WriteIndentedLine(cFile.SourceCodeActualFile.IntermediateFullPath); + } + } + + makefile.WritePropertyListEnd(); + } + + if (module.Type == ModuleType.RpcClient || + module.Type == ModuleType.RpcServer || + module.Type == ModuleType.RpcProxy) + { + makefile.WritePropertyListStart(module.MakeFileObjs); + + // Procesamos primero los .idl que generan .h que pueden + // ser luego requeridos para compilar el resto del módulo. + + foreach (RBuildSourceFile file in module.SourceFiles) + { + cFile = new SourceFile(file, module, SysGen); + + if (cFile.File.IsWidl) + { + makefile.WriteIndentedLine(cFile.SourceCodeObjectFile.IntermediateFullPath); + } + } + + // Luego compilamos el resto de fuentes + foreach (RBuildSourceFile file in module.SourceFiles) + { + cFile = new SourceFile(file, module, SysGen); + + if (!cFile.File.IsWidl && !cFile.File.IsMessageTable) + { + makefile.WriteIndentedLine(cFile.SourceCodeObjectFile.IntermediateFullPath); + } + } + + makefile.WritePropertyListEnd(); + } + else + { + makefile.WritePropertyListStart(module.MakeFileHeaders); + + // Procesamos primero los .idl que generan .h que pueden + // ser luego requeridos para compilar el resto del módulo. + + foreach (RBuildSourceFile file in module.SourceFiles) + { + cFile = new SourceFile(file, module, SysGen); + + if (module.Type == ModuleType.EmbeddedTypeLib) + { + /* idl files in EmbeddedTypeLib modules do not generate header files */ + } + else + { + if (cFile.File.IsWidl) + { + makefile.WriteIndentedLine(cFile.SourceCodeObjectFile.IntermediateFullPath); + } + } + } + + makefile.WritePropertyListEnd(); + makefile.WritePropertyListStart(module.MakeFilePCHHeaders); + + // Procesamos primero los .idl que generan .h que pueden + // ser luego requeridos para compilar el resto del módulo. + + foreach (RBuildSourceFile file in module.SourceFiles) + { + cFile = new SourceFile(file, module, SysGen); + + if (cFile.File.IsHeader) + { + makefile.WriteIndentedLine(cFile.SourceCodeObjectFile.IntermediateFullPath); + } + } + + makefile.WritePropertyListEnd(); + makefile.WritePropertyListStart(module.MakeFileMCHeaders); + + // Procesamos primero los .idl que generan .h que pueden + // ser luego requeridos para compilar el resto del módulo. + + foreach (RBuildSourceFile file in module.SourceFiles) + { + cFile = new SourceFile(file, module, SysGen); + + if (cFile.File.IsMessageTable) + { + makefile.WriteIndentedLine(cFile.MessageTableHeaderFile.IntermediateFullPath); + } + } + + makefile.WritePropertyListEnd(); + makefile.WritePropertyListStart(module.MakeFileObjs); + + foreach (RBuildSourceFile file in module.SourceFiles) + { + cFile = new SourceFile(file, module, SysGen); + //if (cFile.File.IsCompilable) + if (!cFile.File.IsWidl && !cFile.File.IsMessageTable &&!cFile.File.IsHeader) + { + makefile.WriteIndentedLine(cFile.SourceCodeObjectFile.IntermediateFullPath); + } + } + + makefile.WritePropertyListEnd(); + } + } + + makefile.WriteLine(); + + + foreach (RBuildModule module in SysGen.Project.Platform.Modules) + { + moduleHandler = null; + + switch (module.Type) + { + case ModuleType.RpcClient: + moduleHandler = new MingwRpcClientHeaderModuleHandler(module); + break; + case ModuleType.RpcServer: + moduleHandler = new MingwRpcServerHeaderModuleHandler(module); + break; + case ModuleType.RpcProxy: + moduleHandler = new MingwRpcProxyModuleHandler(module); + break; + case ModuleType.BootLoader: + moduleHandler = new MingwBootLoaderModuleHandler(module); + break; + case ModuleType.BootSector: + moduleHandler = new MingwBootSectorModuleHandler(module); + break; + case ModuleType.IdlHeader: + moduleHandler = new MingwIdlHeaderModuleHandler(module); + break; + case ModuleType.Win32CUI: + moduleHandler = new MingwWin32CUIModuleHandler(module); + break; + case ModuleType.Win32SCR: + case ModuleType.Win32GUI: + moduleHandler = new MingwWin32GUIModuleHandler(module); + break; + case ModuleType.Win32DLL: + moduleHandler = new MingwWin32DLLModuleHandler(module); + break; + case ModuleType.Win32OCX: + moduleHandler = new MingwWin32OCXModuleHandler(module); + break; + case ModuleType.KeyboardLayout: + case ModuleType.KernelModeDLL: + moduleHandler = new MingwKernelModeDLLModuleHandler(module); + break; + case ModuleType.KernelModeDriver: + moduleHandler = new MingwKernelModeDriverModuleHandler(module); + break; + case ModuleType.Kernel: + moduleHandler = new MingwKernelModuleHandler(module); + break; + case ModuleType.NativeCUI: + moduleHandler = new MingwNativeCUIModuleHandler(module); + break; + case ModuleType.NativeDLL: + moduleHandler = new MingwNativeDLLModuleHandler(module); + break; + case ModuleType.ObjectLibrary: + moduleHandler = new MingwObjectLibraryModuleHandler(module); + break; + case ModuleType.StaticLibrary: + moduleHandler = new MingwStaticLibraryModuleHandler(module); + break; + case ModuleType.EmbeddedTypeLib: + moduleHandler = new MingwEmbeddedTypeLibModuleHandler(module); + break; + case ModuleType.HostStaticLibrary: + moduleHandler = new MingwHostStaticLibraryModuleHandler(module); + break; + case ModuleType.BuildTool: + moduleHandler = new MingwBuildToolModuleHandler(module); + break; + case ModuleType.Cabinet: + moduleHandler = new MingwCabinetModuleHandler(module); + break; + case ModuleType.Iso: + moduleHandler = new MingwBootCDTargetHandler(module); + break; + case ModuleType.LiveIso: + moduleHandler = new MingwLiveCDTargetHandler(module); + break; + case ModuleType.IsoRegTest: + moduleHandler = new MingwBootCDRegTestTargetHandler(module); + break; + case ModuleType.LiveIsoRegTest: + moduleHandler = new MingwLiveCDRegTestTargetHandler(module); + break; + case ModuleType.MessageHeader: + moduleHandler = new MingwMessageHeaderModuleHandler(module); + break; + case ModuleType.Package: + moduleHandler = new MingwPackageModuleHandler(module); + break; + } + + if (moduleHandler != null) + { + moduleHandler.SysGen = SysGen; + moduleHandler.Makefile = makefile; + moduleHandler.Project = Project; + + ModuleHandlers.Add(moduleHandler); + } + + } + + foreach (MingwRBuildModuleHandler moduleHandler2 in ModuleHandlers) + { + if (moduleHandler2.Module.IsBuildable) // Hack + { + makefile.WriteProperty(moduleHandler2.Module.MakeFileTarget, moduleHandler2.ModuleTarget); + } + } + + foreach (MingwRBuildModuleHandler moduleHandler2 in ModuleHandlers) + { + if (moduleHandler2.Module.IsBuildable) // Hack + { + makefile.WriteComplexComment("Buid instructions for module '{0}' on '{1}' [{2}]", + moduleHandler2.Module.Name, + moduleHandler2.Module.Base, + moduleHandler2.Module.Type); + + moduleHandler2.GenerateMakeFile(); + + makefile.WritePhonyTarget(moduleHandler2.Module.MakeFileMakeTarget); + makefile.WriteRule(moduleHandler2.Module.Name, moduleHandler2.Module.MakeFileTargetMacro); + makefile.WriteLine(); + + makefile.WriteSingleLineTarget(moduleHandler2.Module.MakeFileInfoTarget); + makefile.WriteLine("\t@echo =======================Module Info============================"); + makefile.WriteLine("\t@echo Name: '{0}'", moduleHandler2.Module.Name); + makefile.WriteLine("\t@echo Type: '{0}'", moduleHandler2.Module.Type); + makefile.WriteLine("\t@echo Base: '{0}'", moduleHandler2.Module.Base); + makefile.WriteLine("\t@echo XML: '{0}'", moduleHandler2.Module.RBuildPath); + makefile.WriteLine("\t@echo Target: '{0}'", moduleHandler2.Module.TargetName); + makefile.WriteLine("\t@echo ==============================================================="); + makefile.WriteLine(); + + makefile.WriteSingleLineTarget(moduleHandler2.Module.MakeFileFlagDebugTarget); + makefile.WriteLine("\t@echo =======================Module Debug Info======================="); + makefile.WriteLine("\t@echo CFLAGS: '{0}'", moduleHandler2.Module.MakeFileCFlagsMacro); + makefile.WriteLine("\t@echo LFLAGS: '{0}'", moduleHandler2.Module.MakeFileLFlagsMacro); + makefile.WriteLine("\t@echo LIBS: '{0}'", moduleHandler2.Module.MakeFileLibsMacro); + makefile.WriteLine("\t@echo LINKDEPS: '{0}'", moduleHandler2.Module.MakeFileLinkDepsMacro); + makefile.WriteLine("\t@echo NASM: '{0}'", moduleHandler2.Module.MakeFileNASMMacro); + makefile.WriteLine("\t@echo OBJS: '{0}'", moduleHandler2.Module.MakeFileObjsMacro); + makefile.WriteLine("\t@echo RCFLAGS: '{0}'", moduleHandler2.Module.MakeFileRCFlagsMacro); + makefile.WriteLine("\t@echo TARGET: '{0}'", moduleHandler2.Module.MakeFileTargetMacro); + makefile.WriteLine("\t@echo WIDL: '{0}'", moduleHandler2.Module.MakeFileWIDLFlagsMacro); + makefile.WriteLine("\t@echo ==============================================================="); + makefile.WriteLine(); + } + } + + GenerateAllTarget(makefile); + GenerateCleanTarget(makefile); + GenerateInstallTarget(makefile); + GenerateTestTarget(makefile); + } + } + + private void GenerateAllTarget(MakefileWriter makefile) + { + makefile.WriteComplexComment("Generate the ALL target"); + makefile.WriteTarget("all"); + + foreach (RBuildModule module in SysGen.Project.Platform.Modules) + { + if ((module.Enabled) && (module.IncludeInAllTarget)) + { + makefile.WriteIndentedLine(module.MakeFileTargetMacro); + } + } + } + + private void GenerateCleanTarget(MakefileWriter makefile) + { + makefile.WriteComplexComment("Generate the CLEAN target"); + makefile.WriteTarget("clean"); + + foreach (RBuildModule module in SysGen.Project.Platform.Modules) + { + makefile.WriteIndentedLine(module.MakeFileCleanTarget); + } + } + + private void GenerateInstallTarget(MakefileWriter makefile) + { + makefile.WriteComplexComment("Generate the INSTALL target"); + makefile.WriteTarget("install"); + + //foreach (RBuildModule module in SysGen.Project.Platform.Modules) + //{ + // makefile.WriteIndentedLine(module.MakeFileCleanTarget); + //} + } + + private void GenerateTestTarget(MakefileWriter makefile) + { + RBuildFolderCollection folders = new RBuildFolderCollection(); + + makefile.WriteComplexComment("Generate the TEST target"); + makefile.WriteSingleLineTarget("test"); + + foreach (RBuildFolder folder in Project.Folders) + { + if (folders.Contains(folder) == false) + folders.Add(folder); + } + + foreach (RBuildModule module in Project.Modules) + { + foreach (RBuildFolder folder in module.Folders) + { + if (folders.Contains(folder) == false) + folders.Add(folder); + } + } + + foreach (RBuildInstallFolder folder in Project.InstallFolders) + { + if (folders.Contains(folder) == false) + folders.Add(folder); + } + + foreach (RBuildFolder folder in folders) + { + GenerateFolder(makefile, folder); + } + } + + private void GenerateFolder(MakefileWriter makefile, RBuildFolder folder) + { + if ((folder.Root == PathRoot.Default) || + (folder.Root == PathRoot.SourceCode)) + { + makefile.WriteLine("{0}: | {1}", + SysGen.ResolveRBuildFilePath(new RBuildFolder(PathRoot.Intermediate, folder.FullPath)), + SysGen.ResolveRBuildFilePath(new RBuildFolder(PathRoot.Intermediate, folder.Parent.FullPath))); + + makefile.WriteSingleLineIndented("$(ECHO_MKDIR)"); + makefile.WriteSingleLineIndented("$(mkdir) $@"); + + makefile.WriteLine("{0}: | {1}", + SysGen.ResolveRBuildFilePath(new RBuildFolder(PathRoot.Output, folder.FullPath)), + SysGen.ResolveRBuildFilePath(new RBuildFolder(PathRoot.Output, folder.Parent.FullPath))); + + makefile.WriteSingleLineIndented("$(ECHO_MKDIR)"); + makefile.WriteSingleLineIndented("$(mkdir) $@"); + } + + //Create the install and output folders + if (folder.Root == PathRoot.Output || + folder.Root == PathRoot.Install) + { + makefile.WriteLine("{0}: | {1}", + SysGen.ResolveRBuildFilePath(new RBuildFolder(folder.Root, folder.FullPath)), + SysGen.ResolveRBuildFilePath(new RBuildFolder(folder.Root, folder.Parent.FullPath))); + + makefile.WriteSingleLineIndented("$(ECHO_MKDIR)"); + makefile.WriteSingleLineIndented("$(mkdir) $@"); + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/MingwRBuildElementHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/MingwRBuildElementHandler.cs new file mode 100644 index 00000000000..f76bcc21151 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/MingwRBuildElementHandler.cs @@ -0,0 +1,923 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public enum LinkerSubSystem + { + Windows, + Console, + Native + } + + public abstract class MingwRBuildMakefileGenerator + { + protected SysGenEngine m_SysGenEngine = null; + protected MakefileWriter m_Makefile = null; + + public SysGenEngine SysGen + { + get { return m_SysGenEngine; } + set { m_SysGenEngine = value; } + } + + public MakefileWriter Makefile + { + get { return m_Makefile; } + set { m_Makefile = value; } + } + + protected virtual string ResolveRBuildFilePath(RBuildFile file) + { + return SysGen.ResolveRBuildFilePath(file); + } + + protected virtual string ResolveRBuildFolderPath(RBuildFolder folder) + { + return SysGen.ResolveRBuildFolderPath(folder); + } + + public virtual string ResolveRBuildFilePath(PathRoot root, RBuildFileSystemInfo file) + { + return SysGen.ResolveRBuildFilePath(root , file); + } + + public abstract void GenerateMakeFile(); + } + + public abstract class MingwRBuildElementHandler : MingwRBuildMakefileGenerator + { + protected RBuildElement m_BuildElement = null; + + public MingwRBuildElementHandler(RBuildElement element) + { + m_BuildElement = element; + } + + public override void GenerateMakeFile() + { + /* Do checking */ + CheckSourceFiles(); + + /* Do makefile generation */ + WriteCommon(); + WriteSpecific(); + //WritePCHFiles(); + WriteFiles(); + WriteLinker(); + WriteImportLibrary(); + WriteCleanTarget(); + } + + protected virtual void WriteFolders() + { + Makefile.WritePropertyListStart(BuildElement.MakeFileFolders); + WriteElementFolders(Makefile, BuildElement); + Makefile.WritePropertyListEnd(); + } + + protected virtual void CheckSourceFiles() + { + } + + protected virtual void WriteCommon() + { + WriteFolders(); + WriteCFlags(); + WriteRCFlags(); + WriteLFlags(); + WriteWIDLFlags(); + } + + protected virtual void WriteStrip() + { + } + + protected virtual void WriteNonSymbolStripped() + { + } + + protected virtual void WriteRsym() + { + } + + protected virtual void WriteImportLibrary() + { + } + + protected virtual void WriteLinker() + { + } + + protected virtual void WriteCleanTarget() + { + } + + protected virtual void WriteSpecific() + { + } + + protected virtual void WriteFiles() + { + } + + protected virtual void WritePCHFiles() + { + } + + protected virtual void WriteCFlags() + { + Makefile.WritePropertyListStart(BuildElement.MakeFileCFlags); + WriteElementIncludes(Makefile, BuildElement); + WriteElementDefines(Makefile, BuildElement); + Makefile.WritePropertyListEnd(); + } + + protected virtual void WriteLFlags() + { + Makefile.WritePropertyListStart(BuildElement.MakeFileLFlags); + WriteLinkerFlags(Makefile, BuildElement); + Makefile.WritePropertyListEnd(); + } + + protected virtual void WriteRCFlags() + { + Makefile.WriteProperty(BuildElement.MakeFileRCFlags, BuildElement.MakeFileCFlagsMacro); + } + + protected virtual void WriteWIDLFlags() + { + Makefile.WriteProperty(BuildElement.MakeFileWIDLFlags, BuildElement.MakeFileCFlagsMacro); + } + + protected void WriteElementDefines(MakefileWriter makefile, RBuildElement element) + { + foreach (RBuildDefine define in element.Defines) + { + if (!define.IsEmpty) + { + makefile.WriteIndentedLine("-D" + define.Name + "=" + define.Value); + } + else + makefile.WriteIndentedLine("-D" + define.Name); + } + } + + protected void WriteElementDependencyFlags(MakefileWriter makefile, RBuildModule module) + { + foreach (RBuildModule dependency in module.Dependencies) + { + Makefile.WriteIndentedLine(dependency.MakeFileTargetMacro); + } + } + + protected void WriteElementIncludes(MakefileWriter makefile, RBuildElement element) + { + foreach (RBuildFolder includeFolder in element.IncludeFolders) + { + Makefile.WriteIndentedLine("-I" + ResolveRBuildFolderPath(includeFolder)); + } + } + + protected void WriteElementFolders(MakefileWriter makefile, RBuildElement element) + { + foreach (RBuildFolder folder in element.Folders) + { + Makefile.WriteIndentedLine(ResolveRBuildFolderPath(folder)); + } + } + + protected void WriteModuleAssemblyFlags(MakefileWriter makefile, RBuildModule module) + { + foreach (string assemblyFlag in module.AssemblyFlags) + { + Makefile.WriteIndentedLine(assemblyFlag); + } + } + + protected void WriteCompilerFlags(MakefileWriter makefile, RBuildElement element) + { + foreach (string compilerFlag in element.CompilerFlags) + { + Makefile.WriteIndentedLine(compilerFlag); + } + } + + protected void WriteLinkerFlags(MakefileWriter makefile, RBuildElement element) + { + foreach (string linkerFlag in element.LinkerFlags) + { + Makefile.WriteIndentedLine(linkerFlag); + } + } + + public RBuildElement BuildElement + { + get { return m_BuildElement; } + } + } + + public abstract class MingwRBuildModuleHandler : MingwRBuildElementHandler + { + private RBuildProject m_Project = null; + private RBuildModule m_Module = null; + + private BackendBuildModule m_CompModule = null; + private BackedBuildFolder m_Folder = null; + + public MingwRBuildModuleHandler(RBuildModule module) + : base(module) + { + m_Module = module; + } + + ////Para que sirve? + //public bool ReferenceObjects + //{ + // get + // { + // switch (Module.Type) + // { + // case ModuleType.RpcServer: + // case ModuleType.RpcClient: + // case ModuleType.RpcProxy: + // case ModuleType.ObjectLibrary: + // //case ModuleType.IdlHeader: + // //case ModuleType.MessageHeader: + // return true; + // } + + // return false; + // } + //} + + public string ModuleTarget + { + get + { + if (Module.Type == ModuleType.IdlHeader) + return Module.MakeFileHeadersMacro; + + if (Module.Type == ModuleType.MessageHeader) + return Module.MakeFileMCHeadersMacro; + + if (Module.Type == ModuleType.RpcServer || + Module.Type == ModuleType.RpcClient || + Module.Type == ModuleType.RpcProxy || + Module.Type == ModuleType.ObjectLibrary) + { + return Module.MakeFileObjsMacro; + } + + if (Module.TargetFile.Root == PathRoot.Intermediate || + Module.TargetFile.Root == PathRoot.Output || + Module.TargetFile.Root == PathRoot.Default) + { + return ResolveRBuildFilePath(Module.TargetFile); + } + else + throw new BuildException("Don't know module target"); + } + } + + public override void GenerateMakeFile() + { + //m_Project = SysGen.Project; + + m_CompModule = new BackendBuildModule(Module, SysGen); + m_Folder = new BackedBuildFolder(SysGen); + m_Folder.BuildFolder.Base = Module.Folder.Base; + m_Folder.BuildFolder.Name = Module.Folder.Name; + m_Folder.BuildFolder.Element = Module; + + // Si se trata de un WinModule agregamos un include a la carpeta intermedia + // ya que algunas dlls de wine generan ahi sus recursos incrustrados como iconos + // o bitmaps + if (CompilableModule.IsWineModule) + { + Module.IncludeFolders.Add(new RBuildFolder(PathRoot.Intermediate, Module.Base)); + } + + // Llamamos a la clase base + base.GenerateMakeFile(); + } + + protected override void WriteFiles() + { + foreach (RBuildSourceFile file in Module.SourceFiles) + { + SourceFile sourceFile = new SourceFile(file, Module, SysGen); + + if (CanCompile(file)) + { + WriteFileBuildInstructions(sourceFile); + } + else + throw new Exception("Don't know how to write build instructions for '" + sourceFile.SourceCodeFile.OriginalFullPath + "' on module '" + Module.Name + "'"); + } + } + + protected abstract void WriteFileBuildInstructions(SourceFile sourceFile); + + protected abstract bool CanCompile(RBuildSourceFile file); + + protected override void WriteSpecific() + { + WriteModuleCommon(); + WritePreconditions(); + } + + protected virtual void WritePreconditions() + { + Makefile.WritePropertyAppendListStart(Module.MakeFilePreCondition); + WriteElementDependencyFlags(Makefile, Module); + Makefile.WritePropertyListEnd(); + Makefile.WriteLine(); + + foreach (RBuildSourceFile file in Module.SourceFiles) + { + if (file.IsCompilable) + { + Makefile.WriteLine("{0}: {1}", ResolveRBuildFilePath(file), Module.MakeFilePreConditionMacro); + } + } + + Makefile.WriteLine(); + } + + protected virtual void WriteWidl() + { + Makefile.WritePropertyListStart(Module.MakeFileWIDLFlags); + WriteElementIncludes(Makefile, Module); + Makefile.WritePropertyListEnd(); + + Makefile.WritePropertyAppend(Module.MakeFileWIDLFlags, Project.MakeFileWIDLFlagsMacro); + } + + protected virtual void WriteLibs() + { + Makefile.WritePropertyListStart(Module.MakeFileLibs); + + foreach (RBuildModule dependency in Module.Libraries) + { + if (dependency.IsDLL || dependency.IsLibrary || dependency.IsRPC) + { + if (dependency.Type == ModuleType.ObjectLibrary || + dependency.Type == ModuleType.RpcClient || + dependency.Type == ModuleType.RpcServer || + dependency.Type == ModuleType.RpcProxy) + { + Makefile.WriteIndentedLine(dependency.MakeFileTargetMacro); + } + else + { + Makefile.WriteIndentedLine(ResolveRBuildFilePath(dependency.Dependency)); + } + } + } + + Makefile.WritePropertyListEnd(); + } + + protected void WriteModuleCommon() + { + WriteLibs(); + WriteWidl(); + + if (Module.Host == false) + { + Makefile.WritePropertyAppend(Module.MakeFileCFlags, Project.MakeFileCFlagsMacro); + Makefile.WritePropertyAppend(Module.MakeFileRCFlags, Project.MakeFileRCFlagsMacro); + Makefile.WritePropertyAppend(Module.MakeFileLFlags, Project.MakeFileLFlagsMacro); + } + else + { + Makefile.WritePropertyAppend(Module.MakeFileLFlags, "$(HOST_LFLAGS)"); + } + + WriteLinkDeps(); + + if (Module.AssemblyFlags.Count > 0) + { + Makefile.WritePropertyListStart(Module.MakeFileNASMFlags); + WriteModuleAssemblyFlags(Makefile, Module); + Makefile.WritePropertyListEnd(); + } + + Makefile.WritePropertyAppendListStart(Module.MakeFileCFlags); + WriteCompilerFlags(Makefile, Module); + Makefile.WritePropertyListEnd(); + + Makefile.WriteLine(); + } + + protected virtual void WriteLinkDeps() + { + Makefile.WritePropertyAppend(Module.MakeFileLinkDeps, Module.MakeFileLibsMacro); + } + + public virtual string RpcHeaderDependencies + { + get + { + string dependencies = string.Empty; + + foreach (RBuildModule module in Module.Libraries) + { + if ((module.Type == ModuleType.RpcClient) || + (module.Type == ModuleType.RpcServer) || + (module.Type == ModuleType.IdlHeader)) /// se puede eliminar esta linea? + { + foreach (RBuildSourceFile file in module.SourceFiles) + { + SourceFile sourceFile = new SourceFile(file, module, SysGen); + + if (file.IsWidl) + { + if (module.Type == ModuleType.RpcClient) + dependencies += " " + sourceFile.SourceRpcClientHeaderFile.IntermediateFullPath; + + if (module.Type == ModuleType.RpcServer) + dependencies += " " + sourceFile.SourceRpcServerHeaderFile.IntermediateFullPath; + + //dependencies += " " + sourceFile.SourceCodeHeaderFile.IntermediateFullPath; + } + } + } + } + + return dependencies; + } + } + + public virtual string DefinitionDependencies + { + get + { + string dependencies = string.Empty; + + foreach (RBuildSourceFile file in Module.SourceFiles) + { + SourceFile sourceFile = new SourceFile(file, Module, SysGen); + + if (file.IsWineBuild) + { + dependencies += " " + CompilableModule.Definition.OriginalFullPath; + dependencies += " " + sourceFile.SourceCodeActualFile.IntermediateFullPath; + } + else if (file.IsWidl) + { + if (Module.Type == ModuleType.RpcClient || + Module.Type == ModuleType.RpcServer) + { + dependencies += " " + sourceFile.SourceCodeActualFile.IntermediateFullPath; + } + } + } + + return dependencies; + } + } + + public string Linker + { + get + { + if (Module.CPlusPlus) + return CPPCompiler; + + return CCompiler; + } + } + + public string PCHCompiler + { + get + { + if (Module.CPlusPlus) + return CPPCompiler; + + return CCompiler; + } + } + + public string CCompiler + { + get { return (Module.Host ? "$(host_gcc)" : "$(gcc)"); } + } + + public string CPPCompiler + { + get { return (Module.Host ? "$(host_gpp)" : "$(gpp)"); } + } + + public string ArchiveCompiler + { + get { return (Module.Host ? "$(host_ar)" : "$(ar)"); } + } + + protected virtual void WriteAr() + { + Makefile.WriteLine(m_CompModule.Target.IntermediateFullPath + ": " + Module.MakeFileObjsMacro + " | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_AR)"); + + if (Module.Type == ModuleType.StaticLibrary || + Module.Type == ModuleType.HostStaticLibrary) + { + if (Module.ImportLibrary != null) + { + Makefile.WriteLine("\t${dlltool} --dllname " + Module.ImportLibrary.DllName + " --def " + CompilableModule.Definition.OriginalFullPath + " --output-lib $@ " + MangledSymbols + " " + UnderscoreSymbols); + } + } + + Makefile.WriteLine("\t${ar} -rc $@ " + Module.MakeFileObjsMacro); + Makefile.WriteLine(); + } + + protected virtual void WriteWindResCompiler(SourceFile sourceFile) + { + Makefile.WriteLine(sourceFile.SourceCodeObjectFile.IntermediateFullPath + ": " + sourceFile.SourceCodeFile.OriginalFullPath + " $(wrc_TARGET) " + " | " + sourceFile.SourceCodeFile.IntermediateFolderFullPath); + Makefile.WriteLine("\t$(ECHO_WRC)"); + Makefile.WriteLine("\t" + CCompiler + " -xc -E -DRC_INVOKED " + Module.MakeFileRCFlagsMacro + " " + sourceFile.SourceCodeFile.OriginalFullPath + " > " + CompilableModule.RcTempFileNameFullPath); + Makefile.WriteLine("\t$(Q)$(wrc_TARGET) " + Module.MakeFileRCFlagsMacro + " " + CompilableModule.RcTempFileNameFullPath + " " + CompilableModule.ResTempFileNameFullPath); + Makefile.WriteLine("\t-@${rm} " + CompilableModule.RcTempFileNameFullPath + " 2>$(NUL)"); + Makefile.WriteLine("\t${windres} " + CompilableModule.ResTempFileNameFullPath + " -o $@"); + Makefile.WriteLine("\t-@${rm} " + CompilableModule.ResTempFileNameFullPath + " 2>$(NUL)"); + Makefile.WriteLine(); + } + + protected virtual void WriteWIDLTypeLibrary(SourceFile file) + { + Makefile.WriteLine(file.Target.IntermediateFullPath + ": " + file.SourceCodeFile.OriginalFullPath + " $(widl_TARGET) " + " | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_WIDL)"); + Makefile.WriteLine("\t$(Q)$(widl_TARGET) " + Module.MakeFileWIDLFlagsMacro + " -t -T " + file.Target.IntermediateFullPath + " " + file.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + } + + protected virtual void WriteWIDLHeader(SourceFile file) + { + Makefile.WriteLine(file.SourceCodeObjectFile.IntermediateFullPath + ": " + file.SourceCodeFile.OriginalFullPath + " $(widl_TARGET) " + " | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_WIDL)"); + Makefile.WriteLine("\t$(Q)$(widl_TARGET) " + Module.MakeFileWIDLFlagsMacro + " -h -H " + file.SourceCodeObjectFile.IntermediateFullPath + " " + file.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + } + + protected virtual void WriteWIDLRpcHeader(SourceFile file) + { + Makefile.WriteLine(file.SourceCodeActualFile.IntermediateFullPath + " " + file.SourceCodeHeaderFile.IntermediateFullPath + ": " + file.SourceCodeFile.OriginalFullPath + " $(widl_TARGET) | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_WIDL)"); + + if (Module.Type == ModuleType.RpcServer) + { + Makefile.WriteLine("\t$(Q)$(widl_TARGET) " + file.File.Switches + " " + Module.MakeFileWIDLFlagsMacro + " -h -H " + file.SourceCodeHeaderFile.IntermediateFullPath + " -s -S " + file.SourceCodeActualFile.IntermediateFullPath + " " + file.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + } + else if (Module.Type == ModuleType.RpcClient) + { + Makefile.WriteLine("\t$(Q)$(widl_TARGET) " + file.File.Switches + " " + Module.MakeFileWIDLFlagsMacro + " -h -H " + file.SourceCodeHeaderFile.IntermediateFullPath + " -c -C " + file.SourceCodeActualFile.IntermediateFullPath + " " + file.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + } + else if (Module.Type == ModuleType.RpcProxy) + { + Makefile.WriteLine("\t$(Q)$(widl_TARGET) " + file.File.Switches + " " + Module.MakeFileWIDLFlagsMacro + " -h -H " + file.SourceCodeHeaderFile.IntermediateFullPath + " -p -P " + file.SourceCodeActualFile.IntermediateFullPath + " " + file.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + } + + if (Module.Type == ModuleType.RpcServer || + Module.Type == ModuleType.RpcClient) + { + Makefile.WriteLine(file.SourceCodeObjectFile.IntermediateFullPath + ": " + file.SourceCodeActualFile.IntermediateFullPath + " " + file.SourceRpcServerHeaderFile.IntermediateFullPath + " " + file.SourceRpcClientHeaderFile.IntermediateFullPath + " | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_CC)"); + Makefile.WriteLine("\t" + CCompiler + " -c $< -o $@ " + Module.MakeFileCFlagsMacro); + Makefile.WriteLine(); + } + else if (Module.Type == ModuleType.RpcProxy) + { + Makefile.WriteLine(file.SourceCodeObjectFile.IntermediateFullPath + ": " + file.SourceCodeActualFile.IntermediateFullPath + " " + file.SourceCodeHeaderFile.IntermediateFullPath + " | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_CC)"); + Makefile.WriteLine("\t" + CCompiler + " -c $< -o $@ " + Module.MakeFileCFlagsMacro); + Makefile.WriteLine(); + } + } + + protected virtual void WriteWineBuild(SourceFile sourceFile) + { + Makefile.WriteLine(CompilableModule.Definition.IntermediateFullPath + ": " + sourceFile.SourceCodeFile.OriginalFullPath + " $(winebuild_TARGET) | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_WINEBLD)"); + Makefile.WriteLine("\t$(Q)$(winebuild_TARGET) $(WINEBUILD_FLAGS) -o " + CompilableModule.Definition.IntermediateFullPath + " --def -E " + sourceFile.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + + Makefile.WriteLine(sourceFile.SourceCodeActualFile.IntermediateFullPath + ": " + sourceFile.SourceCodeFile.OriginalFullPath + " $(winebuild_TARGET)"); + Makefile.WriteLine("\t$(ECHO_WINEBLD)"); + Makefile.WriteLine("\t$(Q)$(winebuild_TARGET) $(WINEBUILD_FLAGS) -o " + sourceFile.SourceCodeActualFile.IntermediateFullPath + " --pedll " + sourceFile.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + + Makefile.WriteLine(sourceFile.SourceCodeObjectFile.IntermediateFullPath + ": " + sourceFile.SourceCodeActualFile.IntermediateFullPath + " | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_CC)"); + Makefile.WriteLine("\t" + CCompiler + " -c $< -o $@ " + Module.MakeFileCFlagsMacro); + Makefile.WriteLine(); + } + + protected virtual void WritePCH(SourceFile sourceFile) + { + Makefile.WriteLine(sourceFile.SourceCodeObjectFile.IntermediateFullPath + ": " + sourceFile.SourceCodeFile.OriginalFullPath + " " + RpcHeaderDependencies + " | " + sourceFile.SourceCodeFile.IntermediateFolderFullPath); + Makefile.WriteLine("\t$(ECHO_PCH)"); + Makefile.WriteLine("\t" + PCHCompiler + " -o " + sourceFile.SourceCodeObjectFile.IntermediateFullPath + " " + Module.MakeFileCFlagsMacro + " -g " + sourceFile.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + } + + protected virtual void WriteCCompiler(SourceFile sourceFile) + { + Makefile.WriteLine(sourceFile.SourceCodeObjectFile.IntermediateFullPath + ": " + sourceFile.SourceCodeFile.OriginalFullPath + " " + Module.MakeFileHeadersMacro + " " + PrecompiledHeader + " " + RpcHeaderDependencies + " | " + sourceFile.SourceCodeFile.IntermediateFolderFullPath); + Makefile.WriteLine("\t$(ECHO_CC)"); + Makefile.WriteLine("\t" + CCompiler + " -c $< -o $@ " + Module.MakeFileCFlagsMacro); + Makefile.WriteLine(); + } + + protected virtual void WriteWMC(SourceFile sourceFile) + { + Makefile.WriteLine(sourceFile.MessageTableHeaderFile.IntermediateFullPath + " " + sourceFile.MessageTableResourceFile.IntermediateFullPath + ": " + "$(wmc_TARGET)" + " " + sourceFile.SourceCodeFile.OriginalFullPath + " | " + sourceFile.MessageTableHeaderFile.IntermediateFolderFullPath + " " + sourceFile.MessageTableResourceFile.IntermediateFolderFullPath); + Makefile.WriteLine("\t$(ECHO_WMC)"); + Makefile.WriteLine("\t$(Q)$(wmc_TARGET) -i -H " + sourceFile.MessageTableHeaderFile.IntermediateFullPath + " -o " + sourceFile.MessageTableResourceFile.IntermediateFullPath + " " + sourceFile.SourceCodeFile.OriginalFullPath); + Makefile.WriteLine(); + } + + protected virtual void WriteCPPCompiler(SourceFile sourceFile) + { + Makefile.WriteLine(sourceFile.SourceCodeObjectFile.IntermediateFullPath + ": " + sourceFile.SourceCodeFile.OriginalFullPath + " " + Module.MakeFileHeadersMacro + " " + PrecompiledHeader + " " + RpcHeaderDependencies + " | " + sourceFile.SourceCodeFile.IntermediateFolderFullPath); + Makefile.WriteLine("\t$(ECHO_CC)"); + Makefile.WriteLine("\t" + CPPCompiler + " -c $< -o $@ " + Module.MakeFileCFlagsMacro); + Makefile.WriteLine(); + } + + protected virtual void WriteNASMCompiler(SourceFile sourceFile) + { + Makefile.WriteLine(sourceFile.SourceCodeObjectFile.IntermediateFullPath + ": " + sourceFile.SourceCodeFile.OriginalFullPath + " | " + sourceFile.SourceCodeFile.IntermediateFolderFullPath /*+ ModuleFolder.IntermediateFullPath*/); + Makefile.WriteLine("\t$(ECHO_NASM)"); + Makefile.WriteLine("\t$(Q)${nasm} -f win32 $< -o $@ " + Module.MakeFileNASMMacro); + Makefile.WriteLine(); + } + + protected virtual void WriteASMCompiler(SourceFile sourceFile) + { + Makefile.WriteLine(sourceFile.SourceCodeObjectFile.IntermediateFullPath + ": " + sourceFile.SourceCodeFile.OriginalFullPath + " | " + sourceFile.SourceCodeFile.IntermediateFolderFullPath /*+ ModuleFolder.IntermediateFullPath*/); + Makefile.WriteLine("\t$(ECHO_GAS)"); + Makefile.WriteLine("\t" + CCompiler + " -x assembler-with-cpp -c $< -o $@ -D__ASM__ " + Module.MakeFileCFlagsMacro); + Makefile.WriteLine(); + } + + protected override void WriteRsym() + { + Makefile.WriteLine("\t$(ECHO_RSYM)"); + Makefile.WriteLine("\t$(Q)$(RSYM_TARGET) $@ $@"); + Makefile.WriteLine(); + } + + protected override void WriteStrip() + { + if (SysGen.Project.Properties["ROS_LEAN_AND_MEAN"] != null) + { + //No s'ha provat + Makefile.WriteLine("\t$(ECHO_STRIP)"); + Makefile.WriteLine("\t${strip} -s -x -X $@"); + Makefile.WriteLine(); + } + } + + protected override void WriteNonSymbolStripped() + { + if (SysGen.Project.Properties["ROS_BUILDNOSTRIP"] != null) + { + //No s'ha provat + Makefile.WriteLine("\t$(ECHO_CP)"); + Makefile.WriteLine("\t$(cp) " + m_CompModule.TargetNoStrip.OutputFullPath + " 1>$(NUL)"); + Makefile.WriteLine(); + } + } + + protected override void WriteLinker() + { + //Makefile.WriteLine(Module.MakeFileTargetMacro + ": " + CompilableModule.Definition.OriginalFullPath + " " + Module.MakeFileLinkDepsMacro + " " + Module.MakeFileObjsMacro + " $(RSYM_TARGET) $(PEFIXUP_TARGET) | " + /*ModuleFolder.TemporaryFullPath*/ ModuleFolder.OutputFullPath); + Makefile.WriteLine(Module.MakeFileTargetMacro + ": " + Definition + " " + Module.MakeFileLinkDepsMacro + " " + Module.MakeFileObjsMacro + " $(RSYM_TARGET) $(PEFIXUP_TARGET) | " + ModuleFolder.OutputFullPath); + Makefile.WriteLine("\t$(ECHO_LD)"); + + if (Module.IsDLL) + { + Makefile.WriteLine("\t${dlltool} --dllname " + Module.TargetName + " --def " + CompilableModule.Definition.OriginalFullPath + " --output-exp " + m_CompModule.ExpTempFileNameFullPath + " " + MangledSymbols + " " + UnderscoreSymbols); + } + + Makefile.WriteLine("\t" + Linker + " " + LinkerParameters); + + if (Module.IsDLL) + { + Makefile.WriteLine("\t$(Q)$(PEFIXUP_TARGET) " + Module.MakeFileTargetMacro + " -exports" + " " + PefixupParameters); + Makefile.WriteLine("\t-@${rm} " + m_CompModule.ExpTempFileNameFullPath + " 2>$(NUL)"); + } + + Makefile.WriteLine(); + + WriteRsym(); + WriteStrip(); + WriteNonSymbolStripped(); + } + + public string Definition + { + get + { + if (Module.ImportLibrary != null) + return CompilableModule.Definition.OriginalFullPath; + + return string.Empty; + } + } + + public virtual string PefixupParameters + { + get + { + if ((Module.Type == ModuleType.Kernel) || + (Module.Type == ModuleType.KernelModeDLL) || + (Module.Type == ModuleType.KernelModeDriver) || + (Module.Type == ModuleType.KeyboardLayout)) + { + return "-sections"; + } + + return string.Empty; + } + } + + public string LinkerScript + { + get + { + if (Module.LinkerScript != null) + return string.Format("-Wl,-T,{0}", Module.LinkerScript.FullPath); + + return string.Empty; + } + } + + public string MangledSymbols + { + get + { + if (Module.MangledSymbols) + return string.Empty; + + return "--kill-at"; + } + } + + public string UnderscoreSymbols + { + get + { + if (Module.UnderscoreSymbols) + return "--add-underscore"; + + return string.Empty; + } + } + + + protected string PrecompiledHeader + { + get + { + if (Module.PreCompiledHeader != null) + return Module.MakeFilePCHMacro; + + return string.Empty; + } + } + + protected override void WriteCleanTarget() + { + Makefile.WritePhonyTarget(Module.MakeFileCleanTarget); + Makefile.WriteSingleLineTarget(Module.MakeFileCleanTarget); + + if (Module.Type != ModuleType.Cabinet) //Hack: + { + foreach (RBuildSourceFile file in Module.SourceFiles) + { + SourceFile cFile = new SourceFile(file, Module, SysGen); + + Makefile.WriteLine("\t-@$(rm) " + cFile.SourceCodeObjectFile.IntermediateFullPath + " 2>$(NUL)"); + } + } + + Makefile.WriteLine("\t-@$(rm) " + Module.MakeFileTargetMacro + " 2>$(NUL)"); + Makefile.WriteLine(); + } + + protected override void WriteImportLibrary () + { + if (Module.HasImportLibrary) + { + Makefile.WriteComment("IMPORT LIBRARY RULE"); + Makefile.WriteLine(ResolveRBuildFilePath(Module.Dependency) + ": " + CompilableModule.Definition.OriginalFullPath + " " + DefinitionDependencies + " | " + ModuleFolder.IntermediateFullPath); + Makefile.WriteLine("\t$(ECHO_DLLTOOL)"); + Makefile.WriteLine("\t$(dlltool) --dllname " + Module.TargetName + " --def " + CompilableModule.Definition.OriginalFullPath + " --output-lib " + /*CompilableModule.Dependency.IntermediateFullPath*/ ResolveRBuildFilePath(Module.Dependency) + " " + MangledSymbols + " " + UnderscoreSymbols); + Makefile.WriteLine(); + } + } + + protected virtual string LinkerParameters + { + get + { + return string.Format("-Wl,--subsystem," + SubSystem + " -Wl,--entry,{0} -Wl,--image-base,{1} " + AdditionalParameters2 + " -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 " + " " + NoStartFiles + " " + Shared + " " + LinkerScript + " " + AdditionalParamters + " -o {2} {3} {4} {5}", + Module.LinkerEntryPoint, + Module.BaseAddress, + Module.MakeFileTargetMacro, + Module.MakeFileObjsMacro, + Module.MakeFileLibsMacro, + Module.MakeFileLFlagsMacro); + } + } + + protected virtual string AdditionalParameters2 + { + get { return string.Empty; } + } + + //Fixme: + protected virtual LinkerSubSystem LinkerSubsystem + { + get { return LinkerSubSystem.Console; } + } + + protected virtual string SubSystem + { + get { return "console"; } + } + + protected virtual string NoStartFiles + { + get + { + if (Module.Type == ModuleType.NativeCUI || + Module.Type == ModuleType.NativeDLL || + Module.Type == ModuleType.Kernel || + Module.Type == ModuleType.KernelModeDLL || + Module.Type == ModuleType.KernelModeDriver || + Module.Type == ModuleType.KeyboardLayout) + { + return "-nostartfiles"; + } + + return string.Empty; + } + } + + protected virtual string Shared + { + get + { + if (Module.IsDLL) + return "-shared"; + + return string.Empty; + } + } + + protected virtual string AdditionalParamters + { + get + { + if (Module.IsDLL) + return m_CompModule.ExpTempFileNameFullPath; + + return string.Empty; + } + } + + public RBuildModule Module + { + get { return m_BuildElement as RBuildModule; } + } + + public RBuildProject Project + { + get { return m_Project; } + set { m_Project = value; } + } + + public BackendBuildModule CompilableModule + { + get { return m_CompModule; } + } + + public BackedBuildFolder ModuleFolder + { + get { return m_Folder; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/Misc/MakefileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/Misc/MakefileWriter.cs new file mode 100644 index 00000000000..5dbb01e08fb --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/Misc/MakefileWriter.cs @@ -0,0 +1,99 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.BuildEngine.Backends +{ + public class MakefileWriter : StreamWriter + { + public MakefileWriter(string path) + : base(path) + { + } + + public void WriteComment(string text) + { + WriteLine("# {0}" , text); + } + + public void WriteComplexComment(string text, params object[] args) + { + WriteComplexComment(string.Format(text, args)); + } + + public void WriteComplexComment(string text) + { + WriteLine(); + WriteLine("#==================================================================================="); + WriteLine("# {0}", text); + WriteLine("#==================================================================================="); + WriteLine(); + } + + public void WriteIndentedLine(string text , params object[] args) + { + WriteIndentedLine(string.Format(text, args)); + WriteLine(); + } + + public void WriteSingleLineIndented(string text) + { + WriteLine("\t{0}", text); + } + + public void WriteIndentedLine(string text) + { + WriteLine("\t{0} \\", text); + } + + public void WriteProperty(string propertyName , string propertyValue) + { + WriteLine("{0} := {1}" , + propertyName , + propertyValue); + } + + public void WritePropertyAppend(string propertyName, string propertyValue) + { + WriteLine("{0} += {1}", + propertyName, + propertyValue); + } + + public void WritePropertyAppendListStart(string propertyName) + { + WriteLine("{0} += \\", propertyName); + } + + public void WritePropertyListStart(string propertyName) + { + WriteLine("{0} := \\", propertyName); + } + + public void WritePropertyListEnd() + { + WriteLine(); + } + + public void WritePhonyTarget(string targetName) + { + WriteLine(".PHONY: {0}", targetName); + } + + public void WriteSingleLineTarget(string targetName) + { + WriteLine("{0}:", targetName); + } + + public void WriteTarget(string targetName) + { + WriteLine("{0}: \\", targetName); + } + + public void WriteRule(string targetName , string targetName2) + { + WriteLine("{0}: {1}", targetName, targetName2); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/Base/MingwRBuildModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/Base/MingwRBuildModuleHandler.cs new file mode 100644 index 00000000000..d599896ff49 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/Base/MingwRBuildModuleHandler.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBootLoaderModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBootLoaderModuleHandler.cs new file mode 100644 index 00000000000..a3642c0d0e4 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBootLoaderModuleHandler.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwBootLoaderModuleHandler : MingwRBuildModuleHandler + { + public MingwBootLoaderModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return false; + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + } + + protected override void WriteLinker() + { + Makefile.WriteLine(Module.MakeFileTargetMacro + ": " + Module.MakeFileObjsMacro + " " + Module.MakeFileLinkDepsMacro + " | " + ModuleFolder.OutputFullPath); + Makefile.WriteLine("\t$(ECHO_LD)"); + //Makefile.WriteLine("\t$(ld) {0} -N -Ttext=0x8000 -o {1} {2} {3}", Module.MakeFileLFlagsMacro, CompilableModule.JunkTempFileNameFullPath, Module.MakeFileObjsMacro, Module.MakeFileLinkDepsMacro); + Makefile.WriteLine("\t$(gcc) -Wl,--subsystem,native -Wl,-N -Ttext=0x8000 -o {0} {1} {2} {3}", CompilableModule.JunkTempFileNameFullPath, Module.MakeFileObjsMacro, Module.MakeFileLinkDepsMacro, Module.MakeFileLFlagsMacro); + Makefile.WriteLine("\t$(objcopy) -O binary {0} $@", CompilableModule.JunkTempFileNameFullPath); + Makefile.WriteLine("\t-@$(rm) {0} 2>$(NUL)", CompilableModule.JunkTempFileNameFullPath); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBootSectorModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBootSectorModuleHandler.cs new file mode 100644 index 00000000000..8db44129cf8 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBootSectorModuleHandler.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwBootSectorModuleHandler : MingwRBuildModuleHandler + { + public MingwBootSectorModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsNASM); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsNASM) + { + WriteNASMCompiler(sourceFile); + } + } + + protected override void WriteLinker() + { + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBuildToolModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBuildToolModuleHandler.cs new file mode 100644 index 00000000000..ac8a70ff4a9 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwBuildToolModuleHandler.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwBuildToolModuleHandler : MingwRBuildModuleHandler + { + public MingwBuildToolModuleHandler(RBuildModule module) + : base(module) + + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsC || file.IsCPP); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsCPP) + { + WriteCPPCompiler(sourceFile); + } + } + + protected override void WriteLinker() + { + Makefile.WriteLine(Module.MakeFileTargetMacro + ": " + Module.MakeFileObjsMacro + " " + Module.MakeFileLinkDepsMacro + " | " + ModuleFolder.OutputFullPath); + Makefile.WriteLine("\t$(ECHO_LD)"); + Makefile.WriteLine("\t" + Linker + " " + Module.MakeFileLFlagsMacro + " -o $@ " + Module.MakeFileObjsMacro + " " + Module.MakeFileLibsMacro ); + Makefile.WriteLine(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwCabinetModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwCabinetModuleHandler.cs new file mode 100644 index 00000000000..8bc979878c7 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwCabinetModuleHandler.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwCabinetModuleHandler : MingwRBuildModuleHandler + { + public MingwCabinetModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return true; + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + } + + protected override void WriteLinker() + { + } + + protected override void WriteSpecific() + { + base.WriteSpecific(); + + Makefile.WriteLine(Module.MakeFileTargetMacro + ": $(cabman_TARGET) " + ModuleFolder.OutputFullPath); + Makefile.WriteLine("\t$(ECHO_CABMAN)"); + Makefile.WriteLine("\t$(Q)$(cabman_TARGET) -M raw -S " + Module.MakeFileTargetMacro + " " + Module.MakeFileSourcesMacro); + Makefile.WriteLine(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwEmbeddedTypeLibModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwEmbeddedTypeLibModuleHandler.cs new file mode 100644 index 00000000000..752cfaf896b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwEmbeddedTypeLibModuleHandler.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwEmbeddedTypeLibModuleHandler : MingwRBuildModuleHandler + { + public MingwEmbeddedTypeLibModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override void CheckSourceFiles() + { + if (Module.SourceFiles.Count > 1) + { + throw new BuildException("Modules of type 'EmbeddedTypeLib' can only contain 1 source file , this module contains '{0}", Module.SourceFiles.Count); + } + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsWidl); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsWidl) + { + WriteWIDLTypeLibrary(sourceFile); + } + } + + protected override void WriteLinker() + { + //WriteAr(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwHostStaticLibraryModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwHostStaticLibraryModuleHandler.cs new file mode 100644 index 00000000000..3a70452326f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwHostStaticLibraryModuleHandler.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwHostStaticLibraryModuleHandler : MingwStaticLibraryModuleHandler + { + public MingwHostStaticLibraryModuleHandler(RBuildModule module) + : base(module) + + { + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwIdlHeaderModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwIdlHeaderModuleHandler.cs new file mode 100644 index 00000000000..f831d9b6199 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwIdlHeaderModuleHandler.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Backends; + +namespace SysGen.BuildEngine +{ + public class MingwMessageHeaderModuleHandler : MingwRBuildModuleHandler + { + public MingwMessageHeaderModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override void WriteCommon() + { + } + + protected override void WriteLinker() + { + } + + protected override void WriteSpecific() + { + WritePreconditions(); + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsMessageTable); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsMessageTable) + { + WriteWMC(sourceFile); + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModeDLLModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModeDLLModuleHandler.cs new file mode 100644 index 00000000000..e0d03fe16d0 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModeDLLModuleHandler.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwKernelModeDLLModuleHandler : MingwRBuildModuleHandler + { + public MingwKernelModeDLLModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader || file.IsC || file.IsCPP || file.IsWindResource || file.IsAssembler || file.IsWidl || file.IsNASM || file.IsWineBuild); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsCPP) + { + WriteCPPCompiler(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + + if (sourceFile.File.IsNASM) + { + WriteNASMCompiler(sourceFile); + } + + if (sourceFile.File.IsAssembler) + { + WriteASMCompiler(sourceFile); + } + + if (sourceFile.File.IsWidl) + { + WriteWIDLHeader(sourceFile); + } + + if (sourceFile.File.IsWineBuild) + { + WriteWineBuild(sourceFile); + } + } + + protected override string SubSystem + { + get { return "native"; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModeDriverModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModeDriverModuleHandler.cs new file mode 100644 index 00000000000..ebbda411189 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModeDriverModuleHandler.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwKernelModeDriverModuleHandler : MingwRBuildModuleHandler + { + public MingwKernelModeDriverModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsC || file.IsWindResource || file.IsCPP || file.IsAssembler || file.IsWineBuild || file.IsHeader); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsWineBuild) + { + WriteWineBuild(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + + if (sourceFile.File.IsCPP) + { + WriteCPPCompiler(sourceFile); + } + + if (sourceFile.File.IsAssembler) + { + WriteASMCompiler(sourceFile); + } + } + + protected override string SubSystem + { + get { return "native"; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModuleHandler.cs new file mode 100644 index 00000000000..c432f7f0c3c --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwKernelModuleHandler.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwKernelModuleHandler : MingwRBuildModuleHandler + { + public MingwKernelModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader || file.IsC || file.IsWindResource || file.IsCPP || file.IsAssembler || file.IsMessageTable); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + + if (sourceFile.File.IsCPP) + { + WriteCPPCompiler(sourceFile); + } + + if (sourceFile.File.IsAssembler) + { + WriteASMCompiler(sourceFile); + } + + if (sourceFile.File.IsMessageTable) + { + WriteWMC(sourceFile); + } + } + + protected override string AdditionalParameters2 + { + get + { + return ""; + //return "-Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -shared"; + } + } + + protected override string SubSystem + { + get { return "native"; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwMessageHeaderModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwMessageHeaderModuleHandler.cs new file mode 100644 index 00000000000..c08b9098994 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwMessageHeaderModuleHandler.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Backends; + +namespace SysGen.BuildEngine +{ + public class MingwIdlHeaderModuleHandler : MingwRBuildModuleHandler + { + public MingwIdlHeaderModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override void WriteCommon() + { + } + + protected override void WriteLinker() + { + } + + protected override void WriteSpecific() + { + WriteWIDLFlags(); +// WriteTarget(); + WritePreconditions(); + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsWidl); + } + + protected override void WriteWIDLFlags() + { + Makefile.WriteLine(Module.MakeFileWIDLFlags + " := " + Project.MakeFileWIDLFlagsMacro + " -I" + ModuleFolder.BaseFullPath); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsWidl) + { + WriteWIDLHeader(sourceFile); + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwNativeCUIModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwNativeCUIModuleHandler.cs new file mode 100644 index 00000000000..4a8f5ee3436 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwNativeCUIModuleHandler.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwNativeCUIModuleHandler : MingwRBuildModuleHandler + { + public MingwNativeCUIModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader || file.IsC || file.IsWindResource); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + } + + protected override string SubSystem + { + get { return "native"; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwNativeDLLModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwNativeDLLModuleHandler.cs new file mode 100644 index 00000000000..3f23397da34 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwNativeDLLModuleHandler.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwNativeDLLModuleHandler : MingwRBuildModuleHandler + { + public MingwNativeDLLModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsC || file.IsWindResource || file.IsAssembler || file.IsMessageTable); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsMessageTable) + { + WriteWMC(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + + if (sourceFile.File.IsAssembler) + { + WriteASMCompiler(sourceFile); + } + } + + protected override string SubSystem + { + get { return "native"; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwObjectLibraryModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwObjectLibraryModuleHandler.cs new file mode 100644 index 00000000000..b95d425e431 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwObjectLibraryModuleHandler.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwObjectLibraryModuleHandler : MingwRBuildModuleHandler + { + public MingwObjectLibraryModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader || file.IsC || file.IsNASM || file.IsAssembler || file.IsMessageTable); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsAssembler) + { + WriteASMCompiler(sourceFile); + } + + if (sourceFile.File.IsNASM) + { + WriteNASMCompiler(sourceFile); + } + + if (sourceFile.File.IsMessageTable) + { + WriteWMC(sourceFile); + } + } + + protected override void WriteLinker() + { + } + + protected override string SubSystem + { + get { return "console"; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwPackageModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwPackageModuleHandler.cs new file mode 100644 index 00000000000..ce2f83a2108 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwPackageModuleHandler.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwPackageModuleHandler : MingwRBuildModuleHandler + { + public MingwPackageModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return true; + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + } + + protected override void WriteLinker() + { + } + + protected override void WriteSpecific() + { + base.WriteSpecific(); + + //Makefile.WriteLine(Module.MakeFileTargetMacro + ": $(cabman_TARGET) " + ModuleFolder.OutputFullPath); + //Makefile.WriteLine("\t$(ECHO_CABMAN)"); + //Makefile.WriteLine("\t$(Q)$(cabman_TARGET) -M raw -S " + Module.MakeFileTargetMacro + " " + Module.MakeFileSourcesMacro); + //Makefile.WriteLine(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRBuildProjectHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRBuildProjectHandler.cs new file mode 100644 index 00000000000..4f7cfaaff47 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRBuildProjectHandler.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwRBuildProjectHandler : MingwRBuildElementHandler + { + public MingwRBuildProjectHandler(RBuildProject project) + : base(project) + { + } + + protected override void WriteSpecific() + { + Makefile.WritePropertyListStart(Project.MakeFileGCCOptions); + WriteCompilerFlags(Makefile, Project); + Makefile.WritePropertyListEnd(); + + Makefile.WritePropertyAppend(Project.MakeFileCFlags, "-Wall"); + + if (Project.Properties["OARCH"].Value != string.Empty) + { + Makefile.WritePropertyAppend(Project.MakeFileCFlags, "-march=$(OARCH)"); + } + + Makefile.WritePropertyAppend(Project.MakeFileCFlags, Project.MakeFileGCCOptionsMacro); + } + + public RBuildProject Project + { + get { return m_BuildElement as RBuildProject; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcClientHeaderModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcClientHeaderModuleHandler.cs new file mode 100644 index 00000000000..c4fa641f31e --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcClientHeaderModuleHandler.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwRpcClientHeaderModuleHandler : MingwRpcServerHeaderModuleHandler + { + public MingwRpcClientHeaderModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsWidl); + } + + protected override void WriteCleanTarget() + { + base.WriteCleanTarget(); + + foreach (RBuildSourceFile file in Module.SourceFiles) + { + SourceFile cFile = new SourceFile(file, Module, SysGen); + + Makefile.WriteLine("\t-@$(rm) " + cFile.SourceCodeHeaderFile.IntermediateFullPath + " 2>$(NUL)"); + Makefile.WriteLine("\t-@$(rm) " + cFile.SourceCodeObjectFile.IntermediateFullPath + " 2>$(NUL)"); + } + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsWidl) + { + WriteWIDLRpcHeader(sourceFile); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcProxyModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcProxyModuleHandler.cs new file mode 100644 index 00000000000..f15d03d9301 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcProxyModuleHandler.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwRpcProxyModuleHandler : MingwRpcServerHeaderModuleHandler + { + public MingwRpcProxyModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsWidl); + } + + protected override void WriteCleanTarget() + { + base.WriteCleanTarget(); + + foreach (RBuildSourceFile file in Module.SourceFiles) + { + SourceFile cFile = new SourceFile(file, Module, SysGen); + + Makefile.WriteLine("\t-@$(rm) " + cFile.SourceCodeHeaderFile.IntermediateFullPath + " 2>$(NUL)"); + Makefile.WriteLine("\t-@$(rm) " + cFile.SourceCodeObjectFile.IntermediateFullPath + " 2>$(NUL)"); + } + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsWidl) + { + WriteWIDLRpcHeader(sourceFile); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcServerHeaderModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcServerHeaderModuleHandler.cs new file mode 100644 index 00000000000..a09bbb3069a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwRpcServerHeaderModuleHandler.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwRpcServerHeaderModuleHandler : MingwIdlHeaderModuleHandler + { + public MingwRpcServerHeaderModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override void WriteSpecific() + { + WriteCFlags(); + base.WriteSpecific(); + WriteModuleCommon(); + } + + protected override void WriteCleanTarget() + { + base.WriteCleanTarget(); + + foreach (RBuildSourceFile file in Module.SourceFiles) + { + SourceFile cFile = new SourceFile(file, Module, SysGen); + + Makefile.WriteLine("\t-@$(rm) " + cFile.SourceCodeHeaderFile.IntermediateFullPath + " 2>$(NUL)"); + Makefile.WriteLine("\t-@$(rm) " + cFile.SourceCodeActualFile.IntermediateFullPath + " 2>$(NUL)"); + } + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsWidl); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsWidl) + { + WriteWIDLRpcHeader(sourceFile); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwStaticLibraryModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwStaticLibraryModuleHandler.cs new file mode 100644 index 00000000000..f915a86b2f0 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwStaticLibraryModuleHandler.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwStaticLibraryModuleHandler : MingwRBuildModuleHandler + { + public MingwStaticLibraryModuleHandler(RBuildModule module) + : base(module) + + { + } + + /* + protected override void WriteLibs(RBuildModule module) + { + } + */ + + protected override void WriteCFlags() + { + base.WriteCFlags(); + + if (Module.IsStartupLib) + { + Makefile.WritePropertyAppend(Module.MakeFileCFlags, "-Wno-main"); + } + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader ||file.IsC || file.IsAssembler); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsAssembler) + { + WriteASMCompiler(sourceFile); + } + } + + protected override void WriteLinker() + { + WriteAr(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32CUIModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32CUIModuleHandler.cs new file mode 100644 index 00000000000..5097b3971c0 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32CUIModuleHandler.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Backends; + +namespace SysGen.BuildEngine +{ + public class MingwWin32CUIModuleHandler : MingwRBuildModuleHandler + { + public MingwWin32CUIModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader || file.IsC || file.IsCPP || file.IsWindResource); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsCPP) + { + WriteCPPCompiler(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32DLLModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32DLLModuleHandler.cs new file mode 100644 index 00000000000..a8b29f0a082 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32DLLModuleHandler.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwWin32DLLModuleHandler : MingwRBuildModuleHandler + { + public MingwWin32DLLModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader || file.IsC || file.IsCPP || file.IsWindResource || file.IsAssembler || file.IsWineBuild || file.IsWidl || file.IsMessageTable); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsWineBuild) + { + WriteWineBuild(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsCPP) + { + WriteCPPCompiler(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + + if (sourceFile.File.IsAssembler) + { + WriteASMCompiler(sourceFile); + } + + if (sourceFile.File.IsMessageTable) + { + WriteWMC(sourceFile); + } + + if (sourceFile.File.IsWidl) + { + WriteWIDLHeader(sourceFile); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32GUIModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32GUIModuleHandler.cs new file mode 100644 index 00000000000..b6687778a5d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32GUIModuleHandler.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwWin32GUIModuleHandler : MingwRBuildModuleHandler + { + public MingwWin32GUIModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader || file.IsC || file.IsCPP || file.IsWindResource || file.IsWineBuild); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsCPP) + { + WriteCPPCompiler(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + + if (sourceFile.File.IsWineBuild) + { + WriteWineBuild(sourceFile); + } + } + + protected override string SubSystem + { + get { return "windows"; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32OCXModuleHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32OCXModuleHandler.cs new file mode 100644 index 00000000000..7fe4f0b9c1a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/ModuleHandlers/MingwWin32OCXModuleHandler.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwWin32OCXModuleHandler : MingwRBuildModuleHandler + { + public MingwWin32OCXModuleHandler(RBuildModule module) + : base(module) + { + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return (file.IsHeader ||file.IsC || file.IsWindResource || file.IsCPP || file.IsWineBuild); + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + if (sourceFile.File.IsHeader) + { + WritePCH(sourceFile); + } + + if (sourceFile.File.IsC) + { + WriteCCompiler(sourceFile); + } + + if (sourceFile.File.IsWindResource) + { + WriteWindResCompiler(sourceFile); + } + + if (sourceFile.File.IsCPP) + { + WriteCPPCompiler(sourceFile); + } + + if (sourceFile.File.IsWineBuild) + { + WriteWineBuild(sourceFile); + } + } + + protected override string SubSystem + { + get { return "native"; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/TargetsHandlers/Base/MingwRBuildTargetHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/TargetsHandlers/Base/MingwRBuildTargetHandler.cs new file mode 100644 index 00000000000..b99413d3724 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/Mingw/TargetsHandlers/Base/MingwRBuildTargetHandler.cs @@ -0,0 +1,307 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public class MingwLiveCDTargetHandler : MingwRBuildIsoModuleHandler + { + public MingwLiveCDTargetHandler(RBuildModule module) + : base(module) + { + } + + protected override void AddAditionalFiles() + { + //RBuildCDFile livecdBootIni = new RBuildCDFile(); + + //livecdBootIni.Base = "boot\bootdata"; + //livecdBootIni.Name = "livecd.ini"; + //livecdBootIni.NewName = ""; + } + + protected override void WriteCabinetManager() + { + // Not required + } + + protected override void WriteMakeHive() + { + Makefile.WriteLine("\t$(ECHO_MKHIVE)"); + Makefile.WriteLine("\t$(mkhive_TARGET) boot\bootdata " + @"$(OUTPUT)\livecd\reactos\system32\config boot\bootdata\livecd.inf boot\bootdata\hiveinst.inf"); + } + + protected override void WriteCopyCDFiles() + { + foreach (RBuildOutputFile platformFile in SysGen.Project.Files) + { + if (platformFile is RBuildPlatformFile || platformFile is RBuildCDFile) + { + } + else + { + RBuildCDFile cdFile = new RBuildCDFile(); + + cdFile.Root = PathRoot.LiveCD; + cdFile.Name = platformFile.Name; + cdFile.Base = platformFile.InstallBase; + + Makefile.WriteLine("\t$(ECHO_CP)"); + Makefile.WriteLine("\t$(cp) " + ResolveRBuildFilePath(platformFile) + " " + ResolveRBuildFilePath(cdFile) + " 1>$(NUL)"); + } + } + + foreach (RBuildModule module in SysGen.Project.Modules) + { + if (module.IsInstallable) + { + RBuildCDFile cdFile = new RBuildCDFile(); + + cdFile.Root = PathRoot.LiveCD; + cdFile.Name = module.TargetFile.Name; + cdFile.Base = "reactos" + "//" + module.InstallBase; + + Makefile.WriteLine("\t$(ECHO_CP)"); + Makefile.WriteLine("\t$(cp) " + ResolveRBuildFilePath(module.TargetFile) + " " + ResolveRBuildFilePath(cdFile) + " 1>$(NUL)"); + } + } + + Makefile.WriteLine("\t$(ECHO_CP)"); + Makefile.WriteLine("\t${cp} " + @"boot\bootdata\livecd.ini $(OUTPUT)\livecd\freeldr.ini 1>$(NUL)"); + } + + public override RBuildFolder WorkingFolder + { + get { return new RBuildFolder(PathRoot.Output, "LiveCD"); } + } + + protected override string ResolveRBuildFilePath(RBuildFile file) + { + if (file.Root == PathRoot.CDOutput) + return Path.Combine(SysGen.LiveCDOutputDirectory, file.FullPath); + + return SysGen.ResolveRBuildFilePath(file); + } + } + + public class MingwLiveCDRegTestTargetHandler : MingwLiveCDTargetHandler + { + public MingwLiveCDRegTestTargetHandler(RBuildModule module) + : base(module) + { + } + public override RBuildFolder WorkingFolder + { + get { return new RBuildFolder(PathRoot.Output, "livecdregtest"); } + } + } + + public class MingwBootCDRegTestTargetHandler : MingwBootCDTargetHandler + { + public MingwBootCDRegTestTargetHandler(RBuildModule module) + : base(module) + { + } + + public override RBuildFolder WorkingFolder + { + get { return new RBuildFolder(PathRoot.Output , "cdregtest"); } + } + } + + public class MingwBootCDTargetHandler : MingwRBuildIsoModuleHandler + { + public MingwBootCDTargetHandler(RBuildModule module) + : base(module) + { + } + + protected override void WriteCopyCDFiles() + { + base.WriteCopyCDFiles(); + + foreach (RBuildModule module in SysGen.Project.Platform.Modules) + { + if ((module.Enabled) && (module.IsBootstrap)) + { + RBuildBootstrapFile bootstrapFile = module.Bootstrap; + + if (bootstrapFile != null) + { + Makefile.WriteLine("\t$(ECHO_CP)"); + Makefile.WriteLine("\t$(cp) " + ResolveRBuildFilePath(bootstrapFile) + " " + ResolveRBuildFilePath(bootstrapFile.CDNewFile) + " 1>$(NUL)"); + } + } + } + + foreach (RBuildOutputFile file in SysGen.Project.Files) + { + RBuildBootstrapFile bootstrapFile = file as RBuildBootstrapFile; + + if (bootstrapFile != null) + { + Makefile.WriteLine("\t$(ECHO_CP)"); + Makefile.WriteLine("\t$(cp) " + ResolveRBuildFilePath(bootstrapFile) + " " + ResolveRBuildFilePath(bootstrapFile.CDNewFile) + " 1>$(NUL)"); + } + } + } + + protected override void AddFolders() + { + //Ensure folder exists + base.AddFolders(); + + Module.Folders.Add(new RBuildFolder(WorkingFolder, "loader")); + Module.Folders.Add(new RBuildFolder(WorkingFolder, "reactos")); + Module.Folders.Add(new RBuildFolder(WorkingFolder, "reactos/system32")); + } + + protected override string ResolveRBuildFilePath(RBuildFile file) + { + if (file.Root == PathRoot.CDOutput) + return SysGen.NormalizePath(Path.Combine(SysGen.BootCDOutputDirectory, file.FullPath)); + + return SysGen.ResolveRBuildFilePath(file); + } + + public override RBuildFolder WorkingFolder + { + get { return new RBuildFolder(PathRoot.Output , "cd"); } + } + } + + public abstract class MingwRBuildIsoModuleHandler : MingwRBuildModuleHandler + { + private const string PROFILES_FOLDER = "Profiles"; + private const string ALL_USERS_FOLDER = "All Users"; + private const string DEFAULT_USER_FOLDER = "Default User"; + private const string DESKTOP_FOLDER = "Desktop"; + private const string MY_DOCUMENTS_FOLDER = "My Documents"; + + protected List m_BuildTools = new List(); + + public MingwRBuildIsoModuleHandler(RBuildModule module) + : base(module) + { + } + + protected List BuildTools + { + get { return m_BuildTools; } + } + + public override void GenerateMakeFile() + { + AddAditionalFiles(); + AddFolders(); + + WriteFolders(); + WriteTarget(); + WriteCabinetManager(); + WriteCopyCDFiles(); + WriteMakeRegistryHives(); + WriteMakeHive(); + WriteCDMake(); + WriteCleanTarget(); + } + + protected virtual void AddAditionalFiles() + { + } + + protected virtual void WriteMakeHive() + { + } + + protected virtual void AddFolders() + { + Module.Folders.Add(WorkingFolder); + } + + protected virtual void WriteTarget() + { + Makefile.WriteTarget(Module.MakeFileTargetMacro); + Makefile.WriteIndentedLine("all"); + Makefile.WriteIndentedLine("$(cabman_TARGET)"); + Makefile.WriteIndentedLine("$(cdmake_TARGET)"); + Makefile.WriteIndentedLine("$(mkhive_TARGET)"); + Makefile.WriteIndentedLine(Module.MakeFileFoldersMacro); + + foreach (RBuildModule module in SysGen.Project.Platform.Modules) + { + if ((module.Enabled) && (module.IsBootstrap)) + { + Makefile.WriteIndentedLine(module.MakeFileTargetMacro); + } + } + + Makefile.WriteIndentedLine(BootModule.MakeFileTargetMacro); + Makefile.WriteLine(); + } + + protected virtual void WriteMakeRegistryHives() + { + } + + protected virtual void WriteCabinetManager() + { + Makefile.WriteLine("\t$(ECHO_CABMAN)"); + Makefile.WriteLine("\t$(Q)$(cabman_TARGET) -C " + SysGen.Project.PackagesFile + @" -L $(OUTPUT)\cd\reactos -I -P $(OUTPUT)"); + Makefile.WriteLine("\t$(Q)$(cabman_TARGET) -C " + SysGen.Project.PackagesFile + @" -RC $(OUTPUT)\cd\reactos\reactos.inf -L $(OUTPUT)\cd\reactos -N -P $(OUTPUT)"); + Makefile.WriteLine("\t-@${rm} " + @"$(OUTPUT)\cd\reactos\reactos.inf" + " 2>$(NUL)"); + Makefile.WriteLine(); + } + + protected virtual void WriteCDMake() + { + Makefile.WriteLine("\t$(ECHO_CDMAKE)"); + Makefile.WriteLine("\t$(Q)$(cdmake_TARGET) -v -j -m -b " + ResolveRBuildFilePath(BootModule.TargetFile) + " " + ResolveRBuildFolderPath(WorkingFolder) + " " + CDLabel + " " + IsoImage); + Makefile.WriteLine(); + } + + protected virtual void WriteCopyCDFiles() + { + foreach (RBuildOutputFile file in SysGen.Project.Files) + { + RBuildCDFile cdFile = file as RBuildCDFile; + + if (cdFile != null) + { + Makefile.WriteLine("\t$(ECHO_CP)"); + Makefile.WriteLine("\t$(cp) " + ResolveRBuildFilePath(cdFile) + " " + ResolveRBuildFilePath(cdFile.CDNewFile) + " 1>$(NUL)"); + } + } + } + + protected virtual RBuildModule BootModule + { + get { return Module.BootSector; } + } + + public abstract RBuildFolder WorkingFolder { get; } + + public virtual string IsoImage + { + get { return ResolveRBuildFilePath(Module.TargetFile); } + } + + public virtual string CDLabel + { + get { return Module.CDLabel; } + } + + protected override bool CanCompile(RBuildSourceFile file) + { + return false; + } + + protected override void WriteFileBuildInstructions(SourceFile sourceFile) + { + throw new Exception("The method or operation is not implemented."); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/ProjectTreeReport/ProjectTreeReport.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/ProjectTreeReport/ProjectTreeReport.cs new file mode 100644 index 00000000000..3952090f289 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/ProjectTreeReport/ProjectTreeReport.cs @@ -0,0 +1,66 @@ +using System; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.BuildEngine.Backends; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public class ProjectTreeReport : Backend + { + public ProjectTreeReport(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "Tree Report"; } + } + + protected override void Generate() + { + using (StreamWriter sw = new StreamWriter(@"C:\resTree.htm")) + { + using (HtmlTextWriter writer = new HtmlTextWriter(sw)) + { + WriteModule(SysGen.RootTask , writer); + } + } + } + + private void WriteModule(Task task, HtmlTextWriter writer) + { + ITaskContainer container = task as ITaskContainer; + + writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "5"); + writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "5"); + writer.AddAttribute(HtmlTextWriterAttribute.Border, "1"); + writer.AddAttribute(HtmlTextWriterAttribute.Bordercolor, "#000000"); + writer.RenderBeginTag(HtmlTextWriterTag.Table); + writer.RenderBeginTag(HtmlTextWriterTag.Tr); + writer.RenderBeginTag(HtmlTextWriterTag.Td); + writer.Write(task.Name); + + if (container != null) + { + if (container.ChildTasks.Count > 0) + { + foreach (Task childTask in container.ChildTasks) + { + WriteModule(childTask, writer); + } + } + } + + writer.RenderEndTag(); + writer.RenderEndTag(); + writer.RenderEndTag(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/RBuildDB/RBuildDBBackend.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/RBuildDB/RBuildDBBackend.cs new file mode 100644 index 00000000000..032af573ba7 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/RBuildDB/RBuildDBBackend.cs @@ -0,0 +1,102 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.BuildEngine.Backends; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public class RBuildDBBackend : Backend + { + public RBuildDBBackend(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "RBuild Database"; } + } + + private string RBuildDBFile + { + get { return Path.Combine(SysGen.BaseDirectory, "rbuilddb.xml"); } + } + + protected override void Generate() + { + // Creates an XML file is not exist + using (XmlTextWriter writer = new XmlTextWriter(RBuildDBFile, Encoding.ASCII)) + { + writer.Indentation = 4; + writer.Formatting = Formatting.Indented; + + // Starts a new document + writer.WriteStartDocument(); + writer.WriteComment("File autogenerated by SysGen"); + writer.WriteStartElement("catalog"); + + writer.WriteStartElement("modules"); + foreach (RBuildModule module in Project.Modules) + { + writer.WriteStartElement("module"); + writer.WriteAttributeString("name", module.Name); + writer.WriteAttributeString("type", module.Type.ToString()); + writer.WriteAttributeString("base", module.Base); + writer.WriteAttributeString("desc", module.Description); + writer.WriteAttributeString("path", module.CatalogPath); + writer.WriteAttributeString("enabled", module.Enabled.ToString()); + + writer.WriteStartElement("libraries"); + + foreach (RBuildModule library in module.Libraries) + writer.WriteElementString("library", library.Name); + + writer.WriteEndElement(); + + writer.WriteStartElement("dependencies"); + + foreach (RBuildModule dependency in module.Dependencies) + writer.WriteElementString("dependency", dependency.Name); + + writer.WriteEndElement(); + + writer.WriteStartElement("requeriments"); + + foreach (RBuildModule requirement in module.Requeriments) + writer.WriteElementString("requires", requirement.Name); + + writer.WriteEndElement(); + + writer.WriteEndElement(); + } + writer.WriteEndElement(); + + writer.WriteStartElement("languages"); + foreach (RBuildLanguage language in Project.Languages) + { + writer.WriteStartElement("language"); + writer.WriteAttributeString("name", language.Name); + writer.WriteEndElement(); + } + writer.WriteEndElement(); + + writer.WriteStartElement("debugchannels"); + foreach (RBuildDebugChannel language in Project.DebugChannels) + { + writer.WriteStartElement("debugchannel"); + writer.WriteAttributeString("name", language.Name); + writer.WriteEndElement(); + } + writer.WriteEndElement(); + writer.WriteEndElement(); + + writer.WriteEndDocument(); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/RGenStats/RGenStatBackend.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/RGenStats/RGenStatBackend.cs new file mode 100644 index 00000000000..113f0fd290c --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/RGenStats/RGenStatBackend.cs @@ -0,0 +1,110 @@ +using System; +using System.Text.RegularExpressions; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Tasks; +using SysGen.BuildEngine.Backends; + +namespace SysGen.BuildEngine.Backends +{ + public class RGenStatBackend : Backend + { + public RGenStatBackend(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "RGenStat Report"; } + } + + protected override void Generate() + { + using (StreamWriter sw = new StreamWriter(Directory.GetCurrentDirectory() + "\\apistatus.lst")) + { + sw.WriteLine("; Format:"); + sw.WriteLine("; COMPONENT_NAME PATH_TO_COMPONENT_SOURCES"); + sw.WriteLine(); + sw.WriteLine("; Where:"); + sw.WriteLine("; COMPONENT_NAME - Name of the module. Eg. kernel32."); + sw.WriteLine("; PATH_TO_COMPONENT_SOURCES - Relative path to sources (relative to where rgenstat is run from)."); + sw.WriteLine(); + + foreach (RBuildModule module in Project.Modules) + { + if (module.Type == ModuleType.Kernel || + module.Type == ModuleType.KernelModeDLL || + module.Type == ModuleType.KernelModeDriver || + module.Type == ModuleType.StaticLibrary || + module.Type == ModuleType.ObjectLibrary || + module.Type == ModuleType.Win32DLL || + module.Type == ModuleType.Win32OCX || + module.Type == ModuleType.KeyboardLayout) + { + sw.WriteLine("{0} {1}", + module.Name, + module.BaseURI.ToString().Replace("\\", "/")); + } + } + } + + //using (StreamWriter sw = new StreamWriter(Directory.GetCurrentDirectory() + "\\descriptions.rbuild")) + //{ + // sw.WriteLine(""); + // sw.WriteLine(""); + // sw.WriteLine(""); + // sw.WriteLine(""); + + // foreach (RBuildModule module in Project.Modules) + // { + // if (module.Type == ModuleType.Kernel || + // module.Type == ModuleType.KernelModeDLL || + // module.Type == ModuleType.KernelModeDriver || + // module.Type == ModuleType.BootLoader || + // module.Type == ModuleType.BootProgram || + // module.Type == ModuleType.BootSector || + // module.Type == ModuleType.BuildTool || + // module.Type == ModuleType.Cabinet || + // module.Type == ModuleType.EmbeddedTypeLib || + // module.Type == ModuleType.HostStaticLibrary || + // module.Type == ModuleType.IdlHeader || + // module.Type == ModuleType.NativeCUI || + // module.Type == ModuleType.NativeDLL || + // module.Type == ModuleType.ObjectLibrary || + // module.Type == ModuleType.Package || + // module.Type == ModuleType.RpcClient || + // module.Type == ModuleType.RpcProxy || + // module.Type == ModuleType.RpcServer || + // module.Type == ModuleType.StaticLibrary || + // module.Type == ModuleType.Win32CUI || + // module.Type == ModuleType.Win32DLL || + // module.Type == ModuleType.Win32GUI || + // module.Type == ModuleType.Win32OCX || + // module.Type == ModuleType.Win32SCR || + // module.Type == ModuleType.KeyboardLayout) + + // { + // sw.WriteLine("", + // module.Name.ToUpper(), + // module.Name); + // } + // } + + // sw.WriteLine(""); + //} + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Backends/WarningReport/WarningReport.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/WarningReport/WarningReport.cs new file mode 100644 index 00000000000..5b48f103ae1 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Backends/WarningReport/WarningReport.cs @@ -0,0 +1,82 @@ +using System; +using System.Web.UI; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using SysGen.BuildEngine.Backends; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; + +namespace SysGen.BuildEngine.Backends +{ + public class WarningReport : Backend + { + public WarningReport(SysGenEngine sysgen) + : base(sysgen) + { + } + + protected override string FriendlyName + { + get { return "Warning report"; } + } + + protected override void Generate() + { + //using (StreamWriter sw = new StreamWriter(@"C:\roswarning.txt")) + //{ + // foreach (RBuildModule module in Project.Modules) + // { + // if (module.Unicode == false) + // { + // if ((module.Defines.ContainsKey("UNICODE")) || + // (module.Defines.ContainsKey("_UNICODE")) || + // (module.Defines.ContainsKey("_UNICODE_"))) + // { + // sw.WriteLine("- Module '{0}' has unicode defines but 'Unicode' property set to 'False'", module.Name); + // } + // } + + // foreach (KeyValuePair define in Project.Defines) + // { + // if (module.Defines.ContainsKey(define.Key)) + // { + // sw.WriteLine("- Module '{0}' already define '{1}' inherited from project ", module.Name, define.Key); + // } + // } + + // foreach (string flag in Project.CompilerFlags) + // { + // if (module.CompilerFlags.Contains(flag)) + // { + // sw.WriteLine("- Module '{0}' already has compiler flag '{1}' inherited from project ", module.Name, flag); + // } + // } + + // foreach (string flag in Project.LinkerFlags) + // { + // if (module.LinkerFlags.Contains(flag)) + // { + // sw.WriteLine("- Module '{0}' already has linker flag '{1}' inherited from project ", module.Name, flag); + // } + // } + + // foreach (RBuildFolder include in module.IncludeFolders) + // { + // if (Project.IncludeFolders.Contains(include)) + // { + // sw.WriteLine("- Module '{0}' already has include folder '{1}' inherited from project ", module.Name, include.RelativePath); + // } + + // if (SysGen.RBuildFolderExists(include) == false) + // { + // sw.WriteLine("- Module '{0}' includes folder '{1}' which could not be found ", module.Name, include.RelativePath); + // } + // } + // } + //} + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Collections/BackendCollection.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/BackendCollection.cs new file mode 100644 index 00000000000..c2df8997b68 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/BackendCollection.cs @@ -0,0 +1,22 @@ +using System; +using System; +using System.Collections; +using System.Collections.Generic; + +using SysGen.BuildEngine.Log; +using SysGen.BuildEngine.Backends; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine +{ + public sealed class BackendCollection : List + { + public void Generate() + { + foreach (Backend backend in this) + { + backend.Run(); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Collections/DefineCollection.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/DefineCollection.cs new file mode 100644 index 00000000000..e05ada2c171 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/DefineCollection.cs @@ -0,0 +1,23 @@ +using System; +using System; +using System.Collections; +using System.Collections.Generic; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine +{ + public class DefineCollection : Dictionary + { + public void Add(string name) + { + Add(name, string.Empty); + } + + public void Add(string name , string value) + { + if (!ContainsKey(name)) + base.Add(name, value); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Collections/FileHandlerCollection.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/FileHandlerCollection.cs new file mode 100644 index 00000000000..ec7b65a5c86 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/FileHandlerCollection.cs @@ -0,0 +1,24 @@ +using System; +using System; +using System.Collections; +using System.Collections.Generic; + +using SysGen.BuildEngine.Log; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine +{ + public sealed class FileHandlerCollection : List + { + public void ProcessFiles(RBuildPlatformFileCollection files) + { + foreach (RBuildFile file in files) + { + foreach (IFileHandler handler in this) + { + handler.Process(file); + } + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Collections/LogListenerCollection.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/LogListenerCollection.cs new file mode 100644 index 00000000000..7d907c3fe93 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/LogListenerCollection.cs @@ -0,0 +1,14 @@ +using System; +using System; +using System.Collections; +using System.Collections.Generic; + +using SysGen.BuildEngine.Log; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine +{ + public sealed class LogListenerCollection : List + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Collections/TaskBuilderCollection.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/TaskBuilderCollection.cs new file mode 100644 index 00000000000..386c0b04c24 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/TaskBuilderCollection.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace SysGen.BuildEngine +{ + public class TaskBuilderCollection : List + { + public bool Add(TaskBuilder builder) + { + // prevent adding duplicate builders with the same task name + if (FindBuilderForTask(builder.TaskName) == null) + { + base.Add(builder); + return true; + } + + return false; + } + + public TaskBuilder FindBuilderForTask(string taskName) + { + foreach (TaskBuilder builder in this) + { + if (builder.TaskName == taskName) + { + return builder; + } + } + return null; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Collections/TaskCollection.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/TaskCollection.cs new file mode 100644 index 00000000000..a10cf92f4f1 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Collections/TaskCollection.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace SysGen.BuildEngine +{ + public sealed class TaskCollection : List + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Elements/Base/Element.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Elements/Base/Element.cs new file mode 100644 index 00000000000..3de1765b291 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Elements/Base/Element.cs @@ -0,0 +1,306 @@ +using System; +using System.IO; +using System.Reflection; +using System.Xml; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Log; +using SysGen.BuildEngine.Attributes; +using SysGen.BuildEngine.Tasks; + +namespace SysGen.BuildEngine +{ + /// Models a NAnt XML element in the build file. + /// + /// Automatically validates attributes in the element based on Attribute settings in the derived class. + /// + public class Element : IElement + { + protected Location _location = Location.UnknownLocation; + protected SysGenEngine _sysgen = null; + protected RBuildProject _project = null; + protected XmlNode _xmlNode = null; + protected IElement _parent = null; + protected bool m_FailOnMissingRequired = true; + + /// + /// The default contstructor. + /// + public Element() + { + } + + /// A copy contstructor. + protected Element(Element element) : this() + { + _location = element._location; + _sysgen = element._sysgen; + _xmlNode = element._xmlNode; + } + + /// in the build file where the element is defined. + protected virtual Location Location { + get { return _location; } + set { _location = value; } + } + + /// + /// The Parent object. This will be your parent Task, Target, or Project depeding on where the element is defined. + /// + public IElement Parent { get { return _parent; } set { _parent = value; } } + + /// Name of the XML element used to initialize this element. + public virtual string Name + { + get { + ElementNameAttribute elementNameAttribute = (ElementNameAttribute) + Attribute.GetCustomAttribute(GetType(), typeof(ElementNameAttribute)); + + string name = null; + if (elementNameAttribute != null) { + name = elementNameAttribute.Name; + } + return name; + } + } + + /// + /// The this element belongs to. + /// + public virtual SysGenEngine SysGen + { + get { return _sysgen; } + set { _sysgen = value; } + } + + public RBuildProject Project + { + get { return _project; } + set { _project = value; } + } + + public RBuildModule Module + { + get + { + RBuildModule module = RBuildElement as RBuildModule; + + if (module == null) + throw new BuildException(String.Format("Task <{0} ... \\> is not child of any ModuleTask." , Name), Location); + + return module; + } + } + + /// + /// this element belongs to. + /// + public virtual RBuildElement RBuildElement + { + get + { + IElement element = this; + while (element != null) + { + if (element is ISysGenObject) + return ((ISysGenObject)element).RBuildElement; + + //Set to his parent + element = element.Parent; + } + + return SysGen.Project; + } + } + + public string BaseBuildLocation + { + get { return Path.GetDirectoryName(new Uri(_xmlNode.BaseURI).LocalPath); } + } + + public XmlNode XmlNode + { + get { return _xmlNode; } + } + + /// + /// Initializes all build attributes. + /// + private void InitializeProperties(XmlNode elementNode) + { + // Get the current element Type + Type currentType = GetType(); + + PropertyInfo[] propertyInfoArray = currentType.GetProperties(BindingFlags.Public|BindingFlags.Instance); + foreach (PropertyInfo propertyInfo in propertyInfoArray ) + { + // process all TaskPropertyAttribute attributes + TaskPropertyAttribute[] propertyAttributes = (TaskPropertyAttribute[]) + Attribute.GetCustomAttributes(propertyInfo, typeof(TaskPropertyAttribute) , false); + + foreach(TaskPropertyAttribute propertyAttribute in propertyAttributes) + { + string propertyValue = null; + + if (propertyAttribute.Location == TaskPropertyLocation.Attribute) + { + if (elementNode.Attributes[propertyAttribute.Name] != null) + { + propertyValue = elementNode.Attributes[propertyAttribute.Name].Value; + } + } + else if (propertyAttribute.Location == TaskPropertyLocation.Node) + { + propertyValue = elementNode.InnerText; + } + + // check if its required + if (propertyValue == null && propertyAttribute.Required && m_FailOnMissingRequired) + { + throw new BuildException(String.Format("'{0}' is a required '{1}' of <{2} ... \\>.", propertyAttribute.Name, propertyAttribute.Location , Name), Location); + } + + if (propertyValue != null) + { + //string attrValue = attributeNode.Value; + if (propertyAttribute.ExpandProperties) + { + // expand attribute properites + propertyValue = SysGen.ExpandProperties(propertyValue); + } + + if (propertyInfo.CanWrite) + { + // set the property value instead + MethodInfo info = propertyInfo.GetSetMethod(); + object[] paramaters = new object[1]; + + Type propertyType = propertyInfo.PropertyType; + + // If the object is an emum + if (propertyType.IsSubclassOf(typeof(System.Enum))) + { + try + { + paramaters[0] = Enum.Parse(propertyType, propertyValue, true); + } + catch (Exception) + { + // catch type conversion exceptions here + string message = string.Format("Invalid value '{0}'. Valid values for this attribute are:\n", propertyValue); + foreach (object value in Enum.GetValues(propertyType)) + { + message += string.Format("\t{0}\n", value.ToString()); + } + throw new BuildException(message, Location); + } + } + else + { + //validate attribute value with custom ValidatorAttribute(ors) + ValidatorAttribute[] validateAttributes = (ValidatorAttribute[]) + Attribute.GetCustomAttributes(propertyInfo, typeof(ValidatorAttribute)); + try + { + foreach (ValidatorAttribute validator in validateAttributes) + validator.Validate(propertyValue); + } + catch (ValidationException ve) + { + throw new ValidationException(ve.Message, Location); + } + + if (propertyType == typeof(System.Boolean)) + { + paramaters[0] = Convert.ChangeType(SysGenConversion.ToBolean(propertyValue), propertyInfo.PropertyType); + } + else + { + paramaters[0] = Convert.ChangeType(propertyValue, propertyInfo.PropertyType); + } + } + + info.Invoke(this, paramaters); + } + else + { + new BuildException(string.Format("Property '{0}' was found but '{1}' does no implement Set", propertyAttribute.Name, Name)); + } + } + } + + // now do nested BuildElements + BuildElementAttribute buildElementAttribute = (BuildElementAttribute) + Attribute.GetCustomAttribute(propertyInfo, typeof(BuildElementAttribute)); + + if (buildElementAttribute != null) + { + // get value from xml node + XmlNode nestedElementNode = elementNode[buildElementAttribute.Name, elementNode.OwnerDocument.DocumentElement.NamespaceURI]; + // check if its required + if (nestedElementNode == null && buildElementAttribute.Required) { + throw new BuildException(String.Format("'{0}' is a required element of <{1} ...//>.", buildElementAttribute.Name, this.Name), Location); + } + if (nestedElementNode != null) { + Element childElement = (Element)propertyInfo.GetValue(this, null); + // Sanity check: Ensure property wasn't null. + if ( childElement == null ) + throw new BuildException(String.Format("Property '{0}' value cannot be null for <{1} ...//>", propertyInfo.Name, this.Name), Location); + childElement.SysGen = SysGen; + childElement.Initialize(nestedElementNode); + } + } + } + } + + /// Performs default initialization. + /// + /// Derived classes that wish to add custom initialization should override . + /// + public void Initialize(XmlNode elementNode) + { + if (SysGen == null) + throw new InvalidOperationException("Element has invalid BuildFileLoader property."); + + // Save the element node + _xmlNode = elementNode; + + // Save position in buildfile for reporting useful error messages. + try + { + _location = SysGen.LocationMap.GetLocation(elementNode); + } + catch(ArgumentException ae) + { + BuildLog.WriteLineIf(SysGen.Verbose, ae.ToString()); + } + + InitializeProperties(elementNode); + + OnInit(); + + // Allow inherited classes a chance to do some custom initialization. + InitializeElement(elementNode); + + // The Element has been completly initialized + OnLoad(); + } + + /// + /// Allows derived classes to provide extra initialization and validation not covered by the base class. + /// + /// The xml node of the element to use for initialization. + protected virtual void InitializeElement(XmlNode elementNode) + { + } + + protected virtual void OnLoad() + { + } + + protected virtual void OnInit() + { + } + + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Exceptions/BuildException.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Exceptions/BuildException.cs new file mode 100644 index 00000000000..b8b422221be --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Exceptions/BuildException.cs @@ -0,0 +1,101 @@ +using System; +using System.Runtime.Serialization; + +namespace SysGen.BuildEngine +{ + /// + /// Thrown whenever an error occurs during the build. + /// + [Serializable] + public class BuildException : ApplicationException + { + private Location _location = Location.UnknownLocation; + + /// + /// Constructs a build exception with no descriptive information. + /// + public BuildException() : base() { + } + + public BuildException(String message, params object[] args) + : base(string.Format(message, args)) + { + } + + /// + /// Constructs an exception with a descriptive message. + /// + public BuildException(String message) : base(message) { + } + + /// + /// Constructs an exception with a descriptive message and an + /// instance of the Exception that is the cause of the current Exception. + /// + public BuildException(Exception e, String message) : base(message, e) { + } + + /// + /// Constructs an exception with a descriptive message and an + /// instance of the Exception that is the cause of the current Exception. + /// + public BuildException(Exception e, String message,params object[] args) + : base(string.Format(message , args), e) + { + } + + /// + /// Constructs an exception with a descriptive message and location + /// in the build file that caused the exception. + /// + /// The error message that explains the reason for the exception. + /// Location in the build file where the exception occured. + public BuildException(String message, Location location) : base(message) { + _location = location; + } + + /// + /// Constructs an exception with the given descriptive message, the + /// location in the build file and an instance of the Exception that + /// is the cause of the current Exception. + /// + /// The error message that explains the reason for the exception. + /// Location in the build file where the exception occured. + /// An instance of Exception that is the cause of the current Exception. + public BuildException(String message, Location location, Exception e) : base(message, e) { + _location = location; + } + + /// Initializes a new instance of the BuildException class with serialized data. + public BuildException(SerializationInfo info, StreamingContext context) : base(info, context) { + /* + string fileName = info.GetString("Location.FileName"); + int lineNumber = info.GetInt32("Location.LineNumber"); + int columnNumber = info.GetInt32("Location.ColumnNumber"); + */ + _location = info.GetValue("Location", _location.GetType()) as Location; + } + + /// Sets the SerializationInfo object with information about the exception. + /// The object that holds the serialized object data. + /// The contextual information about the source or destination. + /// For more information, see SerializationInfo in the Microsoft documentation. + public override void GetObjectData(SerializationInfo info, StreamingContext context) { + base.GetObjectData(info, context); + info.AddValue("Location", _location); + } + + public override string Message { + get { + string message = base.Message; + + // only include location string if not empty + string locationString = _location.ToString(); + if (locationString != String.Empty) { + message = locationString + "\n " + message; + } + return message; + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Exceptions/ValidationException.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Exceptions/ValidationException.cs new file mode 100644 index 00000000000..0150c5c79f0 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Exceptions/ValidationException.cs @@ -0,0 +1,62 @@ +using System; +using System.Runtime.Serialization; + +namespace SysGen.BuildEngine +{ + /// + /// This exception indicates that an error has occured while performing a validate operation. + /// The ValidationEventHandler can cause this exception to be thrown during the validate operations + /// + [Serializable] + public class ValidationException : BuildException + { + /// + /// Constructs a build exception with no descriptive information. + /// + public ValidationException() : base() {} + + /// + /// Constructs an exception with a descriptive message. + /// + public ValidationException(String message) : base(message) {} + + /// + /// Constructs an exception with a descriptive message and an + /// instance of the Exception that is the cause of the current Exception. + /// + public ValidationException(String message, Exception e) : base(e, message) {} + + /// + /// Constructs an exception with a descriptive message and location + /// in the build file that caused the exception. + /// + /// The error message that explains the reason for the exception. + /// Location in the build file where the exception occured. + public ValidationException(String message, Location location) : base(message, location) {} + + /// + /// Constructs an exception with the given descriptive message, the + /// location in the build file and an instance of the Exception that + /// is the cause of the current Exception. + /// + /// The error message that explains the reason for the exception. + /// Location in the build file where the exception occured. + /// An instance of Exception that is the cause of the current Exception. + public ValidationException(String message, Location location, Exception e) : base(message, location, e) {} + + /// Initializes a new instance of the ValidationException class with serialized data. + public ValidationException(SerializationInfo info, StreamingContext context) : base(info, context) {} + + /// Sets the SerializationInfo object with information about the exception. + /// The object that holds the serialized object data. + /// The contextual information about the source or destination. + /// For more information, see SerializationInfo in the Microsoft documentation. + public override void GetObjectData(SerializationInfo info, StreamingContext context) {} + + public override string Message { + get { + return base.Message; + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedCFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedCFileWriter.cs new file mode 100644 index 00000000000..9f37bd4c0e5 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedCFileWriter.cs @@ -0,0 +1,30 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.BuildEngine.Framework; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public abstract class AutoGeneratedCFileWriter : AutoGeneratedFileWriter + { + public AutoGeneratedCFileWriter(RBuildModule module, string file) + : base(module , file) + { + } + + protected virtual void WriteHeader() + { + WriteLine("/* This file is automatically generated. */"); + WriteLine(); + } + + protected virtual void WriteFooter() + { + WriteLine("/* EOF */"); + WriteLine(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedFileWriter.cs new file mode 100644 index 00000000000..02a03e04fe3 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedFileWriter.cs @@ -0,0 +1,39 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public abstract class AutoGeneratedFileWriter : StreamWriter + { + RBuildProject m_Project = null; + RBuildModule m_Module = null; + + public AutoGeneratedFileWriter(RBuildProject project, string file) + : base(file) + { + m_Project = project; + } + + public AutoGeneratedFileWriter(RBuildModule module, string file) + : base(file) + { + m_Module = module; + } + + protected RBuildProject Project + { + get { return m_Project; } + } + + protected RBuildModule Module + { + get { return m_Module; } + } + + public abstract void WriteFile(); + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedInfFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedInfFileWriter.cs new file mode 100644 index 00000000000..93135c8771b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/Base/AutoGeneratedInfFileWriter.cs @@ -0,0 +1,54 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public abstract class AutoGeneratedInfFileWriter : AutoGeneratedFileWriter + { + public AutoGeneratedInfFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + protected virtual void WriteHeader() + { + WriteSection("Version"); + WriteLine("Signature = \"$Windows NT$\""); + WriteLine("ClassGUID = {00000000-0000-0000-0000-000000000000}"); + WriteLine(); + } + + protected void WriteSection(string sectionName) + { + WriteLine("[{0}]", sectionName); + } + + protected void WriteComment (string comment) + { + WriteLine("; {0}", comment); + } + + protected void WriteAssignment(string name , string value) + { + WriteLine("{0} = {1}", + name , + value); + } + + protected void WriteBooleanAssignment(string name, bool value) + { + if (value) + { + WriteAssignment(name, "yes"); + } + else + { + WriteAssignment(name, "no"); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/BuildNumberFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/BuildNumberFileWriter.cs new file mode 100644 index 00000000000..330c9162ded --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/BuildNumberFileWriter.cs @@ -0,0 +1,45 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.Framework; +using SysGen.RBuild.Framework; + +namespace SysGen.Framework +{ + public class BuildNumberFileWriter : AutoGeneratedCFileWriter + { + public BuildNumberFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteHeader(); + WriteCompilationUnit(); + WriteFooter(); + } + + private void WriteBuildNumber() + { + WriteLine("#ifndef _INC_REACTOS_BUILDNO"); + WriteLine("#define _INC_REACTOS_BUILDNO"); + WriteLine("#define KERNEL_VERSION_BUILD 20080427"); + WriteLine("#define KERNEL_VERSION_BUILD_HEX 0x8187"); + WriteLine("#define KERNEL_VERSION_BUILD_STR \"20080427-r33159\""); + WriteLine("#define KERNEL_VERSION_BUILD_RC \"20080427-r33159\0\""); + WriteLine("#define KERNEL_RELEASE_RC \"0.4-SVN\0\""); + WriteLine("#define KERNEL_RELEASE_STR \"0.4-SVN\""); + WriteLine("#define KERNEL_VERSION_RC \"0.4-SVN\0\""); + WriteLine("#define KERNEL_VERSION_STR \"0.4-SVN\""); + WriteLine("#define REACTOS_DLL_VERSION_MAJOR 42"); + WriteLine("#define REACTOS_DLL_RELEASE_RC \"42.4-SVN\0\""); + WriteLine("#define REACTOS_DLL_RELEASE_STR \"42.4-SVN\""); + WriteLine("#define REACTOS_DLL_VERSION_RC \"42.4-SVN\0\""); + WriteLine("#define REACTOS_DLL_VERSION_STR \"42.4-SVN\""); + WriteLine("#endif"); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/CompilationUnitFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/CompilationUnitFileWriter.cs new file mode 100644 index 00000000000..e0dd0063b8c --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/CompilationUnitFileWriter.cs @@ -0,0 +1,42 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class CompilationUnitFileWriter : AutoGeneratedCFileWriter + { + private RBuildCompilationUnitFile m_CompilationUnit = null; + + public CompilationUnitFileWriter(RBuildModule module, RBuildCompilationUnitFile unit , string file) + : base(module , file) + { + m_CompilationUnit = unit; + } + + protected override void WriteHeader() + { + base.WriteHeader(); + + WriteLine("#define ONE_COMPILATION_UNIT"); + WriteLine(); + } + + public override void WriteFile() + { + WriteHeader(); + WriteCompilationUnit(); + } + + private void WriteCompilationUnit() + { + foreach (RBuildSourceFile file in m_CompilationUnit.SourceFiles) + { + WriteLine("#include <{0}>", file.FullPath); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/DefinitionFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/DefinitionFileWriter.cs new file mode 100644 index 00000000000..d0d11a5073b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/DefinitionFileWriter.cs @@ -0,0 +1,21 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class DefinitionFileWriter : AutoGeneratedFileWriter + { + public DefinitionFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/DffFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/DffFileWriter.cs new file mode 100644 index 00000000000..ce146aca3bf --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/DffFileWriter.cs @@ -0,0 +1,139 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class DffFileWriter : AutoGeneratedFileWriter + { + public DffFileWriter(RBuildProject project , string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteHeader(); + WriteModuleTargets(); + } + + protected void WriteHeader() + { + WriteLine("; Main ReactOS package"); + WriteLine(); + WriteLine(".Set DiskLabelTemplate=\"ReactOS\" ; Label of disk"); + WriteLine(".Set CabinetNameTemplate=\"reactos.cab\" ; reactos.cab"); + WriteLine(".Set InfFileName=\"reactos.inf\" ; reactos.inf"); + WriteLine(); + WriteLine(";.Set Cabinet=on"); + WriteLine(";.Set Compress=on"); + WriteLine(); + WriteLine(".InfBegin"); + WriteLine("[Version]"); + WriteLine("Signature = \"$ReactOS$\""); + WriteLine(); + WriteLine("[Directories]"); + + foreach (RBuildInstallFolder folder in Project.InstallFolders) + { + if (folder.Name == string.Empty || + folder.Name == ".") + { + WriteLine("{0} =", + folder.ID); + } + else + WriteLine("{0} = {1}", + folder.ID, + folder.Name); + } + + WriteLine(".InfEnd"); + WriteLine(); + WriteLine("; Contents of disk"); + WriteLine(".InfBegin"); + WriteLine("[SourceFiles]"); + WriteLine(".InfEnd"); + } + + protected void WriteModuleTargets() + { + RBuildInstallFolder installFolder = null; + + WriteLine(); + WriteLine(";Module targets"); + WriteLine(); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Enabled) + { + if ((module.IsInstallable) && (module.HasInstallBase)) + { + if ((!module.IsBootstrap || module.IsSpecialIncludedBootStrap) && !module.IsSpecialExcludedBootStrap) + { + //Get the install folder + installFolder = Project.InstallFolders.GetByName(module.InstallBase); + + if (installFolder == null) + throw new BuildException("InstallBase '{0}' for module '{1}' references a non existant install folder", + module.InstallBase, + module.Name); + + WriteLine("{0,-90}\t{1,10}", + module.TargetFile.FullPath, + installFolder.ID); + } + } + + foreach (RBuildOutputFile file in module.Files) + { + RBuildPlatformFile platformFile = file as RBuildPlatformFile; + + if (platformFile != null) + { + //Get the install folder + installFolder = Project.InstallFolders.GetByName(file.InstallBase); + + if (installFolder == null) + throw new BuildException("InstallBase '{0}' for file '{1}' references a non existant install folder", + platformFile.InstallBase, + platformFile.FullPath); + + WriteLine("{0,-90}\t{1,10}", + platformFile.FullPath, + installFolder.ID); + } + } + } + } + + WriteLine(); + WriteLine(";Install files"); + WriteLine(); + + foreach (RBuildOutputFile file in Project.Files) + { + RBuildPlatformFile platformFile = file as RBuildPlatformFile; + + if (platformFile != null) + { + //Get the install folder + installFolder = Project.InstallFolders.GetByName(file.InstallBase); + + if (installFolder == null) + throw new BuildException("InstallBase '{0}' for file '{1}' references a non existant install folder", + platformFile.InstallBase, + platformFile.FullPath); + + WriteLine("{0,-90}\t{1,10}", + platformFile.FullPath, + installFolder.ID); + } + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/HeaderCreditsFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/HeaderCreditsFileWriter.cs new file mode 100644 index 00000000000..aa453d2ec5f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/HeaderCreditsFileWriter.cs @@ -0,0 +1,36 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class HeaderCreditsFileWriter : AutoGeneratedFileWriter + { + public HeaderCreditsFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteLine("/* This file is autogenerated */"); + WriteLine(); + WriteLine("const char* szAutoContributors[]="); + WriteLine("{"); + + foreach (RBuildContributor contributor in Project.Contributors) + { + WriteLine("\t\t{0},", contributor.FullName); + } + + WriteLine("\t0"); + WriteLine("};"); + + // Adds a blank line + WriteLine(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/HeaderRosCfgFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/HeaderRosCfgFileWriter.cs new file mode 100644 index 00000000000..5f9a2693b60 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/HeaderRosCfgFileWriter.cs @@ -0,0 +1,26 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class HeaderRosCfgFileWriter : AutoGeneratedFileWriter + { + public HeaderRosCfgFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteLine("/* This file is autogenerated */"); + WriteLine(); + + // Adds a blank line + WriteLine(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/SysSetupComponentSetupFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/SysSetupComponentSetupFileWriter.cs new file mode 100644 index 00000000000..f3eaa983bdb --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/SysSetupComponentSetupFileWriter.cs @@ -0,0 +1,84 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public abstract class SysSetupComponentSetupFileWriter : AutoGeneratedInfFileWriter + { + public SysSetupComponentSetupFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + protected virtual void WriteHeader() + { + WriteSection("Version"); + WriteLine("Signature = \"$Windows NT$\""); + WriteLine(); + } + + protected virtual void WriteaAddRegDirective() + { + WriteSection("DefaultInstall"); + WriteLine("AddReg=Install.Reg"); + WriteLine(); + } + + public override void WriteFile() + { + WriteHeader(); + WriteaAddRegDirective(); + WriteContent(); + } + + protected abstract void WriteContent(); + } + + public class DesktopComponentSetupFileWriter : SysSetupComponentSetupFileWriter + { + public DesktopComponentSetupFileWriter(RBuildProject project, string file) + : base(project, file) + { + } + + protected override void WriteContent() + { + WriteLine("[Install.Reg]"); + + if (Project.Platform.Screensaver != null) + { + WriteLine("HKU,\"Control Panel\\Desktop\",\"1SCRNSAVE.EXE\",0x00000000,\"{0}\"", + Project.Platform.Screensaver.PlatformInstall.FullPath); + } + + if (Project.Platform.Wallpaper != null) + { + WriteLine("HKU,\"Control Panel\\Desktop\",\"1Wallpaper\",0x00000000,\"{0}\"", + Project.Platform.Wallpaper.PlatformInstall.FullPath); + } + } + } + + public class ShellComponentSetupFileWriter : SysSetupComponentSetupFileWriter + { + public ShellComponentSetupFileWriter(RBuildProject project, string file) + : base(project, file) + { + } + + protected override void WriteContent() + { + WriteLine("[Install.Reg]"); + + if (Project.Platform.Shell != null) + { + WriteLine("HKLM,\"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\\",\"Shell\",0x00020000,\"{0}\"", + Project.Platform.Shell.PlatformInstall.FullPath); + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/SysSetupFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/SysSetupFileWriter.cs new file mode 100644 index 00000000000..e18646da744 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/SysSetupFileWriter.cs @@ -0,0 +1,92 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class SysSetupFileWriter : AutoGeneratedInfFileWriter + { + public SysSetupFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteHeader(); + WriteInfDevicesSection(); + WriteInfRegistrationPhase2Section(); + WriteInfOleControlDllsSection(); + WriteInfAlwaysSection(); + } + + protected void WriteInfDevicesSection() + { + WriteLine("[DeviceInfsToInstall]"); + WriteLine("cdrom.inf"); + WriteLine("display.inf"); + WriteLine("hdc.inf"); + WriteLine("keyboard.inf"); + WriteLine("machine.inf"); + WriteLine("msmouse.inf"); + WriteLine("NET_NIC.inf"); + WriteLine("ports.inf"); + WriteLine("scsi.inf"); + WriteLine("usbport.inf"); + WriteLine(); + } + + protected void WriteInfRegistrationPhase2Section() + { + WriteLine("[RegistrationPhase2]"); + WriteLine("RegisterDlls=OleControlDlls"); + WriteLine(); + } + + protected void WriteInfOleControlDllsSection() + { + WriteLine("[OleControlDlls]"); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.AutoRegister != null) + { + WriteLine("{0},,{1},{2}", + "11", + module.TargetName, + module.AutoRegister.RegistrationType); + } + } + WriteLine(); + } + + protected void WriteInfAlwaysSection() + { + WriteLine("[Infs.Always]"); + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Setup != null) + { + WriteLine("{0},{1}", + module.Setup.Name, + module.Setup.InstallSection); + } + } + + foreach (RBuildOutputFile file in Project.Files) + { + RBuildSetupFile setup = file as RBuildSetupFile; + + if (setup != null) + { + WriteLine("{0},{1}", + setup.Name, + setup.InstallSection); + } + } + WriteLine(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtCreditsFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtCreditsFileWriter.cs new file mode 100644 index 00000000000..280bdba0074 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtCreditsFileWriter.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class TxtCreditsFileWriter : AutoGeneratedFileWriter + { + public TxtCreditsFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteLine("ReactOS is available thanks to the work of:"); + WriteLine(); + + foreach (RBuildContributor contributor in Project.Contributors) + { + if (contributor.HasAlias) + { + WriteLine("\t{0} ({1})", + contributor.FullName, + contributor.Alias); + } + else + { + WriteLine("\t{0}", contributor.FullName); + } + + if (contributor.HasMail) + { + WriteLine("\t\t{0}", contributor.Mail); + } + + if (contributor.HasLocation) + { + WriteLine("\t\t{0}, {1}", + contributor.City , + contributor.Country); + } + + // Adds a blank line + WriteLine(); + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtSetupFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtSetupFileWriter.cs new file mode 100644 index 00000000000..f1f55d52d56 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtSetupFileWriter.cs @@ -0,0 +1,137 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class TxtSetupFileWriter : AutoGeneratedInfFileWriter + { + public TxtSetupFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteHeader(); + WriteDirectories(); + WriteSourceDiskDiles(); + WriteLanguages(); + WriteKeyboardLayouts(); + WriteKeyboardLayoutFiles(); + WriteRegistryInstall(); + } + + protected override void WriteHeader() + { + WriteSection("Version"); + WriteLine("Signature = \"$ReactOS$\""); + WriteLine(); + } + + public void WriteDirectories() + { + WriteLine("[Directories]"); + WriteLine("; = "); + + foreach (RBuildInstallFolder folder in Project.InstallFolders) + { + WriteLine("{0} = {1}", + folder.ID, + folder.Name); + } + } + + public void WriteSourceDiskDiles() + { + RBuildInstallFolder installFolder = null; + + WriteLine("[SourceDisksFiles]"); + + foreach (RBuildModule module in Project.Modules) + { + if (module.Bootstrap != null) + { + if (module.Type == ModuleType.KernelModeDriver || + module.Type == ModuleType.KernelModeDLL) + { + //Get the install folder + installFolder = Project.InstallFolders.GetByName(module.InstallBase); + + if (installFolder == null) + throw new BuildException("InstallBase '{0}' for module '{1}' references a non existant install folder", + module.InstallBase, + module.Name); + + WriteLine("{0,-50}\t{1,50}", + module.TargetFile.FullPath, + installFolder.ID); + } + } + } + + WriteLine(); + } + + protected void WriteLanguages() + { + WriteSection("Languages"); + + foreach (RBuildLanguage language in Project.Platform.Languages) + { + WriteLine("{0} = \"{1}\"", + language.LCID, + language.Name); + } + + WriteLine(); + } + + protected void WriteKeyboardLayouts() + { + WriteSection("KeyboardLayout"); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.KeyboardLayout) + { + WriteLine("{0} = \"{1}\"", + module.LCID , + module.Description); + } + } + + WriteLine(); + } + + protected void WriteKeyboardLayoutFiles() + { + WriteSection("Files.KeyboardLayout"); + + foreach (RBuildModule module in Project.Platform.Modules) + { + if (module.Type == ModuleType.KeyboardLayout) + { + WriteLine("{0} = {1}", + module.LCID, + module.TargetName); + } + } + + WriteLine(); + } + + protected void WriteRegistryInstall() + { + WriteLine("[HiveInfs.Install]"); + WriteLine("AddReg=hivecls.inf,AddReg"); + WriteLine("AddReg=hivedef.inf,AddReg"); + WriteLine("AddReg=hivesft.inf,AddReg"); + WriteLine("AddReg=hivesys.inf,AddReg"); + WriteLine(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtSetupHiveFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtSetupHiveFileWriter.cs new file mode 100644 index 00000000000..2a510834d9f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/TxtSetupHiveFileWriter.cs @@ -0,0 +1,59 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class TxtSetupHiveFileWriter : AutoGeneratedInfFileWriter + { + public TxtSetupHiveFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteHeader(); + WriteDirectories(); + } + + protected override void WriteHeader() + { + WriteSection("Version"); + WriteLine("Signature = \"$ReactOS$\""); + WriteLine(); + } + + public void WriteDirectories() + { + WriteLine("[AddReg]"); + + if (Project.Platform.Shell != null) + { + WriteLine("HKLM,\"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\\",\"Shell\",0x00020000,\"{0}\"", + Project.Platform.Shell.PlatformInstall.FullPath); + } + + if (Project.Platform.Screensaver != null) + { + WriteLine("HKCU,\"Control Panel\\Desktop\",\"SCRNSAVE.EXE\",0x00000000,\"{0}\"", + Project.Platform.Screensaver.PlatformInstall.FullPath); + } + + if (Project.Platform.Wallpaper != null) + { + WriteLine("HKCU,\"Control Panel\\Desktop\",\"Wallpaper\",0x00000000,\"{0}\"", + Project.Platform.Wallpaper.PlatformInstall.FullPath); + } + + if (Project.Platform.DebugChannels.Count > 0) + { + WriteLine("HKCU,\"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\",\"DEBUGCHANNEL\",0x00020000,\"{0}\"", + Project.Platform.DebugChannels.Text); + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/UnAttendSetupFileWriter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/UnAttendSetupFileWriter.cs new file mode 100644 index 00000000000..7f6ae75f7e4 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/FileWriters/UnAttendSetupFileWriter.cs @@ -0,0 +1,46 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Framework +{ + public class UnAttendSetupFileWriter : AutoGeneratedInfFileWriter + { + public UnAttendSetupFileWriter(RBuildProject project, string file) + : base(project , file) + { + } + + public override void WriteFile() + { + WriteHeader(); + WriteUnAttendFile(); + } + + protected override void WriteHeader() + { + WriteSection("Unattend"); + WriteLine("Signature = \"$ReactOS$\""); + WriteLine(); + } + + protected void WriteUnAttendFile() + { + WriteBooleanAssignment("UnattendSetupEnabled", false); + WriteAssignment("DestinationDiskNumber", "0"); + WriteAssignment("DestinationPartitionNumber", "1"); + WriteAssignment("MBRInstallType", "2"); + WriteAssignment("FullName", "MyName"); + WriteAssignment("OrgName", "MyOrg"); + WriteAssignment("ComputerName", "MyComputer"); + WriteAssignment("AdminPassword", "MyPassword"); + WriteAssignment("TimeZoneIndex", "85"); + WriteAssignment("FormatPartition", "1"); + WriteAssignment("AutoPartition", "1"); + WriteAssignment("DisableVmwInst", "1"); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Handlers/SysSetupFileHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Handlers/SysSetupFileHandler.cs new file mode 100644 index 00000000000..0ae911e0fc6 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Handlers/SysSetupFileHandler.cs @@ -0,0 +1,138 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +using SysGen.BuildEngine; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Handlers +{ + public abstract class AutoGeneratedFileHandler : IFileHandler + { + protected SysGenEngine m_SysGenEngine = null; + protected RBuildFile m_OriginalFile = null; + protected RBuildFile m_DestFile = null; + + public AutoGeneratedFileHandler(SysGenEngine engine) + { + m_SysGenEngine = engine; + } + + public void Process(RBuildFile file) + { + m_OriginalFile = file; + + if (file.Name == FileName) + { + // Set the generated file to the temporary path + m_DestFile = new RBuildFile(); + m_DestFile.Root = PathRoot.Intermediate; + m_DestFile.Base = file.Base; + m_DestFile.Name = file.Name; + + // Auto generate this file + AutoGenerate(); + + file = m_DestFile; + } + } + + protected abstract void AutoGenerate(); + + protected abstract string FileName { get; } + } + + public class HiveAutoGeneratedFileHandler : AutoGeneratedFileHandler + { + public HiveAutoGeneratedFileHandler(SysGenEngine engine) + : base(engine) + { + } + + protected override string FileName + { + get { return "hivedef.inf"; } + } + + protected override void AutoGenerate() + { + File.Copy( + m_SysGenEngine.ResolveRBuildFilePath(m_OriginalFile), + m_SysGenEngine.ResolveRBuildFilePath(m_DestFile)); + + File.WriteAllText (m_SysGenEngine.ResolveRBuildFilePath(m_DestFile) , + "; Set default wallpaper\n" + + "HKCU,\"Control Panel\\Desktop\",\"Wallpaper\",0000000000,\"%SystemRoot%\\Green.bmp\"" + + "HKCU,\"Control Panel\\Desktop\",\"WallpaperStyle\",0x00000002,0x00000000\n" + + "HKCU,\"Control Panel\\Desktop\",\"TileWallpaper\",0x00000002,0x00000000\n"); + + } + } + + public class AutorunFileHandler : IFileHandler + { + public void Process(RBuildFile file) + { + if (file.Name == "autorun.inf") + { + int i = 0; + } + } + } + + public class SysSetupFileHandler : IFileHandler + { + public void Process(RBuildFile file) + { + if (file.Name == "syssetup.inf") + { + int i = 0; + } + } + } + + public class TxtSetupFileHandler : IFileHandler + { + public void Process(RBuildFile file) + { + if (file.Name == "txtsetup.sif") + { + int i = 0; + } + } + } + + public class UnattendFileHandler : IFileHandler + { + public void Process(RBuildFile file) + { + if (file.Name == "unattend.inf") + { + int i = 0; + } + } + } + + public class DownloaderFileHandler : IFileHandler + { + public void Process(RBuildFile file) + { + if (file.Name == "downloader.xml") + { + int i = 0; + } + } + } + + public class UnAttendedSetupFileHandler : IFileHandler + { + public void Process(RBuildFile file) + { + if (file.Name == "unattend.inf") + { + int i = 0; + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IBuildStatusMailReporter.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IBuildStatusMailReporter.cs new file mode 100644 index 00000000000..4d156d6cc5b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IBuildStatusMailReporter.cs @@ -0,0 +1,10 @@ +using System; + +namespace SysGen.BuildEngine +{ + public interface IBuildStatusMailReporter + { + string MailAdress { get; } + string Subject { get; } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IDirectory.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IDirectory.cs new file mode 100644 index 00000000000..9db7825e601 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IDirectory.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine +{ + public interface IDirectory + { + PathRoot Root { get; } + string BasePath { get; } + + RBuildFolder Folder { get;} + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IElement.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IElement.cs new file mode 100644 index 00000000000..58ca260b44d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IElement.cs @@ -0,0 +1,21 @@ +using System; +using System.Xml; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine +{ + public interface IElement + { + string BaseBuildLocation { get; } + void Initialize(System.Xml.XmlNode elementNode); + RBuildModule Module { get; } + string Name { get; } + IElement Parent { get; set; } + RBuildProject Project { get; set; } + //PropertyCollection Properties { get; } + RBuildElement RBuildElement { get; } + SysGenEngine SysGen { get; set; } + XmlNode XmlNode { get; } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IFileHandler.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IFileHandler.cs new file mode 100644 index 00000000000..8aa1e081b57 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IFileHandler.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine +{ + public interface IFileHandler + { + void Process(RBuildFile file); + } + + public abstract class NamedFileHandler : IFileHandler + { + public abstract string FileName { get; } + + public void Process(RBuildFile file) + { + if (file.Name == FileName) + { + } + } + + protected abstract void Process(); + } + + public abstract class RegenerateFileHandler : NamedFileHandler + { + public virtual void Generate() + { + + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IRBuildInstallable.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IRBuildInstallable.cs new file mode 100644 index 00000000000..f3c94193996 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/IRBuildInstallable.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.Framework +{ + public class IRBuildInstallable + { + string InstallBase; + + RBuildInstallFolder InstallFolder; + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ISysGenObject.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ISysGenObject.cs new file mode 100644 index 00000000000..20c3246615a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ISysGenObject.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine +{ + /// + /// Represent one of the root element object types for SysGen : Project and Module + /// + public interface ISysGenObject + { + RBuildElement RBuildElement { get; } + } + + public interface ISysGenObjectFileContainer + { + RBuildFileCollection Files { get; } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ITask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ITask.cs new file mode 100644 index 00000000000..7e2e4f4eabe --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ITask.cs @@ -0,0 +1,18 @@ +using System; + +namespace SysGen.BuildEngine +{ + public interface ITask : IElement + { + void Execute(); + bool FailOnError { get; set; } + bool IfDefined { get; set; } + bool IfNotDefined { get; set; } + string LogPrefix { get; } + string Name { get; } + void PostExecute(); + void PreExecute(); + string ToString(); + bool Verbose { get; set; } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ITaskContainer.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ITaskContainer.cs new file mode 100644 index 00000000000..053c6d2b849 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Interfaces/ITaskContainer.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.BuildEngine +{ + public interface ITaskContainer : ITask + { + bool ExecuteChilds { get; } + TaskCollection ChildTasks { get; } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Location.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Location.cs new file mode 100644 index 00000000000..d030fe2b0d5 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Location.cs @@ -0,0 +1,89 @@ +using System; +using System.IO; +using System.Text; + +namespace SysGen.BuildEngine +{ + /// + /// Stores the file name, line number and column number to record a position in a text file. + /// + [Serializable] + public class Location { + string _fileName = null; + int _lineNumber = 0; + int _columnNumber = 0; + + public static readonly Location UnknownLocation = new Location(); + + /// Creates a location consisting of a file name, line number and column number. + /// fileName can be a local URI resource, e.g., file:///C:/WINDOWS/setuplog.txt + public Location(string fileName, int lineNumber, int columnNumber) { + Init(fileName, lineNumber, columnNumber); + } + + /// Creates a location consisting of a file name. + /// fileName can be a local URI resource, e.g., file:///C:/WINDOWS/setuplog.txt + public Location(string fileName) { + Init(fileName, 0, 0); + } + + /// Creates an "unknown" location. + private Location() { + Init(null, 0, 0); + } + + /// Private Init function. + private void Init(string fileName, int lineNumber, int columnNumber) { + if (fileName != null) { + try { + // first check to see if fileName is a URI + Uri uri = new Uri(fileName); + fileName = uri.LocalPath; + } catch { + // must be a simple filename + fileName = Path.GetFullPath(fileName); + } + } + _fileName = fileName; + _lineNumber = lineNumber; + _columnNumber = columnNumber; + } + + /// Gets a string containing the file name for the location. + /// The file name includes both the file path and the extension. + public string FileName { + get { return _fileName; } + } + + /// Gets the line number for the location. + /// Lines start at 1. Will be zero if not specified. + public int LineNumber { + get { return _lineNumber; } + } + + /// Gets the column number for the location. + /// Columns start a 1. Will be zero if not specified. + public int ColumnNumber { + get { return _columnNumber; } + } + + /// + /// Returns the file name, line number and a trailing space. An error + /// message can be appended easily. For unknown locations, returns + /// an empty string. + /// + public override string ToString() { + StringBuilder sb = new StringBuilder(""); + + if (_fileName != null) { + sb.Append(_fileName); + if (_lineNumber != 0) { + sb.Append(String.Format("({0},{1})", _lineNumber, _columnNumber)); + } + sb.Append(":"); + } + + return sb.ToString(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/LocationMap.cs b/reactos/tools/sysgen/SysGen.BuildEngine/LocationMap.cs new file mode 100644 index 00000000000..ad6c73e2900 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/LocationMap.cs @@ -0,0 +1,211 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.XPath; +using System.Collections; + +namespace SysGen.BuildEngine +{ + /// + /// Maps XML nodes to the text positions from their original source. + /// + public class LocationMap { + + struct TextPosition { + public static readonly TextPosition InvalidPosition = new TextPosition(-1,-1); + + public TextPosition(int line, int column) { + Line = line; + Column = column; + } + + public int Line; + public int Column; + } + + // The LocationMap uses a hash table to map filenames to resolve specific maps. + Hashtable _fileMap = new Hashtable(); + + public LocationMap() { + } + + /// Add a XmlDocument to the map. + /// + /// A document can only be added to the map once. + /// + public void Add(XmlDocument doc) { + // prevent duplicate mapping + // NOTE: if this becomes a liability then just return when a duplicate map has happened + string fileName = doc.BaseURI; + + //check for non-backed documents + if(fileName == "") + return; + + if (_fileMap.ContainsKey(fileName)) { + throw new ArgumentException(String.Format("XmlDocument '{0}' already mapped.", fileName), "doc"); + } + + Hashtable map = new Hashtable(); + + string parentXPath = "/"; // default to root + string previousXPath = ""; + int previousDepth = 0; + + // Load text reader. + XmlTextReader reader = new XmlTextReader(fileName); + + reader.XmlResolver = null; + + try { + map.Add((object) "/", (object) new TextPosition(1, 1)); + + ArrayList indexAtDepth = new ArrayList(); + + // loop thru all nodes in the document + while (reader.Read()) { + // Ignore nodes we aren't interested in + if ((reader.NodeType != XmlNodeType.Whitespace) && + (reader.NodeType != XmlNodeType.EndElement) && + (reader.NodeType != XmlNodeType.ProcessingInstruction) && + (reader.NodeType != XmlNodeType.XmlDeclaration)) { + + int level = reader.Depth; + string currentXPath = ""; + + // If we are higher than before + if (reader.Depth < previousDepth) { + // Clear vars for new depth + string[] list = parentXPath.Split('/'); + string newXPath = ""; // once appended to / will be root node ... + + for (int j = 1; j < level+1; j++) { + newXPath += "/" + list[j]; + } + + // higher than before so trim xpath\ + parentXPath = newXPath; // one up from before + + // clear indexes for depth greater than ours + indexAtDepth.RemoveRange(level+1, indexAtDepth.Count - (level+1)); + + } else if (reader.Depth > previousDepth) { + // we are lower + parentXPath = previousXPath; + } + + // End depth setup + // Setup up index array + // add any needed extra items ( usually only 1 ) + // would have used array but not sure what maximum depth will be beforehand + for (int index = indexAtDepth.Count; index < level+1; index++) { + indexAtDepth.Add(0); + } + // Set child index + if ((int) indexAtDepth[level] == 0) { + // first time thru + indexAtDepth[level] = 1; + } else { + indexAtDepth[level] = (int) indexAtDepth[level] + 1; // lower so append to xpath + } + + // Do actual XPath generation + if (parentXPath.EndsWith("/")) { + currentXPath = parentXPath; + } else { + currentXPath = parentXPath + "/"; // add seperator + } + + // Set the final XPath + currentXPath += "child::node()[" + indexAtDepth[level] + "]"; + + // Add to our hash structures + map.Add((object) currentXPath, (object) new TextPosition(reader.LineNumber, reader.LinePosition)); + + // setup up loop vars for next iteration + previousXPath = currentXPath; + previousDepth = reader.Depth; + } + } + } finally { + reader.Close(); + } + + // add map at the end to prevent adding maps that had errors + _fileMap.Add(fileName, map); + + } + + /// Return the in the xml file for the given node. + /// + /// The node passed in must be from a XmlDocument that has been added to the map. + /// + public Location GetLocation(XmlNode node) { + // find hashtable this node's file is mapped under + string fileName = node.BaseURI; + if (fileName == "" ) { + return new Location(null, 0, 0 ); // return null location because we have a fileless node. + } + if (!_fileMap.ContainsKey(fileName)) { + //throw new ArgumentException("Xml node has not been mapped."); + return new Location(null, 0, 0); + } + + // find xpath for node + Hashtable map = (Hashtable) _fileMap[fileName]; + string xpath = GetXPathFromNode(node); + if (!map.ContainsKey(xpath)) { + //throw new ArgumentException("Xml node has not been mapped."); + return new Location(null, 0, 0); + } + + TextPosition pos = (TextPosition) map[xpath]; + Location location = new Location(fileName, pos.Line, pos.Column); + return location; + } + + private string GetXPathFromNode(XmlNode node) { + // IM TODO review this algorithm - tidy up + XPathNavigator nav = node.CreateNavigator(); + + string xpath = ""; + int index = 0; + + while (nav != null && nav.NodeType.ToString() != "Root") + { + // loop thru children until we find ourselves + XPathNavigator navParent = nav.Clone(); + navParent.MoveToParent(); + int parentIndex = 0; + navParent.MoveToFirstChild(); + if (navParent.IsSamePosition(nav)) { + index = parentIndex; + } + while (navParent.MoveToNext()) { + parentIndex++; + if (navParent.IsSamePosition(nav)) { + index = parentIndex; + } + } + + nav.MoveToParent(); // do loop condition here + index++; // Convert to 1 based index + + string thisNode = "child::node()[" + index + "]"; + + if (xpath == "") { + xpath = thisNode; + } else { + // build xpath string + xpath = thisNode + "/" + xpath; + } + } + + // prepend slash to ... + xpath = "/" + xpath; + + return xpath; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Log/Log.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Log/Log.cs new file mode 100644 index 00000000000..96de3e19a2a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Log/Log.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +namespace SysGen.BuildEngine.Log +{ + public class BuildEventArgs : EventArgs + { + protected string _name = string.Empty; + + public BuildEventArgs(string name) + { + _name = name; + } + + public string Name + { + get { return _name; } + set { _name = value; } + } + } + + /// Delegate to handle Build events + public delegate void BuildEventHandler(object sender, BuildEventArgs e); + + public interface IBuildEventConsumer + { + /// Signals that a build has started. This event is fired before any targets have started. + void BuildStarted(object sender, BuildEventArgs e); + + /// Signals that the last target has finished. This event will still be fired if an error occurred during the build. + void BuildFinished(object sender, BuildEventArgs e); + + /// Signals that a target has started. + void TargetStarted(object sender, BuildEventArgs e); + + /// Signals that a target has finished. This event will still be fired if an error occurred during the build. + void TargetFinished(object sender, BuildEventArgs e); + + /// Signals that a task has started. + void TaskStarted(object sender, BuildEventArgs e); + + /// Signals that a task has finished. This event will still be fired if an error occurred during the build. + void TaskFinished(object sender, BuildEventArgs e); + } + + public abstract class LogListener { + public abstract void Write(string message); + public abstract void WriteLine(string message); + public virtual void WriteLine(string message, string messageType) { + WriteLine(message); + } + + public virtual void Flush() { + } + } + + /// Provides a set of methods and properties that log the execution of the build process. This class cannot be inherited. + public sealed class BuildLog + { + private static bool _autoFlush; + private static int _indentLevel; + private static int _indentSize; + private static bool _needIndent; // true if the output should be indented; otherwise, false + private static LogListenerCollection _listeners; + + static BuildLog() + { + _autoFlush = false; + _indentLevel = 0; + _indentSize = 4; + _needIndent = true; + _listeners = new LogListenerCollection(); + _listeners.Add(new ConsoleLogger()); + } + + /// Gets or sets whether Flush should be called on the Listeners after every write. + public static bool AutoFlush { + get { return _autoFlush; } + set { _autoFlush = value; } + } + + /// Gets or sets the indent level. Default is zero. + public static int IndentLevel { + get { return _indentLevel; } + set { _indentLevel = value; } + } + + /// Gets or sets the number of spaces in an indent. Default is four. + public static int IndentSize { + get { return _indentSize; } + set { _indentSize = value; } + } + + /// Gets the collection of listeners that is monitoring the log output. + public static LogListenerCollection Listeners { + get { return _listeners; } + } + + /// Flushes the output buffer, and causes buffered data to be written to the Listeners. + public static void Flush() { + foreach (LogListener l in _listeners) { + l.Flush(); + } + } + + /// Increases the current IndentLevel by one. + public static void Indent() { + _indentLevel++; + } + + /// Decreases the current IndentLevel by one. + public static void Unindent() { + if (_indentLevel > 0) { + _indentLevel--; + } + } + + /// Indents the message if needed. + private static string FormatMessage(string message) { + // if we are starting a new line then first indent the string + if (_needIndent) { + if (IndentLevel > 0) { + StringBuilder sb = new StringBuilder(message); + sb.Insert(0, " ", IndentLevel * IndentSize); + message = sb.ToString(); + } + _needIndent = false; + } + return message; + } + + /// Writes the given message to the log. + public static void Write(string message) { + message = FormatMessage(message); + foreach (LogListener l in _listeners) { + l.Write(message); + } + + if (AutoFlush) { + Flush(); + } + } + + /// Writes the given message to the log. + public static void Write(string format, params object[] arg) { + Write(String.Format(format, arg)); + } + + /// Writes the given message to the log if condition is true. + public static void WriteIf(bool condition, string message) { + if (condition) { + Write(message); + } + } + + /// Writes the given message to the log if condition is true. + public static void WriteIf(bool condition, string format, params object[] arg) { + if (condition) { + Write(String.Format(format, arg)); + } + } + + /// Writes the given message to the log. + public static void WriteLine(string message) { + Write(message + Environment.NewLine); + _needIndent = true; + } + + /// Writes the given message to the log. + public static void WriteLine() { + WriteLine(String.Empty); + } + + /// Writes the given message to the log. + public static void WriteLine(string format, params object[] arg) { + WriteLine(String.Format(format, arg)); + } + + public static void WriteMessage(string message, string messageType) { + message = FormatMessage(message); + foreach (LogListener l in _listeners) { + l.WriteLine(message, messageType); + } + + if (AutoFlush) { + Flush(); + } + } + + /// Writes the given message to the log if condition is true. + public static void WriteLineIf(bool condition, string message) { + if (condition) { + WriteLine(message); + } + } + + /// Writes the given message to the log if condition is true. + public static void WriteLineIf(bool condition, string format, params object[] arg) { + if (condition) { + WriteLine(String.Format(format, arg)); + } + } + } + + public class LogWriter : StringWriter { + public override void Close() { + BuildLog.Write(GetStringBuilder().ToString()); + base.Close(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/ConsoleLogger.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/ConsoleLogger.cs new file mode 100644 index 00000000000..8ffa3fee74c --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/ConsoleLogger.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.BuildEngine.Log +{ + /// + /// The standard logger that will suffice for any command line based nant runner. + /// + public class ConsoleLogger : LogListener + { + public override void Write(string message) + { + Console.Write(message); + } + + public override void WriteLine(string message) + { + Console.WriteLine(message); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/StringLogger.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/StringLogger.cs new file mode 100644 index 00000000000..0a6319873b8 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/StringLogger.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; + +namespace SysGen.BuildEngine.Log +{ + /// + /// Used for test classes to check output. + /// + public class StringLogger : LogListener + { + private StringWriter _writer = new StringWriter(); + + public override void Write(string message) + { + _writer.Write(message); + } + + public override void WriteLine(string message) + { + _writer.WriteLine(message); + } + + /// + /// Returns the contents of log captured. + /// + public override string ToString() + { + return _writer.ToString(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/XmlLogger.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/XmlLogger.cs new file mode 100644 index 00000000000..bc2da4f0e44 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Log/Loggers/XmlLogger.cs @@ -0,0 +1,193 @@ +using System; +using System.Collections; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; + +namespace SysGen.BuildEngine.Log +{ + /// + /// Used to wrap log messages in xml <message/> elements + /// + public class XmlLogger : LogListener, IBuildEventConsumer + { + public class Elements + { + public const string BUILD_RESULTS = "buildresults"; + public const string MESSAGE = "message"; + public const string TARGET = "target"; + public const string TASK = "task"; + public const string STATUS = "status"; + } + + public class Attributes + { + public const string PROJECT = "project"; + public const string MESSAGETYPE = "type"; + } + + private TextWriter _writer = Console.Out; + private XmlTextWriter _xmlWriter = new XmlTextWriter(Console.Out); + + public XmlLogger() + { + + } + + public XmlLogger(TextWriter writer) + { + _writer = writer; + _xmlWriter = new XmlTextWriter(_writer); + _xmlWriter.Formatting = Formatting.Indented; + } + + public string StripFormatting(string message) + { + //looking for zero or more white space from front of line followed by + //one or more of just about anything between [ and ] followed by a message + //which we will capture. ' [blah] + Regex r = new Regex(@"(?ms)^\s*?\[[\s\w\d]+\](.+)"); + + Match m = r.Match(message); + if (m.Success) + { + return m.Groups[1].Captures[0].Value.Trim(); + } + return message; + } + + public bool IsJustWhiteSpace(string message) + { + Regex r = new Regex(@"^\s*$"); + + return r.Match(message).Success; + } + + #region LogListener Overrides + + public override void Write(string formattedMessage) + { + WriteLine(formattedMessage, null); + } + + public override void WriteLine(string message) + { + WriteLine(message, null); + } + + public override void WriteLine(string message, string messageType) + { + string rawMessage = StripFormatting(message.Trim()); + if (IsJustWhiteSpace(rawMessage)) + { + return; + } + + _xmlWriter.WriteStartElement(Elements.MESSAGE); + + if (messageType != null && messageType != String.Empty) + { + _xmlWriter.WriteAttributeString(Attributes.MESSAGETYPE, messageType); + } + + if (IsValidXml(rawMessage)) + { + rawMessage = Regex.Replace(rawMessage, @"<\?.*\?>", String.Empty); + _xmlWriter.WriteRaw(rawMessage); + } + else + { + _xmlWriter.WriteCData(StripCData(rawMessage)); + } + _xmlWriter.WriteEndElement(); + _xmlWriter.Flush(); + } + + private bool IsValidXml(string message) + { + if (Regex.Match(message, @"^<.*>").Success) + { + // validate xml + XmlValidatingReader reader = new XmlValidatingReader(message, XmlNodeType.Element, null); + try { while (reader.Read()) { } } + catch (Exception) { return false; } + finally { reader.Close(); } + return true; + } + return false; + } + + private string StripCData(string message) + { + string strippedMessage = Regex.Replace(message, @"", String.Empty); + } + + public override void Flush() + { + _writer.Flush(); + } + + /// Returns the contents of log captured. + public override string ToString() + { + return _writer.ToString(); + } + + #endregion + + #region IBuildEventConsumer Implementation + + public void BuildStarted(object obj, BuildEventArgs args) + { + _xmlWriter.WriteStartElement(Elements.BUILD_RESULTS); + _xmlWriter.WriteAttributeString(Attributes.PROJECT, args.Name); + } + + public void BuildFinished(object obj, BuildEventArgs args) + { + _xmlWriter.WriteEndElement(); + } + + public void TargetStarted(object obj, BuildEventArgs args) + { + _xmlWriter.WriteStartElement(Elements.TARGET); + WriteNameAttribute(args.Name); + _xmlWriter.Flush(); + } + + public void TargetFinished(object obj, BuildEventArgs args) + { + _xmlWriter.WriteEndElement(); + _xmlWriter.Flush(); + } + + public void TaskStarted(object obj, BuildEventArgs args) + { + _xmlWriter.WriteStartElement(Elements.TASK); + WriteNameAttribute(args.Name); + _xmlWriter.Flush(); + } + + public void TaskFinished(object obj, BuildEventArgs args) + { + _xmlWriter.WriteEndElement(); + _xmlWriter.Flush(); + } + + private void WriteNameAttribute(string name) + { + _xmlWriter.WriteAttributeString("name", name); + } + + private void WriteStatus(string status) + { + _xmlWriter.WriteStartElement(Elements.STATUS); + _xmlWriter.WriteAttributeString("value", status); + _xmlWriter.WriteEndElement(); + } + #endregion + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Plugins/TaskBuilder.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Plugins/TaskBuilder.cs new file mode 100644 index 00000000000..6fbe2b65424 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Plugins/TaskBuilder.cs @@ -0,0 +1,72 @@ +using System; +using System.Reflection; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine +{ + public class TaskBuilder + { + private string _className; + private string _assemblyFileName; + private string _taskName; + + public TaskBuilder(string className) : this(className, null) { + } + + public TaskBuilder(string className, string assemblyFileName) { + _className = className; + _assemblyFileName = assemblyFileName; + + // get task name from attribute + Assembly assembly = GetAssembly(); + TaskNameAttribute taskNameAttribute = (TaskNameAttribute) + Attribute.GetCustomAttribute(assembly.GetType(ClassName), typeof(TaskNameAttribute)); + + _taskName = taskNameAttribute.FullTaskName; // Name; + } + + public string ClassName + { + get { return _className; } + } + + public string AssemblyFileName + { + get { return _assemblyFileName; } + } + + public string TaskName + { + get { return _taskName; } + } + + private Assembly GetAssembly() { + Assembly assembly = null; + if (AssemblyFileName == null) { + assembly = Assembly.GetExecutingAssembly(); + } else { + //check to see if it is loaded already + Assembly [] ass = AppDomain.CurrentDomain.GetAssemblies(); + for (int i = 0; i < ass.Length; i++){ + try { + if(ass[i].Location.Equals(AssemblyFileName)) { + assembly = ass[i]; + return assembly; + } + } + // System.Reflection.Emit.Assembly have no location and will fail + catch{} + } + //load if not loaded + if(assembly == null) + assembly = Assembly.LoadFrom(AssemblyFileName); + } + return assembly; + } + + public Task CreateTask() + { + return (Task)GetAssembly().CreateInstance(ClassName, true); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Plugins/TaskFactory.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Plugins/TaskFactory.cs new file mode 100644 index 00000000000..66c14ff3a17 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Plugins/TaskFactory.cs @@ -0,0 +1,136 @@ +using System; +using System.IO; +using System.Xml; +using System.Reflection; +using System.Collections; + +namespace SysGen.BuildEngine +{ + /// + /// The TaskFactory comprises all of the loaded, and available, tasks. + /// Use these static methods to register, initialize and create a task. + /// + public class TaskFactory + { + static TaskBuilderCollection _builders = new TaskBuilderCollection(); + static ArrayList _projects = new ArrayList(); + + /// + /// Initializes the tasks in the executing assembly, and basedir of the current domain. + /// + static TaskFactory() + { + // initialize builtin tasks + AddTasks(Assembly.GetExecutingAssembly()); + AddTasks(Assembly.GetCallingAssembly()); + + + //string nantBinDir = Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory); + //ScanDir(nantBinDir); + //ScanDir(Path.Combine(nantBinDir, "tasks")); + } + + /* + /// Scans the path for any Tasks assemblies and adds them. + /// The directory to scan in. + protected static void ScanDir(string path) { + // Don't do anything if we don't have a valid directory path + if(path == null || path == string.Empty) { + return; + } + + // intialize tasks found in assemblies that end in Tasks.dll + DirectoryScanner scanner = new DirectoryScanner(); + scanner.BaseDirectory = path; + scanner.Includes.Add("*Tasks.dll"); + + //needed for testing + scanner.Includes.Add("*Tests.dll"); + scanner.Includes.Add("*Test.dll"); + + foreach(string assemblyFile in scanner.FileNames) { + //Log.WriteLine("{0}:Add Tasks from {1}", AppDomain.CurrentDomain.FriendlyName, assemblyFile); + + AddTasks(Assembly.LoadFrom(assemblyFile)); + //AddTasks(AppDomain.CurrentDomain.Load(assemblyFile.Replace(AppDomain.CurrentDomain.BaseDirectory,"").Replace(".dll",""))); + } + + } + */ + + /* + /// Adds any Task Assemblies in the Project.BaseDirectory. + /// The project to work from. + public static void AddProject(SysGenEngine project) { + if(project.BaseDirectory != null && !project.BaseDirectory.Equals(string.Empty)) { + ScanDir(project.BaseDirectory); + ScanDir(Path.Combine(project.BaseDirectory, "tasks")); + } + //create weakref to project. It is possible that project may go away, we don't want to hold it. + _projects.Add(new WeakReference(project)); + foreach(TaskBuilder tb in Builders) { + UpdateProjectWithBuilder(project, tb); + } + }*/ + + /// Returns the list of loaded TaskBuilders + public static TaskBuilderCollection Builders { + get { return _builders; } + } + /// Scans the given assembly for any classes derived from Task and adds a new builder for them. + /// The Assembly containing the new tasks to be loaded. + /// The count of tasks found in the assembly. + public static int AddTasks(Assembly assembly) { + int taskCount = 0; + try { + foreach(Type type in assembly.GetTypes()) { + if (type.IsSubclassOf(typeof(Task)) && !type.IsAbstract) { + TaskBuilder tb = new TaskBuilder(type.FullName, assembly.Location); + if (_builders.Add(tb)) { + foreach(WeakReference wr in _projects) { + if(!wr.IsAlive) + continue; + SysGenEngine p = wr.Target as SysGenEngine; + if(p == null) + continue; + UpdateProjectWithBuilder(p, tb); + } + taskCount++; + } + } + } + } + // For assemblies that don't have types + catch{}; + + return taskCount; + } + + protected static void UpdateProjectWithBuilder(SysGenEngine sysGen, TaskBuilder taskBuilder) + { + // add a true property for each task (use in build to test for task existence). + // add a property for each task with the assembly location. + sysGen.Properties.AddReadOnly("SysGen.Tasks." + taskBuilder.TaskName + ".Available", Boolean.TrueString); + sysGen.Properties.AddReadOnly("SysGen.Tasks." + taskBuilder.TaskName + ".Assembly", taskBuilder.AssemblyFileName); + } + + /// Creates a new Task instance for the given xml and project. + /// The XML to initialize the task with. + /// The Project that the Task belongs to. + /// The Task instance. + public static Task CreateTask(XmlNode taskNode, SysGenEngine proj) + { + string taskName = taskNode.Name; + + TaskBuilder builder = _builders.FindBuilderForTask(taskName); + if (builder == null && proj != null) { + Location location = proj.LocationMap.GetLocation(taskNode); + throw new BuildException(String.Format("Unknown task <{0}>", taskName), location); + } + + Task task = builder.CreateTask(); + task.SysGen = proj; + return task; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Properties/AssemblyInfo.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..be7575e9d01 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Properties/AssemblyInfo.cs @@ -0,0 +1,15 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle("SysGen")] +[assembly: AssemblyDescription("SysGen ReactOS Build Tool")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SysGen")] +[assembly: AssemblyCopyright("Copyright (C) 2007 J.Marc Piulachs")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: AssemblyVersion("0.1.0.*")] + +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyName("")] \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/SysGen.Framework.csproj b/reactos/tools/sysgen/SysGen.BuildEngine/SysGen.Framework.csproj new file mode 100644 index 00000000000..515cf8ded34 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/SysGen.Framework.csproj @@ -0,0 +1,381 @@ + + + Local + 9.0.30729 + 2.0 + {8F5F8375-4097-4952-B860-784EB9961ABE} + Debug + AnyCPU + + + + + SysGen.Framework + + + JScript + Grid + IE50 + false + Library + SysGen.Framework + + + + + + + 2.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + bin\Debug\ + false + 285212672 + false + + + + + + + true + 4096 + false + false + false + false + 1 + full + prompt + + + bin\Debug\ + false + 285212672 + false + + + + + + + true + 4096 + false + false + false + false + 1 + full + prompt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code + + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code + + + + + + + + + Code + + + Code + + + Code + + + + Code + + + + Code + + + Code + + + Code + + + Code + + + + + + + + Code + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code + + + + + + + + + + + + + + + + + + + + + + + Code + + + Code + + + Code + + + + + + + + + + + + + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26} + SysGen.RBuild.Framework + + + + + False + .NET Framework Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/SysGen.Framework.csproj.user b/reactos/tools/sysgen/SysGen.BuildEngine/SysGen.Framework.csproj.user new file mode 100644 index 00000000000..ef20f1c8f95 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/SysGen.Framework.csproj.user @@ -0,0 +1,19 @@ + + + ShowAllFiles + + + + + + + + + + + + + en-US + false + + \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/SysGenConversion.cs b/reactos/tools/sysgen/SysGen.BuildEngine/SysGenConversion.cs new file mode 100644 index 00000000000..e9fe9b97686 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/SysGenConversion.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.BuildEngine +{ + class SysGenConversion + { + public static bool ToBolean(object value) + { + switch (value.ToString().ToLower()) + { + case "yes": + case "true": + case "1": + return true; + case "no": + case "false": + case "0": + return false; + } + + throw new ValidationException(String.Format("Cannot resolve to '{0}' to Boolean value.", value.ToString())); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/SysGenDependencyTracker.cs b/reactos/tools/sysgen/SysGen.BuildEngine/SysGenDependencyTracker.cs new file mode 100644 index 00000000000..1f49363684b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/SysGenDependencyTracker.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Framework; + +namespace SysGen.BuildEngine +{ + public class SysGenDependencyTracker + { + RBuildProject m_Project = null; + RBuildModuleCollection m_Modules = new RBuildModuleCollection(); + RBuildModuleCollection m_DependsOn = new RBuildModuleCollection(); + RBuildModuleCollection m_DependencyOf = new RBuildModuleCollection(); + + public SysGenDependencyTracker(RBuildProject project) + { + m_Project = project; + } + + public SysGenDependencyTracker(RBuildProject project, RBuildModule module) + : this(project) + { + m_Modules.Add(module); + Calculate(); + } + + public SysGenDependencyTracker(RBuildProject project, RBuildModuleCollection modules) + : this(project) + { + m_Modules.Add(modules); + Calculate(); + } + + public void Calculate() + { + m_DependsOn.Clear(); + m_DependencyOf.Clear(); + + foreach (RBuildModule module in m_Modules) + { + GetModuleDependencies(module); + } + + foreach (RBuildModule projectModule in m_Project.Modules) + { + foreach (RBuildModule module in m_Modules) + { + if (projectModule.Needs.Contains(module)) + { + m_DependencyOf.Add(projectModule); + } + } + } + } + + private void GetModuleDependencies(RBuildModule module) + { + foreach (RBuildModule library in module.Needs) + { + if (m_DependsOn.Contains(library) == false) + { + if (m_Modules.Contains(library) == false) + { + //Add it to the list of dependencies + m_DependsOn.Add(library); + + //Investigate the module to find its dependencies + GetModuleDependencies(library); + } + } + } + } + + public RBuildModuleCollection DependsOn + { + get { return m_DependsOn; } + } + + public RBuildModuleCollection DependencyOf + { + get { return m_DependencyOf; } + } + + public RBuildModuleCollection Missing + { + get + { + RBuildModuleCollection missing = new RBuildModuleCollection(); + + foreach (RBuildModule dependency in DependsOn) + { + if (m_Project.Platform.Modules.Contains(dependency) == false) + missing.Add(dependency); + } + + return missing; + } + } + + public RBuildModuleCollection Using + { + get + { + RBuildModuleCollection missing = new RBuildModuleCollection(); + + foreach (RBuildModule dependency in DependencyOf) + { + if (m_Project.Platform.Modules.Contains(dependency) == true) + missing.Add(dependency); + } + + return missing; + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/SysGenEngine.cs b/reactos/tools/sysgen/SysGen.BuildEngine/SysGenEngine.cs new file mode 100644 index 00000000000..70d8b470285 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/SysGenEngine.cs @@ -0,0 +1,825 @@ +using System; +using System.Text.RegularExpressions; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.XPath; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Log; +using SysGen.BuildEngine.Tasks; +using SysGen.BuildEngine.Handlers; +using SysGen.BuildEngine.Backends; + +namespace SysGen.BuildEngine +{ + public class SysGenEngine + { + private Task m_RootTask = null; + + private RBuildProject m_Project = null; + private RBuildPlatform m_Platform = null; + + //private TargetCollection m_Targets = new TargetCollection(); + private FileHandlerCollection m_FileHandlers = new FileHandlerCollection(); + private BackendCollection m_Backends = new BackendCollection(); + private RBuildPropertyCollection m_Properties = new RBuildPropertyCollection(); + private StringCollection m_XmlBuildFiles = new StringCollection(); + + //xml element and attribute names that are not defined in metadata + protected const string PROJECT_XMLROOT = "project"; + protected const string PROJECT_NAME_ATTRIBUTE = "name"; + protected const string PROJECT_DEFAULT_ATTRIBUTE = "default"; + protected const string PROJECT_BASEDIR_ATTRIBUTE = "basedir"; + + public const string SYSGEN_PROPERTY_FILENAME = "SysGen.Filename"; + public const string SYSGEN_PROPERTY_VERSION = "SysGen.Version"; + public const string SYSGEN_PROPERTY_LOCATION = "SysGen.Location"; + public const string SYSGEN_PROPERTY_PROJECT_NAME = "SysGen.Project.Name"; + public const string SYSGEN_PROPERTY_PROJECT_BUILDFILE = "SysGen.Project.File"; + public const string SYSGEN_PROPERTY_PROJECT_BASEDIR = "SysGen.Project.BaseDir"; + + private string m_BaseDir = null; + private bool m_Verbose = false; + private bool m_ExecuteBackends = true; + private bool m_SetDefaults = true; + + private LocationMap _locationMap = new LocationMap(); + private XmlDocument _doc = null; // set in ctorHelper + + public static event BuildEventHandler BuildStarted; + public static event BuildEventHandler BuildFinished; + public static event BuildEventHandler TargetStarted; + public static event BuildEventHandler TargetFinished; + public static event BuildEventHandler TaskStarted; + public static event BuildEventHandler TaskFinished; + public static event BuildEventHandler TaskException; + public static event BuildEventHandler BuildFileLoaded; + + public static void OnBuildFileLoaded(object o, BuildEventArgs e) + { + if (BuildFileLoaded != null) + BuildFileLoaded(o, e); + } + + public static void OnBuildStarted(object o, BuildEventArgs e) + { + if (BuildStarted != null) + BuildStarted(o, e); + } + + public static void OnBuildFinished(object o, BuildEventArgs e) + { + if (BuildFinished != null) + BuildFinished(o, e); + } + + public static void OnTargetStarted(object o, BuildEventArgs e) + { + if (TargetStarted != null) + TargetStarted(o, e); + } + + public static void OnTargetFinished(object o, BuildEventArgs e) + { + if (TargetFinished != null) + TargetFinished(o, e); + } + + public static void OnTaskStarted(object o, BuildEventArgs e) + { + if (TaskStarted != null) + TaskStarted(o, e); + } + + public static void OnTaskFinished(object o, BuildEventArgs e) + { + if (TaskFinished != null) + TaskFinished(o, e); + } + + public static void OnTaskException(object o, BuildEventArgs e) + { + if (TaskException != null) + TaskException(o, e); + } + + public RBuildProject Project + { + get { return m_Project; } + set + { + if (m_Project != null) + throw new BuildException("Only one ProjectTask is allowed per project"); + + m_Project = value; + + InitializeEnvironment(); + } + } + + public Task RootTask + { + get { return m_RootTask; } + set { m_RootTask = value; } + } + + public StringCollection BuildFiles + { + get { return m_XmlBuildFiles; } + } + + public bool SetDefaults + { + get { return m_SetDefaults; } + set { m_SetDefaults = value; } + } + + public SysGenEngine(string path, string project) : this (Path.Combine (path , project)) + { + } + + /// + /// Constructs a new Project with the given source. + /// + /// + /// The Source should be the full path to the build file. + /// This can be of any form that XmlDocument.Load(string url) accepts. + /// + /// If the source is a uri of form 'file:///path' then use the path part. + public SysGenEngine(string source) + { + string path = source; + //if the source is not a valid uri, pass it thru. + //if the source is a file uri, pass the localpath of it thru. + try + { + Uri testURI = new Uri(source); + if (testURI.IsFile) + { + path = testURI.LocalPath; + } + } + catch (Exception e) + { + //do nothing. + e.ToString(); + } + finally + { + if (path == null) + path = source; + } + + ctorHelper(LoadBuildFile(path)); + } + + /// + /// Inits stuff: + /// TaskFactory: Calls Initialize and AddProject + /// Log.IndentSize set to 12 + /// Project properties are initialized ("nant.* stuff set") + /// + /// NAnt Props: + /// nant.filename + /// nant.version + /// nant.location + /// nant.project.name + /// nant.project.buildfile (if doc has baseuri) + /// nant.project.basedir + /// nant.project.default = defaultTarget + /// nant.tasks.[name] = true + /// nant.tasks.[name].location = AssemblyFileName + /// + /// + /// The Project Document. + protected virtual void ctorHelper(XmlDocument doc) + { + //TaskFactory.AddProject(this); + BuildLog.IndentSize = 12; + _doc = doc; + + string newBaseDir = null; + + //check to make sure that the root element in named correctly + if(!doc.DocumentElement.Name.Equals(PROJECT_XMLROOT)) + throw new ApplicationException("Root Element must be named " + PROJECT_XMLROOT + " in " + doc.BaseURI); + + /* + // get project attributes + if(doc.DocumentElement.HasAttribute(PROJECT_NAME_ATTRIBUTE)) + _projectName = doc.DocumentElement.GetAttribute(PROJECT_NAME_ATTRIBUTE); + + if(doc.DocumentElement.HasAttribute(PROJECT_BASEDIR_ATTRIBUTE)) + newBaseDir = doc.DocumentElement.GetAttribute(PROJECT_BASEDIR_ATTRIBUTE); + + if(doc.DocumentElement.HasAttribute(PROJECT_DEFAULT_ATTRIBUTE)) + _defaultTargetName = doc.DocumentElement.GetAttribute(PROJECT_DEFAULT_ATTRIBUTE); + */ + + // give the project a meaningful base directory + if (newBaseDir == null) { + if (BuildFileLocalName != null) { + newBaseDir = Path.GetDirectoryName(BuildFileLocalName); + } + else { + newBaseDir = Environment.CurrentDirectory; + } + } + + newBaseDir = Path.GetFullPath(newBaseDir); + //BaseDirectory must be rooted. + BaseDirectory = newBaseDir; + + } + + internal void InitializeBuildFile(XmlDocument doc, ITaskContainer parent) + { + // load line and column number information into position map + LocationMap.Add(doc); + + // initialize targets and global tasks + foreach (XmlNode childNode in doc.ChildNodes) + { + if (CanProcessNode(childNode)) + { + LoadChildTask(childNode, parent); + } + } + } + + internal bool CanProcessNode(XmlNode childNode) + { + if ((childNode.NodeType == XmlNodeType.Element) && + (childNode.Name.StartsWith("#") == false) && + (childNode.Name.StartsWith("xml") == false) && + (childNode.Name.StartsWith("!") == false) && + (childNode.NamespaceURI.Equals(string.Empty) || + (childNode.NamespaceURI.Equals("http://www.w3.org/2001/XInclude")))) + { + return true; + } + + return false; + } + + internal Task LoadChildTask(XmlNode taskNode, ITaskContainer parent) + { + try + { + Task task = TaskFactory.CreateTask(taskNode, this); + + task.Parent = parent; + task.Project = m_Project; + task.SysGen = this; + task.Initialize(taskNode); + + if (task != RootTask) + parent.ChildTasks.Add(task); + + return task; + } + catch (BuildException be) + { + BuildLog.WriteLine("{0} Failed to created Task for '{1}' xml element for reason: \n {2}", parent.LogPrefix, taskNode.Name, be.Message); + } + + return null; + } + + /// + /// Creates a new XmlDocument based on the project definition. + /// + /// The source of the document. Any form that is valid for XmlDocument.Load(string url) can be used here. + /// The project document. + private XmlDocument LoadBuildFile(string source) + { + XmlDocument doc = new XmlDocument(); + + try + { + OnBuildFileLoaded(this, new BuildEventArgs(source)); + + doc.XmlResolver = null; + doc.Load(source); + + //Add the build file to the collection of readed xml build files + m_XmlBuildFiles.Add(source); + } + catch (XmlException e) + { + string message = "Error loading buildfile"; + Location location = new Location(source, e.LineNumber, e.LinePosition); + throw new BuildException(message, location, e); + } + catch (Exception e) + { + string message = "Error loading buildfile"; + Location location = new Location(source); + throw new BuildException(message, location, e); + } + return doc; + } + + public virtual bool RBuildFolderExists(RBuildFolder folder) + { + return Directory.Exists(ResolveRBuildFilePath(folder)); + } + + public virtual bool RBuildFileExists(RBuildFile file) + { + return File.Exists(ResolveRBuildFilePath(file)); + } + + public virtual string ResolveRBuildFilePath(RBuildFileSystemInfo file) + { + return NormalizePath(Path.Combine(GetPathRoot(file.Root), file.FullPath)); + } + + public virtual string ResolveRBuildFolderPath(RBuildFolder folder) + { + return NormalizePath(Path.Combine(GetPathRoot(folder.Root), folder.FullPath)); + } + + public virtual string ResolveRBuildFilePath(PathRoot root, RBuildFileSystemInfo file) + { + return NormalizePath(Path.Combine(GetPathRoot(root), file.FullPath)); + } + + public string NormalizePath(string path) + { + return path.Replace( + Path.AltDirectorySeparatorChar, + Path.DirectorySeparatorChar); + } + + public string IntermediateDirectory + { + get { return Path.Combine(BaseDirectory, "obj-i386"); } + } + + public string DocumentationDirectory + { + get { return Path.Combine(BaseDirectory, "doc-i386"); } + } + + public string ISODirectory + { + get { return Path.Combine(BaseDirectory, "iso-i386"); } + } + + public string OutputDirectory + { + get { return Path.Combine(BaseDirectory, "output-i386"); } + } + + public string BootCDOutputDirectory + { + get { return Path.Combine(OutputDirectory, "cd"); } + } + + public string LiveCDOutputDirectory + { + get { return Path.Combine(OutputDirectory, "livecd"); } + } + + public string TemporaryDirectory + { + get { return Path.Combine(BaseDirectory, "obj-i386"); } + } + + public string InstallDirectory + { + get { return Path.Combine(BaseDirectory, "reactos"); } + } + + public string GetPathRoot(PathRoot root) + { + switch (root) + { + case PathRoot.Default: + case PathRoot.SourceCode: + return BaseDirectory; + break; + case PathRoot.LiveCD: + return LiveCDOutputDirectory; + break; + case PathRoot.BootCD: + return BootCDOutputDirectory; + break; + case PathRoot.Intermediate: + return IntermediateDirectory; + break; + case PathRoot.Install: + return InstallDirectory; + break; + case PathRoot.Output: + return OutputDirectory; + break; + case PathRoot.Temporary: + return TemporaryDirectory; + break; + case PathRoot.Platform: + return "%SystemRoot%"; + break; + default: + throw new Exception("Unknown PathRoot"); + } + } + + /// + /// The Base Directory used for relative references. + /// + /// + /// The directory must be rooted. (must start with drive letter, unc, etc.) + /// The BaseDirectory sets and gets the special property named 'nant.project.basedir'. + /// + public string BaseDirectory + { + get + { + //string basedir = null; // = Properties[NANT_PROPERTY_PROJECT_BASEDIR]; + + if (m_BaseDir == null) + return null; + + if (!Path.IsPathRooted(m_BaseDir)) + throw new BuildException("BaseDirectory must be rooted! " + m_BaseDir); + + return m_BaseDir; + } + set + { + if (!Path.IsPathRooted(value)) + throw new BuildException("BaseDirectory must be rooted! " + value); + + m_BaseDir = value; + + //Properties[NANT_PROPERTY_PROJECT_BASEDIR] = value; + } + } + + /// + /// The URI form of the current Document + /// + public Uri BuildFileURI { + get { + //TODO: Need to remove this. + if(Doc == null || Doc.BaseURI == "") { + return null;//new Uri("http://localhost"); + } + else { + return new Uri(Doc.BaseURI); + } + } + } + + /// + /// If the build document is not file backed then null will be returned. + /// + public string BuildFileLocalName { + get { + if (BuildFileURI != null && BuildFileURI.IsFile) { + return BuildFileURI.LocalPath; + } + else { + return null; + } + } + } + + /// Returns the active build file + public virtual XmlDocument Doc { + get { return _doc; } + } + + /// + /// When true tasks should output more build log messages. + /// + public bool Verbose + { + get { return m_Verbose; } + set { m_Verbose = value; } + } + + public bool RunBackends + { + get { return m_ExecuteBackends; } + set { m_ExecuteBackends = value; } + } + + public RBuildPlatform Platform + { + get { return m_Platform; } + } + + public RBuildPropertyCollection Properties + { + get { return m_Properties; } + } + + internal LocationMap LocationMap { + get { return _locationMap; } + } + + ///// + ///// The targets defined in the this project. + ///// + //public TargetCollection Targets + //{ + // get { return m_Targets; } + //} + + /// Executes the default target. + /// + /// No top level error handling is done. Any BuildExceptions will make it out of this method. + /// + public virtual void Execute() + { + //InitializeEnvironment(); + + //will initialize the list of Targets, and execute any global tasks. + InitializeBuildFile(Doc, null); + + RegisterBackends(); + + if (Project.InstallFolders.Count == 0) + { + Project.InstallFolders.Add(new RBuildInstallFolder("1", @".")); + Project.InstallFolders.Add(new RBuildInstallFolder("2", @"system32")); + Project.InstallFolders.Add(new RBuildInstallFolder("3", @"system32\config")); + Project.InstallFolders.Add(new RBuildInstallFolder("4", @"system32\drivers")); + Project.InstallFolders.Add(new RBuildInstallFolder("5", @"system")); + Project.InstallFolders.Add(new RBuildInstallFolder("17", @"system32\drivers\etc")); + Project.InstallFolders.Add(new RBuildInstallFolder("20", @"inf")); + Project.InstallFolders.Add(new RBuildInstallFolder("22", @"fonts")); + Project.InstallFolders.Add(new RBuildInstallFolder("201", @"system32\bin")); + Project.InstallFolders.Add(new RBuildInstallFolder("202", @"media\fonts")); + Project.InstallFolders.Add(new RBuildInstallFolder("203", @"bin")); + Project.InstallFolders.Add(new RBuildInstallFolder("204", @"media")); + } + + if (Project.DebugChannels.Count == 0) + { + Project.DebugChannels.Add(new RBuildDebugChannel("ole")); + Project.DebugChannels.Add(new RBuildDebugChannel("rpc")); + Project.DebugChannels.Add(new RBuildDebugChannel("gdi")); + Project.DebugChannels.Add(new RBuildDebugChannel("crtdll")); + Project.DebugChannels.Add(new RBuildDebugChannel("mshtml")); + Project.DebugChannels.Add(new RBuildDebugChannel("setupapi")); + Project.DebugChannels.Add(new RBuildDebugChannel("typelib")); + Project.DebugChannels.Add(new RBuildDebugChannel("shdocvw")); + Project.DebugChannels.Add(new RBuildDebugChannel("combo")); + Project.DebugChannels.Add(new RBuildDebugChannel("listview")); + Project.DebugChannels.Add(new RBuildDebugChannel("ntdll")); + Project.DebugChannels.Add(new RBuildDebugChannel("richedit")); + Project.DebugChannels.Add(new RBuildDebugChannel("statusbar")); + Project.DebugChannels.Add(new RBuildDebugChannel("text")); + Project.DebugChannels.Add(new RBuildDebugChannel("toolbar")); + } + + if (Project.Languages.Count == 0) + { + Project.Languages.Add(new RBuildLanguage("en-us")); + Project.Languages.Add(new RBuildLanguage("es-es")); + } + + m_RootTask.PreExecute(); + m_RootTask.Execute(); + m_RootTask.PostExecute(); + + SetPlatformDefaults(); + + //m_FileHandlers.Add(new TxtSetupFileHandler(this)); + //m_FileHandlers.Add(new SysSetupFileHandler(this)); + //m_FileHandlers.Add(new UnattendFileHandler(this)); + //m_FileHandlers.Add(new DownloaderFileHandler(this)); + //m_FileHandlers.Add(new AutorunFileHandler(this)); + //m_FileHandlers.Add(new HiveAutoGeneratedFileHandler(this)); + m_FileHandlers.ProcessFiles(Project.Files); + + if (RunBackends) + Backends.Generate(); + } + + private void SetPlatformDefaults() + { + if (SetDefaults) + { + if (Project.Platform.Modules.Count == 0) + { + foreach (RBuildModule module in Project.Modules) + { + Project.Platform.Modules.Add(module); + } + } + + if (Project.Languages.Count == 0) + { + foreach (RBuildLanguage language in Project.Languages) + { + Project.Platform.Languages.Add(language); + } + } + + if (Project.DebugChannels.Count == 0) + { + foreach (RBuildDebugChannel channel in Project.DebugChannels) + { + Project.Platform.DebugChannels.Add(channel); + } + } + } + } + + private void RegisterBackends() + { + //m_Backends.Add(new CatalogBackend(this)); + //m_Backends.Add(new MingwBackend(this)); + m_Backends.Add(new HtmlBackend(this)); + //m_Backends.Add(new RGenStatBackend(this)); + //m_Backends.Add(new BaseAddressReportBackend(this)); + //m_Backends.Add(new BuildLogReport(this)); + //m_Backends.Add(new ProjectTreeReport(this)); + m_Backends.Add(new RBuildDBBackend(this)); + //m_Backends.Add(new APIDocumentation(this)); + } + + public void CleanCustomConfigs() + { + Directory.SetCurrentDirectory (BaseDirectory); + + if (File.Exists("config.rbuild")) + File.Delete("config.rbuild"); + + if (File.Exists("config-arm.rbuild")) + File.Delete("config-arm.rbuild"); + + if (File.Exists("config-ppc.rbuild")) + File.Delete("config-ppc.rbuild"); + } + + public BackendCollection Backends + { + get { return m_Backends; } + } + + private void InitializeEnvironment() + { + Assembly ass = Assembly.GetExecutingAssembly(); + + Properties.AddReadOnly(SYSGEN_PROPERTY_FILENAME, ass.CodeBase); + Properties.AddReadOnly(SYSGEN_PROPERTY_VERSION, ass.GetName().Version.ToString()); + Properties.AddReadOnly(SYSGEN_PROPERTY_LOCATION, AppDomain.CurrentDomain.BaseDirectory); + + Project.Properties.AddReadOnly("CDOUTPUT", BootCDOutputDirectory + @"\reactos"); + Project.Properties.AddReadOnly("INTERMEDIATE", IntermediateDirectory); + Project.Properties.AddReadOnly("SOURCECODE", BaseDirectory); + Project.Properties.AddReadOnly("OUTPUT", OutputDirectory); + Project.Properties.AddReadOnly("INSTALL", InstallDirectory); + Project.Properties.AddReadOnly("TEMP", TemporaryDirectory); + Project.Properties.AddReadOnly("DOC", DocumentationDirectory); + } + + /// + /// Does Execute() and wraps in error handling and time stamping. + /// + /// Indication of success + public bool ReadBuildFiles() + { + //SysGenEngine.OnBuildStarted(this, new BuildEventArgs(_projectName)); + + bool success = true; + try + { + // Remember when the build was started + DateTime startTime = DateTime.Now; + + BuildLog.WriteLine(); + BuildLog.WriteLine("SysGen 0.2"); + BuildLog.WriteLine(); + BuildLog.WriteLine("Running on {0}", Environment.OSVersion.VersionString); + BuildLog.WriteLine(); + BuildLog.WriteLine("Buildfile: {0}", BuildFileURI.AbsolutePath); + BuildLog.WriteLine("Base Directory: {0}", BaseDirectory); + BuildLog.WriteLine(); + BuildLog.WriteLine("Reading rbuild files :"); + BuildLog.WriteLine(); + + Execute(); + + TimeSpan buildTime = DateTime.Now - startTime; + + BuildLog.WriteLine(); + BuildLog.WriteLine("{0} SysGen Module(s) detected.", Project.Modules.Count); + BuildLog.WriteLine("{0} Platform Module(s) detected.", Project.Platform.Modules.Count); + BuildLog.WriteLine(); + BuildLog.WriteLine("SysGen COMPLETED in {0} second(s)", (int)buildTime.TotalSeconds); + BuildLog.WriteLine(); + + //SysGenEngine.OnBuildFinished(this, new BuildEventArgs(_projectName)); + + success = true; + return true; + + } + catch (BuildException e) + { + BuildLog.WriteMessage("Build Failed" , "error"); + BuildLog.WriteLine(); + BuildLog.WriteLine(e.Message); + + if (e.InnerException != null) + { + BuildLog.WriteLine( e.InnerException.Message); + } + + success = false; + return false; + + } + catch (Exception e) + { + //throw; + // all other exceptions should have been caught + string message = "\nINTERNAL ERROR\n" + e.ToString() + "\nPlease send bug report to nant-developers@lists.sourceforge.net"; + BuildLog.WriteMessage(message, "error"); + success = false; + return false; + } + finally + { + //SysGenEngine.OnBuildFinished(this, new BuildEventArgs(_projectName)); + } + } + + /// Combine with project's to form a full path to file or directory. + /// + /// If it is possible for the path to contain property macros the path call first. + /// + /// + /// A rooted path. + /// + /// The relative or absolute path. + public string GetFullPath(string path) { + if (path == null) { + return BaseDirectory; + } + + //Docs above read we should do this. But it should be done before it gets here. + //path = this.ExpandProperties(path); + + if (!Path.IsPathRooted(path)) { + path = Path.Combine(BaseDirectory, path); + } + return path; + } + + public string GetRelativePath(string path) + { + return path.Replace(BaseDirectory +"\\" , string.Empty); + } + + /// + /// Expands a string from known properties + /// + /// The string with replacement tokens + /// The expanded and replaced string + public string ExpandProperties(string input) + { + string output = input; + if (input != null) + { + //matches ${abc} and $(abc) style properties + const string pattern = @"\$\{(?([^\}]*))\}|\$\(((?[^\}]*))\)"; + foreach (Match m in Regex.Matches(input, pattern)) + { + if (m.Length > 0) + { + try + { + string token = m.ToString(); + string propertyName = m.Groups["name"].Value; + + if (Project.Properties[propertyName] != null) + { + output = output.Replace(token, Project.Properties[propertyName].Value); + } + else + throw new BuildException(String.Format("Property '{0}' has not been set!", propertyName)); + } + catch (ArgumentException ae) + { + throw new BuildException(String.Format("Bad formed property")); + } + } + } + } + return output; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/SysGenPathResolver.cs b/reactos/tools/sysgen/SysGen.BuildEngine/SysGenPathResolver.cs new file mode 100644 index 00000000000..1c1947b6d70 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/SysGenPathResolver.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text; + +//using SysGen.RBuild.Framework; +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Attributes; +using SysGen.BuildEngine.Tasks; + +namespace SysGen.BuildEngine +{ + class SysGenPathResolver + { + //public static string GetPath(Task current) + //{ + // return GetPath(current, SysGen.ProjectTask); + //} + + public static string GetPath(Task current, Task root) + { + IElement task = current.Parent; + while (task != root) + { + DirectoryTask directory = task as DirectoryTask; + + if (directory != null) + return directory.Folder.FullPath; + + task = task.Parent; + } + + return string.Empty; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/Base/Task.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/Base/Task.cs new file mode 100644 index 00000000000..5bee2d549d5 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/Base/Task.cs @@ -0,0 +1,257 @@ +using System; +using System.IO; +using System.Reflection; +using System.Xml; + +using SysGen.RBuild.Framework; + +using SysGen.BuildEngine.Log; +using SysGen.BuildEngine.Attributes; +using SysGen.BuildEngine.Tasks; + +namespace SysGen.BuildEngine +{ + public enum TaskExecuteStage + { + PreExecute, + Execute, + PostExecute + } + + /// + /// Provides the abstract base class for tasks. + /// + /// + /// A task is a piece of code that can be executed. + /// + public abstract class Task : Element, ITask + { + protected bool _failOnError = true; + protected bool _verbose = false; + protected bool _ifDefined = true; + protected bool _ifNotDefined = false; + + TaskExecuteStage _stage = TaskExecuteStage.PreExecute; + + /// + /// Determines if task failure stops the build, or is just reported. Default is "true". + /// + [TaskAttribute("failonerror")] + [BooleanValidator()] + public bool FailOnError { + get { return _failOnError; } + set { _failOnError = value; } + } + + /// + /// Task reports detailed build log messages. Default is "false". + /// + [TaskAttribute("verbose")] + [BooleanValidator()] + public bool Verbose { + get { return (_verbose || SysGen.Verbose); } + set { _verbose = value; } + } + + /// + /// If true then the task will be executed; otherwise skipped. Default is "true". + /// + [TaskAttribute("if")] + [BooleanValidator()] + public bool IfDefined { + get { return _ifDefined; } + set { _ifDefined = value; } + } + + /// + /// Opposite of if. If false then the task will be executed; otherwise skipped. Default is "false". + /// + [TaskAttribute("ifnot")] + [BooleanValidator()] + public bool IfNotDefined + { + get { return _ifNotDefined; } + set { _ifNotDefined = value; } + } + + public string XmlFile + { + get { return new Uri(_xmlNode.OwnerDocument.BaseURI).LocalPath; } + } + + public string RBuildFile + { + get { return Path.GetFileName(XmlFile); } + } + + /// The name of the task. + public override string Name { + get { + string name = null; + TaskNameAttribute taskName = (TaskNameAttribute) Attribute.GetCustomAttribute(GetType(), typeof(TaskNameAttribute)); + if (taskName != null) { + name = taskName.Name; + } + return name; + } + } + + public RBuildFolder InFolder + { + get + { + IElement task = Parent; + while (task != SysGen.RootTask) + { + DirectoryTask directory = task as DirectoryTask; + + if (directory != null) + return directory.Folder; + + task = task.Parent; + } + + return SysGen.Project.Folder; + } + } + + /// + /// The prefix used when sending messages to the log. + /// + public string LogPrefix { + get { + string prefix = "[" + Name + "] "; + return prefix.PadLeft(BuildLog.IndentSize); + } + } + + private TaskExecuteStage ExecutionStage + { + get { return _stage; } + } + + /// + /// Executes the task unless it is skipped. Do not ovveride/new this method. Use ExecuteTask instead. + /// + public void Execute() + { + RunTask(TaskExecuteStage.Execute); + } + + public void PostExecute() + { + RunTask(TaskExecuteStage.PostExecute); + } + + public void PreExecute() + { + RunTask(TaskExecuteStage.PreExecute); + } + + private void RunTask (TaskExecuteStage stage) + { + // Save the current execution stage + _stage = stage; + + if (IfDefined && !IfNotDefined) + { + try + { + SysGenEngine.OnTaskStarted(this, new BuildEventArgs(Name)); + + switch (stage) + { + case TaskExecuteStage.PreExecute: + PreExecuteTask(); + break; + case TaskExecuteStage.Execute: + ExecuteTask(); + break; + case TaskExecuteStage.PostExecute: + PostExecuteTask(); + break; + } + + if (this is ITaskContainer) + { + ITaskContainer taskContainer = this as ITaskContainer; + + if (taskContainer.ExecuteChilds) + { + foreach (Task taskChild in taskContainer.ChildTasks) + { + taskChild.RunTask(stage); + } + } + } + } + catch (Exception e) + { + SysGenEngine.OnTaskException(this, new BuildEventArgs(Name)); + + if (FailOnError) + { + throw; + } + else + { + BuildLog.WriteLine(e.Message); + if (e.InnerException != null) + { + BuildLog.WriteLine(e.InnerException.Message); + } + } + } + finally + { + SysGenEngine.OnTaskFinished(this, new BuildEventArgs(Name)); + } + } + } + + protected override void InitializeElement(XmlNode elementNode) + { + if (this is ITaskContainer) + { + ITaskContainer taskContainer = this as ITaskContainer; + + foreach (XmlNode childNode in elementNode.ChildNodes) + { + if (SysGen.CanProcessNode(childNode)) + SysGen.LoadChildTask(childNode, taskContainer); + } + } + + // Just defer for now so that everything just works + InitializeTask(elementNode); + } + + /// Initializes the task. + protected virtual void InitializeTask(XmlNode taskNode) + { + } + + protected virtual void PostExecuteTask() + { + } + + /// + /// Executes the task. + /// + protected virtual void ExecuteTask() + { + } + + /// + /// Executes the task. + /// + protected virtual void PreExecuteTask() + { + } + + public override string ToString() + { + return Name; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/Base/TaskContainer.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/Base/TaskContainer.cs new file mode 100644 index 00000000000..2de6d0e28ca --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/Base/TaskContainer.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine +{ + /// + /// A Generic Task Container + /// + public abstract class TaskContainer : Task , ITaskContainer + { + protected bool m_ExecuteChilds = true; + protected TaskCollection _childTasks = new TaskCollection(); + + /// + /// Available child instances. + /// + public TaskCollection ChildTasks + { + get { return _childTasks; } + } + + public bool ExecuteChilds + { + get { return m_ExecuteChilds; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Build/XIFallbackTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Build/XIFallbackTask.cs new file mode 100644 index 00000000000..535407ef36f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Build/XIFallbackTask.cs @@ -0,0 +1,11 @@ +using System; + +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("fallback", Namespace = "xi")] + public class XIFallbackTask : TaskContainer + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Build/XIIncludeTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Build/XIIncludeTask.cs new file mode 100644 index 00000000000..66b66c028df --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Build/XIIncludeTask.cs @@ -0,0 +1,148 @@ +using System; +using System.IO; +using System.Xml; +using System.Collections; +using System.Collections.Specialized; + +using SysGen.BuildEngine.Attributes; +using SysGen.BuildEngine.Log; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + /// + /// Include an external build file. + /// + [TaskName("include", Namespace = "xi")] + public class XIIncludeTask : FileSystemInfoBaseTask, ITaskContainer //TaskContainer + { + private TaskCollection m_ChildTasks = new TaskCollection(); + + /// + /// Used to check for recursived includes. + /// + private static Stack _includedFiles = new Stack(); + + ///// + ///// The file to be included + ///// + //private string _href = null; + + /// Build file to include. + [TaskAttribute("href", Required = true)] + public string BuildFileName + { + get { return m_FileSystemInfo.Name; } + set { m_FileSystemInfo.Name = value; } + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildFile(); + } + + public TaskCollection ChildTasks + { + get { return m_ChildTasks; } + } + + public bool ExecuteChilds + { + get { return true; } + } + + protected override void OnInit() + { + base.OnInit(); + + Base = SysGenPathResolver.GetPath(this, SysGen.RootTask); + } + + /// Verify parameters. + /// Xml taskNode used to define this task instance. + protected override void InitializeTask(XmlNode taskNode) + { + //base.InitializeTask(taskNode); + + FailOnError = false; + + /* + // Task can only be included as a global task. + // This might not be a firm requirement but you could get some real + // funky errors if you start including targets wily-nily. + if (Parent != null ) + { + if ((!(Parent is RbuildTask)) || (!(Parent is ProjectTask))) + throw new BuildException("Task not allowed in targets. Must be at project level.", Location); + } + */ + + // Check for recursive include. + string buildFileName = Path.Combine(BaseBuildLocation, BuildFileName); + foreach (string currentFileName in _includedFiles) { + if (currentFileName == buildFileName) { + throw new BuildException("Recursive includes are not allowed.", Location); + } + } + + string includedFileName = Path.Combine(BaseBuildLocation , BuildFileName); + string includeRelative = SysGen.GetRelativePath(includedFileName); + + // push ourselves onto the stack (prevents recursive includes) + _includedFiles.Push(includedFileName); + + BuildLog.WriteLine("Including {0}", includeRelative); + + try + { + XmlDocument doc = new XmlDocument(); + doc.XmlResolver = null; + doc.Load(includedFileName); + + SysGen.InitializeBuildFile(doc, this); + + SysGen.BuildFiles.Add(includedFileName); + } + catch (BuildException) + { + throw; + } + catch (IOException e) + { + try + { + if (ChildTasks.Count == 0) + throw new BuildException("Could not include build file " + includedFileName, Location, e); + + BuildLog.WriteLine("Including {0} Failed. Fallback present and executed", includeRelative); + //BuildLog.WriteLine("Include {0} not found. Fallback executed", includeRelative); + } + catch (Exception fallbackException) + { + throw new BuildException("Could not include build file " + includedFileName + " fallback also failed", Location, fallbackException); + } + } + catch (ArgumentException e) + { + //Puede pasar + } + catch (Exception e) + { + throw new BuildException("Could not include build file " + includedFileName + " " + e.Message, Location, e); + } + finally + { + // pop off the stack + _includedFiles.Pop(); + } + } + + protected override void ExecuteTask() + { + } + + protected override void PreExecuteTask() + { + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Logic/IfNotTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Logic/IfNotTask.cs new file mode 100644 index 00000000000..b1530a34756 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Logic/IfNotTask.cs @@ -0,0 +1,49 @@ +using System; +using System.IO; +using System.Collections; +using System.Collections.Specialized; + +using SysGen.BuildEngine.Attributes; +using SysGen.BuildEngine.Log; + +namespace SysGen.BuildEngine.Tasks +{ + /// + /// The opposite of the if task. + /// + /// + /// Check existence of a property + /// + /// + /// + ///
+ /// ]]> + /// + /// Check that a property value is not true + /// + /// + /// + /// + /// ]]> + /// + /// + /// + /// Check that a target does not exist + /// + /// + /// + /// + /// ]]> + /// + [TaskName("ifnot")] + public class IfNotTask : IfTask + { + protected override bool ConditionsTrue + { + get { return !base.ConditionsTrue; } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Logic/IfTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Logic/IfTask.cs new file mode 100644 index 00000000000..a9bff9a22e6 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/BuiltIn/Logic/IfTask.cs @@ -0,0 +1,134 @@ +using System; +using System.IO; +using System.Collections; +using System.Collections.Specialized; + +using SysGen.BuildEngine.Attributes; +using SysGen.BuildEngine.Log; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("if")] + public class IfTask : TaskContainer + { + protected string _propName = null; + protected string _propValue = null; + protected string _propNameTrue = null; + protected string _propNameExists = null; + + /// + /// Used to test whether a property is true. + /// + [TaskAttribute("propertytrue")] + public string PropertyNameTrue { + set {_propNameTrue = value;} + } + + /// + /// Used to test whether a property exists. + /// + [TaskAttribute("propertyexists")] + public string PropertyNameExists { + set {_propNameExists = value;} + } + + /// + /// Used to test whether a property exists. + /// + [TaskAttribute("property")] + public string PropertyName + { + set { _propName = value; } + } + + /// + /// Used to test whether a property exists. + /// + [TaskAttribute("value")] + public string PropertyValue + { + set { _propValue = value; } + } + + protected override void PreExecuteTask() + { + if (!ConditionsTrue) + { + m_ExecuteChilds = false; + } + } + + /* + protected override void ExecuteTask() { + if(!ConditionsTrue) { + m_ExecuteChilds = false; + } + }*/ + + protected virtual bool ConditionsTrue + { + get + { + bool ret = true; + + if (_propName != null) + { + if (_propValue != null) + { + if (SysGen.Project.Properties.PropertyExists(_propName)) + { + return (SysGen.Project.Properties[_propName].Value == _propValue); + } + + return false; + } + else + { + ret = ret && SysGen.Project.Properties.PropertyExists(_propNameExists); + } + } + + ////check for target + //if(_targetName != null) { + // ret = ret && (SysGen.Targets.Find(_targetName) != null); + // if (!ret) return false; + //} + + //Check for the Property value of true. + if (_propNameTrue != null) + { + try + { + ret = ret && bool.Parse(SysGen.Project.Properties[_propNameTrue].Value); + } + catch (Exception e) + { + throw new BuildException("Property True test failed for '" + _propNameTrue + "'", Location, e); + } + } + + //Check for Property existence + if(_propNameExists != null) + { + ret = ret && SysGen.Project.Properties.PropertyExists(_propNameExists); + } + + ////check for uptodate file + //if(_uptodateFile != null) { + // FileInfo primaryFile = new FileInfo(_uptodateFile); + // if(primaryFile == null) { + // ret = true; + // } + // else { + // string newerFile = FileSet.FindMoreRecentLastWriteTime(_compareFiles.FileNames, primaryFile.LastWriteTime); + // bool bNeedsAnUpdate = (null == newerFile); + // BuildLog.WriteLineIf(SysGen.Verbose && bNeedsAnUpdate, "{0) is newer than {1}" , newerFile, primaryFile.Name); + // ret = !bNeedsAnUpdate; + // } + //} + + return ret; + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoFilesTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoFilesTask.cs new file mode 100644 index 00000000000..6e74be382a7 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoFilesTask.cs @@ -0,0 +1,63 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class AutoFilesBaseTask : AutoResolvableFileSystemInfoBaseTask + { + private string m_Pattern = "*.*"; + + public AutoFilesBaseTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildFolder(); + } + + public RBuildFolder Folder + { + get { return m_FileSystemInfo as RBuildFolder; } + } + + [TaskAttribute("pattern")] + public string Pattern { get { return m_Pattern; } set { m_Pattern = value; } } + + protected override void ExecuteTask() + { + base.ExecuteTask(); + + foreach(string file in Directory.GetFiles (SysGen.ResolveRBuildFolderPath(Folder) , Pattern)) + { + AddFile(file); + } + } + + protected abstract void AddFile (string file); + } + + [TaskName("autoinstallfiles")] + public class AutoInstallFiles : AutoFilesBaseTask + { + private string m_InstallBase = "."; + + [TaskAttribute("installbase")] + public string InstallBase { get { return m_InstallBase; } set { m_InstallBase = value; } } + + protected override void AddFile(string file) + { + RBuildInstallFile autoFile = new RBuildInstallFile(); + + autoFile.Root = Root; + autoFile.Base = Folder.Base; + autoFile.Name = Path.GetFileName(file); + autoFile.InstallBase = InstallBase; + + RBuildElement.Files.Add(autoFile); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoInstallFilesTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoInstallFilesTask.cs new file mode 100644 index 00000000000..9548900348d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoInstallFilesTask.cs @@ -0,0 +1,15 @@ +using System; +using System.IO; + +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + //[TaskName("autoinstallfiles")] + //public class AutoInstallFilesTask : AutoFilesTask + //{ + // protected override void ExecuteTask() + // { + // } + //} +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoManifest.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoManifest.cs new file mode 100644 index 00000000000..866d06eb058 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoManifest.cs @@ -0,0 +1,15 @@ +using System; +using System.IO; + +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("automanifest")] + public class AutoManifest : ValueBaseTask + { + protected override void ExecuteTask() + { + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoRegisterTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoRegisterTask.cs new file mode 100644 index 00000000000..045fdb851ac --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoRegisterTask.cs @@ -0,0 +1,33 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("autoregister")] + public class AutoRegisterTask : Task + { + RBuildAutoRegister m_AutoRegister = new RBuildAutoRegister(); + + [TaskAttribute("type", Required = true)] + public AutoRegisterType Type { get { return m_AutoRegister.Type; } set { m_AutoRegister.Type = value; } } + + [TaskAttribute("infsection", Required = true)] + public string InfSection { get { return m_AutoRegister.InfSection; } set { m_AutoRegister.InfSection = value; } } + + protected override void ExecuteTask() + { + if ((Module.Type == ModuleType.Win32DLL) || + (Module.Type == ModuleType.Win32OCX)) + { + if (Module.AutoRegister != null) + throw new BuildException("There can be only one element for a module", Location); + + Module.AutoRegister = m_AutoRegister; + } + else + throw new BuildException(" is not applicable for this module type", Location); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoResource.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoResource.cs new file mode 100644 index 00000000000..359132395d1 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/AutoResource.cs @@ -0,0 +1,15 @@ +using System; +using System.IO; + +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + //[TaskName("autoresource")] + //public class AutoResourceTask : AutoFilesTask + //{ + // protected override void ExecuteTask() + // { + // } + //} +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/AuthorBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/AuthorBaseTask.cs new file mode 100644 index 00000000000..a12ea2f5202 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/AuthorBaseTask.cs @@ -0,0 +1,26 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class AuthorBaseTask : Task + { + protected string m_Alias = null; + protected RBuildAuthor m_Author = new RBuildAuthor(); + + [TaskValue(Required=true)] + public virtual string Alias { get { return m_Alias; } set { m_Alias = value; } } + + protected override void ExecuteTask() + { + m_Author.Contributor = Project.Contributors.GetByName(Alias); + + if (m_Author.Contributor == null) + throw new BuildException(string.Format("Could not resolve contributor '{0}' referenced by module '{1}'", Alias, Module.Name, Location)); + + Module.Authors.Add(m_Author); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/AutoFilesTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/AutoFilesTask.cs new file mode 100644 index 00000000000..7a4dc70523b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/AutoFilesTask.cs @@ -0,0 +1,19 @@ +using System; +using System.IO; + +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + //public abstract class AutoFilesTask : Task + //{ + // FileSet files = new FileSet(); + + // [FileSet("files")] + // public FileSet Files + // { + // get { return files; } + // set { files = value; } + // } + //} +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/CDFileBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/CDFileBaseTask.cs new file mode 100644 index 00000000000..869df983965 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/CDFileBaseTask.cs @@ -0,0 +1,42 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class CDFileBaseTask : FileBaseTask //PlatformFileBaseTask + { + public CDFileBaseTask() + { + } + + [TaskAttribute("installbase")] + public string InstallBase { get { return CDFile.InstallBase; } set { CDFile.InstallBase = value; } } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildCDFile(); + } + + /// + /// The name of the define to set. + /// + [TaskAttribute("nameoncd")] + public string NameOnCD { get { return CDFile.NewName; } set { CDFile.NewName = value; } } + + private RBuildCDFileBase CDFile + { + get { return m_FileSystemInfo as RBuildCDFileBase; } + } + + protected override void ExecuteTask() + { + //Call the base class + base.ExecuteTask(); + + //Add the file + RBuildElement.Files.Add(CDFile); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FileBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FileBaseTask.cs new file mode 100644 index 00000000000..67773a31bed --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FileBaseTask.cs @@ -0,0 +1,47 @@ +using System; +using System.IO; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class FileBaseTask : FileSystemInfoBaseTask + { + public FileBaseTask() + { + } + + /// + /// The define value. + /// + [TaskValue] + public virtual string FileName { get { return m_FileSystemInfo.Name; } set { m_FileSystemInfo.Name = value; } } + + ///// + ///// Get the underlying . + ///// + //public RBuildPlatformFile PlatformFile + //{ + // get { return m_FileSystemInfo as RBuildPlatformFile; } + //} + + //public override string BasePath + //{ + // get + // { + // IElement task = this; + // while (task != SysGen.ProjectTask) + // { + // if (task is IDirectory) + // return ((IDirectory)task).BasePath; + + // task = task.Parent; + // } + + // //Is in the root + // return string.Empty; + // } + //} + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FileSystemInfoBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FileSystemInfoBaseTask.cs new file mode 100644 index 00000000000..3046065d483 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FileSystemInfoBaseTask.cs @@ -0,0 +1,119 @@ +using System; +using System.IO; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class AutoResolvableFileSystemInfoBaseTask : FileSystemInfoBaseTask + { + protected override bool TryToResolveBasePath() + { + if (Base == "eventlog_server") + { + int i = 10; + } + + if ((Base != null) && (Base != string.Empty)) + { + if (Base != Project.Name) + { + // Get the referenced module + RBuildModule module = Project.Modules.GetByName(Base); + + if (module == null) + throw new BuildException(string.Format("Could not resolve module base '{0}' for module '{1}'", Base, Module.Name, Location)); + + // If no path has been specified by the user + // set the module default path + if (Root == PathRoot.Default) + Root = module.IncludeDefaultRoot; + + // Set the base to the module root + m_FileSystemInfo.Base = module.Folder.FullPath; + } + else + { + // Set the base to the project root + m_FileSystemInfo.Base = Project.Base; + } + } + else + { + // Set the base to the folder containing the module + m_FileSystemInfo.Base = InFolder.FullPath; + } + + if (m_FileSystemInfo.Base == null || m_FileSystemInfo.Name == null) + { + int i = 10; + } + + return true; + } + } + + public abstract class FileSystemInfoBaseTask : Task + { + protected RBuildFileSystemInfo m_FileSystemInfo = null; + + public FileSystemInfoBaseTask() + { + CreateFileSystemObject(); + } + + protected abstract void CreateFileSystemObject(); + + /// + /// The name of the define to set. + /// + [TaskAttribute("base")] + public string Base { get { return m_FileSystemInfo.Base; } set { m_FileSystemInfo.Base = value; } } + + /// + /// The name of the define to set. + /// + [TaskAttribute("root")] + public PathRoot Root { get { return m_FileSystemInfo.Root; } set { m_FileSystemInfo.Root = value; } } + + /// + /// Get the underlying . + /// + public RBuildFileSystemInfo FileSystemInfo + { + get { return m_FileSystemInfo; } + } + + protected virtual void SetRBuildElement() + { + //m_FileSystemInfo.Element = RBuildElement; + } + + protected virtual void SetRootFromParent() + { + } + + protected virtual bool TryToResolveBasePath () + { + return false; + } + + protected override void PreExecuteTask() + { + SetRootFromParent(); + SetRBuildElement(); + } + + protected override void ExecuteTask() + { + // Give the oportunity to subclasses to resolve the path + if (!TryToResolveBasePath()) + { + // If no base path has been specified default to current + if (string.IsNullOrEmpty(Base)) + Base = SysGenPathResolver.GetPath(this, SysGen.RootTask); + } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FolderBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FolderBaseTask.cs new file mode 100644 index 00000000000..c17c86473f2 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/FolderBaseTask.cs @@ -0,0 +1,15 @@ +//using System; + +//using SysGen.BuildEngine.Attributes; +//using SysGen.RBuild.Framework; + +//namespace SysGen.BuildEngine.Tasks +//{ +// public abstract class FolderBaseTask : Task +// { +// protected override void CreateFileSystemObject() +// { +// m_FileSystemInfo = new RBuildFolder(); +// } +// } +//} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/PlatformFileBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/PlatformFileBaseTask.cs new file mode 100644 index 00000000000..2bfa1c70702 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/PlatformFileBaseTask.cs @@ -0,0 +1,37 @@ +using System; +using System.IO; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class PlatformFileBaseTask : FileBaseTask + { + /// + /// The define value. + /// + [TaskValue] + public string FileName { get { return m_FileSystemInfo.Name; } set { m_FileSystemInfo.Name = value; } } + + [TaskAttribute("installbase")] + public string InstallBase { get { return PlatformFile.InstallBase; } set { PlatformFile.InstallBase = value; } } + + /// + /// Get the underlying . + /// + public RBuildPlatformFile PlatformFile + { + get { return m_FileSystemInfo as RBuildPlatformFile; } + } + + protected override void ExecuteTask() + { + //Call the base class + base.ExecuteTask(); + + //Add the file + RBuildElement.Files.Add(PlatformFile); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/PropertyBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/PropertyBaseTask.cs new file mode 100644 index 00000000000..cc9e8fd8c55 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/PropertyBaseTask.cs @@ -0,0 +1,38 @@ +using System; +using System.Xml; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class PropertyBaseTask : Task + { + protected string m_Name = null; + protected string m_Value = String.Empty; + protected bool m_ReadOnly = false; + protected bool m_Internal = false; + + /// the name of the property to set. + [TaskAttribute("name", Required=true)] + public string PropName { get { return m_Name; } set { m_Name = value; } } + + /// the value of the property. + [TaskAttribute("value", Required=true)] + public string Value { get { return m_Value; } set { m_Value = value; } } + + /// the value of the property. + [TaskAttribute("readonly")] + [BooleanValidator()] + public bool ReadOnly { get { return m_ReadOnly; } set { m_ReadOnly = value; } } + + [TaskAttribute("internal")] + [BooleanValidator()] + public bool Internal { get { return m_Internal; } set { m_Internal = value; } } + + protected override void OnLoad() + { + Project.Properties.Add(new RBuildProperty(m_Name, m_Value, m_ReadOnly, m_Internal)); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/RbuildElementBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/RbuildElementBaseTask.cs new file mode 100644 index 00000000000..7afe7a5f9ab --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/RbuildElementBaseTask.cs @@ -0,0 +1,16 @@ +using System; +using System.Xml; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class RbuildElementBaseTask : Task + { + protected override void OnLoad() + { + + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/ValueBaseTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/ValueBaseTask.cs new file mode 100644 index 00000000000..ae1c1137c7f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Base/ValueBaseTask.cs @@ -0,0 +1,16 @@ +using System; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + public abstract class ValueBaseTask : Task + { + protected string _value = null; + + /// + /// The define value. + /// + [TaskValue] + public virtual string Value { get { return _value; } set { _value = value; } } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BaseAdressTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BaseAdressTask.cs new file mode 100644 index 00000000000..39ea6a8c071 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BaseAdressTask.cs @@ -0,0 +1,17 @@ +using System; +using System.Xml; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("baseadress")] + public class BaseAdressTask : PropertyBaseTask + { + protected override void OnLoad() + { + Project.Properties.Add(new RBuildBaseAdress(m_Name, m_Value)); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootSector.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootSector.cs new file mode 100644 index 00000000000..05ce34d2b35 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootSector.cs @@ -0,0 +1,44 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("bootsector")] + public class BootSector : ValueBaseTask + { + protected override void ExecuteTask() + { + RBuildModule bootModule = Project.Modules.GetByName(Value); + + if (bootModule != null) + { + if (bootModule.Type == ModuleType.BootSector) + { + if (Module.Type == ModuleType.Iso || + Module.Type == ModuleType.IsoRegTest || + Module.Type == ModuleType.LiveIso || + Module.Type == ModuleType.LiveIsoRegTest) + { + if (Module.BootSector == null) + Module.BootSector = bootModule; + } + else + throw new BuildException(" is not applicable for this module type.", Location); + } + else + throw new BuildException(" for module '{0}' is referencing a non BootSector module '{1}'", + Module.Name, + bootModule.Name, + Location); + } + else + throw new BuildException(" for module '{0}' is referencing a non existing module '{1}'", + Module.Name, + Value, + Location); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootstrapFileTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootstrapFileTask.cs new file mode 100644 index 00000000000..7d68ee9fc99 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootstrapFileTask.cs @@ -0,0 +1,40 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("bootstrapfile")] + public class BootstrapFileTask : CDFileBaseTask //FileBaseTask ///PlatformFileBaseTask + { + public BootstrapFileTask() + { + } + + [TaskValue] + public string FileName { get { return m_FileSystemInfo.Name; } set { m_FileSystemInfo.Name = value; } } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildBootstrapFile(); + } + + public RBuildBootstrapFile BootStrapFile + { + get { return m_FileSystemInfo as RBuildBootstrapFile; } + } + + protected override bool TryToResolveBasePath() + { + Base = "i386"; + return true; + } + + protected override void ExecuteTask() + { + //Call the base class + base.ExecuteTask(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootstrapTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootstrapTask.cs new file mode 100644 index 00000000000..a3713de30bf --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BootstrapTask.cs @@ -0,0 +1,52 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("bootstrap")] + public class BootstrapTask : CDFileBaseTask + { + public BootstrapTask() + { + m_FileSystemInfo = new RBuildBootstrapFile(); + } + + private RBuildBootstrapFile BootstrapFile + { + get { return m_FileSystemInfo as RBuildBootstrapFile; } + } + + protected override void ExecuteTask() + { + if ((Module.Type == ModuleType.Kernel) || + (Module.Type == ModuleType.KernelModeDLL) || + (Module.Type == ModuleType.KeyboardLayout) || + (Module.Type == ModuleType.KernelModeDriver) || + (Module.Type == ModuleType.NativeDLL) || + (Module.Type == ModuleType.NativeCUI) || + (Module.Type == ModuleType.Win32DLL) || + (Module.Type == ModuleType.Win32OCX) || + (Module.Type == ModuleType.Win32CUI) || + (Module.Type == ModuleType.Win32SCR) || + (Module.Type == ModuleType.Win32GUI) || + (Module.Type == ModuleType.BootSector) || + (Module.Type == ModuleType.BootLoader) || + (Module.Type == ModuleType.BootProgram) || + (Module.Type == ModuleType.Cabinet)) + { + BootstrapFile.Element = RBuildElement; + BootstrapFile.Name = Module.TargetName; + BootstrapFile.Root = Module.TargetDefaultRoot; + BootstrapFile.Base = Module.Folder.FullPath; + + Module.Bootstrap = BootstrapFile; + + //Project.Files.Add(BootstrapFile); + } + else + throw new BuildException(" is not applicable for this module type.", Location); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BuildFamilyTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BuildFamilyTask.cs new file mode 100644 index 00000000000..29d2ead87aa --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/BuildFamilyTask.cs @@ -0,0 +1,27 @@ +using System; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + /// + /// Just a task container + /// + [TaskName("buildfamily")] + public class BuildFamilyTask : Task + { + private RBuildBuildFamily m_BuildFamily = new RBuildBuildFamily(); + + [TaskAttribute("name", Required = true)] + public string FamilyName { get { return m_BuildFamily.Name; } set { m_BuildFamily.Name = value; } } + + [TaskAttribute("description")] + public string FamilyDescription { get { return m_BuildFamily.Description; } set { m_BuildFamily.Description = value; } } + + protected override void PreExecuteTask() + { + Project.BuildFamilies.Add(m_BuildFamily); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CDFileTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CDFileTask.cs new file mode 100644 index 00000000000..6f9b6bcf13a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CDFileTask.cs @@ -0,0 +1,20 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("cdfile")] + public class CDFileTask : CDFileBaseTask + { + public CDFileTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildCDFile(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CompilationUnitTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CompilationUnitTask.cs new file mode 100644 index 00000000000..d08a5005ed7 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CompilationUnitTask.cs @@ -0,0 +1,58 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("compilationunit")] + public class CompilationUnitTask : FileSystemInfoBaseTask, ITaskContainer, IRBuildSourceFilesContainer + { + private TaskCollection m_ChildTasks = new TaskCollection(); + + public CompilationUnitTask() + { + Root = PathRoot.Intermediate; + } + + public TaskCollection ChildTasks + { + get { return m_ChildTasks; } + } + + public bool ExecuteChilds + { + get { return true; } + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildCompilationUnitFile(); + } + + public RBuildCompilationUnitFile CompilationUnit + { + get { return m_FileSystemInfo as RBuildCompilationUnitFile; } + } + + public RBuildSourceFileCollection SourceFiles + { + get { return CompilationUnit.SourceFiles; } + } + + /// + /// The name of the compilation unit to set. + /// + [TaskAttribute("name")] + public string FileName { get { return m_FileSystemInfo.Name; } set { m_FileSystemInfo.Name = value; } } + + protected override void ExecuteTask() + { + base.ExecuteTask(); + + // Add the compilation unit to the current module + Module.CompilationUnits.Add(CompilationUnit); + } + + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CompilerFlagTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CompilerFlagTask.cs new file mode 100644 index 00000000000..87eb278d232 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/CompilerFlagTask.cs @@ -0,0 +1,14 @@ +using System; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("compilerflag")] + public class CompilerFlagTask : ValueBaseTask + { + protected override void ExecuteTask() + { + RBuildElement.CompilerFlags.Add(Value); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ComponentTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ComponentTask.cs new file mode 100644 index 00000000000..7063b105a2d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ComponentTask.cs @@ -0,0 +1,12 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("component")] + public class ComponentTask : Task + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ContributorTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ContributorTask.cs new file mode 100644 index 00000000000..a6528adddea --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ContributorTask.cs @@ -0,0 +1,42 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("contributor")] + public class ContributorTask : Task + { + private RBuildContributor m_Contributor = new RBuildContributor(); + + [TaskAttribute("firstname", Required = true)] + public string FirstName { get { return m_Contributor.FirstName; } set { m_Contributor.FirstName = value; } } + + [TaskAttribute("city")] + public string City { get { return m_Contributor.City; } set { m_Contributor.City = value; } } + + [TaskAttribute("country")] + public string Country { get { return m_Contributor.Country; } set { m_Contributor.Country = value; } } + + [TaskAttribute("lastname")] + public string LastName { get { return m_Contributor.LastName; } set { m_Contributor.LastName = value; } } + + [TaskAttribute("alias")] + public string Alias { get { return m_Contributor.Alias; } set { m_Contributor.Alias = value; } } + + [TaskAttribute("mail")] + public string Mail { get { return m_Contributor.Mail; } set { m_Contributor.Mail = value; } } + + [TaskAttribute("website")] + public string Website { get { return m_Contributor.Website; } set { m_Contributor.Website = value; } } + + [TaskAttribute("active")] + public bool Active { get { return m_Contributor.Active; } set { m_Contributor.Active = value; } } + + protected override void ExecuteTask() + { + Project.Contributors.Add(m_Contributor); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DebugChannelTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DebugChannelTask.cs new file mode 100644 index 00000000000..886d0489155 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DebugChannelTask.cs @@ -0,0 +1,54 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("debugchannel")] + public class DebugChannelTask : Task + { + RBuildDebugChannel m_DebugChannel = new RBuildDebugChannel(); + + [TaskAttribute("name")] + [TaskValue] + public string ChannelName + { + get { return m_DebugChannel.Name; } + set { m_DebugChannel.Name = value; } + } + + [TaskAttribute("warning")] + public bool Warning + { + get { return m_DebugChannel.Warn; } + set { m_DebugChannel.Warn = value; } + } + + [TaskAttribute("trace")] + public bool Trace + { + get { return m_DebugChannel.Trace; } + set { m_DebugChannel.Trace = value; } + } + + [TaskAttribute("fixme")] + public bool Fixme + { + get { return m_DebugChannel.Fixme; } + set { m_DebugChannel.Fixme = value; } + } + + [TaskAttribute("error")] + public bool Error + { + get { return m_DebugChannel.Error; } + set { m_DebugChannel.Error = value; } + } + + protected override void ExecuteTask() + { + Project.DebugChannels.Add(m_DebugChannel); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DefineTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DefineTask.cs new file mode 100644 index 00000000000..071ff49d50f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DefineTask.cs @@ -0,0 +1,45 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("define")] + public class DefineTask : Task + { + private string _name = null; + private string _value = String.Empty; + private string _backend = String.Empty; + private bool _empty = false; + + /// + /// The name of the define to set. + /// + [TaskAttribute("name", Required=true)] + public string DefineName { get { return _name; } set { _name = value; } } + + /// + /// The define value. + /// + [TaskAttribute("value")] + [TaskValue] + public string DefineValue { get { return _value; } set { _value = value; } } + + /// + /// The name of the define to set. + /// + [TaskAttribute("empty")] + [BooleanValidator] + public bool Empty { get { return _empty; } set { _empty = value; } } + + // TODO : Remove ? + [TaskAttribute("backend")] + public string Backend { get { return _backend; } set { _backend = value; } } + + protected override void ExecuteTask() + { + RBuildElement.Defines.Add(new RBuildDefine(DefineName, DefineValue)); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DependencyTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DependencyTask.cs new file mode 100644 index 00000000000..d9a90606f42 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DependencyTask.cs @@ -0,0 +1,27 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("dependency")] + public class DependencyTask : ValueBaseTask + { + /// + /// The define value. + /// + [TaskValue(Required = true)] + public virtual string Value { get { return _value; } set { _value = value; } } + + protected override void ExecuteTask() + { + RBuildModule dependency = Project.Modules.GetByName(Value); + + if (dependency == null) + throw new BuildException("Unknown dependency '{0}' referenced by module '{1}'", Value, Module.Name); + + Module.Dependencies.Add(dependency); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DeveloperTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DeveloperTask.cs new file mode 100644 index 00000000000..1c2a6a4fe61 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DeveloperTask.cs @@ -0,0 +1,16 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("developer")] + public class DeveloperTask : AuthorBaseTask + { + public DeveloperTask() + { + m_Author.Role = AuthorRole.Developer; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DirectoryTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DirectoryTask.cs new file mode 100644 index 00000000000..efc632767c8 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/DirectoryTask.cs @@ -0,0 +1,59 @@ +using System.IO; +using System.Collections.Generic; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("directory")] + public class DirectoryTask : FileSystemInfoBaseTask, ITaskContainer//, IDirectory + { + private TaskCollection m_ChildTasks = new TaskCollection(); + + public DirectoryTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildFolder(); + } + + public TaskCollection ChildTasks + { + get { return m_ChildTasks; } + } + + public bool ExecuteChilds + { + get { return true; } + } + + /// + /// The directory name. + /// + [TaskAttribute("name", Required = true)] + public virtual string Name { get { return m_FileSystemInfo.Name; } set { m_FileSystemInfo.Name = value; } } + + public RBuildFolder Folder + { + get { return m_FileSystemInfo as RBuildFolder; } + } + + protected override void OnInit() + { + base.OnInit(); + + Base = SysGenPathResolver.GetPath(this, SysGen.RootTask); + } + + protected override void ExecuteTask() + { + base.ExecuteTask(); + + if (RBuildElement.Folders.Contains(Folder) == false) + RBuildElement.Folders.Add(Folder); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/FamilyTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/FamilyTask.cs new file mode 100644 index 00000000000..6051c9b52c8 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/FamilyTask.cs @@ -0,0 +1,28 @@ +using System; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("family")] + public class FamilyTask : Task + { + private RBuildFamily m_Family = new RBuildFamily(); + + [TaskValue(Required = true)] + public string FamilyName { get { return m_Family.Name; } set { m_Family.Name = value; } } + + protected override void ExecuteTask() + { + RBuildBuildFamily buildFamily = Project.BuildFamilies.GetByName(FamilyName); + + if (buildFamily == null) + throw new BuildException("Module '{0}' references a no existant family '{1}'", + Module.Name, + FamilyName); + + Module.Families.Add(m_Family); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/FileTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/FileTask.cs new file mode 100644 index 00000000000..0b3e3af243d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/FileTask.cs @@ -0,0 +1,50 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("file")] + public class FileTask : FileBaseTask + { + public FileTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildSourceFile(); + } + + [TaskAttribute("switches")] + public string Switches { get { return SourceFile.Switches; } set { SourceFile.Switches = value; } } + + [TaskAttribute("first")] + [BooleanValidator] + public bool First { get { return SourceFile.First; } set { SourceFile.First = value; } } + + /// + /// Set the root to the same as the containing folder + /// + protected override void SetRootFromParent() + { + Root = InFolder.Root; + } + + public RBuildSourceFile SourceFile + { + get { return m_FileSystemInfo as RBuildSourceFile; } + } + + protected override void ExecuteTask() + { + //Call the base class + base.ExecuteTask(); + + //Add the file + Module.SourceFiles.Add(SourceFile); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/GroupTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/GroupTask.cs new file mode 100644 index 00000000000..f98029aa1fd --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/GroupTask.cs @@ -0,0 +1,13 @@ +using System; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + /// + /// Just a simple task container + /// + [TaskName("group")] + public class GroupTask : TaskContainer + { + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ImportLibraryTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ImportLibraryTask.cs new file mode 100644 index 00000000000..31e212c0a7a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ImportLibraryTask.cs @@ -0,0 +1,50 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("importlibrary")] + public class ImportLibraryTask : AutoResolvableFileSystemInfoBaseTask //FileBaseTask + { + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildImportLibrary(); + } + + public RBuildImportLibrary ImportLibrary + { + get { return m_FileSystemInfo as RBuildImportLibrary; } + } + + /// + /// The directory name. + /// + [TaskAttribute("dllname")] + public string DllName { get { return ImportLibrary.DllName; } set { ImportLibrary.DllName = value; } } + + /// + /// The directory name. + /// + [TaskAttribute("definition", Required = true)] + public string Definition { get { return ImportLibrary.Name; } set { ImportLibrary.Name = value; } } + + protected override void ExecuteTask() + { + base.ExecuteTask(); + + //Hack:: + if (ImportLibrary.IsSpecFile) + ImportLibrary.Root = PathRoot.Intermediate; + + if ((DllName == null) && (Module.Type == ModuleType.StaticLibrary)) + throw new BuildException(" dllname attribute is required.", Location); + + if (Module.ImportLibrary != null) + throw new BuildException("Only one is allowed per module.", Location); + + Module.ImportLibrary = ImportLibrary; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/IncludeTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/IncludeTask.cs new file mode 100644 index 00000000000..b923ecf157b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/IncludeTask.cs @@ -0,0 +1,42 @@ +using System; +using System.IO; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("include")] + public class IncludeTask : AutoResolvableFileSystemInfoBaseTask //FileSystemInfoBaseTask + { + public IncludeTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildFolder(); + } + + [TaskValue] + public virtual string IncludePath + { + get { return m_FileSystemInfo.Name; } + set { m_FileSystemInfo.Name = value; } + } + + public RBuildFolder IncludeFolder + { + get { return m_FileSystemInfo as RBuildFolder; } + } + + protected override void ExecuteTask() + { + //Call the base class + base.ExecuteTask(); + + //Add include folder... + RBuildElement.IncludeFolders.Add(IncludeFolder); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstalFolder.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstalFolder.cs new file mode 100644 index 00000000000..f395b8efda9 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstalFolder.cs @@ -0,0 +1,31 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("installfolder")] + public class InstalFolder : Task + { + RBuildInstallFolder m_InstallFolder = new RBuildInstallFolder(); + + /// + /// The name of the define to set. + /// + [TaskAttribute("id")] + public string ID { get { return m_InstallFolder.ID; } set { m_InstallFolder.ID = value; } } + + /// + /// The name of the define to set. + /// + [TaskAttribute("name")] + [TaskValue(Required = true)] + public string Name { get { return m_InstallFolder.Name; } set { m_InstallFolder.Name = value; } } + + protected override void ExecuteTask() + { + Project.InstallFolders.Add(m_InstallFolder); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallComponent.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallComponent.cs new file mode 100644 index 00000000000..36fc4567114 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallComponent.cs @@ -0,0 +1,39 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("installcomponent")] + public class InstallComponent : FileBaseTask + { + public InstallComponent() + { + } + + [TaskAttribute("section")] + public string InstallSection { get { return InstallComponentFile.InstallSection; } set { InstallComponentFile.InstallSection = value; } } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildInfInstallerFile(); + } + + public RBuildInfInstallerFile InstallComponentFile + { + get { return m_FileSystemInfo as RBuildInfInstallerFile; } + } + + protected override void ExecuteTask() + { + //Call the base class + base.ExecuteTask(); + + if (Module.LinkerScript != null) + throw new BuildException("Only one is allowed per module", Location); + + //Module.InfInstall = InstallComponentFile; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallFileTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallFileTask.cs new file mode 100644 index 00000000000..ec7bb2a3154 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallFileTask.cs @@ -0,0 +1,31 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("installfile")] + public class InstallFileTask : PlatformFileBaseTask + { + public InstallFileTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildInstallFile(); + } + + /// + /// The name of the define to set. + /// + [TaskAttribute("newname")] + public string NewName { get { return InstallFile.NewName; } set { InstallFile.NewName = value; } } + + private RBuildInstallFile InstallFile + { + get { return m_FileSystemInfo as RBuildInstallFile; } + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallWallPaperFileTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallWallPaperFileTask.cs new file mode 100644 index 00000000000..d8e8e4a774f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/InstallWallPaperFileTask.cs @@ -0,0 +1,16 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("installwallpaperfile")] + public class InstallWallPaperFileTask : PlatformFileBaseTask + { + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildInstallWallpaperFile(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LanguageTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LanguageTask.cs new file mode 100644 index 00000000000..4acf0a8788c --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LanguageTask.cs @@ -0,0 +1,24 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("language")] + public class LanguageTask : Task + { + RBuildLanguage m_Language = new RBuildLanguage(); + + [TaskAttribute("isoname")] + public string IsoName { get { return m_Language.Name; } set { m_Language.Name = value; } } + + [TaskAttribute("lcid")] + public string LCID { get { return m_Language.LCID; } set { m_Language.LCID = value; } } + + protected override void ExecuteTask() + { + Project.Languages.Add(m_Language); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LibraryTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LibraryTask.cs new file mode 100644 index 00000000000..79c3f159b1a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LibraryTask.cs @@ -0,0 +1,51 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("library")] + public class LibraryTask : ValueBaseTask + { + /// + /// The define value. + /// + [TaskValue(Required=true)] + public override string Value { get { return _value; } set { _value = value; } } + + protected override void ExecuteTask() + { + RBuildModule libModule = Project.Modules.GetByName(Value); + + if (libModule == null) + throw new BuildException("Unknown library dependency '{0}' referenced by module '{1}'", Value, Module.Name); + + if (Module.Host != libModule.Host) + throw new BuildException("Module '{0}' is trying to link against library '{1}' but can't mix target and hosts", + Module.Name, + libModule.Name); + + if ((libModule.Type != ModuleType.NativeDLL) && + (libModule.Type != ModuleType.Win32DLL) && + (libModule.Type != ModuleType.StaticLibrary) && + (libModule.Type != ModuleType.ObjectLibrary) && + (libModule.Type != ModuleType.Kernel) && + (libModule.Type != ModuleType.KernelModeDLL) && + (libModule.Type != ModuleType.KernelModeDriver) && + (libModule.Type != ModuleType.KeyboardLayout) && + (libModule.Type != ModuleType.RpcServer) && + (libModule.Type != ModuleType.RpcClient) && + (libModule.Type != ModuleType.RpcProxy) && + (libModule.Type != ModuleType.HostStaticLibrary)) + { + throw new BuildException("Module '{0}' is trying to use Module '{1}' as a library but it is a '{2}'", + Module.Name, + libModule.Name, + libModule.Type); + } + + Module.Libraries.Add(libModule); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LinkerFlagTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LinkerFlagTask.cs new file mode 100644 index 00000000000..7a12e3fae3a --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LinkerFlagTask.cs @@ -0,0 +1,14 @@ +using System; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("linkerflag")] + public class LinkerFlagTask : ValueBaseTask + { + protected override void ExecuteTask() + { + RBuildElement.LinkerFlags.Add(Value); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LinkerScriptTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LinkerScriptTask.cs new file mode 100644 index 00000000000..e52c49ab9ff --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LinkerScriptTask.cs @@ -0,0 +1,36 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("linkerscript")] + public class LinkerScriptTask : FileBaseTask + { + public LinkerScriptTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildFile(); + } + + public RBuildFile ScriptFile + { + get { return m_FileSystemInfo as RBuildFile; } + } + + protected override void ExecuteTask() + { + //Call the base class + base.ExecuteTask(); + + if (Module.LinkerScript != null) + throw new BuildException("Only one is allowed per module", Location); + + Module.LinkerScript = ScriptFile; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LocalizationTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LocalizationTask.cs new file mode 100644 index 00000000000..907505d86ca --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/LocalizationTask.cs @@ -0,0 +1,41 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("localization")] + public class LocalizationTask : FileBaseTask + { + public LocalizationTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildLocalizationFile(); + } + + [TaskAttribute("isoname")] + public string IsoName { get { return LocalizationFile.IsoName; } set { LocalizationFile.IsoName = value; } } + + [TaskAttribute("dirty")] + public bool Dirty { get { return LocalizationFile.Dirty; } set { LocalizationFile.Dirty = value; } } + + private RBuildLocalizationFile LocalizationFile + { + get { return m_FileSystemInfo as RBuildLocalizationFile; } + } + + protected override void ExecuteTask() + { + RBuildLanguage language = Project.Languages.GetByName(IsoName); + + if (language == null) + throw new BuildException("Unknown language '{0}' referenced by module '{1}'", IsoName, Module.Name); + + Module.LocalizationFiles.Add(LocalizationFile); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/MantainterTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/MantainterTask.cs new file mode 100644 index 00000000000..91f61db53a1 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/MantainterTask.cs @@ -0,0 +1,16 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("mantainer")] + public class MantainterTask : AuthorBaseTask + { + public MantainterTask() + { + m_Author.Role = AuthorRole.Mantainer; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/MetadataTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/MetadataTask.cs new file mode 100644 index 00000000000..3e2b4b67053 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/MetadataTask.cs @@ -0,0 +1,27 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("metadata")] + public class MetadataTask : Task + { + RBuildMetadata m_Metadata = new RBuildMetadata(); + + /// + /// The module description. + /// + [TaskAttribute("description")] + public string Description { get { return m_Metadata.Description; } set { m_Metadata.Description = value; } } + + protected override void ExecuteTask() + { + if (Module.Metadata != null) + throw new BuildException("Only one is allowed per module.", Location); + + Module.Metadata = m_Metadata; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleStateTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleStateTask.cs new file mode 100644 index 00000000000..f15b47bf9dc --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleStateTask.cs @@ -0,0 +1,34 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("modulestate")] + public class ModuleStateTask : Task + { + private string m_ModuleName = null; + private bool m_Enabled = true; + + [TaskAttribute("name")] + public string ModuleName { get { return m_ModuleName; } set { m_ModuleName = value; } } + + [TaskAttribute("enabled")] + [BooleanValidator] + public bool Enabled { get { return m_Enabled; } set { m_Enabled = value; } } + + protected override void ExecuteTask() + { + if (ModuleName != null) + { + RBuildModule module = Project.Modules.GetByName(ModuleName); + + if (module == null) + throw new BuildException(string.Format("Could not change state for module '{0}'", ModuleName, Location)); + + module.Enabled = Enabled; + } + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs new file mode 100644 index 00000000000..1a790f41d11 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs @@ -0,0 +1,588 @@ +using System; +using System.IO; +using System.Xml; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("module")] + public class ModuleTask : TaskContainer /*AutoResolvableFileSystemInfoBaseTask ,, ITaskContainer,*/ /*TaskContainer,*/ , ISysGenObject/*, IDirectory,*/, IRBuildSourceFilesContainer + { + protected RBuildModule m_Module = new RBuildModule(); + + [TaskAttribute("name", Required = true)] + [StringValidator(AllowEmpty = false, AllowSpaces = false)] + public string ModuleName + { + get { return m_Module.Name; } + set { m_Module.Name = value; } + } + + [TaskAttribute("type", Required = true)] + public ModuleType Type + { + get { return m_Module.Type; } + set { m_Module.Type = value; } + } + + [TaskAttribute("buildtype")] + public string BuildType + { + get { return m_Module.BuildType; } + set { m_Module.BuildType = value; } + } + + [TaskAttribute("description", ExpandProperties = true)] + public string Description + { + get { return m_Module.Description; } + set { m_Module.Description = value; } + } + + [TaskAttribute("lcid")] + public string LCID + { + get { return m_Module.LCID; } + set { m_Module.LCID = value; } + } + + [TaskAttribute("installname")] + public string InstallName + { + get { return m_Module.InstallName; } + set { m_Module.InstallName = value; } + } + + [TaskAttribute("installbase")] + [UriValidatorAttribute] + public string InstallBase + { + get { return m_Module.InstallBase; } + set { m_Module.InstallBase = value; } + } + + [TaskAttribute("output")] + public string Output + { + get { return m_Module.OutputName; } + set { m_Module.OutputName = value; } + } + + [TaskAttribute("baseaddress")] + public string BaseAdress + { + get { return m_Module.BaseAddress; } + set { m_Module.BaseAddress = value; } + } + + [TaskAttribute("entrypoint")] + public string EntryPoint + { + get { return m_Module.EntryPoint; } + set { m_Module.EntryPoint = value; } + } + + [TaskAttribute("aliasof")] + public string AliasOf + { + get { return m_Module.AliasOf; } + set { m_Module.AliasOf = value; } + } + + [TaskAttribute("extension")] + public string Extension + { + get { return m_Module.Extension; } + set { m_Module.Extension = value; } + } + + [TaskAttribute("unicode")] + [BooleanValidator()] + public bool Unicode + { + get { return m_Module.Unicode; } + set { m_Module.Unicode = value; } + } + + [TaskAttribute("host")] + [BooleanValidator()] + public bool Host + { + get { return m_Module.Host; } + set { m_Module.Host = value; } + } + + [TaskAttribute("isstartuplib")] + [BooleanValidator()] + public bool IsStartupLib + { + get { return m_Module.IsStartupLib; } + set { m_Module.IsStartupLib = value; } + } + + [TaskAttribute("underscoresymbols")] + [BooleanValidator()] + public bool UnderscoreSymbols + { + get { return m_Module.UnderscoreSymbols; } + set { m_Module.UnderscoreSymbols = value; } + } + + [TaskAttribute("mangledsymbols")] + [BooleanValidator()] + public bool MangledSymbols + { + get { return m_Module.MangledSymbols; } + set { m_Module.MangledSymbols = value; } + } + + [TaskAttribute("allowwarnings")] + [BooleanValidator()] + public bool AllowWarnings + { + get { return m_Module.AllowWarnings; } + set { m_Module.AllowWarnings = value; } + } + + public RBuildModule Module + { + get { return m_Module; } + } + + public RBuildElement RBuildElement + { + get { return m_Module; } + } + + public PathRoot Root + { + get { return PathRoot.Default; } + } + + public RBuildSourceFileCollection SourceFiles + { + get { return Module.SourceFiles; } + } + + protected override void OnLoad() + { + base.OnLoad(); + + if ((Module.Type == ModuleType.BootLoader) || + (Module.Type == ModuleType.BootProgram) || + (Module.Type == ModuleType.BootSector) || + (Module.Type == ModuleType.EmbeddedTypeLib) || + (Module.Type == ModuleType.IdlHeader) || + (Module.Type == ModuleType.Kernel) || + (Module.Type == ModuleType.KernelModeDLL) || + (Module.Type == ModuleType.KernelModeDriver) || + (Module.Type == ModuleType.NativeCUI) || + (Module.Type == ModuleType.NativeDLL) || + (Module.Type == ModuleType.ObjectLibrary) || + (Module.Type == ModuleType.StaticLibrary) || + (Module.Type == ModuleType.RpcClient) || + (Module.Type == ModuleType.RpcServer) || + (Module.Type == ModuleType.RpcProxy) || + (Module.Type == ModuleType.Win32CUI) || + (Module.Type == ModuleType.Win32DLL) || + (Module.Type == ModuleType.Win32GUI) || + (Module.Type == ModuleType.Win32OCX) || + (Module.Type == ModuleType.Win32SCR) || + //(Module.Type == ModuleType.Alias) || + (Module.Type == ModuleType.HostStaticLibrary) || + (Module.Type == ModuleType.BuildTool) || + (Module.Type == ModuleType.Cabinet) || + (Module.Type == ModuleType.KeyboardLayout) || + (Module.Type == ModuleType.Iso) || + (Module.Type == ModuleType.IsoRegTest) || + (Module.Type == ModuleType.LiveIso) || + (Module.Type == ModuleType.LiveIsoRegTest) || + (Module.Type == ModuleType.MessageHeader) || + (Module.Type == ModuleType.Package) || + (Module.Type == ModuleType.ModuleGroup) || + (Module.Type == ModuleType.PlatformProfile)) + { + Module.Folder.Base = SysGenPathResolver.GetPath(this, SysGen.RootTask); + //Module.Base = SysGenPathResolver.GetPath(this, SysGen.ProjectTask); //BasePath; + Module.Path = SysGen.BaseDirectory; + Module.XmlFile = XmlFile; + Module.RBuildFile = RBuildFile; + Module.Enabled = false; + + //HACK: + if (Type == ModuleType.HostStaticLibrary || + Type == ModuleType.BuildTool) + { + Module.Host = true; + } + + // Add the module to the project + Project.Modules.Add(Module); + } + else + { + Console.WriteLine("WARNING: modules of type '{0}' are being omited" , Module.Type); + } + } + + private void AddModuleDefines() + { + switch (Type) + { + case ModuleType.NativeCUI: + { + Module.Defines.Add("__NTAPP__"); + } + break; + case ModuleType.KernelModeDriver: + { + Module.Defines.Add("__NTDRIVER__"); + } + break; + } + + if (Unicode) + { + Module.Defines.Add("UNICODE"); + Module.Defines.Add("_UNICODE"); + } + } + + private void AddModuleLinkerFlags() + { + switch (Type) + { + case ModuleType.Win32DLL: + case ModuleType.Win32OCX: + case ModuleType.Win32CUI: + case ModuleType.Win32GUI: + case ModuleType.Win32SCR: + { + Module.LinkerFlags.Add("-nostartfiles"); + Module.LinkerFlags.Add("-lgcc"); + + if (Module.CPlusPlus) + Module.LinkerFlags.Add("-nostdlib"); + } + break; + case ModuleType.Kernel: + { + break; + } + case ModuleType.KeyboardLayout: + case ModuleType.KernelModeDLL: + case ModuleType.KernelModeDriver: + case ModuleType.NativeCUI: + case ModuleType.NativeDLL: + case ModuleType.Test: + case ModuleType.BootLoader: + case ModuleType.BootProgram: + { + Module.LinkerFlags.Add("-nostartfiles"); + Module.LinkerFlags.Add("-nostdlib"); + } + break; + } + + Module.LinkerFlags.Add("-g"); + } + + private void AddDebugSupportLibraries() + { + switch (Type) + { + case ModuleType.Win32DLL: + case ModuleType.Win32OCX: + case ModuleType.Win32CUI: + case ModuleType.Win32GUI: + case ModuleType.Win32SCR: + case ModuleType.NativeCUI: + case ModuleType.NativeDLL: + { + Module.Libraries.Add(Project.Modules.GetByName("debugsup_ntdll")); + } + break; + case ModuleType.KeyboardLayout: + case ModuleType.KernelModeDLL: + case ModuleType.KernelModeDriver: + { + Module.Libraries.Add(Project.Modules.GetByName("debugsup_ntoskrnl")); + } + break; + } + } + + private void AddModuleCompilerFlags() + { + if (!AllowWarnings) + { + Module.CompilerFlags.Add("-Werror"); + } + + // Always force disabling of sibling calls optimisation for GCC + // (TODO: Move to version-specific once this bug is fixed in GCC) + Module.CompilerFlags.Add("-fno-optimize-sibling-calls"); + Module.CompilerFlags.Add("-g"); + Module.CompilerFlags.Add("-pipe"); + } + + private void AddRequiredBuildTools() + { + switch (Module.Type) + { + case ModuleType.BootLoader: + case ModuleType.BootProgram: + case ModuleType.BootSector: + case ModuleType.EmbeddedTypeLib: + case ModuleType.IdlHeader: + case ModuleType.MessageHeader: + case ModuleType.Kernel: + case ModuleType.KernelModeDLL: + case ModuleType.KernelModeDriver: + case ModuleType.NativeCUI: + case ModuleType.NativeDLL: + case ModuleType.ObjectLibrary: + case ModuleType.StaticLibrary: + case ModuleType.RpcClient: + case ModuleType.RpcServer: + case ModuleType.RpcProxy: + case ModuleType.Win32CUI: + case ModuleType.Win32DLL: + case ModuleType.Win32GUI: + case ModuleType.Win32OCX: + case ModuleType.Win32SCR: + case ModuleType.HostStaticLibrary: + case ModuleType.KeyboardLayout: + Module.Requeriments.Add(Project.Modules.GetByName("wrc")); + Module.Requeriments.Add(Project.Modules.GetByName("wmc")); + Module.Requeriments.Add(Project.Modules.GetByName("widl")); + Module.Requeriments.Add(Project.Modules.GetByName("winebuild")); + Module.Requeriments.Add(Project.Modules.GetByName("winebuild")); + break; + case ModuleType.Cabinet: + Module.Requeriments.Add(Project.Modules.GetByName("cabman")); + break; + case ModuleType.Iso: + Module.Requeriments.Add(Project.Modules.GetByName("cdmake")); + Module.Requeriments.Add(Project.Modules.GetByName("cabman")); + break; + case ModuleType.IsoRegTest: + Module.Requeriments.Add(Project.Modules.GetByName("cdmake")); + Module.Requeriments.Add(Project.Modules.GetByName("cabman")); + Module.Requeriments.Add(Project.Modules.GetByName("sysreg")); + break; + case ModuleType.LiveIso: + Module.Requeriments.Add(Project.Modules.GetByName("cdmake")); + Module.Requeriments.Add(Project.Modules.GetByName("mkhive")); + break; + case ModuleType.LiveIsoRegTest: + Module.Requeriments.Add(Project.Modules.GetByName("cdmake")); + Module.Requeriments.Add(Project.Modules.GetByName("mkhive")); + Module.Requeriments.Add(Project.Modules.GetByName("sysreg")); + break; + } + } + + private void AddDefaultDependencies() + { + if (Module.Type != ModuleType.BuildTool && + Module.Type != ModuleType.HostStaticLibrary && + Module.Host == false) + { + if (Module.Name != "psdk" && + Module.Name != "dxsdk" && + Module.Name != "errcodes" && + Module.Name != "bugcodes" && + Module.Name != "ntstatus") + { + Module.Dependencies.Add(Project.Modules.GetByName("psdk")); + Module.Dependencies.Add(Project.Modules.GetByName("dxsdk")); + Module.Dependencies.Add(Project.Modules.GetByName("errcodes")); + Module.Dependencies.Add(Project.Modules.GetByName("bugcodes")); + Module.Dependencies.Add(Project.Modules.GetByName("ntstatus")); + } + } + } + + //public RBuildFolder Folder + //{ + // get { return null; } + //} + + private void AddModuleLibraryDependencies() + { + // Add mingw and msvcrt implicit libraries only if it's + // a Win32 target. + + if ((Module.Type == ModuleType.Win32CUI) || + (Module.Type == ModuleType.Win32DLL) || + (Module.Type == ModuleType.Win32GUI) || + (Module.Type == ModuleType.Win32OCX) || + (Module.Type == ModuleType.Win32SCR)) + { + if (!Module.IsDefaultEntryPoint) + { + if (Module.NoEntryPoint) + { + if (Module.LinksToCRuntimeLibrary == false) + { + Module.Libraries.Add(0, Project.Modules.GetByName("mingw_common")); + } + } + } + else + { + if (!Module.IsDLL) + { + if (Unicode) + { + Module.Libraries.Add(0, Project.Modules.GetByName("mingw_wmain")); + } + else + { + Module.Libraries.Add(0, Project.Modules.GetByName("mingw_main")); + } + } + + //Is it correct ? + if (Module.Libraries.Count > 0) + { + Module.Libraries.Add(1, Project.Modules.GetByName("mingw_common")); + } + else + { + Module.Libraries.Add(0, Project.Modules.GetByName("mingw_common")); + } + } + } + } + + private void AddCRuntimeLibrary() + { + if ((Module.Type == ModuleType.Win32CUI) || + (Module.Type == ModuleType.Win32DLL) || + (Module.Type == ModuleType.Win32GUI) || + (Module.Type == ModuleType.Win32OCX) || + (Module.Type == ModuleType.Win32SCR)) + { + if (Module.IsDefaultEntryPoint || Module.NoEntryPoint) + { + if (Module.LinksToCRuntimeLibrary == false) + { + if (Module.Name != "msvcrt") + { + // Link msvcrt to get the basic routines + Module.Libraries.Add(Project.Modules.GetByName("msvcrt")); + } + } + } + } + } + + private void AddModuleAssemblyFlags() + { + if (Type == ModuleType.BootSector) + { + Module.AssemblyFlags.Add("-f bin"); + } + } + + private void AddModuleIncludeFolders() + { + if (Module.Type == ModuleType.RpcClient || + Module.Type == ModuleType.RpcServer || + Module.Type == ModuleType.RpcProxy || + Module.Type == ModuleType.EmbeddedTypeLib) + { + Module.IncludeFolders.Add(new RBuildFolder(PathRoot.Intermediate, Module.Folder.FullPath)); //Hace falta? + Module.IncludeFolders.Add(new RBuildFolder(PathRoot.SourceCode, Module.Folder.FullPath)); + } + } + + private void AddModuleProperties() + { + Project.Properties.Add(string.Format("SysGen.Module.{0}.Enabled", Module.Name), Module.Enabled.ToString(), true, true); + Project.Properties.Add(string.Format("SysGen.Module.{0}.BasePath", Module.Name), Module.Base, true, true); + Project.Properties.Add(string.Format("SysGen.Module.{0}.RBuildFile", Module.Name), Module.RBuildFile, true, true); + } + + protected override void PostExecuteTask() + { + if (m_Module.RBuildFile == "mstask.rbuild") + { + int i = 0; + } + + AddModuleLibraryDependencies(); + AddCRuntimeLibrary(); + AddDebugSupportLibraries(); + AddDefaultDependencies(); + AddModuleProperties(); + + if (m_Module.Host) + { + if (m_Module.CPlusPlus) + { + m_Module.CompilerFlags.Add("$(HOST_CPPFLAGS)"); + } + else + { + m_Module.CompilerFlags.Add("$(HOST_CFLAGS)"); + m_Module.CompilerFlags.Add("-Wno-strict-aliasing"); + } + } + else + { + if (m_Module.CPlusPlus) + { + m_Module.CompilerFlags.Add("$(HOST_CPPFLAGS)"); + } + else + { + m_Module.CompilerFlags.Add("-nostdinc"); + } + } + + //Sort source code files only when necessary + if (Module.SourceFiles.ContainsASM) + Module.SourceFiles.Sort(new SourceCodePreferenceComparer()); + } + + protected override void ExecuteTask() + { + Module.Enabled = true; + + //AddModuleLibraryDependencies(); + AddModuleDefines(); + AddModuleLinkerFlags(); + AddModuleCompilerFlags(); + AddModuleIncludeFolders(); + AddModuleAssemblyFlags(); + AddRequiredBuildTools(); + + //if (Type == ModuleType.Alias) + //{ + // if (Module.Name == "halupalias") + // { + // int i = 10; + // } + + // RBuildModule alisedModule = Project.Modules.GetByName(AliasOf); + + // if (alisedModule == null) + // throw new BuildException("module '" + ModuleName + "' trying to alias non-existant module '" + AliasOf + "'", Location); + + // if (Module.Name == AliasOf) + // throw new BuildException("Module '" + ModuleName + "' cannot link against itself", Location); + + // alisedModule = Module; + // alisedModule.Enabled = true; + + // Module.Enabled = false; + //} + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/BuildTool.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/BuildTool.cs new file mode 100644 index 00000000000..67d0755580d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/BuildTool.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("buildtool")] + public class BuildTool : ModuleTask + { + public BuildTool() + { + Type = ModuleType.BuildTool; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Cabinet.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Cabinet.cs new file mode 100644 index 00000000000..715fbcc4952 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Cabinet.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("cabinet")] + public class Cabinet : ModuleTask + { + public Cabinet() + { + Type = ModuleType.Cabinet; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Kernel.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Kernel.cs new file mode 100644 index 00000000000..7cafd130411 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Kernel.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("kernel")] + public class Kernel : ModuleTask + { + public Kernel() + { + Type = ModuleType.Kernel; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/KernelModeDLL.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/KernelModeDLL.cs new file mode 100644 index 00000000000..22d238b739e --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/KernelModeDLL.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("kernelmodell")] + public class KernelModeDLL : ModuleTask + { + public KernelModeDLL() + { + Type = ModuleType.KernelModeDLL; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/KernelModeDriver.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/KernelModeDriver.cs new file mode 100644 index 00000000000..b223cf5897b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/KernelModeDriver.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("kernelmodedriver")] + public class KernelModeDriver : ModuleTask + { + public KernelModeDriver() + { + Type = ModuleType.KernelModeDriver; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/NativeCUI.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/NativeCUI.cs new file mode 100644 index 00000000000..ac9e84a3d82 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/NativeCUI.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("nativecui")] + public class NativeCUI : ModuleTask + { + public NativeCUI() + { + Type = ModuleType.NativeCUI; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/NativeDLL.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/NativeDLL.cs new file mode 100644 index 00000000000..bdaabee1bfc --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/NativeDLL.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("nativedll")] + public class NativeDLL : ModuleTask + { + public NativeDLL() + { + Type = ModuleType.NativeDLL; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/ObjectLibrary.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/ObjectLibrary.cs new file mode 100644 index 00000000000..a34279d68a7 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/ObjectLibrary.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("objectlibrary")] + public class ObjectLibrary : ModuleTask + { + public ObjectLibrary() + { + Type = ModuleType.ObjectLibrary; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Package.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Package.cs new file mode 100644 index 00000000000..68bdbcb0212 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Package.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("package")] + public class Package : ModuleTask + { + public Package() + { + Type = ModuleType.Package; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/StaticLibrary.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/StaticLibrary.cs new file mode 100644 index 00000000000..0abe2820982 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/StaticLibrary.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("staticlibrary")] + public class StaticLibrary : ModuleTask + { + public StaticLibrary() + { + Type = ModuleType.StaticLibrary; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32CUI.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32CUI.cs new file mode 100644 index 00000000000..5fba4c1bc44 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32CUI.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("win32cui")] + public class Win32CUI : ModuleTask + { + public Win32CUI() + { + Type = ModuleType.Win32CUI; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32Dll.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32Dll.cs new file mode 100644 index 00000000000..320e1a00ebe --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32Dll.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("win32dll")] + public class Win32DLL : ModuleTask + { + public Win32DLL() + { + Type = ModuleType.Win32DLL; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32GUI.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32GUI.cs new file mode 100644 index 00000000000..9bffa1ba55e --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32GUI.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("win32gui")] + public class Win32GUI : ModuleTask + { + public Win32GUI() + { + Type = ModuleType.Win32GUI; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32OCX.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32OCX.cs new file mode 100644 index 00000000000..2b8051591fa --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32OCX.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("win32ocx")] + public class Win32OCX : ModuleTask + { + public Win32OCX() + { + Type = ModuleType.Win32OCX; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32SCR.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32SCR.cs new file mode 100644 index 00000000000..5199e32fab6 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Modules/Win32SCR.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +using SysGen.RBuild.Framework; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("win32scr")] + public class Win32SCR : ModuleTask + { + public Win32SCR() + { + Type = ModuleType.Win32SCR; + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/OverrideModuleTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/OverrideModuleTask.cs new file mode 100644 index 00000000000..612d4e6dc02 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/OverrideModuleTask.cs @@ -0,0 +1,52 @@ +using System; +using System.Xml; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("overridemodule")] + public class OverrideModuleTask : ModuleTask + { + public OverrideModuleTask() + { + m_FailOnMissingRequired = false; + } + + protected override void OnLoad() + { + //Evitamos actualizar la información del módulo de verdad + } + + protected override void PostExecuteTask() + { + //Evitamos actualizar la información del módulo de verdad + } + + protected override void PreExecuteTask() + { + //Evitamos actualizar la información del módulo de verdad + } + + protected override void ExecuteTask() + { + //Evitamos actualizar la información del módulo de verdad + } + + protected override void InitializeTask(XmlNode taskNode) + { + base.InitializeTask(taskNode); + + if (taskNode.Attributes["name"] == null) + throw new BuildException("Missing 'name' attribute"); + + string moduleName = taskNode.Attributes["name"].Value; + + m_Module = Project.Modules.GetByName(moduleName); + + if (m_Module == null) + throw new BuildException("Overrided module '{0}' not found" , moduleName); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/PCHTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/PCHTask.cs new file mode 100644 index 00000000000..c7700d7018f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/PCHTask.cs @@ -0,0 +1,43 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + /// + /// PreCompiled Header task + /// + [TaskName("pch")] + public class PCHTask : FileTask + { + /// + /// Creates a new instance of the class. + /// + public PCHTask() + { + } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildSourceFile(); + } + + public RBuildSourceFile SourceFile + { + get { return m_FileSystemInfo as RBuildSourceFile; } + } + + protected override void ExecuteTask() + { + if (Module.PreCompiledHeader != null) + throw new BuildException("Only one is allowed per module", Location); + + //Call the base class + base.ExecuteTask(); + + //Add the folder where the PCH is present as a include folder + Module.IncludeFolders.Add(new RBuildFolder(PathRoot.Intermediate, Base)); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformAutorunTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformAutorunTask.cs new file mode 100644 index 00000000000..a298818f62c --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformAutorunTask.cs @@ -0,0 +1,21 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformautorun")] + public class PlatformAutorunTask : ValueBaseTask + { + protected override void ExecuteTask() + { + RBuildModule module = Project.Platform.Modules.GetByName(Value); + + if (module == null) + throw new BuildException("Unknown module '{0}' referenced by ", Value); + + Project.Platform.AutorunModules.Add(module); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformDebugChannelTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformDebugChannelTask.cs new file mode 100644 index 00000000000..3a6bd35f029 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformDebugChannelTask.cs @@ -0,0 +1,66 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformdebugchannel")] + public class PlatformDebugChannelTask : ValueBaseTask + { + //private RBuildDebugChannel m_DebugChannel = null; + + //[TaskAttribute("name")] + //public string ChannelName + //{ + // get { return m_DebugChannel.Name; } + // set { m_DebugChannel.Name = value; } + //} + + //[TaskAttribute("warning")] + //public bool Warning + //{ + // get { return m_DebugChannel.Warn; } + // set { m_DebugChannel.Warn = value; } + //} + + //[TaskAttribute("trace")] + //public bool Trace + //{ + // get { return m_DebugChannel.Trace; } + // set { m_DebugChannel.Trace = value; } + //} + + //[TaskAttribute("fixme")] + //public bool Fixme + //{ + // get { return m_DebugChannel.Fixme; } + // set { m_DebugChannel.Fixme = value; } + //} + + //[TaskAttribute("error")] + //public bool Error + //{ + // get { return m_DebugChannel.Error; } + // set { m_DebugChannel.Error = value; } + //} + + //protected override void PreExecuteTask() + //{ + // m_DebugChannel = Project.DebugChannels.GetByName(ChannelName); + //} + + protected override void ExecuteTask() + { + RBuildDebugChannel channel = Project.DebugChannels.GetByName(Value); + + if (channel == null) + throw new BuildException("Unknown debug channel '{0}' referenced by ", Value); + + if (Project.Platform.DebugChannels.Contains(channel)) + throw new BuildException("Only one debug channel '{0}' can be present per ", Value); + + Project.Platform.DebugChannels.Add(channel); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformDescriptionTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformDescriptionTask.cs new file mode 100644 index 00000000000..ee5d8f1cdfc --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformDescriptionTask.cs @@ -0,0 +1,16 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformdescription")] + public class PlatformDescriptionTask : ValueBaseTask + { + protected override void ExecuteTask() + { + Project.Platform.Description = Value; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformLanguageTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformLanguageTask.cs new file mode 100644 index 00000000000..8362e09be64 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformLanguageTask.cs @@ -0,0 +1,25 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformlanguage")] + public class PlatformLanguageTask : ValueBaseTask + { + public PlatformLanguageTask() + { + } + + protected override void ExecuteTask() + { + RBuildLanguage language = Project.Languages.GetByName(Value); + + if (language == null) + throw new BuildException("Unknown language '{0}' referenced by ", Value); + + Project.Platform.Languages.Add(language); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformModuleTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformModuleTask.cs new file mode 100644 index 00000000000..3bb3190f0bb --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformModuleTask.cs @@ -0,0 +1,25 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformmodule")] + public class PlatformModuleTask : ValueBaseTask + { + public PlatformModuleTask() + { + } + + protected override void ExecuteTask() + { + RBuildModule module = Project.Modules.GetByName(Value); + + if (module == null) + throw new BuildException("Unknown module '{0}' referenced by ", Value); + + Project.Platform.Modules.Add(module); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformNameTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformNameTask.cs new file mode 100644 index 00000000000..88890e81e88 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformNameTask.cs @@ -0,0 +1,16 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformname")] + public class PlatformNameTask : ValueBaseTask + { + protected override void ExecuteTask() + { + Project.Platform.Name = Value; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformScreenSaverTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformScreenSaverTask.cs new file mode 100644 index 00000000000..e396774a3e7 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformScreenSaverTask.cs @@ -0,0 +1,28 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformscreensaver")] + public class PlatformScreenSaverTask : ValueBaseTask + { + protected override void ExecuteTask() + { + RBuildModule module = Project.Modules.GetByName(Value); + + if (module == null) + throw new BuildException("Unknown module '{0}' referenced by ", Value); + + if (module.Type != ModuleType.Win32SCR) + throw new BuildException("Shell can only be of type win32scr"); + + if (Project.Platform.Screensaver != null) + throw new BuildException("Only one screensaver can be set per platform"); + + /* set the shell to use */ + Project.Platform.Screensaver = module; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformShellTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformShellTask.cs new file mode 100644 index 00000000000..b97c9f5b469 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformShellTask.cs @@ -0,0 +1,29 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformshell")] + public class PlatformShellTask : ValueBaseTask + { + protected override void ExecuteTask() + { + RBuildModule module = Project.Modules.GetByName(Value); + + if (module == null) + throw new BuildException("Unknown module '{0}' referenced by ", Value); + + if (module.Type != ModuleType.Win32CUI && + module.Type != ModuleType.Win32GUI) + throw new BuildException("Shell can only be of type win32gui"); + + if (Project.Platform.Shell != null) + throw new BuildException("Only one shell can be set per platform"); + + /* set the shell to use */ + Project.Platform.Shell = module; + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformWallpaperTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformWallpaperTask.cs new file mode 100644 index 00000000000..fc7776062aa --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/Platform/PlatformWallpaperTask.cs @@ -0,0 +1,37 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("platformwallpaper")] + public class PlatformWallpaperTask : ValueBaseTask + { + protected override void PostExecuteTask() + { + if (Project.Platform.Wallpaper != null) + throw new BuildException("Only one wallpaper can be set per platform"); + + foreach (RBuildModule module in Project.Modules) + { + foreach (RBuildFile file in module.Files) + { + RBuildWallpaperFile wallpaper = file as RBuildWallpaperFile; + + if (wallpaper != null) + { + if (wallpaper.ID.ToLower() == Value.ToLower()) + { + /* set the shell to use */ + Project.Platform.Wallpaper = wallpaper; + } + } + } + } + + if (Project.Platform.Wallpaper == null) + throw new BuildException("Unknown wallpaper '{0}' referenced by ", Value); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ProjectTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ProjectTask.cs new file mode 100644 index 00000000000..bb09d9342a1 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ProjectTask.cs @@ -0,0 +1,70 @@ +using System; +using System.Xml; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("project")] + public class ProjectTask : TaskContainer, ISysGenObject + { + RBuildProject _project = new RBuildProject(); + + public ProjectTask() + { + } + + [TaskAttribute("name", Required = true)] + public string Name + { + get { return _project.Name; } + set { _project.Name = value; } + } + + [TaskAttribute("makefile", Required = true)] + public string MakeFile + { + get { return _project.MakeFile; } + set { _project.MakeFile = value; } + } + + public RBuildProject Project + { + get { return _project; } + } + + public RBuildElement RBuildElement + { + get { return _project; } + } + + protected override void OnInit() + { + SysGen.Project = Project; + SysGen.RootTask = this; + Project.RBuildFile = RBuildFile; + + + Project.Properties.Add("ARCH", "i386");/* + Project.Defines.Add("_M_IX86"); + Project.Defines.Add("_X86_"); + Project.Defines.Add("__i386__");*/ + } + + protected override void OnLoad() + { + base.OnLoad(); + + Project.Folder = new RBuildFolder(PathRoot.SourceCode , ""); + } + + protected override void PreExecuteTask() + { + ///Project.Base = string.Empty; + Project.Path = SysGen.BaseDirectory; + Project.XmlFile = XmlFile; + } + } +} + diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/PropertyTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/PropertyTask.cs new file mode 100644 index 00000000000..1b143c0dd16 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/PropertyTask.cs @@ -0,0 +1,24 @@ +using System; +using System.Xml; + +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + /// Sets a property in the current project. + /// + /// NAnt uses a number of predefined properties. + /// + /// + /// Define a debug property with the value true. + /// ]]> + /// Use the user-defined debug property. + /// ]]> + /// Define a Read-Only property.This is just like passing in the param on the command line. + /// ]]> + /// + [TaskName("property")] + public class PropertyTask : PropertyBaseTask + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/RBuildTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/RBuildTask.cs new file mode 100644 index 00000000000..12feafedce4 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/RBuildTask.cs @@ -0,0 +1,10 @@ +using System; +using SysGen.BuildEngine.Attributes; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("rbuild")] + public class RBuildTask : TaskContainer + { + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ReDefineTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ReDefineTask.cs new file mode 100644 index 00000000000..f41f0aae4ce --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ReDefineTask.cs @@ -0,0 +1,16 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("redefine")] + public class ReDefineTask : Task + { + protected override void ExecuteTask() + { +// RBuildElement.Defines.Add(new RBuildDefine(DefineName, DefineValue)); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/RequiresTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/RequiresTask.cs new file mode 100644 index 00000000000..f68ffe5f00d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/RequiresTask.cs @@ -0,0 +1,27 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("requires")] + public class RequiresTask : ValueBaseTask + { + /// + /// The define value. + /// + [TaskValue(Required = true)] + public virtual string Value { get { return _value; } set { _value = value; } } + + protected override void ExecuteTask() + { + RBuildModule requeriment = Project.Modules.GetByName(Value); + + if (requeriment == null) + throw new BuildException("Unknown requeriment '{0}' referenced by module '{1}'", Value, Module.Name); + + Module.Requeriments.Add(requeriment); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/SetupTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/SetupTask.cs new file mode 100644 index 00000000000..83d2056b8f4 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/SetupTask.cs @@ -0,0 +1,45 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("setup")] + public class SetupTask : PlatformFileBaseTask + { + [TaskAttribute("installsection", Required = true)] + public string InstallSection { get { return Setup.InstallSection; } set { Setup.InstallSection = value; } } + + [TaskAttribute("type")] + public SetupType SetupType { get { return Setup.SetupType; } set { Setup.SetupType = value; } } + + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildSetupFile(); + } + + /// + /// Get the underlying . + /// + public RBuildSetupFile Setup + { + get { return m_FileSystemInfo as RBuildSetupFile; } + } + + protected override void ExecuteTask() + { + base.ExecuteTask(); + + if (Module.IsInstallable || Module.Type == ModuleType.Package) + { + if (Module.Setup != null) + throw new BuildException("There can be only one element for a module", Location); + + Module.Setup = Setup; + } + else + throw new BuildException(" is not applicable for this module type", Location); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/TargetTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/TargetTask.cs new file mode 100644 index 00000000000..15b1c70d212 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/TargetTask.cs @@ -0,0 +1,18 @@ +using System; +using SysGen.BuildEngine.Attributes; + +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("target")] + public class TargetTask : Task + { + protected RBuildTarget m_Target = new RBuildTarget(); + + protected override void ExecuteTask() + { + SysGen.Targets.Add(m_Target); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/WallPaperTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/WallPaperTask.cs new file mode 100644 index 00000000000..31ea0d9930d --- /dev/null +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/WallPaperTask.cs @@ -0,0 +1,26 @@ +using System; + +using SysGen.BuildEngine.Attributes; +using SysGen.RBuild.Framework; + +namespace SysGen.BuildEngine.Tasks +{ + [TaskName("wallpaper")] + public class WallPaperTask : PlatformFileBaseTask + { + protected override void CreateFileSystemObject() + { + m_FileSystemInfo = new RBuildWallpaperFile(); + } + + protected override void ExecuteTask() + { + if (Module != null) + { + base.ExecuteTask(); + } + else + throw new BuildException(" is only applicable for modules", Location); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.Make/Program.cs b/reactos/tools/sysgen/SysGen.Make/Program.cs new file mode 100644 index 00000000000..de3ba818cd9 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.Make/Program.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using SysGen.BuildEngine; +using SysGen.BuildEngine.Framework; + +namespace SysGen.Make +{ + class Program + { + static void Main(string[] args) + { + SysGenEngine engine = new SysGenEngine(@"C:\ros\trunk\reactos\ReactOS-i386.rbuild"); + + engine.ReadBuildFiles(); + + /* + Console.WriteLine("Generates project files for buildsystems\n\n"); + Console.WriteLine(" rbuild [switches] -r{rootfile.rbuild} buildsystem\n\n"); + Console.WriteLine("Switches:\n"); + Console.WriteLine(" -v Be verbose.\n"); + Console.WriteLine(" -c Clean as you go. Delete generated files as soon as they are not\n"); + Console.WriteLine(" needed anymore.\n"); + Console.WriteLine(" -dd Disable automatic dependencies.\n"); + Console.WriteLine(" -dm{module} Check only automatic dependencies for this module.\n"); + Console.WriteLine(" -ud Disable multiple source files per compilation unit.\n"); + Console.WriteLine(" -mi Let make handle creation of install directories. Rbuild will\n"); + Console.WriteLine(" not generate the directories.\n"); + Console.WriteLine(" -ps Generate proxy makefiles in source tree instead of the output.\n"); + Console.WriteLine(" tree.\n"); + Console.WriteLine(" -vs{version} Version of MS VS project files. Default is %s.\n", MS_VS_DEF_VERSION); + Console.WriteLine(" -vo{version|configuration} Adds subdirectory path to the default Intermediate-Outputdirectory.\n"); + Console.WriteLine(" -Dvar=val Set the value of 'var' variable to 'val'.\n"); + Console.WriteLine("\n"); + Console.WriteLine(" buildsystem Target build system. Can be one of:\n"); + */ + + Console.ReadLine(); + } + } +} diff --git a/reactos/tools/sysgen/SysGen.Make/Properties/AssemblyInfo.cs b/reactos/tools/sysgen/SysGen.Make/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..9012ef9b0c1 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.Make/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SysGen.Make")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sand")] +[assembly: AssemblyProduct("SysGen.Make")] +[assembly: AssemblyCopyright("Copyright © Sand 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("00432ce1-5d82-4afb-9a3a-dc2ce95edc4e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/reactos/tools/sysgen/SysGen.Make/SysGen.Make.csproj b/reactos/tools/sysgen/SysGen.Make/SysGen.Make.csproj new file mode 100644 index 00000000000..89de06851a4 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.Make/SysGen.Make.csproj @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {8B1229C7-6188-4621-A648-843CB9B5C72E} + Exe + Properties + SysGen.Make + SysGen.Make + + + 2.0 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + {8F5F8375-4097-4952-B860-784EB9961ABE} + SysGen.Framework + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.Make/SysGen.Make.csproj.user b/reactos/tools/sysgen/SysGen.Make/SysGen.Make.csproj.user new file mode 100644 index 00000000000..1a4ff357ca6 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.Make/SysGen.Make.csproj.user @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.Make/SysGen.Make.sln b/reactos/tools/sysgen/SysGen.Make/SysGen.Make.sln new file mode 100644 index 00000000000..d9d1e258355 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.Make/SysGen.Make.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SysGen.Make", "SysGen.Make\SysGen.Make.csproj", "{8B1229C7-6188-4621-A648-843CB9B5C72E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/reactos/tools/sysgen/SysGen.Make/SysGen.Make.suo b/reactos/tools/sysgen/SysGen.Make/SysGen.Make.suo new file mode 100644 index 0000000000000000000000000000000000000000..b55bbbea00f579acf50698899f55a4f332327c08 GIT binary patch literal 182272 zcmeFa37lkCSvFn?`!0(tA}~PMnP#>mlYqc%NhX;|hUv*776Fl~(lcv8|i6zJJqgTDSDB-wf~1(&ry)wa)H-{{Brj z-K5LU3k2<;(g z4@MgU4LuF*VR-*=v`3&l5^Xcu2-;4xEofWOwxMlD+ktj2+IeW_qdgSu0<;U!9*y=G zv>!uzEZXDH9*?#QZ8zE;w7qEi&@Mu|80`|Y{b-k>U50i5?I7CaXjh;eLVE(*VYE@S zBWPEm9Ywne?HJk<(Vm3%WVANgQ_!A@b~W15(8kcl(I(I)(WcO*(Pq$&qs^i{9qk0# z9NIkE0@@PNAJfy9Vurx&q4cfw8Q9W5x?Ao zkuTtNIr{~^sQK^ipcs)kX{YSpru%&R=5Kt@$IrSMZu%gJ3jYoP;vz=4AJC`qZeNDA zeOKr2-64eppRaX(!+S`({C5N^(825;z)W{A{wwi!3OMOH=e6wLIe<^TAkWl=e-`c~ zZ}HzTtmqtOVGI;-0)J-!{R*t?3h-IPoYa7SR@3p{9&lelCc!`QVB9#CBL3&^$p5^b z{Lj~z|2Y@xuZsUSb?=o7;O{5{^n1OM|M~uZ{|$czZux{aT=CWa_|C33?D*xWk6rhr z8!^?5{(Wl?HAMga$P4km&Ze=2$xWkED=V`LGoAKTi_0h42NoyB=G?U-Q}avhwe8zZ z@b}aQdm!c8kiw_IF&Be}7NSohklbV7u&GQ66XNpt>g?Pk^%eiMJ1dLJV>46jiMg>( zr#(5_Ig$MtvDrG<7=W4)X3$t@`W9{Xsv56H-z~tOqdu?_B9ZW2*@PoZ1dbyz6 z%LJe+Z+3m@er#;#2B3#96ErA)AbX%gM z-byA1Ha2;3X>8&|yZhRAKb@(C&e+myyZf5xr~VX8Ok#@oC(%>&lFb7htem|hdJ#S+ zlk>B@gf-uB^}^Iz+uruk)8y>()Wpguu-wAZ>dH>NCVILwL5$;LovHTN($d`Q#MsL0 z;zFn0nOL6Uv}g1+Ken>Wa9r@!5r`mG*?aCi>Z&pw7b-nOBT%o|#&hTArOq z{91x7=C|?1#g+CnsCjO3xjj8OHNHC2eMxlm*aR9B(qcCZYl`A~YI6IeUK8D=Mm0A( z-tJ7EpxkFm{CZacnF5Yom^`^S2Qut*-z0iW&J$%oXKG~?_QBNL#Ns>#Xs?Nms+WDf zGd3|#Iccwnergfn*u+GpX(v+4|M)j2UX3BI@21X|U@o0*(l znp^F(yRV6U#HOL@&Zv@qCdXFB+Io}dqFR-#tx!W^s`Vz(lNP@KnI4OXRqQp;@Uk!?5@!dz-wn^Y(=k$et#^{uj3*Jz4`g}{Osf`tRKB5 zdaItt3D_FYEufL?HPO%ZO04GR#ujGU+22GTvIvTZ!<1BKWfG`t8(EoyVD7#zc4DgW z8Jn1cjgtLM;8QL2R+s1I7Z=+0lIW#+h9}2oAon2b>^0HPqq;L3%7x=&b8WPxrHMAQ z0^Y5rY@}*&Fm`elZVH%KZxWd7PONpFXC~$+S661|I_>#Ia18$>x_nsS;O3_$XUEzL z_&r+Umt_l0(+?)|+UzymmqZ^j`(nb&4`_L61~|bQ00E*U`YXf92zj-$v~>$a6aFUp zs3x1v@wv6k=d#zn`&pZt9HVXAeNFUJO+K*uj>Fj6*4CRuPt~&nul+cdjDHh-)bf%T zy!as66G2>i7bjNdrxsS4#9ts$uikcIduM6e$mr(fsgv8cZaaU=Nay6jmMvRGR^W^< zFdl?Xc67E>Q{91}7u`HRZIlkJNTb!AlXzNX)uSXP0 zDvo3!ixFji6TdwtF%R=&C#D!68Ue{O`4P}mL#vtkh*mRR6Ij&uS7ew>u3?V(C(&bl z`8jcXY?($$_chVqdF5<0J2}-}U6`d+ZZC;$M0O$3m{L(tZE9trjh5&^qAKiRb^)dX za8R6Zc5<$bmgu8eaE>o8u63qhjOb0Gr{)&r%JSI66r9)YYocFCt#Fi?@-t@>CNzCc zdr5SXa>=b5`gQH8Q%iF&0hTv2oTd+n?y6@EhTzijBGirEBzj7@9Nze}kloirN7d%w z;`q}$Q;0TYFNt1?NlN5s6Fok+I@RW%L?6|Y11n=?d9|~`z(@8b(NhJdbtXEqnRL{f zL^o13u>s|LlKG|OHd^BMeOQ#!v(SJ1ljyQ~ju7)Uhg@$GJ*6ny4Xziq=**3so?33( zOQO4K#Gnj~4)i9`Q?-f6&@f`f?e1%$pBfmE|1(>&`zF!TV<5N>EicY2kIiqoh#8Oe z!P$xB#m?gN%BG{UomHl}R#qox7dP!}AKlZIAnhP%y}+t~K=D=3rX{l`CYKlIktx96 z1Wwhnl*OqbNV>0yeyV3F`+XKeW#Aic5Bder3C~*Av#LDvA$l}DQ zwtJgEum(GKW)U)+P5i!ksuYK>3dl=^7YP(>5(Qm~TiJW`7fXRZly#Tb8uwzV^{iZ`zEKEJv5_o;&3U$TunC+ovAA% zZxTHf8<-M!8O@!TL=3u}{jKOEW@OKf>uOEvs6;2lV-hAx@YTu7NjpWe<1#e$jLKtJ z`+j2+Cub2ZR%l|!x#yRLCPZWrzJBJ7OWQ%JI?HwNO=1#9y7U@$1*>=S>~@3|JYN_b zo)3~FX08yE+0Nql3NmkF9To=$=7E+nrUz%1Wm)oG2ollNC72n=Ep^`{Mpw$^K?2?~ z0+2mZ^U5{yO`_j2X-46{w7534JTX1fdz0v=N{P_<&msVc-b@qBQGBDAH8Sl;!G3af zGL!3gO>|U7g*MyA(Fa=M_w{EPsl=7#MZ|vXHPK%g6&gNZPGFS%P4rPVrY!P2HoJhL zso7Mlw3-4}PpurELLo-?HGxM1mrtcmRW(nNqT#xiO3{?G%3J-%kHbq$jHUiMW0kVR zX7@GG-~FKuMo)Jxo?7U>jEo*cK%6PN5m3nVY%VfTuENa9JuyCM5dytQKu_>;vrg_) zXc2J~)TgoK(kP;Ta$;!}wS!aHYhnzkb#?P5QcqJsLZi1QlBGlpGQ?dw; zTD6bh4}!t*1l7~_ib^v*6vcCxw5~j0rI_i~$NoB;Qv*${koCnh)e%yUc;L|`9EG|zjjiC_F zUK9PLmMSlx=I1AnFihob9@^!{u7d8;aE&5~`U8U2QPB=HP+~yUoM~mn<<-UFhs1g< zpPWSutBvy5g{90c>%K|gl(K$p^|Kmv#`dO8O<{`dHPKTUNmIKXpIl?@g}o&DIEbZ6 zIKY=KjxB6DIJP`dxI^Ob*z!4h_iwpiWXJaNGs~vPNlX!xlZ*>1^JB}%Bz9jDSXRX$ z5viY?Z)blKJ*3vqVFHFj+148BxtSsDz9xFB9v4<_o&|Z`*F--lT5wpwEnP;QZJKUr z_9oF&HAYz^3mA1@6a6&LPA?&M(B_{+k7Ya<$bS?6ee{Br!?>WM$$j>c=%tK~te3fK z&=vnAdMLMj6u~mnr>fGVdiBj^R;GGy68-cMm(J#Uo+ZPW z{`r(37W;+9O&ma|n^P(ie71~TW+qD~hFU%Oo#WGsbCb*`cHbm=dSs~WdV|W6_Eov$ z`uv7WKxU1D7VJ#|od!B|ab=1|0V3plP4rhiQCZ@RB1>-)Jw3!GYWKeOj*+b++k5%P ziAOx5d*vjeo{QXbTszd*lOR(krxsS{Nrrq)V8EXL_um^h`%n9UZ&(dy z|7#QYT$u^X2lwW>eZ=A1_VcN`6v0mixfXO(@gYrrr?KwiphBKHk^V>e=UD;V>tC1t zxR+l&#_$hfX6FHw=TKbL<%LC@W|5Lbj|6br3q%QpPK0Mm6oj%qm%pLgQ_W*p6O9>5 zZ`#6d5UvGg&&)O`8|l&?k8`O@|Kyb)?RG{zM~NyLH$IyN)z9E6&ri@dMbLRB z(An7;MLe6NF8q7o-jiJcdj(|N(=mfw=$OZkV#%uhJpkh;m+(B4y72Fhd*9LRcn?O; z6KFa(<6#!0x|YMDdt>4S=g*u)8n`Q3UHHEI8I)B=AUf8v6Du6u+4(g-)p2%;Y15=D z@4a<)?vqcOgW~pRuwO{+gZ4Or^OB~pVzf|sPSCZ0umCZ$39EJpX9tbIQrex-EG_8W zxRZj_ao^*Hj*ruyO>rT|?gHof2F_OTZ|;C=hve&OdPUh|z(_u;(u&nV z|N8WY-?GoHe&cQr`qSTh-~%sy_t(DitcQ%xQ#|3{Xlv*6-9G&N58wB|TV6l;j#uCJ zn->hDSL-|c`-DwA?`s$e!#f)<1X23w98d{Q;5w11q-DHzKut%XD7HXdj%0t?!6;T} zC0nZntP;&rsJLUfWqS273Wxo&z=)0UPoyXJP%}UyUX{_+ zi3SvEV>c?;3p~a$Eklc78t>_$Z^IdSN5K(ez>yM}Cfa6vKLu&F9lS%+b33kf@OdHQ zr!Dxjl8u%3LMB0Rzpy(V->?kNks1MqY7X|Hr=>NGh;@Z#)?k=A3B>u89pThIq z{BO;$Y_)z9xIC>87oO190ae;rQnV1rqnt}0CT$n4BG<~;R zBkuzIr5=1ck83R(;S^*MXWG2OHcow{uIF5`Khl}W+nL@gT@A_%(hpBkBu~#|GFj0z zLH!Jv@0DGsw!S>w%j^m|E9{+Az5+<>&&g|}Cp$fC445xv-&0zh%p?idpTDp>)^L3s z_i)ART*LG?#I4o()3Y{?LbhUtcjYML;Twq2cDSbJaJ6H^d8m=1k33VYM zQ^(9;Y+K^v3z3 zR$I*AFfeT=oIC5jY(|Ro`F@OW7WT7omg!FS*{GRN<}mL~c!)CmIvE;jPu!=sHR~hv*wxeHol;K zSb|-sXvzA=!tZ8 z8oxXVNzE+F2om#KV1;kXEOFx=^Ik?^r(c2Z3754ZSK*h8snS-}y8RGn?Gr;ERfxq^ zfH)3_rfKS7uHRgVF^u4OHnf@M3P(cPq+M+Gz+Ew(r*_99NnE9ioGdPiy;uxp5+g7u zc;XFUytfOZT$a_7BF>YxSl2Qjk;gh1w{KyZ#F5@`zw)&fXG6aaf2|q%IItgvjbQcy z<(=uH@N=xGFM);}22}dN)O3`qj2wlZW2n=B`t06HHII+@a?hV-N_4G*u?X{_;w!O?oWvX|!lMyZX-xTyghJnOA%kb~nAgTYv%de+ zYW+N*#D1}V2Xpw&YamU;p0Kl~E!%J26aOlPA9Hm0ImYN$Fyo3!)E&1Ug&qfI(^H+q z=of+S66WAI#!dh0&KT`nL^XBi)c3!V|L0Ta%>q){g)3BC_4D^0J}EaOwgvBtBpg;dAf<_UbqJR~W( z4XE)I`{rugwSYT_nep(Sfui2gw>&J@^Ul*O)AG%A<)eV}(;HGM$IZFbZUSZJ$f3;J zFK4_!2{(_qIgL-usu*W{6WpOlZ*$vO@}Ke{w8su(HN}s*i>tzz+-K3=)*a)S^G#V@ z$_g=Jp_s6hQnS$9j|sC{&c%dL>pUb~V3Nda5K2>7F78Uq%XxFptP8W)xvyG_&LVn9l+v6 zJ$d0vPQ$4vYeP$g@miDCdeUad4YZ-S-l|aGFRUuC=-1+sW00WlFT}>THq#Nga`{D` zlwZ0&e(g=b|HgI0ziuwvs`71h!iY_}2d%)JVNb`gi_mW=izEA%&??s7*+ui2WF!fGt63*9m5!^`5DZl zv3i(1JKeKy{2oLdBcSguba5Lr{mLdGZTN*y!cT;8}B0K-E{QpF#GbJ%k6?u zJehj5_oURk)CsSs{}J>r`>?$KB2O{w)4XOsTTUO;{~X>g9Jue($@`|%MF~pXlDB;b z&FHIaruBPa^DST#OPl&SusTwD3HqOeC3CDxv(mF=R=G4feewMJSbx45y~}fLzNVTF z&gT(O)Cy*i(Rp3hJl$qUHW9TjqZ;%Vp9+|OkW=rzvq18AJ$ZSDhO3nDN6AzP)DDZ`(QkQwT7p$2DHrlPw~7T#=J`w35Tj! zh10gI>0bpD)?(PZxc~b?lDqs~J-g5Mc6>`hR6346pWo#)-(IU59SkK_EMuDF!mj}) zhYB&Vxh%43{n3RLgc{!q(5vD{{fy6lPBnR5PpRe;sz+gcFdMfW@5rU(P_wKB{SAPA zP2re)T++6&WJ)}*Vf@}?5bXioFZkaEd~t;jvF_?#gfT6Ezceo5;cJcX+fiV!()(UG zJO;K=zP_?5svbx6rZKZcRhG0-8Es*#i&B!aK*+7uF9Pm+yK|qndwi>uIoaZTE3>0J z*WKFT`Z1cs3INU8^MJi{lw?V0)3e?tj8rn>maoa-8d(i!J6lb^9`reY;w%eaqWIL3 zrcc=ozTHV0xg=W)`HsYru|j4hi+-Uo{|Tt|lgSlpnknCbT=_PvosGn@GR<n{FABl;|~Qh#34AexxCaaW|_$66BN<6=pi7tT(~ zYa;ht3(Vi%lU!vs=MnTj+qHvC261MlARldaH?5@dJNDvkRx-4E)ZwpL)vq=YMPg^vUkbI$2~kXwlxS zA}Qo-H;e9>N8JH;S+t3(h%-e%b;^JE5~!}eN^9$shJGfIjL#V}WW6QrWB$h0l)F~R|BN8=TG8FM=0}0k-kzjM>!49o9_R=Y!;8OX z{*{opkN>0SDW7w#vNXbY4=by=U!yqQW6_?M0?zu-3}qcFcg)MMir$!Jo(1T|Hf7pQ zX4HhT+3h9fO6?DFA-;Fe!Fr@J+kXt2l|5JPJ*V;U?RM2^lXkDc=w)llQV_3v5#E*H zN(xnbcwv@q4b;fYB)w@`B-A+_$XimdyAo#D9}c)L?$YO(_NLFxw6x3dFe~*?;Pb&A zzm(~MdJ!pC>l1nvmt>SkSuW0YcUD#J`m_}Gqt*NdB)y_Yi{HJQ%UaT!&#Df|CboJQv_nTZv)&LdYl!W0#<&S#~|Jq z&nYmjIEl=D-WTKXXyINjKZC_p`WWzz?QdEN&T8{VT^t24E$7c2Eu7f?{&zrHh^VwG zf*I~RqNPWl*i~J{SK?K92<(YLY<}9=;m&kf-WIEJ--#E09uO6c4!w+eyiRM%&76OF zjv)LJAc)dJ2>z#ZTqQpyr+e#b>8r2~wlk}4+FdEpsDtoT3az{ zdgSg?4DFWy?b>MVtE^N}53OHXrraTH(8$5`XIO))db{{ajKQx1gXi{*LE3`1>PELy z*FLi@o|&{5i}wJFOCl^n9tfj%wgb(wlD5m9F~Za6mlFBE(c9~~y_L&{wC*pe3nZ2D z`Vt^*!s|5t`Vz!ErQ`U9@xr1WMALVM<{nl=|6Eihu>GJ!^zVhSiKatK%m0+N5XJwT zZGUz{>yY0%D{vIEeK=cv#*uyxwq8h0yCGfL@J2?UPevf!@=;Kp8_6BzCNU`QcsDEH z9);ed|H`SUNZaJ?U01ix_}~oiF5VZN|5nuV8BgZck?VPjCcYB$E$BQ&STXN9 zYnj*4X=}sc1w7G-R;5*R@&NV&(DP&2f5zh+b)V@NFk^Uou@0ei_Xf~j91{q2K^PO@ zPH=il+-nurR#4Y4=V7lgmH#dv^}9pJw=5>W$2^s84%}?^MSLZO{9I@#(OjKXcRD|< zaq~Kn*(2^m;Tc`_j#Srb{a--u|BMh(FeR{LnRY4aGhtTK{;i=Y7lx5oD|z>4kT>P)Mwd7q9+D~#8heNS7>|7^7L7HGpk>aNnW>BkGWn)&_N z8u5F9gJfnrM~5(H<>$N>>xnp`R&R?I&+quR3m{nZ3&+*8Q0FPnlQf7ASiDi>rT^e7BA-6ql9ApM; zPqF64{}e-fHXxQq6hm*7x|bHG)dTUn&LoYf@)3WH9|#`kM=Yc6m?g`c*^e5&L$De_Fam@LQP0ID%O%CE^N`dC)99 zWWHKGmeK1&K(8O}Vcb+7=B1vK|IWfJ(i75_ip99!?S>v*1jW*awx>}n*Erqf3P|sF zY`{1i-Y%k1H?Or7ILEYEy|R|)R=kpw$@5NahpzuAmVB?oO24c-Lz1;+zM12MwBN!r z9B8jH-(j)5IIqm=KXD6n(q_o0QE&^NT!1(la8d-b+)4>$mCrLg7wj;`MY>@ogp|d- z`h;p{f?tJMUc_A%*K^;A!yXL|b2h2ZwINg|f%awmPc1-OKeS~it?YN^%h1P=l@{J9 z_|E`*RUY^d)sIC%`jOD#?vvO?d=B6`U$XhQ)n6>1wFaqEc=S7s|7E~qkf>vk{3lMK zbSk<_7`zr3yr?HVn$LvRH{Nk@B`9PUsFFS*sWDFx{x5{ht)N95S2V}QAW{R2XS_+i zqlZnM=XT8)F8Ofz1cUOusl`tvkko|z}Xq<6M!{5JxZ zd@QSK{Iv0zceYpB`>gDwq;PRWeXD)iF9DwgD6anzy84y%sk$5lg= z#WSFJtE**pgY+@~1o%LjleOPe;X4EO1wU{jDC%~`D_eY**xW(HpU9*J6-Yi zw}2{2@5jo`ODY#()4T8<$(spSch1LcZcl~1hLUd(85y1}?o0Vl)@mI8hH<>NC+W}Z zI5-ESGG9OVURX8uw}F*2h?kYORJjtdRhz#{vv)q=J6-M1UfKpK@)-!#AG!HhJQa?) zi}I)3{Vi5d9)CYPupit;*%R-W3iD|i@#g_;qhgU;voi?d{O~_R(_Yu3;HLIcer>rH zq0MOZJ4ILXzt%im1w9-`*vcX!(!bISj3{)l^2FvOrdGKk- zSK3krfvZnwgv2LsGUB0k_CzILlDAs#0dz^-x;jYX^X&^il5h4!d?nU0Pl3D_tq%g( zs?O*Wr~-}eV`#?zI`Pm-2t_<7KdojJ+6mvBvQ z1k_ipgI$rYLa^Ft?%bzsMOurm#JK%Fa8o2jt6s)Sp*_L9GhzNkwTF|SCGwl?+qLJO z5+~oQUIX7L5^2_T3ldP-o_^%5{~JH%C&}?7^grH{XZ3W7uRH4QGF<>1=jr-zd<^@E z5TMk z7?nw#o<|Q&e%a5$T8O1rb!CR*?R50ZY-HwORLRzAy*X){_;cOQ`qqzSdOZit?*7x}JbFa&JIB5^+u$WS^q*=lYw*Fj@OR^ehQcNAkO#(|XW$ z)Ud9DS$O|E2YR05c-u?rf8reDgmz$~oJt*RVynwxr%Dpm>QnoKpJV;^JAivbcYe=Y z{@%HR`3#p-r!uxWLmpCdc&r%}u>5qIsaSlj_&T z8}&{>I`R2J$~;^KXo`ILGhMc`vS=L*Bey!rhZWtck$weh{`{WpR3`g<%=*!Ru|9}x zn=65dTlw|Ggu4Xk&(W%lu^0swha$;*B)j)?>oQnEmm^1%uafpFI*RH$9s~`$QL%PD zwLOjitU%5TYj=V>N5Zr&eTnsW?pP5O(@w0~op68XAz7*AGPNi(Bl;k3v3i(wAG#(U z+71ZL|0tu}DhRaCoi7!`xfF1ePpqR&>)0!lU;a~op9dJy*v)4v!}IyL=y_%0C2; z%cd5!)Q!dXF(+CzX7|yawycKx99v#bgrs{~BtPpyRU}V!v#w$`hVqMmqMVMem+Jb# z(u{uH2j_k_DAVHW^2nWZp{2`xGDW}DoWBFwLvg--@DiUGF5&a5_}oR>Sgh?`%*mjS z0P;pfnYnjzdrrq}f>k3=R`gfxyB9@0U1hcH4YKUx=}c1c3_EIau0X5xGl1!8IMNXs z|GYSpNgd27Zr!s2Y1@%*adR>=`LZ~*AMY~^$^<$VN zVHJmqrF4k}a3yQN&?b6i*rXi*SG^o@2N0htoV znyMt1pP}VUvhv<43$zcGxw`Nh^V7ct>Fn}wO>G9sDR*`arA1gTVrL=J#wAVrQce{1 z3~-C~SBX2TMq9+2Gnhx7cEA&d=kbo#gnMT*`wqZzer40KiZ?jQkb|7GKAKr(JRx1z z^ec_`!@%L9NG}}$HFIsaYdNkHvFdDIU%?#e)zk-RV4{;Nm<6@b ze&1VNLC^zF_lR>!`B$%{cT`2i%lYb7xz0u=FSrv?x?Zo_r zRbt-+M)Kw~#*l8RX3?L~3D7s!(Ozv9zXu57kx=*gpXxfbhI2AVtB?3KAmJ1;x*P5f^K_fwEo z(xc^egVA}B=ira*5HvMq;xsT~HM?vH!TSm{nIf6}!mHz{_%Yg|`-RUD;N#*(XYSn2 zg-o7|V*ObK;j%nD^~>sfi=R4YJFXr{8PxOd2D6C6-RPuV>O(s@O+2gFx(sk7eacs_ zDpGj_^sx#^$9r-?F#gbk;bbfQ5LT&HTiWjIG&}En5|HL0PZ^n+$9(h5v`ew-nm@tF z>mkhy^$%l7wr4M{GqPA0{WR{Eo`lWe-o;krOTcZ41`G<9yW%*9+>u0x?o$l)Wq|6U z0Zpkz9PE36oDX?QZD>W>M2lV|of4ob)^$fnyw}#E;k4u_;_TSZBSo`D!(#9L4(IY{ z#a)1(tf#tb<*bUdzY}_ItUu>@2da?bK2U1?6<8cou;8hgmFN2pV6=YvkaOv39&FEw z)?U2%-@u@GOwP?p9b1dhV%l1ijkL8+4QK^OhQ)Ld)_n8Zt1=siv51QSe}7Lm|28m? z?-yDD{-=5ty{{|t82CGIH0SRF^t{JXWo!D8CBN>F@^c*g%E%6_56YR@|MNk$RD!Kw_`WNHtakMYp}x1 zmGRSqAW>ys_OqTTAJXs3-}|f;{Q_ptRRT4&^wJrYI?toL6=1)nr$x$Or?pC5d(L?% zzCBm;Yt78LkZ`iR2lHI0?fmn*{5?}KhiwH_AMMVGq*__lAT7D`TKh@pTlVRh=3aWK z=LK4d{QI|P@2y1vMc!d~w8q7F!d-Q=+g$ES)#uEkF?%r%F68e0)3}FuwX*%pw*rO8 zOR^YMam^l~ad#}eLZk9cSYu|cRsn0SwW*r}rtVwBC;Ee=0iGZh#zsbQ_U2`{J`0)S zD4G@;pA%-b*@J;qKGK-h{dHrEj8QSF$lW-4YNt4LpVw&-bln=Qqb5s%2gCX9Ro*n7BGI z-%j`EC+&y$cX7mgo{mKdt-f6&z8|!gw1}iub>)Tg^3uLEQ&oR_X0riDl8>TK)CxgCs(@i%$4^;CLXwOG`0UDzXKZ*7tw4XwIG1^a~y#(#0 zXfH$i8MN!reirTJXsXjhxU53H=z9@+8fb+3GGd2 zZ$^6y+ApKM7428heiiN4(B6jj>u7IB`wcW!*Zd~h^=R)zy8-RD(B6gi+i34bdk@-s z(cXu~r`wS;ZbW0%?FZ0)5AB0!A42;u+V7)%1nm#dK8p4+w2z}Pw*LvVKSKK?+8?8R z3hmQqpF#T*v_D1rGqlg5eGcvOXn&6O1+>3F`y$$3qWu-xU!(mE+LzG2jP@0@ucG}e z+TWpl4eje_-$46&w0}VRN3?%J`#)&^jP@^R-$eTs+PBg8teJm9`**beK>JU$@1Xq` z+JB>c7w!L|{SO-JcfXHz6WUqelCYyq&V1?9}s($t^c0mzIQGayzE<$p4( z?awxFe$GRrC;xO$%2-*b<#beJne7M7yYr7|uenJ1wdh%Twt3Iu?3f%3t%IVHjA_16Tq4B_dunlrY&!D$$8=4Q&JoA zfqW(feP69WtM#LxHPujx^6T0;+Iv8mZWW(;7fbcm0ZLq{)D+5baLrowq#RZw`=4TH zZveD<8T+)<^SxHf_1Y7bL_vQC7_yUxNw=)wpw~iLv6FdX+WkfVxw%KI{_;Gdoc6&? zn!B^HH0D=Ao4l+`ef{Xoyp8U3w9dhbxsm>x?sC6(HAKGxoYp5#$(7&=&|cx+2}mu? zoo3{1fLMxH+Y|+pfuqTl{6nTM% zwR8%0{+S8F?RS8iA~=#T)sdC(+zXvXO51`}19pOsP9r5G_!xlWxZdZBG?%;4Fxn74 zS8WfpmSSZZ%L@R*t#?_3V$k(3*I!3LcZyaump+bBbEhg~NIuqJ`t&BzxA*BqSS8!kp@65UNLTTZ};5CMu}X=;=() zJfw;;6`Ui>DE<{-h|-!EOQ?n{P*8;*N^*VTP_Z^3B0Yk1Ye4jlAO%&%Mz12Ws`pyzp$6JGAOae&(4u%q>o3Rr*zT&`P89Q2d|14Ko1bIcaaBT5`iY zxV#*q#&BzlVWVOc+hOst-Xg3NSpY`ji$SHKvOe}SF4_I0SHEgBm6LlmFcFnD$AnO3 zduvm@|Lz2+H1<%-cp|hMbz&MNqwGb#kA22p0~AF#B<-v886_-z?GvCWduF?xX`<6i zjLW`*o}D}|I2;;C)qD_SJ^zC=%lfus1U$t<|6IsG%UeXJ&eSjrlvtsH+Z$fp5$<0zRC(^yBg zK@pO4lHz5$Vtp+58-T?|&C52NcCt4&FEcCwW!%E|e@9Q#|&vTp9of?4z#d*`%#Qzti2#>i^6zGMl~ zbBwPLbF3O*xJb+}tO^&Mpl{(K0%dw*ALwt8IL5zX6mf+VWp-+&$||IO0-8O)Qz#u7 za~wuKGfJiH$mstB#!t?QKgay@A;_8oeQT&9+S!e@t>+aM*{fH8+jMrU@t^4Y$ph&r zaSi$GFy<-X#s>E0?4Xil&eCCCi?4UnFsAE|MZ8ICg>;mhu z>9vxp;&b}B_P`9-Db8JYC5m{rn{= znE~BEVi1u=ox4gF!k*a8^CvKO|)C)a6REDQ?g|uXTDKok)%CRGn4x7> zi5cMVbF2}s1RhPS9m**`77Z6!kTWjkze&OS_*oN*mE6 zMtWG+!T5rt(Q!zlVqZ1gr!VcU#0V_6M7cVN_>jCgLAW(!{~LRh+2pjit1>H{v%yF> zV`jEfoDet`%6RHQ7xyA(@H%0uGJZSaXN+Ajl9jHEKLjjwu7@Zn^k`WHLrc#hhh_!W zv7d@9MB;50GktykJ#mMx1$AFVNap5+NLXk-{*U)I#{%lE3`Ay zVzIp8N%KuTH2aO6MWw26QV4g;_}+gyBf17zDvwRHP?r60RL}uu(MzD6As+Tuc`c(( zcg5EFR#@+&J-#lpj>8k+eyDs^LtBXW81bZjDl|!T2<*<@RY2 zrBJt$Hsg9i<2v)!icZLx#ac4f(6mm1(vq3W(DD|AaKGqBh9p5;zT-?v5RK$cSe1?P zx0tWb??*fvlqou?%Y8-m5N%INmHEu8GYiyxj`?A6NKhxB?Optv)z1Fs80vEXReM+J zj@3!*blfAYw`pZC2T=3`#xO#1J#dpf=yO?FEw*o6Sv1~Y(MPaa9?{(-Y&VyE@$Eq$ zR@#e}%r@!nM;ho~GcKP$e@FF%xkr&j}~=l5hqbDTKhd`8jL;)Z^E(cQx2H-U+? zs_23t`6xMiW$}x8wF`&A;}hMTs;6Li zq-!2DC)WaRNphQ${_5ZTTK86KJ9^zH`F8;<`@H=71lC^Ge7qyD)7q4+>m**yTk(B~ zOF@5J^-Y*f*2U0ss_T8&DSeE|#PP3lAP00pM!DX$RVni1ifBFNTyba7y`ll0=O7Lh zUzAxb>z5n&D`2uwbh8V)rFZ1kiRV=?R@a}UW6!!Hwanl@?JUjtQ(+-o-*>;mkrpmm zOmFR24QcTTV6AEgQA(8!-<(=p?2G$L%#Ob+_~mKc`Kk-K$bLBv9nF}Uy~dWqDxeI* zN}7bO;4^=i6S5eQ|2c+w8c>Ik6`}@Vtva7Up45b3jK@SHSERZKCqy&2TFud73^0nGfl3F(R* zNqv)ecG4v4-0UnEJ#WyzVq<$BXhw5cE+vYjQr@-^Z5k~*FG-a0C$LIx?D0<1XlWiE zGbENRCPd}oLO+vy=I%4Ui@w8hRwK3CaNp5kj6l{+`Ha<*tHsir=is^6L(_SZWZ=lT z_duVu3KyaGQ+=<3dNcXu>p*&2To0Zix{Nw4R=&*SpdSEqSO3^_Z28DP@eoc&0g-mq zR5!2X@4wRM#{mBaqsEGPL7wPGeOm3c)T1X=x>9b2m98594}*eLC*kC0nQY-KGHPJY z*mClbJLhe--8({QwRQo<2WpL~o?LPK8&=Y+C#U}$#-LiD{^rRdemW6?G06^QQuc(^ zpZQl}oAK9y!DM$9g+Y}MCr#j=&t*AzJ9pdO$BokrlR6!cg^b6yR={PK7&=Z-J z$b1QFgX1ePCcgtrrlT>3_M;!`3%?;oPUjGo(+=)EDb&sw`3hjYyGNzNuqykZQ*kVH zl5&96(ZE}JR!~3IUVdi_WjCe9D6n7@E!^R9AHb8&5G__)LGd0-QbAGHjCCWHIU`g) zp;1>%p1c~+W!nxPdYH4bY%}-IP?G%uAgem1Sv0bF1%$;QFGBqe?ZEH^i01mP<JyOpYxe(cJ34FqR0d0U+n`7*+=E;d;}K3uugDcN^C3bh8!c`(06cJ(YNHoNSj4In2Dwqraa<)4935hr{^ojgcH8eZ~qi7 zU(EbNC;RQRAB*SAWxIG-GwWwseh6}3nZM=~?!y&S?Z!8aq}ncv+)iT7!sqy@2d(UW z;G-OauhRyP^zF?gE+z9+&vzBnCj;t%XjQA|iCJ#{*&RIRWek2WZDpL)4$Upe;pn95 ziHgp?_dUK;1dI8T&DcA9xT{500rMjp%+)SymOhKUn!mpW{{BITS?$3LbMF%6c(b!| z4q*iKEVm-fVYozKgG_AVV>PpEFJ;1wfkOm@gF4zGqF5vR@cNGd^*BgaHk?*tYb zW$W%lB~JcKrMEyAxoCIu2#L6tv`4>*tL~z;;^}t+$_IN=qdAn}cw~cS2JQ-tC)wvX z!q>9-JqWRH7Vjak{i%9x@h(6R7YIUGRh*+xw>O5gXU_^V+tYTba3%0G7xXXBPyJU} z9{on+T$S8$&;@s&PPDR|-qy)Wi&Me)CY z*{-LNZ5@iU^OUT+FlXFT&7DCOKP1Ju9qji6r2cK{@~F{1jA|9sl)o!~MI(P2@cHb} zR`ty6Ewoh~#SC+1dFokFq+%H(>)&h2%P{SKX=mpI9E9Eq@6n9j5qxqzejLvNO{&7O?Sla`r3qL;!NtMGHI z1@}P<4#S^z76zfR(ki|ZLp}z`C!?9Hl7GcAmN8_W#?6x|DAjl-N_ZuP{Z_y}62UH8 z#VXA~FTqyypRE<~TP*Hop|(_W45v73H!wA*OO>$<4! zIe_x7Lt6PCv@sT?(_fOP0iHlbGU!ci4Y%X(- zLjSN%i|6O;2lx4&=+%%YqTV`Vq_ccW9oo zvfUPyVJu=MTPHsb(zRd!PZ5It;8pK%;7J*qQP(yKc}k780+?~ExoC`G1p}oR<0|y{ zoF7HrNbmTcz}<|I(z4>6;b-zGo>vcS6h&||kdC3bx$Xxe|EbSf4Y!ZkF!~e7M`6^= zj~;v%G&SsYtW#KlxE&b9ds3=2Q)n%4?YJj9j$PSZia>4!9LXxJMHL*k9$`#?>&-d{ zlh_^fd$Qn)QREo(`+=UMZfeJe8pi4vpAX7KX3C*+S}ALRjOqMeX z^K@5N$%cF<#wp3`%bB`$X!QBWLjYaR@E`qmti(ztyZ2ta`jiF zjMP4p2}nIwy3-1@cd=G`A0WTB?^)XgteGXQ^VB!vO8V#Kztwx<+b4kE%WL76=Gmfr zL(ET%GO?0?nUy+uigRHN#8K9=6^m^^SNY;-~ODYvZ0Tg6BdT$e-5=meDG;wmj>Ur|Z{6$1>%^;MpeH z$A_1HjshzR=mXPwwX7#1 zS&R1_J{Ntv_*qjerZJdwQ$?yh`PgYGJv~NpuG1U4M)(uJLi(ur{DxS_+u_+p=F_=- zpLxsWJ%Aj?W{!YoQYYa#+DS(y7&{@ob5VO}k( zMlBBUFTg_)6(4e4{~=Ak`!UC)Bzx+z?i1WQK)=Mfr7~Sslr5n(Fqc(~sfH`oV%GtR zi$gS@WnpbH!skx+zRb6H4`%n3y;UxgQ2yMfSKY@)7$`EL&y*dxmuK2q?dg6H?dnl*BNOz`TLkNA46w zJH^DED%@(#Km$pt309e&b2b{i3TBk)FZmt>y*G}Eu;R19o&ji|>aIq=QBQkTA)lgt zPDW+Jd|IJVBk5}%6jZMk@Ha4~$9KnMGgy5}+{MV&v@t`pKFn_2ieBW`^~T<~ z#TQ?IREX`HDrx6is(vk5oE0Msvs1SKibf^s>K_WFt*Q(yXUY?aZ0EPZ`x|JDSi;uz zjwu^#;^*!CIG`$i)c@L%i|O6%&!Pc5kyC4RcgTbzJsDPJrP&-8$T7^NK`n!(+TDgZ7N^f7T=Hn(sp6I6s)CCYp`2`NpDaK|C_YhFMifCA2esLAR;M6U2`|19Lw*4u7kgi6 zJ}R$_2-^7gtWh%jwG%5JkFIR z1@d|*MIH}`t_s?xqIz>8KaD;6)Kw<}`EbA47 z@M^2|48Xj;N6TeaN0Gh^sgG;t`%Rk7^3y8z1LryTNanv&!ugW5*mrsYuzv0ku@;|E zZiIG*zHuXUQOnn0{;usCiz1!D89am;V19}-!8{ow@Tt>G=tq90i$UJgx)he?F4S%u z#NTHl*2ObR(sd?hYR`rFTSqXy_?dZY&()wbaMcU{0#7|fWER;#&xJOqjVA^vAb4m)Ll>cM&t?W^`hhmV6{5)Sn z9>fZ-VBY-94&}m^07ufP&KTw~yOXd0WJTJHTaJ$FU=>CF*=&pou_~CkS4M~2C(?1N zbrUd%;{u`fi=$ce&1psIL}Jc4H5K7=2AREg?_!F&KP+vnns0T~%_5cULV7f8jF>N~ ztyy31k7xc$b=L1Gfi=_IlA=An3eTK0$$67(aoX7T*#8W3CMqeX#v=W%e1?D8gu$e2 zAI&I}bWwDlWZh<9koOZvg~g{s#55E8N^2N3{Ub)F7&#(;hgXa`e*$vc`8{QFJk5uD zdi2RmlKDNi1?3;=+bU2*Pdl*H>k4|6ZPfaGmzmvZHN2li+#kWLa!*|*pD?JX_%Lpv4^HR#oA>x z=5`xw0nu$Z2J5%THoP2s&-jHRg0#*|T1>W{i1&;J_;YF1Z5D+vnfXt^{~x>f59(E( z3-9YZv~$p()j%@Fc>q+-Rpp*l=0FbP9dR^U@&H~L)wPp5Q$89a4WVB!f>W7l@A-G}1TwS5T&Cv`;JJu&ndMPrbBWsW zbm_EHc#4aDA^QAtaO@4WG*A)zDt>idM97!K*F}f?b4~WNt^~bSM}7Vd8frN6#>%8n z%JB+os966%8O#c`c;5EG9{Sdh_+lsg)b-#Bqdn!ei(^b9*?u+4+>wXuJit_p=?^gK z&kkwS?n&yymImRt>*e(C0(yGyI`M(?w#vAG^)5P7Ka_ga+;ER|#6At3TucdIHj3kC zU!&B~&OZ(8pWmH(StV5#8TqoxHj2H$NmvdG;Aut;>|Jahy%*BZ)hRWV#wl-`vVW6Qy)sz3M;~LNOFfEcay-8>N zGAyAFbg|CcB=vSup1GPLN;gJdEZV9uycJ`RFIsMA)YZG`(>wa0+BhNH11PnDUo3KZIZRvlz#y~i5+zJRY8Kl9%ImTYfw=>7i% zpbIrlyrPO66!hMRh{Xs|sMFljg{XnGDW5tV}5W_0i@JbB% z34lC|v6@byb-^|DKgAHo0a3C2LB@IKR8VhyiKH#AUqv)8_=;W$Z(6OG4tCZeXm_CDvl99Ms zOr4V1YUzrvb7fntQQ-CBNZwcH1e;Y^tpO8@Xj$zQ>&aR7IFZRZ-@%!|>=n|El7Gt8 zEh9ZH4m4p)CCJYB4{~U>>yMCt;jLtMXl7oafPWb~(Shu9{yR zkFq);p6i879;y1{Ay~aQr&_goq7>~8<2eF^!dh$X^6_muJQKEtmE+rsMn}w2Z0^R; zWyw=UvzE~IVw=>V55j#vtWr~++A^-K*5?4(Wh|Ofh%_f@(nXncmC}aN!^Z4aG28~c z7td<7BzEy6pX0(^PVe)fecr8N`=FU2^u z^R;;_M7_nDDtv;Y+i$D;1^rI}U0!$-=q{$yMqTBuj2cI&wSyc&`+##{2($$k3PtmG!g?Z93OMxptPaQ|xT8$Ah- zRsUE%!Zg=&d{sMkZ4M}>bmkK!L;2p_vmhVDA6jW&!{qm&mR0UC8np~e=d+d8`*=R? z2beGH@rN(>>x|FW#QA-3 zvyeKbfp3X^w{`oS2IVu-!~6jC`uLG%;+8JSAVl#`O!*D~|?G4!kc6LOUVay_T93*nR;kbzqTS1=LHIew z;v>LfSeff{QN_YG{5lqsZpzr#%Us`cVEIgs&#JarKgsj0#xS3ZsOVEXo96(gXuDir zg_eU(?x*zngKLIDtbs;%JRsvR(XD})kAP5C{6d{^K>t6?Z+R5 z-AQ043)aavlSo!^wGA^G+YWjEGL~EMFDzcd^O{QjMFUDLx z>c@hoUfVa^T^NIJiCB#7D8|N!o9$pQ>%{l}^55tC(W)#%(!Zl`{Q9@DomG8Rriqvf zts7_E0-WW&4#rug?HN(cpGN%_P|a}o_b@ob_xVIkG5>A@M8#g3#gB_3fUdf&C}tQ( zk}t^4ZVcndqrhi4u?gQ6FrSmwTk#oVzwJSloT$>!MIMGh;7)NnXDs|2OY5HipAI9> zWfjf_)AIZAl^F6*0rHu!NX$Z^-$BW!J@fh;WA$!e_4KY>&?=OBG?dFaBk%;Q_eoeA zZZ}eVC5Cq&XouKWE{8|VDf_hdiS{i$clz$!;p;xdupR(daV>oq{mSbh<(~6U$tN z=CJ;>9`aAX`fJdxW?ZyeEkWq-+nz?w^cv`w{`XiWrR?cIjDpYL%0xzCc87h>QzdA3 zsCKQ@dKhpJjg{*t!?4POq7L!TY2(>hu1@ZsL1&lL(&D42X&>#@vuf|O_K}KOHlsI5 zq;lMkV8pY%_yG6iay?wd38UfVcd#yrbqHaNy&r)PR<{6FPpvgZ*~b=XBu2E3bcU$3 zFZCm3vmf0$A24DqKq*H3UG(JT=GLh)M><=O)x?w%_km5LXii<4t>c&GccF5&ZBFzq zmX99-?OxxL7K3IY>)Ii9>MBplqh#l-=*bnVf<7N@JFfDs1=uS5KZ5(TQ>@kcKfroD z>T=}$>;kQD-nhF~GFh~_3mQccBtQB#Xx+x13?gGy%mIsXi@d8`t$!xW$4_d;N%`h}Pyn%AV%)db`<^Por}z82V)#S~LofN`E@L663? zTV?x&^y{8K&J}g`A5U`Pv&KwwbL|j?0JMMYY0AN#-pq4Xww{5AX)*6K+vD_#0y~M8 zUP?mH3#SBN9GX>3w7FDw##!!ky*ADY)|!;mk@_QJNc(Yz6;Q991>Nz9b{qL{211P)u|RaN$nXe{*C>X z5v0_KM0W;XC_*QR)`Sc5Ijtp7M*LKRDL`qG6{Lqo8S0(^W#>H3!m`{6&a<-t?c{-0 zYaYFe(&~<(C=Ml`Qr1KGIkvs`!-{=LZ|y@HWc?(rRg-STEbI)dYMzVpH^4~qFc|I2 z2U8xyk4lS2#BpC;Cu^S4gfgg;$s>y(#jyVou;WZcvsjc)8?-O7^kCL~PwVsox3gGw-gG1fO%f8hr z{{nDQq^2L7iaa7p*(xA#TMN& zu-r9`cRR+rJ~H}9H@e3-ODrevUt2STQOCR_3H@4T5_p11c%R1lDA4z0PmYyka*dmd zBCD|;D}GAC9RNxBxcC=`An{n)VU}zfQn9t2j&>H^uaVyXd{kvtj!!cy)Q=>@Yy4io zRQ_7haeX49mt!v1T0G0p?U$fMMtg~to9R%i^s#5MP||&Ao#uq|una2X&VqPO?f}a$ z))<4$iK|Zw_u_Gc#{lgEwdlQQ)k7YlZVY*?UJPj;yahhZmS=AB?-Ar4c;c$X27UUu zr0d}^X70|pe<{XLkCW<+;i_zPSbIZB5!xN;@7&&#Kl0{u(0mwU5?f$5uXm->K8%$+ zf+P+86Jv<2)G8mV$Uk9Bh`SfKVw@pz+BoPWzV6$gt=1Ku?3Y~V2fCf~$+Os5tHa$| zjCSjDY{RYrs_ez4P}#5fkoM#km$B8mN%(<`h=reH9DW)&NdGj&K|4}9;2)k6#tfr- zA47T-AgxbTpzRA;&Q@L3YTKF0|cfd(ifx?L)f=jTO3=pzTMy6zwv!184`)E=Rip z?GPGI+CGdnigpC;O0=VBSD{goKN0OoXir9Kqdf)fsc2WDeIIi_-hJi!jrhlyP{`>Y z1QoixtDnU%>MyddXvO$@DE#^#t0A-}Vo8?05cccqdOFUB;d_PYTJ|C>mp;vd=NJg44?m-aPJ6x=Qt1jaX^dn(1ZG<)Rkth z^63w(OlHi$Wo$T7)cnA6YhX7jiV73Eh3$XXm?q@=jDL#@!ndO+3)pi z0pFf+F^A9&p=OC`(*14}^J4kEcz;8+WkcTo)pZ(;Z-a6Kq;jjnb-4SS<=-EUUsOz~ zxlz$Y?*HA9*%!*$GrIU{H0_x$_i2tmE)A>JggyqV;@v64n3xTl8SaYSo12*j03(;t zZ^|e8U>lOh{T-)%6-@qn(a1F5DwZG#Fqn5ktIO(N70psD4xi_1QsM0zIRD#Vzq7W) zRg;i1-?@PpZ3jO2a~+mIq_PKneNtBk$&aNh@#RJvPr0zH1UZZzo-g=Dr@F*ZzB@x&2fzUhk_$h7I z__MYjI&M1K_h4Cd+gIq$?$LZb661S%-x|Uq>)N4ddoeji%fZ>V;SSAD!(RJAspzj; zaYAc7wmPb4O1`XoDxPcI$^0t%R6NU@k$>&8r=K9tv0Tp-Ssmg5;~Yt|_^I=vJLzft zN|f+oP@yVa>PXi3EHl!XU-4YLCute?bg-w^o}+2|s_n^TFTxyry-SIMM?LhM7}`~w zd-{~|KEK1+D$thZp3AV3tX|H!C?3i+bvuykL{|3A`RUCy#`=-}$HuxFb7*lGW+*k1 zpT$Vze~D_E@&@g3)#j@bYaBAzB6O|Re*=cHQiE|vSx)!XkWAW9({v;jld&BY)KDiu zQLJ0$&T985_FYc_qGWzuhPchs#0j^}e;Fj4?l4brV<8vad z+QN2~+FopO9I2$$`e(pX_3&WpCl5+FddW1iH|ReyW>uCIItYCyPuY#VYM);$>*8qL zBv$eO8PeZHA|Edp-(yHv)J*+-s43e_NJVVYkrGIg?9KV^s-K<`seUtxe z*!~o-eNx}Hfbw@QUQ#Qvl`tLz3X` zS#3TYk94i5L8_p9c}I)ZomxK*{8evp=4vNZ$-^h9(7O$N8b(;-xKf#18qWR(X0aH@ zRR-ux&qmQ1dH)7{hM|jCo4}nw)IqkVPM>0(FasIA9{UpxLJl}-U=cn^3h~n41GYw6 zt{+T>7R7X9-^Y19e#TZ1?*uKdKE5hX5T{I@h7@EBr_5K~TifTWw)&+RnIVep+<3nK z67#)LakdMPkIYx`{S$cby+e|wsWXiSuPKcsLyww(egEEDUPeBADB0dXymgd^yIl$o3z6DXB72B zcW#)KR5YPnrZ0hmm>sQGjWl@VUN9k6F$;FmpLno}?u&dY zMv54dm_eMCduzhaF}KYFtaMpjsE+Q_z67J+)Yn{BYL)PFjKyzlpibF}+>_OY__>>p z0;AXTxU(!nk+v#|<2zw|nvvFGYoqAbqLsVD0#SX;VEiHemrra_SF7gcd-A5ViJ)H$ z=+4vgC0BYbd<)C6x zcFe&q0mMO8IQAxrb3wd%H5zG*V>Rk}308PGn$g!Bp*>CMO?u;*Aml(=trk7J&V$|$ zZO0=gUl0OiiToz_F1DiH3Fzx#%dy6Rd01jVE(<@$Slj^qRy3@f-qI9Zq@82E;@8?0 z-LEyd8|0p1mFtO*Rlc!uoO>rums%KmfRk+fP{;Y7`mr#44I5MEO8`~7?|eAYmc_Eg z>9B(s8!6w;<}QUbkTgs;J3Rkn$`VF*x z>&pGSp=o=bFg(}wZh3k&?HfuVLSh}a#vVu9I<2Np8leZoEZH1>X%#ojPBNZDX>idjv=f}&faCP9FAKuaxv_EYhn|XT<8bjhjx3C7+3ctG&%F-NizQJ#=;r;Z zB1vPq0lnVXlSIQGlgrnJ@wRaEvO4ISht(#&*Ae!h5!?;lhV+djLbIK@95pQ-X2`9w z+IZe9g7^yIVqXBDs#2hw@{1&R^E&pMW1X(=ty39|7r~=HT1I*GR_UrtKF}MpQwpos z=AR%Rj&!khYf~0`XEh#k^33Avq!CKVYqC$QBCz@Y0(y?CYsx*XvYwYAb7+au2CzN& zT;o3n4A~TQu#feqJtx6Vr{IWK<;3VX_qDiaMANmDTbpbR1N6v=81Rwu;Em z_M^pS`)X*b8TT!qZ>^I!qsj_XpT5n*TB*s*4mpWzJgap4&$0J)6}&H58+D=9vHjM7 z0iQdjcz*af#^UY3;?f?q_!`r2s`50nYNCjFNOotvH1ChJP^X^xrvOJ(uGy<2G5z%# z$2{4SZ>K;Lq(siI*=dw8Rz=fl{W@T6eEx5LM#q-`EA7*&)>wChUcWZSHBGDFrZG3< z{!UicY_Q+{k$w#Zi)wS?f zqRn>z7niLVOjE`3SkKHI#rSD&6`ke&*N`(>4YSI1<}J?~&>Wi`&0eU*4a-fzUO{>| z)a;D%EVeeG&VqXh_u%g=)`VQ39dEP*?Jm>R+&lWB9=Dgxfbocp%$%m)4JWn}NIA}Y-4cW`|l=1v~y+iGh{!>&jc`aDQ` zC4R1x#(F(q$-*nwlxbMLpGmE+lOY7-c354-&(5?*y%oEc_MzG@wt;RBoahDHQ}N0u zuE^4tZ9^VEh!K-VbWNka1vHpyL54B2Tt!+9b+yLhOS|eAK}yQQw7uceXvH2Ri5q>)rfwS0xE8(+F|BYch$M{k}HF~K`d2Fjx%1zniSi^M9;={I>c8D+JnItpX^d#ITsf3Ip;9#(K{^^#!SQ` z{vLl9gW3m-2RSW<=Qn8AM)MI#N)boya2WUqJ(v^akT4V5HW8OKbsTznc*D<{p*1Kj&-6cUvuZ_%F&Up zb#3L!pI!V5pc_@U4@NhkWI6^vnck7J??hvqD`t0gfCpoHs>~Cd?zF)y+wkbEucKdWP@5;p{$PbKpSx$-GJhPSL8;+LMnBf(}>VJThBDumUth0?JK79mQ zIC_GOa`@EGoE7@T?tL6Tcpxkf)n5u;*(~_7!JV(mU1f}s=IwWCZg=XVjq&Y(DL*RY z5&u&^Iax;5>UeUuhi-j-PcHdUjzKYqbBD406;t;fVDf=3CjDA|wB5JB^5f}YhCd}U z&-l6uuj6>NXji?xvii-HkX9o&SDKast#;cvSakO3+cAbFv7G8>yHg(0elbnwTSXs* zbbe)T<;wh#Dle9{Gi@iu9P-bdVHG2}-Xhx_ykq2rG1a13xD6zD|FKlj1xFlb{Pdk9 z;vPWSs7U!X)K=xa#18-?SLau@D*b8>RYXaHyW!W+#;fub zz?a{!9`LCrDeGy0x@WBC=izI><0DCl((EZ+?%a3zvS-q#A{Y&Jpw2&Z6Nw+5Y)?T%{-Ke~#^p_X96+XXrnzXY7>n zo$KCe{U>Y=!S{81-8i=9Id9$ieuznL^M%7o=nq0iJ}Fw4>bd~hue5I6vj$j;qSGEN zA7(byKQVU9vq|^+nw+qnQppkZZ z|CCoe!`~zp^MUS3hdfhM^OBa5p)0I(LTpepAM*sn51Vj zj9(Sy-`mzYxQ4o;l|(wm1A0`FjuZGndz;exdEl^NAS` zwQ4E%9K4-)8Y-VxHG*$aPec8AXff3|HMgC1fxpOM%EMYMnzMDnO0oRiqNBaQLRzgk z7Lp!Z^SDBBFXn|AGs-&MC#d@YwSTL%SjyXZ5z6})-6QCy0A032`Izg;JnqfZSrK9V zp&)(?5c3{Nx;i%YCfq)a@aYrUr}0Vj-#;yBb!-(K4N(u+zC_wojB}S)nSR<^Rmr5X zm_i(F=csiCUi>urHvF{kiS@C)^4pLE@~{LwZxM!eCwZ5AWY5arvkm;uTs@qB4?E~} zJ$=%0wb5Q<)tsmv{k+i zi8JHJ{Q9jU`Ac9TAHUolDU0#M@`kkmc20-$#UvdiWxfo^?;jE+o(r4zyc``4e&SeJ zc9hR)*(j>wiIw>i;NJ+0w3ec(ycJR%uc1A;2L4(?qa3vpru-|h{qs~<0Y|!PDaau` zhqg~X=Ei(1qokI{;XBd^&VNVGv1Jw3O%O-FPDJM)_{9WS5zX5!CCTUsjVbcaf_1 zq%PztQBT_{+ZvpN#$F$L%lG>^3r;id#Tc0vvC6D>0fUXAg6)uzyKb2pORW`C#(CY)8eL!MTo>hii+4ej(2$nCjU)TGv+r{zk3qR&aOz zG_*-z^n+17$~x;mM^jygc)dzf_?%v+LM*Nwi*?3ZAlYT-3WsJogE7TbaPo0bxqEMP z{-5YQp6{^tP!GD%rE}$ZtrefukUG8LyTIm^UHw?jbv6@48QCI_Ew;OO4`cf-Hb<#j z^hRmiF@WXbea$tTbXh#=FwU#HG{UO^ zRT9Zc#Fc-_N~{0hNB`Qh;ON-boB3>DY`wb}8)uBZx@pMW&<3%ez}2nZeUYYO z=1>2>>aH!suB!~66cMo?eW?WvK9taUYv_yC){rB58--&fcCyRPoivd}MEh$K~wR~-7_aIiHIFEMOw36-~%K~#C8{ z^#Sk4J;hm~i6$9aPxUsLi<6%=aqfyNKY{y?r@|wwW|>DMran9HJYfE7OkU}BRoSKF zJNf4j_Q?zgwE_D^jue`}X8lnDc=sHitJ412ARnxqArjK=)mGAvx$JIuYyHaUY8DK<5XWl8*{o+kVt?kn$E zJ8iEi_1%(p)N5;VrSy&(m^<_-GJ3u@dpFkm^7=m5Twdka-A)$`h20dC-mZ5^iI&ez zeOFTY3h*H7Hy6KYU0Cj16Xh*|+8Gri#Wzozd>Si}e(X;5;o1-21T?En`+N~v;e&mt z;^$qTp=ZZ^_`J+s@7E*g72=Fmfo0m$5tXmQE?SM&IE-|UwMg1id^eyS>_h90Z<8d# z?qS?Zv5xNdk`yxQLspQ@!K$yl&|hf{cVi8Ty5*ekDo&W%&wg_*FKb@Op}J<=8p^+3 z?+2iQSZ=hPQMoRQJ{YNhaYM=zuXSTw-nuEQQo$;aXsL6LHaYkez+dP{BRPH|%r*%KL{oVofb(eoS{glPpmKFOsU_aZ3J!<9a zG_qor7c&muDhtCVM>OTideA7bZP>2S;@I{|L7U9x@Jy)3NRy;Y;|%-FQ|$E~1;jLs zgcP$IzP!oOxL?GtoA0Zs0HTrK;{LKmwy#FQrld}TK3LyZ&M9Ay6>ScvwyTFH_chePAGnsXzRxkARrby%!t zn1wv0?B%@hVe7J9!HOqEpM1g?C%TmB^Cd{_M+P|TE>$VPT^|vHF=d$NeGGV0MP$x* zbjBATc{O!?yE%Gq;<*OD!Fr@kLzxvzDz|1s+mhBcpEyb{jyj$l7|htwf3cX5_WcgX z4QV^KO~Ux~G;qy35&ygwai62N%YWgv1vB)f$v*|y!g)UIZhhuHSEqGLS;Q*n z%URzIv4JUFSdZ7=b(NuMK9|HYYW3;%)o<%W?!-#u_c&JS{ekXhVG&l&XVWwdi~Y0a zV-a%$87-ux^&I|>vuMXb3!~&8sI#g2t$&NOoIBJx=EkkR z0oZYcMZ52tvtQ1eVqG;)o_Ou`z5`hDdUGXi7y+_Lg|v)Vfl1ACqUa^#Q@42ke?p?i zQ>>cvX3EfoKD*VVkxm$oW-PdR#o&Dg@Fpc$XHdm;GxlBfVjcw++$wL9e*lb0S(3LD8mvrJbD;BaT9UNydBVoe zln**W%IoQ*n>f48mR-Ra+f#{YJB9CJ$WH?Dq|So2O3dLeO;G0WNxId@ z$t|$vXoIk7KxdO{N9!3UoG)WCnDJ7*j?dx|Kzid2gEVUN`SqFKPDMr1neMm2t{dMB zitWkur|i^JB@jD>>3vEbUcz1{rDykmva4M9Ijl%}ww~t8ogZf*ap)_ut9Bh6Q=N>& zXphAZxpzi5{sTBwi>595m1CV*7M?aab7ee*MZjByg(f*WjLlsav6kj01>6G&oXK8} z^F4>1uJxrzbEG_6SN$vugQWP`{=%B0_u*A##{ltC7Q~bdlcweQL4``$8%lj!)O{1A z+N3nh`x5ee0~+QhL*s?ES~(6L`it^TmN22id{=s{R^RL2Q+J+K`B)UHz8Y3|oWZ(} z4!v$wdc?Bld*F)sq3zdYm84#*GK1w{*>$MmA{6^WMd27!Ap0fST zoR*^dHV)UWUIrA^q|{4D+5Q%_mu)VqfHFc;4_F7o$Sm)VzB`Z+~bA|9l&;k4JlNib{pC6Xw)IvM^S5DtiV}2}cUq}Ys^pc$Dh`2z z+2gfdk?9`?Oi{^rVM;d=r#3}QD-71jmu{J?K(Q-+H##zS+i?Zzrd=-Z*5sE zopiSP37V{}JD@q_t#&^dQuFD7ji+Z2rg!`*APuW0s+k_wg?w%oKbLM~H%+Hc5A{l`_`=1`d5W34`?Kw6YG-q%xrtExU(V{H~`cRO75AnS$9^QR2$goGVe79!mB ziK04*-KSP<9{Qfu$@kZQa)+%Wkf+0p)&gjk?=^k5d?l9g4+E;Sd@klgE402xo=@mx zH`!^(_zQ){dZy?-NnMRsbs4MLiW3oE$v>bUeYQ3)^f#=6nRx4C3v=Fi+!fbCiOZHD zlih~NyDxQRxu=DCm6ZZcag+#@RII5KXM68cHCA>C>-a*){iST8*!!yMQ%wD>aPkId z<1|h}KcYTPr~Ss=IL9GZD61*IY3-bcTupsf>v$G8$+Ni2>k7{yuIS*tnT@bW6|q&m zBG}V_ohNhC}$?XHF)U_s{TGhUR`{iW>+Og`gb{>7_XA5~-_1b?2 zhykc?@<~&JJA?misY?v6P)EjHY8;f5r}7^M@93h~;|gj}|BA>W~hp|D@g6`E1=B z%#nyg{sd^!{Nj+NDj@fF>bZkCCEA#b9hT<}Edufy&W}-6_P3Vbb4|V8AHgZo{5dO% z^AMVcN8Hcgj@Ic+U)yR9IU|qS*)rGcuHAs2Xs|yIxjcN7ukO677KgBZKlZE0Y0h39 z`(e)GK45ySzf(&4@_XCa_W?=uX5DQX(NOH&q@D;X4%XjjuTNtI^00FD8lDp2#=R5X z@wI>xJO>Q$X|Xm7I%*V`6Twt zr?y`NX8d&w?Tdgmo;;0YoNA!$squ^q#^?MYNEG2VlvuG|&>feM#rFvbUhNTkulpf4 zRvP`)vw*C4r*PYp%Uc7r@F|1mz=NCwV)-9RtQBxn{NDIz2|A$*j8)vt`}#MF+UjbR zlJ&W$2kUEqF-qo;99XUwIo6*HHH(v>Bs4y@X;FSnoccK6>&J3qcNHEx=cVY|%lbmg z@14D?c7WM>ul9dhzFvHM1O9zy|BIq7_g^hebsjq;2Qbdv^s@`_1)IN{zN^nTIqgmT zHwTeDKY*(68T`8s6X|b4ERmDx58~An{@aiDCkB0~$Dvs$i_Ys-h?iZp<2t<48U`OU zy!cB?nMFz_RZ2A9{R_9zj{l?JMTkz5q9cZ^f2zof8ffScW|AK zTh0gI#0<_okmp7YWG#kOMUloiyTYF}z~?PbVQRu|oSUAW!)%hrBW%{iE`X|9p7k|F zK0!>c6!GVz4T~7*N-Vd336_!EmLwb1Dr2<*??K*QFYGhfMphU30l=KAc+wv$xQvpL rSz5|zr?Dwujn%Z~glJGyK;8j>w|w literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/SysGen.Make/SysGen.Make/Program.cs b/reactos/tools/sysgen/SysGen.Make/SysGen.Make/Program.cs new file mode 100644 index 00000000000..30ccf9bb40f --- /dev/null +++ b/reactos/tools/sysgen/SysGen.Make/SysGen.Make/Program.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.Make +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/reactos/tools/sysgen/SysGen.Make/SysGen.Make/Properties/AssemblyInfo.cs b/reactos/tools/sysgen/SysGen.Make/SysGen.Make/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..9012ef9b0c1 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.Make/SysGen.Make/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SysGen.Make")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sand")] +[assembly: AssemblyProduct("SysGen.Make")] +[assembly: AssemblyCopyright("Copyright © Sand 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("00432ce1-5d82-4afb-9a3a-dc2ce95edc4e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/reactos/tools/sysgen/SysGen.Make/SysGen.Make/SysGen.Make.csproj b/reactos/tools/sysgen/SysGen.Make/SysGen.Make/SysGen.Make.csproj new file mode 100644 index 00000000000..7e429ac88d9 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.Make/SysGen.Make/SysGen.Make.csproj @@ -0,0 +1,47 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {8B1229C7-6188-4621-A648-843CB9B5C72E} + Exe + Properties + SysGen.Make + SysGen.Make + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Collections/CommandCollection.cs b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Collections/CommandCollection.cs new file mode 100644 index 00000000000..28740e67d2e --- /dev/null +++ b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Collections/CommandCollection.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.IRCBot +{ + class CommandCollection : List + { + } +} diff --git a/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Commands/Base/Command.cs b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Commands/Base/Command.cs new file mode 100644 index 00000000000..5d1bc8380d4 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Commands/Base/Command.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.IRCBot +{ + public abstract class Command + { + //public abstract bool CanProcessCommand (string commandName); + public abstract string Name { get; } + + protected void Say(string message) + { + } + } +} diff --git a/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Commands/WhoIsCommand.cs b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Commands/WhoIsCommand.cs new file mode 100644 index 00000000000..7389508409b --- /dev/null +++ b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Commands/WhoIsCommand.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SysGen.RBuild.IRCBot +{ + public class WhoIsCommand : Command + { + public override string Name { get { return "whois"; } } + } +} diff --git a/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Properties/AssemblyInfo.cs b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..b41f434ce58 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SysGen.RBuild.IRCBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Sand")] +[assembly: AssemblyProduct("SysGen.RBuild.IRCBot")] +[assembly: AssemblyCopyright("Copyright © Sand 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("bb394e0e-2885-49d5-b388-80be41207d29")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/reactos/tools/sysgen/SysGen.RBuild.IRCBot/SysGen.RBuild.IRCBot.csproj b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/SysGen.RBuild.IRCBot.csproj new file mode 100644 index 00000000000..a00f422c215 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/SysGen.RBuild.IRCBot.csproj @@ -0,0 +1,64 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {0629E569-D4A3-46F5-9367-F1EB14B02500} + Exe + Properties + SysGen.RBuild.IRCBot + SysGen.RBuild.IRCBot + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\Documents and Settings\Joan Marc\Desktop\SmartIrc4net-0.4.0.src\SmartIrc4net-0.4.0-src\bin\debug\Meebey.SmartIrc4net.dll + + + + + + + + + + + + + + + {8F5F8375-4097-4952-B860-784EB9961ABE} + SysGen.Framework + + + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26} + SysGen.RBuild.Framework + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.RBuild.IRCBot/cIRC.cs b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/cIRC.cs new file mode 100644 index 00000000000..41239b32aa9 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.RBuild.IRCBot/cIRC.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Net; + +using Meebey.SmartIrc4net; + +namespace SysGen.RBuild.IRCBot +{ + class ClientDemo + { + private CommandCollection m_Commands = new CommandCollection(); + private IrcClient m_IrcClient = new IrcClient(); + private string m_Server = "chat.freenode.net"; + private int m_Port = 7000; + + private static void Main() + { + ClientDemo demo = new ClientDemo(); + } + + public ClientDemo() + { + m_Commands.Add(new WhoIsCommand()); + + m_IrcClient.OnConnected += new EventHandler(OnConnected); + m_IrcClient.OnJoin += new JoinEventHandler(irc_OnJoin); + m_IrcClient.OnChannelMessage += new IrcEventHandler(OnChannelMessage); + m_IrcClient.OnError += new ErrorEventHandler(irc_OnError); + m_IrcClient.OnRawMessage += new IrcEventHandler(irc_OnRawMessage); + + try + { + m_IrcClient.Connect(m_Server, m_Port); + } + catch (Exception e) + { + Console.Write("Failed to connect: {0}", e.Message); + Console.ReadKey(); + } + } + + private void irc_OnRawMessage(object sender, IrcEventArgs e) + { + Console.WriteLine("Received: " + e.Data.RawMessage); + } + + private void irc_OnError(object sender, ErrorEventArgs e) + { + Console.WriteLine("Error: " + e.ErrorMessage); + } + + private void OnChannelMessage(object sender, IrcEventArgs e) + { + Console.WriteLine(e.Data.Type + ":"); + Console.WriteLine("(" + e.Data.Channel + ") <" + e.Data.Nick + "> " + e.Data.Message); + + m_IrcClient.SendMessage(SendType.Message, e.Data.Nick, "test"); + } + + private void irc_OnJoin(object sender, JoinEventArgs e) + { + } + + private void OnConnected(object sender, EventArgs e) + { + m_IrcClient.Login("RBuildBot", "RBuild Info BOT"); + m_IrcClient.RfcJoin("#testchannel"); + m_IrcClient.Listen(); + } + } +} \ No newline at end of file diff --git a/reactos/tools/sysgen/SysGen.sln b/reactos/tools/sysgen/SysGen.sln new file mode 100644 index 00000000000..fdc7d1dbe82 --- /dev/null +++ b/reactos/tools/sysgen/SysGen.sln @@ -0,0 +1,66 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriStateTreeView", "TriStateTreeView\TriStateTreeView.csproj", "{99CEE41D-B76D-4102-B0AD-C81069509D17}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SysGen.Designer", "RosBuilder\SysGen.Designer.csproj", "{78A0F196-A5BD-469A-B901-B269671AFB0A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SysGen.RBuild.Framework", "RosFramework\SysGen.RBuild.Framework.csproj", "{88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SysGen.Framework", "SysGen.BuildEngine\SysGen.Framework.csproj", "{8F5F8375-4097-4952-B860-784EB9961ABE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SysGen.Make", "SysGen.Make\SysGen.Make.csproj", "{8B1229C7-6188-4621-A648-843CB9B5C72E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Main NAnt BuildFile|Any CPU = Debug Main NAnt BuildFile|Any CPU + Debug NAnt Tests|Any CPU = Debug NAnt Tests|Any CPU + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug NAnt Tests|Any CPU.Build.0 = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Release|Any CPU.Build.0 = Release|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug NAnt Tests|Any CPU.Build.0 = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Release|Any CPU.Build.0 = Release|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug NAnt Tests|Any CPU.Build.0 = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Release|Any CPU.Build.0 = Release|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug NAnt Tests|Any CPU.Build.0 = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Release|Any CPU.ActiveCfg = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Release|Any CPU.Build.0 = Debug Main NAnt BuildFile|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Debug NAnt Tests|Any CPU.Build.0 = Debug|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B1229C7-6188-4621-A648-843CB9B5C72E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/reactos/tools/sysgen/TriStateTreeView/AssemblyInfo.cs b/reactos/tools/sysgen/TriStateTreeView/AssemblyInfo.cs new file mode 100644 index 00000000000..192fff970c0 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("TriStateTreeView control")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/reactos/tools/sysgen/TriStateTreeView/LICENSING.txt b/reactos/tools/sysgen/TriStateTreeView/LICENSING.txt new file mode 100644 index 00000000000..ae57c7eda0a --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/LICENSING.txt @@ -0,0 +1,41 @@ + Copyright 1999-2004, SIL International + All rights reserved. + + This library is free software; you can redistribute it and/or modify + it under the terms of either: + + a) the Common Public License as published by the "Agreement + Steward" for that license (currently IBM); either version 0.5 + of the License, or (at your option) any later version, + + or + + b) the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2.1 of License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either + the Common Public License or the GNU Lesser General Public License + for more details. + + You should have received a plain text copy of the Common Public License + Version 0.5 with this distribution in the file named "License_CPLv05.txt". + That text came from http://www.opensource.org/licenses/cpl.html. The + initial "Agreement Steward" for the CPL displays currently the license at + http://www-124.ibm.com/developerworks/oss/license-cpl.html. + + You should also have received a copy of the GNU Lesser General Public + License along with this library in the file named "License_LGPLv21.txt". + If not, write to the Free Software Foundation, Inc., 59 Temple Place, + Suite 330, Boston, MA 02111-1307, USA or visit their web page on the + internet at http://www.fsf.org/licenses/lgpl.html. + + The GNU General Public License to which the GNU Lesser General Public + License refers can be found at http://www.gnu.org/copyleft/gpl.html. + For convenient reference, a text version has been included with this + distribution in the file named "License_GPLv2.txt". All of the licenses + mentioned above can also be found at http://www.opensource.org/licenses/. + +-------------------------------------------------------------------------- diff --git a/reactos/tools/sysgen/TriStateTreeView/License_CPLv05.txt b/reactos/tools/sysgen/TriStateTreeView/License_CPLv05.txt new file mode 100644 index 00000000000..4cac5dfe069 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/License_CPLv05.txt @@ -0,0 +1,86 @@ +Common Public License Version 0.5 +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. diff --git a/reactos/tools/sysgen/TriStateTreeView/License_GPLv2.txt b/reactos/tools/sysgen/TriStateTreeView/License_GPLv2.txt new file mode 100644 index 00000000000..1bcc46f53a6 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/License_GPLv2.txt @@ -0,0 +1,342 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + diff --git a/reactos/tools/sysgen/TriStateTreeView/License_LGPLv21.txt b/reactos/tools/sysgen/TriStateTreeView/License_LGPLv21.txt new file mode 100644 index 00000000000..807db791666 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/License_LGPLv21.txt @@ -0,0 +1,506 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + + diff --git a/reactos/tools/sysgen/TriStateTreeView/SysGen.sln b/reactos/tools/sysgen/TriStateTreeView/SysGen.sln new file mode 100644 index 00000000000..ef92c17aa73 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/SysGen.sln @@ -0,0 +1,75 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriStateTreeViewDemo", "TriStateTreeViewDemo\TriStateTreeViewDemo.csproj", "{6E9E72B6-B523-424F-B409-BA5357BB7B50}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriStateTreeView", "TriStateTreeView.csproj", "{99CEE41D-B76D-4102-B0AD-C81069509D17}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RosBuilder", "..\RosBuilder\RosBuilder.csproj", "{78A0F196-A5BD-469A-B901-B269671AFB0A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RosFramework", "..\RosFramework\RosFramework.csproj", "{88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAnt.Core", "..\NAnt.Core\NAnt.Core.csproj", "{8F5F8375-4097-4952-B860-784EB9961ABE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NAnt.Console", "..\NAnt.Console\NAnt.Console.csproj", "{859696F8-F405-4018-A155-D34561498A3E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Main NAnt BuildFile|Any CPU = Debug Main NAnt BuildFile|Any CPU + Debug NAnt Tests|Any CPU = Debug NAnt Tests|Any CPU + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6E9E72B6-B523-424F-B409-BA5357BB7B50}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug|Any CPU + {6E9E72B6-B523-424F-B409-BA5357BB7B50}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug|Any CPU + {6E9E72B6-B523-424F-B409-BA5357BB7B50}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug|Any CPU + {6E9E72B6-B523-424F-B409-BA5357BB7B50}.Debug NAnt Tests|Any CPU.Build.0 = Debug|Any CPU + {6E9E72B6-B523-424F-B409-BA5357BB7B50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E9E72B6-B523-424F-B409-BA5357BB7B50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E9E72B6-B523-424F-B409-BA5357BB7B50}.Release|Any CPU.Build.0 = Release|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug NAnt Tests|Any CPU.Build.0 = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99CEE41D-B76D-4102-B0AD-C81069509D17}.Release|Any CPU.Build.0 = Release|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug NAnt Tests|Any CPU.Build.0 = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78A0F196-A5BD-469A-B901-B269671AFB0A}.Release|Any CPU.Build.0 = Release|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug NAnt Tests|Any CPU.Build.0 = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26}.Release|Any CPU.Build.0 = Release|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug NAnt Tests|Any CPU.Build.0 = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Release|Any CPU.ActiveCfg = Debug Main NAnt BuildFile|Any CPU + {8F5F8375-4097-4952-B860-784EB9961ABE}.Release|Any CPU.Build.0 = Debug Main NAnt BuildFile|Any CPU + {859696F8-F405-4018-A155-D34561498A3E}.Debug Main NAnt BuildFile|Any CPU.ActiveCfg = Debug Main NAnt BuildFile|Any CPU + {859696F8-F405-4018-A155-D34561498A3E}.Debug Main NAnt BuildFile|Any CPU.Build.0 = Debug Main NAnt BuildFile|Any CPU + {859696F8-F405-4018-A155-D34561498A3E}.Debug NAnt Tests|Any CPU.ActiveCfg = Debug NAnt Tests|Any CPU + {859696F8-F405-4018-A155-D34561498A3E}.Debug NAnt Tests|Any CPU.Build.0 = Debug NAnt Tests|Any CPU + {859696F8-F405-4018-A155-D34561498A3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {859696F8-F405-4018-A155-D34561498A3E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {859696F8-F405-4018-A155-D34561498A3E}.Release|Any CPU.ActiveCfg = Debug NAnt Tests|Any CPU + {859696F8-F405-4018-A155-D34561498A3E}.Release|Any CPU.Build.0 = Debug NAnt Tests|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/reactos/tools/sysgen/TriStateTreeView/SysGen.suo b/reactos/tools/sysgen/TriStateTreeView/SysGen.suo new file mode 100644 index 0000000000000000000000000000000000000000..5ffb0f9a16de9a28219907d78eb77a96af96f34c GIT binary patch literal 207872 zcmeF42YemH^|oajFunIGY*T}Ud!btH1{)g}Y(Ny-lB+BWNp4ir389CcgkBOt5+H<5 z0t5(6cXw`)&Hwu`@Onn)&hD9d=FFM0&pf@spRc}k z%fD3RxP7X+RDJQ~8da-B=&LB)$^E^4RaIw&*Al+?^2;wBc{u?^S}utEwfl;fz~@RI z^}2(wsz7~r6;>D45Y`sf6sYHQgms1W1XX|42EvBIM#472#=<7T_QGbu=E4@jmcmxT z)g@D;a`UxY2{=xuZ zpfE@nEbJldB`gz02>S^83PXf3!cbwVaF8%c7$(#TqlNv2{exSRH_i2^>fDL8N}uuNPtNIIxP!!Ra!?12 zRWsx-RcnI(Vx?zh&>BpFK3f&RaPfDG74*jd;`p#OhEp#P5%=>Ja(y#(Y4 zGKIe9(lJ2cX#b}lB2$n7#EJI*TG57D`f&Nk2jYy9KiY=r|Hy%{LQ?-nE+7N$7wF#y z3G`KD0q>&! zK$!lIkIX|35T^g*BNOnK%Ri>qgHt{o_4&}BT)x4b+r4r4?IIQB-Wx^>S-FmOI$+oy zb(0p(YFjeBrD4LtmbQkLx&vyP+G>U^Y-(ND*bw`preSGA&CG>Ov*yy$t5(~qX;EV% zjY3UCubH^8wQgo(!}O-QmWJsw+w|AM8S{G1?K@~d-Q1>`jf?6V>Y7{Y=hx}Cxr^z` z^b6YL0`=c|N#RD-BJymp{8shj*^)7B3fC*v0SYe&YI*D63Hlsvm`15OwW5Wp{WeMO z>5>5r8eta7=h+thI$8hDRh%~aKK^!&_s}lPdyG__t>58Rt&wqVkg8U_Wt_q@^~*w~ zZK2xe0{t>U@n%X2PFGqRG`2O1$6Wo|q&Vpg`KPAT?$TqMU)8j$_Ep=)4Hv%|Dzn)E z=N65_l+{d)eUx3cs}_G`&Q=16$bQ1;Ij>W3a=HA6s$?3JhWRRkg(?Ha#I$tmEdHPA zJ?jd-{Qsl4e?`E_XUKsC)W=FaOnSe0f1@tCqxK^joBSH>$PJ!WOBu z(gLcbMb+u|VfvR=(VHUMV#X!X9x8vvpUnlzfOlrOX#R<7t0MMTIkeb|GX6jo$)Wl% zk$h&A-MdKL{PN3AovS*%vfPc1Rk!?M`6`d;ZzHuk(}Ik%&sTRkMpL#v8t6ty_3Nj9 zduysVGzj-qsJH$bE`_nDV)0w8LcR1~E&A&?we&`nts7gBa*HH^T@5hHWXwW~?5BT^ z(F}8hW|pw(BPIg^R{a%*RX_Rtln~hW6N|w?s8%!6zQRCJN!Cz>ducXSqpUBnW4hyO z#$U&ERdKDYIM<14N$4rV)vjhLx9B9atZ17@`#^t5(*=5|{h?bI)BiS9d{={M{M}q^ zc%TzZ*HihfriA{tkzV6k7IF@W>hfs%*(~LHwy5Y&?w5StP}KiBslf*GBH#YEvEuKs z7EfbGn4#J4xIl8}_VI%P3xYp)h~T|gYh<8GxK<@QQsp{0kdes1p|(aS zcZBdz`Mnf_P@kYS2B;Pg&?9Ya`P4|~_8O@q*Gkk#CDT)GjSNza3|Dy%RWBK?Qtqh{ zsh4_9e}(#~><0zoSFJ+Bg8CYuI_RUgj8)X!py2NTUVWrXdyQ0*Yb9!=lIa<)k-NuQ zpVxll><35R`tnUrZ*=|C^~P2`bI<$J&ggdch@1EL-ONk>yA+d`Y)9)pzGdTQYjhuf z-j}C;{PaWDVQ3Qdt&Mkh_9xxDkGkWHzZ|#Ij0FfYxk*)nW^Me?7Y}Va_PX!Y|M-$^ z-yK}&tp`?DRSnSyj`e`~eAIft3^ueLpkFe=*C@7`*)#GD6OcHq!5pwbx=8LQ6eOtN zKbrp+J^n=XPp4y{2RAD%q!?>QXyqu#I`{$m!&=e`(N}%PKh_S`U)8*Kipm78(>20j zp>gRkT6ZC>-#p8|*k7^36{G(|^FLaeMt#7$NqKHmYDOwGjJK46AAiQ?^=umCWx6PT zGmlgOmeq=)v(Y_DXpPi4^J&t-T;IPn_mEs-1!KN6SZrqVRc2ThQ0{xHt@AIgE?DVk zRp}a=7%iQ)HtlJ&H`YWc%DZ_Lt$((Y@wUn_zoLX_3WGR!C?*(f2b&|YjDSc!EpCmnul?Z;RiRt65`kU6#qF)Ht ztDQ9JiN$)3oYqK6_mW)iBVbGPdC&Mj_ia=wYzi=2&pG?za8W`FBc+t@O6mVI^qR9S zHSfx;y^wo8uO!OWCCHz?deP4IWp16vt^Z7t<u@90I!370 zn6eI23ov7HZ_(YPwXfC+oK(W%yC`TK=4sY8CI9qCsq%+*#9JHm-vP=wa)%LsmStq1 zu>-r_@OYmw6S|2XJr$YDyqLKZ;*_~K^E&c|J&2w~+OSVV*Nw1$Fz;p_*kt<;^RVdH zm2LSZ#n>(B$;r0yXbhMB=U#c^Q`Ur|W#c%ZgJB;s?`y7l!KT05 z{@+`D7tN$cQ2Gl39!+^NX`*VMF?_CmZ_uxEHG4#!VXg9$17jqEYNY+qv#H)UH^6cm3qGOYRs-zADwv zH`2Q{7LwM7NjFZrFNTgCQ>$2oMq4A9qpM*j6%jXVy-wn}UY#vJT)(etAA!*>jD~RR z=)rx^zuX#($qPNy=os@Qp9+o9H?M^Bo3%irAEdQE#>p(_+FwwCK^1-$S4-2Mu2O7Ln>;}2Vw|p4>K2K{e9o=x z6kAgJc3_%|O$#F;<<~zbeQJQZ>#2XKH&=hX16r+W2fI;EX&cOL`UmwztzsAK>sf28 zxgcAO>~eTMXUW%M^bcpBW4*sIXgN-@L}&b299;?DWz%2&{H3@0ct6cTqN%8{ z`-_URRhT_V?%CWGLYMN9ZP&g$QnkTAR*9KtDJ`K|ytfy+3EhPr0y66^;{;@eB;X8W%nq-^6hA}FTq|6N1-BuIKjawyATx*$k?jdhea=ESL z-P8`sxX=X`u*X;5yFwebRq1SWAtvM z?Nq(5uB!6wj~>!-_M^$_XY5$2QR>l^=Gp#ZMp!eBVWUE~K&wK_!N!2jgwDfm16Ha+ z+jL!E(KJ058#Fr%v2jKzwCJj;j~@FLX2hU9<2#4MrHyYaAZc;bF*NKV)H80O01c^o zlz=-=fL1MBAmHv6pfTRxE8t!hpkcpwMZkR_K*N1$ysGU*fW`>W-Tqi(Y3LHYENy>F zLne*0v<6E<($BWE<1LMREVr~PEsghGZD|i$8am4_E$wkj6RGM6OZ&B@Z6Ml{miDTp zp=bX|VRW27TN?R&%f@@h(nP9y*V5jTPus?lTdxvkr(ATE!bS@$JLJ_^cBZP&nO;z? zEMmSjJ2K0n)j0XL{@|KZ>F=cBtEwSTzMBf03GCsco(t)n)%tCFp`*2pP*$Z|1(^HZ z(msC1_mQy*$9i+Ud``45vodvsB-l?agImIOIt z6?wMMr2OSljQsk~XaD_!sxN4d_|8%1odj3!&=0jV+5}?>Zn;3b^@WoJ-1h`%$i8a? z+^qsM+SKg=?p^^J)|&?f+?xV4`rtbPGT}c0G|*T7^pM|AK7SLhj{@|i@s%esE3=R+hy8IIMGD`a^@PSOMOl+ZB$vj2 zu!)lTFZ>y&nSGfWNsS)-c$@zHzKxc~pY`}GSIYj&rF!Xiz4-UeVjt{3K`*DD`sV)_ z#XVBMrRSeHX}V+oOE*Q?N$};5Y@-Zt>HM=>ApFr+`U$@LPg2~al1sRB{{2m)lz-vB zy?%!`E+uOFPiH9fk{5q+mF~p9owqOl>3U_0eJy&jS*d6DE4yX(6bPBN|K*p+;bz5W zR>7&HT*vQbykln25c`>tZK34+JdKH=rQBH^L)*BK{qg7X-@8ie-R2K$8KGX8u0@zR zN}Q`ZInx}BKjYJ;xux8FL>vFzgGdm6kD&+Y5Z)7l*FL2(qXLnxit~j7jjps;mR0VdhQKZcXBGMRqS)6zt!#2VwJdX z%b|~z&cm%YIbLa;_AJ2Z#Nnea+)%#-!Yhzp&Whw`lRmtN^yluqGwTmwe;g-S;m*&x zIo!+DuWy1)CQM&^PfqL1=9)P*K4pxn!TiM!NSJ+ zrs)eBdM;>PJhP>(roLfTZt@b2EbHj;&_#0_>vej0Ld(MDhL*Ou4Xt$(8(J4GYMI&4 znvkSui7k-DDLh|Ht-6(gkjh+>_Q(krtSz|`Gv4!EE!^~vi!NSGPlmNXW{}Y3uD=+G zR2yjGbCe$D0a%Qfoi(WMm>m}5TW(!@^&I|YG^ot_Q=z?|SAO&L&&g$&@93T~%5kRJ zEGaeCt@w)Gf}o6NYjngah~s2)rPd40+h>&B|FF$5+RRpJv6!hFAUNraG*DH>=NzL0@6tB)Z?Q#5w=1 zU;Lpp-pY^#xt!d4jAUq*y}tDE)3v*BC)cZIU$9}ktpD_w(gn zAbeZ6Nw`S3Shz&ERJcsIT=MXz4Cu5+#~!2=C{pZ46Xm@+pOvuLhdIS*c;DKR5mv@eZXq5QLVJVn!1 zyF$}8JdjhyT0L9xD_&Mk2Cf|0vyMu_jDY#_Nk6qq#>%$qp~EIkxTEEYrtUu*KlJuB z?wK_8-eV?wAoXq3&`HB4x7SU%@*ztWxLKW>m9n>}u+A7gf7hZ>e_qvncW!ves_*@( z6D`X*cGhe)V2C zVc|aFx++{~<)piQ^RXW|t;<<$T}jp`*U{COd|sZ%GUNMNlj6pa!l!$qbKTr_jb0HyE8}8Nqd01H zWwdy7g=os6>8aIkW>j8zt&Dxj(ez>SiMGaQdPl9$^k&a}HpxqS;b)@x=%{f!egD%S zr8eEM|B0Ov*rc#7rpGqF9xSifMoi~V>rZ#3?0>pYuWadT-kZjsy`Wi+{9|o(*43=| z{CDYzlrFB{pW6u=lW7{Gt#s{DC=uXTp zLVI(-Ea4w^oNRqYFI{S1oZkMKi>JF% z_)pa7(BSO1%&GkTNk8Bw?6Grr?bE7R5Y{UR>2qIFuxe!|TY zVVMe`Vw`R#sW$rV;9$5Izd)oUHin&#?sw)3J3bQ*2` zrob+WjN;UVb9;I1UBYtG8ra*+`;4SBvy}4QVAA1t*QH6ttb|o5lalh^Vp22Ot4!LI z4zst)*fjZ@-BWI*lrlygsNCC3>Nwq!z1u81by+d$l@~Mmn0yq&_bJ_CO_kT2d$xnBm4W;1rJ5E-4@Z~II1nbsjmlHRMu(L1R zm+IoV5_;j|o4&nedx`j^KQ6zynLNJJGEQ-vrajV}Q}+3*3V!=Xv+_^dV67lGuXpUV z>mWvsu=aEBFLC`wkpjnQHdb$=x0j@~gG!wrFVueu&rY3v&hOsAwD(N5@-TO&&D1%U zjKoeH?MIBztj^HKDB0D8H3UY|wFImxjGV0eU?*V7WdmVDVIyHIiBR(RNHM}u=X51* zGYQvGDU)M@+qwL1uS|39^5tVLLC!Zw|~ zbI5P}$&&x-lHI^u^78)SZf?3QGpt zE-U$b*#{lXr~kGFqYPhkGdj9S#dM7p&A}+le14hU<-U_;WbUMZ>SQcqV^!4~Er%ft z)u&l9?<{l?_`1%j!fHZSVI5%&f&HUv$zR)s*OkAXu)eT?u%SR4aI=bb3;n&Bu(_ol zZT+p~?`Xr@$*;EIZr1N1e+L`pT>}-~McCESc9Y-JhB=$gT^hvWOgcX2)bR&ce~|U} zu>M}w-^cnxtUuKH!>vEk`lGGCpZxu8n7cX-u;CNsA0|w+e^0jlLGq{CFlXaQ)1mS? zA5Rz@VZ+nq&#>Wo>(7$U{U5}eD}SC1H_BgN!wcm%+i;8gRvTU%)UE&z^2+G}JQ$+;;?c;jmy3?vW?Ja zxzK32`d=2(s-U;X3tAR5+%yGvA1wr`$!v?fWeSM*9$W59F)&zD<_cdAUTg!s^5;n4Mo=A(KwbZuv zmKD=lqWc7L)05wmR(#oDm+&u9MGnTY()(T7`V$t3EXVp6($&rTvf}gmTf!4G0J(Jj zUh99I&^D#s1}=DM#y{`s_fu?~bpGTl-Ld|LJ*OD{A1FR|?%~q;`>j7>OF}~=4ZJhU zEmnl3Hc~qOj#+>F%$q;CN_VtBQn{JnoBuBq_cy55a_RYJo|EoMS%0Ngxz`bw#-BUY zvmE&+-^@~c^Z$tAp4t9l_a)}tG?B20s_LmQ^NQUqjd@`&2y*=`jqm`4ArH1R=5~8P zkgK;e!VL;To^5H}6`o_mXUI1xH!BCxuhVDmD5b?O3D!xCB|S@L!a_q#r)S^irK=^` z|BZF2rR3+$TESAU=d>DWVPQJw&^O_|`dy8{;-=4V*;uxi<61Ozw-YHw?mRVL79KZDOKdDu?6(Cl{j5Tm( zFdyaSEMqNpF-!|Ir{j;dCGM<%Sm{|&<1R_ogQ7PGn7LC=y{)gL{s6_uwd-RItPl33 zn&;SC&?>uMv&wdkz}$X@-pPLxEa&u`nsnvbKa*}w((T9>J}?=pHhmh$UK^L!E6?eA z4RXNz!f$@}PbBll7S9@Ni~Mp=Ye+WLAKGj4SlaZ5hr`;2+ytlT9|o2)BD5b`+O3wx z@4r--6{3eD@t#%~8_hG8#wdYx5%-Fv5&omXl;K}2jVK@LALhPaT3Qc<|H=0h1D63|q9^FLp4n=SvUs;3n48-=pu-L&84 z)y+7`PIu>8{7EOXJ4=rEt+SNDd&D|w3Oq|^=LKn|*MUy<%Yi!Eq8jf3a%CXtu z!y6YE0k@bR(rC+n|CRMYp}`p>J+obycUE5)z>C|Po7;aR8HS%r0bh|A?rJ!>yEw|5zva&O`1Ty!n>DUC>yA&e+f@72yhmn} z<0M(1_1$oHCehi-*!s zjHah{g{CJy_PARAdWjuS*QS`B)?d>96Zf99Uxw#e#Qv9Z@tfySd zD0j!ji$DMU8ISZjdE^a`F0A?4q37<{qydSM)py0duw*OrOMHaw_N}`&>GJQ69AQVO zp31vnKWV2!@Y3KP_EshBrzo6%BXisvlHQIjDc8~Fum}0;J4xfs#K=sw@LbH)5gges zT}h5j8a>;BSy*HH+%x1>oIaP7KV$>8*5s41Z9P)UdoN z#Uc6rZSug{Zh3hyR_fxvDo}n~h_-dC3!D_A1qS2A_?O{GE+ct(t zw{Ui_kOyl4<>m}Ik@RinP_jmA)hG96m$ZEz#Kw-Aa_X&z^Xu9;>SE7hh+?Gb3{Pyfb@suSI==5r&h(W(Ina zc=&w>Ab-Zq*@JZbv5+2tJvX$hV%v@0$s7HG0IjXE@@ItlC+qm`Zc}$NZYBCmn5XIMr`)zxXnbO|vs`Hx)?961J6ag5IJj0B z_Db3#T6uZ=l4=L35bYJwQca3)N;-ev;fmM`X=a>h>!1BR*I${57PJ1lsmvQ^=^0!a zfA)i9xl;CDy{?zK_0M$vNUe0|)}LulzU!~MEC0*wYt#AD|I!`&M=MG(<=EDYH2KkZj^Lm;+j_;{x&mAI7fSnlY1`S-tX`7-%Vn9 zZML^lu(S_n#f_ zC54jG?@HCk9JfcvoWCc{#(M3_)KT11E+1*_uU`lCzlAEL#R4v!zhC>`OYh+qWLv#*Yw|GqkXf1@^- znTGeW#Cg<64`v)_sapM+JHOcBpTFuU?H4hL_Xd;`)Qr8gjLTFE0ONGpD(k(dI}mUVb)&B&%Xo)qT%>XB@HyemI>bP+6m) zVQooHe}2v6=49p%_vlI6HSgrDX0LSi{Y9IcfATL`^)gTT-CvYcuP#N*3u({!wxhp{ zxcISn&cim(O)uvDC2Sz|>g7?Ll@kEwE-PcnoDtYdT&+6Y@Awbbz7>7HRp<207nExB zRMIz|mE8hvbIm{KTkJJ4wNoHsgv?z8?$31n3#&l7D`o!oYrV40zBZjd_Uv@W{Hs<` zunhU;|F4SMWM7-k-)sMGdmHxU|A}~?;>F)@|MPIYi<=yL`TtpQefake?sQP(6i4}w z((mxbr9^H2=^JXWr`f;K%D;bbvakKI!~p!q=$G+=FaN>f-(ugE&fl;71sS*hBqlP4 zxTp9xTiOxw-Sd16(DxRdm)2Ng_J(@a*|u}-eDN>_65yoq;uAtg!6vGSb)mJxOwSk!P)9~8UC0zKz6I_he!b`%$%f5V^BW}VuNBW6XT zNwh}spcdROt~B;jx=JZ;!_U19K3IX1?#n|@s?=$KulkK(+bge?vi^j9$=J1w?Z@nz zT%?*TWc_(aX_#eOkXxNvthy=o3%0WZ{lR?Ac7a-@*#Y4~w4bV~9}DiBTPe~a-C8$Y znxOfrIlXGCdZ_u9c(@XGl=zn}t)i`WvU<)U7GVT#OIQ?vrNciGHF+%3`7?JM+7(~j=|td=CE-7g9xTeZrBkp!)J zVO6!tgR>vQ^l$EdjY*nC?k_shJgi?%eKzZFv%brnX?K+@=jr?L+ft);?p^ina>o#C z@@A(5b294JlqQz5Cv3VqYNxB`KKD)x=gF&?pD5-))tc;^hj3O zO@1~~Sv^zn{Fs>JCQ2XNMpNx{2aDWV^jKGzOwrLcARK5@9IczoBQ{an$j(S`I0!^{*1M?O*7fF+rU^4^BW_x?jnn)$JKC+-v5$qRpr_OjAeI# zP7SPxxpP`gy4-zNxpSknYrkn{z-Op7jE&ZeLyOcpvGX$~<%Z!Qr_rw?BxfPp&8olN z=MDBAg}OP3$akgNj$AK@OC?vL2lcq}fVhsG&l^hl{70%TIK^aka5(;-%%Af))7`B6 z`+a{dO^P^$6Gxjb@l;|LE`c{lQLHpAQr$t1xASLnG9deb(Rm z2e--=ehtcx9L(-7rTC_F~|eb&DR_^p4p=iRsb z#|E;*q|U8;a_-;U3l*-IJpSgYcWz+wRp{N#719*qs~u^&!s8cj{p&6nsVY?R`Sg`{ z^VzI}y8S-Bww#~3Y)ZNF&h+-*FEau3ze$Q!O#kce-T%DyKeY2M)JAhNaiI7gX^H9i z_u7BcX^P&({W8A%CyBq${__ET=WmM6{}l1R(B|K7|6bDgVfNU$8BOskx{Uwv6VXy~ z-nsw%_=yjj%z~cZ+$|~nPXA!0VrD|_jQFxV4gHV1*S+a>xW#LEdCBrGe;!UsLTxC% zKO{f4(;K#YvD=PV$BXHKVR5Fle|Gg|IraZ`&he5d{3KtkX|zA5@gLwh{$sb8CiwC{ zMEuY3;6KoB{4YBH-NoN$|Jgvl^EaIiwt4r>|B>QfXB*iOUFmoAaM8H!o{g_oMYC7B{*y0}NP{b5cIk6IJ3p37*T~cF`=E5W`1{^{>+s8Im9L)oxlJ2JKpEZzd`(c=3fIn@4r4wyxl%po2^ujFSI%No1T9!{j*)N z_~w6pB>$!Nf7dSQ^|`y%xLLO;*pb&FODK1#%x;$qt{q>rY<+WQxfP75MON^~j_H4C zHxnPz<lj_$bqC)$2lt12Wzell&!&&unIrR$&h`d4&cB|9Orb|mll-{GS-vh`MMxx4bO z)Jk2v{70$G7X~X4QCUG-*?X1U?k}&zUCNDb@{PX34oLI;^0cpax|n7Z;mgORo_}yT zGvik{@8({oCP~IZryxGs?9KYP{#EMvSKd;o`irK&80|5>(}^de->;6>RnlM8CCvYS zAoDGDWn7y4ALOZj(uQW~UA}$j63M^Y0`6J-{q(QddKc>nzWgs2|LeT?d!2vmG*|DM zQw0C-iT|aRKW8z)$)e$(Dxa^|5aug3-xSWYf1hRjbF6=!{PTqigl}6~@6H6UuXRrtp9!aKM-yb_=?WW!jFU>3qKKV5pET36Mib( zF8oZmL%35Q4|mJIN4QtGPq<(Bx$q0&0pUU6A>o$-U*ma1cvSe6@R;zpz_$v2E%3f4 ztBl@IU+ar`G=*U+AlP3O)s-{+_#2BVGQ* zcfYd3!R@4Cd^mCAnm6LBm}`qVT)Xmy>ZHi1sy#Iim?*2jFi~)B*GFmgW4@G`H2;{O z_m9q-aU4JA;w$1~S3_0l_S^jNABtJk&(&YtFX1zMC)Mmue75nb-^J}S#f*Qq+wpJ3 zeXEVx9Q*e;>B4=c<~I81*`I;I`JX~(e`c!I`))icSb$JNY!AMdG|JnyMrZ))ovVbw*T_fi7%7upIph_HsrPLZ_)+RQq_y25$_J2=oZ zHWcETcAZx2#%R~>3+?@9yh2m74|Rn0V)d3x+)uhmtzwMRzlJhalwta7tYn^{Os?2@ zpuVy-4bpv2#qMdk!lu7?`I&E-MUp0eX~W#a%YHWcetw+%ce&p4$lDkGD=yvQ-`_lM zg`~fj6n9hbwynon`1eAfxXI>+}CWZ&y*?X~`1 z^!;a7Nu2xGf9MZcu9Wr1YsKGZ{e6(%`g_s&zh3;+ngW+z{(knad3qD?GozDvZ`!{% zivK<|ak5K&ZX>nV-8SNon_x9c=(*EIVa-PclEv@-g+%KK{N z>}25-VYqObaJq1Y@SuRL@>>FH7H12rou4aULp@)(K=`(Bp>UBv-@Zg(j(M4Ix$qr< zU9#-Azd{(KsvIl~7p~RcHwxDY*9$iY-xqEYejxl%xLNp-@MGa80`vDb-P zCfq69A>1Y0E!-pAC)_LCFZ^8ih48ZQfbgjBknl_4Vc`+sN#R$*W5VOY6T+{BKL~3m zy-&%1T6jkIt?;byobbHxJK+W4Md20U_rj~fpM*aPe-z#nUKjo%{8e~O_^0rZ@P_a= z;Vt3s!u!HMgntPi3U3SV2=58?O3OEde=Gd4aIC^R3;$L41L1$dC&H(~=fY>g7lKsS zs!od6MQ}UvIdMLt{V%gi{)xBeenU~)wQs^Wv?@IsXj_}gN7LHe(g<%YK;OpF)|Ou_ z(1W%Ycor>gTY>o91oyrH3iGbLERA@33tI@oERAR83%HX6p4~_|S-@Q^K-)l|9pY$P z&^8gS7jU#GXd4Q&EgWqK8hN}!z|j_@)<|6tJ1#ux$|JS!^6Q>=XpyfxQCvs-=++Yz?@7MQGR&aNJbD z{2jT+tj@@AbToFPo9}Y>lT^q*IYWy%k%6G}N5(Mu^Pcb4GFv$u8>F>)2F<G$WGV4F~4bzuBP|-JybI zhZ87nY*|HlyV*;FHQFM#TDXyqT`Ucn3(VEOOM;P~9mIuWILm$V*_f>NyA*d(iv8x? zeslixo8pap?uc_2KK-tb?BBJjtN3YFMzp7FomJ)}O`p8)ZxnNzhO>2Xe}(xTgE`B| zsm>aulNlpl%xKii8V#pO`KeWVM%K7mWyH9pLV4<~**iBUclJ7-nb$tJi=0JK3JNHlsyUcE#V~ z%5+VQ5)Z6|9H6~4E3MV?XX)Q?%wq>Lvm$gBRtCoCw}r~tqF}5}&c&+Ag`26kk;P|D zR3B+;OCH;Z#4oVj7!v{5+hULg+XQ_F&Ol+R<|GI-?MSQ$^^ z>zY|R^U3GnGSZMQP23H8b-|kaIBAgaI2}>G$@(;T8&^i&lFK)Lb%|1EuHB|y+oy>2 zGSXLD@$|VimY@23N>~@&%ScD`Yz285UBA~0@|Kg~-jU--5Ax{kU<&L~z?woGXs;}XU9kW{* z@2-`;g0&Ydu~B1R+!D##vGSLi^88*-ExGns5_KKzpZVo6yh2>!EsAl;?Amm) zHT%vk@?4H|cX`Wi-~8fkMR2jgI_#Kv6|%U{c?WV@&TPQtft)f{ntM^3l*>kY>w>#s z-PJ>w+x}(LccJk!UowXL%9(jZ^I52UxwR(O&RP@XO2@RS!uRP=zvYZHh4Vc@5+QdF zcE|M_Ru_{`OvAHh87(QALn9gTb(fBtvyG2vo@S*!DkB#K{V8n0L(0f!zJBg{B=e8( zYhvhx?w9Zxx1XKT-ldFG3vsEl&WZ;eR${CPOk1H^rj+A}%?He#$`>=|I+N&XZ0Zw^yjj=mAL zS!eBzQ$j9vWt2<&o#ejw+3tAFmE7t^-1eDeiKg9@qwitAnW=hmbKdB8J<5Iegy6k% z3eH3-C99L}>L%^w%rjlzp*~Bwa|Zt9NU?1GS-M=Mq)GA`Wx4sw@AH(j%e9Z?`tX(9 zXUkg$qx{Ng|BPVlpEF;#%fHjH-1obhFnrq7labzWD^aCd7(7^+b38-2T+Y0}y^VH- z&d8U_7=uFlo{JIkD`&KEZ-XDU7st!dE6-(eFs`zHK6f_}wO@{IX1=p+Z2O%2b2o+Z z-krkO1{aq;P^=@N_>wp`drco5tTkkzlZrNXC!l@1>BpI(luNv>qcR1JCHYP)S~+K^O0|;}=3nSeC^(i=v-vCNlyKZ0 zWLDnuV}>=mYZ-YyNIi(#o;Y!e1Pf2dkhdviyg6M;hZ<;H7L)%_g6EIZg?Av5-f~)B zdU~_(G=qORcG5!QhijEay0<0HJIk?RrsvzQo}#@qeydizcEdJXsd;Rab9l1Dm08HI zW7d|UdSX7$@n!U$WNkk#8Ib$*mr`%2pv9K656q3VX3i0obvYwVRxb#-3@M{@OGtb^* zX%9r=J!omqTiRxd_d84bYlQZirM+)y@F0JD_t){iV!G8B27v2BwQU)JIgv+J# z=UijD-T^wS#z+>Zp} z(bs+~;O-Ehk?%VN++zYXWDEDp;Ql8-BQ2i@IPMT}@wOl!#~mUBDZgq;I(OQZY-SlSp%gU5cBc333d;g+`0(%{={X(wA6b##iQ z{m9aSIjkfbIOWVrI(x9DM`MSHMQC7VyZJ4FeUKm?&j3E>U<$SQE zF@`{+z0a{U#t>+f)ly4i41q>I&agDb5NOrHm6paB0*$=gYH5ri?%8`SjWNWPbK}@CqWQ{PJ(lPudge?ED3>}KF*mYjCxLHAZ&e)YS^NR!I+bQa3PJ+}PHzlp@%e;M6GAZL&R$PC&e z?UFuAd#7*E7ii~M?V$AgBVA3K**3~bp2CE*j z`d_R3V%qRa;(wYK|2{ta+j(d8b@#GAi2ns%{QJ2_3i_p#|5oCErhOwjAF}TXO_G0U z?JvGt(ZzKA?)obZd$nA-;|gSDe>Z)<``+5ToV=8Fv)5#eK%AwRsb70 zP$TRv^b*1z&1%~WtKV2k=^Y+`Mub*Dm%bM!YyM3;N_WWL1&VT%;4A+QSJP~>uT7Kx=AP4Z{-xNzn9KOcfB5%K zXRnssxf6QBBEdKRZ;HQ<{D*(m2mt@Z;=Qa0{(l$$^AsQVZkN-3SdRQUw&d|6zkktw z%NjJH(&A!8d>Q*vGjY13a!#accbL*b*ZYFbm~_3qGgtzX6ntkj}R7?_Ke~(7rE=|G)x#9U1=cJ*Ei$+|hfE zC;vf?Q31b{@;^!Zv4P>x9~fKN$r2que0OwKRV}_}?N(+;rL|}C4U`xDwZ<;-J~1Jf zXPdob;f-j~`L`MAN^k#eq$Jm@+?kWjnq;=efQMK-tmjgE?iCTDXsUHb0cH4|0bRF zs;XLW(pEFE+oYwf^xM|XT6pjuC_!701OvxB2O1V4<~xL$>)>N$B8+41MV2-_=ec3@>jFr)#a~Y!)sZe_26}FczyZU_IYk2 z`5W8trq)n?KhYEE9YZt6p93dPjOc!PdGlhDgL6{}X7Ul?Z z1=h;v3ys18p-Eu9gLRIhgchMyXcHC*i-je^Qel~Jv~Y}YtZv@%Y|_NkF&pG z;a;Hs*hf89qhj=1UlXM%u)}+;}pj|FSHgj6X}1V)RLh z*C+9-sNJ1mBWCgMi1|lX@ptpzEdD<8j}vX)ee=Jj_}6>p-$VcJbduh6s!fA^ZK}uq z9#{VCVh_K1gD#w_`Ez4R7=zmq!aZ$Q9(36e8(Yr4xsNA}TS7{+KPR6W)T+z)>(1NI zJ53$a|J`hXeZ{RRVJ9n`1@YU1FI%VdIa9O*OHaQ~|L^0Ye|I|ByR=Qp*Ne2j^#0c; za|co>`Zs$J&a#D=#otH%ouYT~KHna&iTJm9^6v=wx0(36`G0=@cWu?QkNEGd{qFJ9 zH$P=eCdW9NnG!rV|1JL3>ZJ5J3r6;hE?R?lc+`#MkHJTlEWZlb51s6AW&Kv|#+Mc@ zYrk)yB(2{S;$P^7EbSQ@eeUmbQ}RKX^N&#f>?c_>K=yR%wd3^90`ayR2cx%Th${@2$>|LXKDrJeqqU%MhEIQDy9Z0TA2J?y{1 z`pY?bpD+J^s}Wr2$=^f&Yj4@U{I?hXBR%z3+OCNdfl{&60$z(T#5-)LuE0nEORnzAebMpwcWYov#nNha zkh(tRZaOpjN8`Kc!ryk)Q>E{JGW|G9{`%@a7bq>h@@HEW4e@bV{5|xa;Cu%5JYW7h zN&flD|Blc<2a5k`LGH8i&zvaTVShbWQ5a8s^S_7qJNu`R|LnyvYwg)LGi&W;>4!V8 z2O563^c1H5TDtw(jYH_4x%PLrY7gC=EoN@#o^f;Q8_wVSwD{PSp4$9hi~Zgb;|Kc# z!kv0a={Kj@+oa2KLn`0K%}x0ymy9^5yp)@~r1!sm8l%%4?T(lk`|-a>ysxwT z7wAi3;r$k&?a7Tq&dOkBtUGJxZu~5Kx%*GvteE}itEK-jX489}q?vc_A#d-k>Z90I z{T+7Jq|lsmJMpX*wimhyXh%JSq`4=0MWJ2Uj7P`>`ei?X{()x2IE}8rcv(zabn}m} z4VJt6%2*?21-60wm6zu~zWv&+ku;uU+h6haHz$#e{EnvIjXqddvv1|n*TwU8zxm(l z=#nIL8 z>dM1JuRNHR81@JBF4~W|D|lp}|8PHxsV(GHxoep5H7auI`exE>-Em$f&R2NlC~5U1 z`SeA6_j~=01!f<4 z(l>Clk5Bwwwz)6=+%z_VKI(H(sqSvrs#kuO1o?DwmpoG{je5dZV0($uU%hsq-ZD_7 z<^LWxI`Lf(?)`MNixsU>GKCq?AZeOkRhfd_{m&Jv%N2hI8#lJjSFJY(Erqd~zEKyf z!1Ik_Zgr*2%uzn~>$>j?^4cw+gmD`P%xkKJU2K^70JMz-<^-&5?I}QG9d1Jb$DGK_ zo6W3&8S&KM3`Wwuarx^B?*0T{DKbOSh#gsV`ge|edIAz+sd9>RK;LT78Y6oFmgpC> zXm-F7r&aV3N?VO$AU9^7dJUq(rk@?N`R7wzA2~?#5#Gp3DKSl7Y1X^V{x{$Bo4)J5 z3(gICbsEpf5h>^9OM)Rzf z#xYy5*EKNUG^;Vc?`&t?r@d*mEwtb?dq0J6d z822qp+eYE@EzRAI!|$BJXpzs3cz&iwbi*_t$1ZaFNYz0Kb2fUarNQr;3NtF7X=y~%VRoD2-mtW>3cqD(|Fg7xMf=3kR#67wi)C>&g?Y#7mNs4CRVe_u%`J`a z77Fhs-`$SGn#VRa-mZ~&->~uA4QzWU9=GS<2HALX72d@P3vy&eDd8Hr~=2 zENwHfD7FHji%Y^)-`HNs`~S#Hj8WpJOud+N9QEscEs)W&-< zLVMcM{$Xi~R`pMX$I1VfrNQHE8}EOSc%LX-t=~SgG% zmPVWXv5ohONW2FWrmh~eH26Mb<2@dU_k_ZO@)W+x3?nk{$}HS7@>V+X{*Vc>H1Mug&Xzk>XrtNH5A5e7l~J`F!|Zu(y;1w zv+?>w;`LQ{l78!FY1Hp%g|YgMu{6T{6~;}mG{Ofd%(GK1jb|4qO#CKGqpYSWj62%W z2p^*`WqQ1&@$AJ4Gxl9-Y1G>Z3gd3JG}_gVEbUH9Ikdpi>E9fiB=w|6a# zyuD}Rak(+|i`E=mAS}O+r72j|myRPhz|t7A2U}XBrIDuvmbTc^NXydIPn0-4NjO>H zoZG3^KVAMAHjI|RZ)aKm9P6KF{R^yrq4h7e{-xHxT>f`#_6PQ5$|t{^K_MYx%#i;iu$3ZNtB{{&Vu57k($aAiOA`iIK0D<^REk|7iU` z$^Wwr691EzbJoED1-5Z|OUv-P@ABT5j||XZ3Nj zA7*QuaAZcze9Bngj5R5o`Lt?Y%(@OUIX4qCmL)9i`4nSiqB}oaAxlAMY0b6PMDINJ zweXl{rs&%jHQKSn+67;{XHJ}a!xS^7($8&;(ddiCo)e_Z1zlbLTjjIjZ)0J`v9eZ+ zYNZeKQ~u+tMIS3gZY9mNOZGU^8fjg*?Xu(SqOT|=EBk(W*E;^Lv^3h@lWwCmWtOz# zGc9A3#zNagZPr;7i*F_DS1`K(<6m!cJtOHmHqs`PuhMmcaF0Q>cV>S- z$K05`vLyFlN$#O}lKTRcgp(NQrJuFx?r%qCm2g<%9SUnJHGaDelKM=1mj|satSNTr zxLXqAZ6Y2o|I1ayePL2_SG8wWuuD53?)o{Y;A1j~Y zO8Q8p$FD7=jU&u9YSmI^YJJMw?aJ*7i$n=mST`4^7b;e#E9T^F?#T_lTghD#j5^^L z_hczh-d4W;i_Z0Xp;G(1Ly2kjC#HWbQ&vau{-9ztykdH7(rzo(j*B^4eY*1Pr;80-23x09|#)OQvM~aSy$-QoBaD zSFhg+*j3@I2sN?>#G4xi_AoH?AxVafCF);dvV3 zmr7Bk_J+kJ%3PJCxyi>!Ro4?-S==ek%S&#N?rmsN6U8UGD-Er~?5J@2p51&Q|E|oF zm5S2sdG0Ji^1i#}dUxqF)cjGMyt;h5Gk5v1T=|ZQaQBrcrCV;;H_{y0!M3Gzywbj8 zNUQO^tJGO=qb)CMPvSZ%m+b}oZbH;4(ZR~bkvB9AdAk0jv3I;T^!XE8ZoF)L(GTBr zM)&RBxM}=-L9Pg^v-#r9lA%@bV zlq}ZYbCh;$#x- zE$T?+|GhSoe*UaqaIPns%iJ*M&%Q0<^@5hM7~nG97V1Xs{(&t1teB@c@oztGE>HOIjo9@W}Ws1VA#h3q1;(v~PZ5Dr4>C;>(`9DScFO0o(xm^=JMAQ=%#$8}( zgukt@77ME`w=|+WqJKCk_N1j@-}nwc$h~K2!xVns(l%Se$eD4XZLTnG2TR*m;TsmT?6rTGV?n<*3H-5n4PxLGDEV*qghdu#td$I6>ahRj@^Myx09WK;&m~r!_P*X)~ zW#*e@UwBv?kFC%+AD<79CURxkOyM;h_IbJ9mu@XLH5zK2%o>wUl#%aN@tv)ji_R=} z5U0src{QAp)()qrC6FUpM0o!xy~x=SeDaX=X2X;7BHX%e^hl=_(NmwXDeoBDtr%E` zq;bxLeRW2(b03|taQQ~1&p5Rp_K!zp&Xy8_$TNI)!D0<@j?}soJDT$kP@oW3zC9nd zsyJ6S*JRxwy1(5>U-x#nCh2_9)Sy%Qy6AH*>{|z8#l)u$;?g5a|LB{Mbo8Ig73T`U zSN}Pktl8{k@$Z+-Ki~^*Tt@WZ=d;E8cpEW`KUzqdBmY+_!qtK=|8vEEkZ1ncEt%%v z|2;(rGVhuH3&r~Y%YTa^pUq8+8xzx|U%bubk67;a+*#o%r`a!6a7Uo{QtvtQ`5Ad1)w3iGe zl-oX%{^s;bv;859zeoS?bdBD1o#4y=TjJm5$=_rC)#)m|>)ImtpDq4aS#VkT_mICu zm;bqu{2QAd7FFyTN$vmnhkiPPnMHE@uT1|RA^up%a$EmiXa4!twANpa#+-kio1I9^ zdXnwSgZKQ?{Crtd`aVcEt8!eOym{>U^SY+zIcPZcA9te8%u;^)-P_OS2P@p$BT|3R zx(mz@acEFqewo$&JjS2)mf_p~&R6^M?f)L*Z`F5|lOF}S@smH_7XM=vAD5N?fhJnP ze;I#W&+yIvMdDv?-KR|lLF2|BBHvfz z#-`0^m~N?$b2Q(TF?RTFdfqwO?Eh{3x^Vf9w&jb@Ja0vnZ;dNl`Cp~-Jx}Q=e*R+0 zH@@=;8%T7wS{RPb_u{MU@qKJg7SB@w(FgD^kndYZcPQ?ps)L15vP7^3l$%15_a%w(jzJubZdVD7Le_hBeDw8o9D3 zEU|bGj>j9XdYxxmH2PrpRroX+U{b%C>bLa$on|fFNQGTg4y+eArx$-^MqliBJ~f|I zLvcy(YJIBSxUqnLlHe=bhbV5gev`{HT90P+Mz0Cn$}Q#Ik{-xvY#((x6TD(>@bcT= zyP=BaJzMMLTE7QQ`?|~{Y89oQ^l_3H`7$loTg!;DNRo+FA}E}OWc-{VpZgx& z6Ruy35dYF|#Vj;BJ1(I-WQ8UvwoAtYN=N1QJI2?6o$jpr7@ z{%)~W)$0t6IN@njYJEwd3z(aM!Z0UV(GjApfn7_?n4{|~iy7m)TT|j_Vy!A=qmvP$zO^QQ;_`P$S#AoM?LxyU!-;$xJ4lDNMX6mPYHECgAD>;_WCLCg2(cXspwka%ES_&9*drYMzzx%4$K;xsT5Y zuuqhJw?E&tzpVPpYH@Q_mxb>PtWjz4yUySX_pOA|qQslks$yxqB1CU)(N7+CFFEXQ|v~tHjAEj-oV*Pft$g&7MnKXV~ln?j`DYr%vHG>>9U&Y(n;dt`))jE z;RtQYH5@TqJXfASQ*PV{HeB^QQ{xePpx9Z{s~>P7wfMoe>I`2{hPZ6M7C-fHv2m^&d z!eC(!foJ!!J~yQC_YnED!cbwDFkBcRaB~_rri~WH2>S{93uA?G!U4i~VS;d=Fj1H! zOctgHe3)aZFikjEI7EP7o&3Xu!|mTk%Aan-Gv(I{4Fb2c%@(+!ZLYwx^W`@R3xp+frefaI|oYaIA2gaJ+DWuv{>Ao48TWohxu!%Ql_DGwa2- z?@*Gs{zD&U4|sHU7Aq|0dG*@Lo|+C*7oD3s*|w@uHQFmxQ9G~udNy|q^KE`meYe`PB&-uVN7;T=*02syTH^JazW&Ia(CLo# z$D0)8hl0eE*Zz;owBp5jB`%A9KNGFszwrNoe!Wxh<^Nsrzk_O#%i`~`{$2F?@3rE; zrYC=&_3s}mALJbuWGdsI?~DJ@HqMej|MEEl#>^ws@P|vn&DHEHD#>rwJDHK=7t>Q` zDL$i1`igNHfA@8X_z9guHQPlC<@Wj3;EdNeadPgf)GzN-qT>D1zh2ViZa8Mdr7K!E zGMQ4qw&24(d;B$L4c68BcrVCxj?QQ^PcVF)Rttw>?_YDbU!&u)J3G7&+ff)v)GBRq z@M)!tBQAw5RU&0N_e^fYD4pE-y6AH*>|272aXvMdv?^leGTd&wz$TSFv7}%#;RH)N z&C>YubO9R^eVcgO2xkeniv*YYixnmw>zmLv6gVG+yHarRu2PtI*I3#n@~;bWw`?Y?&{C~Y>KI}2)-R4}*SW4~io$=S@%#xvmcUe)k*>2=}ZmPUH9)!~q* zF5WRVOc_E$ds!~vC>s~=5*wy$pwTM7E8r*x7w-leW}Jn_o?XUU+$}XTMm=N|4dK*&L(T4=Xs^%pBvr%_MZ<7 zzO$CcG(sqa|1|M`*uKNrztd-Tg=Zzvxf3IF?#>LS#ou+ztvA!xsUw`rg0ml$%0G!` zu6@uqjh~NuJhN3v34r$?ya+Cx{~(|FM|+#{<^Ln`XSW$Hi+^7et>C}p zpKFsY&a9ev`p+^X`fAq7kR3bkX2;QOge~SGri@(SGznwQ}D8MpCzFYiH^5pM3 z{@<$i`SL$T{m(c5KJxb=@%~j2{C}bRH{1OCm6(m3;FYq1X!h*7c9}a`GcOI#f4W#s zkJ$9;Cm*g>I*Ms;3CV6Jol(*ZwD7l&7D#5W4i>>%ulOsSrf&+ zUF&yA z^_~CSW7D5q;=0>V^2g~P>HG)#=zpE=64U#O;Qz4rGY`jQ@%NDb?e*p>|9>U^*BSPi z{5{6MPQTE*ups*Ke?t5(u>7;X_Z;16;j><|@6Xpds>P-zJ4MHrEI*u_$R9u4Y^hH7 ztFYH`k)({Hxu@KCa`AZ=y^mxqbv)?^{Vl!&JU7MHUvb#0rAiB1=@Boh{r8W=O$ti? zYcIR(+BR=^Qti)A|KYZmbcgBRbVI4+Co=hb%Av%?!H+|SV!PCX}?YV=*jA_(-c|m)$=^}vF7yy~5ZH-$m43TY z*hS%8g*}Dcgq}i;u)Dz58Tl$>AAzqj_7nOG0|dUp$k!S75%v&92zv>83r7q43PXfi zVW==n;46(Ig;By7VYINHFjm-K7$=MuxI1BjFi|*Am?TUQCJP4%hX_-JX~Mz6p~4YD zop6|NxNxK}SC}r$5M~Mu!ct+DFk6@-%oCc0`9h{Kdi& zVVR{tXU_4G%JVq+$6NY|@+&ic_PKHB)e|pa(@J}5RZ#9dEB~|hDR537UzrWYcL(ZXBtMEJYW-lfa%oVm0SXp4TW?Nx?rIc>@4ge z>?W{hrAF9YK(gQz%yDl2ZDs98+4ood`KIot=eMSu#CiPbw_mWZ{U)j%aeouvQRehr zd<=Km#&xguIjpNvWlEFs>0Jc%U3!U)LA%=MSUQgBNPnkbfJ` z-mC0(e_ZPL*?+V6PY(ET2Z~FTE5ELbPk)WwWTC`}SBhKzE>-@f^*`F5$Naa`14`1P zHjVMrCI9t?+8;ASTo(U6CR)LN>3^#g< z>AS_!*zZW*(C(Oj@+|WyXq3rl0mr<`l>zfB%7FQnqcPVa%-jl}y+6#caLl7@FqlvA z?BEEEc@@7i$HL!SU|xk|o@9f;T#09yFF6`>Cc?~<@X=P8FX5OI* zrk^T|+f+Tt2CFtxm}j?$(70EV-?z0sZLPb)w5uI0jq=-0Vcc$(M!2U953)XK9&F&f!{e;aY-FOs@My3!+VcSlJb7QRsot-ElgrCo1n^y#w{#@%OWg!!&8JXl+E<@|sRKVp5J<=etI zz6b2$p%3#cda0xR$%bFIK6!gXVI1G}b@BeEFwgRRUq}1QhCAs8Xw|}M3X`|3ERC|? zhOp3C=pw8ltSS(oN|BE^)yr2C2g|Wgo;Q(R0FhMv_m?%sVCJR%9 zgM_KVG~r-@_Z=#~PB=_BTsT5FQkX8x5M~PXLW3|%m@Ui^<_au!@s398H_2ZpGz&)w zEkdi%CM*&b3rmEh0?!>S{}|y|;W$e>!TPib>cF*=?g~SrJfYEMX&*T91`S6ZA(KZ( zBd>(XAAYq!zIY$`frcC<@3^xpjquqDLq0b`JI{tMvVJ%Held~cu8hRH%7%YnePq`I z3d8qT5!x%3_9si@eK#qL`=_N5{+Gg#--*!Pwc-C*pZ@qih2gP^rUc}TvRX}HXzN-U zY2ln4G|s{i57logg>jsNgGO4aZ9LArK|{~s+#Anw-VGZ4_CxW-ao!6Wd^z_;_!R3) z1O#DuRi{Scoo2)5MB)*~ooi`?&$Ho+tdH!!*v9)|B;L)Iwz?9jruHSz7UPbtithkV z+rOKAt})!vYtH*~LV@*obH_UOY>lm&Q8hjIPj~+G9}`SNN=diNqnp3_=)c9Je`cTy zw*@oNM(My=Di4C>N)CY4yEQHYyRP}{!{e)YaJ!{9GihG{sW^KO$clL*FHD) zEra#NAKe?5&Y$n3r90-IPb$h&f-nD##NXHc<6-~m^tgEcrU?FpiCJ__dxb z)&9@2g_NHE-d_7p;Qh2sgMDqPhu-b_Ul#w4SpTh6`CnjDnACrr4L7&#UGmcCPUtRS zS=XsQm%9JUynW@}2D0(rPrj=Bp41Wjf1-30ckfYd9Xx*V*1uNsiPS-AQ}g(-*2bA9 zAI)MlVWFT#67*7NBZT<^?ic|Yn*4GBcc0*B4+fN~s<$l-YrqGV#!5Qzb`V%i$Fb^7 za4&&XZ`^5?29IxA+I5z;p=dW++EJZL-~Z@J7W+T<5+r>ce8RG$ZdynD!WOSTVlH?8 zXx9Bh**akE9a!#ehH%$tqteO^1I^NGkC1-LT7l~8^ONr+X|`zEQ%M_#wv#~bCA_xv zJ7>s$z7m`6(0`s#6ckfRDLuCNwYwT{vyGS~{|02d5dH62#VK4v`7hW({D(7?%VqKR z(0|)``{sY3_+yLp;qRgUcKWSe^t|B9e=qT`Zf_>E1sv_%wUc#in7#%LSwI-qQ-DUv z94c`B=x_lVv(sJz&dCYl{Xihz&4P<}yuvuNSNFd66(-()ERFa5M!;>VNG={0XX4db z8u7N^M>%%V5QOhJ3J{N-J-f=eGKP`=TShk3VRSO=x?;RV@SzCyAiH&!8Bp#L*+#fBCc-$_- z`;L_F-uGu4??y`_-itQg%aM3DDUADXB;F31)$_ic<-7NNV&jdlG~Rcnjdyk=-e`q! zcSPcSYU6zoiFdb+x041QSI)B(hVNWUqg-}nV3IpO67M-1?}bRb3vIkDB>3F>E>oEI zeb>@>-_{D_UW>%rS^|=I+sSwNebdG}*wV=Fi8kITk$80qk-(hJRrFHRV$^{O)LbDopdF3EU)Pm#@3)vNHCYQpRq|ZoletZ8|I{i=)i#^y{QG#>-{|GenKDcNcVF@M)xUi9zda{*#qb{^{zL32 znw5X2O%=)!`u7X^@t-ygh2ll&heY_B_V#~Oe!6?=Hh!+=YI2y{cii}}lYU#>{vOVK z%shzazSe!e)_rLQU+carTK8SK`h&Bb^muCTME&b)`SJDK8M*NF-1)0LcfLw>rPeC#ge;b1WEG($$s{2}q#1;CkYy$jnard!6B12T5lgHsqPG64)J{xvz3=?a?|1Hc?z!h~DeT{? zJf&~FSOWhai2sqsUpqS$A~Uef;8QS!aq9`dp+CFLW+THvM;ON_1v*vv9d09y)WDHeR&e1s)!T8{TyYl|4jw-@+*)Sm1otJgbABg= zn{T+s3`bo4WVoGW#PYc8i9t*5EyF?gzTx(ik^p7D8{{H|u|XbZIG$f@ zbib9cGi|Nqy@^>&we&uJNOT;sMPKvPM8blhsV!R$(<3yqEfz9Eu{0O^2k}- zMS|tgtK^%19~sR?a)$!zzc_2g=PG?y(D*U;9Ypa{b~yGm_>3{<$1$5(=>0jp*Buky zzectEXaVa)kCnejaH8ON!3hHJz)2Qno#v?m)@ian^M`^T3C<9lDPXN8Yc!d$__5#| z0kan83CAoz)Z^_xExTqyXN;3C1rf}acEcd7i#EX?mK6<$Rx<7)Zc)Vf&Ld9C0& z!S#Y)3ZVOy`8UeH$-+0wzeRAX;5NbSf;$9v3hom8MsT;_9>KkW`viOoc+kR3y7T)H z`M(o9DtJurxZwAKKL~jKr2Icx_$m2+vhXwVS%1oG&9jDkUj7S$7X>c~UKa3;SLDBH z;n(H=P4IX7{f2zjrLrCs+JDJ^+rq3(eb2)0%l|;|q5b|y{(l7@+wV{1W3F`lrQG#j zzW%ZB`{~wSwRek(*ZLP`F4;a=>y?J6g`(TEm<(TFa-C<)$$|FO{@W;gywRN(qdVW| ze3d`q8x3Vg`41W${n{l8<2F<7xn%gN!k~K^Zf}Kqk-KuV3h4F{&@ynB8xDDW z#(#*v)Q->mKYZP_LzX}vrxG~TFva)}OT3x;qa6O@R9%*&;yxocR`7WN zc@VIL|FZ7B&a?+=dMSCA|I5p)PNO3s;c!ST>i#|gR@CFT`6a}XTPHbRasP^P*N<_N zVYs(6d9t}nix;O~eIRTLr_R@(`TSq8^*gK{_ZykG)reife&V?QVxMF3WV0ki7_VLZ zodrK6Ph5@=#`O?@LucI5!n>P~oFR;xCx8we`EUVlvB1A~QiKUL9US`mnTGq9d~h2I z{%yD)3E}Uap#XWut~zk+j$&sWj$LpB;d`6mI8oVx75ga6yPPr%4t4efh4D`@T&2R3 z6~^6VIKr%#;9Yh}@h+8=ol@{;mlQa3S|2^GCSvEiy28BM&2YTa9faIK!}U;ju;Hc{ zZcE{&84gW_?-AFZDasV>q@$1E8Kb+waP;}NDNG%{GlttjW18)S8zrB2p}R!k9`Y|U9DJAR9o!9uQ}wF2 zO<}bB+YLvaE>#%UO$!eA9`dX^ix1?g49EBS8}2m2@x4nGCNHiq9Bt+-qkB3=_rAiL z>)9tUx@V1Uf(GdD<$LoK=6mxE$GV846()+;8jf^MR2X-o;mE&R4EJZlF~)ttaGx5E z`nM_*WOC!=!xtWhDh%Hi!x3&(nDopu9Pf@-7MU}FkdZcD=vzj}p9-XSsEY{NAgjy!!#VaC&s z8xGq?Pla*M8IHKTWZ}P=Prf{#h2xz!gu}flKlF9scmBWStRK$Y!czJTj351aP%mOa z&XLl>`p=-{GXH*wq~j$-LarG9fq|^uzvw^D>FHku#dAA+=2jK^e2QMK82`b6tlhux ze?d=Q5v1k6Sm|%DFBap!L%W>A1Ng)D~UKa8F_cJVIO@#)R9u21z&wKYvMS`VMvTtA_yxwXEzc4AY@$a%9G>J%K) z)I4WERdapIe7?8lHyYyeXw5r<1FFh=NKoy;yUU}-^g$OaUIh& z-1x24eo9BspPx7Vx!m*90{{Fsg~O@++dmIgDNsxB7YcR~xT6MH1#?uJf3iZ1b_?J3 z_h@aHhLswozPmYl~Tk^JnF* zw(*KrxnrZ`IjvsX-qjb;mhev(q%E=IL|eSXvU%n!nQ$^aErc`DX36KqyzEk{SDDqT z@EOx#hwJ}YH)wBk~3S$S>EJ%`HeIOJsR?Zz!__1w!Bd5uFyBu*c_RNzniJr9#Fg#CB?b;rZw zNI~b9rk_BZvCp}5&n-zbGt_4MEd^;yazD|QR+7ce)f^bzwA^2#-*_K{Oh&R+Nv?9^ zPfzW$AE;mb1w-_gdn1Rcr_BFOc$XWU=c`ssk}N=i$IqQ#U&V3Aawvld`eyFU9yci0 zI_n(gmQOLjKJQu+$~pcKt5yn8l?H&0Xn6*r@qIo?{J3KxG0V@)#|5er&_%%(cJ2X z#7C+p&&Etwcldht-BRcVyXkx3&VpG=Ta`{A#P>bt-2Irj7xxUMy`1qDdFS@ZeEJ%a zkvk@_2fCDWnfyi79zt(2^w2Ge#LRhyA1dni>rt<+eCIzC-E_R3DzuZFyDAk~9p;N+FL>IeEu zMpWsmU_D0H#qz;rU&l^<$zC~-*+Jc?_=X)ySBY!+_m!Z@OjqjWMmZGj!lh(<-aYrZ zr*=jc=07JGjLOM>bc%F0pU`v6Qq7<)2MsRtB>M@=nhfM(VG7O$r&p+rR&O*bJfN)} ztkQ)!Gf=a;gL87`Y{jUv?xaZS0vY|!^*+aB%g4ovL$+qnxvj(Zl+RV$o~u1bzK^Px z3gpx-k`x0ZCx%6JBPlB?6{nlq;=~E?`$`&(wiDp@kOgmqM)-T_Z#Waa&?)hQq^VHq zov+P~P>HohEdj|xOYzn}O{F=-;-B41Oi;UEBph_Pe6##XiH=N8Vw}r?9pV!7^q@OwDEc@#$!k`UAT8=-x1Xs#5uFD8I2S{CXdR*;-Q5=ssZpugeTyt5sWP z9E_AeI@cVU!I`i}0g0#&T(Q zh4`mimm6YNT()F%AI|xw2b)uL+~&E#y0NZXCC9wF=SAAG==?Lbe2>+$icR?z1ebD1 zL#zcslW0^;Xs8G?W1Q+m%RtAc@A5J@DNh*`8WA!RI!#;#>3emmfwZUA$T~bH>epsQ zb&ydxyD5kPt+Ai}wy360kEpTj*Q?EiJJ{~&B#k&TpAh68acGoHDYS;pvloxmxUfpO ziY9ePTRw8?LuX0xOsmVx=+L*OnWfJp|y^5MT}6SkOxVj_1rzGm7jd0LSV~?C9VI3Bd6^baB4vIKDSn06k>~ z-FAYV1-wgJ@pqZkh1V{I1u@*QhFcWFvAzVlAI5O!8SeZT?lQw&ZaDIk z`B?JdSB4{BmI}zb8x2QX?i9e|E`g`x0mD5Q!#!rW$78rZ8}2VL+-rt=J%)S7aPP)& zFoW+Z^5ILI(Sg4~*l@&oU4<#*FBwi=bc!K)`gOyRjvfm0y)9$7zJ}v29{rEjb+FPE zH&6&~qqE!kwre+9Z{m7-8a3aj1sCpFg0;n^tZRtzwFntp?plq{%F3JZN^!aJ(bE?! zg05>FuP>61_{jFOYcGxxEjeCzU0XI!dYSC?Ysry#DeI%+D`coOpOsQ-R9wm}CGQh+ zZ3xUP&4~2b%*rA!MdWX#0Dnh8+EUy{w8cv?6DL+2RLdeaaN!I=`fioVYuUt z+3`apEf_6SiHcQn!O@F^w!%yj7Kb`f>=)Sw#z%3>UiFVH!dGJ1NAh^_n&9De^JtvI z+xQpmKl0hRa%WX&wV9DpQnKYzXS8Z`pmHTfvh5Lr^s6P%=(p|wZS;~(9s+&#M$Q& zylmY%-=r#+PNp=#yKk>qk+J~_@xIwT7`v0t)^Fsz=>q_?V*(u*|=PRox2 zw%^0VBgtXZ=y7AIIT;JaB<(a9uXePz)}_{%xTF_50Ml*?{ML$IUM(R1gchK#tNx85hN_Ui6 zNvj~9DpE#FhPAbq6%ms#*Xs4l>w4FeEo0>N%3qHnJ+Y54Jdm6`dqugt%vGJAO zyQkZ&iOl>7F+E4f+Y>9u^Do0&7LF z`ZrWGg&g&tl6^x&Y3tv^V*acN;KKabOIFxX|Gj3V<^P2E-)WyM#(zLz_EG!)hiE(w zMaZMaoR)N_5fUU=zWn0_HI`6EIhSg>MVN*96RSRSJ3twiIk7z$%6Xu(trc zAG^yof^7xNnPGkJCt#Gx+#7X)@*q#>iw6sk&&WvXDg7lHb}40XRoU{du$3ue^Gfdg zPg)YgSay|3%TjdvaWM$@;iCaIV1`K;bhN*6`)|Hho zjjD6}i|=33Nkx~ne5^uf({TyosJ}ET+75LX$7l;2?FP#(Zjt~T_4xn+?iv9&+Q}~j zIOaTywdrfy@~^y|5yj*W?W~Y<`Jbtgg{Z@`=OlmTlUTW8{AuHb9Q@xB!P|mjdF9{v ztN0&nKZ@~Bp?^jF-#aDne@*;9NXZ|WR>+mp|8W}MJ@!%Gt(VbXlB2nf@ALNa8(aoF zJN){asrgiZxF+&>=!tS`dAgkqrRcA2WzOFNq&wBHP>o4G^F0f}Hp5zc&fZ}5DtB$p zG~vUFdj9%phxx;lwzPq@C(y}9WgX}1k`hgT9v?>!PMzo>pclvOCjf_3++Toe7J#F^ zoMQfu42PC-xBz#y06N@{gI95m{G^m{`C0m0S7-G9_ zH+3>fI$n&)6|F`&~v*U`TAAPrwgFk%T6{7WL{}KNu?1!)0 z_x4|GoxAVfnJ#UR74B$+=!7kio*4fX_FNy-{khX&MN8aRK&vH;j)c$n!5z;@hyPCF zr`wy-p5-~YE2Z$dSMR^hzI6ODQc+5dx1W-UroVaqr}FN8PZdyi`9bX zu44GqCjFdyFT*jWg8+S$F&5=OPkfjFag79Z9Cjjb-;LqEZ@8lj$9EaS;T{w4F7EN* zwcXEbKNH@aT`>NloH-SxQvMA6&8!Y6M;>qgql5lgzC8Awrd`wj)D)FJDfIugmXNmX zej@qvu+@TM@-L14|8ITkKZ3OUS6w}={gqvhg`Laak4oUby7>RzK3gpPI}~P*{i)>q z=j=z?DUO*+PW+gjbt+GBJ!JYO3;KLPU+9<|TrvAc-<>fts>r!DDufU3prk|`ED#LtW{`Ep$-0g?vky_mp(dmcS`bYKfk7&lL<2Eim&-fYOzWC*J$lH z>e%_2+3}AmbqRl5|0yhg)9DY)d}Qxi-1b+)AI0|5UMneo{OI#6fMZSg54e})#xOXT0XqFGHcCAW3ue|a56fKeQ-82>cmkBDyx{MQx#boQU2 zX~rLId6_o->x=(!A^Anp&pCR99r=$jlD!CN`EMxx7mL0#T=}~pbH~rSt0&@A!CLKf z385s7*WqpZZS`K#id=q59_yg}G}nF>MiFzQTQ0wSjr*u~Xz%RA@4r{^6rCLf{CTsl z#bPq_;N=W~%;{O2Mqg=7{ zr?7vNoc?c%|HFZOG@l=4@;N1Mmf8U)bg*-gbzq$Ek1n)L{Y~fd0#eZ((gO(uj=mX5 zghT3pqmM@N;7A2H`f_wX+z5fcTODD7-Ubf0j{sc(y$c-r0s0rZ8#)*`-fI=$776^_ z;}oXPTWmP=$dd%PB?6~ATVd$VGaPzmlu-E>8BSis#RBLq6Ywr{mkV&$3jBN5DGc4O z4EGKBO9i<51WtFq!qENJa7gJ#1h}^aPWO(&(7kWCN%B7s;JzXvr`t>c=)Pt+^jc1s zz@2P3!lxMB4-Ho>9QQurK8VqMXmlSNj=W!8iUfMt8uEDsTu+73_4Y8_?h1d(L%CxO zM|hFK#P7ry-C~7tH^%6GZFIL8Zj_$iZs8Zqhwn{UIKK0;aPWA|o>AtnD~$V!9uTc@ z0`Bg`ecf;)6|OWK_x3^uuD9W~Gu#N_`WkM4;YcrcOX7wau3F(84aap@mK_zlDh#^X zaC<2{8iZV(;Rx3&40@*F4p4X&2)RXuBg`$fpieLy?Sh-daNITQe7TJq^p6cUSz&JC z#@%E%!oOA+^lgSC4{iq`cemjP-=i>Sb}_(XxPV)-aolk2e7Oe}G^_oMH9LfW^9~zGEj}+$JGYz-D!e<%XPh)f! z8r?;Ps}wSO{C$P_-VY3i3}0+?j~Nb4;c>&gYB-@PUQ?KN|7JL3;yXt7mIjDv zdu_gz>$-OSd~aC`d|x&@E~ZJZVGd|PikZ8O4t(*LZb}g8$K|Fi4W``nd%k|8u>P@Q z8v9>c3eu+HU{z&$Qd}|q{R3IMf6>3zQnlxV;I#awiU0G~REqJZXD;N#zvT2IwP=~R zV*CdNvUdN%e@&%@Gp5p}{}}P#(D<|BlQWQOrTvB7{^2y*uzG9VUmSrN7ReQCHMHYO z0WXt*n+V+XQ~+Gu_12HVvD(MRPaR+X6xN{zeRbic7e#7Uc6^Y3;IJ=w%|b^7M_d^t z=&h6O+^{B}&qVh*&;xWNjcNF3J z$VWDlMEXwrRV^$p>NCMXhaHnJ`i;{O#`P0`qh3uEd_h2e4-WgK*TDsbgYIGhbe9?q zx`hJV!vg=_n+iksFT+9ir~t=lbWXRE0?>WaaL^$waFY!O-^E797=g#o9Y{d#3d2E1 zz2JMx3+!v(jL!8s(y_qk z7RvYZj#C(Sj^UtNW^_--=*~B~wbej89b*-S?>NK3cU^^Xvtx7@8r{V)x<;e>eT=S~ z8XVtSTfWEdNu%4waK!HbqpOY4^;He$I4$MI8Jc9-~_>mg2jT9 z1dPB=5ikNfO>nw^*1?GD3;`{Kk=7Ey*@7Pn&Jmm|I8OkN3*`Sq@IL}ZV~oOnCSVlC z=?#4HFh*a$5L_#`PH?^8mjXs(@K`FJQ5dc7*Mge`w+L<( z+$OkPaEIVd!Civi2<{f}?!EHw6WnjV8Ld5J;fLivBKV!)QNukh|M!AF*zYIh|530^ z@RZ1l<{67o+B6!wt&&z*7@S@-)!OMcb3K$I{Or5es{ja;aRz|#OH3&v+m)S_KSo((+ zVybd3M67vNqJ_`9!0n9R*5yz3{E z%@z@K%yBmnkh|7!(A{Xb^%XIK;J!j6<(gx-!wq+540o^LHc-a+yPKOva9#{|k>R?l z$Apf!d`V#(vzY#Fo#C)dISy+SZWFWB62C3XF8kdW?)!$jCx&~-aNC&;mi!xFHrS&K z$M=pi++Sk27Y)}}h6s;Ke}!@LVz?s=_n_h6@v!06G+QV*?6SCFhJ){L!(CuF)_+}O zxPQlR|25p6X7_~dTV~_DIEK5@aI2Y}61whYlbU8Y_|_ZlJi`&c^A*Ofbb;X%thmMK zhJ3M@R+K$|UhMn}&Ya{d@Y$LzZPfa>T7@_b(|@yijuoU~p6S^aYi1K4$|3G{)DLjX z6YXpdAOzP-&}6tP3|A@t8pCZMB7b*d0&-i)PpkcfH~jAvsn)ONJHIHoH!r!bH|_r4 z-2KmmPQLl=-1UJU6^l z)BDB7AH#}#itz{cTz$EO8u(j9pYa;5F#lnx)}O4WZ*5cp|Hs7tt-!u0e|ow?uAK4T z6XHKAW%>seVy{YzMXFimT_ z{QNUtKb2WObGTM2(@w*!t(rr*YB=3kP9D@4j`SWRm?}6phMS=Ie={&&THQ_FvLc~nN{`OecSz**8cDz!h1bAYS$cY>aBKF|!|o3&1` zrec)#-iAFQ$y;3KN;?U%|Ng5N{*xS2h9n$y9o%jL>O3)~-h-pQQ`cz|-bW}H?I9rt zdI+FHH{MdPqkujE96oZN_qP{-WB5eR4Q_zIaoZ}4qgH`KK=Xa*u=IjsOtF*s-!vSp zpjyD5mQjZLmVD9zZcoF(7a2+$o?y5J`I7|w1p6Bfx&s9CPm>MDclHw?FTQO!@`661 zQs8|A?@kdQFQy8JGjw%=Nz|nVu;rpBS42h#`wFn z3S);m&~UUrWCnG@Wd`kMR{?ICz~eGq;U0oI!%^Q_1n4rYG2C&6JKk`_YlZ;lZJh88 z0=}_S0FPA#w+e{UT>{5Zf5F{nIC;@pYH(h6dG}EPxF-bu?lTH+C-}4BXdh1th6?^- zIAqncf*l0U3wW12ctNm};3WY#zWuU*y!xxadAz1D&)$gP-ZI=fhU0rT32+|>co#=u zlLsFOz)`-R3VH}YfTJCM%x^h%kAlOoi3V;J;2->a4~wP0e$vn(JHU^UXEC(KxT6VVCgv zddW+4OYSj`pJM0Zm-uNAV=_!*W}(an#3Djw&& z&QX7pp{F&6G1Oe)gIss2prafd?U3Q**bJU_oWX~?Gv?|2^sZUyIke)|8^3(^8gJdd zin71WjjXPzMo;E`>2QPMLhb!)RDV;cK5IfWuBTt;&Wa)WJ3z35q~Ji|)QFW+*isuJ zoqAMsH{!n1S9exEOw@O(qqB8H7Rib@UvM~Z06IdWp!A#1u!V%v2(g#vo>Q3r=ImhQ zq(}Rv0N<*LLcw{=(%cf=pjSAXq42Hjeo7+yL-NNeY3=5AkZ?;hdW+wL!bl|Ui0A*k z8>2HdBc4{mUM|#_W5xsCy!ENl`WW9+ z3^jMjGsieXV+<^M@$;VecJe7Qh+5%J8Jt%Jfp^!D8pt=&*1*F=Tdqt<%3rr?`j{(I zx=A{h3)M<4Jqi9i`DyECt!Qgxsj0D251PjGs5}}ah3GFbyyM~Qc!XMmW`X3Ymj**g zEfl!>ES1#hiq!Hhsd#%y-r1NuF*;uv&Q$!;mf^{wEw2pYF^sq9?D%Cg24?=Tp*BWZ z1ezqZgul~;#~L4WNqLc55oPYY^82;Qn{cmr`jfvi+EVt()71JfLpDO~jFl3ur?=$v z)lVuyCtEEWCCce~1D%`|7A+N(`Vx6psraF3k*~CNTK*oQ=4p_P&3dy|77@PS*6i#z zIKyy`WNWR?Rp*{vH05DxyPPsSw@rJvT`}_Wv^th6*&_+hv9`J_PG_cSVf#edCFlJG zxxw#x{bT-yu@m|=`e*wT)J}RJ%8DA8(S_+rKGtaOXjQ{w1jh>4Iewhrc)lv8oFH_D;7t3?2y&(SeB?m($&qMp%lk|{=F4_ZRr~X;JIZcL z%q>hw^|f@T_$M_oZ?RZok1l~r=KfFmd{&v!D==1Uk`{*)tBzVU601patynAecrdy- zDpfoR%&@uOubL)bh*@?_ECz( z4OW*{oE|_eN1vD{e`XYS;uF6IcBt%XJE%^!e-G?Ain-4pmR@JPP35-5+;c#k*7NLn zaXz+$_Ln>Jmfa%JDnh+sbt^Ocw8UCrxrqkJ735U2>gjaZJbe{9voT$z#SMt;nAut! zV}m!_>Qi~Q;<~mtNGq(ctM*h|%FIz#X$(&O)v47VuH34UmK)Yb5H9Vc;`YBokASA< z_oo(;AIx9*O19E#;@CDVJ$qymmfTW0;s3w2+|0!;j~k#e7K!?ta(r3k*g3iz>%|yNa~DlUcl(9DKfdhN zkYD@WLEr4EHa}47J$B4#^L-SfBg;;ux2@3kd(Rs*w)S;Zf6Lqb9K~Tw*>S*Pk~#aH z8IVKlTi&{h$@qNdi3h8Am>rv^x{?1p>21Z$cixmPF_UAJ{4()Oak#4Nyvfy8DXB2O zi)O?Ki5?#;{d0{{iuP2mXINrkw!-^AvB!f!X?JruSfl7k3SFMwK6|>Z)FHu=L{oIlbgh z6r;|UY1#Svp12&E)pr%T2c!7dBx9eNu6)nf?ZP_KN5rrE-pgZ8ts1RbdWbkU&P(#= z;xHjqjmf9cd&|Sp#rhQg>ZSUs?-wb(*QIvHXFikTl+2hVE(ek}p!}oDI~1$K%1*22 zT>duNq`YM|iPl0t;?$lar;4}Bq|$T5zm|{pZsN#HOD@lEi6^@&c2fD5&og6ZqtEyB zuwu%sm}zBf@z#*tH@j`fPt|o>5GNaVmTr+rAN7p+y!Kc9umagfG=+1tkbKQ>^!DSq zdYZo9S$4jpuJ4@M>p564(b0Z+gvtad6J~m_46_z4>{4VtdZX02mrvHj+d#09p^36e z({t}3eZQf@^*yw)Oc~W`MMirq>;ZAyqil}3I`cez&$Y$E^($Wv(tq8u$KPL74LA`MQhlw7(EMrR+oo`F}bRqUMpxWVUBZ}(lArCIld~h zD(k)Ym!zuXxZOsM8(Sr8>AD#=rZEFdd%`-E`HeM*J#L|MT+wR|6BWt<<|Vx7SfjlJ(Qe zgFL`dGrOW3kiqeo#pBbJEtYdK;_+hUofh47@k_Sk-1vp(9zW`J25PEDSJ$9Me}>%u E0(8&56951J literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.cs new file mode 100644 index 00000000000..873d0afcbbd --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.cs @@ -0,0 +1,458 @@ +// --------------------------------------------------------------------------------------------- +#region // Copyright (c) 2004-2005, SIL International. All Rights Reserved. +// +// Copyright (c) 2004-2005, SIL International. All Rights Reserved. +// +// Distributable under the terms of either the Common Public License or the +// GNU Lesser General Public License, as specified in the LICENSING.txt file. +// +#endregion +// +// File: TriStateTreeView.cs +// Responsibility: Eberhard Beilharz/Tim Steenwyk +// +// +// +// --------------------------------------------------------------------------------------------- +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Skybound.VisualStyles; + +namespace SIL.FieldWorks.Common.Controls +{ + /// ---------------------------------------------------------------------------------------- + /// + /// A tree view with tri-state check boxes + /// + /// + /// REVIEW: If we want to have icons in addition to the check boxes, we probably have to + /// set the icons for the check boxes in a different way. The windows tree view control + /// can have a separate image list for states. + /// + /// ---------------------------------------------------------------------------------------- + public class TriStateTreeView : TreeView + { + private System.Windows.Forms.ImageList m_TriStateImages; + private System.ComponentModel.IContainer components; + /// + /// The check state + /// + /// The states corresponds to image index + public enum CheckState + { + /// greyed out + GreyChecked = 0, + /// Unchecked + Unchecked = 1, + /// Checked + Checked = 2, + } + + #region Redefined Win-API structs and methods + /// + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct TV_HITTESTINFO + { + /// Client coordinates of the point to test. + public Point pt; + /// Variable that receives information about the results of a hit test. + public TVHit flags; + /// Handle to the item that occupies the point. + public IntPtr hItem; + } + + /// Hit tests for tree view + [Flags] + public enum TVHit + { + /// In the client area, but below the last item. + NoWhere = 0x0001, + /// On the bitmap associated with an item. + OnItemIcon = 0x0002, + /// On the label (string) associated with an item. + OnItemLabel = 0x0004, + /// In the indentation associated with an item. + OnItemIndent = 0x0008, + /// On the button associated with an item. + OnItemButton = 0x0010, + /// In the area to the right of an item. + OnItemRight = 0x0020, + /// On the state icon for a tree-view item that is in a user-defined state. + OnItemStateIcon = 0x0040, + /// On the bitmap or label associated with an item. + OnItem = (OnItemIcon | OnItemLabel | OnItemStateIcon), + /// Above the client area. + Above = 0x0100, + /// Below the client area. + Below = 0x0200, + /// To the right of the client area. + ToRight = 0x0400, + /// To the left of the client area. + ToLeft = 0x0800 + } + + /// + public enum TreeViewMessages + { + /// + TV_FIRST = 0x1100, // TreeView messages + /// + TVM_HITTEST = (TV_FIRST + 17), + } + + /// + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, TreeViewMessages msg, int wParam, ref TV_HITTESTINFO lParam); + #endregion + + #region Constructor and destructor + /// ------------------------------------------------------------------------------------ + /// + /// Initializes a new instance of the class. + /// + /// ------------------------------------------------------------------------------------ + public TriStateTreeView() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + if (ThemeInformation.VisualStylesEnabled) + { + Bitmap bmp = new Bitmap(m_TriStateImages.ImageSize.Width, m_TriStateImages.ImageSize.Height); + Rectangle rc = new Rectangle(0, 0, bmp.Width, bmp.Height); + Graphics graphics = Graphics.FromImage(bmp); + + ThemePaint.Draw(graphics, this, ThemeClasses.Button, ThemeParts.ButtonCheckBox, + ThemeStates.CheckBoxCheckedDisabled, rc, rc); + m_TriStateImages.Images[0] = bmp; + + ThemePaint.Draw(graphics, this, ThemeClasses.Button, ThemeParts.ButtonCheckBox, + ThemeStates.CheckBoxUncheckedNormal, rc, rc); + m_TriStateImages.Images[1] = bmp; + + ThemePaint.Draw(graphics, this, ThemeClasses.Button, ThemeParts.ButtonCheckBox, + ThemeStates.CheckBoxCheckedNormal, rc, rc); + m_TriStateImages.Images[2] = bmp; + } + + ImageList = m_TriStateImages; + ImageIndex = (int)CheckState.Unchecked; + SelectedImageIndex = (int)CheckState.Unchecked; + } + + /// ----------------------------------------------------------------------------------- + /// + /// Clean up any resources being used. + /// + /// true to release both managed and unmanaged + /// resources; false to release only unmanaged resources. + /// + /// ----------------------------------------------------------------------------------- + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + #endregion + + #region Component Designer generated code + /// ----------------------------------------------------------------------------------- + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + /// ----------------------------------------------------------------------------------- + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TriStateTreeView)); + this.m_TriStateImages = new System.Windows.Forms.ImageList(this.components); + // + // m_TriStateImages + // + this.m_TriStateImages.ImageSize = new System.Drawing.Size(16, 16); + this.m_TriStateImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("m_TriStateImages.ImageStream"))); + this.m_TriStateImages.TransparentColor = System.Drawing.Color.Magenta; + + } + #endregion + + #region Hide no longer appropriate properties from Designer + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + [Browsable(false)] + public new bool CheckBoxes + { + get { return base.CheckBoxes; } + set { base.CheckBoxes = value; } + } + + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + [Browsable(false)] + public new int ImageIndex + { + get { return base.ImageIndex; } + set { base.ImageIndex = value; } + } + + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + [Browsable(false)] + public new ImageList ImageList + { + get { return base.ImageList; } + set { base.ImageList = value; } + } + + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + [Browsable(false)] + public new int SelectedImageIndex + { + get { return base.SelectedImageIndex; } + set { base.SelectedImageIndex = value; } + } + #endregion + + #region Overrides + /// ------------------------------------------------------------------------------------ + /// + /// Called when the user clicks on an item + /// + /// + /// ------------------------------------------------------------------------------------ + protected override void OnClick(EventArgs e) + { + base.OnClick(e); + + TV_HITTESTINFO hitTestInfo = new TV_HITTESTINFO(); + hitTestInfo.pt = PointToClient(Control.MousePosition); + + SendMessage(Handle, TreeViewMessages.TVM_HITTEST, + 0, ref hitTestInfo); + if ((hitTestInfo.flags & TVHit.OnItemIcon) == TVHit.OnItemIcon) + { + TreeNode node = GetNodeAt(hitTestInfo.pt); + if (node != null) + ChangeNodeState(node); + } + } + + /// ------------------------------------------------------------------------------------ + /// + /// Toggle item if user presses space bar + /// + /// + /// ------------------------------------------------------------------------------------ + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + + if (e.KeyCode == Keys.Space) + ChangeNodeState(SelectedNode); + } + #endregion + + #region Private methods + /// ------------------------------------------------------------------------------------ + /// + /// Checks or unchecks all children + /// + /// + /// + /// ------------------------------------------------------------------------------------ + private void CheckNode(TreeNode node, CheckState state) + { + InternalSetChecked(node, state); + + foreach (TreeNode child in node.Nodes) + CheckNode(child, state); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Called after a node changed its state. Has to go through all direct children and + /// set state based on children's state. + /// + /// Parent node + /// ------------------------------------------------------------------------------------ + private void ChangeParent(TreeNode node) + { + if (node == null) + return; + + CheckState state = GetChecked(node.FirstNode); + foreach (TreeNode child in node.Nodes) + state &= GetChecked(child); + + if (InternalSetChecked(node, state)) + ChangeParent(node.Parent); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Handles changing the state of a node + /// + /// + /// ------------------------------------------------------------------------------------ + protected void ChangeNodeState(TreeNode node) + { + BeginUpdate(); + CheckState newState; + if (node.ImageIndex == (int)CheckState.Unchecked || node.ImageIndex < 0) + newState = CheckState.Checked; + else + newState = CheckState.Unchecked; + CheckNode(node, newState); + ChangeParent(node.Parent); + EndUpdate(); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Sets the checked state of a node, but doesn't deal with children or parents + /// + /// Node + /// The new checked state + /// true if checked state was set to the requested state, otherwise + /// false. + /// ------------------------------------------------------------------------------------ + private bool InternalSetChecked(TreeNode node, CheckState state) + { + TreeViewCancelEventArgs args = + new TreeViewCancelEventArgs(node, false, TreeViewAction.Unknown); + OnBeforeCheck(args); + if (args.Cancel) + return false; + + node.ImageIndex = (int)state; + node.SelectedImageIndex = (int)state; + + OnAfterCheck(new TreeViewEventArgs(node, TreeViewAction.Unknown)); + return true; + } + + /// ------------------------------------------------------------------------------------ + /// + /// Build a list of all of the tag data for checked items in the tree. + /// + /// + /// + /// ------------------------------------------------------------------------------------ + private void BuildTagDataList(TreeNode node, ArrayList list) + { + if (GetChecked(node) == CheckState.Checked && node.Tag != null) + list.Add(node.Tag); + + foreach (TreeNode child in node.Nodes) + BuildTagDataList(child, list); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Look through the tree nodes to find the node that has given tag data and check it. + /// + /// + /// + /// + /// ------------------------------------------------------------------------------------ + private void FindAndCheckNode(TreeNode node, object tag, CheckState state) + { + if (node.Tag != null && node.Tag.Equals(tag)) + { + SetChecked(node, state); + return; + } + + foreach (TreeNode child in node.Nodes) + FindAndCheckNode(child, tag, state); + } + #endregion + + #region Public methods + /// ------------------------------------------------------------------------------------ + /// + /// Gets the checked state of a node + /// + /// Node + /// The checked state + /// ------------------------------------------------------------------------------------ + public CheckState GetChecked(TreeNode node) + { + if (node.ImageIndex < 0) + return CheckState.Unchecked; + else + return (CheckState)node.ImageIndex; + } + + /// ------------------------------------------------------------------------------------ + /// + /// Sets the checked state of a node + /// + /// Node + /// The new checked state + /// ------------------------------------------------------------------------------------ + public void SetChecked(TreeNode node, CheckState state) + { + if (!InternalSetChecked(node, state)) + return; + CheckNode(node, state); + ChangeParent(node.Parent); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Find a node in the tree that matches the given tag data and set its checked state + /// + /// + /// + /// ------------------------------------------------------------------------------------ + public void CheckNodeByTag(object tag, CheckState state) + { + if (tag == null) + return; + foreach (TreeNode node in Nodes) + FindAndCheckNode(node, tag, state); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Return a list of the tag data for all of the checked items in the tree + /// + /// + /// ------------------------------------------------------------------------------------ + public ArrayList GetCheckedTagData() + { + ArrayList list = new ArrayList(); + + foreach (TreeNode node in Nodes) + BuildTagDataList(node, list); + return list; + } + #endregion + } +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.csproj b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.csproj new file mode 100644 index 00000000000..f53282f62f5 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.csproj @@ -0,0 +1,116 @@ + + + Local + 8.0.50727 + 2.0 + {99CEE41D-B76D-4102-B0AD-C81069509D17} + Debug + AnyCPU + + + + + TriStateTreeView + + + JScript + Grid + IE50 + false + Library + TriStateTreeView + OnBuildSuccess + + + + + + + 2.0 + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + skybound.visualstyles + skybound.visualstyles.dll + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + Code + + + Component + + + TriStateTreeView.cs + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.resx b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.resx new file mode 100644 index 00000000000..aabb39ec3c5 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeView.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Private + + + Private + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuNTAw + MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT + eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA + AAB0CQAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQC + AAEoAwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB + 3AHAAQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IB + AAM5AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8B + MwMAAWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYC + AAFmAZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMC + AAHMAWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQAB + ZgEAATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8B + AAEzAWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQAB + MwGZAWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQAB + MwLMAQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQAB + MwEAAWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMB + mQEAAWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQAB + ZgGZAWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYB + zAH/AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMB + mQEAAZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgAB + mQFmATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwB + AAKZAf8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB + /wEzAQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQAB + mQEAAcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYC + AAHMAWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYB + AAHMApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8C + AAHMAf8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQAB + mQEAAcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMB + AAHMAmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB + /wGZAcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC + /wEzAQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC + /wFmAQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gB + AAHwAfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/4MAAQcL8wQAAQcL + 8wQAAQcL8xQAAQcB7AH/AfMB/wHzAf8B8wH/AfMB/wHzBAABBwHsCf8B8wQAAQcB7An/AfMUAAEHAewB + 8wH/AfMBBwHzAf8B8wH/AvMEAAEHAewJ/wHzBAABBwHsA/8BAAX/AfMUAAEHAewB/wHzAwcB8wH/AfMB + /wHzBAABBwHsCf8B8wQAAQcB7AL/AwAE/wHzFAABBwHsAfMFBwHzAf8C8wQAAQcB7An/AfMEAAEHAewB + /wUAA/8B8xQAAQcB7AH/AgcB8wMHAfMB/wHzBAABBwHsCf8B8wQAAQcB7AH/AgAB/wMAAv8B8xQAAQcB + 7AHzAQcB8wH/AfMDBwLzBAABBwHsCf8B8wQAAQcB7AH/AQAD/wMAAf8B8xQAAQcB7AH/AfMB/wHzAf8B + 8wIHAf8B8wQAAQcB7An/AfMEAAEHAewG/wIAAf8B8xQAAQcB7AHzAf8B8wH/AfMB/wHzAQcC8wQAAQcB + 7An/AfMEAAEHAewH/wEAAf8B8xQAAQcB7AH/AfMB/wHzAf8B8wH/AfMB/wHzBAABBwHsCf8B8wQAAQcB + 7An/AfMUAAEHCuwB8wQAAQcK7AHzBAABBwrsAfMUAAwHBAAMBwQADAeSAAFCAU0BPgcAAT4DAAEoAwAB + QAMAARADAAEBAQABAQUAAYAXAAP/AQAG/wIABv8CAAHAAQMBwAEDAcABAwIAAcABAwHAAQMBwAEDAgAB + wAEDAcABAwHAAQMCAAHAAQMBwAEDAcABAwIAAcABAwHAAQMBwAEDAgABwAEDAcABAwHAAQMCAAHAAQMB + wAEDAcABAwIAAcABAwHAAQMBwAEDAgABwAEDAcABAwHAAQMCAAHAAQMBwAEDAcABAwIAAcABAwHAAQMB + wAEDAgABwAEDAcABAwHAAQMCAAb/AgAG/wIACw== + + + + Private + + + TriStateTreeView + + + False + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/App.ico b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/App.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a5525fd794f7a7c5c8e6187f470ea3af38cd2b6 GIT binary patch literal 1078 zcmeHHJr05}7=1t!Hp3A*8IHkVf+j?-!eHY14Gtcw1Eb*_9>Bq^zETJ@GKj{_2j4$w zo9}xCh!8{T3=X##Skq>ikMjsvB|y%crWBM2iW(4pI}c%z6%lW!=~4v77#3{z!dmB1 z__&l)-{KUYR+|8|;wB^R|9ET$J@(@=#rd^=)qs85?vAy(PSF5CyNkus435LVkZ$rj zNw|JG-P7^hF<(;#o*Vk}5R#e|^13tBbQkeF?djULtvqyxd3<{9 literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/App.ico b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/App.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a5525fd794f7a7c5c8e6187f470ea3af38cd2b6 GIT binary patch literal 1078 zcmeHHJr05}7=1t!Hp3A*8IHkVf+j?-!eHY14Gtcw1Eb*_9>Bq^zETJ@GKj{_2j4$w zo9}xCh!8{T3=X##Skq>ikMjsvB|y%crWBM2iW(4pI}c%z6%lW!=~4v77#3{z!dmB1 z__&l)-{KUYR+|8|;wB^R|9ET$J@(@=#rd^=)qs85?vAy(PSF5CyNkus435LVkZ$rj zNw|JG-P7^hF<(;#o*Vk}5R#e|^13tBbQkeF?djULtvqyxd3<{9 literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/Form1.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/Form1.cs new file mode 100644 index 00000000000..e30691824bb --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/Form1.cs @@ -0,0 +1,117 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace TriStateTreeView +{ + /// ---------------------------------------------------------------------------------------- + /// + /// Summary description for Form1. + /// + /// ---------------------------------------------------------------------------------------- + public class Form1 : System.Windows.Forms.Form + { + private SIL.FieldWorks.Common.Controls.TriStateTreeView triStateTreeView1; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + /// ------------------------------------------------------------------------------------ + /// + /// Initializes a new instance of the class. + /// + /// ------------------------------------------------------------------------------------ + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + + triStateTreeView1.ExpandAll(); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Clean up any resources being used. + /// + /// true to release both managed and unmanaged + /// resources; false to release only unmanaged resources. + /// + /// ------------------------------------------------------------------------------------ + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// ------------------------------------------------------------------------------------ + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + /// ------------------------------------------------------------------------------------ + private void InitializeComponent() + { + this.triStateTreeView1 = new SIL.FieldWorks.Common.Controls.TriStateTreeView(); + this.SuspendLayout(); + // + // triStateTreeView1 + // + this.triStateTreeView1.ImageIndex = 1; + this.triStateTreeView1.Location = new System.Drawing.Point(16, 16); + this.triStateTreeView1.Name = "triStateTreeView1"; + this.triStateTreeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + new System.Windows.Forms.TreeNode("Node0", new System.Windows.Forms.TreeNode[] { + new System.Windows.Forms.TreeNode("Node1", new System.Windows.Forms.TreeNode[] { + new System.Windows.Forms.TreeNode("Node2"), + new System.Windows.Forms.TreeNode("Node10", new System.Windows.Forms.TreeNode[] { + new System.Windows.Forms.TreeNode("Node11")})}), + new System.Windows.Forms.TreeNode("Node3", new System.Windows.Forms.TreeNode[] { + new System.Windows.Forms.TreeNode("Node4"), + new System.Windows.Forms.TreeNode("Node7"), + new System.Windows.Forms.TreeNode("Node8"), + new System.Windows.Forms.TreeNode("Node9")})})}); + this.triStateTreeView1.SelectedImageIndex = 1; + this.triStateTreeView1.Size = new System.Drawing.Size(256, 232); + this.triStateTreeView1.TabIndex = 0; + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.triStateTreeView1); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + + } + #endregion + + /// ------------------------------------------------------------------------------------ + /// + /// The main entry point for the application. + /// + /// ------------------------------------------------------------------------------------ + [STAThread] + static void Main() + { + Application.Run(new Form1()); + } + } +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/Form1.resx b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/Form1.resx new file mode 100644 index 00000000000..74f7e7a9db5 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/Form1.resx @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Private + + + Private + + + False + + + False + + + (Default) + + + False + + + False + + + 8, 8 + + + Form1 + + + True + + + 80 + + + True + + + Private + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/TriStateTreeViewDemo.csproj b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/TriStateTreeViewDemo.csproj new file mode 100644 index 00000000000..17c20075c38 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup/TriStateTreeViewDemo.csproj @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/AssemblyInfo.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/AssemblyInfo.cs new file mode 100644 index 00000000000..192fff970c0 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("TriStateTreeView control")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.cs new file mode 100644 index 00000000000..ba016abad0d --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.cs @@ -0,0 +1,458 @@ +// --------------------------------------------------------------------------------------------- +#region // Copyright (c) 2004-2005, SIL International. All Rights Reserved. +// +// Copyright (c) 2004-2005, SIL International. All Rights Reserved. +// +// Distributable under the terms of either the Common Public License or the +// GNU Lesser General Public License, as specified in the LICENSING.txt file. +// +#endregion +// +// File: TriStateTreeView.cs +// Responsibility: Eberhard Beilharz/Tim Steenwyk +// +// +// +// --------------------------------------------------------------------------------------------- +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Skybound.VisualStyles; + +namespace SIL.FieldWorks.Common.Controls +{ + /// ---------------------------------------------------------------------------------------- + /// + /// A tree view with tri-state check boxes + /// + /// + /// REVIEW: If we want to have icons in addition to the check boxes, we probably have to + /// set the icons for the check boxes in a different way. The windows tree view control + /// can have a separate image list for states. + /// + /// ---------------------------------------------------------------------------------------- + public class TriStateTreeView : TreeView + { + private System.Windows.Forms.ImageList m_TriStateImages; + private System.ComponentModel.IContainer components; + /// + /// The check state + /// + /// The states corresponds to image index + public enum CheckState + { + /// greyed out + GreyChecked = 0, + /// Unchecked + Unchecked = 1, + /// Checked + Checked = 2, + } + + #region Redefined Win-API structs and methods + /// + [StructLayout(LayoutKind.Sequential, Pack=1)] + public struct TV_HITTESTINFO + { + /// Client coordinates of the point to test. + public Point pt; + /// Variable that receives information about the results of a hit test. + public TVHit flags; + /// Handle to the item that occupies the point. + public IntPtr hItem; + } + + /// Hit tests for tree view + [Flags] + public enum TVHit + { + /// In the client area, but below the last item. + NoWhere = 0x0001, + /// On the bitmap associated with an item. + OnItemIcon = 0x0002, + /// On the label (string) associated with an item. + OnItemLabel = 0x0004, + /// In the indentation associated with an item. + OnItemIndent = 0x0008, + /// On the button associated with an item. + OnItemButton = 0x0010, + /// In the area to the right of an item. + OnItemRight = 0x0020, + /// On the state icon for a tree-view item that is in a user-defined state. + OnItemStateIcon = 0x0040, + /// On the bitmap or label associated with an item. + OnItem = (OnItemIcon | OnItemLabel | OnItemStateIcon), + /// Above the client area. + Above = 0x0100, + /// Below the client area. + Below = 0x0200, + /// To the right of the client area. + ToRight = 0x0400, + /// To the left of the client area. + ToLeft = 0x0800 + } + + /// + public enum TreeViewMessages + { + /// + TV_FIRST = 0x1100, // TreeView messages + /// + TVM_HITTEST = (TV_FIRST + 17), + } + + /// + [DllImport("user32.dll", CharSet=CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, TreeViewMessages msg, int wParam, ref TV_HITTESTINFO lParam); + #endregion + + #region Constructor and destructor + /// ------------------------------------------------------------------------------------ + /// + /// Initializes a new instance of the class. + /// + /// ------------------------------------------------------------------------------------ + public TriStateTreeView() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + if (ThemeInformation.VisualStylesEnabled) + { + Bitmap bmp = new Bitmap(m_TriStateImages.ImageSize.Width, m_TriStateImages.ImageSize.Height); + Rectangle rc = new Rectangle(0, 0, bmp.Width, bmp.Height); + Graphics graphics = Graphics.FromImage(bmp); + + ThemePaint.Draw(graphics, this, ThemeClasses.Button, ThemeParts.ButtonCheckBox, + ThemeStates.CheckBoxCheckedDisabled, rc, rc); + m_TriStateImages.Images[0] = bmp; + + ThemePaint.Draw(graphics, this, ThemeClasses.Button, ThemeParts.ButtonCheckBox, + ThemeStates.CheckBoxUncheckedNormal, rc, rc); + m_TriStateImages.Images[1] = bmp; + + ThemePaint.Draw(graphics, this, ThemeClasses.Button, ThemeParts.ButtonCheckBox, + ThemeStates.CheckBoxCheckedNormal, rc, rc); + m_TriStateImages.Images[2] = bmp; + } + + ImageList = m_TriStateImages; + ImageIndex = (int)CheckState.Unchecked; + SelectedImageIndex = (int)CheckState.Unchecked; + } + + /// ----------------------------------------------------------------------------------- + /// + /// Clean up any resources being used. + /// + /// true to release both managed and unmanaged + /// resources; false to release only unmanaged resources. + /// + /// ----------------------------------------------------------------------------------- + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + #endregion + + #region Component Designer generated code + /// ----------------------------------------------------------------------------------- + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + /// ----------------------------------------------------------------------------------- + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TriStateTreeView)); + this.m_TriStateImages = new System.Windows.Forms.ImageList(this.components); + // + // m_TriStateImages + // + this.m_TriStateImages.ImageSize = new System.Drawing.Size(16, 16); + this.m_TriStateImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("m_TriStateImages.ImageStream"))); + this.m_TriStateImages.TransparentColor = System.Drawing.Color.Magenta; + + } + #endregion + + #region Hide no longer appropriate properties from Designer + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + [Browsable(false)] + public new bool CheckBoxes + { + get { return base.CheckBoxes; } + set { base.CheckBoxes = value; } + } + + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + [Browsable(false)] + public new int ImageIndex + { + get { return base.ImageIndex; } + set { base.ImageIndex = value; } + } + + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + [Browsable(false)] + public new ImageList ImageList + { + get { return base.ImageList; } + set { base.ImageList = value; } + } + + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + [Browsable(false)] + public new int SelectedImageIndex + { + get { return base.SelectedImageIndex; } + set { base.SelectedImageIndex = value; } + } + #endregion + + #region Overrides + /// ------------------------------------------------------------------------------------ + /// + /// Called when the user clicks on an item + /// + /// + /// ------------------------------------------------------------------------------------ + protected override void OnClick(EventArgs e) + { + base.OnClick (e); + + TV_HITTESTINFO hitTestInfo = new TV_HITTESTINFO(); + hitTestInfo.pt = PointToClient(Control.MousePosition); + + SendMessage(Handle, TreeViewMessages.TVM_HITTEST, + 0, ref hitTestInfo); + if ((hitTestInfo.flags & TVHit.OnItemIcon) == TVHit.OnItemIcon) + { + TreeNode node = GetNodeAt(hitTestInfo.pt); + if (node != null) + ChangeNodeState(node); + } + } + + /// ------------------------------------------------------------------------------------ + /// + /// Toggle item if user presses space bar + /// + /// + /// ------------------------------------------------------------------------------------ + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown (e); + + if (e.KeyCode == Keys.Space) + ChangeNodeState(SelectedNode); + } + #endregion + + #region Private methods + /// ------------------------------------------------------------------------------------ + /// + /// Checks or unchecks all children + /// + /// + /// + /// ------------------------------------------------------------------------------------ + private void CheckNode(TreeNode node, CheckState state) + { + InternalSetChecked(node, state); + + foreach (TreeNode child in node.Nodes) + CheckNode(child, state); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Called after a node changed its state. Has to go through all direct children and + /// set state based on children's state. + /// + /// Parent node + /// ------------------------------------------------------------------------------------ + private void ChangeParent(TreeNode node) + { + if (node == null) + return; + + CheckState state = GetChecked(node.FirstNode); + foreach (TreeNode child in node.Nodes) + state &= GetChecked(child); + + if (InternalSetChecked(node, state)) + ChangeParent(node.Parent); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Handles changing the state of a node + /// + /// + /// ------------------------------------------------------------------------------------ + protected void ChangeNodeState(TreeNode node) + { + BeginUpdate(); + CheckState newState; + if (node.ImageIndex == (int)CheckState.Unchecked || node.ImageIndex < 0) + newState = CheckState.Checked; + else + newState = CheckState.Unchecked; + CheckNode(node, newState); + ChangeParent(node.Parent); + EndUpdate(); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Sets the checked state of a node, but doesn't deal with children or parents + /// + /// Node + /// The new checked state + /// true if checked state was set to the requested state, otherwise + /// false. + /// ------------------------------------------------------------------------------------ + private bool InternalSetChecked(TreeNode node, CheckState state) + { + TreeViewCancelEventArgs args = + new TreeViewCancelEventArgs(node, false, TreeViewAction.Unknown); + OnBeforeCheck(args); + if (args.Cancel) + return false; + + node.ImageIndex = (int)state; + node.SelectedImageIndex = (int)state; + + OnAfterCheck(new TreeViewEventArgs(node, TreeViewAction.Unknown)); + return true; + } + + /// ------------------------------------------------------------------------------------ + /// + /// Build a list of all of the tag data for checked items in the tree. + /// + /// + /// + /// ------------------------------------------------------------------------------------ + private void BuildTagDataList(TreeNode node, ArrayList list) + { + if (GetChecked(node) == CheckState.Checked && node.Tag != null) + list.Add(node.Tag); + + foreach (TreeNode child in node.Nodes) + BuildTagDataList(child, list); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Look through the tree nodes to find the node that has given tag data and check it. + /// + /// + /// + /// + /// ------------------------------------------------------------------------------------ + private void FindAndCheckNode(TreeNode node, object tag, CheckState state) + { + if (node.Tag != null && node.Tag.Equals(tag)) + { + SetChecked(node, state); + return; + } + + foreach (TreeNode child in node.Nodes) + FindAndCheckNode(child, tag, state); + } + #endregion + + #region Public methods + /// ------------------------------------------------------------------------------------ + /// + /// Gets the checked state of a node + /// + /// Node + /// The checked state + /// ------------------------------------------------------------------------------------ + public CheckState GetChecked(TreeNode node) + { + if (node.ImageIndex < 0) + return CheckState.Unchecked; + else + return (CheckState)node.ImageIndex; + } + + /// ------------------------------------------------------------------------------------ + /// + /// Sets the checked state of a node + /// + /// Node + /// The new checked state + /// ------------------------------------------------------------------------------------ + public void SetChecked(TreeNode node, CheckState state) + { + if (!InternalSetChecked(node, state)) + return; + CheckNode(node, state); + ChangeParent(node.Parent); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Find a node in the tree that matches the given tag data and set its checked state + /// + /// + /// + /// ------------------------------------------------------------------------------------ + public void CheckNodeByTag(object tag, CheckState state) + { + if (tag == null) + return; + foreach (TreeNode node in Nodes) + FindAndCheckNode(node, tag, state); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Return a list of the tag data for all of the checked items in the tree + /// + /// + /// ------------------------------------------------------------------------------------ + public ArrayList GetCheckedTagData() + { + ArrayList list = new ArrayList(); + + foreach (TreeNode node in Nodes) + BuildTagDataList(node, list); + return list; + } + #endregion + } +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.csproj b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.csproj new file mode 100644 index 00000000000..f87c6247744 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.csproj @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.resx b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.resx new file mode 100644 index 00000000000..aabb39ec3c5 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Backup1/TriStateTreeView.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Private + + + Private + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuNTAw + MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT + eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA + AAB0CQAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQC + AAEoAwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB + 3AHAAQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IB + AAM5AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8B + MwMAAWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYC + AAFmAZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMC + AAHMAWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQAB + ZgEAATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8B + AAEzAWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQAB + MwGZAWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQAB + MwLMAQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQAB + MwEAAWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMB + mQEAAWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQAB + ZgGZAWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYB + zAH/AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMB + mQEAAZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgAB + mQFmATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwB + AAKZAf8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB + /wEzAQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQAB + mQEAAcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYC + AAHMAWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYB + AAHMApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8C + AAHMAf8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQAB + mQEAAcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMB + AAHMAmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB + /wGZAcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC + /wEzAQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC + /wFmAQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gB + AAHwAfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/4MAAQcL8wQAAQcL + 8wQAAQcL8xQAAQcB7AH/AfMB/wHzAf8B8wH/AfMB/wHzBAABBwHsCf8B8wQAAQcB7An/AfMUAAEHAewB + 8wH/AfMBBwHzAf8B8wH/AvMEAAEHAewJ/wHzBAABBwHsA/8BAAX/AfMUAAEHAewB/wHzAwcB8wH/AfMB + /wHzBAABBwHsCf8B8wQAAQcB7AL/AwAE/wHzFAABBwHsAfMFBwHzAf8C8wQAAQcB7An/AfMEAAEHAewB + /wUAA/8B8xQAAQcB7AH/AgcB8wMHAfMB/wHzBAABBwHsCf8B8wQAAQcB7AH/AgAB/wMAAv8B8xQAAQcB + 7AHzAQcB8wH/AfMDBwLzBAABBwHsCf8B8wQAAQcB7AH/AQAD/wMAAf8B8xQAAQcB7AH/AfMB/wHzAf8B + 8wIHAf8B8wQAAQcB7An/AfMEAAEHAewG/wIAAf8B8xQAAQcB7AHzAf8B8wH/AfMB/wHzAQcC8wQAAQcB + 7An/AfMEAAEHAewH/wEAAf8B8xQAAQcB7AH/AfMB/wHzAf8B8wH/AfMB/wHzBAABBwHsCf8B8wQAAQcB + 7An/AfMUAAEHCuwB8wQAAQcK7AHzBAABBwrsAfMUAAwHBAAMBwQADAeSAAFCAU0BPgcAAT4DAAEoAwAB + QAMAARADAAEBAQABAQUAAYAXAAP/AQAG/wIABv8CAAHAAQMBwAEDAcABAwIAAcABAwHAAQMBwAEDAgAB + wAEDAcABAwHAAQMCAAHAAQMBwAEDAcABAwIAAcABAwHAAQMBwAEDAgABwAEDAcABAwHAAQMCAAHAAQMB + wAEDAcABAwIAAcABAwHAAQMBwAEDAgABwAEDAcABAwHAAQMCAAHAAQMBwAEDAcABAwIAAcABAwHAAQMB + wAEDAgABwAEDAcABAwHAAQMCAAb/AgAG/wIACw== + + + + Private + + + TriStateTreeView + + + False + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Controls/FileSystemTriStateTreeView.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Controls/FileSystemTriStateTreeView.cs new file mode 100644 index 00000000000..aa09cab37be --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Controls/FileSystemTriStateTreeView.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Windows.Forms; + +using SysGen.RBuild.Framework; + +using SIL.FieldWorks.Common.Controls; + +namespace TriStateTreeViewDemo +{ + public class FileSystemTriStateTreeView : TriStateTreeView + { + RBuildModule m_Module = null; + + public void Load(RBuildModule module) + { + m_Module = module; + + if (Directory.Exists(module.ModulePath) == false) + throw new DirectoryNotFoundException("Directory Not Found"); + + Nodes.Clear(); + + DirectoryNode node = new DirectoryNode(this, new DirectoryInfo(module.ModulePath)); + + node.Expand(); + } + + public RBuildModule Module + { + get { return m_Module; } + } + + protected override void OnAfterCheck(TreeViewEventArgs e) + { + base.OnAfterCheck(e); + + if (e.Node is FileNode) + { + FileNode fileNode = e.Node as FileNode; + + if (GetChecked(e.Node) == CheckState.Checked) + { + if (fileNode.IsInclude) + { + //if (m_Module.Includes.Contains(fileNode.RelativeDirectory) == false) + // m_Module.Includes.Add(fileNode.RelativeDirectory); + } + else + { + //if (m_Module.Files.Contains(fileNode.RelativePath) == false) + // m_Module.Files.Add(fileNode.RelativePath); + } + } + else if (GetChecked(e.Node) == CheckState.Unchecked) + { + if (fileNode.IsInclude == false) + { + //if (m_Module.Files.Contains(fileNode.RelativePath) == true) + // m_Module.Files.Remove(fileNode.RelativePath); + } + } + } + } + + public class DirectoryNode : TreeNode + { + private DirectoryInfo m_DirectoryInfo; + + public DirectoryNode(DirectoryNode parent, DirectoryInfo directoryInfo) + : base(directoryInfo.Name) + { + m_DirectoryInfo = directoryInfo; + + parent.Nodes.Add(this); + + LoadDirectory(); + LoadFiles(); + } + + public DirectoryNode(FileSystemTriStateTreeView treeView, DirectoryInfo directoryInfo) + : base(directoryInfo.Name) + { + m_DirectoryInfo = directoryInfo; + + treeView.Nodes.Add(this); + + LoadDirectory(); + LoadFiles(); + + } + + public void LoadDirectory() + { + foreach (DirectoryInfo directoryInfo in m_DirectoryInfo.GetDirectories()) + { + new DirectoryNode(this, directoryInfo); + } + } + + public void LoadFiles() + { + foreach (FileInfo file in m_DirectoryInfo.GetFiles()) + { + if (file.Extension.ToLower() == ".c" || + file.Extension.ToLower() == ".cpp" || + file.Extension.ToLower() == ".cxx" || + file.Extension.ToLower() == ".h") + { + new FileNode(this, file); + } + } + } + + public new FileSystemTriStateTreeView TreeView + { + get { return (FileSystemTriStateTreeView)base.TreeView; } + } + } + + public class FileNode : TreeNode + { + private FileInfo m_FileInfo; + private DirectoryNode m_DirectoryNode; + + public FileNode(DirectoryNode directoryNode, FileInfo fileInfo) + : base(fileInfo.Name) + { + m_DirectoryNode = directoryNode; + m_FileInfo = fileInfo; + + m_DirectoryNode.Nodes.Add(this); + } + + public string FilePath + { + get { return m_FileInfo.FullName; } + } + + public string RelativePath + { + get { return FilePath.Replace(((FileSystemTriStateTreeView)TreeView).Module.ModulePath, string.Empty); } + } + + public string RelativeDirectory + { + get { return RelativePath.Replace(@"\" + m_FileInfo.Name , string.Empty); } + } + + public bool IsInclude + { + get { return (m_FileInfo.Extension.ToLower() == ".h"); } + } + } + } +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Form1.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Form1.cs new file mode 100644 index 00000000000..2197865e7a7 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Form1.cs @@ -0,0 +1,213 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +using SysGen.RBuild.Framework; + +namespace TriStateTreeViewDemo +{ + /// ---------------------------------------------------------------------------------------- + /// + /// Summary description for Form1. + /// + /// ---------------------------------------------------------------------------------------- + public class Form1 : System.Windows.Forms.Form + { + private FileSystemTriStateTreeView triStateTreeView1; + private TextBox textBox1; + private Button btnProcess; + private Button btnGenerateRBuildFile; + private PropertyGrid propertyGrid1; + private IContainer components; + + /// ------------------------------------------------------------------------------------ + /// + /// Initializes a new instance of the class. + /// + /// ------------------------------------------------------------------------------------ + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + + triStateTreeView1.ExpandAll(); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Clean up any resources being used. + /// + /// true to release both managed and unmanaged + /// resources; false to release only unmanaged resources. + /// + /// ------------------------------------------------------------------------------------ + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// ------------------------------------------------------------------------------------ + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + /// ------------------------------------------------------------------------------------ + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Node2"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Node11"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Node10", new System.Windows.Forms.TreeNode[] { + treeNode2}); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Node1", new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode3}); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Node4"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Node7"); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Node8"); + System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("Node9"); + System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("Node3", new System.Windows.Forms.TreeNode[] { + treeNode5, + treeNode6, + treeNode7, + treeNode8}); + System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("Node0", new System.Windows.Forms.TreeNode[] { + treeNode4, + treeNode9}); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.btnProcess = new System.Windows.Forms.Button(); + this.btnGenerateRBuildFile = new System.Windows.Forms.Button(); + this.propertyGrid1 = new System.Windows.Forms.PropertyGrid(); + this.triStateTreeView1 = new TriStateTreeViewDemo.FileSystemTriStateTreeView(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(340, 12); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(432, 20); + this.textBox1.TabIndex = 1; + this.textBox1.Text = "C:\\Ros\\Trunk\\reactos\\salamander\\lib\\sdl"; + // + // btnProcess + // + this.btnProcess.Location = new System.Drawing.Point(687, 38); + this.btnProcess.Name = "btnProcess"; + this.btnProcess.Size = new System.Drawing.Size(85, 28); + this.btnProcess.TabIndex = 2; + this.btnProcess.Text = "button1"; + this.btnProcess.UseVisualStyleBackColor = true; + this.btnProcess.Click += new System.EventHandler(this.btnProcess_Click); + // + // btnGenerateRBuildFile + // + this.btnGenerateRBuildFile.Location = new System.Drawing.Point(701, 517); + this.btnGenerateRBuildFile.Name = "btnGenerateRBuildFile"; + this.btnGenerateRBuildFile.Size = new System.Drawing.Size(75, 23); + this.btnGenerateRBuildFile.TabIndex = 3; + this.btnGenerateRBuildFile.Text = "button1"; + this.btnGenerateRBuildFile.UseVisualStyleBackColor = true; + this.btnGenerateRBuildFile.Click += new System.EventHandler(this.btnGenerateRBuildFile_Click); + // + // propertyGrid1 + // + this.propertyGrid1.Location = new System.Drawing.Point(340, 75); + this.propertyGrid1.Name = "propertyGrid1"; + this.propertyGrid1.Size = new System.Drawing.Size(431, 426); + this.propertyGrid1.TabIndex = 4; + // + // triStateTreeView1 + // + this.triStateTreeView1.Anchor = System.Windows.Forms.AnchorStyles.None; + this.triStateTreeView1.ImageIndex = 1; + this.triStateTreeView1.Location = new System.Drawing.Point(12, 12); + this.triStateTreeView1.Name = "triStateTreeView1"; + treeNode1.Name = ""; + treeNode1.Text = "Node2"; + treeNode2.Name = ""; + treeNode2.Text = "Node11"; + treeNode3.Name = ""; + treeNode3.Text = "Node10"; + treeNode4.Name = ""; + treeNode4.Text = "Node1"; + treeNode5.Name = ""; + treeNode5.Text = "Node4"; + treeNode6.Name = ""; + treeNode6.Text = "Node7"; + treeNode7.Name = ""; + treeNode7.Text = "Node8"; + treeNode8.Name = ""; + treeNode8.Text = "Node9"; + treeNode9.Name = ""; + treeNode9.Text = "Node3"; + treeNode10.Name = ""; + treeNode10.Text = "Node0"; + this.triStateTreeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode10}); + this.triStateTreeView1.SelectedImageIndex = 1; + this.triStateTreeView1.Size = new System.Drawing.Size(322, 528); + this.triStateTreeView1.TabIndex = 0; + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(788, 556); + this.Controls.Add(this.propertyGrid1); + this.Controls.Add(this.btnGenerateRBuildFile); + this.Controls.Add(this.btnProcess); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.triStateTreeView1); + this.Name = "Form1"; + this.Text = "RBuild Port Maker"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + #endregion + + /// ------------------------------------------------------------------------------------ + /// + /// The main entry point for the application. + /// + /// ------------------------------------------------------------------------------------ + [STAThread] + static void Main() + { + Application.Run(new Form1()); + } + RBuildModule module = new RBuildModule(); + private void btnProcess_Click(object sender, EventArgs e) + { + + + module.GenerateFromPath(textBox1.Text); + + this.triStateTreeView1.Load(module); + this.propertyGrid1.SelectedObject = module; + + + } + + private void btnGenerateRBuildFile_Click(object sender, EventArgs e) + { +module.SaveAs (@"c:\module.rbuild"); + } + } +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Form1.resx b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Form1.resx new file mode 100644 index 00000000000..19dc0dd8b39 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/RBuildModule.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/RBuildModule.cs new file mode 100644 index 00000000000..7e121105791 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/RBuildModule.cs @@ -0,0 +1,61 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; + +namespace TriStateTreeViewDemo +{ + public enum TargetType + { + Win32CUI = 0, + } + + [DefaultPropertyAttribute("Name")] + public class RBuildModule + { + private string m_Path = null; + private TargetType m_Type = TargetType.Win32CUI; + + public void GenerateFromPath(string path) + { + m_Path = path; + } + + public string ModulePath + { + get { return m_Path; } + } + + public string Name + { + get { return Path.GetFileName(m_Path); } + } + + public string SourcePath + { + get { return Path.Combine(m_Path, "src"); } + } + + public string ResourceFile + { + get { return Path.Combine(ModulePath, Name + ".rc"); } + } + + public string CompiledFilename + { + get { return ""; } + } + + public string Description + { + get { return ""; } + } + + public TargetType Type + { + get { return m_Type; } + set { m_Type = value; } + } + } +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/RCWriter.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/RCWriter.cs new file mode 100644 index 00000000000..e53f8f54c55 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/RCWriter.cs @@ -0,0 +1,50 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; + +using SysGen.RBuild.Framework; + +namespace TriStateTreeViewDemo +{ + public class RCWriter + { + RBuildModule m_Module = null; + + /// + /// Creates a new instance of the class. + /// + /// + public RCWriter(RBuildModule module) + { + //Set the module + m_Module = module; + } + + public RBuildModule Module + { + get { return m_Module; } + } + + public void Generate() + { + //using (FileStream fs = new FileStream(Module.ResourceFile, FileMode.Append)) + //{ + // using (StreamWriter objWriter = new StreamWriter(fs)) + // { + // objWriter.WriteLine("; Autogenerated"); + // objWriter.WriteLine("#include "); + // objWriter.WriteLine(); + // objWriter.WriteLine("LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL"); + // objWriter.WriteLine(); + // objWriter.WriteLine("#define REACTOS_STR_FILE_DESCRIPTION \"{0}\0\"", Module.Description); + // objWriter.WriteLine("#define REACTOS_STR_INTERNAL_NAME \"{0}\0\"", Module.Name); + // objWriter.WriteLine("#define REACTOS_STR_ORIGINAL_FILENAME \"{0}\0\"", Module.CompiledFilename); + // objWriter.WriteLine(); + // objWriter.WriteLine("LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL"); + // } + //} + } + } +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.csproj b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.csproj new file mode 100644 index 00000000000..3ab6641a37a --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.csproj @@ -0,0 +1,124 @@ + + + Local + 8.0.50727 + 2.0 + {6E9E72B6-B523-424F-B409-BA5357BB7B50} + Debug + AnyCPU + + + + + TriStateTreeViewDemo + + + JScript + Grid + IE50 + false + WinExe + TriStateTreeViewDemo + OnBuildSuccess + + + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + + Component + + + + Form + + + Form1.cs + Designer + + + + + {88D9BED7-30C5-4683-A6C6-6F2EB55B8F26} + SysGen.RBuild.Framework + + + {99CEE41D-B76D-4102-B0AD-C81069509D17} + TriStateTreeView + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.csproj.user b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.csproj.user new file mode 100644 index 00000000000..a1d742b1c46 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.csproj.user @@ -0,0 +1,5 @@ + + + ProjectFiles + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.suo b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/TriStateTreeViewDemo.suo new file mode 100644 index 0000000000000000000000000000000000000000..eb2fb45d07b1e48286ae885ff82237acdbdbb7c5 GIT binary patch literal 2560 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*3Bx2!nwD0|OI~0pkDr|NlQkkbwcn90fxt z1pWfu3W`4%9zsqZbt)A?Ac!F!2um0g7+e|hfOHWc0UZlEJ0nkB zKh6kJcK}+D1ORQ!XUJmk1lpbkWVtd_5HJN*S`1hUAqNAhEN&jK_yPlehEkxfa~Lv# z_JeRbLokq^2*jxjM!2=ZWfaJ;ALR8#P!sUkZwR*qHv?!tBgi~ZSqusX+$s?=EI{Tg zC>NCPL3%-P0%EfQX;7IDVvmC19|F||2Sb0m|8-hFOK`jV)3`0bs3!^JF*q|=F~k6K zO+GOHmN1k9^G*>k?*st(Mc`ai1e6T{vNMr#7Kon;gkeC@RG=QhD)bnV8H#}}yCJl@ z*#hc9P9V((#DYL91;p||tOLZRKn#mHAQLZWqLcewfd0${hDi*A8#rWg84MX + + + + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/UpgradeLog2.XML b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/UpgradeLog2.XML new file mode 100644 index 00000000000..8133cb6b4e5 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/UpgradeLog2.XML @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport.css b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport.css new file mode 100644 index 00000000000..fae98af0a86 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport.css @@ -0,0 +1,207 @@ +BODY +{ + BACKGROUND-COLOR: white; + FONT-FAMILY: "Verdana", sans-serif; + FONT-SIZE: 100%; + MARGIN-LEFT: 0px; + MARGIN-TOP: 0px +} +P +{ + FONT-FAMILY: "Verdana", sans-serif; + FONT-SIZE: 70%; + LINE-HEIGHT: 12pt; + MARGIN-BOTTOM: 0px; + MARGIN-LEFT: 10px; + MARGIN-TOP: 10px +} +.note +{ + BACKGROUND-COLOR: #ffffff; + COLOR: #336699; + FONT-FAMILY: "Verdana", sans-serif; + FONT-SIZE: 100%; + MARGIN-BOTTOM: 0px; + MARGIN-LEFT: 0px; + MARGIN-TOP: 0px; + PADDING-RIGHT: 10px +} +.infotable +{ + BACKGROUND-COLOR: #f0f0e0; + BORDER-BOTTOM: #ffffff 0px solid; + BORDER-COLLAPSE: collapse; + BORDER-LEFT: #ffffff 0px solid; + BORDER-RIGHT: #ffffff 0px solid; + BORDER-TOP: #ffffff 0px solid; + FONT-SIZE: 70%; + MARGIN-LEFT: 10px +} +.issuetable +{ + BACKGROUND-COLOR: #ffffe8; + BORDER-COLLAPSE: collapse; + COLOR: #000000; + FONT-SIZE: 100%; + MARGIN-BOTTOM: 10px; + MARGIN-LEFT: 13px; + MARGIN-TOP: 0px +} +.issuetitle +{ + BACKGROUND-COLOR: #ffffff; + BORDER-BOTTOM: #dcdcdc 1px solid; + BORDER-TOP: #dcdcdc 1px; + COLOR: #003366; + FONT-WEIGHT: normal +} +.header +{ + BACKGROUND-COLOR: #cecf9c; + BORDER-BOTTOM: #ffffff 1px solid; + BORDER-LEFT: #ffffff 1px solid; + BORDER-RIGHT: #ffffff 1px solid; + BORDER-TOP: #ffffff 1px solid; + COLOR: #000000; + FONT-WEIGHT: bold +} +.issuehdr +{ + BACKGROUND-COLOR: #E0EBF5; + BORDER-BOTTOM: #dcdcdc 1px solid; + BORDER-TOP: #dcdcdc 1px solid; + COLOR: #000000; + FONT-WEIGHT: normal +} +.issuenone +{ + BACKGROUND-COLOR: #ffffff; + BORDER-BOTTOM: 0px; + BORDER-LEFT: 0px; + BORDER-RIGHT: 0px; + BORDER-TOP: 0px; + COLOR: #000000; + FONT-WEIGHT: normal +} +.content +{ + BACKGROUND-COLOR: #e7e7ce; + BORDER-BOTTOM: #ffffff 1px solid; + BORDER-LEFT: #ffffff 1px solid; + BORDER-RIGHT: #ffffff 1px solid; + BORDER-TOP: #ffffff 1px solid; + PADDING-LEFT: 3px +} +.issuecontent +{ + BACKGROUND-COLOR: #ffffff; + BORDER-BOTTOM: #dcdcdc 1px solid; + BORDER-TOP: #dcdcdc 1px solid; + PADDING-LEFT: 3px +} +A:link +{ + COLOR: #cc6633; + TEXT-DECORATION: underline +} +A:visited +{ + COLOR: #cc6633; +} +A:active +{ + COLOR: #cc6633; +} +A:hover +{ + COLOR: #cc3300; + TEXT-DECORATION: underline +} +H1 +{ + BACKGROUND-COLOR: #003366; + BORDER-BOTTOM: #336699 6px solid; + COLOR: #ffffff; + FONT-SIZE: 130%; + FONT-WEIGHT: normal; + MARGIN: 0em 0em 0em -20px; + PADDING-BOTTOM: 8px; + PADDING-LEFT: 30px; + PADDING-TOP: 16px +} +H2 +{ + COLOR: #000000; + FONT-SIZE: 80%; + FONT-WEIGHT: bold; + MARGIN-BOTTOM: 3px; + MARGIN-LEFT: 10px; + MARGIN-TOP: 20px; + PADDING-LEFT: 0px +} +H3 +{ + COLOR: #000000; + FONT-SIZE: 80%; + FONT-WEIGHT: bold; + MARGIN-BOTTOM: -5px; + MARGIN-LEFT: 10px; + MARGIN-TOP: 20px +} +H4 +{ + COLOR: #000000; + FONT-SIZE: 70%; + FONT-WEIGHT: bold; + MARGIN-BOTTOM: 0px; + MARGIN-TOP: 15px; + PADDING-BOTTOM: 0px +} +UL +{ + COLOR: #000000; + FONT-SIZE: 70%; + LIST-STYLE: square; + MARGIN-BOTTOM: 0pt; + MARGIN-TOP: 0pt +} +OL +{ + COLOR: #000000; + FONT-SIZE: 70%; + LIST-STYLE: square; + MARGIN-BOTTOM: 0pt; + MARGIN-TOP: 0pt +} +LI +{ + LIST-STYLE: square; + MARGIN-LEFT: 0px +} +.expandable +{ + CURSOR: hand +} +.expanded +{ + color: black +} +.collapsed +{ + DISPLAY: none +} +.foot +{ +BACKGROUND-COLOR: #ffffff; +BORDER-BOTTOM: #cecf9c 1px solid; +BORDER-TOP: #cecf9c 2px solid +} +.settings +{ +MARGIN-LEFT: 25PX; +} +.help +{ +TEXT-ALIGN: right; +margin-right: 10px; +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport.xslt b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport.xslt new file mode 100644 index 00000000000..83f4304ab60 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport.xslt @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ Solution: + Project: + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + src + + + + + + + + + + + + +
FilenameStatusErrorsWarnings
+ javascript:document.images[''].click()src + + + + Converted + + + + Converted + +
+ + files + + + 1 file + + + Converted:
+ Not converted +
+
+
+ + + + : + + + + + + + + + Conversion Report + <xsl:if test="Properties/Property[@Name='LogNumber']"> + <xsl:value-of select="Properties/Property[@Name='LogNumber']/@Value"/> + </xsl:if> + + + + +

Conversion Report -

+ +

+ Time of Conversion:
+

+ + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + +
+ Conversion Settings +

+ + +
+
diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport_Minus.gif b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewDemo/_UpgradeReport_Files/UpgradeReport_Minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..17751cb2fd5c284dfe984adc4c769982f73a0a66 GIT binary patch literal 69 zcmZ?wbhEHb23ky~TYXIqG7FYlP literal 0 HcmV?d00001 diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/NUnit/.gitignore b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/NUnit/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/TriStateTreeViewTests.cs b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/TriStateTreeViewTests.cs new file mode 100644 index 00000000000..ee9bb2603bc --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/TriStateTreeViewTests.cs @@ -0,0 +1,258 @@ +// --------------------------------------------------------------------------------------------- +#region // Copyright (c) 2004-2005, SIL International. All Rights Reserved. +// +// Copyright (c) 2004-2005, SIL International. All Rights Reserved. +// +// Distributable under the terms of either the Common Public License or the +// GNU Lesser General Public License, as specified in the LICENSING.txt file. +// +#endregion +// +// File: TriStateTreeViewTests.cs +// Responsibility: TE Team +// +// +// +// --------------------------------------------------------------------------------------------- +using System; +using System.Windows.Forms; +using NUnit.Framework; + +namespace SIL.FieldWorks.Common.Controls +{ + #region DummyTriStateTreeView + /// ---------------------------------------------------------------------------------------- + /// + /// + /// + /// ---------------------------------------------------------------------------------------- + public class DummyTriStateTreeView: TriStateTreeView + { + /// ------------------------------------------------------------------------------------ + /// + /// Exposes ChangeNodeState for testing + /// + /// + /// ------------------------------------------------------------------------------------ + public void CallChangeNodeState(TreeNode node) + { + ChangeNodeState(node); + } + } + #endregion + + /// ---------------------------------------------------------------------------------------- + /// + /// Tests for TriStateTreeView control. + /// + /// ---------------------------------------------------------------------------------------- + [TestFixture] + public class TriStateTreeViewTests + { + private DummyTriStateTreeView m_treeView; + private TreeNode m_aNode; + private TreeNode m_bNode; + private TreeNode m_c1Node; + private TreeNode m_c2Node; + private TreeNode m_dNode; + private bool m_fBeforeCheck; + private bool m_fCancelInBeforeCheck; + private bool m_fAfterCheck; + + /// ------------------------------------------------------------------------------------ + /// + /// Initialize a test + /// + /// ------------------------------------------------------------------------------------ + [SetUp] + public void Init() + { + m_fBeforeCheck = false; + m_fAfterCheck = false; + m_fCancelInBeforeCheck = false; + m_treeView = new DummyTriStateTreeView(); + + m_dNode = new TreeNode("d"); + m_c1Node = new TreeNode("c1", new TreeNode[] { m_dNode }); + m_c2Node = new TreeNode("c2"); + m_bNode = new TreeNode("b", new TreeNode[] { m_c1Node, m_c2Node}); + m_aNode = new TreeNode("a", new TreeNode[] { m_bNode }); + m_treeView.Nodes.Add(m_aNode); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Tests that all nodes in the tree view are initially unchecked + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void InitiallyUnchecked() + { + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_aNode)); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_bNode)); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_c1Node)); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_c2Node)); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_dNode)); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Tests that changing a node changes all children + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void ChangeNodeChangesAllChildren_Check() + { + // Check a node -> should check all children + m_treeView.SetChecked(m_bNode, TriStateTreeView.CheckState.Checked); + + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_bNode)); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_c1Node)); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_c2Node)); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_dNode)); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Tests that changing a node changes all children + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void ChangeNodeChangesAllChildren_Uncheck() + { + // uncheck a node -> should uncheck all children + m_treeView.SetChecked(m_bNode, TriStateTreeView.CheckState.Unchecked); + + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_bNode)); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_c1Node)); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_c2Node)); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_dNode)); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Tests that parent get greyed out if children are not all in same state + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void ChangeParent_CheckOneChild() + { + // check child -> grey check all parents + m_treeView.SetChecked(m_c2Node, TriStateTreeView.CheckState.Checked); + + Assert.AreEqual(TriStateTreeView.CheckState.GreyChecked, m_treeView.GetChecked(m_aNode)); + Assert.AreEqual(TriStateTreeView.CheckState.GreyChecked, m_treeView.GetChecked(m_bNode)); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_c1Node)); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_c2Node)); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Tests that parent get greyed out if children are not all in same state + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void ChangeParent_CheckAllChildren() + { + // check second child -> check all parents + m_treeView.SetChecked(m_c2Node, TriStateTreeView.CheckState.Checked); + m_treeView.SetChecked(m_c1Node, TriStateTreeView.CheckState.Checked); + + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_aNode)); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_bNode)); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_c1Node)); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_c2Node)); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Tests that the BeforeCheck event is raised + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void BeforeCheckCalled() + { + m_treeView.BeforeCheck += new TreeViewCancelEventHandler(OnBeforeCheck); + + m_treeView.SetChecked(m_c1Node, TriStateTreeView.CheckState.Checked); + + Assert.IsTrue(m_fBeforeCheck); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_c1Node)); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Tests that the BeforeCheck event is raised if first node is changed + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void BeforeCheckCalled_FirstNode() + { + m_treeView.BeforeCheck += new TreeViewCancelEventHandler(OnBeforeCheck); + + m_treeView.CallChangeNodeState(m_aNode); + + Assert.IsTrue(m_fBeforeCheck); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_aNode)); + } + + /// ------------------------------------------------------------------------------------ + /// + /// Tests that the AfterCheck event is raised + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void AfterCheckCalled() + { + m_treeView.AfterCheck += new TreeViewEventHandler(OnAfterCheck); + + m_treeView.SetChecked(m_c1Node, TriStateTreeView.CheckState.Checked); + + Assert.IsTrue(m_fAfterCheck); + Assert.AreEqual(TriStateTreeView.CheckState.Checked, m_treeView.GetChecked(m_c1Node)); + } + + /// ------------------------------------------------------------------------------------ + /// + /// When the cancel flag in BeforeCheck returns true we don't want to change the + /// state of the node. + /// + /// ------------------------------------------------------------------------------------ + [Test] + public void StateNotChangedIfBeforeCheckCancels() + { + m_treeView.BeforeCheck += new TreeViewCancelEventHandler(OnBeforeCheck); + m_treeView.AfterCheck += new TreeViewEventHandler(OnAfterCheck); + m_fCancelInBeforeCheck = true; + + m_treeView.SetChecked(m_c1Node, TriStateTreeView.CheckState.Checked); + + Assert.IsTrue(m_fBeforeCheck); + Assert.IsFalse(m_fAfterCheck); + Assert.AreEqual(TriStateTreeView.CheckState.Unchecked, m_treeView.GetChecked(m_c1Node)); + } + + #region Helper methods + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + private void OnBeforeCheck(object sender, TreeViewCancelEventArgs e) + { + e.Cancel = m_fCancelInBeforeCheck; + m_fBeforeCheck = true; + } + + /// ------------------------------------------------------------------------------------ + /// + /// + /// + /// ------------------------------------------------------------------------------------ + private void OnAfterCheck(object sender, TreeViewEventArgs e) + { + m_fAfterCheck = true; + } + #endregion + } +} diff --git a/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/TriStateTreeViewTests.csproj b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/TriStateTreeViewTests.csproj new file mode 100644 index 00000000000..77e5081d520 --- /dev/null +++ b/reactos/tools/sysgen/TriStateTreeView/TriStateTreeViewTests/TriStateTreeViewTests.csproj @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/tools/sysgen/style.css b/reactos/tools/sysgen/style.css new file mode 100644 index 00000000000..1bae53d2185 --- /dev/null +++ b/reactos/tools/sysgen/style.css @@ -0,0 +1,105 @@ +body +{ + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 12px; + background: white; + color: black; +} + +div.header +{ + border: 1px dashed #333; + background-color: #FFFBCB; + padding: 10px; +} + +div.footer +{ + border: 1px dashed #333; + background-color: #FFFBCB; + padding: 5px; +} + +h1, h2, h3, h4, h5, h6 { + font: 22px Verdana, Arial, Helvetica, sans-serif; +} + +td a { + font: 10px Verdana, Arial, Helvetica, sans-serif; +} + +td p { + font: 12px Verdana, Arial, Helvetica, sans-serif; + text-align: left; + border-right: 1px solid #FFF798; + border-bottom: 1px solid #FFF798; + padding: 6px; + background: #FFFBCB; +} + +.table td { + font: 10px Verdana, Arial, Helvetica, sans-serif; + text-align: left; + border-right: 1px solid #FFF798; + border-bottom: 1px solid #FFF798; + padding: 6px; + background: #FFFBCB; + vertical-align: top; +} + +.table td.Red { + font: 10px Verdana, Arial, Helvetica, sans-serif; + text-align: left; + border-right: 1px solid #FFF798; + border-bottom: 1px solid #FFF798; + padding: 6px; + background: #FF9999; +} + +.table td.Green { + font: 10px Verdana, Arial, Helvetica, sans-serif; + text-align: left; + border-right: 1px solid #FFF798; + border-bottom: 1px solid #FFF798; + padding: 6px; + background: #CCFF66; +} + +.table th { + font: 10px Verdana, Arial, Helvetica, sans-serif; + text-align: left; + padding: 6px; + background: black; + color : white; +} + +/* Status colors */ +.hdr { background-color: #000000; color: #ffffff; } +.pct0 { background-color: #ff5050; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct5 { background-color: #ff5d4f; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct10 { background-color: #ff694e; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct15 { background-color: #ff764d; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct20 { background-color: #ff824b; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct25 { background-color: #ff8f4a; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct30 { background-color: #ff9b49; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct35 { background-color: #ffa848; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct40 { background-color: #ffb447; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct45 { background-color: #ffc146; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct50 { background-color: #ffcd45; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct55 { background-color: #ffda43; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct60 { background-color: #ffe642; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct65 { background-color: #fff341; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct70 { background-color: #ffff40; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct75 { background-color: #dcff48; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct80 { background-color: #c8ff50; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct85 { background-color: #b4ff58; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct90 { background-color: #a0ff60; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct95 { background-color: #8cff60; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.pct100 { background-color: #60ff60; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.nonexistent { background-color: #ff5050; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.poor { background-color: #ff8f4a; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.outdated { background-color: #ffcd45; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.outdadeq { background-color: #ffff40; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.adequate { background-color: #dcff48; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.adeqgood { background-color: #c0ff54; font: 10px Verdana, Arial, Helvetica, sans-serif;} +.good { background-color: #60ff60; font: 10px Verdana, Arial, Helvetica, sans-serif;} \ No newline at end of file From e47129e41e87d28e1e8fcecddd28beaab368ee85 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 13 Apr 2010 23:48:25 +0000 Subject: [PATCH 118/261] [NDIS] Convert to spec svn path=/trunk/; revision=46863 --- reactos/drivers/network/ndis/ndis.def | 298 ----------------------- reactos/drivers/network/ndis/ndis.rbuild | 2 +- reactos/drivers/network/ndis/ndis.spec | 292 ++++++++++++++++++++++ 3 files changed, 293 insertions(+), 299 deletions(-) delete mode 100644 reactos/drivers/network/ndis/ndis.def create mode 100644 reactos/drivers/network/ndis/ndis.spec diff --git a/reactos/drivers/network/ndis/ndis.def b/reactos/drivers/network/ndis/ndis.def deleted file mode 100644 index 5eba1a29842..00000000000 --- a/reactos/drivers/network/ndis/ndis.def +++ /dev/null @@ -1,298 +0,0 @@ -; NDIS Kernel Module - ReactOS Operating System - -LIBRARY NDIS.SYS - -EXPORTS -ArcFilterDprIndicateReceive@16 -ArcFilterDprIndicateReceiveComplete@4 -EthFilterDprIndicateReceive@32 -EthFilterDprIndicateReceiveComplete@4 -FddiFilterDprIndicateReceive@36 -FddiFilterDprIndicateReceiveComplete@4 -NDIS_BUFFER_TO_SPAN_PAGES@4 -NdisAcquireReadWriteLock@12 -NdisAcquireSpinLock@4 -NdisAdjustBufferLength@8 -NdisAllocateBuffer@20 -NdisAllocateBufferPool@12 -NdisAllocateDmaChannel@20 -NdisAllocateFromBlockPool@4 -NdisAllocateMemory@20 -NdisAllocateMemoryWithTag@12 -NdisAllocatePacket@12 -NdisAllocatePacketPool@16 -NdisAllocatePacketPoolEx@20 -NdisAllocateSharedMemory@20 -NdisAllocateSpinLock@4 -NdisAnsiStringToUnicodeString@8 -NdisBufferLength@4 -NdisBufferVirtualAddress@4 -NdisCancelSendPackets@8 -NdisCancelTimer@8 -NdisClAddParty@16 -NdisClCloseAddressFamily@4 -NdisClCloseCall@16 -NdisClDeregisterSap@4 -NdisClDropParty@12 -NdisClGetProtocolVcContextFromTapiCallId@12 -NdisClIncomingCallComplete@12 -NdisClMakeCall@16 -NdisClModifyCallQoS@8 -NdisClOpenAddressFamily@24 -NdisClRegisterSap@16 -NdisCloseAdapter@8 -NdisCloseConfiguration@4 -NdisCloseFile@4 -NdisCmActivateVc@8 -NdisCmAddPartyComplete@16 -NdisCmCloseAddressFamilyComplete@8 -NdisCmCloseCallComplete@12 -NdisCmDeactivateVc@4 -NdisCmDeregisterSapComplete@8 -NdisCmDispatchCallConnected@4 -NdisCmDispatchIncomingCall@12 -NdisCmDispatchIncomingCallQoSChange@8 -NdisCmDispatchIncomingCloseCall@16 -NdisCmDispatchIncomingDropParty@16 -NdisCmDropPartyComplete@8 -NdisCmMakeCallComplete@20 -NdisCmModifyCallQoSComplete@12 -NdisCmOpenAddressFamilyComplete@12 -NdisCmRegisterAddressFamily@16 -NdisCmRegisterSapComplete@12 -NdisCoAssignInstanceName@12 -NdisCoCreateVc@16 -NdisCoDeleteVc@4 -NdisCoGetTapiCallId@8 -NdisCoRequest@20 -NdisCoRequestComplete@20 -NdisCoSendPackets@12 -NdisCompareAnsiString@12 -NdisCompareUnicodeString@12 -NdisCompleteBindAdapter@12 -NdisCompleteCloseAdapter@8 -NdisCompleteDmaTransfer@24 -NdisCompleteOpenAdapter@12 -NdisCompletePnPEvent@12 -NdisCompleteQueryStatistics@12 -NdisCompleteUnbindAdapter@8 -NdisConvertStringToAtmAddress@12 -NdisCopyBuffer@24 -NdisCopyFromPacketToPacket@24 -NdisCopyFromPacketToPacketSafe@28 -NdisCreateBlockPool@16 -NdisDeregisterAdapter@4 -NdisDeregisterAdapterShutdownHandler@4 -NdisDeregisterMac@8 -NdisDeregisterProtocol@8 -NdisDeregisterTdiCallBack@0 -NdisDestroyBlockPool@4 -NdisDprAcquireSpinLock@4 -NdisDprAllocatePacket@12 -NdisDprAllocatePacketNonInterlocked@12 -NdisDprFreePacket@4 -NdisDprFreePacketNonInterlocked@4 -NdisDprReleaseSpinLock@4 -NdisEqualString@12 -NdisFreeBuffer@4 -NdisFreeBufferPool@4 -NdisFreeDmaChannel@4 -NdisFreeToBlockPool@4 -NdisFreeMemory@12 -NdisFreePacket@4 -NdisFreePacketPool@4 -NdisFreeSharedMemory@24 -NdisFreeSpinLock@4 -NdisGeneratePartialCancelId@0 -NdisGetBufferPhysicalArraySize@8 -NdisGetCurrentProcessorCounts@12 -NdisGetCurrentProcessorCpuUsage@4 -NdisGetCurrentSystemTime@4 -NdisGetDriverHandle@8 -NdisGetFirstBufferFromPacket@20 -NdisGetFirstBufferFromPacketSafe@24 -NdisGetPacketCancelId@4 -NdisGetPoolFromPacket@4 -NdisGetReceivedPacket@8 -NdisGetRoutineAddress@4 -NdisGetSharedDataAlignment@0 -NdisGetSystemUpTime@4 -NdisGetVersion@0 -NdisIMAssociateMiniport@8 -NdisIMCancelInitializeDeviceInstance@8 -NdisIMCopySendCompletePerPacketInfo@8 -NdisIMCopySendPerPacketInfo@8 -NdisIMDeInitializeDeviceInstance@4 -NdisIMDeregisterLayeredMiniport@4 -NdisIMGetBindingContext@4 -NdisIMGetCurrentPacketStack@8 -NdisIMGetDeviceContext@4 -NdisIMInitializeDeviceInstance@8 -NdisIMInitializeDeviceInstanceEx@12 -NdisIMNotifyPnPEvent@8 -NdisImmediateReadPciSlotInformation@20 -NdisImmediateReadPortUchar@12 -NdisImmediateReadPortUlong@12 -NdisImmediateReadPortUshort@12 -NdisImmediateReadSharedMemory@16 -NdisImmediateWritePciSlotInformation@20 -NdisImmediateWritePortUchar@12 -NdisImmediateWritePortUlong@12 -NdisImmediateWritePortUshort@12 -NdisImmediateWriteSharedMemory@16 -NdisIMQueueMiniportCallback@12 -NdisIMRegisterLayeredMiniport@16 -NdisIMRevertBack@8 -NdisIMSwitchToMiniport@8 -NdisInitAnsiString@8 -NdisInitializeEvent@4 -NdisInitializeReadWriteLock@4 -NdisInitializeString@8 -NdisInitializeTimer@12 -NdisInitializeWrapper@16 -NdisInitUnicodeString@8 -NdisInterlockedAddLargeInteger@16 -NdisInterlockedAddUlong@12 -NdisInterlockedDecrement@4 -NdisInterlockedIncrement@4 -NdisInterlockedInsertHeadList@12 -NdisInterlockedInsertTailList@12 -NdisInterlockedPopEntrySList@8 -NdisInterlockedPushEntrySList@12 -NdisInterlockedRemoveHeadList@8 -NdisMAllocateMapRegisters@20 -NdisMAllocateSharedMemory@20 -NdisMAllocateSharedMemoryAsync@16 -NdisMapFile@12 -NdisMapIoSpace@24 -;NdisMatchPdoWithPacket ? -NdisMCancelTimer@8 -NdisMCloseLog@4 -NdisMCmActivateVc@8 -NdisMCmCreateVc@16 -NdisMCmDeactivateVc@4 -NdisMCmDeleteVc@4 -NdisMCmRegisterAddressFamily@16 -NdisMCmRequest@16 -NdisMCoActivateVcComplete@12 -NdisMCoDeactivateVcComplete@8 -NdisMCoIndicateReceivePacket@12 -NdisMCoIndicateStatus@20 -NdisMCompleteBufferPhysicalMapping@12 -NdisMCoReceiveComplete@4 -NdisMCoRequestComplete@12 -NdisMCoSendComplete@12 -NdisMCreateLog@12 -NdisMDeregisterAdapterShutdownHandler@4 -NdisMDeregisterDevice@4 -NdisMDeregisterDmaChannel@4 -NdisMDeregisterInterrupt@4 -NdisMDeregisterIoPortRange@16 -NdisMFlushLog@4 -NdisMFreeMapRegisters@4 -NdisMFreeSharedMemory@24 -NdisMGetDeviceProperty@24 -NdisMGetDmaAlignment@4 -NdisMIndicateStatus@16 -NdisMIndicateStatusComplete@4 -NdisMInitializeScatterGatherDma@12 -NdisMInitializeTimer@16 -NdisMMapIoSpace@20 -NdisMPciAssignResources@12 -NdisMPromoteMiniport@4 -NdisMQueryAdapterInstanceName@8 -NdisMQueryAdapterResources@16 -NdisMQueryInformationComplete@8 -NdisMReadDmaCounter@4 -NdisMRegisterAdapterShutdownHandler@12 -NdisMRegisterDevice@24 -NdisMRegisterDmaChannel@24 -NdisMRegisterInterrupt@28 -NdisMRegisterIoPortRange@16 -NdisMRegisterMiniport@12 -NdisMRegisterUnloadHandler@8 -NdisMRemoveMiniport@4 -NdisMResetComplete@12 -NdisMSendComplete@12 -NdisMSendResourcesAvailable@4 -NdisMSetAttributes@16 -NdisMSetAttributesEx@20 -NdisMSetInformationComplete@8 -NdisMSetMiniportSecondary@8 -NdisMSetPeriodicTimer@8 -NdisMSetTimer@8 -NdisMSleep@4 -NdisMStartBufferPhysicalMapping@24 -NdisMSynchronizeWithInterrupt@12 -NdisMTransferDataComplete@16 -NdisMUnmapIoSpace@12 -NdisMWanIndicateReceive@20 -NdisMWanIndicateReceiveComplete@4 -NdisMWanSendComplete@12 -NdisMWriteLogData@12 -NdisOpenAdapter@44 -NdisOpenConfiguration@12 -NdisOpenConfigurationKeyByIndex@20 -NdisOpenConfigurationKeyByName@16 -NdisOpenFile@24 -NdisOpenProtocolConfiguration@12 -NdisOverrideBusNumber@12 -NdisPacketPoolUsage@4 -NdisPacketSize@4 -NdisPciAssignResources@20 -NdisQueryAdapterInstanceName@8 -NdisQueryBindInstanceName@8 -NdisQueryBuffer@12 -NdisQueryBufferOffset@12 -NdisQueryBufferSafe@16 -NdisQueryMapRegisterCount@8 -NdisQueryPendingIOCount@8 -NdisReadConfiguration@20 -NdisReadEisaSlotInformation@16 -NdisReadEisaSlotInformationEx@20 -NdisReadMcaPosInformation@16 -NdisReadNetworkAddress@16 -NdisReadPciSlotInformation@20 -NdisReadPcmciaAttributeMemory@16 -NdisReEnumerateProtocolBindings@4 -NdisRegisterAdapter@24 -NdisRegisterAdapterShutdownHandler@12 -NdisRegisterProtocol@16 -NdisRegisterTdiCallBack@8 -NdisReleaseAdapterResources@4 -NdisReleaseReadWriteLock@8 -NdisReleaseSpinLock@4 -NdisRequest@12 -NdisReset@8 -NdisResetEvent@4 -NdisReturnPackets@8 -NdisSend@12 -NdisSendPackets@12 -NdisSetEvent@4 -NdisSetPacketCancelId@8 -NdisSetPacketPoolProtocolId@8 -NdisSetPacketStatus@16 -NdisSetProtocolFilter@32 -NdisSetTimer@8 -NdisSetTimerEx@12 -NdisSetupDmaTransfer@24 -NdisSystemProcessorCount@0 -NdisTerminateWrapper@8 -NdisTransferData@28 -NdisUnchainBufferAtBack@8 -NdisUnchainBufferAtFront@8 -NdisUnicodeStringToAnsiString@8 -NdisUnmapFile@4 -NdisUpcaseUnicodeString@8 -NdisUpdateSharedMemory@20 -NdisWaitEvent@8 -NdisWriteConfiguration@16 -NdisWriteErrorLogEntry -NdisWriteEventLogEntry@28 -NdisWritePciSlotInformation@20 -NdisWritePcmciaAttributeMemory@16 -TrFilterDprIndicateReceive@28 -TrFilterDprIndicateReceiveComplete@4 -NdisScheduleWorkItem@4 - -; EOF diff --git a/reactos/drivers/network/ndis/ndis.rbuild b/reactos/drivers/network/ndis/ndis.rbuild index 39eab407a43..38dadeff652 100644 --- a/reactos/drivers/network/ndis/ndis.rbuild +++ b/reactos/drivers/network/ndis/ndis.rbuild @@ -1,7 +1,7 @@ - + include diff --git a/reactos/drivers/network/ndis/ndis.spec b/reactos/drivers/network/ndis/ndis.spec new file mode 100644 index 00000000000..bd3eaea56b9 --- /dev/null +++ b/reactos/drivers/network/ndis/ndis.spec @@ -0,0 +1,292 @@ + + @ stdcall ArcFilterDprIndicateReceive(ptr ptr ptr long) + @ stdcall ArcFilterDprIndicateReceiveComplete(ptr) + @ stdcall EthFilterDprIndicateReceive(ptr ptr ptr ptr long ptr long long) + @ stdcall EthFilterDprIndicateReceiveComplete(ptr) + @ stdcall FddiFilterDprIndicateReceive(ptr ptr ptr long ptr long ptr long long) + @ stdcall FddiFilterDprIndicateReceiveComplete(ptr) + @ stdcall NDIS_BUFFER_TO_SPAN_PAGES(ptr) + @ stdcall NdisAcquireReadWriteLock(ptr long ptr) + @ stdcall NdisAcquireSpinLock(ptr) + @ stdcall NdisAdjustBufferLength(ptr long) + @ stdcall NdisAllocateBuffer(ptr ptr ptr ptr long) + @ stdcall NdisAllocateBufferPool(ptr ptr long) + @ stdcall NdisAllocateDmaChannel(ptr ptr ptr ptr long) + @ stdcall NdisAllocateMemory(ptr long long double) + @ stdcall NdisAllocateFromBlockPool(ptr) + @ stdcall NdisAllocateMemoryWithTag(ptr long long) + @ stdcall NdisAllocatePacket(ptr ptr ptr) + @ stdcall NdisAllocatePacketPool(ptr ptr long long) + @ stdcall NdisAllocatePacketPoolEx(ptr ptr long long long) + @ stdcall NdisAllocateSharedMemory(ptr long long ptr ptr) + @ stdcall NdisAllocateSpinLock(ptr) + @ stdcall NdisAnsiStringToUnicodeString(ptr ptr) + @ stdcall NdisBufferLength(ptr) + @ stdcall NdisBufferVirtualAddress(ptr) + @ stdcall NdisCancelSendPackets(ptr ptr) + @ stdcall NdisCancelTimer(ptr ptr) + @ stdcall NdisClAddParty(ptr ptr ptr ptr) + @ stdcall NdisClCloseAddressFamily(ptr) + @ stdcall NdisClCloseCall(ptr ptr ptr long) + @ stdcall NdisClDeregisterSap(ptr) + @ stdcall NdisClDropParty(ptr ptr long) + @ stdcall NdisClGetProtocolVcContextFromTapiCallId(double ptr) + @ stdcall NdisClIncomingCallComplete(long ptr ptr) + @ stdcall NdisClMakeCall(ptr ptr ptr ptr) + @ stdcall NdisClModifyCallQoS(ptr ptr) + @ stdcall NdisClOpenAddressFamily(ptr ptr ptr ptr long ptr) + @ stdcall NdisClRegisterSap(ptr ptr ptr ptr) + @ stdcall NdisCloseAdapter(ptr ptr) + @ stdcall NdisCloseConfiguration(ptr) + @ stdcall NdisCloseFile(ptr) + @ stdcall NdisCmActivateVc(ptr ptr) + @ stdcall NdisCmAddPartyComplete(long ptr ptr ptr) + @ stdcall NdisCmCloseAddressFamilyComplete(long ptr) + @ stdcall NdisCmCloseCallComplete(long ptr ptr) + @ stdcall NdisCmDeactivateVc(ptr) + @ stdcall NdisCmDeregisterSapComplete(long ptr) + @ stdcall NdisCmDispatchCallConnected(ptr) + @ stdcall NdisCmDispatchIncomingCall(ptr ptr ptr) + @ stdcall NdisCmDispatchIncomingCallQoSChange(ptr ptr) + @ stdcall NdisCmDispatchIncomingCloseCall(long ptr ptr long) + @ stdcall NdisCmDispatchIncomingDropParty(ptr ptr ptr long) + @ stdcall NdisCmDropPartyComplete(long ptr) + @ stdcall NdisCmMakeCallComplete(long ptr ptr ptr ptr) + @ stdcall NdisCmModifyCallQoSComplete(long ptr ptr) + @ stdcall NdisCmOpenAddressFamilyComplete(long ptr ptr) + @ stdcall NdisCmRegisterAddressFamily(ptr ptr ptr long) + @ stdcall NdisCmRegisterSapComplete(long ptr ptr) + @ stdcall NdisCoAssignInstanceName(ptr ptr ptr) + @ stdcall NdisCoCreateVc(ptr ptr ptr ptr) + @ stdcall NdisCoDeleteVc(ptr) + @ stdcall NdisCoGetTapiCallId(ptr ptr) + @ stdcall NdisCoRequest(ptr ptr ptr ptr ptr) + @ stdcall NdisCoRequestComplete(long ptr ptr ptr ptr) + @ stdcall NdisCoSendPackets(ptr ptr long) + @ stdcall NdisCompareAnsiString(ptr ptr long) + @ stdcall NdisCompareUnicodeString(ptr ptr long) + @ stdcall NdisCompleteBindAdapter(ptr long long) + @ stdcall NdisCompleteCloseAdapter(ptr long) + @ stdcall NdisCompleteDmaTransfer(ptr ptr ptr long long long) + @ stdcall NdisCompleteOpenAdapter(ptr long long) + @ stdcall NdisCompletePnPEvent(long ptr ptr) + @ stdcall NdisCompleteQueryStatistics(ptr ptr long) + @ stdcall NdisCompleteUnbindAdapter(ptr long) + @ stdcall NdisConvertStringToAtmAddress(ptr ptr ptr) + @ stdcall NdisCopyBuffer(ptr ptr ptr ptr long long) + @ stdcall NdisCopyFromPacketToPacket(ptr long long ptr long ptr) + @ stdcall NdisCopyFromPacketToPacketSafe(ptr long long ptr long ptr long) + @ stdcall NdisCreateBlockPool(long long long ptr) + @ stdcall NdisDeregisterAdapter(ptr) + @ stdcall NdisDeregisterAdapterShutdownHandler(ptr) + @ stdcall NdisDeregisterMac(ptr ptr) + @ stdcall NdisDeregisterProtocol(ptr ptr) + @ stdcall NdisDeregisterTdiCallBack() + @ stdcall NdisDestroyBlockPool(ptr) + @ stdcall NdisDprAcquireSpinLock(ptr) + @ stdcall NdisDprAllocatePacket(ptr ptr ptr) + @ stdcall NdisDprAllocatePacketNonInterlocked(ptr ptr ptr) + @ stdcall NdisDprFreePacket(ptr) + @ stdcall NdisDprFreePacketNonInterlocked(ptr) + @ stdcall NdisDprReleaseSpinLock(ptr) + @ stdcall NdisEqualString(ptr ptr long) + @ stdcall NdisFreeBuffer(ptr) + @ stdcall NdisFreeBufferPool(ptr) + @ stdcall NdisFreeDmaChannel(ptr) + @ stdcall NdisFreeToBlockPool(ptr) + @ stdcall NdisFreeMemory(ptr long long) + @ stdcall NdisFreePacket(ptr) + @ stdcall NdisFreePacketPool(ptr) + @ stdcall NdisFreeSharedMemory(ptr long long ptr double) + @ stdcall NdisFreeSpinLock(ptr) + @ stdcall NdisGeneratePartialCancelId() + @ stdcall NdisGetBufferPhysicalArraySize(ptr ptr) + @ stdcall NdisGetCurrentProcessorCounts(ptr ptr ptr) + @ stdcall NdisGetCurrentProcessorCpuUsage(ptr) + @ stdcall NdisGetCurrentSystemTime(ptr) + @ stdcall NdisGetDriverHandle(ptr ptr) + @ stdcall NdisGetFirstBufferFromPacket(ptr ptr ptr ptr ptr) + @ stdcall NdisGetFirstBufferFromPacketSafe(ptr ptr ptr ptr ptr long) + @ stdcall NdisGetPacketCancelId(ptr) + @ stdcall NdisGetPoolFromPacket(ptr) + @ stdcall NdisGetReceivedPacket(ptr ptr) + @ stdcall NdisGetRoutineAddress(ptr) + @ stdcall NdisGetSharedDataAlignment() + @ stdcall NdisGetSystemUpTime(ptr) + @ stdcall NdisGetVersion() + @ stdcall NdisIMAssociateMiniport(ptr ptr) + @ stdcall NdisIMCancelInitializeDeviceInstance(ptr ptr) + @ stdcall NdisIMCopySendCompletePerPacketInfo(ptr ptr) + @ stdcall NdisIMCopySendPerPacketInfo(ptr ptr) + @ stdcall NdisIMDeInitializeDeviceInstance(ptr) + @ stdcall NdisIMDeregisterLayeredMiniport(ptr) + @ stdcall NdisIMGetBindingContext(ptr) + @ stdcall NdisIMGetCurrentPacketStack(ptr ptr) + @ stdcall NdisIMGetDeviceContext(ptr) + @ stdcall NdisIMInitializeDeviceInstance(ptr ptr) + @ stdcall NdisIMInitializeDeviceInstanceEx(ptr ptr ptr) + @ stdcall NdisIMNotifyPnPEvent(ptr ptr) + @ stdcall NdisImmediateReadPciSlotInformation(ptr long long ptr long) + @ stdcall NdisImmediateReadPortUchar(ptr long ptr) + @ stdcall NdisImmediateReadPortUlong(ptr long ptr) + @ stdcall NdisImmediateReadPortUshort(ptr long ptr) + @ stdcall NdisImmediateReadSharedMemory(ptr long ptr long) + @ stdcall NdisImmediateWritePciSlotInformation(ptr long long ptr long) + @ stdcall NdisImmediateWritePortUchar(ptr long long) + @ stdcall NdisImmediateWritePortUlong(ptr long long) + @ stdcall NdisImmediateWritePortUshort(ptr long long) + @ stdcall NdisImmediateWriteSharedMemory(ptr long ptr long) + @ stdcall NdisIMQueueMiniportCallback(ptr ptr ptr) + @ stdcall NdisIMRegisterLayeredMiniport(ptr ptr long ptr) + @ stdcall NdisIMRevertBack(ptr ptr) + @ stdcall NdisIMSwitchToMiniport(ptr ptr) + @ stdcall NdisInitAnsiString(ptr ptr) + @ stdcall NdisInitializeEvent(ptr) + @ stdcall NdisInitializeReadWriteLock(ptr) + @ stdcall NdisInitializeString(ptr ptr) + @ stdcall NdisInitializeTimer(ptr ptr ptr) + @ stdcall NdisInitializeWrapper(ptr ptr ptr ptr) + @ stdcall NdisInitUnicodeString(ptr ptr) + @ stdcall NdisInterlockedAddLargeInteger(ptr double ptr) + @ stdcall NdisInterlockedAddUlong(ptr long ptr) + @ stdcall NdisInterlockedDecrement(ptr) + @ stdcall NdisInterlockedIncrement(ptr) + @ stdcall NdisInterlockedInsertHeadList(ptr ptr ptr) + @ stdcall NdisInterlockedInsertTailList(ptr ptr ptr) + @ stdcall NdisInterlockedPopEntrySList(ptr ptr) + @ stdcall NdisInterlockedPushEntrySList(ptr ptr ptr) + @ stdcall NdisInterlockedRemoveHeadList(ptr ptr) + @ stdcall NdisMAllocateMapRegisters(ptr long long long long) + @ stdcall NdisMAllocateSharedMemory(ptr long long ptr ptr) + @ stdcall NdisMAllocateSharedMemoryAsync(ptr long long ptr) + @ stdcall NdisMapFile(ptr ptr ptr) + @ stdcall NdisMapIoSpace(ptr ptr ptr double long) +# @ stdcall NdisMatchPdoWithPacket ? + @ stdcall NdisMCancelTimer(ptr ptr) + @ stdcall NdisMCloseLog(ptr) + @ stdcall NdisMCmActivateVc(ptr ptr) + @ stdcall NdisMCmCreateVc(ptr ptr ptr ptr) + @ stdcall NdisMCmDeactivateVc(ptr) + @ stdcall NdisMCmDeleteVc(ptr) + @ stdcall NdisMCmRegisterAddressFamily(ptr ptr ptr long) + @ stdcall NdisMCmRequest(ptr ptr ptr ptr) + @ stdcall NdisMCoActivateVcComplete(long ptr ptr) + @ stdcall NdisMCoDeactivateVcComplete(long ptr) + @ stdcall NdisMCoIndicateReceivePacket(ptr ptr long) + @ stdcall NdisMCoIndicateStatus(ptr ptr long ptr long) + @ stdcall NdisMCompleteBufferPhysicalMapping(ptr ptr long) + @ stdcall NdisMCoReceiveComplete(ptr) + @ stdcall NdisMCoRequestComplete(long ptr ptr) + @ stdcall NdisMCoSendComplete(ptr ptr ptr) + @ stdcall NdisMCreateLog(ptr long ptr) + @ stdcall NdisMDeregisterAdapterShutdownHandler(ptr) + @ stdcall NdisMDeregisterDevice(ptr) + @ stdcall NdisMDeregisterDmaChannel(ptr) + @ stdcall NdisMDeregisterInterrupt(ptr) + @ stdcall NdisMDeregisterIoPortRange(ptr long long ptr) + @ stdcall NdisMFlushLog(ptr) + @ stdcall NdisMFreeMapRegisters(ptr) + @ stdcall NdisMFreeSharedMemory(ptr long long ptr double) + @ stdcall NdisMGetDeviceProperty(ptr ptr ptr ptr ptr ptr) + @ stdcall NdisMGetDmaAlignment(ptr) + @ stdcall NdisMIndicateStatus(ptr long ptr long) + @ stdcall NdisMIndicateStatusComplete(ptr) + @ stdcall NdisMInitializeScatterGatherDma(ptr long long) + @ stdcall NdisMInitializeTimer(ptr ptr ptr ptr) + @ stdcall NdisMMapIoSpace(ptr ptr double long) + @ stdcall NdisMPciAssignResources(ptr long ptr) + @ stdcall NdisMPromoteMiniport(ptr) + @ stdcall NdisMQueryAdapterInstanceName(ptr ptr) + @ stdcall NdisMQueryAdapterResources(ptr ptr ptr ptr) + @ stdcall NdisMQueryInformationComplete(ptr long) + @ stdcall NdisMReadDmaCounter(ptr) + @ stdcall NdisMRegisterAdapterShutdownHandler(ptr ptr ptr) + @ stdcall NdisMRegisterDevice(ptr ptr ptr ptr ptr ptr) + @ stdcall NdisMRegisterDmaChannel(ptr ptr long long ptr long) + @ stdcall NdisMRegisterInterrupt(ptr ptr long long long long long) + @ stdcall NdisMRegisterIoPortRange(ptr ptr long long) + @ stdcall NdisMRegisterMiniport(ptr ptr long) + @ stdcall NdisMRegisterUnloadHandler(ptr ptr) + @ stdcall NdisMRemoveMiniport(ptr) + @ stdcall NdisMResetComplete(ptr long long) + @ stdcall NdisMSendComplete(ptr ptr long) + @ stdcall NdisMSendResourcesAvailable(ptr) + @ stdcall NdisMSetAttributes(ptr ptr long long) + @ stdcall NdisMSetAttributesEx(ptr ptr long long long) + @ stdcall NdisMSetInformationComplete(ptr long) + @ stdcall NdisMSetMiniportSecondary(ptr ptr) + @ stdcall NdisMSetPeriodicTimer(ptr long) + @ stdcall NdisMSetTimer(ptr long) + @ stdcall NdisMSleep(long) + @ stdcall NdisMStartBufferPhysicalMapping(ptr ptr long long ptr ptr) + @ stdcall NdisMSynchronizeWithInterrupt(ptr ptr ptr) + @ stdcall NdisMTransferDataComplete(ptr ptr long long) + @ stdcall NdisMUnmapIoSpace(ptr ptr long) + @ stdcall NdisMWanIndicateReceive(ptr ptr ptr ptr long) + @ stdcall NdisMWanIndicateReceiveComplete(ptr) + @ stdcall NdisMWanSendComplete(ptr ptr long) + @ stdcall NdisMWriteLogData(ptr ptr long) + @ stdcall NdisOpenAdapter(ptr ptr ptr ptr ptr long ptr ptr ptr long ptr) + @ stdcall NdisOpenConfiguration(ptr ptr ptr) + @ stdcall NdisOpenConfigurationKeyByIndex(ptr ptr long ptr ptr) + @ stdcall NdisOpenConfigurationKeyByName(ptr ptr ptr ptr) + @ stdcall NdisOpenFile(ptr ptr ptr ptr double) + @ stdcall NdisOpenProtocolConfiguration(ptr ptr ptr) + @ stdcall NdisOverrideBusNumber(ptr ptr long) + @ stdcall NdisPacketPoolUsage(ptr) + @ stdcall NdisPacketSize(long) + @ stdcall NdisPciAssignResources(ptr ptr ptr long ptr) + @ stdcall NdisQueryAdapterInstanceName(ptr ptr) + @ stdcall NdisQueryBindInstanceName(ptr ptr) + @ stdcall NdisQueryBuffer(ptr ptr ptr) + @ stdcall NdisQueryBufferOffset(ptr ptr ptr) + @ stdcall NdisQueryBufferSafe(ptr ptr ptr long) + @ stdcall NdisQueryMapRegisterCount(long ptr) + @ stdcall NdisQueryPendingIOCount(ptr ptr) + @ stdcall NdisReadConfiguration(ptr ptr ptr ptr long) + @ stdcall NdisReadEisaSlotInformation(ptr ptr ptr ptr) + @ stdcall NdisReadEisaSlotInformationEx(ptr ptr ptr ptr ptr) + @ stdcall NdisReadMcaPosInformation(ptr ptr ptr ptr) + @ stdcall NdisReadNetworkAddress(ptr ptr ptr ptr) + @ stdcall NdisReadPciSlotInformation(ptr long long ptr long) + @ stdcall NdisReadPcmciaAttributeMemory(ptr long ptr long) + @ stdcall NdisReEnumerateProtocolBindings(ptr) + @ stdcall NdisRegisterAdapter(ptr ptr ptr ptr ptr ptr) + @ stdcall NdisRegisterAdapterShutdownHandler(ptr ptr ptr) + @ stdcall NdisRegisterProtocol(ptr ptr ptr long) + @ stdcall NdisRegisterTdiCallBack(ptr ptr) + @ stdcall NdisReleaseAdapterResources(ptr) + @ stdcall NdisReleaseReadWriteLock(ptr ptr) + @ stdcall NdisReleaseSpinLock(ptr) + @ stdcall NdisRequest(ptr ptr ptr) + @ stdcall NdisReset(ptr ptr) + @ stdcall NdisResetEvent(ptr) + @ stdcall NdisReturnPackets(ptr long) + @ stdcall NdisSend(ptr ptr ptr) + @ stdcall NdisSendPackets(ptr ptr long) + @ stdcall NdisSetEvent(ptr) + @ stdcall NdisSetPacketCancelId(ptr ptr) + @ stdcall NdisSetPacketPoolProtocolId(ptr long) + @ stdcall NdisSetPacketStatus(ptr long ptr long) + @ stdcall NdisSetProtocolFilter(ptr ptr ptr ptr long long long ptr) + @ stdcall NdisSetTimer(ptr long) + @ stdcall NdisSetTimerEx(ptr long ptr) + @ stdcall NdisSetupDmaTransfer(ptr ptr ptr long long long) + @ stdcall NdisSystemProcessorCount() + @ stdcall NdisTerminateWrapper(ptr ptr) + @ stdcall NdisTransferData(ptr ptr ptr long long ptr ptr) + @ stdcall NdisUnchainBufferAtBack(ptr ptr) + @ stdcall NdisUnchainBufferAtFront(ptr ptr) + @ stdcall NdisUnicodeStringToAnsiString(ptr ptr) + @ stdcall NdisUnmapFile(ptr) + @ stdcall NdisUpcaseUnicodeString(ptr ptr) + @ stdcall NdisUpdateSharedMemory(ptr long ptr double) + @ stdcall NdisWaitEvent(ptr long) + @ stdcall NdisWriteConfiguration(ptr ptr ptr ptr) + @ cdecl NdisWriteErrorLogEntry(ptr long long) + @ stdcall NdisWriteEventLogEntry(ptr long long long ptr long ptr) + @ stdcall NdisWritePciSlotInformation(ptr long long ptr long) + @ stdcall NdisWritePcmciaAttributeMemory(ptr long ptr long) + @ stdcall TrFilterDprIndicateReceive(ptr ptr ptr long ptr long long) + @ stdcall TrFilterDprIndicateReceiveComplete(ptr) + @ stdcall NdisScheduleWorkItem(ptr) From 4c7d318d094739ce96ce48fcc075527b0dd2afe2 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 14 Apr 2010 00:03:21 +0000 Subject: [PATCH 119/261] =?UTF-8?q?[TDI]=20Convert=20to=20spec.=20Taken=20?= =?UTF-8?q?from=20amd64=20branch=20(by=20Samuel=20Serapi=C3=B3n)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=46864 --- reactos/drivers/network/tdi/misc/tdi.def | 47 ----------------------- reactos/drivers/network/tdi/misc/tdi.spec | 39 +++++++++++++++++++ reactos/drivers/network/tdi/tdi.rbuild | 2 +- 3 files changed, 40 insertions(+), 48 deletions(-) delete mode 100644 reactos/drivers/network/tdi/misc/tdi.def create mode 100644 reactos/drivers/network/tdi/misc/tdi.spec diff --git a/reactos/drivers/network/tdi/misc/tdi.def b/reactos/drivers/network/tdi/misc/tdi.def deleted file mode 100644 index 4f10551a4e6..00000000000 --- a/reactos/drivers/network/tdi/misc/tdi.def +++ /dev/null @@ -1,47 +0,0 @@ -; $Id$ -; -; TDI.SYS Kernel Module - ReactOS Operating System -; -LIBRARY TDI.SYS - -EXPORTS -CTEAllocateString@8 -CTEBlock@4 -CTEInitEvent@8 -CTEInitString@8 -CTEInitTimer@4 -CTEInitialize@0 -CTELogEvent@28 -CTEScheduleEvent@8 -CTESignal@8 -CTEStartTimer@16 -CTESystemUpTime@0 -TdiBuildNetbiosAddress@12 -TdiBuildNetbiosAddressEa@12 -TdiCopyBufferToMdl@24 -TdiCopyMdlToBuffer@24 -TdiDefaultChainedRcvDatagramHandler@40 -TdiDefaultChainedRcvExpeditedHandler@28 -TdiDefaultChainedReceiveHandler@28 -TdiDefaultConnectHandler@36 -TdiDefaultDisconnectHandler@28 -TdiDefaultErrorHandler@8 -TdiDefaultRcvDatagramHandler@44 -TdiDefaultRcvExpeditedHandler@32 -TdiDefaultReceiveHandler@32 -TdiDefaultSendPossibleHandler@12 -TdiDeregisterAddressChangeHandler@4 -TdiDeregisterDeviceObject@4 -TdiDeregisterNetAddress@4 -TdiDeregisterNotificationHandler@4 -TdiInitialize@4 -TdiMapBuffer@4 -TdiMapUserRequest@12 -TdiOpenNetbiosAddress@16 -TdiRegisterAddressChangeHandler@12 -TdiRegisterDeviceObject@8 -TdiRegisterNetAddress@8 -TdiRegisterNotificationHandler@12 -TdiReturnChainedReceives@8 -TdiUnmapBuffer@4 -; EOF diff --git a/reactos/drivers/network/tdi/misc/tdi.spec b/reactos/drivers/network/tdi/misc/tdi.spec new file mode 100644 index 00000000000..a1810644793 --- /dev/null +++ b/reactos/drivers/network/tdi/misc/tdi.spec @@ -0,0 +1,39 @@ + @ stdcall CTEAllocateString(long long) + @ stdcall CTEBlock(long) + @ stdcall CTEInitEvent(long long) + @ stdcall CTEInitString(long long) + @ stdcall CTEInitTimer(long) + @ stdcall CTEInitialize() + @ stdcall CTELogEvent(long long long long long long long) + @ stdcall CTEScheduleEvent(long long) + @ stdcall CTESignal(long long) + @ stdcall CTEStartTimer(long long long long) + @ stdcall CTESystemUpTime() + @ stdcall TdiBuildNetbiosAddress(str long ptr) + @ stdcall TdiBuildNetbiosAddressEa(str long str) + @ stdcall TdiCopyBufferToMdl(ptr long long ptr long ptr) + @ stdcall TdiCopyMdlToBuffer(ptr long long ptr long ptr) + @ stdcall TdiDefaultChainedRcvDatagramHandler(ptr long ptr long ptr long long long ptr ptr) + @ stdcall TdiDefaultChainedRcvExpeditedHandler(ptr ptr long long long ptr ptr) + @ stdcall TdiDefaultChainedReceiveHandler(ptr ptr long long long ptr ptr) + @ stdcall TdiDefaultConnectHandler(ptr long ptr long ptr long ptr ptr ptr) + @ stdcall TdiDefaultDisconnectHandler(ptr ptr long ptr long ptr long) + @ stdcall TdiDefaultErrorHandler(ptr long) + @ stdcall TdiDefaultRcvDatagramHandler(ptr long ptr long ptr long long long ptr ptr ptr) + @ stdcall TdiDefaultRcvExpeditedHandler(ptr ptr long long long ptr ptr ptr) + @ stdcall TdiDefaultReceiveHandler(ptr ptr long long long ptr ptr ptr) + @ stdcall TdiDefaultSendPossibleHandler(ptr ptr long) + @ stdcall TdiDeregisterAddressChangeHandler(ptr) + @ stdcall TdiDeregisterDeviceObject(ptr) + @ stdcall TdiDeregisterNetAddress(ptr) + @ stdcall TdiDeregisterNotificationHandler(ptr) + @ stdcall TdiInitialize(ptr) + @ stdcall TdiMapBuffer(ptr) + @ stdcall TdiMapUserRequest(ptr ptr ptr) + @ stdcall TdiOpenNetbiosAddress(long long long long) + @ stdcall TdiRegisterAddressChangeHandler(long long long) + @ stdcall TdiRegisterDeviceObject(long long) + @ stdcall TdiRegisterNetAddress(long long) + @ stdcall TdiRegisterNotificationHandler(long long long) + @ stdcall TdiReturnChainedReceives(ptr long) + @ stdcall TdiUnmapBuffer(ptr) diff --git a/reactos/drivers/network/tdi/tdi.rbuild b/reactos/drivers/network/tdi/tdi.rbuild index 3a7b059938f..1c658fa50f2 100644 --- a/reactos/drivers/network/tdi/tdi.rbuild +++ b/reactos/drivers/network/tdi/tdi.rbuild @@ -1,7 +1,7 @@ - + ntoskrnl hal From cebadab3ab0cb76898da7557eda87d3e17b2293b Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 14 Apr 2010 14:46:10 +0000 Subject: [PATCH 120/261] [usb/usbehci] - Remove WorkItem code yet again as its not needed. - Set Ports PortChange to STATUS_CONNECTED when detecting insertion of new usb device. - Change UrbWorkerThread to use timer and wait so we dont waste cpu cycles. - Implement IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION. - Upon receiving the IRP_MN_QUERY_DEVICE_RELATIONS with type BusRelation, stop processing the root hub IRPs, as at this point the hub driver has been informed of everything it needs to know about the device. The next SCE request will remain pending until another devices is connected. - Implement ExecuteControlRequest for all control related communications to/from usb devices. - Remove GetDeviceDescriptor and GetDeviceStringDescriptor as no longer needed. - Fix implementation of Direct Call function CreateUsbDevice. - Implement Direct Call functions InitializeUsbDevice and GetUsbDescriptors. - Misc rearranging and clean up. svn path=/trunk/; revision=46867 --- reactos/drivers/usb/usbehci/common.c | 2 - reactos/drivers/usb/usbehci/fdo.c | 40 ++--- reactos/drivers/usb/usbehci/irp.c | 56 ++++--- reactos/drivers/usb/usbehci/pdo.c | 92 ++++++----- reactos/drivers/usb/usbehci/urbreq.c | 177 ++++----------------- reactos/drivers/usb/usbehci/usbehci.c | 5 - reactos/drivers/usb/usbehci/usbehci.h | 12 +- reactos/drivers/usb/usbehci/usbiffn.c | 219 +++++++++++++++++++++++--- reactos/drivers/usb/usbehci/usbiffn.h | 5 +- 9 files changed, 329 insertions(+), 279 deletions(-) diff --git a/reactos/drivers/usb/usbehci/common.c b/reactos/drivers/usb/usbehci/common.c index 79ecbadf25f..7ed7421d8d8 100644 --- a/reactos/drivers/usb/usbehci/common.c +++ b/reactos/drivers/usb/usbehci/common.c @@ -11,8 +11,6 @@ #include "usbehci.h" #include #include -#define NDEBUG -#include /* PUBLIC AND PRIVATE FUNCTIONS ***********************************************/ diff --git a/reactos/drivers/usb/usbehci/fdo.c b/reactos/drivers/usb/usbehci/fdo.c index b85ab4fefc2..c42ebfd1f56 100644 --- a/reactos/drivers/usb/usbehci/fdo.c +++ b/reactos/drivers/usb/usbehci/fdo.c @@ -11,26 +11,6 @@ #include "usbehci.h" #include -//#include "ntstrsafe.h" - -VOID NTAPI -DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context) -{ - PWORKITEM_DATA WorkItemData; - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - - WorkItemData = (PWORKITEM_DATA)Context; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; - - if (PdoDeviceExtension->CallbackRoutine) - PdoDeviceExtension->CallbackRoutine(PdoDeviceExtension->CallbackContext); - else - DPRINT1("PdoDeviceExtension->CallbackRoutine is NULL!\n"); - - IoFreeWorkItem(WorkItemData->IoWorkItem); - ExFreePool(WorkItemData); -} - VOID NTAPI EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) { @@ -60,7 +40,6 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO /* Check for port change on this port */ if (tmp & 0x02) { - PWORKITEM_DATA WorkItemData = NULL; /* Connect or Disconnect? */ if (tmp & 0x01) { @@ -100,17 +79,12 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp = READ_REGISTER_ULONG((PULONG)((Base + EHCI_PORTSC) + (4 * i))); - GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE); PdoDeviceExtension->ChildDeviceCount++; - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED | USB_PORT_STATUS_CONNECT | USB_PORT_STATUS_ENABLE; - WorkItemData = ExAllocatePool(NonPagedPool, sizeof(WORKITEM_DATA)); - if (!WorkItemData) ASSERT(FALSE); - WorkItemData->IoWorkItem = IoAllocateWorkItem(PdoDeviceExtension->DeviceObject); - WorkItemData->PdoDeviceExtension = PdoDeviceExtension; - IoQueueWorkItem(WorkItemData->IoWorkItem, - (PIO_WORKITEM_ROUTINE)DeviceArrivalWorkItem, - DelayedWorkQueue, - WorkItemData); + PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED | USB_PORT_STATUS_CONNECT; + PdoDeviceExtension->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; + + PdoDeviceExtension->HaltQueue = FALSE; + KeSetEvent(&PdoDeviceExtension->QueueDrainedEvent, 0, FALSE); } else { @@ -611,6 +585,10 @@ FdoQueryBusRelations( InitializeListHead(&PdoDeviceExtension->IrpQueue); KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock); + KeInitializeEvent(&PdoDeviceExtension->QueueDrainedEvent, SynchronizationEvent, TRUE); + + ExInitializeFastMutex(&PdoDeviceExtension->ListLock); + Pdo->Flags &= ~DO_DEVICE_INITIALIZING; DeviceExtension->Pdo = Pdo; diff --git a/reactos/drivers/usb/usbehci/irp.c b/reactos/drivers/usb/usbehci/irp.c index 54b3b9738d2..99a601d8ebc 100644 --- a/reactos/drivers/usb/usbehci/irp.c +++ b/reactos/drivers/usb/usbehci/irp.c @@ -62,26 +62,26 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql); - while(!IsListEmpty(&DeviceExtension->IrpQueue)) + while (!IsListEmpty(&DeviceExtension->IrpQueue)) { NextIrp = RemoveHeadList(&DeviceExtension->IrpQueue); Irp = CONTAINING_RECORD(NextIrp, IRP, Tail.Overlay.ListEntry); if (!Irp) break; - Stack = IoGetCurrentIrpStackLocation(Irp); ASSERT(Stack); Urb = (PURB) Stack->Parameters.Others.Argument1; + ASSERT(Urb); Information = 0; Status = STATUS_SUCCESS; - DPRINT1("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); - DPRINT1("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); - DPRINT1("UsbdDeviceHandle = %x\n", Urb->UrbHeader.UsbdDeviceHandle); + DPRINT("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); + DPRINT("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); + DPRINT("UsbdDeviceHandle = %x\n", Urb->UrbHeader.UsbdDeviceHandle); UsbDevice = Urb->UrbHeader.UsbdDeviceHandle; /* UsbdDeviceHandle of 0 is root hub */ @@ -97,14 +97,15 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: { - DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); - DPRINT1("--->TransferBufferLength %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); - DPRINT1("--->TransferBuffer %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBuffer); - DPRINT1("--->PipeHandle %x\n",Urb->UrbBulkOrInterruptTransfer.PipeHandle); - DPRINT1("---->(PVOID)&UsbDevice->EndPointDescriptor %x\n", (PVOID)&UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor); - DPRINT1("--->TransferFlags %x\n", Urb->UrbBulkOrInterruptTransfer.TransferFlags); - + DPRINT("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); + DPRINT("--->TransferBufferLength %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + DPRINT("--->TransferBuffer %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBuffer); + DPRINT("--->PipeHandle %x\n",Urb->UrbBulkOrInterruptTransfer.PipeHandle); + DPRINT("---->(PVOID)&UsbDevice->EndPointDescriptor %x\n", (PVOID)&UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor); + DPRINT("--->TransferFlags %x\n", Urb->UrbBulkOrInterruptTransfer.TransferFlags); + ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL); RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + if (UsbDevice == DeviceExtension->UsbDevices[0]) { if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK)) @@ -112,10 +113,13 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) LONG i; for (i = 0; i < 8; i++) { + if (i == 0){ + DPRINT("PortStatus %x\n", DeviceExtension->Ports[i].PortStatus); + DPRINT("PortChange %x\n", DeviceExtension->Ports[i].PortChange);} if (DeviceExtension->Ports[i].PortChange) { DPRINT1("Inform hub driver that port %d has changed\n", i+1); - ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << (i + 1); + ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7); } } } @@ -123,8 +127,11 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { Urb->UrbHeader.Status = USBD_STATUS_INVALID_PARAMETER; Status = STATUS_UNSUCCESSFUL; + DPRINT1("Invalid transfer flags for SCE\n"); } } + else + DPRINT1("Interrupt Transfer not for hub\n"); break; } case URB_FUNCTION_GET_STATUS_FROM_DEVICE: @@ -132,9 +139,9 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT("Get Status from Device\n"); DPRINT("Index : %d\n", Urb->UrbControlGetStatusRequest.Index); - /* Copied from pvdrivers */ if (Urb->UrbControlGetStatusRequest.Index == 0) { + ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL); *(PUSHORT)Urb->UrbControlGetStatusRequest.TransferBuffer = USB_PORT_STATUS_CONNECT | USB_PORT_STATUS_ENABLE; } else @@ -142,7 +149,6 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT1("Uknown identifier\n"); Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; Status = STATUS_UNSUCCESSFUL; - ASSERT(FALSE); } break; } @@ -157,7 +163,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { Urb->UrbControlDescriptorRequest.TransferBufferLength = sizeof(USB_DEVICE_DESCRIPTOR); } - + ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer != NULL); RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, &UsbDevice->DeviceDescriptor, Urb->UrbControlDescriptorRequest.TransferBufferLength); @@ -177,9 +183,10 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) else { DPRINT1("Buffer to small!!!\n"); - ASSERT(FALSE); + //ASSERT(FALSE); } + ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer); BufPtr = (PUCHAR)Urb->UrbControlDescriptorRequest.TransferBuffer; /* Copy the Configuration Descriptor */ @@ -339,7 +346,9 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT1("Reserved!!!\n"); case USB_DEVICE_CLASS_HUB: { + PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer; + ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); /* FIXME: Handle more than root hub? */ if(Urb->UrbControlVendorClassRequest.TransferBufferLength >= sizeof(USB_HUB_DESCRIPTOR)) { @@ -377,6 +386,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) if (Urb->UrbControlVendorClassRequest.Index == 1) { + ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); ((PULONG)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = 0; } break; @@ -396,7 +406,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) case USB_REQUEST_GET_STATUS: { DPRINT1("OTHER: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); - + ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = DeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = DeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; break; @@ -487,7 +497,6 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) default: { DPRINT1("Unknown Function Class Unknown request\n"); - ASSERT(FALSE); break; } } @@ -497,13 +506,10 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { DPRINT1("Unhandled URB %x\n", Urb->UrbHeader.Function); Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; - ASSERT(FALSE); } } - KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); - Irp->IoStatus.Status = Status; Irp->IoStatus.Information = Information; @@ -514,10 +520,16 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) Urb->UrbHeader.UsbdFlags = 0; } + KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); IoCompleteRequest(Irp, IO_NO_INCREMENT); KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql); + + if (DeviceExtension->HaltQueue) + break; } KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); + if (!DeviceExtension->HaltQueue) + KeSetEvent(&DeviceExtension->QueueDrainedEvent, 0, FALSE); } diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index d38ca6fb608..cf84911afa7 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -8,7 +8,6 @@ */ #define INITGUID -#define NDEBUG #include "usbehci.h" #include @@ -86,42 +85,26 @@ VOID NTAPI UrbWorkerThread(PVOID Context) { PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Context; + NTSTATUS Status; + LARGE_INTEGER DueTime; + PVOID PollEvents[] = { (PVOID) &PdoDeviceExtension->QueueDrainedEvent, (PVOID) &PdoDeviceExtension->Timer }; - while (PdoDeviceExtension->HaltUrbHandling == FALSE) + DueTime.QuadPart = 0; + KeInitializeTimerEx(&PdoDeviceExtension->Timer, SynchronizationTimer); + KeSetTimerEx(&PdoDeviceExtension->Timer, DueTime, 100, NULL); + + while (TRUE) { + Status = KeWaitForMultipleObjects(2, PollEvents, WaitAll, Executive, KernelMode, FALSE, NULL, NULL); + + if (!PdoDeviceExtension->HaltQueue) + KeResetEvent(&PdoDeviceExtension->QueueDrainedEvent); CompletePendingURBRequest(PdoDeviceExtension); - KeStallExecutionProcessor(10); } + DPRINT1("Thread terminated\n"); } -PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) -{ - PUSB_DEVICE UsbDevicePointer = NULL; - UsbDevicePointer = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_DEVICE), USB_POOL_TAG); - - if (!UsbDevicePointer) - { - DPRINT1("Out of memory\n"); - return NULL; - } - - RtlZeroMemory(UsbDevicePointer, sizeof(USB_DEVICE)); - - if ((Hub) && (!Parent)) - { - DPRINT1("This is the root hub\n"); - } - - UsbDevicePointer->Address = DeviceNumber; - UsbDevicePointer->Port = Port; - UsbDevicePointer->ParentDevice = Parent; - - UsbDevicePointer->IsHub = Hub; - - return UsbDevicePointer; -} - NTSTATUS NTAPI PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -147,7 +130,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) Urb = (PURB) Stack->Parameters.Others.Argument1; DPRINT("Header Length %d\n", Urb->UrbHeader.Length); DPRINT("Header Function %d\n", Urb->UrbHeader.Function); - /* Queue all request for now, kernel thread will complete them */ QueueURBRequest(PdoDeviceExtension, Irp); Information = 0; @@ -163,6 +145,8 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) case IOCTL_INTERNAL_USB_ENABLE_PORT: { DPRINT1("IOCTL_INTERNAL_USB_ENABLE_PORT\n"); + Information = 0; + Status = STATUS_SUCCESS; break; } case IOCTL_INTERNAL_USB_GET_BUS_INFO: @@ -244,7 +228,18 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: { + PUSB_IDLE_CALLBACK_INFO CallBackInfo; DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); + /* FIXME: Set Callback for safe power down */ + CallBackInfo = Stack->Parameters.DeviceIoControl.Type3InputBuffer; + DPRINT1("IdleCallback %x\n", CallBackInfo->IdleCallback); + DPRINT1("IdleContext %x\n", CallBackInfo->IdleContext); + + PdoDeviceExtension->IdleCallback = CallBackInfo->IdleCallback; + PdoDeviceExtension->IdleContext = CallBackInfo->IdleContext; + + Information = 0; + Status = STATUS_SUCCESS; break; } default: @@ -392,6 +387,8 @@ PdoDispatchPnp( RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId; RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId; + /* FIXME: Do something better below */ + RootHubDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, sizeof(PVOID) * RootHubDevice->DeviceDescriptor.bNumConfigurations, USB_POOL_TAG); @@ -408,14 +405,9 @@ PdoDispatchPnp( sizeof(USB_ENDPOINT), USB_POOL_TAG); - DPRINT1("before: ActiveConfig %x\n", RootHubDevice->ActiveConfig); RootHubDevice->ActiveConfig = RootHubDevice->Configs[0]; - DPRINT1("after: ActiveConfig %x\n", RootHubDevice->ActiveConfig); - - DPRINT1("before: ActiveConfig->Interfaces[0] %x\n", RootHubDevice->ActiveConfig->Interfaces[0]); RootHubDevice->ActiveInterface = RootHubDevice->ActiveConfig->Interfaces[0]; - RtlCopyMemory(&RootHubDevice->ActiveConfig->ConfigurationDescriptor, ROOTHUB2_CONFIGURATION_DESCRIPTOR, sizeof(ROOTHUB2_CONFIGURATION_DESCRIPTOR)); @@ -433,6 +425,7 @@ PdoDispatchPnp( PdoDeviceExtension->UsbDevices[0] = RootHubDevice; /* Create a thread to handle the URB's */ + Status = PsCreateSystemThread(&PdoDeviceExtension->ThreadHandle, THREAD_ALL_ACCESS, NULL, @@ -454,7 +447,8 @@ PdoDispatchPnp( { Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); DPRINT1("Set interface state %x\n", Status); - if (!NT_SUCCESS(Status)) ASSERT(FALSE); + if (!NT_SUCCESS(Status)) + ASSERT(FALSE); } Status = STATUS_SUCCESS; @@ -472,7 +466,19 @@ PdoDispatchPnp( break; } case BusRelations: + { + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + DPRINT1("BusRelations!!!!!\n"); + + /* The hub driver has created the new device object and reported to pnp, as a result the pnp manager + has resent this IRP and type, so leave the next SCE request pending until a new device arrives. + Is there a better way to do this */ + ExAcquireFastMutex(&PdoDeviceExtension->ListLock); + PdoDeviceExtension->HaltQueue = TRUE; + ExReleaseFastMutex(&PdoDeviceExtension->ListLock); + } case RemovalRelations: case EjectionRelations: { @@ -553,9 +559,9 @@ PdoDispatchPnp( DPRINT1("Failed to create string from GUID!\n"); } - DPRINT1("Interface GUID requested %wZ\n", &GuidString); - DPRINT1("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); - DPRINT1("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); + DPRINT("Interface GUID requested %wZ\n", &GuidString); + DPRINT("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); + DPRINT("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); /* Assume success */ Status = STATUS_SUCCESS; @@ -606,7 +612,7 @@ PdoDispatchPnp( } if (Stack->Parameters.QueryInterface.Version >= 6) { - DPRINT1("Unknown version!\n"); + DPRINT1("USB_BUS_INTERFACE_HUB_GUID version not supported!\n"); } break; } @@ -638,12 +644,12 @@ PdoDispatchPnp( if (Stack->Parameters.QueryInterface.Version >= 3) { - DPRINT1("Not Supported!\n"); + DPRINT1("SB_BUS_INTERFACE_USBDI_GUID version not supported!\n"); } break; } - DPRINT1("Not Supported\n"); + DPRINT1("GUID Not Supported\n"); Status = Irp->IoStatus.Status; Information = Irp->IoStatus.Information; diff --git a/reactos/drivers/usb/usbehci/urbreq.c b/reactos/drivers/usb/usbehci/urbreq.c index d9a85ba1338..cbd18452757 100644 --- a/reactos/drivers/usb/usbehci/urbreq.c +++ b/reactos/drivers/usb/usbehci/urbreq.c @@ -15,7 +15,7 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD1, PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD2, PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD3, - PEHCI_SETUP_FORMAT *CtrlSetup, + PUSB_DEFAULT_PIPE_SETUP_PACKET *CtrlSetup, PVOID *CtrlData, ULONG Size) { @@ -67,15 +67,15 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, *CtrlTD3 = (PQUEUE_TRANSFER_DESCRIPTOR) (((ULONG)(*CtrlTD2) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0x1F) & ~0x1F); /* Must be Page aligned */ - *CtrlSetup = (PEHCI_SETUP_FORMAT) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF) & ~0xFFF); - *CtrlData = (PUSB_DEVICE_DESCRIPTOR) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF) & ~0xFFF); + *CtrlSetup = (PUSB_DEFAULT_PIPE_SETUP_PACKET) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF) & ~0xFFF); + *CtrlData = (PVOID) (( (ULONG)(*CtrlSetup) + sizeof(USB_DEFAULT_PIPE_SETUP_PACKET) + 0xFFF) & ~0xFFF); (*CtrlTD1)->NextPointer = TERMINATE_POINTER; (*CtrlTD1)->AlternateNextPointer = TERMINATE_POINTER; (*CtrlTD1)->BufferPointer[0] = (ULONG)MmGetPhysicalAddress((PVOID) (*CtrlSetup)).LowPart; (*CtrlTD1)->Token.Bits.DataToggle = FALSE; (*CtrlTD1)->Token.Bits.InterruptOnComplete = FALSE; - (*CtrlTD1)->Token.Bits.TotalBytesToTransfer = sizeof(EHCI_SETUP_FORMAT); + (*CtrlTD1)->Token.Bits.TotalBytesToTransfer = sizeof(USB_DEFAULT_PIPE_SETUP_PACKET); (*CtrlTD1)->Token.Bits.ErrorCounter = 0x03; (*CtrlTD1)->Token.Bits.PIDCode = PID_CODE_SETUP_TOKEN; (*CtrlTD1)->Token.Bits.Active = TRUE; @@ -105,46 +105,48 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, } BOOLEAN -GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub) +ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, UCHAR Address, ULONG Port, PVOID Buffer, ULONG BufferLength) { - PEHCI_SETUP_FORMAT CtrlSetup = NULL; - PUSB_DEVICE_DESCRIPTOR CtrlData = NULL; + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup = NULL; + PVOID CtrlData = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL; + PQUEUE_HEAD QueueHead; PEHCI_USBCMD_CONTENT UsbCmd; PEHCI_USBSTS_CONTEXT UsbSts; LONG Base; LONG tmp; + DPRINT1("ExecuteControlRequest: Buffer %x, Length %x\n", Buffer, BufferLength); + Base = (ULONG) DeviceExtension->ResourceMemory; /* Set up the QUEUE HEAD in memory */ QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr); + /* Initialize the memory pointers */ IntializeHeadQueueForStandardRequest(QueueHead, &CtrlTD1, &CtrlTD2, &CtrlTD3, &CtrlSetup, (PVOID)&CtrlData, - sizeof(USB_DEVICE_DESCRIPTOR)); + BufferLength); - /* FIXME: Use defines and handle other than Device Desciptors */ - if (Hub) - { - CtrlSetup->bmRequestType = 0x80; - CtrlSetup->wValue = 0x0600; - } - else - { - CtrlSetup->bmRequestType = 0x80; - CtrlSetup->wValue = 0x0100; - } - CtrlSetup->bRequest = 0x06; - CtrlSetup->wIndex = 0; - CtrlSetup->wLength = sizeof(USB_DEVICE_DESCRIPTOR); + CtrlSetup->bmRequestType._BM.Recipient = SetupPacket->bmRequestType._BM.Recipient; + CtrlSetup->bmRequestType._BM.Type = SetupPacket->bmRequestType._BM.Type; + CtrlSetup->bmRequestType._BM.Dir = SetupPacket->bmRequestType._BM.Dir; + CtrlSetup->bRequest = SetupPacket->bRequest; + CtrlSetup->wValue.LowByte = SetupPacket->wValue.LowByte; + CtrlSetup->wValue.HiByte = SetupPacket->wValue.HiByte; + CtrlSetup->wIndex.W = SetupPacket->wIndex.W; + CtrlSetup->wLength = SetupPacket->wLength; + + + QueueHead->EndPointCapabilities1.DeviceAddress = Address; + //QueueHead->EndPointCapabilities2.PortNumber = Port; tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; @@ -190,136 +192,15 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEV break; } - if (OutBuffer != NULL) + if (CtrlSetup->bmRequestType._BM.Dir == BMREQUEST_DEVICE_TO_HOST) { - OutBuffer->bLength = CtrlData->bLength; - OutBuffer->bDescriptorType = CtrlData->bDescriptorType; - OutBuffer->bcdUSB = CtrlData->bcdUSB; - OutBuffer->bDeviceClass = CtrlData->bDeviceClass; - OutBuffer->bDeviceSubClass = CtrlData->bDeviceSubClass; - OutBuffer->bDeviceProtocol = CtrlData->bDeviceProtocol; - OutBuffer->bMaxPacketSize0 = CtrlData->bMaxPacketSize0; - OutBuffer->idVendor = CtrlData->idVendor; - OutBuffer->idProduct = CtrlData->idProduct; - OutBuffer->bcdDevice = CtrlData->bcdDevice; - OutBuffer->iManufacturer = CtrlData->iManufacturer; - OutBuffer->iProduct = CtrlData->iProduct; - OutBuffer->iSerialNumber = CtrlData->iSerialNumber; - OutBuffer->bNumConfigurations = CtrlData->bNumConfigurations; - } - - DPRINT1("bLength %d\n", CtrlData->bLength); - DPRINT1("bDescriptorType %x\n", CtrlData->bDescriptorType); - DPRINT1("bcdUSB %x\n", CtrlData->bcdUSB); - DPRINT1("CtrlData->bDeviceClass %x\n", CtrlData->bDeviceClass); - DPRINT1("CtrlData->bDeviceSubClass %x\n", CtrlData->bDeviceSubClass); - DPRINT1("CtrlData->bDeviceProtocal %x\n", CtrlData->bDeviceProtocol); - DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize0); - DPRINT1("CtrlData->idVendor %x\n", CtrlData->idVendor); - DPRINT1("CtrlData->idProduct %x\n", CtrlData->idProduct); - DPRINT1("CtrlData->bcdDevice %x\n", CtrlData->bcdDevice); - DPRINT1("CtrlData->iManufacturer %x\n", CtrlData->iManufacturer); - DPRINT1("CtrlData->iProduct %x\n", CtrlData->iProduct); - DPRINT1("CtrlData->iSerialNumber %x\n", CtrlData->iSerialNumber); - DPRINT1("CtrlData->bNumConfigurations %x\n", CtrlData->bNumConfigurations); - - /* Temporary: Remove */ - if (CtrlData->bLength > 0) - { - /* We got valid data, try for strings */ - UCHAR Manufacturer = CtrlData->iManufacturer; - UCHAR Product = CtrlData->iProduct; - UCHAR SerialNumber = CtrlData->iSerialNumber; - - GetDeviceStringDescriptor(DeviceExtension, Manufacturer); - GetDeviceStringDescriptor(DeviceExtension, Product); - GetDeviceStringDescriptor(DeviceExtension, SerialNumber); - } - - return TRUE; -} - -BOOLEAN -GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) -{ - PEHCI_SETUP_FORMAT CtrlSetup = NULL; - PSTRING_DESCRIPTOR CtrlData = NULL; - PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL; - PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL; - PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL; - PQUEUE_HEAD QueueHead; - PEHCI_USBCMD_CONTENT UsbCmd; - PEHCI_USBSTS_CONTEXT UsbSts; - LONG Base; - LONG tmp; - - Base = (ULONG) DeviceExtension->ResourceMemory; - - /* Set up the QUEUE HEAD in memory */ - QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr); - - IntializeHeadQueueForStandardRequest(QueueHead, - &CtrlTD1, - &CtrlTD2, - &CtrlTD3, - &CtrlSetup, - (PVOID)&CtrlData, - sizeof(STRING_DESCRIPTOR) + 256); - - /* FIXME: Use defines and handle other than Device Desciptors */ - CtrlSetup->bmRequestType = 0x80; - CtrlSetup->bRequest = 0x06; - CtrlSetup->wValue = 0x0300 | Index; - CtrlSetup->wIndex = 0; - /* 256 pulled from thin air */ - CtrlSetup->wLength = sizeof(STRING_DESCRIPTOR) + 256; - - tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); - UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; - UsbCmd->Run = FALSE; - WRITE_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD), tmp); - - /* Wait for the controller to halt */ - for (;;) - { - KeStallExecutionProcessor(10); - tmp = READ_REGISTER_ULONG((PULONG)(Base + EHCI_USBSTS)); - UsbSts = (PEHCI_USBSTS_CONTEXT)&tmp; - DPRINT("Waiting for Halt, USBSTS: %x\n", READ_REGISTER_ULONG ((PULONG)(Base + EHCI_USBSTS))); - if (UsbSts->HCHalted) + if ((Buffer) && (BufferLength)) { - break; + RtlCopyMemory(Buffer, CtrlData, BufferLength); } + else + DPRINT1("Unable to copy data to buffer\n"); } - /* Set to TRUE on interrupt for async completion */ - DeviceExtension->AsyncComplete = FALSE; - QueueHead->QETDPointer = (ULONG) MmGetPhysicalAddress((PVOID)(CtrlTD1)).LowPart; - - tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); - UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; - UsbCmd->AsyncEnable = TRUE; - - WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp); - - tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); - UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; - - /* Interrupt on Async completion */ - UsbCmd->DoorBell = TRUE; - UsbCmd->Run = TRUE; - WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp); - - for (;;) - { - KeStallExecutionProcessor(10); - DPRINT("Waiting for completion!\n"); - if (DeviceExtension->AsyncComplete == TRUE) - break; - } - - DPRINT1("String %S\n", &CtrlData->bString); - return TRUE; } - diff --git a/reactos/drivers/usb/usbehci/usbehci.c b/reactos/drivers/usb/usbehci/usbehci.c index 15540694bf1..0f35a318f02 100644 --- a/reactos/drivers/usb/usbehci/usbehci.c +++ b/reactos/drivers/usb/usbehci/usbehci.c @@ -9,11 +9,6 @@ /* DEFINES *******************************************************************/ #include "usbehci.h" -#define NDEBUG - -/* INCLUDES *******************************************************************/ -#include - static NTSTATUS NTAPI IrpStub(PDEVICE_OBJECT DeviceObject, PIRP Irp) diff --git a/reactos/drivers/usb/usbehci/usbehci.h b/reactos/drivers/usb/usbehci/usbehci.h index 6d6a570ce98..56f03b5b491 100644 --- a/reactos/drivers/usb/usbehci/usbehci.h +++ b/reactos/drivers/usb/usbehci/usbehci.h @@ -407,11 +407,16 @@ typedef struct _PDO_DEVICE_EXTENSION PIRP CurrentIrp; HANDLE ThreadHandle; ULONG ChildDeviceCount; - BOOLEAN HaltUrbHandling; + BOOLEAN HaltQueue; PVOID CallbackContext; RH_INIT_CALLBACK *CallbackRoutine; + USB_IDLE_CALLBACK IdleCallback; + PVOID IdleContext; ULONG NumberOfPorts; EHCIPORTS Ports[32]; + KTIMER Timer; + KEVENT QueueDrainedEvent; + FAST_MUTEX ListLock; } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; typedef struct _WORKITEM_DATA @@ -459,10 +464,7 @@ NTSTATUS NTAPI PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp); BOOLEAN -GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub); - -BOOLEAN -GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index); +ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, UCHAR Address, ULONG Port, PVOID Buffer, ULONG BufferLength); VOID QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp); diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c index 77d4b0f70b6..4dd98f4212d 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.c +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -10,8 +10,33 @@ #include "usbehci.h" #include #include -#define NDEBUG -#include + +PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) +{ + PUSB_DEVICE UsbDevicePointer = NULL; + UsbDevicePointer = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_DEVICE), USB_POOL_TAG); + + if (!UsbDevicePointer) + { + DPRINT1("Out of memory\n"); + return NULL; + } + + RtlZeroMemory(UsbDevicePointer, sizeof(USB_DEVICE)); + + if ((Hub) && (!Parent)) + { + DPRINT1("This is the root hub\n"); + } + + UsbDevicePointer->Address = DeviceNumber; + UsbDevicePointer->Port = Port; + UsbDevicePointer->ParentDevice = Parent; + + UsbDevicePointer->IsHub = Hub; + + return UsbDevicePointer; +} BOOLEAN IsHandleValid(PVOID BusContext, @@ -57,33 +82,158 @@ CreateUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, USHORT PortStatus, USHORT PortNumber) { - DPRINT1("CreateUsbDevice called\n"); - DPRINT1("PortStatus %x\n", PortStatus); - DPRINT1("PortNumber %x\n", PortNumber); - *NewDevice = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_DEVICE), USB_POOL_TAG); + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PUSB_DEVICE UsbDevice; + LONG i = 0; + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; + DPRINT1("CreateUsbDevice: HubDeviceHandle %x, PortStatus %x, PortNumber %x\n", HubDeviceHandle, PortStatus, PortNumber); + UsbDevice = InternalCreateUsbDevice(PdoDeviceExtension->ChildDeviceCount, PortNumber, HubDeviceHandle, FALSE); + + /* Add it to the list */ + while (TRUE) + { + if (PdoDeviceExtension->UsbDevices[i] == NULL) + { + PdoDeviceExtension->UsbDevices[i] = (PUSB_DEVICE)UsbDevice; + PdoDeviceExtension->UsbDevices[i]->Address = i + 1; + PdoDeviceExtension->UsbDevices[i]->Port = PortNumber; + break; + } + i++; + } + + /* Return it */ + *NewDevice = UsbDevice; return STATUS_SUCCESS; } +/* Called when SCE reports a change */ +/* FIXME: Do something better for memory */ NTSTATUS USB_BUSIFFN InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) { PPDO_DEVICE_EXTENSION PdoDeviceExtension; - LONG i; - DPRINT1("InitializeUsbDevice called\n"); + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc; + PUSB_INTERFACE_DESCRIPTOR InterfaceDesc; + PUSB_ENDPOINT_DESCRIPTOR EndpointDesc; + PUSB_DEVICE UsbDevice; + BOOLEAN ResultOk; + PVOID Buffer; + PUCHAR Ptr; + LONG i, j, k; + DPRINT1("InitializeUsbDevice called, device %x\n", DeviceHandle); PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; - /* Find the device handle */ - for (i = 0; i < PdoDeviceExtension->ChildDeviceCount; i++) + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + UsbDevice = (PUSB_DEVICE) DeviceHandle; + + Buffer = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, USB_POOL_TAG); + + if (!Buffer) { - if (DeviceHandle == PdoDeviceExtension->UsbDevices[i]) + DPRINT1("Out of memory\n"); + return STATUS_NO_MEMORY; + } + + Ptr = Buffer; + /* Set the device address */ + CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; + CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; + CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_HOST_TO_DEVICE; + CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS; + CtrlSetup.wValue.W = UsbDevice->Address; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = 0; + + ResultOk = ExecuteControlRequest(FdoDeviceExtension, &CtrlSetup, 0, 0, NULL, 0); + + /* Get the Device Descriptor */ + CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; + CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; + CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_DEVICE_TO_HOST; + CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; + CtrlSetup.wValue.LowByte = 0; + CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR); + + ResultOk = ExecuteControlRequest(FdoDeviceExtension, &CtrlSetup, UsbDevice->Address, UsbDevice->Port, + &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); + + DPRINT1("bLength %x\n", UsbDevice->DeviceDescriptor.bLength); + DPRINT1("bDescriptorType %x\n", UsbDevice->DeviceDescriptor.bDescriptorType); + DPRINT1("bNumDescriptors %x\n", UsbDevice->DeviceDescriptor.bNumConfigurations); + + if (UsbDevice->DeviceDescriptor.bNumConfigurations == 0) + return STATUS_DEVICE_DATA_ERROR; + + UsbDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PVOID) * UsbDevice->DeviceDescriptor.bNumConfigurations, + USB_POOL_TAG); + + if (!UsbDevice->Configs) + { + DPRINT1("Out of memory\n"); + return STATUS_NO_MEMORY; + } + + for (i = 0; i < UsbDevice->DeviceDescriptor.bNumConfigurations; i++) + { + /* Get the Device Configuration Descriptor */ + CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; + CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; + CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_DEVICE_TO_HOST; + CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; + CtrlSetup.wValue.LowByte = 0; + CtrlSetup.wValue.HiByte = USB_CONFIGURATION_DESCRIPTOR_TYPE; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = PAGE_SIZE; + + ResultOk = ExecuteControlRequest(FdoDeviceExtension, &CtrlSetup, UsbDevice->Address, UsbDevice->Port, Buffer, PAGE_SIZE); + + ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)Ptr; + + ASSERT(ConfigDesc->wTotalLength <= PAGE_SIZE); + + UsbDevice->Configs[i] = ExAllocatePoolWithTag(NonPagedPool, + sizeof(USB_CONFIGURATION) + sizeof(PVOID) * ConfigDesc->bNumInterfaces, + USB_POOL_TAG); + UsbDevice->Configs[i]->Device = UsbDevice; + RtlCopyMemory(&UsbDevice->Configs[0]->ConfigurationDescriptor, + ConfigDesc, sizeof(USB_CONFIGURATION_DESCRIPTOR)); + Ptr += ConfigDesc->bLength; + + for (j = 0; j < ConfigDesc->bNumInterfaces; j++) { - DPRINT1("Device Handle Found!\n"); - return STATUS_SUCCESS; + InterfaceDesc = (PUSB_INTERFACE_DESCRIPTOR) Ptr; + UsbDevice->Configs[i]->Interfaces[j] = ExAllocatePoolWithTag(NonPagedPool, + sizeof(USB_INTERFACE) + sizeof(PVOID) * InterfaceDesc->bNumEndpoints, + USB_POOL_TAG); + RtlCopyMemory(&UsbDevice->Configs[i]->Interfaces[j]->InterfaceDescriptor, + InterfaceDesc, + sizeof(USB_INTERFACE_DESCRIPTOR)); + + Ptr += InterfaceDesc->bLength; + + for (k = 0; k < InterfaceDesc->bNumEndpoints; k++) + { + EndpointDesc = (PUSB_ENDPOINT_DESCRIPTOR)Ptr; + UsbDevice->Configs[i]->Interfaces[j]->EndPoints[k] = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_ENDPOINT), USB_POOL_TAG); + RtlCopyMemory(&UsbDevice->Configs[i]->Interfaces[j]->EndPoints[k]->EndPointDescriptor, + EndpointDesc, sizeof(USB_ENDPOINT_DESCRIPTOR)); + } + } } - return STATUS_DEVICE_DATA_ERROR; + + UsbDevice->ActiveConfig = UsbDevice->Configs[0]; + UsbDevice->ActiveInterface = UsbDevice->Configs[0]->Interfaces[0]; + + return STATUS_SUCCESS; } NTSTATUS @@ -92,10 +242,25 @@ GetUsbDescriptors(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, PUCHAR DeviceDescriptorBuffer, PULONG DeviceDescriptorBufferLength, - PUCHAR ConfigurationBuffer, + PUCHAR ConfigDescriptorBuffer, PULONG ConfigDescriptorBufferLength) { - DPRINT1("GetUsbDescriptor called\n"); + PUSB_DEVICE UsbDevice; + DPRINT1("GetUsbDescriptor %x, %d, %x, %d\n", DeviceDescriptorBuffer, DeviceDescriptorBufferLength, ConfigDescriptorBuffer, ConfigDescriptorBufferLength); + + UsbDevice = (PUSB_DEVICE) DeviceHandle; + + if ((DeviceDescriptorBuffer) && (DeviceDescriptorBufferLength)) + { + RtlCopyMemory(DeviceDescriptorBuffer, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); + *DeviceDescriptorBufferLength = sizeof(USB_DEVICE_DESCRIPTOR); + } + if ((ConfigDescriptorBuffer) && (ConfigDescriptorBufferLength)) + { + RtlCopyMemory(ConfigDescriptorBuffer, &UsbDevice->ActiveConfig->ConfigurationDescriptor, sizeof(USB_CONFIGURATION_DESCRIPTOR)); + *ConfigDescriptorBufferLength = sizeof(USB_CONFIGURATION_DESCRIPTOR); + } + return STATUS_SUCCESS; } @@ -104,7 +269,7 @@ USB_BUSIFFN RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags) { DPRINT1("RemoveUsbDevice called\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } NTSTATUS @@ -189,6 +354,7 @@ GetControllerInformation(PVOID BusContext, PUSB_CONTROLLER_INFORMATION_0 ControllerInfo; DPRINT1("GetControllerInformation called\n"); + ControllerInfo = ControllerInformationBuffer; if (ControllerInformationBufferLength < sizeof(USB_CONTROLLER_INFORMATION_0)) @@ -267,10 +433,10 @@ GetRootHubSymbolicName(PVOID BusContext, { DPRINT1("GetRootHubSymbolicName called\n"); - if (HubSymNameBufferLength < 20) + if (HubSymNameBufferLength < 16) return STATUS_UNSUCCESSFUL; - RtlCopyMemory(HubSymNameBuffer, L"ROOT_HUB20", HubSymNameBufferLength); - *HubSymNameActualLength = 20; + RtlCopyMemory(HubSymNameBuffer, L"ROOT_HUB", HubSymNameBufferLength); + *HubSymNameActualLength = 16; return STATUS_SUCCESS; } @@ -292,7 +458,6 @@ Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCo /* FIXME: */ /* Create the Irp Queue for SCE */ /* Should queue be created for each device or each enpoint??? */ - return STATUS_SUCCESS; } @@ -306,6 +471,17 @@ RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBA PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; PdoDeviceExtension->CallbackContext = CallbackContext; PdoDeviceExtension->CallbackRoutine = CallbackRoutine; + if (PdoDeviceExtension->CallbackRoutine) + { + DPRINT1("Called Callbackrountine\n"); + PdoDeviceExtension->CallbackRoutine(PdoDeviceExtension->CallbackContext); + DPRINT1("Done Callbackrountine\n"); + } + else + { + DPRINT1("PdoDeviceExtension->CallbackRoutine is NULL!\n"); + } + return STATUS_SUCCESS; } @@ -377,4 +553,3 @@ EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P DPRINT1("EnumLogEntry called\n"); return STATUS_NOT_SUPPORTED; } - diff --git a/reactos/drivers/usb/usbehci/usbiffn.h b/reactos/drivers/usb/usbehci/usbiffn.h index 47f86219b64..eff48f0eac7 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.h +++ b/reactos/drivers/usb/usbehci/usbiffn.h @@ -5,6 +5,9 @@ #include #include +PVOID +InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub); + VOID USB_BUSIFFN InterfaceReference(PVOID BusContext); @@ -30,7 +33,7 @@ GetUsbDescriptors(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, PUCHAR DeviceDescriptorBuffer, PULONG DeviceDescriptorBufferLength, - PUCHAR ConfigurationBuffer, + PUCHAR ConfigDescriptorBuffer, PULONG ConfigDescriptorBufferLength); NTSTATUS From 640fb7d2220b6493782c25f70eac4ee561c5e214 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Wed, 14 Apr 2010 19:08:27 +0000 Subject: [PATCH 121/261] [DESK] - Create a function for updating the currently selected theme id - Call this function before saving theme data to the registry, fixes saving invalid theme indexes - Remove unnecessary header tags See issue #5016 for more details. svn path=/trunk/; revision=46870 --- reactos/dll/cpl/desk/appearance.c | 15 ++++++++++----- reactos/dll/cpl/desk/effappdlg.c | 3 +-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/reactos/dll/cpl/desk/appearance.c b/reactos/dll/cpl/desk/appearance.c index 9a09169283b..c3c21d4cd13 100644 --- a/reactos/dll/cpl/desk/appearance.c +++ b/reactos/dll/cpl/desk/appearance.c @@ -1,5 +1,4 @@ -/* $Id$ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Display Control Panel * FILE: lib/cpl/desk/appearance.c @@ -486,11 +485,17 @@ AppearancePage_OnDestroy(HWND hwndDlg, GLOBALS *g) return TRUE; } +static void +UpdateSelectedThemeId(HWND hwndDlg, GLOBALS *g) +{ + int sel; + sel = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETCURSEL, 0, 0); + g->Theme.Id = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETITEMDATA, (WPARAM)sel, 0); +} INT_PTR CALLBACK AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - INT i; GLOBALS *g; LPNMHDR lpnm; @@ -538,8 +543,7 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PropSheet_Changed(GetParent(hwndDlg), hwndDlg); g->Theme.bHasChanged = TRUE; - i = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETCURSEL, 0, 0); - g->Theme.Id = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETITEMDATA, (WPARAM)i, 0); + UpdateSelectedThemeId(hwndDlg, g); LoadThemeFromReg(g); //SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, WM_PAINT, 0, 0); } @@ -557,6 +561,7 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case PSN_APPLY: if (g->Theme.bHasChanged) { + UpdateSelectedThemeId(hwndDlg, g); ApplyTheme(g); } return TRUE; diff --git a/reactos/dll/cpl/desk/effappdlg.c b/reactos/dll/cpl/desk/effappdlg.c index 6fd0ac7ba8d..3a7c8b4e0e3 100644 --- a/reactos/dll/cpl/desk/effappdlg.c +++ b/reactos/dll/cpl/desk/effappdlg.c @@ -1,5 +1,4 @@ -/* $Id: effappdlg.c 24836 2007-02-12 03:12:56Z tkreuzer $ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Display Control Panel * FILE: dll/cpl/desk/effappdlg.c From 76a82f09959c3d69d25dda7fb3317614c82fa909 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Wed, 14 Apr 2010 20:43:23 +0000 Subject: [PATCH 122/261] [NOTEPAD] Convert NULL characters to spaces when reading binary files See issue #3573 for more details. svn path=/trunk/; revision=46873 --- reactos/base/applications/notepad/text.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/reactos/base/applications/notepad/text.c b/reactos/base/applications/notepad/text.c index 6ca1907dbd6..ed1015d04e9 100644 --- a/reactos/base/applications/notepad/text.c +++ b/reactos/base/applications/notepad/text.c @@ -51,7 +51,7 @@ BOOL ReadText(HANDLE hFile, LPWSTR *ppszText, DWORD *pdwTextLen, int *piEncoding { DWORD dwSize; LPBYTE pBytes = NULL; - LPCWSTR pszText; + LPWSTR pszText; LPWSTR pszAllocText = NULL; DWORD dwPos, i; DWORD dwCharCount; @@ -110,7 +110,7 @@ BOOL ReadText(HANDLE hFile, LPWSTR *ppszText, DWORD *pdwTextLen, int *piEncoding /* fall through */ case ENCODING_UNICODE: - pszText = (LPCWSTR) &pBytes[dwPos]; + pszText = (LPWSTR) &pBytes[dwPos]; dwCharCount = (dwSize - dwPos) / sizeof(WCHAR); break; @@ -174,6 +174,10 @@ BOOL ReadText(HANDLE hFile, LPWSTR *ppszText, DWORD *pdwTextLen, int *piEncoding else adwEolnCount[EOLN_LF]++; break; + + case '\0': + pszText[i] = ' '; + break; } } From 8886915477b1414908e3575420fcefd72a680785 Mon Sep 17 00:00:00 2001 From: Jeffrey Morlan Date: Thu, 15 Apr 2010 00:25:30 +0000 Subject: [PATCH 123/261] [WIN32K] Since r43772 we now normalize VK_LCONTROL/VK_RCONTROL to VK_CONTROL rather than VK_LCONTROL (and ditto for shift/alt), so update SetKeyState to handle this. Fixes bug 4945. svn path=/trunk/; revision=46875 --- reactos/subsystems/win32/win32k/ntuser/keyboard.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index 0c935a478e0..813137856fc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/keyboard.c @@ -88,12 +88,12 @@ static VOID APIENTRY SetKeyState(DWORD key, DWORD vk, DWORD ext, BOOL down) gQueueKeyStateTable[vk] ^= KS_LOCK_BIT; } - if (ext && vk == VK_LSHIFT) - vk = VK_RSHIFT; - if (ext && vk == VK_LCONTROL) - vk = VK_RCONTROL; - if (ext && vk == VK_LMENU) - vk = VK_RMENU; + if (vk == VK_SHIFT) + vk = ext ? VK_RSHIFT : VK_LSHIFT; + if (vk == VK_CONTROL) + vk = ext ? VK_RCONTROL : VK_LCONTROL; + if (vk == VK_MENU) + vk = ext ? VK_RMENU : VK_LMENU; if (down) gQueueKeyStateTable[vk] |= KS_DOWN_BIT; From 6654252a3d61beb15e75f3a7588eb3891411868a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 15 Apr 2010 01:59:15 +0000 Subject: [PATCH 124/261] [PCMCIA] - Add a mostly stubbed PCMCIA driver - pcmcia.c is complete but fdo.c and pdo.c are completely unimplemented svn path=/trunk/; revision=46876 --- reactos/drivers/bus/directory.rbuild | 3 + reactos/drivers/bus/pcmcia/fdo.c | 25 +++ reactos/drivers/bus/pcmcia/pcmcia.c | 217 +++++++++++++++++++++++ reactos/drivers/bus/pcmcia/pcmcia.h | 51 ++++++ reactos/drivers/bus/pcmcia/pcmcia.rbuild | 12 ++ reactos/drivers/bus/pcmcia/pcmcia.rc | 5 + reactos/drivers/bus/pcmcia/pdo.c | 34 ++++ 7 files changed, 347 insertions(+) create mode 100644 reactos/drivers/bus/pcmcia/fdo.c create mode 100644 reactos/drivers/bus/pcmcia/pcmcia.c create mode 100644 reactos/drivers/bus/pcmcia/pcmcia.h create mode 100644 reactos/drivers/bus/pcmcia/pcmcia.rbuild create mode 100644 reactos/drivers/bus/pcmcia/pcmcia.rc create mode 100644 reactos/drivers/bus/pcmcia/pdo.c diff --git a/reactos/drivers/bus/directory.rbuild b/reactos/drivers/bus/directory.rbuild index 11a8fbe3852..fc752ff4e18 100644 --- a/reactos/drivers/bus/directory.rbuild +++ b/reactos/drivers/bus/directory.rbuild @@ -13,4 +13,7 @@ + + + diff --git a/reactos/drivers/bus/pcmcia/fdo.c b/reactos/drivers/bus/pcmcia/fdo.c new file mode 100644 index 00000000000..348fd1cf9ea --- /dev/null +++ b/reactos/drivers/bus/pcmcia/fdo.c @@ -0,0 +1,25 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel + * FILE: drivers/bus/pcmcia/fdo.c + * PURPOSE: PCMCIA Bus Driver + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ + +#include + +//#define NDEBUG +#include + +NTSTATUS +NTAPI +PcmciaFdoPlugPlay(PPCMCIA_FDO_EXTENSION FdoExt, + PIRP Irp) +{ + UNIMPLEMENTED + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_NOT_SUPPORTED; +} + diff --git a/reactos/drivers/bus/pcmcia/pcmcia.c b/reactos/drivers/bus/pcmcia/pcmcia.c new file mode 100644 index 00000000000..b9c32579bec --- /dev/null +++ b/reactos/drivers/bus/pcmcia/pcmcia.c @@ -0,0 +1,217 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel + * FILE: drivers/bus/pcmcia/pcmcia.c + * PURPOSE: PCMCIA Bus Driver + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ + +#include + +//#define NDEBUG +#include + +NTSTATUS +NTAPI +PcmciaCreateClose(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + DPRINT("PCMCIA: Create/Close\n"); + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +PcmciaDeviceControl(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status; + + DPRINT("PCMCIA: DeviceIoControl\n"); + + Irp->IoStatus.Information = 0; + + switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) + { + default: + DPRINT1("PCMCIA: Unknown ioctl code: %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode); + Status = STATUS_NOT_SUPPORTED; + } + + Irp->IoStatus.Status = Status; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; +} + +VOID +NTAPI +PcmciaUnload(PDRIVER_OBJECT DriverObject) +{ + DPRINT("PCMCIA: Unload\n"); +} + +NTSTATUS +NTAPI +PcmciaPlugPlay(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PPCMCIA_COMMON_EXTENSION Common = DeviceObject->DeviceExtension; + + DPRINT("PCMCIA: PnP\n"); + if (Common->IsFDO) + { + return PcmciaFdoPlugPlay((PPCMCIA_FDO_EXTENSION)Common, + Irp); + } + else + { + return PcmciaPdoPlugPlay((PPCMCIA_PDO_EXTENSION)Common, + Irp); + } +} + +NTSTATUS +NTAPI +PcmciaPower(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PPCMCIA_COMMON_EXTENSION Common = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status; + + switch (IrpSp->MinorFunction) + { + case IRP_MN_QUERY_POWER: + /* I don't see any reason that we should care */ + DPRINT("PCMCIA: IRP_MN_QUERY_POWER\n"); + Status = STATUS_SUCCESS; + break; + + case IRP_MN_POWER_SEQUENCE: + DPRINT("PCMCIA: IRP_MN_POWER_SEQUENCE\n"); + RtlCopyMemory(IrpSp->Parameters.PowerSequence.PowerSequence, + &Common->PowerSequence, + sizeof(POWER_SEQUENCE)); + Status = STATUS_SUCCESS; + break; + + case IRP_MN_WAIT_WAKE: + /* Not really sure about this */ + DPRINT("PCMCIA: IRP_MN_WAIT_WAKE\n"); + Status = STATUS_NOT_SUPPORTED; + break; + + case IRP_MN_SET_POWER: + DPRINT("PCMCIA: IRP_MN_SET_POWER\n"); + if (IrpSp->Parameters.Power.Type == SystemPowerState) + { + Common->SystemPowerState = IrpSp->Parameters.Power.State.SystemState; + + Status = STATUS_SUCCESS; + } + else + { + Common->DevicePowerState = IrpSp->Parameters.Power.State.DeviceState; + + /* Update the POWER_SEQUENCE struct */ + if (Common->DevicePowerState <= PowerDeviceD1) + Common->PowerSequence.SequenceD1++; + + if (Common->DevicePowerState <= PowerDeviceD2) + Common->PowerSequence.SequenceD2++; + + if (Common->DevicePowerState <= PowerDeviceD3) + Common->PowerSequence.SequenceD3++; + + /* Start the underlying device if we are handling this for a PDO */ + if (!Common->IsFDO) + Status = PcmciaPdoSetPowerState((PPCMCIA_PDO_EXTENSION)Common); + else + Status = STATUS_SUCCESS; + } + + /* Report that we changed state to the Power Manager */ + PoSetPowerState(DeviceObject, IrpSp->Parameters.Power.Type, IrpSp->Parameters.Power.State); + break; + + default: + DPRINT1("PCMCIA: Invalid MN code in MJ_POWER handler %x\n", IrpSp->MinorFunction); + ASSERT(FALSE); + Status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; +} + +NTSTATUS +NTAPI +PcmciaAddDevice(PDRIVER_OBJECT DriverObject, + PDEVICE_OBJECT PhysicalDeviceObject) +{ + PPCMCIA_FDO_EXTENSION FdoExt; + PDEVICE_OBJECT Fdo; + NTSTATUS Status; + + DPRINT("PCMCIA: AddDevice\n"); + + Status = IoCreateDevice(DriverObject, + sizeof(*FdoExt), + NULL, + FILE_DEVICE_BUS_EXTENDER, + FILE_DEVICE_SECURE_OPEN, + FALSE, + &Fdo); + if (!NT_SUCCESS(Status)) return Status; + + FdoExt = Fdo->DeviceExtension; + + RtlZeroMemory(FdoExt, sizeof(*FdoExt)); + + InitializeListHead(&FdoExt->ChildDeviceList); + KeInitializeSpinLock(&FdoExt->Lock); + + FdoExt->Common.Self = Fdo; + FdoExt->Common.IsFDO = TRUE; + FdoExt->Common.State = dsStopped; + + FdoExt->Ldo = IoAttachDeviceToDeviceStack(Fdo, + PhysicalDeviceObject); + + Fdo->Flags &= ~DO_DEVICE_INITIALIZING; + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +{ + DriverObject->MajorFunction[IRP_MJ_CREATE] = PcmciaCreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = PcmciaCreateClose; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PcmciaDeviceControl; + DriverObject->MajorFunction[IRP_MJ_PNP] = PcmciaPlugPlay; + DriverObject->MajorFunction[IRP_MJ_POWER] = PcmciaPower; + + DriverObject->DriverExtension->AddDevice = PcmciaAddDevice; + DriverObject->DriverUnload = PcmciaUnload; + + DPRINT1("PCMCIA: DriverEntry\n"); + + return STATUS_SUCCESS; +} diff --git a/reactos/drivers/bus/pcmcia/pcmcia.h b/reactos/drivers/bus/pcmcia/pcmcia.h new file mode 100644 index 00000000000..32dd5f28a06 --- /dev/null +++ b/reactos/drivers/bus/pcmcia/pcmcia.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include +#include +#include + +typedef enum { + dsStopped, + dsStarted, + dsPaused, + dsRemoved, + dsSurpriseRemoved +} PCMCIA_DEVICE_STATE; + +typedef struct _PCMCIA_COMMON_EXTENSION { + PDEVICE_OBJECT Self; + BOOLEAN IsFDO; + POWER_SEQUENCE PowerSequence; + PCMCIA_DEVICE_STATE State; + DEVICE_POWER_STATE DevicePowerState; + SYSTEM_POWER_STATE SystemPowerState; +} PCMCIA_COMMON_EXTENSION, *PPCMCIA_COMMON_EXTENSION; + +typedef struct _PCMCIA_PDO_EXTENSION { + PCMCIA_COMMON_EXTENSION Common; +} PCMCIA_PDO_EXTENSION, *PPCMCIA_PDO_EXTENSION; + +typedef struct _PCMCIA_FDO_EXTENSION { + PCMCIA_COMMON_EXTENSION Common; + PDEVICE_OBJECT Ldo; + LIST_ENTRY ChildDeviceList; + KSPIN_LOCK Lock; +} PCMCIA_FDO_EXTENSION, *PPCMCIA_FDO_EXTENSION; + +/* pdo.c */ +NTSTATUS +NTAPI +PcmciaPdoPlugPlay(PPCMCIA_PDO_EXTENSION PdoExt, + PIRP Irp); + +NTSTATUS +NTAPI +PcmciaPdoSetPowerState(PPCMCIA_PDO_EXTENSION PdoExt); + +/* fdo.c */ +NTSTATUS +NTAPI +PcmciaFdoPlugPlay(PPCMCIA_FDO_EXTENSION FdoExt, + PIRP Irp); + diff --git a/reactos/drivers/bus/pcmcia/pcmcia.rbuild b/reactos/drivers/bus/pcmcia/pcmcia.rbuild new file mode 100644 index 00000000000..2d33ce5dcd6 --- /dev/null +++ b/reactos/drivers/bus/pcmcia/pcmcia.rbuild @@ -0,0 +1,12 @@ + + + + + . + ntoskrnl + hal + fdo.c + pcmcia.c + pdo.c + pcmcia.rc + diff --git a/reactos/drivers/bus/pcmcia/pcmcia.rc b/reactos/drivers/bus/pcmcia/pcmcia.rc new file mode 100644 index 00000000000..13958160676 --- /dev/null +++ b/reactos/drivers/bus/pcmcia/pcmcia.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "PCMCIA Bus Driver\0" +#define REACTOS_STR_INTERNAL_NAME "pcmcia\0" +#define REACTOS_STR_ORIGINAL_FILENAME "pcmcia.sys\0" +#include diff --git a/reactos/drivers/bus/pcmcia/pdo.c b/reactos/drivers/bus/pcmcia/pdo.c new file mode 100644 index 00000000000..0e4d16886ee --- /dev/null +++ b/reactos/drivers/bus/pcmcia/pdo.c @@ -0,0 +1,34 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel + * FILE: drivers/bus/pcmcia/pdo.c + * PURPOSE: PCMCIA Bus Driver + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ + +#include + +//#define NDEBUG +#include + +NTSTATUS +NTAPI +PcmciaPdoPlugPlay(PPCMCIA_PDO_EXTENSION PdoExt, + PIRP Irp) +{ + UNIMPLEMENTED + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_NOT_SUPPORTED; +} + +NTSTATUS +NTAPI +PcmciaPdoSetPowerState(PPCMCIA_PDO_EXTENSION PdoExt) +{ + UNIMPLEMENTED + + return STATUS_SUCCESS; +} + From cfe909e6a4a6144fd4ac56283f7de9fe911d27b0 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 15 Apr 2010 09:44:03 +0000 Subject: [PATCH 125/261] [PSDK] - Add clock property handler prototypes svn path=/trunk/; revision=46877 --- reactos/include/psdk/ks.h | 70 ++++++++++++++++++++++++++++++++++ reactos/include/psdk/ksmedia.h | 2 + 2 files changed, 72 insertions(+) diff --git a/reactos/include/psdk/ks.h b/reactos/include/psdk/ks.h index e66f130418a..2290d7cf4e2 100644 --- a/reactos/include/psdk/ks.h +++ b/reactos/include/psdk/ks.h @@ -2019,6 +2019,76 @@ typedef struct } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; +#define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_CLOCK_TIME,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(LONGLONG),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_CLOCK_PHYSICALTIME,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(LONGLONG),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_CLOCK_CORRELATEDTIME,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KSCORRELATED_TIME),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KSCORRELATED_TIME),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_CLOCK_RESOLUTION,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KSRESOLUTION),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_CLOCK_STATE,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KSSTATE),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_CLOCK_FUNCTIONTABLE,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KSCLOCK_FUNCTIONTABLE),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\ + PropTime, PropPhysicalTime,\ + PropCorrelatedTime, PropCorrelatedPhysicalTime,\ + PropResolution, PropState, PropFunctionTable)\ +DEFINE_KSPROPERTY_TABLE(ClockSet) {\ + DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\ + DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\ + DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\ + DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\ + DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\ + DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\ + DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable)\ +} + /* =============================================================== Objects ??? SORT ME! */ diff --git a/reactos/include/psdk/ksmedia.h b/reactos/include/psdk/ksmedia.h index da909168afc..a1b1c0c314e 100644 --- a/reactos/include/psdk/ksmedia.h +++ b/reactos/include/psdk/ksmedia.h @@ -14,6 +14,8 @@ KS CATEGORIES */ +typedef LONGLONG REFERENCE_TIME; + #define EXTRACT_WAVEFORMATEX_ID(Guid)\ (USHORT)((Guid)->Data1) From 99db21ebb0cfbc8ba60a7062d74cfab729417493 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 15 Apr 2010 10:07:38 +0000 Subject: [PATCH 126/261] [KS] - Fix typo - Store object interface functions in KSBASIC_HEADER OuterUnknown - Implement KsDeviceRegisterAdapterObject, KsRegisterAggregatedClientUnknown, KsGetOuterUnknown - Partly implement clock property functions - Rewrite KsValidateConnectRequest, KsPinPropertyHandler to handle KSPIN_DESCRIPTOR_EX, which is used by IKsFilter implementation - Dispatch unsupported interface requests to the clients registered inner aggregate (device / filter factory / filter / pin) - Rewrite filter functions which deal with KSPIN_DESCRIPTO, as the client can dynamically modify the PinDescriptors array - Handle matching create requests which differentiate in case - Implement pin allocator framing property handler svn path=/trunk/; revision=46878 --- reactos/drivers/ksfilter/ks/allocators.c | 2 +- reactos/drivers/ksfilter/ks/api.c | 38 ++- reactos/drivers/ksfilter/ks/bag.c | 2 +- reactos/drivers/ksfilter/ks/clocks.c | 266 +++++++++++++++++- reactos/drivers/ksfilter/ks/connectivity.c | 219 ++++++++------- reactos/drivers/ksfilter/ks/device.c | 62 +++-- reactos/drivers/ksfilter/ks/driver.c | 11 +- reactos/drivers/ksfilter/ks/filter.c | 288 ++++++++++---------- reactos/drivers/ksfilter/ks/filterfactory.c | 43 ++- reactos/drivers/ksfilter/ks/irp.c | 28 +- reactos/drivers/ksfilter/ks/ksfunc.h | 25 +- reactos/drivers/ksfilter/ks/ksiface.h | 4 +- reactos/drivers/ksfilter/ks/kstypes.h | 5 +- reactos/drivers/ksfilter/ks/misc.c | 11 +- reactos/drivers/ksfilter/ks/pin.c | 146 ++++++++-- reactos/drivers/ksfilter/ks/priv.h | 3 +- 16 files changed, 806 insertions(+), 347 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/allocators.c b/reactos/drivers/ksfilter/ks/allocators.c index 3040a041837..5a4970f1b58 100644 --- a/reactos/drivers/ksfilter/ks/allocators.c +++ b/reactos/drivers/ksfilter/ks/allocators.c @@ -251,7 +251,7 @@ IKsAllocator_fnDeviceIoControl( } } - /* unhandeled request */ + /* unhandled request */ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; IoCompleteRequest(Irp, IO_NO_INCREMENT); diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index 6c0d8813772..2067de57648 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -1629,7 +1629,7 @@ KsAcquireDevice( DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice); /* get device interface*/ - KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; + KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown; /* acquire device mutex */ KsDevice->lpVtbl->AcquireDevice(KsDevice); @@ -1647,7 +1647,7 @@ KsReleaseDevice( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice); /* get device interface*/ - KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; + KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown; /* release device mutex */ KsDevice->lpVtbl->ReleaseDevice(KsDevice); @@ -1670,7 +1670,7 @@ KsTerminateDevice( DeviceHeader = DeviceExtension->DeviceHeader; /* get device interface*/ - KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; + KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown; /* now free device header */ KsFreeDeviceHeader((KSDEVICE_HEADER)DeviceHeader); @@ -1960,7 +1960,7 @@ KsDeviceGetBusData( } /* - @unimplemented + @implemented */ KSDDKAPI void @@ -1971,7 +1971,12 @@ KsDeviceRegisterAdapterObject( IN ULONG MaxMappingsByteCount, IN ULONG MappingTableStride) { - UNIMPLEMENTED + PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice); + + DeviceHeader->AdapterObject = AdapterObject; + DeviceHeader->MaxMappingsByteCount = MaxMappingsByteCount; + DeviceHeader->MappingTableStride = MappingTableStride; + } /* @@ -1984,6 +1989,7 @@ KsGetBusEnumIdentifier( IN PIRP Irp) { UNIMPLEMENTED + return STATUS_UNSUCCESSFUL; } @@ -2700,8 +2706,26 @@ KsRegisterAggregatedClientUnknown( IN PVOID Object, IN PUNKNOWN ClientUnknown) { - UNIMPLEMENTED - return NULL; + PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); + + /* sanity check */ + ASSERT(BasicHeader->Type == KsObjectTypeDevice || BasicHeader->Type == KsObjectTypeFilterFactory || + BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); + + if (BasicHeader->ClientAggregate) + { + /* release existing aggregate */ + BasicHeader->ClientAggregate->lpVtbl->Release(BasicHeader->ClientAggregate); + } + + /* increment reference count */ + ClientUnknown->lpVtbl->AddRef(ClientUnknown); + + /* store client aggregate */ + BasicHeader->ClientAggregate = ClientUnknown; + + /* return objects outer unknown */ + return BasicHeader->OuterUnknown; } /* diff --git a/reactos/drivers/ksfilter/ks/bag.c b/reactos/drivers/ksfilter/ks/bag.c index d0b76cc8cd1..87f7a2bbef0 100644 --- a/reactos/drivers/ksfilter/ks/bag.c +++ b/reactos/drivers/ksfilter/ks/bag.c @@ -41,7 +41,7 @@ KsAllocateObjectBag( return STATUS_INSUFFICIENT_RESOURCES; /* get device interface */ - KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; + KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown; /* initialize object bag */ return KsDevice->lpVtbl->InitializeObjectBag(KsDevice, Bag, NULL); diff --git a/reactos/drivers/ksfilter/ks/clocks.c b/reactos/drivers/ksfilter/ks/clocks.c index 2e7ff0e2a39..05064be740a 100644 --- a/reactos/drivers/ksfilter/ks/clocks.c +++ b/reactos/drivers/ksfilter/ks/clocks.c @@ -21,20 +21,235 @@ typedef struct PFNKSSETTIMER SetTimer; PFNKSCANCELTIMER CancelTimer; PFNKSCORRELATEDTIME CorrelatedTime; - KSRESOLUTION* Resolution; + LONGLONG Granularity; + LONGLONG Error; ULONG Flags; }KSIDEFAULTCLOCK, *PKSIDEFAULTCLOCK; typedef struct { - IKsClock *lpVtbl; LONG ref; PKSCLOCK_CREATE ClockCreate; PKSIDEFAULTCLOCK DefaultClock; PKSIOBJECT_HEADER ObjectHeader; }KSICLOCK, *PKSICLOCK; +NTSTATUS NTAPI ClockPropertyTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI ClockPropertyPhysicalTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI ClockPropertyCorrelatedTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI ClockPropertyCorrelatedPhysicalTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI ClockPropertyResolution(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI ClockPropertyState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI ClockPropertyFunctionTable(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); + +DEFINE_KSPROPERTY_CLOCKSET(ClockPropertyTable, ClockPropertyTime, ClockPropertyPhysicalTime, ClockPropertyCorrelatedTime, ClockPropertyCorrelatedPhysicalTime, ClockPropertyResolution, ClockPropertyState, ClockPropertyFunctionTable); + +KSPROPERTY_SET ClockPropertySet[] = +{ + { + &KSPROPSETID_Clock, + sizeof(ClockPropertyTable) / sizeof(KSPROPERTY_ITEM), + (const KSPROPERTY_ITEM*)&ClockPropertyTable, + 0, + NULL + } +}; + +LONGLONG +FASTCALL +ClockGetPhysicalTime( + IN PFILE_OBJECT FileObject) +{ + UNIMPLEMENTED + return 0; +} + +LONGLONG +FASTCALL +ClockGetCorrelatedTime( + IN PFILE_OBJECT FileObject, + OUT PLONGLONG SystemTime) +{ + UNIMPLEMENTED + return 0; +} + +LONGLONG +FASTCALL +ClockGetTime( + IN PFILE_OBJECT FileObject) +{ + UNIMPLEMENTED + return 0; +} + +LONGLONG +FASTCALL +ClockGetCorrelatedPhysicalTime( + IN PFILE_OBJECT FileObject, + OUT PLONGLONG SystemTime) +{ + UNIMPLEMENTED + return 0; +} + +NTSTATUS +NTAPI +ClockPropertyTime( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PLONGLONG Time = (PLONGLONG)Data; + PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("ClockPropertyTime\n"); + + *Time = ClockGetTime(IoStack->FileObject); + + Irp->IoStatus.Information = sizeof(LONGLONG); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +ClockPropertyPhysicalTime( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PLONGLONG Time = (PLONGLONG)Data; + PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("ClockPropertyPhysicalTime\n"); + + *Time = ClockGetPhysicalTime(IoStack->FileObject); + + Irp->IoStatus.Information = sizeof(LONGLONG); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +ClockPropertyCorrelatedTime( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PKSCORRELATED_TIME Time = (PKSCORRELATED_TIME)Data; + PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("ClockPropertyCorrelatedTime\n"); + + Time->Time = ClockGetCorrelatedTime(IoStack->FileObject, &Time->SystemTime); + + Irp->IoStatus.Information = sizeof(KSCORRELATED_TIME); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +ClockPropertyCorrelatedPhysicalTime( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PKSCORRELATED_TIME Time = (PKSCORRELATED_TIME)Data; + PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("ClockPropertyCorrelatedPhysicalTime\n"); + + Time->Time = ClockGetCorrelatedPhysicalTime(IoStack->FileObject, &Time->SystemTime); + + Irp->IoStatus.Information = sizeof(KSCORRELATED_TIME); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +ClockPropertyResolution( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PKSICLOCK Clock; + PKSIOBJECT_HEADER ObjectHeader; + PIO_STACK_LOCATION IoStack; + PKSRESOLUTION Resolution = (PKSRESOLUTION)Data; + + DPRINT("ClockPropertyResolution\n"); + + /* get stack location */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* get the object header */ + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; + + /* sanity check */ + ASSERT(ObjectHeader); + + /* locate ks pin implemention from KSPIN offset */ + Clock = (PKSICLOCK)ObjectHeader->ObjectType; + + Resolution->Error = Clock->DefaultClock->Error; + Resolution->Granularity = Clock->DefaultClock->Granularity; + + Irp->IoStatus.Information = sizeof(KSRESOLUTION); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +ClockPropertyState( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PKSICLOCK Clock; + PKSIOBJECT_HEADER ObjectHeader; + PKSSTATE State = (PKSSTATE)Data; + PIO_STACK_LOCATION IoStack; + + DPRINT("ClockPropertyState\n"); + + /* get stack location */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* get the object header */ + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; + + /* sanity check */ + ASSERT(ObjectHeader); + + /* locate ks pin implemention from KSPIN offset */ + Clock = (PKSICLOCK)ObjectHeader->ObjectType; + + *State = Clock->DefaultClock->State; + Irp->IoStatus.Information = sizeof(KSSTATE); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +ClockPropertyFunctionTable( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + PKSCLOCK_FUNCTIONTABLE Table = (PKSCLOCK_FUNCTIONTABLE)Data; + + DPRINT("ClockPropertyFunctionTable\n"); + + Table->GetCorrelatedPhysicalTime = ClockGetCorrelatedPhysicalTime; + Table->GetCorrelatedTime = ClockGetCorrelatedTime; + Table->GetPhysicalTime = ClockGetPhysicalTime; + Table->GetTime = ClockGetTime; + + return STATUS_SUCCESS; +} + /* @implemented @@ -96,7 +311,32 @@ IKsClock_DispatchDeviceIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - UNIMPLEMENTED + PIO_STACK_LOCATION IoStack; + UNICODE_STRING GuidString; + PKSPROPERTY Property; + NTSTATUS Status; + + DPRINT("IKsClock_DispatchDeviceIoControl\n"); + + /* get current io stack */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* FIXME support events */ + ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY); + + /* sanity check */ + ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSPROPERTY)); + + /* call property handler */ + Status = KsPropertyHandler(Irp, 1, ClockPropertySet); + + /* get property from input buffer */ + Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; + + RtlStringFromGUID(&Property->Set, &GuidString); + DPRINT("IKsClock_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information); + RtlFreeUnicodeString(&GuidString); + Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -145,7 +385,6 @@ KsCreateDefaultClock( NTSTATUS Status; PKSCLOCK_CREATE ClockCreate; PKSICLOCK Clock; - PKSOBJECT_CREATE_ITEM CreateItem; Status = KsValidateClockCreateRequest(Irp, &ClockCreate); if (!NT_SUCCESS(Status)) @@ -169,7 +408,7 @@ KsCreateDefaultClock( /* initialize clock */ /* FIXME IKsClock */ - Clock->ObjectHeader->Unknown = (PUNKNOWN)&Clock->lpVtbl; + Clock->ObjectHeader->ObjectType = (PVOID)Clock; Clock->ref = 1; Clock->ClockCreate = ClockCreate; Clock->DefaultClock = (PKSIDEFAULTCLOCK)DefaultClock; @@ -177,9 +416,6 @@ KsCreateDefaultClock( /* increment reference count */ InterlockedIncrement(&Clock->DefaultClock->ReferenceCount); - /* get create item */ - CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); - return Status; } @@ -228,9 +464,21 @@ KsAllocateDefaultClockEx( Clock->SetTimer = SetTimer; Clock->CancelTimer = CancelTimer; Clock->CorrelatedTime = CorrelatedTime; - Clock->Resolution = (PKSRESOLUTION)Resolution; Clock->Flags = Flags; + if (Resolution) + { + if (SetTimer) + { + Clock->Error = Resolution->Error; + } + + if (CorrelatedTime) + { + Clock->Granularity = Resolution->Granularity; + } + } + *DefaultClock = (PKSDEFAULTCLOCK)Clock; return STATUS_SUCCESS; } diff --git a/reactos/drivers/ksfilter/ks/connectivity.c b/reactos/drivers/ksfilter/ks/connectivity.c index ea75428632a..bcc55cc6f1f 100644 --- a/reactos/drivers/ksfilter/ks/connectivity.c +++ b/reactos/drivers/ksfilter/ks/connectivity.c @@ -23,6 +23,7 @@ KSPIN_MEDIUM StandardPinMedium = 0 }; +const GUID KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT = {0xf4aeb342, 0x0329, 0x4fdd, {0xa8, 0xfd, 0x4a, 0xff, 0x49, 0x26, 0xc9, 0x78}}; /* @implemented @@ -53,16 +54,12 @@ KsCreatePin( ConnectionHandle); } -/* - @unimplemented -*/ -KSDDKAPI NTSTATUS -NTAPI -KsValidateConnectRequest( - IN PIRP Irp, - IN ULONG DescriptorsCount, - IN KSPIN_DESCRIPTOR* Descriptor, +KspValidateConnectRequest( + IN PIRP Irp, + IN ULONG DescriptorsCount, + IN PVOID Descriptors, + IN ULONG DescriptorSize, OUT PKSPIN_CONNECT* Connect) { PKSPIN_CONNECT ConnectDetails; @@ -73,6 +70,7 @@ KsValidateConnectRequest( ULONG Index; ULONG Count; BOOLEAN Found; + PKSPIN_DESCRIPTOR Descriptor; /* did the caller miss the connect parameter */ if (!Connect) @@ -95,12 +93,24 @@ KsValidateConnectRequest( if (ConnectDetails->PinId >= DescriptorsCount) return STATUS_INVALID_PARAMETER; + if (DescriptorSize == sizeof(KSPIN_DESCRIPTOR)) + { + /* standard pin descriptor */ + Descriptor = (PKSPIN_DESCRIPTOR)((ULONG_PTR)Descriptors + sizeof(KSPIN_DESCRIPTOR) * ConnectDetails->PinId); + } + else + { + /* extended / variable pin descriptor */ + Descriptor = &((PKSPIN_DESCRIPTOR_EX)((ULONG_PTR)Descriptors + DescriptorSize * ConnectDetails->PinId))->PinDescriptor; + } + + /* does the pin have interface details filled in */ - if (Descriptor[ConnectDetails->PinId].InterfacesCount && Descriptor[ConnectDetails->PinId].Interfaces) + if (Descriptor->InterfacesCount && Descriptor->Interfaces) { /* use provided pin interface count */ - Count = Descriptor[ConnectDetails->PinId].InterfacesCount; - Interface = (PKSPIN_INTERFACE)Descriptor[ConnectDetails->PinId].Interfaces; + Count = Descriptor->InterfacesCount; + Interface = (PKSPIN_INTERFACE)Descriptor->Interfaces; } else { @@ -114,6 +124,13 @@ KsValidateConnectRequest( Index = 0; do { + UNICODE_STRING GuidString, GuidString2; + RtlStringFromGUID(&Interface[Index].Set, &GuidString); + RtlStringFromGUID(&ConnectDetails->Interface.Set, &GuidString2); + + DPRINT("Driver Interface %S Id %u\n", GuidString.Buffer, Interface[Index].Id); + DPRINT("Connect Interface %S Id %u\n", GuidString2.Buffer, ConnectDetails->Interface.Id); + if (IsEqualGUIDAligned(&Interface[Index].Set, &ConnectDetails->Interface.Set) && Interface[Index].Id == ConnectDetails->Interface.Id) { @@ -132,11 +149,11 @@ KsValidateConnectRequest( } /* does the pin have medium details filled in */ - if (Descriptor[ConnectDetails->PinId].MediumsCount && Descriptor[ConnectDetails->PinId].Mediums) + if (Descriptor->MediumsCount && Descriptor->Mediums) { /* use provided pin interface count */ - Count = Descriptor[ConnectDetails->PinId].MediumsCount; - Medium = (PKSPIN_MEDIUM)Descriptor[ConnectDetails->PinId].Mediums; + Count = Descriptor->MediumsCount; + Medium = (PKSPIN_MEDIUM)Descriptor->Mediums; } else { @@ -150,6 +167,14 @@ KsValidateConnectRequest( Index = 0; do { + UNICODE_STRING GuidString, GuidString2; + RtlStringFromGUID(&Medium[Index].Set, &GuidString); + RtlStringFromGUID(&ConnectDetails->Medium.Set, &GuidString2); + + DPRINT("Driver Medium %S Id %u\n", GuidString.Buffer, Medium[Index].Id); + DPRINT("Connect Medium %S Id %u\n", GuidString2.Buffer, ConnectDetails->Medium.Id); + + if (IsEqualGUIDAligned(&Medium[Index].Set, &ConnectDetails->Medium.Set) && Medium[Index].Id == ConnectDetails->Medium.Id) { @@ -157,6 +182,9 @@ KsValidateConnectRequest( Found = TRUE; break; } + + + /* iterate to next medium */ Index++; }while(Index < Count); @@ -174,6 +202,20 @@ KsValidateConnectRequest( return STATUS_SUCCESS; } +/* + @implemented +*/ +KSDDKAPI +NTSTATUS +NTAPI +KsValidateConnectRequest( + IN PIRP Irp, + IN ULONG DescriptorsCount, + IN KSPIN_DESCRIPTOR* Descriptor, + OUT PKSPIN_CONNECT* Connect) +{ + return KspValidateConnectRequest(Irp, DescriptorsCount, Descriptor, sizeof(KSPIN_DESCRIPTOR), Connect); +} NTSTATUS KspReadMediaCategory( @@ -265,18 +307,16 @@ KspReadMediaCategory( return Status; } -/* - @implemented -*/ KSDDKAPI NTSTATUS NTAPI -KsPinPropertyHandler( +KspPinPropertyHandler( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data, IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor) + IN const KSPIN_DESCRIPTOR* Descriptors, + IN ULONG DescriptorSize) { KSP_PIN * Pin; KSMULTIPLE_ITEM * Item; @@ -286,6 +326,7 @@ KsPinPropertyHandler( PKSDATARANGE_AUDIO *WaveFormatOut; PKSDATAFORMAT_WAVEFORMATEX WaveFormatIn; PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; + const KSPIN_DESCRIPTOR *Descriptor; NTSTATUS Status = STATUS_NOT_SUPPORTED; ULONG Count; const PKSDATARANGE* DataRanges; @@ -295,6 +336,29 @@ KsPinPropertyHandler( //DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %u\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id); + /* convert to PKSP_PIN */ + Pin = (KSP_PIN*)Property; + + if (Property->Id != KSPROPERTY_PIN_CTYPES) + { + if (Pin->PinId >= DescriptorsCount) + { + /* invalid parameter */ + return STATUS_INVALID_PARAMETER; + } + } + + if (DescriptorSize == sizeof(KSPIN_DESCRIPTOR)) + { + /* it is simple pin descriptor */ + Descriptor = &Descriptors[Pin->PinId]; + } + else + { + /* get offset to pin descriptor */ + Descriptor = &(((PKSPIN_DESCRIPTOR_EX)((ULONG_PTR)Descriptors + Pin->PinId * DescriptorSize))->PinDescriptor); + } + switch(Property->Id) { case KSPROPERTY_PIN_CTYPES: @@ -303,13 +367,7 @@ KsPinPropertyHandler( Status = STATUS_SUCCESS; break; case KSPROPERTY_PIN_DATAFLOW: - Pin = (KSP_PIN*)Property; - if (Pin->PinId >= DescriptorsCount) - { - Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - break; - } + Size = sizeof(KSPIN_DATAFLOW); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) { @@ -318,30 +376,26 @@ KsPinPropertyHandler( break; } - *((KSPIN_DATAFLOW*)Buffer) = Descriptor[Pin->PinId].DataFlow; + *((KSPIN_DATAFLOW*)Buffer) = Descriptor->DataFlow; Irp->IoStatus.Information = sizeof(KSPIN_DATAFLOW); Status = STATUS_SUCCESS; break; case KSPROPERTY_PIN_DATARANGES: case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: - Pin = (KSP_PIN*)Property; - if (Pin->PinId >= DescriptorsCount) - { - Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - break; - } + Size = sizeof(KSMULTIPLE_ITEM); - if (Property->Id == KSPROPERTY_PIN_DATARANGES || Descriptor[Pin->PinId].ConstrainedDataRangesCount == 0) + DPRINT("Id %lu PinId %lu DataRangesCount %lu ConstrainedDataRangesCount %lu\n", Property->Id, Pin->PinId, Descriptor->DataRangesCount, Descriptor->ConstrainedDataRangesCount); + + if (Property->Id == KSPROPERTY_PIN_DATARANGES || Descriptor->ConstrainedDataRangesCount == 0) { - DataRanges = Descriptor[Pin->PinId].DataRanges; - Count = Descriptor[Pin->PinId].DataRangesCount; + DataRanges = Descriptor->DataRanges; + Count = Descriptor->DataRangesCount; } else { - DataRanges = Descriptor[Pin->PinId].ConstrainedDataRanges; - Count = Descriptor[Pin->PinId].ConstrainedDataRangesCount; + DataRanges = Descriptor->ConstrainedDataRanges; + Count = Descriptor->ConstrainedDataRangesCount; } for (Index = 0; Index < Count; Index++) @@ -410,18 +464,11 @@ KsPinPropertyHandler( Irp->IoStatus.Information = Size; break; case KSPROPERTY_PIN_INTERFACES: - Pin = (KSP_PIN*)Property; - if (Pin->PinId >= DescriptorsCount) - { - Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - break; - } - if (Descriptor[Pin->PinId].Interfaces) + if (Descriptor->Interfaces) { /* use mediums provided by driver */ - return KsHandleSizedListQuery(Irp, Descriptor[Pin->PinId].InterfacesCount, sizeof(KSPIN_MEDIUM), Descriptor[Pin->PinId].Interfaces); + return KsHandleSizedListQuery(Irp, Descriptor->InterfacesCount, sizeof(KSPIN_MEDIUM), Descriptor->Interfaces); } else { @@ -431,18 +478,11 @@ KsPinPropertyHandler( break; case KSPROPERTY_PIN_MEDIUMS: - Pin = (KSP_PIN*)Property; - if (Pin->PinId >= DescriptorsCount) - { - Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - break; - } - if (Descriptor[Pin->PinId].MediumsCount) + if (Descriptor->MediumsCount) { /* use mediums provided by driver */ - return KsHandleSizedListQuery(Irp, Descriptor[Pin->PinId].MediumsCount, sizeof(KSPIN_MEDIUM), Descriptor[Pin->PinId].Mediums); + return KsHandleSizedListQuery(Irp, Descriptor->MediumsCount, sizeof(KSPIN_MEDIUM), Descriptor->Mediums); } else { @@ -452,13 +492,6 @@ KsPinPropertyHandler( break; case KSPROPERTY_PIN_COMMUNICATION: - Pin = (KSP_PIN*)Property; - if (Pin->PinId >= DescriptorsCount) - { - Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - break; - } Size = sizeof(KSPIN_COMMUNICATION); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) @@ -468,21 +501,13 @@ KsPinPropertyHandler( break; } - //DPRINT("Pin %lu Communication %lu\n", Pin->PinId, Descriptor[Pin->PinId].Communication); - *((KSPIN_COMMUNICATION*)Buffer) = Descriptor[Pin->PinId].Communication; + *((KSPIN_COMMUNICATION*)Buffer) = Descriptor->Communication; Status = STATUS_SUCCESS; Irp->IoStatus.Information = Size; break; case KSPROPERTY_PIN_CATEGORY: - Pin = (KSP_PIN*)Property; - if (Pin->PinId >= DescriptorsCount) - { - Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - break; - } Size = sizeof(GUID); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) @@ -491,9 +516,9 @@ KsPinPropertyHandler( Status = STATUS_BUFFER_TOO_SMALL; break; } - if (Descriptor[Pin->PinId].Category) + if (Descriptor->Category) { - RtlMoveMemory(Buffer, Descriptor[Pin->PinId].Category, sizeof(GUID)); + RtlMoveMemory(Buffer, Descriptor->Category, sizeof(GUID)); } Status = STATUS_SUCCESS; @@ -501,29 +526,20 @@ KsPinPropertyHandler( break; case KSPROPERTY_PIN_NAME: - Pin = (KSP_PIN*)Property; - if (Pin->PinId >= DescriptorsCount) - { - Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - break; - } - - if (!Descriptor[Pin->PinId].Name) + if (!Descriptor->Name) { Irp->IoStatus.Information = 0; Status = STATUS_SUCCESS; break; } - Status = KspReadMediaCategory((LPGUID)Descriptor[Pin->PinId].Name, &KeyInfo); + Status = KspReadMediaCategory((LPGUID)Descriptor->Name, &KeyInfo); if (!NT_SUCCESS(Status)) { Irp->IoStatus.Information = 0; break; } - Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR); if (KeyInfo->DataLength + sizeof(WCHAR) > IoStack->Parameters.DeviceIoControl.OutputBufferLength) @@ -538,13 +554,6 @@ KsPinPropertyHandler( ExFreePool(KeyInfo); break; case KSPROPERTY_PIN_PROPOSEDATAFORMAT: - Pin = (KSP_PIN*)Property; - if (Pin->PinId >= DescriptorsCount) - { - Status = STATUS_INVALID_PARAMETER; - Irp->IoStatus.Information = 0; - break; - } Size = sizeof(KSDATAFORMAT); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) { @@ -561,14 +570,14 @@ KsPinPropertyHandler( } WaveFormatIn = (PKSDATAFORMAT_WAVEFORMATEX)Buffer; - if (!Descriptor[Pin->PinId].DataRanges || !Descriptor[Pin->PinId].DataRangesCount) + if (!Descriptor->DataRanges || !Descriptor->DataRangesCount) { Status = STATUS_UNSUCCESSFUL; Irp->IoStatus.Information = 0; break; } - WaveFormatOut = (PKSDATARANGE_AUDIO*)Descriptor[Pin->PinId].DataRanges; - for(Index = 0; Index < Descriptor[Pin->PinId].DataRangesCount; Index++) + WaveFormatOut = (PKSDATARANGE_AUDIO*)Descriptor->DataRanges; + for(Index = 0; Index < Descriptor->DataRangesCount; Index++) { if (WaveFormatOut[Index]->DataRange.FormatSize != sizeof(KSDATARANGE_AUDIO)) { @@ -605,6 +614,22 @@ KsPinPropertyHandler( return Status; } +/* + @implemented +*/ +KSDDKAPI +NTSTATUS +NTAPI +KsPinPropertyHandler( + IN PIRP Irp, + IN PKSPROPERTY Property, + IN OUT PVOID Data, + IN ULONG DescriptorsCount, + IN const KSPIN_DESCRIPTOR* Descriptor) +{ + return KspPinPropertyHandler(Irp, Property, Data, DescriptorsCount, Descriptor, sizeof(KSPIN_DESCRIPTOR)); +} + /* @unimplemented */ diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c index 084728f3c89..432548c6d91 100644 --- a/reactos/drivers/ksfilter/ks/device.c +++ b/reactos/drivers/ksfilter/ks/device.c @@ -16,15 +16,29 @@ IKsDevice_fnQueryInterface( REFIID refiid, PVOID* Output) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + NTSTATUS Status; + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->lpVtblIKsDevice; + *Output = &This->BasicHeader.OuterUnknown; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } + if (This->BasicHeader.ClientAggregate) + { + /* using client aggregate */ + Status = This->BasicHeader.ClientAggregate->lpVtbl->QueryInterface(This->BasicHeader.ClientAggregate, refiid, Output); + + if (NT_SUCCESS(Status)) + { + /* client aggregate supports interface */ + return Status; + } + } + + DPRINT("IKsDevice_fnQueryInterface no interface\n"); return STATUS_NOT_SUPPORTED; } @@ -33,7 +47,7 @@ NTAPI IKsDevice_fnAddRef( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); return InterlockedIncrement(&This->ref); } @@ -43,7 +57,7 @@ NTAPI IKsDevice_fnRelease( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); InterlockedDecrement(&This->ref); @@ -57,7 +71,7 @@ NTAPI IKsDevice_fnGetStruct( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); return &This->KsDevice; } @@ -69,7 +83,7 @@ IKsDevice_fnInitializeObjectBag( IN PKSIOBJECT_BAG Bag, IN PRKMUTEX Mutex) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); if (!Mutex) { @@ -93,7 +107,7 @@ NTAPI IKsDevice_fnAcquireDevice( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); return KeWaitForSingleObject(&This->DeviceMutex, Executive, KernelMode, FALSE, NULL); } @@ -103,7 +117,7 @@ NTAPI IKsDevice_fnReleaseDevice( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); return KeReleaseMutex(&This->DeviceMutex, FALSE); } @@ -113,12 +127,14 @@ NTAPI IKsDevice_fnGetAdapterObject( IN IKsDevice * iface, IN PADAPTER_OBJECT * Object, - IN PULONG Unknown1, - IN PULONG Unknown2) + IN PULONG MaxMappingsByteCount, + IN PULONG MappingTableStride) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); *Object = This->AdapterObject; + *MaxMappingsByteCount = This->MaxMappingsByteCount; + *MappingTableStride = This->MappingTableStride; return STATUS_SUCCESS; @@ -131,7 +147,7 @@ IKsDevice_fnAddPowerEntry( IN struct KSPOWER_ENTRY * Entry, IN IKsPowerNotify* Notify) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); UNIMPLEMENTED return STATUS_NOT_IMPLEMENTED; @@ -143,7 +159,7 @@ IKsDevice_fnRemovePowerEntry( IN IKsDevice * iface, IN struct KSPOWER_ENTRY * Entry) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); UNIMPLEMENTED return STATUS_NOT_IMPLEMENTED; @@ -159,7 +175,7 @@ IKsDevice_fnPinStateChange( IN KSSTATE OldState, IN KSSTATE NewState) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); UNIMPLEMENTED return STATUS_NOT_IMPLEMENTED; @@ -174,7 +190,7 @@ IKsDevice_fnArbitrateAdapterChannel( IN PDRIVER_CONTROL ExecutionRoutine, IN PVOID Context) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); NTSTATUS Status; DPRINT("IKsDevice_fnArbitrateAdapterChannel NumberOfMapRegisters %lu ExecutionRoutine %p Context %p Irql %lu\n", NumberOfMapRegisters, ExecutionRoutine, Context, KeGetCurrentIrql()); @@ -196,7 +212,7 @@ IKsDevice_fnCheckIoCapability( IN IKsDevice * iface, IN ULONG Unknown) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); UNIMPLEMENTED return STATUS_NOT_IMPLEMENTED; @@ -615,7 +631,7 @@ IKsDevice_Create( DeviceHeader = DeviceExtension->DeviceHeader; /* acquire list lock */ - IKsDevice_fnAcquireDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice); + IKsDevice_fnAcquireDevice((IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown); /* sanity check */ ASSERT(IoStack->FileObject); @@ -654,7 +670,7 @@ IKsDevice_Create( } /* acquire list lock */ - IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice); + IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown); if (Status != STATUS_PENDING) { @@ -726,7 +742,7 @@ KsInitializeDevice( } /* initialize IKsDevice interface */ - Header->lpVtblIKsDevice = &vt_IKsDevice; + Header->BasicHeader.OuterUnknown = (PUNKNOWN)&vt_IKsDevice; Header->ref = 1; /* allocate object bag */ @@ -810,7 +826,7 @@ KsReferenceSoftwareBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; if (Device) { @@ -834,7 +850,7 @@ KsReferenceBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; if (Device) { @@ -859,7 +875,7 @@ KsDereferenceBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; if (Device) { @@ -883,7 +899,7 @@ KsDereferenceSoftwareBusObject( DPRINT1("KsDereferenceSoftwareBusObject DeviceHeader %p\n", Header); /* get device interface */ - Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; if (Device) { diff --git a/reactos/drivers/ksfilter/ks/driver.c b/reactos/drivers/ksfilter/ks/driver.c index 0b6cf43a96e..c0195a4a97f 100644 --- a/reactos/drivers/ksfilter/ks/driver.c +++ b/reactos/drivers/ksfilter/ks/driver.c @@ -39,12 +39,19 @@ KsGetDevice( { PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); - DPRINT("KsGetDevice\n"); + DPRINT("KsGetDevice Type %lu KsDevice %p\n", BasicHeader->Type, BasicHeader->KsDevice); ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); ASSERT(BasicHeader->KsDevice); - ASSERT(BasicHeader->KsDevice->Started); + ASSERT(BasicHeader->KsDevice->Descriptor); + ASSERT(BasicHeader->KsDevice->Bag); + ASSERT(BasicHeader->KsDevice->Context); + ASSERT(BasicHeader->KsDevice->FunctionalDeviceObject); ASSERT(BasicHeader->KsDevice->PhysicalDeviceObject); + ASSERT(BasicHeader->KsDevice->NextDeviceObject); + ASSERT(BasicHeader->KsDevice->Started); + ASSERT(BasicHeader->KsDevice->SystemPowerState == PowerSystemWorking); + ASSERT(BasicHeader->KsDevice->DevicePowerState == PowerDeviceD0); return BasicHeader->KsDevice; } diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index bcac218e848..5f4a74b9b64 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -14,16 +14,12 @@ typedef struct KSBASIC_HEADER Header; KSFILTER Filter; - IKsFilterVtbl *lpVtbl; IKsControlVtbl *lpVtblKsControl; IKsFilterFactory * FilterFactory; LONG ref; PKSIOBJECT_HEADER ObjectHeader; KSTOPOLOGY Topology; - KSPIN_DESCRIPTOR_EX * PinDescriptorsEx; - KSPIN_DESCRIPTOR * PinDescriptors; - ULONG PinDescriptorCount; PKSFILTERFACTORY Factory; PFILE_OBJECT FileObject; KMUTEX ControlMutex; @@ -49,9 +45,12 @@ IKsFilter_RemoveFilterFromFilterFactory( IKsFilterImpl * This, PKSFILTERFACTORY FilterFactory); +NTSTATUS NTAPI FilterTopologyPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); +NTSTATUS NTAPI FilterPinPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, KspTopologyPropertyHandler); -DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, KspPinPropertyHandler, KspPinPropertyHandler, KspPinPropertyHandler); + +DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, FilterTopologyPropertyHandler); +DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, FilterPinPropertyHandler, FilterPinPropertyHandler, FilterPinPropertyHandler); KSPROPERTY_SET FilterPropertySet[] = { @@ -82,7 +81,7 @@ IKsControl_fnQueryInterface( if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->lpVtbl; + *Output = &This->Header.OuterUnknown; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } @@ -185,12 +184,13 @@ IKsFilter_fnQueryInterface( IN REFIID refiid, OUT PVOID* Output) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); + NTSTATUS Status; + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); if (IsEqualGUIDAligned(refiid, &IID_IUnknown) || IsEqualGUIDAligned(refiid, &IID_IKsFilter)) { - *Output = &This->lpVtbl; + *Output = &This->Header.OuterUnknown; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } @@ -201,7 +201,20 @@ IKsFilter_fnQueryInterface( return STATUS_SUCCESS; } - return STATUS_UNSUCCESSFUL; + if (This->Header.ClientAggregate) + { + /* using client aggregate */ + Status = This->Header.ClientAggregate->lpVtbl->QueryInterface(This->Header.ClientAggregate, refiid, Output); + + if (NT_SUCCESS(Status)) + { + /* client aggregate supports interface */ + return Status; + } + } + + DPRINT("IKsFilter_fnQueryInterface no interface\n"); + return STATUS_NOT_SUPPORTED; } ULONG @@ -209,7 +222,7 @@ NTAPI IKsFilter_fnAddRef( IKsFilter * iface) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); return InterlockedIncrement(&This->ref); } @@ -219,7 +232,7 @@ NTAPI IKsFilter_fnRelease( IKsFilter * iface) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); InterlockedDecrement(&This->ref); @@ -238,7 +251,7 @@ NTAPI IKsFilter_fnGetStruct( IKsFilter * iface) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); return &This->Filter; } @@ -295,18 +308,18 @@ IKsFilter_fnAddProcessPin( IN PKSPROCESSPIN ProcessPin) { NTSTATUS Status; - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); /* first acquire processing mutex */ KeWaitForSingleObject(&This->ProcessingMutex, Executive, KernelMode, FALSE, NULL); /* sanity check */ - ASSERT(This->PinDescriptorCount > ProcessPin->Pin->Id); + ASSERT(This->Filter.Descriptor->PinDescriptorsCount > ProcessPin->Pin->Id); /* allocate new process pin array */ Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex[ProcessPin->Pin->Id].Pins, - (This->PinDescriptorCount + 1) * sizeof(PKSPROCESSPIN), - This->PinDescriptorCount * sizeof(PKSPROCESSPIN), + (This->Filter.Descriptor->PinDescriptorsCount + 1) * sizeof(PKSPROCESSPIN), + This->Filter.Descriptor->PinDescriptorsCount * sizeof(PKSPROCESSPIN), 0); if (NT_SUCCESS(Status)) @@ -332,7 +345,7 @@ IKsFilter_fnRemoveProcessPin( ULONG Count; PKSPROCESSPIN * Pins; - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); /* first acquire processing mutex */ KeWaitForSingleObject(&This->ProcessingMutex, Executive, KernelMode, FALSE, NULL); @@ -416,7 +429,7 @@ NTAPI IKsFilter_fnGetProcessDispatch( IKsFilter * iface) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); return This->ProcessPinIndex; } @@ -495,13 +508,13 @@ IKsFilter_DispatchClose( return Status; /* get our real implementation */ - This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, lpVtbl); + This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Header.OuterUnknown); /* does the driver support notifications */ - if (This->Factory->FilterDescriptor && This->Factory->FilterDescriptor->Dispatch && This->Factory->FilterDescriptor->Dispatch->Close) + if (This->Filter.Descriptor && This->Filter.Descriptor->Dispatch && This->Filter.Descriptor->Dispatch->Close) { /* call driver's filter close function */ - Status = This->Factory->FilterDescriptor->Dispatch->Close(&This->Filter, Irp); + Status = This->Filter.Descriptor->Dispatch->Close(&This->Filter, Irp); } if (NT_SUCCESS(Status) && Status != STATUS_PENDING) @@ -540,7 +553,7 @@ KspHandlePropertyInstances( KSPIN_CINSTANCES * Instances; KSP_PIN * Pin = (KSP_PIN*)Request; - if (!This->Factory->FilterDescriptor || !This->PinDescriptorCount) + if (!This->Filter.Descriptor || !This->Filter.Descriptor->PinDescriptorsCount) { /* no filter / pin descriptor */ IoStatus->Status = STATUS_NOT_IMPLEMENTED; @@ -548,12 +561,12 @@ KspHandlePropertyInstances( } /* ignore custom structs for now */ - ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - ASSERT(This->PinDescriptorCount > Pin->PinId); + ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); + ASSERT(This->Filter.Descriptor->PinDescriptorsCount > Pin->PinId); Instances = (KSPIN_CINSTANCES*)Data; /* max instance count */ - Instances->PossibleCount = This->PinDescriptorsEx[Pin->PinId].InstancesPossible; + Instances->PossibleCount = This->Filter.Descriptor->PinDescriptors[Pin->PinId].InstancesPossible; /* current instance count */ Instances->CurrentCount = This->PinInstanceCount[Pin->PinId]; @@ -572,7 +585,7 @@ KspHandleNecessaryPropertyInstances( PULONG Result; KSP_PIN * Pin = (KSP_PIN*)Request; - if (!This->Factory->FilterDescriptor || !This->PinDescriptorCount) + if (!This->Filter.Descriptor || !This->Filter.Descriptor->PinDescriptorsCount) { /* no filter / pin descriptor */ IoStatus->Status = STATUS_NOT_IMPLEMENTED; @@ -580,11 +593,11 @@ KspHandleNecessaryPropertyInstances( } /* ignore custom structs for now */ - ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - ASSERT(This->PinDescriptorCount > Pin->PinId); + ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); + ASSERT(This->Filter.Descriptor->PinDescriptorsCount > Pin->PinId); Result = (PULONG)Data; - *Result = This->PinDescriptorsEx[Pin->PinId].InstancesNecessary; + *Result = This->Filter.Descriptor->PinDescriptors[Pin->PinId].InstancesNecessary; IoStatus->Information = sizeof(ULONG); IoStatus->Status = STATUS_SUCCESS; @@ -604,8 +617,15 @@ KspHandleDataIntersection( PKSDATARANGE DataRange; NTSTATUS Status = STATUS_NO_MATCH; ULONG Index, Length; + PIO_STACK_LOCATION IoStack; KSP_PIN * Pin = (KSP_PIN*)Request; + /* get stack location */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* sanity check */ + ASSERT(DataLength == IoStack->Parameters.DeviceIoControl.OutputBufferLength); + /* Access parameters */ MultipleItem = (PKSMULTIPLE_ITEM)(Pin + 1); DataRange = (PKSDATARANGE)(MultipleItem + 1); @@ -613,7 +633,7 @@ KspHandleDataIntersection( /* FIXME make sure its 64 bit aligned */ ASSERT(((ULONG_PTR)DataRange & 0x7) == 0); - if (!This->Factory->FilterDescriptor || !This->PinDescriptorCount) + if (!This->Filter.Descriptor || !This->Filter.Descriptor->PinDescriptorsCount) { /* no filter / pin descriptor */ IoStatus->Status = STATUS_NOT_IMPLEMENTED; @@ -621,12 +641,12 @@ KspHandleDataIntersection( } /* ignore custom structs for now */ - ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - ASSERT(This->PinDescriptorCount > Pin->PinId); + ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); + ASSERT(This->Filter.Descriptor->PinDescriptorsCount > Pin->PinId); - if (This->PinDescriptorsEx[Pin->PinId].IntersectHandler == NULL || - This->PinDescriptors[Pin->PinId].DataRanges == NULL || - This->PinDescriptors[Pin->PinId].DataRangesCount == 0) + if (This->Filter.Descriptor->PinDescriptors[Pin->PinId].IntersectHandler == NULL || + This->Filter.Descriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRanges == NULL || + This->Filter.Descriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRangesCount == 0) { /* no driver supported intersect handler / no provided data ranges */ IoStatus->Status = STATUS_NOT_IMPLEMENTED; @@ -641,26 +661,25 @@ KspHandleDataIntersection( RtlStringFromGUID(&DataRange->SubFormat, &SubFormat); RtlStringFromGUID(&DataRange->Specifier, &Specifier); - DPRINT("Index %lu MajorFormat %S SubFormat %S Specifier %S FormatSize %lu SampleSize %lu Align %lu Flags %lx Reserved %lx DataLength %lu\n", Index, MajorFormat.Buffer, SubFormat.Buffer, Specifier.Buffer, - DataRange->FormatSize, DataRange->SampleSize, DataRange->Alignment, DataRange->Flags, DataRange->Reserved, DataLength); + DPRINT("KspHandleDataIntersection Index %lu PinId %lu MajorFormat %S SubFormat %S Specifier %S FormatSize %lu SampleSize %lu Align %lu Flags %lx Reserved %lx DataLength %lu\n", Index, Pin->PinId, MajorFormat.Buffer, SubFormat.Buffer, Specifier.Buffer, + DataRange->FormatSize, DataRange->SampleSize, DataRange->Alignment, DataRange->Flags, DataRange->Reserved, DataLength); /* FIXME implement KsPinDataIntersectionEx */ /* Call miniport's properitary handler */ - Status = This->PinDescriptorsEx[Pin->PinId].IntersectHandler(&This->Filter, - Irp, - Pin, - DataRange, - This->PinDescriptorsEx[Pin->PinId].PinDescriptor.DataRanges[0], /* HACK */ - DataLength, - Data, - &Length); + Status = This->Filter.Descriptor->PinDescriptors[Pin->PinId].IntersectHandler(&This->Filter, + Irp, + Pin, + DataRange, + This->Filter.Descriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRanges[0], /* HACK */ + DataLength, + Data, + &Length); + DPRINT("KspHandleDataIntersection Status %lx\n", Status); if (Status == STATUS_SUCCESS || Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) { ASSERT(Length); IoStatus->Information = Length; - if (Status != STATUS_SUCCESS) - Status = STATUS_MORE_ENTRIES; break; } @@ -668,14 +687,13 @@ KspHandleDataIntersection( /* FIXME make sure its 64 bit aligned */ ASSERT(((ULONG_PTR)DataRange & 0x7) == 0); } - IoStatus->Status = Status; return Status; } NTSTATUS NTAPI -KspTopologyPropertyHandler( +FilterTopologyPropertyHandler( IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data) @@ -695,7 +713,7 @@ KspTopologyPropertyHandler( NTSTATUS NTAPI -KspPinPropertyHandler( +FilterPinPropertyHandler( IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data) @@ -724,7 +742,7 @@ KspPinPropertyHandler( case KSPROPERTY_PIN_CATEGORY: case KSPROPERTY_PIN_NAME: case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: - Status = KsPinPropertyHandler(Irp, Request, Data, This->PinDescriptorCount, This->PinDescriptors); + Status = KspPinPropertyHandler(Irp, Request, Data, This->Filter.Descriptor->PinDescriptorsCount, (const KSPIN_DESCRIPTOR*)This->Filter.Descriptor->PinDescriptors, This->Filter.Descriptor->PinDescriptorSize); break; case KSPROPERTY_PIN_GLOBALCINSTANCES: Status = KspHandlePropertyInstances(&Irp->IoStatus, Request, Data, This, TRUE); @@ -770,7 +788,7 @@ IKsFilter_DispatchDeviceIoControl( return Status; /* get our real implementation */ - This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, lpVtbl); + This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Header.OuterUnknown); /* current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -781,16 +799,14 @@ IKsFilter_DispatchDeviceIoControl( /* get filter instance */ FilterInstance = Filter->lpVtbl->GetStruct(Filter); - /* sanity check */ ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSIDENTIFIER)); ASSERT(FilterInstance); ASSERT(FilterInstance->Descriptor); ASSERT(FilterInstance->Descriptor->AutomationTable); - RtlStringFromGUID(&Property->Set, &GuidString); - DPRINT("IKsFilter_DispatchDeviceIoControl property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); - RtlFreeUnicodeString(&GuidString); + /* acquire control mutex */ + KeWaitForSingleObject(This->Header.ControlMutex, Executive, KernelMode, FALSE, NULL); if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_METHOD) { @@ -859,6 +875,9 @@ IKsFilter_DispatchDeviceIoControl( /* release filter */ Filter->lpVtbl->Release(Filter); + /* release control mutex */ + KeReleaseMutex(This->Header.ControlMutex, FALSE); + if (Status != STATUS_PENDING) { Irp->IoStatus.Status = Status; @@ -895,10 +914,7 @@ IKsFilter_CreateDescriptors( /* initialize pin descriptors */ This->FirstPin = NULL; This->PinInstanceCount = NULL; - This->PinDescriptors = NULL; - This->PinDescriptorsEx = NULL; This->ProcessPinIndex = NULL; - This->PinDescriptorCount = 0; /* initialize topology descriptor */ This->Topology.CategoriesCount = FilterDescriptor->CategoriesCount; @@ -917,8 +933,8 @@ IKsFilter_CreateDescriptors( ASSERT(FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); /* store pin descriptors ex */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptorsEx, sizeof(KSPIN_DESCRIPTOR_EX) * FilterDescriptor->PinDescriptorsCount, - sizeof(KSPIN_DESCRIPTOR_EX) * FilterDescriptor->PinDescriptorsCount, 0); + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->Filter.Descriptor->PinDescriptors, FilterDescriptor->PinDescriptorSize * FilterDescriptor->PinDescriptorsCount, + FilterDescriptor->PinDescriptorSize * FilterDescriptor->PinDescriptorsCount, 0); if (!NT_SUCCESS(Status)) { @@ -926,17 +942,7 @@ IKsFilter_CreateDescriptors( return Status; } - /* store pin descriptors */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptors, sizeof(KSPIN_DESCRIPTOR) * FilterDescriptor->PinDescriptorsCount, - sizeof(KSPIN_DESCRIPTOR) * FilterDescriptor->PinDescriptorsCount, 0); - - if (!NT_SUCCESS(Status)) - { - DPRINT("IKsFilter_CreateDescriptors _KsEdit failed %lx\n", Status); - return Status; - } - - /* store pin instance count ex */ + /* store pin instance count */ Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinInstanceCount, sizeof(ULONG) * FilterDescriptor->PinDescriptorsCount, sizeof(ULONG) * FilterDescriptor->PinDescriptorsCount, 0); @@ -957,12 +963,7 @@ IKsFilter_CreateDescriptors( } /* add new pin factory */ - RtlMoveMemory(This->PinDescriptorsEx, FilterDescriptor->PinDescriptors, sizeof(KSPIN_DESCRIPTOR_EX) * FilterDescriptor->PinDescriptorsCount); - - for(Index = 0; Index < FilterDescriptor->PinDescriptorsCount; Index++) - { - RtlMoveMemory(&This->PinDescriptors[Index], &FilterDescriptor->PinDescriptors[Index].PinDescriptor, sizeof(KSPIN_DESCRIPTOR)); - } + RtlMoveMemory((PVOID)This->Filter.Descriptor->PinDescriptors, FilterDescriptor->PinDescriptors, FilterDescriptor->PinDescriptorSize * FilterDescriptor->PinDescriptorsCount); /* allocate process pin index */ Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex, sizeof(KSPROCESSPIN_INDEXENTRY) * FilterDescriptor->PinDescriptorsCount, @@ -974,9 +975,20 @@ IKsFilter_CreateDescriptors( return Status; } - /* store new pin descriptor count */ - This->PinDescriptorCount = FilterDescriptor->PinDescriptorsCount; + } + + if (FilterDescriptor->ConnectionsCount) + { + /* modify connections array */ + Status = _KsEdit(This->Filter.Bag, + (PVOID*)&This->Filter.Descriptor->Connections, + FilterDescriptor->ConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION), + FilterDescriptor->ConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION), + 0); + + This->Topology.TopologyConnections = This->Filter.Descriptor->Connections; + This->Topology.TopologyConnectionsCount = ((PKSFILTER_DESCRIPTOR)This->Filter.Descriptor)->ConnectionsCount = FilterDescriptor->ConnectionsCount; } if (FilterDescriptor->NodeDescriptorsCount) @@ -1070,7 +1082,7 @@ IKsFilter_AddPin( IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); /* sanity check */ - ASSERT(Pin->Id < This->PinDescriptorCount); + ASSERT(Pin->Id < This->Filter.Descriptor->PinDescriptorsCount); if (This->FirstPin[Pin->Id] == NULL) { @@ -1111,7 +1123,7 @@ IKsFilter_RemovePin( IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); /* sanity check */ - ASSERT(Pin->Id < This->PinDescriptorCount); + ASSERT(Pin->Id < This->Filter.Descriptor->PinDescriptorsCount); /* get first pin */ CurPin = This->FirstPin[Pin->Id]; @@ -1180,23 +1192,23 @@ IKsFilter_DispatchCreatePin( KeWaitForSingleObject(This->Header.ControlMutex, Executive, KernelMode, FALSE, NULL); /* now validate the connect request */ - Status = KsValidateConnectRequest(Irp, This->PinDescriptorCount, This->PinDescriptors, &Connect); + Status = KspValidateConnectRequest(Irp, This->Filter.Descriptor->PinDescriptorsCount, (PVOID)This->Filter.Descriptor->PinDescriptors, This->Filter.Descriptor->PinDescriptorSize, &Connect); DPRINT("IKsFilter_DispatchCreatePin KsValidateConnectRequest %lx\n", Status); if (NT_SUCCESS(Status)) { /* sanity check */ - ASSERT(Connect->PinId < This->PinDescriptorCount); + ASSERT(Connect->PinId < This->Filter.Descriptor->PinDescriptorsCount); DPRINT("IKsFilter_DispatchCreatePin KsValidateConnectRequest PinId %lu CurrentInstanceCount %lu MaxPossible %lu\n", Connect->PinId, This->PinInstanceCount[Connect->PinId], - This->PinDescriptorsEx[Connect->PinId].InstancesPossible); + This->Filter.Descriptor->PinDescriptors[Connect->PinId].InstancesPossible); - if (This->PinInstanceCount[Connect->PinId] < This->PinDescriptorsEx[Connect->PinId].InstancesPossible) + if (This->PinInstanceCount[Connect->PinId] < This->Filter.Descriptor->PinDescriptors[Connect->PinId].InstancesPossible) { /* create the pin */ - Status = KspCreatePin(DeviceObject, Irp, This->Header.KsDevice, This->FilterFactory, (IKsFilter*)&This->lpVtbl, Connect, &This->PinDescriptorsEx[Connect->PinId]); + Status = KspCreatePin(DeviceObject, Irp, This->Header.KsDevice, This->FilterFactory, (IKsFilter*)&This->Header.OuterUnknown, Connect, (KSPIN_DESCRIPTOR_EX*)&This->Filter.Descriptor->PinDescriptors[Connect->PinId]); DPRINT("IKsFilter_DispatchCreatePin KspCreatePin %lx\n", Status); } @@ -1204,7 +1216,7 @@ IKsFilter_DispatchCreatePin( { /* maximum instance count reached, bye-bye */ Status = STATUS_UNSUCCESSFUL; - DPRINT("IKsFilter_DispatchCreatePin MaxInstance %lu CurInstance %lu %lx\n", This->PinDescriptorsEx[Connect->PinId].InstancesPossible, This->PinInstanceCount[Connect->PinId]); + DPRINT("IKsFilter_DispatchCreatePin MaxInstance %lu CurInstance %lu %lx\n", This->Filter.Descriptor->PinDescriptors[Connect->PinId].InstancesPossible, This->PinInstanceCount[Connect->PinId]); } } @@ -1388,7 +1400,7 @@ KspCreateFilter( DPRINT("KspCreateFilter OutOfMemory\n"); return STATUS_INSUFFICIENT_RESOURCES; } - KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice; + KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->BasicHeader.OuterUnknown; KsDevice->lpVtbl->InitializeObjectBag(KsDevice, (PKSIOBJECT_BAG)This->Filter.Bag, NULL); /* copy filter descriptor */ @@ -1432,7 +1444,7 @@ KspCreateFilter( /* initialize filter instance */ This->ref = 1; - This->lpVtbl = &vt_IKsFilter; + This->Header.OuterUnknown = (PUNKNOWN)&vt_IKsFilter; This->lpVtblKsControl = &vt_IKsControl; This->Factory = Factory; @@ -1496,14 +1508,14 @@ KspCreateFilter( /* initialize object header extra fields */ This->ObjectHeader->Type = KsObjectTypeFilter; - This->ObjectHeader->Unknown = (PUNKNOWN)&This->lpVtbl; + This->ObjectHeader->Unknown = (PUNKNOWN)&This->Header.OuterUnknown; This->ObjectHeader->ObjectType = (PVOID)&This->Filter; /* attach filter to filter factory */ IKsFilter_AttachFilterToFilterFactory(This, This->Header.Parent.KsFilterFactory); /* completed initialization */ - DPRINT("KspCreateFilter done %lx\n", Status); + DPRINT("KspCreateFilter done %lx KsDevice %p\n", Status, This->Header.KsDevice); return Status; } @@ -1548,40 +1560,42 @@ KsFilterAddTopologyConnections ( IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections) { ULONG Count; - KSTOPOLOGY_CONNECTION * Connections; + NTSTATUS Status; IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); + DPRINT("KsFilterAddTopologyConnections\n"); + + ASSERT(This->Filter.Descriptor); Count = This->Filter.Descriptor->ConnectionsCount + NewConnectionsCount; - /* allocate array */ - Connections = AllocateItem(NonPagedPool, Count * sizeof(KSTOPOLOGY_CONNECTION)); - if (!Connections) - return STATUS_INSUFFICIENT_RESOURCES; + + /* modify connections array */ + Status = _KsEdit(This->Filter.Bag, + (PVOID*)&This->Filter.Descriptor->Connections, + Count * sizeof(KSTOPOLOGY_CONNECTION), + This->Filter.Descriptor->ConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION), + 0); + + if (!NT_SUCCESS(Status)) + { + /* failed */ + DPRINT("KsFilterAddTopologyConnections KsEdit failed with %lx\n", Status); + return Status; + } /* FIXME verify connections */ - if (This->Filter.Descriptor->ConnectionsCount) - { - /* copy old connections */ - RtlMoveMemory(Connections, This->Filter.Descriptor->Connections, sizeof(KSTOPOLOGY_CONNECTION) * This->Filter.Descriptor->ConnectionsCount); - } + /* copy new connections */ + RtlMoveMemory((PVOID)&This->Filter.Descriptor->Connections[This->Filter.Descriptor->ConnectionsCount], + NewTopologyConnections, + NewConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION)); - /* add new connections */ - RtlMoveMemory((PVOID)(Connections + This->Filter.Descriptor->ConnectionsCount), NewTopologyConnections, NewConnectionsCount); + /* update topology */ + This->Topology.TopologyConnectionsCount += NewConnectionsCount; + ((PKSFILTER_DESCRIPTOR)This->Filter.Descriptor)->ConnectionsCount += NewConnectionsCount; + This->Topology.TopologyConnections = This->Filter.Descriptor->Connections; - /* add the new connections */ - RtlMoveMemory((PVOID)&This->Filter.Descriptor->ConnectionsCount, &Count, sizeof(ULONG)); /* brain-dead gcc hack */ - - /* free old connections array */ - if (This->Filter.Descriptor->ConnectionsCount) - { - FreeItem((PVOID)This->Filter.Descriptor->Connections); - } - - /* brain-dead gcc hack */ - RtlMoveMemory((PVOID)&This->Filter.Descriptor->Connections, Connections, sizeof(KSTOPOLOGY_CONNECTION*)); - - return STATUS_SUCCESS; + return Status; } /* @@ -1630,13 +1644,13 @@ KsFilterCreatePinFactory ( DPRINT("KsFilterCreatePinFactory\n"); /* calculate new count */ - Count = This->PinDescriptorCount + 1; + Count = This->Filter.Descriptor->PinDescriptorsCount + 1; /* sanity check */ ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - /* allocate pin descriptors ex array */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptorsEx, Count * sizeof(KSPIN_DESCRIPTOR_EX), This->PinDescriptorCount * sizeof(KSPIN_DESCRIPTOR_EX), 0); + /* modify pin descriptors ex array */ + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->Filter.Descriptor->PinDescriptors, Count * This->Filter.Descriptor->PinDescriptorSize, This->Filter.Descriptor->PinDescriptorsCount * This->Filter.Descriptor->PinDescriptorSize, 0); if (!NT_SUCCESS(Status)) { /* failed */ @@ -1644,8 +1658,8 @@ KsFilterCreatePinFactory ( return Status; } - /* allocate pin descriptors array */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptors, Count * sizeof(KSPIN_DESCRIPTOR), This->PinDescriptorCount * sizeof(KSPIN_DESCRIPTOR), 0); + /* modify pin instance count array */ + Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->PinInstanceCount, sizeof(ULONG) * Count, sizeof(ULONG) * This->Filter.Descriptor->PinDescriptorsCount, 0); if (!NT_SUCCESS(Status)) { /* failed */ @@ -1653,18 +1667,8 @@ KsFilterCreatePinFactory ( return Status; } - - /* allocate pin instance count array */ - Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->PinInstanceCount, sizeof(ULONG) * Count, sizeof(ULONG) * This->PinDescriptorCount, 0); - if (!NT_SUCCESS(Status)) - { - /* failed */ - DPRINT("KsFilterCreatePinFactory _KsEdit failed with %lx\n", Status); - return Status; - } - - /* allocate first pin array */ - Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->FirstPin, sizeof(PKSPIN) * Count, sizeof(PKSPIN) * This->PinDescriptorCount, 0); + /* modify first pin array */ + Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->FirstPin, sizeof(PKSPIN) * Count, sizeof(PKSPIN) * This->Filter.Descriptor->PinDescriptorsCount, 0); if (!NT_SUCCESS(Status)) { /* failed */ @@ -1673,13 +1677,11 @@ KsFilterCreatePinFactory ( } /* add new pin factory */ - RtlMoveMemory(&This->PinDescriptorsEx[This->PinDescriptorCount], InPinDescriptor, sizeof(KSPIN_DESCRIPTOR_EX)); - RtlMoveMemory(&This->PinDescriptors[This->PinDescriptorCount], &InPinDescriptor->PinDescriptor, sizeof(KSPIN_DESCRIPTOR)); - + RtlMoveMemory((PVOID)&This->Filter.Descriptor->PinDescriptors[This->Filter.Descriptor->PinDescriptorsCount], InPinDescriptor, sizeof(KSPIN_DESCRIPTOR_EX)); /* allocate process pin index */ Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex, sizeof(KSPROCESSPIN_INDEXENTRY) * Count, - sizeof(KSPROCESSPIN_INDEXENTRY) * This->PinDescriptorCount, 0); + sizeof(KSPROCESSPIN_INDEXENTRY) * This->Filter.Descriptor->PinDescriptorsCount, 0); if (!NT_SUCCESS(Status)) { @@ -1688,10 +1690,10 @@ KsFilterCreatePinFactory ( } /* store new pin id */ - *PinID = This->PinDescriptorCount; + *PinID = This->Filter.Descriptor->PinDescriptorsCount; /* increment pin descriptor count */ - This->PinDescriptorCount++; + ((PKSFILTER_DESCRIPTOR)This->Filter.Descriptor)->PinDescriptorsCount++; DPRINT("KsFilterCreatePinFactory done\n"); @@ -1724,7 +1726,7 @@ KsFilterGetChildPinCount( { IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); - if (PinId >= This->PinDescriptorCount) + if (PinId >= This->Filter.Descriptor->PinDescriptorsCount) { /* index is out of bounds */ return 0; @@ -1745,7 +1747,7 @@ KsFilterGetFirstChildPin( { IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); - if (PinId >= This->PinDescriptorCount) + if (PinId >= This->Filter.Descriptor->PinDescriptorsCount) { /* index is out of bounds */ return NULL; diff --git a/reactos/drivers/ksfilter/ks/filterfactory.c b/reactos/drivers/ksfilter/ks/filterfactory.c index 0e15bb76f3c..e60bfc41e81 100644 --- a/reactos/drivers/ksfilter/ks/filterfactory.c +++ b/reactos/drivers/ksfilter/ks/filterfactory.c @@ -14,7 +14,6 @@ typedef struct KSBASIC_HEADER Header; KSFILTERFACTORY FilterFactory; - IKsFilterFactoryVtbl *lpVtbl; LONG ref; PKSIDEVICE_HEADER DeviceHeader; PFNKSFILTERFACTORYPOWER SleepCallback; @@ -59,7 +58,7 @@ IKsFilterFactory_Create( Factory = (IKsFilterFactoryImpl*)CONTAINING_RECORD(CreateItem->Context, IKsFilterFactoryImpl, FilterFactory); /* get interface */ - iface = (IKsFilterFactory*)&Factory->lpVtbl; + iface = (IKsFilterFactory*)&Factory->Header.OuterUnknown; /* create a filter instance */ Status = KspCreateFilter(DeviceObject, Irp, iface); @@ -84,15 +83,31 @@ IKsFilterFactory_fnQueryInterface( IN REFIID refiid, OUT PVOID* Output) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); + NTSTATUS Status; + + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->lpVtbl; + *Output = &This->Header.OuterUnknown; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } - return STATUS_UNSUCCESSFUL; + + if (This->Header.ClientAggregate) + { + /* using client aggregate */ + Status = This->Header.ClientAggregate->lpVtbl->QueryInterface(This->Header.ClientAggregate, refiid, Output); + + if (NT_SUCCESS(Status)) + { + /* client aggregate supports interface */ + return Status; + } + } + + DPRINT("IKsFilterFactory_fnQueryInterface no interface\n"); + return STATUS_NOT_SUPPORTED; } ULONG @@ -100,7 +115,7 @@ NTAPI IKsFilterFactory_fnAddRef( IKsFilterFactory * iface) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); return InterlockedIncrement(&This->ref); } @@ -110,7 +125,7 @@ NTAPI IKsFilterFactory_fnRelease( IKsFilterFactory * iface) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); InterlockedDecrement(&This->ref); @@ -136,7 +151,7 @@ NTAPI IKsFilterFactory_fnGetStruct( IKsFilterFactory * iface) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); return &This->FilterFactory; } @@ -147,7 +162,7 @@ IKsFilterFactory_fnSetDeviceClassesState( IKsFilterFactory * iface, IN BOOLEAN Enable) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); return KspSetDeviceInterfacesState(&This->SymbolicLinkList, Enable); } @@ -213,7 +228,7 @@ IKsFilterFactory_fnInitialize( BOOL FreeString = FALSE; IKsDevice * KsDevice; - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); /* get device extension */ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -306,7 +321,7 @@ IKsFilterFactory_fnInitialize( if (This->FilterFactory.Bag) { /* initialize object bag */ - KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice; + KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->BasicHeader.OuterUnknown; KsDevice->lpVtbl->InitializeObjectBag(KsDevice, (PKSIOBJECT_BAG)This->FilterFactory.Bag, NULL); } } @@ -357,10 +372,10 @@ KspCreateFilterFactory( /* initialize struct */ This->ref = 1; - This->lpVtbl = &vt_IKsFilterFactoryVtbl; + This->Header.OuterUnknown = (PUNKNOWN)&vt_IKsFilterFactoryVtbl; /* map to com object */ - Filter = (IKsFilterFactory*)&This->lpVtbl; + Filter = (IKsFilterFactory*)&This->Header.OuterUnknown; /* initialize filter */ Status = Filter->lpVtbl->Initialize(Filter, DeviceObject, Descriptor, RefString, SecurityDescriptor, CreateItemFlags, SleepCallback, WakeCallback, FilterFactory); @@ -412,7 +427,7 @@ KsFilterFactorySetDeviceClassesState( IKsFilterFactory * Factory; IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(FilterFactory, IKsFilterFactoryImpl, FilterFactory); - Factory = (IKsFilterFactory*)&This->lpVtbl; + Factory = (IKsFilterFactory*)&This->Header.OuterUnknown; return Factory->lpVtbl->SetDeviceClassesState(Factory, NewState); } diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index 332be5cc389..0c6036e2059 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -1360,7 +1360,7 @@ KsRemoveIrpFromCancelableQueue( PLIST_ENTRY CurEntry; KIRQL OldIrql; - DPRINT("KsRemoveIrpFromCancelableQueue ListHead %p SpinLock %p ListLocation %x RemovalOperation %x\n", QueueHead, SpinLock, ListLocation, RemovalOperation); + //DPRINT("KsRemoveIrpFromCancelableQueue ListHead %p SpinLock %p ListLocation %x RemovalOperation %x\n", QueueHead, SpinLock, ListLocation, RemovalOperation); /* check parameters */ if (!QueueHead || !SpinLock) @@ -1719,6 +1719,8 @@ FindMatchingCreateItem( { PLIST_ENTRY Entry; PCREATE_ITEM_ENTRY CreateItemEntry; + UNICODE_STRING RefString; + #ifndef MS_KSUSER /* remove '\' slash */ @@ -1726,6 +1728,16 @@ FindMatchingCreateItem( BufferSize -= sizeof(WCHAR); #endif + if (!wcschr(Buffer, L'\\')) + { + RtlInitUnicodeString(&RefString, Buffer); + } + else + { + RefString.Buffer = Buffer; + RefString.Length = RefString.MaximumLength = ((ULONG_PTR)wcschr(Buffer, L'\\') - (ULONG_PTR)Buffer); + } + /* point to first entry */ Entry = ListHead->Flink; @@ -1753,9 +1765,9 @@ FindMatchingCreateItem( ASSERT(CreateItemEntry->CreateItem->ObjectClass.Buffer); - DPRINT("CreateItem %S Length %u Request %S %u\n", CreateItemEntry->CreateItem->ObjectClass.Buffer, + DPRINT("CreateItem %S Length %u Request %wZ %u\n", CreateItemEntry->CreateItem->ObjectClass.Buffer, CreateItemEntry->CreateItem->ObjectClass.Length, - Buffer, + &RefString, BufferSize); if (CreateItemEntry->CreateItem->ObjectClass.Length > BufferSize) @@ -1766,7 +1778,7 @@ FindMatchingCreateItem( } /* now check if the object class is the same */ - if (RtlCompareMemory(CreateItemEntry->CreateItem->ObjectClass.Buffer, Buffer, CreateItemEntry->CreateItem->ObjectClass.Length) == CreateItemEntry->CreateItem->ObjectClass.Length) + if (!RtlCompareUnicodeString(&CreateItemEntry->CreateItem->ObjectClass, &RefString, TRUE)) { /* found matching create item */ *OutCreateItem = CreateItemEntry; @@ -1994,7 +2006,7 @@ KsDispatchIrp( PKSIDEVICE_HEADER DeviceHeader; PDEVICE_EXTENSION DeviceExtension; - DPRINT("KsDispatchIrp DeviceObject %p Irp %p\n", DeviceObject, Irp); + //DPRINT("KsDispatchIrp DeviceObject %p Irp %p\n", DeviceObject, Irp); /* get device extension */ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -2010,7 +2022,7 @@ KsDispatchIrp( if (IoStack->MajorFunction == IRP_MJ_CREATE) { /* check internal type */ - if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */ + if (DeviceHeader->BasicHeader.OuterUnknown) /* FIXME improve check */ { /* AVStream client */ return IKsDevice_Create(DeviceObject, Irp); @@ -2042,7 +2054,7 @@ KsDispatchIrp( if (IoStack->MajorFunction == IRP_MJ_POWER) { /* check internal type */ - if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */ + if (DeviceHeader->BasicHeader.OuterUnknown) /* FIXME improve check */ { /* AVStream client */ return IKsDevice_Power(DeviceObject, Irp); @@ -2056,7 +2068,7 @@ KsDispatchIrp( else if (IoStack->MajorFunction == IRP_MJ_PNP) /* dispatch pnp */ { /* check internal type */ - if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */ + if (DeviceHeader->BasicHeader.OuterUnknown) /* FIXME improve check */ { /* AVStream client */ return IKsDevice_Pnp(DeviceObject, Irp); diff --git a/reactos/drivers/ksfilter/ks/ksfunc.h b/reactos/drivers/ksfilter/ks/ksfunc.h index 75d73ea4aab..636c616bcb2 100644 --- a/reactos/drivers/ksfilter/ks/ksfunc.h +++ b/reactos/drivers/ksfilter/ks/ksfunc.h @@ -84,19 +84,17 @@ VOID FreeItem( IN PVOID Item); -NTSTATUS -NTAPI -KspTopologyPropertyHandler( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data); - +KSDDKAPI NTSTATUS NTAPI KspPinPropertyHandler( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data); + IN PIRP Irp, + IN PKSPROPERTY Property, + IN OUT PVOID Data, + IN ULONG DescriptorsCount, + IN const KSPIN_DESCRIPTOR* Descriptors, + IN ULONG DescriptorSize); + NTSTATUS FindMatchingCreateItem( @@ -181,3 +179,10 @@ KspEnableEvent( IN PFNKSALLOCATOR Allocator OPTIONAL, IN ULONG EventItemSize OPTIONAL); +NTSTATUS +KspValidateConnectRequest( + IN PIRP Irp, + IN ULONG DescriptorsCount, + IN PVOID Descriptors, + IN ULONG DescriptorSize, + OUT PKSPIN_CONNECT* Connect); diff --git a/reactos/drivers/ksfilter/ks/ksiface.h b/reactos/drivers/ksfilter/ks/ksiface.h index 0977886beaf..ad95fc9a922 100644 --- a/reactos/drivers/ksfilter/ks/ksiface.h +++ b/reactos/drivers/ksfilter/ks/ksiface.h @@ -283,8 +283,8 @@ DECLARE_INTERFACE_(IKsDevice, IUnknown) STDMETHOD_(NTSTATUS, GetAdapterObject)(THIS_ IN PADAPTER_OBJECT * Object, - IN PULONG Unknown1, - IN PULONG Unknown2) PURE; + IN PULONG MaxMappingsByteCount, + IN PULONG MappingTableStride) PURE; STDMETHOD_(NTSTATUS, AddPowerEntry)(THIS_ IN struct KSPOWER_ENTRY * Entry, diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index 51b365aaaad..0e64312e095 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -61,6 +61,8 @@ typedef struct PRKMUTEX ControlMutex; LIST_ENTRY EventList; KSPIN_LOCK EventListLock; + PUNKNOWN ClientAggregate; + PUNKNOWN OuterUnknown; union { PKSDEVICE KsDevice; @@ -87,7 +89,6 @@ typedef struct { KSBASIC_HEADER BasicHeader; KSDEVICE KsDevice; - IKsDeviceVtbl *lpVtblIKsDevice; LONG ref; ERESOURCE SecurityLock; @@ -109,6 +110,8 @@ typedef struct LIST_ENTRY ObjectBags; PADAPTER_OBJECT AdapterObject; + ULONG MaxMappingsByteCount; + ULONG MappingTableStride; }KSIDEVICE_HEADER, *PKSIDEVICE_HEADER; diff --git a/reactos/drivers/ksfilter/ks/misc.c b/reactos/drivers/ksfilter/ks/misc.c index cc3d2cc9cca..dc814eae01e 100644 --- a/reactos/drivers/ksfilter/ks/misc.c +++ b/reactos/drivers/ksfilter/ks/misc.c @@ -175,16 +175,21 @@ KsGetObjectTypeFromIrp( } /* - @unimplemented + @implemented */ PUNKNOWN NTAPI KsGetOuterUnknown( IN PVOID Object) { - UNIMPLEMENTED - return NULL; + PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); + /* sanity check */ + ASSERT(BasicHeader->Type == KsObjectTypeDevice || BasicHeader->Type == KsObjectTypeFilterFactory || + BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); + + /* return objects outer unknown */ + return BasicHeader->OuterUnknown; } /* diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c index aa39c8deae1..019e5ce6023 100644 --- a/reactos/drivers/ksfilter/ks/pin.c +++ b/reactos/drivers/ksfilter/ks/pin.c @@ -32,7 +32,6 @@ typedef struct KSPROCESSPIN ProcessPin; LIST_ENTRY Entry; - IKsPinVtbl *lpVtbl; LONG ref; IKsFilter * Filter; @@ -296,7 +295,7 @@ IKsPin_PinStatePropertyHandler( /* set new state */ This->Pin.ClientState = *NewState; - This->Pin.DeviceState = *NewState; + This->Pin.DeviceState = KSSTATE_RUN; /* check if it supported */ Status = This->Pin.Descriptor->Dispatch->SetDeviceState(&This->Pin, *NewState, OldState); @@ -339,8 +338,67 @@ IKsPin_PinAllocatorFramingPropertyHandler( IN PKSIDENTIFIER Request, IN OUT PVOID Data) { - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + PIO_STACK_LOCATION IoStack; + PKSIOBJECT_HEADER ObjectHeader; + IKsPinImpl * This; + ULONG Size; + NTSTATUS Status = STATUS_SUCCESS; + + /* get current irp stack */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* sanity check */ + ASSERT(IoStack->FileObject); + ASSERT(IoStack->FileObject->FsContext2); + + /* get the object header */ + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; + + /* locate ks pin implemention from KSPIN offset */ + This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); + + /* setting allocator flags is not supported */ + ASSERT(!(Request->Flags & KSPROPERTY_TYPE_SET)); + + /* acquire control mutex */ + KeWaitForSingleObject(This->BasicHeader.ControlMutex, Executive, KernelMode, FALSE, NULL); + + if (This->Pin.Descriptor->AllocatorFraming) + { + /* calculate size */ + Size = FIELD_OFFSET(KSALLOCATOR_FRAMING_EX, FramingItem[0]) + This->Pin.Descriptor->AllocatorFraming->CountItems * sizeof(KS_FRAMING_ITEM); + + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength == 0) + { + /* no buffer */ + Status = STATUS_BUFFER_OVERFLOW; + } + else if (Size > IoStack->Parameters.DeviceIoControl.OutputBufferLength) + { + /* buffer too small */ + Status = STATUS_BUFFER_TOO_SMALL; + } + else + { + /* copy buffer */ + RtlMoveMemory(Data, This->Pin.Descriptor->AllocatorFraming, Size); + } + + /* store size */ + Irp->IoStatus.Information = Size; + } + else + { + /* no allocator framing details */ + Status = STATUS_NOT_FOUND; + } + + /* release processing mutex */ + KeReleaseMutex(This->BasicHeader.ControlMutex, FALSE); + + DPRINT("IKsPin_PinAllocatorFramingPropertyHandler Status %lx\n", Status); + + return Status; } NTSTATUS @@ -423,17 +481,31 @@ IKsPin_fnQueryInterface( IN REFIID refiid, OUT PVOID* Output) { - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtbl); + NTSTATUS Status; + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, BasicHeader.OuterUnknown); if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->lpVtbl; + *Output = &This->BasicHeader.OuterUnknown; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } -DPRINT("IKsPin_fnQueryInterface\n"); - DbgBreakPoint(); - return STATUS_UNSUCCESSFUL; + + + if (This->BasicHeader.ClientAggregate) + { + /* using client aggregate */ + Status = This->BasicHeader.ClientAggregate->lpVtbl->QueryInterface(This->BasicHeader.ClientAggregate, refiid, Output); + + if (NT_SUCCESS(Status)) + { + /* client aggregate supports interface */ + return Status; + } + } + + DPRINT("IKsPin_fnQueryInterface no interface\n"); + return STATUS_NOT_SUPPORTED; } ULONG @@ -441,7 +513,7 @@ NTAPI IKsPin_fnAddRef( IKsPin * iface) { - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtbl); + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, BasicHeader.OuterUnknown); return InterlockedIncrement(&This->ref); } @@ -451,7 +523,7 @@ NTAPI IKsPin_fnRelease( IKsPin * iface) { - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtbl); + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, BasicHeader.OuterUnknown); InterlockedDecrement(&This->ref); @@ -645,7 +717,7 @@ IKsReferenceClock_fnQueryInterface( { IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - return IKsPin_fnQueryInterface((IKsPin*)&This->lpVtbl, refiid, Output); + return IKsPin_fnQueryInterface((IKsPin*)&This->BasicHeader.OuterUnknown, refiid, Output); } ULONG @@ -655,7 +727,7 @@ IKsReferenceClock_fnAddRef( { IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - return IKsPin_fnAddRef((IKsPin*)&This->lpVtbl); + return IKsPin_fnAddRef((IKsPin*)&This->BasicHeader.OuterUnknown); } ULONG @@ -665,7 +737,7 @@ IKsReferenceClock_fnRelease( { IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - return IKsPin_fnRelease((IKsPin*)&This->lpVtbl); + return IKsPin_fnRelease((IKsPin*)&This->BasicHeader.OuterUnknown); } LONGLONG @@ -1032,7 +1104,7 @@ KsPinGetParentFilter( */ NTSTATUS NTAPI - KsPinGetReferenceClockInterface( +KsPinGetReferenceClockInterface( IN PKSPIN Pin, OUT PIKSREFERENCECLOCK* Interface) { @@ -1045,12 +1117,8 @@ NTAPI *Interface = (PIKSREFERENCECLOCK)&This->lpVtblReferenceClock; Status = STATUS_SUCCESS; } -//HACK - *Interface = (PIKSREFERENCECLOCK)&This->lpVtblReferenceClock; - Status = STATUS_SUCCESS; DPRINT("KsPinGetReferenceClockInterface Pin %p Interface %p Status %x\n", Pin, Interface, Status); - return Status; } @@ -1937,6 +2005,13 @@ IKsPin_DispatchDeviceIoControl( /* current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); + if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_READ_STREAM || + IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM) + { + /* handle ks stream packets */ + return IKsPin_DispatchKsStream(DeviceObject, Irp, This); + } + /* get property from input buffer */ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; @@ -2227,10 +2302,10 @@ KspCreatePin( //Output Pin: KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY //Input Pin: KSPIN_FLAG_FIXED_FORMAT|KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT|KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING - + DPRINT("KspCreatePin Dataflow %lu\n", Descriptor->PinDescriptor.DataFlow); + DPRINT("KspCreatePin Communication %lu\n", Descriptor->PinDescriptor.Communication); if (Descriptor->AllocatorFraming) { - DPRINT("KspCreatePin Dataflow %lu\n", Descriptor->PinDescriptor.DataFlow); DPRINT("KspCreatePin CountItems %lu\n", Descriptor->AllocatorFraming->CountItems); DPRINT("KspCreatePin PinFlags %lx\n", Descriptor->AllocatorFraming->PinFlags); DPRINT("KspCreatePin OutputCompression RatioNumerator %lu RatioDenominator %lu RatioConstantMargin %lu\n", Descriptor->AllocatorFraming->OutputCompression.RatioNumerator, @@ -2262,6 +2337,27 @@ KspCreatePin( } } + for (Index = 0; Index < Descriptor->PinDescriptor.DataRangesCount; Index++) + { + UNICODE_STRING GuidString; + /* convert the guid to string */ + RtlStringFromGUID(&Descriptor->PinDescriptor.DataRanges[Index]->MajorFormat, &GuidString); + DPRINT("Index %lu MajorFormat %S\n", Index, GuidString.Buffer); + RtlStringFromGUID(&Descriptor->PinDescriptor.DataRanges[Index]->SubFormat, &GuidString); + DPRINT("Index %lu SubFormat %S\n", Index, GuidString.Buffer); + RtlStringFromGUID(&Descriptor->PinDescriptor.DataRanges[Index]->Specifier, &GuidString); + DPRINT("Index %lu Specifier %S\n", Index, GuidString.Buffer); + RtlStringFromGUID(&Descriptor->PinDescriptor.DataRanges[Index]->Specifier, &GuidString); + DPRINT("Index %lu FormatSize %lu Flags %lu SampleSize %lu Reserved %lu KSDATAFORMAT %lu\n", Index, + Descriptor->PinDescriptor.DataRanges[Index]->FormatSize, Descriptor->PinDescriptor.DataRanges[Index]->Flags, Descriptor->PinDescriptor.DataRanges[Index]->SampleSize, Descriptor->PinDescriptor.DataRanges[Index]->Reserved, sizeof(KSDATAFORMAT)); + + if (IsEqualGUIDAligned(&Descriptor->PinDescriptor.DataRanges[Index]->SubFormat, &KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT)) + { + PKS_DATARANGE_BDA_TRANSPORT Transport = (PKS_DATARANGE_BDA_TRANSPORT)&Descriptor->PinDescriptor.DataRanges[Index]; + DPRINT("KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT AvgTimePerFrame %I64u ulcbPhyiscalFrame %lu ulcbPhyiscalFrameAlignment %lu ulcbPhyiscalPacket %lu\n", Transport->BdaTransportInfo.AvgTimePerFrame, Transport->BdaTransportInfo.ulcbPhyiscalFrame, + Transport->BdaTransportInfo.ulcbPhyiscalFrameAlignment, Transport->BdaTransportInfo.ulcbPhyiscalPacket); + } + } if (!FrameSize) { /* default to 50 * 188 (MPEG2 TS packet size) */ @@ -2280,7 +2376,7 @@ KspCreatePin( DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; /* get ks device interface */ - Device = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)&DeviceExtension->DeviceHeader->BasicHeader.OuterUnknown; /* first allocate pin ctx */ This = AllocateItem(NonPagedPool, sizeof(IKsPinImpl)); @@ -2304,6 +2400,7 @@ KspCreatePin( This->BasicHeader.KsDevice = KsDevice; This->BasicHeader.Type = KsObjectTypePin; This->BasicHeader.Parent.KsFilter = Filter->lpVtbl->GetStruct(Filter); + This->BasicHeader.OuterUnknown = (PUNKNOWN)&vt_IKsPin; InitializeListHead(&This->BasicHeader.EventList); KeInitializeSpinLock(&This->BasicHeader.EventListLock); @@ -2318,7 +2415,6 @@ KspCreatePin( KeInitializeSpinLock(&This->BasicHeader.EventListLock); /* initialize pin */ - This->lpVtbl = &vt_IKsPin; This->FrameSize = FrameSize; This->NumFrames = NumFrames; This->lpVtblReferenceClock = &vt_ReferenceClock; @@ -2442,7 +2538,7 @@ KspCreatePin( /* add extra info to object header */ This->ObjectHeader->Type = KsObjectTypePin; - This->ObjectHeader->Unknown = (PUNKNOWN)&This->lpVtbl; + This->ObjectHeader->Unknown = (PUNKNOWN)&This->BasicHeader.OuterUnknown; This->ObjectHeader->ObjectType = (PVOID)&This->Pin; if (!Descriptor->Dispatch || !Descriptor->Dispatch->Process) @@ -2524,7 +2620,7 @@ KspCreatePin( } - DPRINT("KspCreatePin Status %lx\n", Status); + DPRINT("KspCreatePin Status %lx KsDevice %p\n", Status, KsDevice); if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) { diff --git a/reactos/drivers/ksfilter/ks/priv.h b/reactos/drivers/ksfilter/ks/priv.h index ec5976be238..75b514158cc 100644 --- a/reactos/drivers/ksfilter/ks/priv.h +++ b/reactos/drivers/ksfilter/ks/priv.h @@ -18,6 +18,7 @@ #include "ksiface.h" #include "ksmedia.h" +#include "bdamedia.h" #define TAG_DEVICE_HEADER 'KSDH' #define REG_PINFLAG_B_MANY 0x4 /* strmif.h */ @@ -45,7 +46,7 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\ DEFINE_KSPROPERTY_TABLE(PinSet) {\ DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(PropStateHandler, PropStateHandler),\ DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(PropDataFormatHandler, PropDataFormatHandler),\ - DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(PropAllocatorFraming)\ + DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(PropAllocatorFraming)\ } From 8b9a3d51b9c5284cc24a8092b53d71f218017334 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 15 Apr 2010 11:08:19 +0000 Subject: [PATCH 127/261] [MSDVBNP] - Fix category description [KSPROXY] - Create pin handle when other pin is connecting to the output pin - Defer loading proxy plugins when the pin is about to connect svn path=/trunk/; revision=46879 --- reactos/dll/directx/bdaplgin/pincontrol.cpp | 2 +- reactos/dll/directx/ksproxy/output_pin.cpp | 103 ++++++++++++-------- reactos/dll/directx/msdvbnp/msdvbnp.cpp | 2 +- 3 files changed, 67 insertions(+), 40 deletions(-) diff --git a/reactos/dll/directx/bdaplgin/pincontrol.cpp b/reactos/dll/directx/bdaplgin/pincontrol.cpp index 4420b76e16b..2571abbf866 100644 --- a/reactos/dll/directx/bdaplgin/pincontrol.cpp +++ b/reactos/dll/directx/bdaplgin/pincontrol.cpp @@ -336,6 +336,7 @@ CBDAPinControl_fnConstructor( if (SUCCEEDED(hr)) { // register device filter + OutputDebugStringW(L"CBDAPinControl_fnConstructor registering device filter with network provider\n"); hr = pNetworkProvider->RegisterDeviceFilter(pUnknown, &RegistrationCtx); if (SUCCEEDED(hr)) { @@ -361,7 +362,6 @@ CBDAPinControl_fnConstructor( WCHAR Buffer[100]; swprintf(Buffer, L"CBDAPinControl_fnConstructor failed to register filter with %lx\n", hr); OutputDebugStringW(Buffer); - DebugBreak(); } } } diff --git a/reactos/dll/directx/ksproxy/output_pin.cpp b/reactos/dll/directx/ksproxy/output_pin.cpp index bee119303ae..2bf85c8a06b 100644 --- a/reactos/dll/directx/ksproxy/output_pin.cpp +++ b/reactos/dll/directx/ksproxy/output_pin.cpp @@ -246,8 +246,16 @@ COutputPin::COutputPin( ZeroMemory(m_FramingProp, sizeof(m_FramingProp)); ZeroMemory(m_FramingEx, sizeof(m_FramingEx)); + ZeroMemory(&m_MediaFormat, sizeof(AM_MEDIA_TYPE)); hr = KsGetMediaType(0, &m_MediaFormat, KsObjectParent->KsGetObjectHandle(), m_PinId); + +#ifdef KSPROXY_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::COutputPin Format %p pbFormat %lu\n", &m_MediaFormat, m_MediaFormat.cbFormat); + OutputDebugStringW(Buffer); +#endif + assert(hr == S_OK); InitializeCriticalSection(&m_Lock); @@ -1518,6 +1526,8 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) HRESULT hr; ALLOCATOR_PROPERTIES Properties; IMemAllocatorCallbackTemp *pMemCallback; + LPGUID pGuid; + ULONG NumGuids = 0; #ifdef KSPROXY_TRACE WCHAR Buffer[200]; @@ -1540,6 +1550,20 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) pmt = &m_MediaFormat; } + if (m_hPin == INVALID_HANDLE_VALUE) + { + hr = CreatePin(pmt); + if (FAILED(hr)) + { +#ifdef KSPROXY_TRACE + swprintf(Buffer, L"COutputPin::Connect CreatePin handle failed with %lx\n", hr); + OutputDebugStringW(Buffer); +#endif + return hr; + } + } + + // query for IMemInput interface hr = pReceivePin->QueryInterface(IID_IMemInputPin, (void**)&m_MemInputPin); if (FAILED(hr)) @@ -1648,10 +1672,24 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) return hr; } - if (!m_hPin) + + assert(m_hPin != INVALID_HANDLE_VALUE); + + // get all supported sets + if (m_Plugins.size() == 0) { - //FIXME create pin handle - assert(0); + if (GetSupportedSets(&pGuid, &NumGuids)) + { + // load all proxy plugins + if (FAILED(LoadProxyPlugins(pGuid, NumGuids))); + { +#ifdef KSPROXY_TRACE + OutputDebugStringW(L"COutputPin::Connect LoadProxyPlugins failed\n"); +#endif + } + // free sets + CoTaskMemFree(pGuid); + } } // receive connection; @@ -2093,6 +2131,7 @@ COutputPin::CreatePinHandle( // pin already exists //CloseHandle(m_hPin); //m_hPin = INVALID_HANDLE_VALUE; + OutputDebugStringW(L"COutputPin::CreatePinHandle pin already exists\n"); return S_OK; } @@ -2105,9 +2144,10 @@ COutputPin::CreatePinHandle( if (!PinConnect) { // failed + OutputDebugStringW(L"COutputPin::CreatePinHandle out of memory\n"); return E_OUTOFMEMORY; } - + OutputDebugStringW(L"COutputPin::CreatePinHandle copy pinconnect\n"); // setup request CopyMemory(&PinConnect->Interface, Interface, sizeof(KSPIN_INTERFACE)); CopyMemory(&PinConnect->Medium, Medium, sizeof(KSPIN_MEDIUM)); @@ -2118,7 +2158,7 @@ COutputPin::CreatePinHandle( // get dataformat offset DataFormat = (PKSDATAFORMAT)(PinConnect + 1); - + OutputDebugStringW(L"COutputPin::CreatePinHandle copy format\n"); // copy data format DataFormat->FormatSize = sizeof(KSDATAFORMAT) + pmt->cbFormat; DataFormat->Flags = 0; @@ -2131,13 +2171,19 @@ COutputPin::CreatePinHandle( if (pmt->cbFormat) { // copy extended format + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::CreatePinHandle copy format %p pbFormat %lu\n", pmt, pmt->cbFormat); + OutputDebugStringW(Buffer); CopyMemory((DataFormat + 1), pmt->pbFormat, pmt->cbFormat); } // get IKsObject interface hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); if (FAILED(hr)) + { + OutputDebugStringW(L"COutputPin::CreatePinHandle no IID_IKsObject interface\n"); return hr; + } // get parent filter handle hFilter = KsObjectParent->KsGetObjectHandle(); @@ -2146,13 +2192,19 @@ COutputPin::CreatePinHandle( KsObjectParent->Release(); if (!hFilter) - return E_HANDLE; - - // create pin - hr = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin); - - if (SUCCEEDED(hr)) { + OutputDebugStringW(L"COutputPin::CreatePinHandle no filter handle\n"); + return E_HANDLE; + } + + OutputDebugStringW(L"COutputPin::CreatePinHandle before creating pin\n"); + // create pin + DWORD dwError = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin); + + if (dwError == ERROR_SUCCESS) + { + OutputDebugStringW(L"COutputPin::CreatePinHandle created pin\n"); + // store current interface / medium CopyMemory(&m_Medium, Medium, sizeof(KSPIN_MEDIUM)); CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE)); @@ -2205,37 +2257,12 @@ COutputPin::CreatePinHandle( OutputDebugStringW(L"COutputPin::CreatePinHandle failed to initialize i/o thread\n"); } - LPGUID pGuid; - ULONG NumGuids = 0; - - // get all supported sets - hr = GetSupportedSets(&pGuid, &NumGuids); - if (FAILED(hr)) - { -#ifdef KSPROXY_TRACE - OutputDebugStringW(L"COutputPin::CreatePinHandle GetSupportedSets failed\n"); -#endif - return hr; - } - - // load all proxy plugins - hr = LoadProxyPlugins(pGuid, NumGuids); - if (FAILED(hr)) - { -#ifdef KSPROXY_TRACE - OutputDebugStringW(L"COutputPin::CreatePinHandle LoadProxyPlugins failed\n"); -#endif - return hr; - } - - // free sets - CoTaskMemFree(pGuid); - - //TODO // connect pin pipes } + else + OutputDebugStringW(L"COutputPin::CreatePinHandle failed to create pin\n"); // free pin connect CoTaskMemFree(PinConnect); diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.cpp b/reactos/dll/directx/msdvbnp/msdvbnp.cpp index 9b7f24517d6..9c1d309a500 100644 --- a/reactos/dll/directx/msdvbnp/msdvbnp.cpp +++ b/reactos/dll/directx/msdvbnp/msdvbnp.cpp @@ -152,7 +152,7 @@ DllRegisterServer(void) } RegisterBDAComponent(hFilter, L"{71985F4A-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Playback Filter"); - RegisterBDAComponent(hFilter, L"{71985F4B-1CA1-11D3-9CC8-00C04F7971E0}", L"BDA Network Providerss"); + RegisterBDAComponent(hFilter, L"{71985F4B-1CA1-11D3-9CC8-00C04F7971E0}", L"BDA Network Providers"); RegisterBDAComponent(hFilter, L"{71985F48-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Source Filter"); RegisterBDAComponent(hFilter, L"{A2E3074F-6C3D-11D3-B653-00C04F79498E}", L"BDA Transport Information Renderers"); RegisterBDAComponent(hFilter, L"{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}", L"BDA Receiver Component"); From 1aa1aee11c8365ce08090534e5bee9c58cf8cdf1 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 15 Apr 2010 12:54:04 +0000 Subject: [PATCH 128/261] [PSDK] - Add KS_DATARANGE_BDA_TRANSPORT Type - Fix build svn path=/trunk/; revision=46880 --- reactos/include/dxsdk/bdamedia.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/reactos/include/dxsdk/bdamedia.h b/reactos/include/dxsdk/bdamedia.h index 3cf12d5617b..f090af5b4c2 100644 --- a/reactos/include/dxsdk/bdamedia.h +++ b/reactos/include/dxsdk/bdamedia.h @@ -317,6 +317,20 @@ typedef enum { }KSPROPERTY_BDA_SIGNAL_STATS; +typedef struct tagBDA_TRANSPORT_INFO { + ULONG ulcbPhyiscalPacket; + ULONG ulcbPhyiscalFrame; + ULONG ulcbPhyiscalFrameAlignment; + REFERENCE_TIME AvgTimePerFrame; + +} BDA_TRANSPORT_INFO, *PBDA_TRANSPORT_INFO; + +typedef struct tagKS_DATARANGE_BDA_TRANSPORT +{ + KSDATARANGE DataRange; + BDA_TRANSPORT_INFO BdaTransportInfo; +} KS_DATARANGE_BDA_TRANSPORT, *PKS_DATARANGE_BDA_TRANSPORT; + /* ------------------------------------------------------------ BDA Stream Format GUIDs */ From 602b920bdd0ca1e1c378a4fd869bb96ea2233501 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 15 Apr 2010 14:09:38 +0000 Subject: [PATCH 129/261] [BDASUP] - Fix build svn path=/trunk/; revision=46881 --- reactos/drivers/multimedia/bdasup/precomp.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/drivers/multimedia/bdasup/precomp.h b/reactos/drivers/multimedia/bdasup/precomp.h index db581728221..45a603ddecd 100644 --- a/reactos/drivers/multimedia/bdasup/precomp.h +++ b/reactos/drivers/multimedia/bdasup/precomp.h @@ -3,6 +3,9 @@ #include #include #include +#define NOBITMAP +#include +#include #include #include #include From e44ad6135e7bc0f34290d5f99f1e83827297282d Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 15 Apr 2010 16:33:25 +0000 Subject: [PATCH 130/261] [SHELL32] - Use the default action when starting processes from the run dialog (r29143, lost due to a sync) - Control panels can be launched from run again - Display localized error text as messagebox caption instead of "Nix" See issue #4026 for more details. svn path=/trunk/; revision=46882 --- reactos/dll/win32/shell32/dialogs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/shell32/dialogs.c b/reactos/dll/win32/shell32/dialogs.c index 792ed62be1b..fa09de07916 100644 --- a/reactos/dll/win32/shell32/dialogs.c +++ b/reactos/dll/win32/shell32/dialogs.c @@ -344,7 +344,7 @@ static INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPAR else pdir[3] = '\0'; } - if (ShellExecuteA(NULL, "open", psz, NULL, pdir, SW_SHOWNORMAL) < (HINSTANCE)33) + if (ShellExecuteA(NULL, NULL, psz, NULL, pdir, SW_SHOWNORMAL) < (HINSTANCE)33) { char *pszSysMsg = NULL ; FormatMessageA ( @@ -357,7 +357,7 @@ static INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPAR ) ; sprintf (szMsg, "Error: %s", pszSysMsg) ; LocalFree ((HLOCAL)pszSysMsg) ; - MessageBoxA (hwnd, szMsg, "Nix", MB_OK | MB_ICONEXCLAMATION) ; + MessageBoxA (hwnd, szMsg, NULL, MB_OK | MB_ICONEXCLAMATION) ; HeapFree(GetProcessHeap(), 0, psz); HeapFree(GetProcessHeap(), 0, pdir); From cf40c11ad3e62239da72189c152a313f346576f2 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Apr 2010 18:42:48 +0000 Subject: [PATCH 131/261] [GENINC] Add some more constants svn path=/trunk/; revision=46883 --- reactos/tools/geninc/data.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reactos/tools/geninc/data.c b/reactos/tools/geninc/data.c index f7563b514e2..b53807109d3 100644 --- a/reactos/tools/geninc/data.c +++ b/reactos/tools/geninc/data.c @@ -350,6 +350,15 @@ ASMGENDATA Table[] = #ifdef _M_IX86 + HEADER("EFLAGS"), + CONSTANT(EFLAGS_TF), + CONSTANT(EFLAGS_INTERRUPT_MASK), + CONSTANT(EFLAGS_V86_MASK), + CONSTANT(EFLAGS_ALIGN_CHECK), + CONSTANT(EFLAGS_VIF), + CONSTANT(EFLAGS_VIP), + CONSTANT(EFLAGS_USER_SANITIZE), + HEADER("KDGT selectors"), CONSTANT(KGDT_R3_DATA), CONSTANT(KGDT_R3_CODE), @@ -413,6 +422,13 @@ ASMGENDATA Table[] = #elif defined(_M_AMD64) + HEADER("EFLAGS"), + CONSTANT(EFLAGS_TF_MASK), + CONSTANT(EFLAGS_TF_SHIFT), + CONSTANT(EFLAGS_IF_MASK), + CONSTANT(EFLAGS_IF_SHIFT), + CONSTANT(EFLAGS_ID_MASK), + HEADER("Hypervisor Enlightenment Definitions"), CONSTANT(HV_MMU_USE_HYPERCALL_FOR_ADDRESS_SWITCH), CONSTANT(HV_MMU_USE_HYPERCALL_FOR_LOCAL_FLUSH), From 2899a12647dbdfe8e8f39444c01566cefc3d8ee1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Apr 2010 18:47:44 +0000 Subject: [PATCH 132/261] [RBUILD] - Link C++ apps to libsupc++.a, needed for recent versions of gcc - remove amd64 hack svn path=/trunk/; revision=46884 --- reactos/tools/rbuild/backend/mingw/mingw.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index 76289ac5f5c..7afb0da8ff4 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -481,13 +481,10 @@ MingwBackend::GenerateGlobalVariables () const fprintf ( fMakefile, "PROJECT_CCLIBS := \"$(shell ${TARGET_CC} -print-libgcc-file-name)\"\n" ); - fprintf ( fMakefile, "PROJECT_CXXLIBS := \"$(shell ${TARGET_CPP} -print-file-name=libstdc++.a)\" \"$(shell ${TARGET_CPP} -print-libgcc-file-name)\" \"$(shell ${TARGET_CPP} -print-file-name=libmingw32.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libmingwex.a)\"" ); + fprintf ( fMakefile, "PROJECT_CXXLIBS := \"$(shell ${TARGET_CPP} -print-file-name=libsupc++.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libstdc++.a)\" \"$(shell ${TARGET_CPP} -print-libgcc-file-name)\" \"$(shell ${TARGET_CPP} -print-file-name=libmingw32.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libmingwex.a)\"" ); - /* hack to get libgcc_eh.a, should check mingw version or something */ - if (Environment::GetArch() == "amd64") - fprintf ( fMakefile, " \"$(shell ${TARGET_CPP} -print-file-name=libgcc_eh.a)\"" ); /* hack to get _get_output_format, needed by libmingwex */ - else if (Environment::GetArch() == "i386") + if (Environment::GetArch() == "i386") fprintf ( fMakefile, " \"$(shell ${TARGET_CPP} -print-file-name=libcoldname.a)\" "); fprintf ( fMakefile,"\n"); } From 1bb3aa823948e275314122ac4ef6d0d0bce98a1c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Apr 2010 20:07:18 +0000 Subject: [PATCH 133/261] [MSIMTF] Silence debug flood svn path=/trunk/; revision=46886 --- reactos/dll/win32/msimtf/activeimmapp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/msimtf/activeimmapp.c b/reactos/dll/win32/msimtf/activeimmapp.c index 73ce0758c70..d8446267893 100644 --- a/reactos/dll/win32/msimtf/activeimmapp.c +++ b/reactos/dll/win32/msimtf/activeimmapp.c @@ -655,7 +655,7 @@ static HRESULT WINAPI ActiveIMMApp_Deactivate(IActiveIMMApp* This) static HRESULT WINAPI ActiveIMMApp_OnDefWindowProc(IActiveIMMApp* This, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { - FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); + //FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); return E_FAIL; } From 3e8240e837a06c808640662cbc4c54697513348d Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 15 Apr 2010 21:01:12 +0000 Subject: [PATCH 134/261] [DESK] - Don't autoequip listview item selections upon item creation - Handle selections via SetItemState, select newly added items that way - Fixes current background wallpaper item not being selected initially and selection being ignored later See issue #5030,5116 for more details. svn path=/trunk/; revision=46887 --- reactos/dll/cpl/desk/background.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/reactos/dll/cpl/desk/background.c b/reactos/dll/cpl/desk/background.c index fe4362a30a2..c03c66dc4a4 100644 --- a/reactos/dll/cpl/desk/background.c +++ b/reactos/dll/cpl/desk/background.c @@ -94,14 +94,17 @@ AddListViewItems(HWND hwndDlg, PGLOBAL_DATA pGlobalData) ZeroMemory(&listItem, sizeof(LV_ITEM)); listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; - listItem.state = LVIS_SELECTED; + listItem.state = 0; listItem.pszText = backgroundItem->szDisplayName; listItem.iImage = -1; listItem.iItem = pGlobalData->listViewItemCount; listItem.lParam = pGlobalData->listViewItemCount; (void)ListView_InsertItem(hwndBackgroundList, &listItem); - ListView_SetItemState(hwndBackgroundList, pGlobalData->listViewItemCount, LVIS_SELECTED, LVIS_SELECTED); + ListView_SetItemState(hwndBackgroundList, + pGlobalData->listViewItemCount, + LVIS_SELECTED, + LVIS_SELECTED); pGlobalData->listViewItemCount++; @@ -143,14 +146,17 @@ AddListViewItems(HWND hwndDlg, PGLOBAL_DATA pGlobalData) ZeroMemory(&listItem, sizeof(LV_ITEM)); listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; - listItem.state = LVIS_SELECTED; + listItem.state = 0; listItem.pszText = backgroundItem->szDisplayName; listItem.iImage = sfi.iIcon; listItem.iItem = pGlobalData->listViewItemCount; listItem.lParam = pGlobalData->listViewItemCount; (void)ListView_InsertItem(hwndBackgroundList, &listItem); - ListView_SetItemState(hwndBackgroundList, pGlobalData->listViewItemCount, LVIS_SELECTED, LVIS_SELECTED); + ListView_SetItemState(hwndBackgroundList, + pGlobalData->listViewItemCount, + LVIS_SELECTED, + LVIS_SELECTED); pGlobalData->listViewItemCount++; } @@ -454,13 +460,17 @@ OnBrowseButton(HWND hwndDlg, PGLOBAL_DATA pGlobalData) ZeroMemory(&listItem, sizeof(LV_ITEM)); listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; - listItem.state = LVIS_SELECTED; + listItem.state = 0; listItem.pszText = backgroundItem->szDisplayName; listItem.iImage = sfi.iIcon; listItem.iItem = pGlobalData->listViewItemCount; listItem.lParam = pGlobalData->listViewItemCount; (void)ListView_InsertItem(hwndBackgroundList, &listItem); + ListView_SetItemState(hwndBackgroundList, + pGlobalData->listViewItemCount, + LVIS_SELECTED, + LVIS_SELECTED); SendMessage(hwndBackgroundList, WM_VSCROLL, SB_BOTTOM, 0); pGlobalData->listViewItemCount++; From d6c85206c0f1791e07ad07d24091f684a61a8552 Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Fri, 16 Apr 2010 10:48:02 +0000 Subject: [PATCH 135/261] Fix the make path. Should fix building using the RosBuild config in Visual Studio svn path=/trunk/; revision=46893 --- reactos/rosbuild.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/rosbuild.bat b/reactos/rosbuild.bat index 21f814b33a3..c8f5a7ce6c5 100644 --- a/reactos/rosbuild.bat +++ b/reactos/rosbuild.bat @@ -41,7 +41,7 @@ set "_ROSBE_FULL_PATH_=%_ROSBE_PATH_DIR%%_ROSBE_PATH_%" ::echo RosBE insall path = %_ROSBE_FULL_PATH_% :: Set the path which contains our build tools -set _ROSBE_BIN_PATH=%_ROSBE_FULL_PATH_%i386\bin +set _ROSBE_BIN_PATH=%_ROSBE_FULL_PATH_%Tools :: Add the path to the search path path=%path%;%_ROSBE_BIN_PATH% From 2dba0d93477e793d1a52482314942f8719d1ca41 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 16 Apr 2010 14:30:40 +0000 Subject: [PATCH 136/261] [NOTEPAD] - Create a font even if no registry settings were loaded - Patch by Rafal Harabien, See issue #4066 for more details. svn path=/trunk/; revision=46897 --- reactos/base/applications/notepad/settings.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/base/applications/notepad/settings.c b/reactos/base/applications/notepad/settings.c index 862e4fb755e..9a68c8b43db 100644 --- a/reactos/base/applications/notepad/settings.c +++ b/reactos/base/applications/notepad/settings.c @@ -147,16 +147,16 @@ void LoadSettings(void) if (dwPointSize != 0) Globals.lfFont.lfHeight = HeightFromPointSize(dwPointSize); - hFont = CreateFontIndirect(&Globals.lfFont); - if (hFont) - { - if (Globals.hFont) - DeleteObject(Globals.hFont); - Globals.hFont = hFont; - } - RegCloseKey(hKey); } + + hFont = CreateFontIndirect(&Globals.lfFont); + if (hFont) + { + if (Globals.hFont) + DeleteObject(Globals.hFont); + Globals.hFont = hFont; + } } static BOOL SaveDword(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwValue) From 76e18f2271386f64143c5adbe6053616c286e706 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 16 Apr 2010 14:47:46 +0000 Subject: [PATCH 137/261] [PING] - Skip the last unnecessary wait in a series of pings - Patch by Rafal Harabien, See issue #5300 for more details. svn path=/trunk/; revision=46898 --- reactos/base/applications/network/ping/ping.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/base/applications/network/ping/ping.c b/reactos/base/applications/network/ping/ping.c index b9635e24865..b2d48ca5ba3 100644 --- a/reactos/base/applications/network/ping/ping.c +++ b/reactos/base/applications/network/ping/ping.c @@ -630,8 +630,9 @@ int main(int argc, char* argv[]) while ((NeverStop) || (Count < PingCount)) { Ping(); - Sleep(Timeout); Count++; + if((NeverStop) || (Count < PingCount)) + Sleep(Timeout); }; Cleanup(); From a40f637b41b6efb41822792a24b5c1897ab9294b Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Fri, 16 Apr 2010 21:22:06 +0000 Subject: [PATCH 138/261] [SHELL32] - Add support for deleting multiple files from the context menu - Fix error debug print See issue #4383 for more details. svn path=/trunk/; revision=46900 --- reactos/dll/win32/shell32/shv_def_cmenu.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/reactos/dll/win32/shell32/shv_def_cmenu.c b/reactos/dll/win32/shell32/shv_def_cmenu.c index 71c25a7d407..08c9c3c9c74 100644 --- a/reactos/dll/win32/shell32/shv_def_cmenu.c +++ b/reactos/dll/win32/shell32/shv_def_cmenu.c @@ -48,7 +48,7 @@ static LPIDefaultContextMenuImpl __inline impl_from_IContextMenu( IContextMenu2 } VOID INewItem_SetCurrentShellFolder(IShellFolder * psfParent); // HACK - +WCHAR *build_paths_list(LPCWSTR wszBasePath, int cidl, LPCITEMIDLIST *pidls); static HRESULT @@ -1297,12 +1297,12 @@ DoDelete( HRESULT hr; STRRET strTemp; WCHAR szPath[MAX_PATH]; + LPWSTR wszPath, wszPos; SHFILEOPSTRUCTW op; int ret; LPSHELLBROWSER lpSB; HWND hwnd; - hr = IShellFolder2_GetDisplayNameOf(This->dcm.psf, This->dcm.apidl[0], SHGDN_FORPARSING, &strTemp); if(hr != S_OK) { @@ -1316,20 +1316,26 @@ DoDelete( ERR("StrRetToBufW failed with %x\n", hr); return hr; } - /* FIXME - * implement deletion with multiple files - */ + + /* Only keep the base path */ + wszPos = strrchrW(szPath, '\\'); + if (wszPos != NULL) + { + *(wszPos + 1) = '\0'; + } + + wszPath = build_paths_list(szPath, This->dcm.cidl, This->dcm.apidl); ZeroMemory(&op, sizeof(op)); op.hwnd = GetActiveWindow(); op.wFunc = FO_DELETE; - op.pFrom = szPath; + op.pFrom = wszPath; op.fFlags = FOF_ALLOWUNDO; ret = SHFileOperationW(&op); if (ret) { - TRACE("SHFileOperation failed with %0x%x", GetLastError()); + ERR("SHFileOperation failed with 0x%x for %s\n", GetLastError(), debugstr_w(wszPath)); return S_OK; } @@ -1348,6 +1354,7 @@ DoDelete( } NotifyShellViewWindow(lpcmi, TRUE); + HeapFree(GetProcessHeap(), 0, wszPath); return S_OK; } From 03eaad9b130e7f44db331566cefee406dc7a82d6 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sat, 17 Apr 2010 14:28:15 +0000 Subject: [PATCH 139/261] [NTOS]: 1MB is not 1000 * 1KB... svn path=/trunk/; revision=46904 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 389781cbb04..1ced65de25d 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -40,7 +40,7 @@ /* Make the code cleaner with some definitions for size multiples */ #define _1KB (1024) -#define _1MB (1000 * _1KB) +#define _1MB (1024 * _1KB) /* Size of a PDE directory, and size of a page table */ #define PDE_SIZE (PDE_COUNT * sizeof(MMPDE)) @@ -127,6 +127,12 @@ extern PVOID PoolTrackTable; // END FIXFIX // +typedef struct _MI_LARGE_PAGE_DRIVER_ENTRY +{ + LIST_ENTRY Links; + UNICODE_STRING BaseName; +} MI_LARGE_PAGE_DRIVER_ENTRY, *PMI_LARGE_PAGE_DRIVER_ENTRY; + typedef enum _MMSYSTEM_PTE_POOL_TYPE { SystemPteSpace, @@ -235,6 +241,9 @@ extern PFN_NUMBER MiLowNonPagedPoolThreshold; extern PFN_NUMBER MiHighNonPagedPoolThreshold; extern PFN_NUMBER MmMinimumFreePages; extern PFN_NUMBER MmPlentyFreePages; +extern PFN_NUMBER MiExpansionPoolPagesInitialCharge; +extern PFN_NUMBER MmResidentAvailablePages; +extern PFN_NUMBER MmResidentAvailablePagesAtInit; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) From 22fbcbfd9126f70f22d4c93809927ece1c5182e2 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 17 Apr 2010 20:02:12 +0000 Subject: [PATCH 140/261] [SHELL32] - Simplify checks for success of ShellExecuteEx, field hInst may be an unreliable indicator according to http://msdn.microsoft.com/en-us/library/bb759784%28v=VS.85%29.aspx - Fixes folder options control panel opening twice See issue #4910 for more details. svn path=/trunk/; revision=46907 --- reactos/dll/win32/shell32/shfldr_cpanel.c | 4 ++-- reactos/dll/win32/shell32/shfldr_fonts.c | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/shell32/shfldr_cpanel.c b/reactos/dll/win32/shell32/shfldr_cpanel.c index 57e3701d88f..bf8b632f8eb 100644 --- a/reactos/dll/win32/shell32/shfldr_cpanel.c +++ b/reactos/dll/win32/shell32/shfldr_cpanel.c @@ -1298,8 +1298,8 @@ static HRESULT WINAPI ICPanel_IContextMenu2_InvokeCommand( sei.hwnd = lpcmi->hwnd; sei.nShow = SW_SHOWNORMAL; sei.lpVerb = L"open"; - ShellExecuteExW(&sei); - if (sei.hInstApp <= (HINSTANCE)32) + + if (ShellExecuteExW(&sei) == FALSE) return E_FAIL; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_CREATELINK)) //FIXME diff --git a/reactos/dll/win32/shell32/shfldr_fonts.c b/reactos/dll/win32/shell32/shfldr_fonts.c index d4f87b68b6e..4ec244f00ab 100644 --- a/reactos/dll/win32/shell32/shfldr_fonts.c +++ b/reactos/dll/win32/shell32/shfldr_fonts.c @@ -979,8 +979,7 @@ static HRESULT WINAPI ISF_Fonts_IContextMenu2_InvokeCommand( pfont = _ILGetFontStruct(This->apidl); sei.lpFile = pfont->szName + pfont->offsFile; - ShellExecuteExW(&sei); - if (sei.hInstApp <= (HINSTANCE)32) + if (ShellExecuteExW(&sei) == FALSE) return E_FAIL; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(4)) From cb8592ebd40b2b31a309f59411077d270620bc4a Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 17 Apr 2010 20:59:59 +0000 Subject: [PATCH 141/261] [GDI32] GetFontUnicodeRanges was introduced in Windows 2000, patch by Love Nystrom See issue #5031 for more details. svn path=/trunk/; revision=46910 --- reactos/include/psdk/wingdi.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/include/psdk/wingdi.h b/reactos/include/psdk/wingdi.h index edfbae652f3..cad35c7d659 100644 --- a/reactos/include/psdk/wingdi.h +++ b/reactos/include/psdk/wingdi.h @@ -3050,7 +3050,9 @@ UINT WINAPI GetEnhMetaFilePaletteEntries(HENHMETAFILE,UINT,LPPALETTEENTRY); UINT WINAPI GetEnhMetaFilePixelFormat(HENHMETAFILE,UINT,PIXELFORMATDESCRIPTOR*); DWORD WINAPI GetFontData(HDC,DWORD,DWORD,PVOID,DWORD); DWORD WINAPI GetFontLanguageInfo(HDC); +#if (_WIN32_WINNT >= 0x0500) DWORD WINAPI GetFontUnicodeRanges(HDC,LPGLYPHSET); +#endif DWORD WINAPI GetGlyphIndicesA(HDC,LPCSTR,INT,LPWORD,DWORD); DWORD WINAPI GetGlyphIndicesW(HDC,LPCWSTR,INT,LPWORD,DWORD); DWORD WINAPI GetGlyphOutlineA(HDC,UINT,UINT,LPGLYPHMETRICS,DWORD,PVOID,const MAT2*); From 9ce679f7cf2f2625a75520a93814b77c57b5f616 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 17 Apr 2010 23:13:07 +0000 Subject: [PATCH 142/261] [NTOSKRNL] - Hackfix the device manager issue svn path=/trunk/; revision=46912 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 9fb57d86d18..35c7447dc41 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -502,9 +502,12 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, UNICODE_STRING FullServiceName; UNICODE_STRING LegacyPrefix = RTL_CONSTANT_STRING(L"LEGACY_"); UNICODE_STRING UnknownDeviceName = RTL_CONSTANT_STRING(L"UNKNOWN"); - UNICODE_STRING KeyName, ClassName, ClassGUID; + UNICODE_STRING KeyName, ClassName; PUNICODE_STRING ServiceName1; ULONG LegacyValue; +#if 0 + UNICODE_STRING ClassGUID; +#endif HANDLE InstanceHandle; DPRINT("ParentNode 0x%p PhysicalDeviceObject 0x%p ServiceName %wZ\n", @@ -587,6 +590,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, RtlInitUnicodeString(&ClassName, L"LegacyDriver"); Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_SZ, ClassName.Buffer, ClassName.Length); +#if 0 if (NT_SUCCESS(Status)) { RtlInitUnicodeString(&KeyName, L"ClassGUID"); @@ -594,6 +598,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, RtlInitUnicodeString(&ClassGUID, L"{8ECC055D-047F-11D1-A537-0000F8753ED1}"); Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_SZ, ClassGUID.Buffer, ClassGUID.Length); } +#endif } } From b3be7aba54b3fa0f238c99f6925e9f6d33ab464c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 17 Apr 2010 23:32:29 +0000 Subject: [PATCH 143/261] [PCMCIA] - Check if the IOCTL interface should be enabled (not used yet) svn path=/trunk/; revision=46913 --- reactos/drivers/bus/pcmcia/pcmcia.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/bus/pcmcia/pcmcia.c b/reactos/drivers/bus/pcmcia/pcmcia.c index b9c32579bec..54d23da7f50 100644 --- a/reactos/drivers/bus/pcmcia/pcmcia.c +++ b/reactos/drivers/bus/pcmcia/pcmcia.c @@ -11,6 +11,8 @@ //#define NDEBUG #include +BOOLEAN IoctlEnabled; + NTSTATUS NTAPI PcmciaCreateClose(PDEVICE_OBJECT DeviceObject, @@ -202,6 +204,11 @@ NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + NTSTATUS Status; + + DPRINT1("PCMCIA: DriverEntry\n"); + DriverObject->MajorFunction[IRP_MJ_CREATE] = PcmciaCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = PcmciaCreateClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PcmciaDeviceControl; @@ -211,7 +218,25 @@ DriverEntry(PDRIVER_OBJECT DriverObject, DriverObject->DriverExtension->AddDevice = PcmciaAddDevice; DriverObject->DriverUnload = PcmciaUnload; - DPRINT1("PCMCIA: DriverEntry\n"); + RtlZeroMemory(QueryTable, sizeof(RTL_QUERY_REGISTRY_TABLE) * 2); + + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].Name = L"IoctlInterface"; + QueryTable[0].EntryContext = &IoctlEnabled; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, + L"Pcmcia\\Parameters", + QueryTable, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + { + /* Key not present so assume disabled */ + IoctlEnabled = FALSE; + } + + DPRINT("PCMCIA: Ioctl interface %s\n", + (IoctlEnabled ? "enabled" : "disabled")); return STATUS_SUCCESS; } From 78db5f0d71707309243a3b10011137959028d8ca Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 18 Apr 2010 12:06:29 +0000 Subject: [PATCH 144/261] [NTMARTA] - AccRewriteSetEntriesInAcl: Fix a bug that caused the for loop never to complete due to reuse of same variable. svn path=/trunk/; revision=46916 --- reactos/dll/win32/ntmarta/ntmarta.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/ntmarta/ntmarta.c b/reactos/dll/win32/ntmarta/ntmarta.c index e077b0570be..f6e77d4cbef 100644 --- a/reactos/dll/win32/ntmarta/ntmarta.c +++ b/reactos/dll/win32/ntmarta/ntmarta.c @@ -1236,7 +1236,7 @@ AccRewriteSetEntriesInAcl(ULONG cCountOfExplicitEntries, DWORD ObjectsPresent; BOOL needToClean; PSID pSid1, pSid2; - ULONG i; + ULONG i, j; LSA_HANDLE PolicyHandle = NULL; BOOL bRet; DWORD LastErr; @@ -1295,11 +1295,11 @@ AccRewriteSetEntriesInAcl(ULONG cCountOfExplicitEntries, case REVOKE_ACCESS: case SET_ACCESS: /* Discard all accesses for the trustee... */ - for (i = 0; i < SizeInformation.AceCount; i++) + for (j = 0; j < SizeInformation.AceCount; j++) { - if (!pKeepAce[i]) + if (!pKeepAce[j]) continue; - if (!GetAce(OldAcl, i, (PVOID*)&pAce)) + if (!GetAce(OldAcl, j, (PVOID*)&pAce)) { Ret = GetLastError(); goto Cleanup; @@ -1308,7 +1308,7 @@ AccRewriteSetEntriesInAcl(ULONG cCountOfExplicitEntries, pSid2 = AccpGetAceSid(pAce); if (RtlEqualSid(pSid1, pSid2)) { - pKeepAce[i] = FALSE; + pKeepAce[j] = FALSE; SizeInformation.AclBytesInUse -= pAce->AceSize; } } From f272498345f3f84a4b5ab9e88e6dc5787d121c2a Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 18 Apr 2010 12:42:28 +0000 Subject: [PATCH 145/261] [USER32] - Fix SetSysColorTemps prototype and implementation for 64 bit compatibility. svn path=/trunk/; revision=46917 --- reactos/dll/win32/user32/misc/stubs.c | 4 ++-- reactos/include/psdk/winuser.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/user32/misc/stubs.c b/reactos/dll/win32/user32/misc/stubs.c index b053f389da9..c141ef6f6c2 100644 --- a/reactos/dll/win32/user32/misc/stubs.c +++ b/reactos/dll/win32/user32/misc/stubs.c @@ -170,7 +170,7 @@ UserRealizePalette ( HDC hDC ) static HPEN SysColorPens[COLOR_MENUBAR + 1]; static HBRUSH SysColorBrushes[COLOR_MENUBAR + 1]; -DWORD +DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *pPens, const HBRUSH *pBrushes, @@ -193,7 +193,7 @@ SetSysColorsTemp(const COLORREF *pPens, SysColorBrushes[i] = pBrushes[i]; } - return (DWORD) pOldCol; /* FIXME: pointer truncation */ + return (DWORD_PTR) pOldCol; } if (!pPens && !pBrushes) /* "restore" call */ { diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index bea47d14f05..bf3fff87bee 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -4442,7 +4442,7 @@ int WINAPI SetScrollInfo(HWND,int,LPCSCROLLINFO,BOOL); int WINAPI SetScrollPos(HWND,int,int,BOOL); BOOL WINAPI SetScrollRange(HWND,int,int,int,BOOL); BOOL WINAPI SetSysColors(int,const INT *,const COLORREF *); -DWORD WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD); +DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD); #define SetSysModalWindow(h) (NULL) BOOL WINAPI SetSystemCursor(HCURSOR,DWORD); BOOL WINAPI SetSystemMenu(HWND,HMENU); From e5a3966fdd04fbf577df5da35d2d9b5bbc51482a Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 18 Apr 2010 12:46:53 +0000 Subject: [PATCH 146/261] [USER32] - Fix SetSysColorTemps prototype and implementation for 64 bit compatibility, part 2/2. svn path=/trunk/; revision=46918 --- reactos/dll/win32/user32/misc/stubs.c | 4 ++-- reactos/include/psdk/winuser.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/user32/misc/stubs.c b/reactos/dll/win32/user32/misc/stubs.c index c141ef6f6c2..06608d8c6ff 100644 --- a/reactos/dll/win32/user32/misc/stubs.c +++ b/reactos/dll/win32/user32/misc/stubs.c @@ -174,7 +174,7 @@ DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *pPens, const HBRUSH *pBrushes, - DWORD n) + DWORD_PTR n) { DWORD i; @@ -183,7 +183,7 @@ SetSysColorsTemp(const COLORREF *pPens, /* allocate our structure to remember old colors */ LPVOID pOldCol = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD)+n*sizeof(HPEN)+n*sizeof(HBRUSH)); LPVOID p = pOldCol; - *(DWORD *)p = n; p = (char*)p + sizeof(DWORD); + *(DWORD_PTR *)p = n; p = (char*)p + sizeof(DWORD); memcpy(p, SysColorPens, n*sizeof(HPEN)); p = (char*)p + n*sizeof(HPEN); memcpy(p, SysColorBrushes, n*sizeof(HBRUSH)); p = (char*)p + n*sizeof(HBRUSH); diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index bf3fff87bee..21cdf040f9d 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -4442,7 +4442,7 @@ int WINAPI SetScrollInfo(HWND,int,LPCSCROLLINFO,BOOL); int WINAPI SetScrollPos(HWND,int,int,BOOL); BOOL WINAPI SetScrollRange(HWND,int,int,int,BOOL); BOOL WINAPI SetSysColors(int,const INT *,const COLORREF *); -DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD); +DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD_PTR); #define SetSysModalWindow(h) (NULL) BOOL WINAPI SetSystemCursor(HCURSOR,DWORD); BOOL WINAPI SetSystemMenu(HWND,HMENU); From 250867ddb37847b34295f77f25664ac8c5aa3685 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 18 Apr 2010 18:20:33 +0000 Subject: [PATCH 147/261] Samuel Serapion - Assorted rbuild syntax fixes. svn path=/trunk/; revision=46927 --- .../base/applications/cmdutils/reg/reg.rbuild | 2 + .../applications/downloader/downloader.rbuild | 43 ++++++++++--------- .../applications/fontview/fontview.rbuild | 2 + .../applications/kbswitch/kbswitch.rbuild | 1 + .../base/applications/magnify/magnify.rbuild | 2 +- .../base/applications/mplay32/mplay32.rbuild | 2 + .../mscutils/eventvwr/eventvwr.rbuild | 3 +- reactos/base/applications/rapps/rapps.rbuild | 2 + .../base/applications/winver/winver.rbuild | 2 + reactos/base/services/rpcss/rpcss.rbuild | 2 +- reactos/base/services/telnetd/telnetd.rbuild | 2 + reactos/base/services/tftpd/tftpd.rbuild | 4 +- reactos/base/system/runonce/runonce.rbuild | 2 + reactos/boot/bootdata/bootcd/bootcd.rbuild | 6 ++- reactos/boot/bootdata/livecd/livecd.rbuild | 6 ++- .../boot/freeldr/freeldr/freeldr_arch.rbuild | 2 +- reactos/dll/win32/actxprxy/actxprxy.rbuild | 3 +- reactos/dll/win32/msacm32/msacm32.rbuild | 2 +- reactos/drivers/bus/acpi/acpi.rbuild | 3 +- 19 files changed, 55 insertions(+), 36 deletions(-) diff --git a/reactos/base/applications/cmdutils/reg/reg.rbuild b/reactos/base/applications/cmdutils/reg/reg.rbuild index ce9a744808d..ac33ef4fd0b 100644 --- a/reactos/base/applications/cmdutils/reg/reg.rbuild +++ b/reactos/base/applications/cmdutils/reg/reg.rbuild @@ -1,3 +1,5 @@ + + . 0x600 diff --git a/reactos/base/applications/downloader/downloader.rbuild b/reactos/base/applications/downloader/downloader.rbuild index 9ea43dc81f4..b45df064ce0 100644 --- a/reactos/base/applications/downloader/downloader.rbuild +++ b/reactos/base/applications/downloader/downloader.rbuild @@ -1,25 +1,26 @@ - - downloader.xml - - . - . + + +downloader.xml + + . + . - advapi32 - ntdll - user32 - gdi32 - shell32 - comctl32 - msimg32 - shlwapi - urlmon - uuid - expat + advapi32 + ntdll + user32 + gdi32 + shell32 + comctl32 + msimg32 + shlwapi + urlmon + uuid + expat - main.c - xml.c - download.c - downloader.rc - + main.c + xml.c + download.c + downloader.rc + diff --git a/reactos/base/applications/fontview/fontview.rbuild b/reactos/base/applications/fontview/fontview.rbuild index 8ceda786c4b..f5cad36f1a9 100644 --- a/reactos/base/applications/fontview/fontview.rbuild +++ b/reactos/base/applications/fontview/fontview.rbuild @@ -1,3 +1,5 @@ + + . gdi32 diff --git a/reactos/base/applications/kbswitch/kbswitch.rbuild b/reactos/base/applications/kbswitch/kbswitch.rbuild index 2eed0b22bb0..11ea960adae 100644 --- a/reactos/base/applications/kbswitch/kbswitch.rbuild +++ b/reactos/base/applications/kbswitch/kbswitch.rbuild @@ -1,4 +1,5 @@ + . diff --git a/reactos/base/applications/magnify/magnify.rbuild b/reactos/base/applications/magnify/magnify.rbuild index 995437d3826..8c06ce8e5bf 100644 --- a/reactos/base/applications/magnify/magnify.rbuild +++ b/reactos/base/applications/magnify/magnify.rbuild @@ -1,5 +1,5 @@ - + . user32 diff --git a/reactos/base/applications/mplay32/mplay32.rbuild b/reactos/base/applications/mplay32/mplay32.rbuild index c472e6f0207..77003d90898 100644 --- a/reactos/base/applications/mplay32/mplay32.rbuild +++ b/reactos/base/applications/mplay32/mplay32.rbuild @@ -1,3 +1,5 @@ + + . advapi32 diff --git a/reactos/base/applications/mscutils/eventvwr/eventvwr.rbuild b/reactos/base/applications/mscutils/eventvwr/eventvwr.rbuild index 367c19e5bb4..cb23e1f3eef 100644 --- a/reactos/base/applications/mscutils/eventvwr/eventvwr.rbuild +++ b/reactos/base/applications/mscutils/eventvwr/eventvwr.rbuild @@ -1,5 +1,5 @@ - + . user32 @@ -8,4 +8,3 @@ eventvwr.c eventvwr.rc - diff --git a/reactos/base/applications/rapps/rapps.rbuild b/reactos/base/applications/rapps/rapps.rbuild index 066b3ba7a9b..bc83f3aade9 100644 --- a/reactos/base/applications/rapps/rapps.rbuild +++ b/reactos/base/applications/rapps/rapps.rbuild @@ -1,3 +1,5 @@ + + include/reactos diff --git a/reactos/base/applications/winver/winver.rbuild b/reactos/base/applications/winver/winver.rbuild index 89ff51c8ce4..4f24a7166bd 100644 --- a/reactos/base/applications/winver/winver.rbuild +++ b/reactos/base/applications/winver/winver.rbuild @@ -1,3 +1,5 @@ + + . shell32 diff --git a/reactos/base/services/rpcss/rpcss.rbuild b/reactos/base/services/rpcss/rpcss.rbuild index 04e42f81de9..95b29e83210 100644 --- a/reactos/base/services/rpcss/rpcss.rbuild +++ b/reactos/base/services/rpcss/rpcss.rbuild @@ -1,5 +1,5 @@ - + . diff --git a/reactos/base/services/telnetd/telnetd.rbuild b/reactos/base/services/telnetd/telnetd.rbuild index 8ccb81d2004..1b17bfcb83f 100644 --- a/reactos/base/services/telnetd/telnetd.rbuild +++ b/reactos/base/services/telnetd/telnetd.rbuild @@ -1,3 +1,5 @@ + + .. diff --git a/reactos/base/services/tftpd/tftpd.rbuild b/reactos/base/services/tftpd/tftpd.rbuild index be34bb7f3ab..0008cfb287e 100644 --- a/reactos/base/services/tftpd/tftpd.rbuild +++ b/reactos/base/services/tftpd/tftpd.rbuild @@ -1,11 +1,11 @@ + + .. - ntdll advapi32 ws2_32 wine - tftpd.cpp diff --git a/reactos/base/system/runonce/runonce.rbuild b/reactos/base/system/runonce/runonce.rbuild index 950580d56ad..9dba7660b1c 100644 --- a/reactos/base/system/runonce/runonce.rbuild +++ b/reactos/base/system/runonce/runonce.rbuild @@ -1,3 +1,5 @@ + + . advapi32 diff --git a/reactos/boot/bootdata/bootcd/bootcd.rbuild b/reactos/boot/bootdata/bootcd/bootcd.rbuild index 471a7f4863e..f84fa71372b 100644 --- a/reactos/boot/bootdata/bootcd/bootcd.rbuild +++ b/reactos/boot/bootdata/bootcd/bootcd.rbuild @@ -1,12 +1,14 @@ - + isoboot - isoboot + diff --git a/reactos/boot/bootdata/livecd/livecd.rbuild b/reactos/boot/bootdata/livecd/livecd.rbuild index e92deca42ce..8a04d1289bc 100644 --- a/reactos/boot/bootdata/livecd/livecd.rbuild +++ b/reactos/boot/bootdata/livecd/livecd.rbuild @@ -1,12 +1,14 @@ - + isoboot - isoboot + diff --git a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild index 2b8a8b288ab..6aa231c258a 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild @@ -1,5 +1,5 @@ - + include cache diff --git a/reactos/dll/win32/actxprxy/actxprxy.rbuild b/reactos/dll/win32/actxprxy/actxprxy.rbuild index f5272b585cf..c8b28ca5891 100644 --- a/reactos/dll/win32/actxprxy/actxprxy.rbuild +++ b/reactos/dll/win32/actxprxy/actxprxy.rbuild @@ -31,7 +31,6 @@ actxprxy_ocmm.idl actxprxy_servprov.idl - actxprxy_urlhist.idl - + actxprxy_urlhist.idl diff --git a/reactos/dll/win32/msacm32/msacm32.rbuild b/reactos/dll/win32/msacm32/msacm32.rbuild index df9cb0340ef..b6f802ee5bb 100644 --- a/reactos/dll/win32/msacm32/msacm32.rbuild +++ b/reactos/dll/win32/msacm32/msacm32.rbuild @@ -1,6 +1,6 @@ - + . diff --git a/reactos/drivers/bus/acpi/acpi.rbuild b/reactos/drivers/bus/acpi/acpi.rbuild index c3e5b7dac90..334cdfc7024 100644 --- a/reactos/drivers/bus/acpi/acpi.rbuild +++ b/reactos/drivers/bus/acpi/acpi.rbuild @@ -10,7 +10,7 @@ - + @@ -36,3 +36,4 @@ buspdo.c main.c + From a3e472b248c3954f41ca136d72ab9972811c2868 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 18 Apr 2010 18:22:29 +0000 Subject: [PATCH 148/261] Samuel Serapion - Add IdlInterface module type. svn path=/trunk/; revision=46928 --- reactos/tools/sysgen/RosFramework/RBuildModule.cs | 15 ++++++++++----- .../SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/reactos/tools/sysgen/RosFramework/RBuildModule.cs b/reactos/tools/sysgen/RosFramework/RBuildModule.cs index f7fcb2f504d..df4f0aa0720 100644 --- a/reactos/tools/sysgen/RosFramework/RBuildModule.cs +++ b/reactos/tools/sysgen/RosFramework/RBuildModule.cs @@ -224,6 +224,7 @@ namespace SysGen.RBuild.Framework case ModuleType.Alias: case ModuleType.BootProgram: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.Package: case ModuleType.ModuleGroup: @@ -234,7 +235,7 @@ namespace SysGen.RBuild.Framework case ModuleType.Cabinet: return ".cab"; default: - throw new Exception("Unknown module type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } @@ -431,6 +432,7 @@ namespace SysGen.RBuild.Framework case ModuleType.RpcProxy: case ModuleType.Alias: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.EmbeddedTypeLib: case ModuleType.Cabinet: @@ -439,7 +441,7 @@ namespace SysGen.RBuild.Framework case ModuleType.PlatformProfile: return false; default: - throw new Exception("Unknown Module Type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } @@ -479,6 +481,7 @@ namespace SysGen.RBuild.Framework case ModuleType.RpcProxy: case ModuleType.Alias: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.EmbeddedTypeLib: case ModuleType.Cabinet: @@ -487,7 +490,7 @@ namespace SysGen.RBuild.Framework case ModuleType.PlatformProfile: return false; default: - throw new Exception("Unknown Module Type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } @@ -531,6 +534,7 @@ namespace SysGen.RBuild.Framework case ModuleType.Alias: case ModuleType.BootProgram: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.EmbeddedTypeLib: case ModuleType.Cabinet: @@ -539,7 +543,7 @@ namespace SysGen.RBuild.Framework case ModuleType.PlatformProfile: return string.Empty; default: - throw new Exception("Unknown Module Type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } @@ -593,6 +597,7 @@ namespace SysGen.RBuild.Framework case ModuleType.Alias: case ModuleType.BootProgram: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.EmbeddedTypeLib: case ModuleType.Cabinet: @@ -601,7 +606,7 @@ namespace SysGen.RBuild.Framework case ModuleType.PlatformProfile: return string.Empty; default: - throw new Exception("Unknown Module Type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs index 1a790f41d11..ba9b2e09d58 100644 --- a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs @@ -176,6 +176,7 @@ namespace SysGen.BuildEngine.Tasks (Module.Type == ModuleType.BootSector) || (Module.Type == ModuleType.EmbeddedTypeLib) || (Module.Type == ModuleType.IdlHeader) || + (Module.Type == ModuleType.IdlInterface) || (Module.Type == ModuleType.Kernel) || (Module.Type == ModuleType.KernelModeDLL) || (Module.Type == ModuleType.KernelModeDriver) || From 57020ab2e3bc2e81bc0264885d82545ad6b6c85f Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Sun, 18 Apr 2010 23:02:14 +0000 Subject: [PATCH 149/261] - Once again, fix INF files svn path=/trunk/; revision=46929 --- reactos/media/inf/cpu.inf | Bin 18186 -> 18186 bytes reactos/media/inf/hdc.inf | Bin 83158 -> 83156 bytes reactos/media/inf/machine.inf | Bin 45620 -> 45686 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/cpu.inf b/reactos/media/inf/cpu.inf index bc2517dcaa0b033934898b49310ad15b7598b138..087ab209a62bbb576bcdd7d96e6af75c4ca0e27d 100644 GIT binary patch delta 19 acmeC`W9;f<+@PVv$h%ox>AngR7Xtu3odre! delta 19 acmeC`W9;f<+@PVfSxf1j3d{e0Tnqq7GzU2V diff --git a/reactos/media/inf/hdc.inf b/reactos/media/inf/hdc.inf index a3fd5a9b0d2ee4c8bdb10e6ed137c266c3c5638e..78983c57d44b0bd4cbf4e11b538c0d829962a3cb 100644 GIT binary patch delta 14 VcmccC$$F)ewP6e6B^M?x1^_S21s(tZ delta 16 Xcmcc8$$G7mwP6e6B^Q?e|F{?cK<)<} diff --git a/reactos/media/inf/machine.inf b/reactos/media/inf/machine.inf index ecc90375e8d1de8d54b6cc66e14fa58f09e17e72..0ac8b68bef8218df882eccd6a9571bae7e364a57 100644 GIT binary patch delta 66 zcmV-I0KNaT*%VfQST>fCU(nP#y@A)*IH7c$N;5m;|%D Y92^{zyc{T!IU18-D=4x#EO`P7067>J5dZ)H delta 38 scmezNglWqYrVV+ln+sSi#5S*zW@FsENk&Izvw~$vCCC4NAjri407QNfIsgCw From cab24c4645160e28106cad7ed5ed50db290b909a Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sun, 18 Apr 2010 23:16:10 +0000 Subject: [PATCH 150/261] Update winhlp32 to Wine 1.1.43 svn path=/trunk/; revision=46931 --- reactos/base/applications/winhlp32/hlpfile.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/base/applications/winhlp32/hlpfile.c b/reactos/base/applications/winhlp32/hlpfile.c index 2d685ae493a..7031c760670 100644 --- a/reactos/base/applications/winhlp32/hlpfile.c +++ b/reactos/base/applications/winhlp32/hlpfile.c @@ -492,7 +492,7 @@ static int comp_FindSubFile(void *p, const void *key, int leaf, void** next) { *next = (char *)p+strlen(p)+(leaf?5:3); - WINE_TRACE("Comparing '%s' with '%s'\n", (char *)p, (char *)key); + WINE_TRACE("Comparing '%s' with '%s'\n", (char *)p, (const char *)key); return strcmp(p, key); } @@ -1601,7 +1601,7 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, case 0xEE: case 0xEF: { - char* ptr = (char*) format + 8; + const char* ptr = (const char*) format + 8; BYTE type = format[3]; int wnd = -1; From 9403f80947e721dfb72073f79b8106990ab4920c Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 19 Apr 2010 14:03:42 +0000 Subject: [PATCH 151/261] - Sync activeds, atl, avifil32, cabinet to Wine-1.1.43. svn path=/trunk/; revision=46938 --- reactos/dll/win32/activeds/activeds.spec | 2 +- reactos/dll/win32/activeds/activeds_main.c | 9 +++++++++ reactos/dll/win32/atl/atl_ax.c | 2 +- reactos/dll/win32/avifil32/rsrc.rc | 6 +----- reactos/dll/win32/cabinet/fdi.c | 4 ++-- reactos/dll/win32/ole32/compobj.c | 2 +- reactos/include/psdk/objbase.h | 10 +++++----- reactos/include/psdk/winnt.h | 8 ++++++++ 8 files changed, 28 insertions(+), 15 deletions(-) diff --git a/reactos/dll/win32/activeds/activeds.spec b/reactos/dll/win32/activeds/activeds.spec index 63625d5d022..2b458342493 100644 --- a/reactos/dll/win32/activeds/activeds.spec +++ b/reactos/dll/win32/activeds/activeds.spec @@ -6,7 +6,7 @@ 8 stub ADsBuildVarArrayInt 9 stdcall ADsOpenObject(wstr wstr wstr long ptr ptr) 12 stub ADsSetLastError -13 stub ADsGetLastError +13 stdcall ADsGetLastError(ptr ptr long ptr long) 14 stub AllocADsMem 15 stdcall FreeADsMem(ptr) 16 stub ReallocADsMem diff --git a/reactos/dll/win32/activeds/activeds_main.c b/reactos/dll/win32/activeds/activeds_main.c index 9c03ac16d68..2fa4ec73d80 100644 --- a/reactos/dll/win32/activeds/activeds_main.c +++ b/reactos/dll/win32/activeds/activeds_main.c @@ -94,6 +94,15 @@ HRESULT WINAPI ADsOpenObject(LPCWSTR lpszPathName, LPCWSTR lpszUserName, LPCWSTR return E_NOTIMPL; } +/***************************************************** + * ADsGetLastError [ACTIVEDS.13] + */ +HRESULT WINAPI ADsGetLastError(LPDWORD perror, LPWSTR errorbuf, DWORD errorbuflen, LPWSTR namebuf, DWORD namebuflen) +{ + FIXME("(%p,%p,%d,%p,%d)!stub\n", perror, errorbuf, errorbuflen, namebuf, namebuflen); + return E_NOTIMPL; +} + /***************************************************** * FreeADsMem [ACTIVEDS.15] */ diff --git a/reactos/dll/win32/atl/atl_ax.c b/reactos/dll/win32/atl/atl_ax.c index 2afc7460328..616713ce62b 100644 --- a/reactos/dll/win32/atl/atl_ax.c +++ b/reactos/dll/win32/atl/atl_ax.c @@ -950,7 +950,7 @@ HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, ppUnkContainer, ppUnkControl, iidSink, punkSink); - hRes = CLSIDFromString( (LPOLESTR) lpszName, &controlId ); + hRes = CLSIDFromString( lpszName, &controlId ); if ( FAILED(hRes) ) hRes = CLSIDFromProgID( lpszName, &controlId ); if ( SUCCEEDED( hRes ) ) diff --git a/reactos/dll/win32/avifil32/rsrc.rc b/reactos/dll/win32/avifil32/rsrc.rc index d86578c5a6b..b13fcb93e42 100644 --- a/reactos/dll/win32/avifil32/rsrc.rc +++ b/reactos/dll/win32/avifil32/rsrc.rc @@ -1,7 +1,7 @@ /* * Top level resource file for avifil32.dll * - * Copyright 2002 Michael Günnewig + * Copyright 2002 Michael Günnewig * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,10 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winver.h" #include "avifile_private.h" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/reactos/dll/win32/cabinet/fdi.c b/reactos/dll/win32/cabinet/fdi.c index de64f025bd3..b68ab15acd8 100644 --- a/reactos/dll/win32/cabinet/fdi.c +++ b/reactos/dll/win32/cabinet/fdi.c @@ -77,7 +77,7 @@ THOSE_ZIP_CONSTS; struct fdi_file { struct fdi_file *next; /* next file in sequence */ - LPCSTR filename; /* output name of file */ + LPSTR filename; /* output name of file */ int fh; /* open file handle or NULL */ cab_ULONG length; /* uncompressed length of file */ cab_ULONG offset; /* uncompressed offset in folder */ @@ -2301,7 +2301,7 @@ static void free_decompression_mem(HFDI hfdi, } while (CAB(firstfile)) { file = CAB(firstfile); - if (file->filename) PFDI_FREE(hfdi, (void *)file->filename); + if (file->filename) PFDI_FREE(hfdi, file->filename); CAB(firstfile) = CAB(firstfile)->next; PFDI_FREE(hfdi, file); } diff --git a/reactos/dll/win32/ole32/compobj.c b/reactos/dll/win32/ole32/compobj.c index 12f83146113..0625c0b8949 100644 --- a/reactos/dll/win32/ole32/compobj.c +++ b/reactos/dll/win32/ole32/compobj.c @@ -1566,7 +1566,7 @@ static HRESULT __CLSIDFromString(LPCWSTR s, CLSID *id) /*****************************************************************************/ -HRESULT WINAPI CLSIDFromString(LPOLESTR idstr, CLSID *id ) +HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id ) { HRESULT ret; diff --git a/reactos/include/psdk/objbase.h b/reactos/include/psdk/objbase.h index 57da913bf51..e9295de6cf3 100644 --- a/reactos/include/psdk/objbase.h +++ b/reactos/include/psdk/objbase.h @@ -225,10 +225,9 @@ #define THIS void #define interface struct -#define DECLARE_INTERFACE(iface) interface iface -#define DECLARE_INTERFACE_(iface,ibase) interface iface : public ibase -#define DECLARE_INTERFACE_IID(iface, iid) interface DECLSPEC_UUID(iid) iface -#define DECLARE_INTERFACE_IID_(iface, baseiface, iid) interface DECLSPEC_UUID(iid) iface : public baseiface +#define DECLARE_INTERFACE(iface) interface DECLSPEC_NOVTABLE iface +#define DECLARE_INTERFACE_(iface,ibase) interface DECLSPEC_NOVTABLE iface : public ibase +#define DECLARE_INTERFACE_IID_(iface, ibase, iid) interface DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE iface : public ibase #define BEGIN_INTERFACE #define END_INTERFACE @@ -268,6 +267,7 @@ struct iface##Vtbl #endif #define DECLARE_INTERFACE_(iface,ibase) DECLARE_INTERFACE(iface) +#define DECLARE_INTERFACE_IID_(iface, ibase, iid) DECLARE_INTERFACE_(iface, ibase) #define BEGIN_INTERFACE #define END_INTERFACE @@ -431,7 +431,7 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags,DWORD dwTimeout,ULONG cHan * GUID API */ HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR*); -HRESULT WINAPI CLSIDFromString(LPOLESTR, CLSID *); +HRESULT WINAPI CLSIDFromString(LPCOLESTR, LPCLSID); HRESULT WINAPI CLSIDFromProgID(LPCOLESTR progid, LPCLSID riid); HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *lplpszProgID); diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index f856b079970..66c94b21d6d 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -63,6 +63,14 @@ extern "C" { #define UNALIGNED #endif +#ifndef DECLSPEC_NOVTABLE +# if defined(_MSC_VER) && (_MSC_VER >= 1100) && defined(__cplusplus) +# define DECLSPEC_NOVTABLE __declspec(novtable) +# else +# define DECLSPEC_NOVTABLE +# endif +#endif + #ifndef DECLSPEC_ADDRSAFE #if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64)) #define DECLSPEC_ADDRSAFE __declspec(address_safe) From 7c4b750a575a00d066a0c1f01160d86f59c05906 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 15:41:21 +0000 Subject: [PATCH 152/261] Revert r46582, to see if it fixes the regtests svn path=/trunk/; revision=46942 --- reactos/include/ddk/ntddk.h | 5574 ++++++++------------------------- reactos/include/ddk/ntifs.h | 4747 ++++++++++++++-------------- reactos/include/ddk/ntimage.h | 17 +- reactos/include/ddk/wdm.h | 5380 ++++++------------------------- reactos/include/ndk/ketypes.h | 23 + 5 files changed, 4780 insertions(+), 10961 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index fdd99d9f7ef..62c1f7873f1 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -1,13 +1,12 @@ /* * ntddk.h * - * Windows NT Device Driver Kit + * Windows Device Driver Kit * - * This file is part of the ReactOS DDK package. + * This file is part of the w32api package. * * Contributors: - * Amine Khaldi - * Timo Kreuzer (timo.kreuzer@reactos.org) + * Created by Casper S. Hornstrup * * THIS SOFTWARE IS NOT COPYRIGHTED * @@ -19,10 +18,13 @@ * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * DEFINES: + * DBG - Debugging enabled/disabled (0/1) + * POOL_TAGGING - Enable pool tagging + * _X86_ - X86 environment */ -#pragma once - +#ifndef _NTDDK_ #define _NTDDK_ #if !defined(_NTHAL_) && !defined(_NTIFS_) @@ -39,7 +41,6 @@ #include #include #include -#include /* FIXME #include @@ -54,128 +55,41 @@ extern "C" { #endif -/* GUID and UUID */ -#ifndef _NTLSA_IFS_ -#ifndef _NTLSA_AUDIT_ -#define _NTLSA_AUDIT_ - -#ifndef GUID_DEFINED -#include -#endif - -#endif /* _NTLSA_AUDIT_ */ -#endif /* _NTLSA_IFS_ */ - -typedef GUID UUID; - struct _LOADER_PARAMETER_BLOCK; struct _CREATE_DISK; struct _DRIVE_LAYOUT_INFORMATION_EX; struct _SET_PARTITION_INFORMATION_EX; -typedef struct _BUS_HANDLER *PBUS_HANDLER; -typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; -#if defined(_NTHAL_INCLUDED_) -typedef struct _KAFFINITY_EX *PKAFFINITY_EX; +// +// GUID and UUID +// +#ifndef GUID_DEFINED +#include #endif +typedef GUID UUID; + +typedef struct _BUS_HANDLER *PBUS_HANDLER; + typedef struct _PEB *PPEB; -#ifndef _NTIMAGE_ +#define EXCEPTION_READ_FAULT 0 +#define EXCEPTION_WRITE_FAULT 1 +#define EXCEPTION_EXECUTE_FAULT 8 -typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; -typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; - -#ifdef _WIN64 -typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; #else -typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; +extern PCCHAR KeNumberProcessors; #endif -#endif /* _NTIMAGE_ */ +#define MAX_WOW64_SHARED_ENTRIES 16 -/****************************************************************************** - * Executive Types * - ******************************************************************************/ - -typedef struct _ZONE_SEGMENT_HEADER { - SINGLE_LIST_ENTRY SegmentList; - PVOID Reserved; -} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; - -typedef struct _ZONE_HEADER { - SINGLE_LIST_ENTRY FreeList; - SINGLE_LIST_ENTRY SegmentList; - ULONG BlockSize; - ULONG TotalSegmentSize; -} ZONE_HEADER, *PZONE_HEADER; - -#define PROTECTED_POOL 0x80000000 - - -/****************************************************************************** - * I/O Manager Types * - ******************************************************************************/ - -/* DEVICE_OBJECT.Flags */ -#define DO_DEVICE_HAS_NAME 0x00000040 -#define DO_SYSTEM_BOOT_PARTITION 0x00000100 -#define DO_LONG_TERM_REQUESTS 0x00000200 -#define DO_NEVER_LAST_DEVICE 0x00000400 -#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 -#define DO_SUPPORTS_TRANSACTIONS 0x00040000 -#define DO_FORCE_NEITHER_IO 0x00080000 -#define DO_VOLUME_DEVICE_OBJECT 0x00100000 -#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000 -#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000 -#define DO_DISALLOW_EXECUTE 0x00800000 - -#ifndef _ARC_DDK_ -#define _ARC_DDK_ -typedef enum _CONFIGURATION_TYPE { - ArcSystem, - CentralProcessor, - FloatingPointProcessor, - PrimaryIcache, - PrimaryDcache, - SecondaryIcache, - SecondaryDcache, - SecondaryCache, - EisaAdapter, - TcAdapter, - ScsiAdapter, - DtiAdapter, - MultiFunctionAdapter, - DiskController, - TapeController, - CdromController, - WormController, - SerialController, - NetworkController, - DisplayController, - ParallelController, - PointerController, - KeyboardController, - AudioController, - OtherController, - DiskPeripheral, - FloppyDiskPeripheral, - TapePeripheral, - ModemPeripheral, - MonitorPeripheral, - PrinterPeripheral, - PointerPeripheral, - KeyboardPeripheral, - TerminalPeripheral, - OtherPeripheral, - LinePeripheral, - NetworkPeripheral, - SystemMemory, - DockingInformation, - RealModeIrqRoutingTable, - RealModePCIEnumeration, - MaximumType -} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; -#endif /* !_ARC_DDK_ */ +#define NX_SUPPORT_POLICY_ALWAYSOFF 0 +#define NX_SUPPORT_POLICY_ALWAYSON 1 +#define NX_SUPPORT_POLICY_OPTIN 2 +#define NX_SUPPORT_POLICY_OPTOUT 3 /* ** IRP function codes @@ -210,118 +124,102 @@ typedef enum _CONFIGURATION_TYPE { #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18 -#define IO_CHECK_CREATE_PARAMETERS 0x0200 -#define IO_ATTACH_DEVICE 0x0400 -#define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800 +typedef struct _IO_COUNTERS { + ULONGLONG ReadOperationCount; + ULONGLONG WriteOperationCount; + ULONGLONG OtherOperationCount; + ULONGLONG ReadTransferCount; + ULONGLONG WriteTransferCount; + ULONGLONG OtherTransferCount; +} IO_COUNTERS, *PIO_COUNTERS; -typedef -NTSTATUS -(NTAPI *PIO_QUERY_DEVICE_ROUTINE)( - IN PVOID Context, - IN PUNICODE_STRING PathName, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN PKEY_VALUE_FULL_INFORMATION *BusInformation, - IN CONFIGURATION_TYPE ControllerType, - IN ULONG ControllerNumber, - IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, - IN CONFIGURATION_TYPE PeripheralType, - IN ULONG PeripheralNumber, - IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); +typedef struct _VM_COUNTERS { + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; +} VM_COUNTERS, *PVM_COUNTERS; -typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { - IoQueryDeviceIdentifier = 0, - IoQueryDeviceConfigurationData, - IoQueryDeviceComponentInformation, - IoQueryDeviceMaxData -} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT; +typedef struct _VM_COUNTERS_EX +{ + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; + SIZE_T PrivateUsage; +} VM_COUNTERS_EX, *PVM_COUNTERS_EX; -typedef VOID -(NTAPI *PDRIVER_REINITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PVOID Context OPTIONAL, - IN ULONG Count); +typedef struct _POOLED_USAGE_AND_LIMITS +{ + SIZE_T PeakPagedPoolUsage; + SIZE_T PagedPoolUsage; + SIZE_T PagedPoolLimit; + SIZE_T PeakNonPagedPoolUsage; + SIZE_T NonPagedPoolUsage; + SIZE_T NonPagedPoolLimit; + SIZE_T PeakPagefileUsage; + SIZE_T PagefileUsage; + SIZE_T PagefileLimit; +} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; -typedef struct _CONTROLLER_OBJECT { - CSHORT Type; - CSHORT Size; - PVOID ControllerExtension; - KDEVICE_QUEUE DeviceWaitQueue; - ULONG Spare1; - LARGE_INTEGER Spare2; -} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; +/* DEVICE_OBJECT.Flags */ + +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_HAS_NAME 0x00000040 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SYSTEM_BOOT_PARTITION 0x00000100 +#define DO_LONG_TERM_REQUESTS 0x00000200 +#define DO_NEVER_LAST_DEVICE 0x00000400 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 +#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 +#define DO_SUPPORTS_TRANSACTIONS 0x00040000 +#define DO_FORCE_NEITHER_IO 0x00080000 +#define DO_VOLUME_DEVICE_OBJECT 0x00100000 +#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000 +#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000 +#define DO_DISALLOW_EXECUTE 0x00800000 #define DRVO_REINIT_REGISTERED 0x00000008 #define DRVO_INITIALIZED 0x00000010 #define DRVO_BOOTREINIT_REGISTERED 0x00000020 #define DRVO_LEGACY_RESOURCES 0x00000040 -typedef struct _CONFIGURATION_INFORMATION { - ULONG DiskCount; - ULONG FloppyCount; - ULONG CdRomCount; - ULONG TapeCount; - ULONG ScsiPortCount; - ULONG SerialCount; - ULONG ParallelCount; - BOOLEAN AtDiskPrimaryAddressClaimed; - BOOLEAN AtDiskSecondaryAddressClaimed; - ULONG Version; - ULONG MediumChangerCount; -} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; +typedef enum _ARBITER_REQUEST_SOURCE { + ArbiterRequestUndefined = -1, + ArbiterRequestLegacyReported, + ArbiterRequestHalReported, + ArbiterRequestLegacyAssigned, + ArbiterRequestPnpDetected, + ArbiterRequestPnpEnumerated +} ARBITER_REQUEST_SOURCE; -typedef struct _DISK_SIGNATURE { - ULONG PartitionStyle; - _ANONYMOUS_UNION union { - struct { - ULONG Signature; - ULONG CheckSum; - } Mbr; - struct { - GUID DiskId; - } Gpt; - } DUMMYUNIONNAME; -} DISK_SIGNATURE, *PDISK_SIGNATURE; - -typedef struct _TXN_PARAMETER_BLOCK { - USHORT Length; - USHORT TxFsContext; - PVOID TransactionObject; -} TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK; - -#define TXF_MINIVERSION_DEFAULT_VIEW (0xFFFE) - -typedef struct _IO_DRIVER_CREATE_CONTEXT { - CSHORT Size; - struct _ECP_LIST *ExtraCreateParameter; - PVOID DeviceObjectHint; - PTXN_PARAMETER_BLOCK TxnParameters; -} IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT; - -typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGET_SET_DEVICE_DATA SetBusData; - PGET_SET_DEVICE_DATA GetBusData; - UCHAR CapabilityID; -} AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD; - -typedef NTSTATUS -(NTAPI *PGET_LOCATION_STRING)( - IN OUT PVOID Context OPTIONAL, - OUT PWCHAR *LocationStrings); - -typedef struct _PNP_LOCATION_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGET_LOCATION_STRING GetLocationString; -} PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE; +typedef enum _ARBITER_RESULT { + ArbiterResultUndefined = -1, + ArbiterResultSuccess, + ArbiterResultExternalConflict, + ArbiterResultNullRequest +} ARBITER_RESULT; typedef enum _ARBITER_ACTION { ArbiterActionTestAllocation, @@ -342,69 +240,39 @@ typedef struct _ARBITER_CONFLICT_INFO { ULONGLONG End; } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO; -typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS { +typedef struct _ARBITER_PARAMETERS { + union { + struct { IN OUT PLIST_ENTRY ArbitrationList; IN ULONG AllocateFromCount; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; -} ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS; - -typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS { + } TestAllocation; + struct { IN OUT PLIST_ENTRY ArbitrationList; IN ULONG AllocateFromCount; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; -} ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS; - -typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS { + } RetestAllocation; + struct { IN OUT PLIST_ENTRY ArbitrationList; -} ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS; - -typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS { + } BootAllocation; + struct { OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; -} ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS; - -typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS { + } QueryAllocatedResources; + struct { IN PDEVICE_OBJECT PhysicalDeviceObject; IN PIO_RESOURCE_DESCRIPTOR ConflictingResource; OUT PULONG ConflictCount; OUT PARBITER_CONFLICT_INFO *Conflicts; -} ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS; - -typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS { + } QueryConflict; + struct { IN PLIST_ENTRY ArbitrationList; -} ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS; - -typedef struct _ARBITER_ADD_RESERVED_PARAMETERS { + } QueryArbitrate; + struct { IN PDEVICE_OBJECT ReserveDevice; -} ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS; - -typedef struct _ARBITER_PARAMETERS { - union { - ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation; - ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation; - ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation; - ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources; - ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict; - ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate; - ARBITER_ADD_RESERVED_PARAMETERS AddReserved; + } AddReserved; } Parameters; } ARBITER_PARAMETERS, *PARBITER_PARAMETERS; -typedef enum _ARBITER_REQUEST_SOURCE { - ArbiterRequestUndefined = -1, - ArbiterRequestLegacyReported, - ArbiterRequestHalReported, - ArbiterRequestLegacyAssigned, - ArbiterRequestPnpDetected, - ArbiterRequestPnpEnumerated -} ARBITER_REQUEST_SOURCE; - -typedef enum _ARBITER_RESULT { - ArbiterResultUndefined = -1, - ArbiterResultSuccess, - ArbiterResultExternalConflict, - ArbiterResultNullRequest -} ARBITER_RESULT; - #define ARBITER_FLAG_BOOT_CONFIG 0x00000001 typedef struct _ARBITER_LIST_ENTRY { @@ -441,826 +309,6 @@ typedef struct _ARBITER_INTERFACE { ULONG Flags; } ARBITER_INTERFACE, *PARBITER_INTERFACE; -typedef enum _RESOURCE_TRANSLATION_DIRECTION { - TranslateChildToParent, - TranslateParentToChild -} RESOURCE_TRANSLATION_DIRECTION; - -typedef NTSTATUS -(NTAPI *PTRANSLATE_RESOURCE_HANDLER)( - IN OUT PVOID Context OPTIONAL, - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, - IN RESOURCE_TRANSLATION_DIRECTION Direction, - IN ULONG AlternativesCount OPTIONAL, - IN IO_RESOURCE_DESCRIPTOR Alternatives[], - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target); - -typedef NTSTATUS -(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)( - IN OUT PVOID Context OPTIONAL, - IN PIO_RESOURCE_DESCRIPTOR Source, - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PULONG TargetCount, - OUT PIO_RESOURCE_DESCRIPTOR *Target); - -typedef struct _TRANSLATOR_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PTRANSLATE_RESOURCE_HANDLER TranslateResources; - PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements; -} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE; - -typedef struct _PCI_AGP_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - USHORT Minor:4; - USHORT Major:4; - USHORT Rsvd1:8; - struct _PCI_AGP_STATUS { - ULONG Rate:3; - ULONG Agp3Mode:1; - ULONG FastWrite:1; - ULONG FourGB:1; - ULONG HostTransDisable:1; - ULONG Gart64:1; - ULONG ITA_Coherent:1; - ULONG SideBandAddressing:1; - ULONG CalibrationCycle:3; - ULONG AsyncRequestSize:3; - ULONG Rsvd1:1; - ULONG Isoch:1; - ULONG Rsvd2:6; - ULONG RequestQueueDepthMaximum:8; - } AGPStatus; - struct _PCI_AGP_COMMAND { - ULONG Rate:3; - ULONG Rsvd1:1; - ULONG FastWriteEnable:1; - ULONG FourGBEnable:1; - ULONG Rsvd2:1; - ULONG Gart64:1; - ULONG AGPEnable:1; - ULONG SBAEnable:1; - ULONG CalibrationCycle:3; - ULONG AsyncReqSize:3; - ULONG Rsvd3:8; - ULONG RequestQueueDepth:8; - } AGPCommand; -} PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY; - -typedef enum _EXTENDED_AGP_REGISTER { - IsochStatus, - AgpControl, - ApertureSize, - AperturePageSize, - GartLow, - GartHigh, - IsochCommand -} EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER; - -typedef struct _PCI_AGP_ISOCH_STATUS { - ULONG ErrorCode:2; - ULONG Rsvd1:1; - ULONG Isoch_L:3; - ULONG Isoch_Y:2; - ULONG Isoch_N:8; - ULONG Rsvd2:16; -} PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS; - -typedef struct _PCI_AGP_CONTROL { - ULONG Rsvd1:7; - ULONG GTLB_Enable:1; - ULONG AP_Enable:1; - ULONG CAL_Disable:1; - ULONG Rsvd2:22; -} PCI_AGP_CONTROL, *PPCI_AGP_CONTROL; - -typedef struct _PCI_AGP_APERTURE_PAGE_SIZE { - USHORT PageSizeMask:11; - USHORT Rsvd1:1; - USHORT PageSizeSelect:4; -} PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE; - -typedef struct _PCI_AGP_ISOCH_COMMAND { - USHORT Rsvd1:6; - USHORT Isoch_Y:2; - USHORT Isoch_N:8; -} PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND; - -typedef struct PCI_AGP_EXTENDED_CAPABILITY { - PCI_AGP_ISOCH_STATUS IsochStatus; - PCI_AGP_CONTROL AgpControl; - USHORT ApertureSize; - PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize; - ULONG GartLow; - ULONG GartHigh; - PCI_AGP_ISOCH_COMMAND IsochCommand; -} PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY; - -#define PCI_AGP_RATE_1X 0x1 -#define PCI_AGP_RATE_2X 0x2 -#define PCI_AGP_RATE_4X 0x4 - -#define PCIX_MODE_CONVENTIONAL_PCI 0x0 -#define PCIX_MODE1_66MHZ 0x1 -#define PCIX_MODE1_100MHZ 0x2 -#define PCIX_MODE1_133MHZ 0x3 -#define PCIX_MODE2_266_66MHZ 0x9 -#define PCIX_MODE2_266_100MHZ 0xA -#define PCIX_MODE2_266_133MHZ 0xB -#define PCIX_MODE2_533_66MHZ 0xD -#define PCIX_MODE2_533_100MHZ 0xE -#define PCIX_MODE2_533_133MHZ 0xF - -#define PCIX_VERSION_MODE1_ONLY 0x0 -#define PCIX_VERSION_MODE2_ECC 0x1 -#define PCIX_VERSION_DUAL_MODE_ECC 0x2 - -typedef struct _PCIX_BRIDGE_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - union { - struct { - USHORT Bus64Bit:1; - USHORT Bus133MHzCapable:1; - USHORT SplitCompletionDiscarded:1; - USHORT UnexpectedSplitCompletion:1; - USHORT SplitCompletionOverrun:1; - USHORT SplitRequestDelayed:1; - USHORT BusModeFrequency:4; - USHORT Rsvd:2; - USHORT Version:2; - USHORT Bus266MHzCapable:1; - USHORT Bus533MHzCapable:1; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; - } SecondaryStatus; - union { - struct { - ULONG FunctionNumber:3; - ULONG DeviceNumber:5; - ULONG BusNumber:8; - ULONG Device64Bit:1; - ULONG Device133MHzCapable:1; - ULONG SplitCompletionDiscarded:1; - ULONG UnexpectedSplitCompletion:1; - ULONG SplitCompletionOverrun:1; - ULONG SplitRequestDelayed:1; - ULONG Rsvd:7; - ULONG DIMCapable:1; - ULONG Device266MHzCapable:1; - ULONG Device533MHzCapable:1; - } DUMMYSTRUCTNAME; - ULONG AsULONG; - } BridgeStatus; - USHORT UpstreamSplitTransactionCapacity; - USHORT UpstreamSplitTransactionLimit; - USHORT DownstreamSplitTransactionCapacity; - USHORT DownstreamSplitTransactionLimit; - union { - struct { - ULONG SelectSecondaryRegisters:1; - ULONG ErrorPresentInOtherBank:1; - ULONG AdditionalCorrectableError:1; - ULONG AdditionalUncorrectableError:1; - ULONG ErrorPhase:3; - ULONG ErrorCorrected:1; - ULONG Syndrome:8; - ULONG ErrorFirstCommand:4; - ULONG ErrorSecondCommand:4; - ULONG ErrorUpperAttributes:4; - ULONG ControlUpdateEnable:1; - ULONG Rsvd:1; - ULONG DisableSingleBitCorrection:1; - ULONG EccMode:1; - } DUMMYSTRUCTNAME; - ULONG AsULONG; - } EccControlStatus; - ULONG EccFirstAddress; - ULONG EccSecondAddress; - ULONG EccAttribute; -} PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY; - -typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - USHORT Reserved; - USHORT SubVendorID; - USHORT SubSystemID; -} PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY; - -#define OSC_FIRMWARE_FAILURE 0x02 -#define OSC_UNRECOGNIZED_UUID 0x04 -#define OSC_UNRECOGNIZED_REVISION 0x08 -#define OSC_CAPABILITIES_MASKED 0x10 - -#define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION 0x01 - -typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD { - union { - struct { - ULONG ExtendedConfigOpRegions:1; - ULONG ActiveStatePowerManagement:1; - ULONG ClockPowerManagement:1; - ULONG SegmentGroups:1; - ULONG MessageSignaledInterrupts:1; - ULONG WindowsHardwareErrorArchitecture:1; - ULONG Reserved:26; - } DUMMYSTRUCTNAME; - ULONG AsULONG; - } u; -} PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD; - -typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD { - union { - struct { - ULONG ExpressNativeHotPlug:1; - ULONG ShpcNativeHotPlug:1; - ULONG ExpressNativePME:1; - ULONG ExpressAdvancedErrorReporting:1; - ULONG ExpressCapabilityStructure:1; - ULONG Reserved:27; - } DUMMYSTRUCTNAME; - ULONG AsULONG; - } u; -} PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD; - -typedef enum _PCI_HARDWARE_INTERFACE { - PciConventional, - PciXMode1, - PciXMode2, - PciExpress -} PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE; - -typedef enum { - BusWidth32Bits, - BusWidth64Bits -} PCI_BUS_WIDTH; - -typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY { - PCI_HARDWARE_INTERFACE SecondaryInterface; - struct { - BOOLEAN BusCapabilitiesFound; - ULONG CurrentSpeedAndMode; - ULONG SupportedSpeedsAndModes; - BOOLEAN DeviceIDMessagingCapable; - PCI_BUS_WIDTH SecondaryBusWidth; - } DUMMYSTRUCTNAME; - PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport; - PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest; - PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted; -} PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY; - -typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER { - struct { - USHORT CapabilityVersion:4; - USHORT DeviceType:4; - USHORT SlotImplemented:1; - USHORT InterruptMessageNumber:5; - USHORT Rsvd:2; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER; - -typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER { - struct { - ULONG MaxPayloadSizeSupported:3; - ULONG PhantomFunctionsSupported:2; - ULONG ExtendedTagSupported:1; - ULONG L0sAcceptableLatency:3; - ULONG L1AcceptableLatency:3; - ULONG Undefined:3; - ULONG RoleBasedErrorReporting:1; - ULONG Rsvd1:2; - ULONG CapturedSlotPowerLimit:8; - ULONG CapturedSlotPowerLimitScale:2; - ULONG Rsvd2:4; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER; - -#define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07; - -typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER { - struct { - USHORT CorrectableErrorEnable:1; - USHORT NonFatalErrorEnable:1; - USHORT FatalErrorEnable:1; - USHORT UnsupportedRequestErrorEnable:1; - USHORT EnableRelaxedOrder:1; - USHORT MaxPayloadSize:3; - USHORT ExtendedTagEnable:1; - USHORT PhantomFunctionsEnable:1; - USHORT AuxPowerEnable:1; - USHORT NoSnoopEnable:1; - USHORT MaxReadRequestSize:3; - USHORT BridgeConfigRetryEnable:1; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER; - -#define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F; - -typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER { - struct { - USHORT CorrectableErrorDetected:1; - USHORT NonFatalErrorDetected:1; - USHORT FatalErrorDetected:1; - USHORT UnsupportedRequestDetected:1; - USHORT AuxPowerDetected:1; - USHORT TransactionsPending:1; - USHORT Rsvd:10; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER; - -typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER { - struct { - ULONG MaximumLinkSpeed:4; - ULONG MaximumLinkWidth:6; - ULONG ActiveStatePMSupport:2; - ULONG L0sExitLatency:3; - ULONG L1ExitLatency:3; - ULONG ClockPowerManagement:1; - ULONG SurpriseDownErrorReportingCapable:1; - ULONG DataLinkLayerActiveReportingCapable:1; - ULONG Rsvd:3; - ULONG PortNumber:8; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER; - -typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER { - struct { - USHORT ActiveStatePMControl:2; - USHORT Rsvd1:1; - USHORT ReadCompletionBoundary:1; - USHORT LinkDisable:1; - USHORT RetrainLink:1; - USHORT CommonClockConfig:1; - USHORT ExtendedSynch:1; - USHORT EnableClockPowerManagement:1; - USHORT Rsvd2:7; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER; - -typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER { - struct { - USHORT LinkSpeed:4; - USHORT LinkWidth:6; - USHORT Undefined:1; - USHORT LinkTraining:1; - USHORT SlotClockConfig:1; - USHORT DataLinkLayerActive:1; - USHORT Rsvd:2; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER; - -typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER { - struct { - ULONG AttentionButtonPresent:1; - ULONG PowerControllerPresent:1; - ULONG MRLSensorPresent:1; - ULONG AttentionIndicatorPresent:1; - ULONG PowerIndicatorPresent:1; - ULONG HotPlugSurprise:1; - ULONG HotPlugCapable:1; - ULONG SlotPowerLimit:8; - ULONG SlotPowerLimitScale:2; - ULONG ElectromechanicalLockPresent:1; - ULONG NoCommandCompletedSupport:1; - ULONG PhysicalSlotNumber:13; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER; - -typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER { - struct { - USHORT AttentionButtonEnable:1; - USHORT PowerFaultDetectEnable:1; - USHORT MRLSensorEnable:1; - USHORT PresenceDetectEnable:1; - USHORT CommandCompletedEnable:1; - USHORT HotPlugInterruptEnable:1; - USHORT AttentionIndicatorControl:2; - USHORT PowerIndicatorControl:2; - USHORT PowerControllerControl:1; - USHORT ElectromechanicalLockControl:1; - USHORT DataLinkStateChangeEnable:1; - USHORT Rsvd:3; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER; - -typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER { - struct { - USHORT AttentionButtonPressed:1; - USHORT PowerFaultDetected:1; - USHORT MRLSensorChanged:1; - USHORT PresenceDetectChanged:1; - USHORT CommandCompleted:1; - USHORT MRLSensorState:1; - USHORT PresenceDetectState:1; - USHORT ElectromechanicalLockEngaged:1; - USHORT DataLinkStateChanged:1; - USHORT Rsvd:7; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER; - -typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER { - struct { - USHORT CorrectableSerrEnable:1; - USHORT NonFatalSerrEnable:1; - USHORT FatalSerrEnable:1; - USHORT PMEInterruptEnable:1; - USHORT CRSSoftwareVisibilityEnable:1; - USHORT Rsvd:11; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER; - -typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER { - struct { - USHORT CRSSoftwareVisibility:1; - USHORT Rsvd:15; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER; - -typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER { - struct { - ULONG PMERequestorId:16; - ULONG PMEStatus:1; - ULONG PMEPending:1; - ULONG Rsvd:14; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER; - -typedef struct _PCI_EXPRESS_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities; - PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities; - PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl; - PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus; - PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities; - PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl; - PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus; - PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities; - PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl; - PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus; - PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl; - PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities; - PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus; -} PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY; - -typedef enum { - MRLClosed = 0, - MRLOpen -} PCI_EXPRESS_MRL_STATE; - -typedef enum { - SlotEmpty = 0, - CardPresent -} PCI_EXPRESS_CARD_PRESENCE; - -typedef enum { - IndicatorOn = 1, - IndicatorBlink, - IndicatorOff -} PCI_EXPRESS_INDICATOR_STATE; - -typedef enum { - PowerOn = 0, - PowerOff -} PCI_EXPRESS_POWER_STATE; - -typedef enum { - L0sEntrySupport = 1, - L0sAndL1EntrySupport = 3 -} PCI_EXPRESS_ASPM_SUPPORT; - -typedef enum { - L0sAndL1EntryDisabled, - L0sEntryEnabled, - L1EntryEnabled, - L0sAndL1EntryEnabled -} PCI_EXPRESS_ASPM_CONTROL; - -typedef enum { - L0s_Below64ns = 0, - L0s_64ns_128ns, - L0s_128ns_256ns, - L0s_256ns_512ns, - L0s_512ns_1us, - L0s_1us_2us, - L0s_2us_4us, - L0s_Above4us -} PCI_EXPRESS_L0s_EXIT_LATENCY; - -typedef enum { - L1_Below1us = 0, - L1_1us_2us, - L1_2us_4us, - L1_4us_8us, - L1_8us_16us, - L1_16us_32us, - L1_32us_64us, - L1_Above64us -} PCI_EXPRESS_L1_EXIT_LATENCY; - -typedef enum { - PciExpressEndpoint = 0, - PciExpressLegacyEndpoint, - PciExpressRootPort = 4, - PciExpressUpstreamSwitchPort, - PciExpressDownstreamSwitchPort, - PciExpressToPciXBridge, - PciXToExpressBridge, - PciExpressRootComplexIntegratedEndpoint, - PciExpressRootComplexEventCollector -} PCI_EXPRESS_DEVICE_TYPE; - -typedef enum { - MaxPayload128Bytes = 0, - MaxPayload256Bytes, - MaxPayload512Bytes, - MaxPayload1024Bytes, - MaxPayload2048Bytes, - MaxPayload4096Bytes -} PCI_EXPRESS_MAX_PAYLOAD_SIZE; - -typedef union _PCI_EXPRESS_PME_REQUESTOR_ID { - struct { - USHORT FunctionNumber:3; - USHORT DeviceNumber:5; - USHORT BusNumber:8; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID; - -#if defined(_WIN64) - -#ifndef USE_DMA_MACROS -#define USE_DMA_MACROS -#endif - -#ifndef NO_LEGACY_DRIVERS -#define NO_LEGACY_DRIVERS -#endif - -#endif /* defined(_WIN64) */ - -typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE { - ResourceTypeSingle = 0, - ResourceTypeRange, - ResourceTypeExtendedCounterConfiguration, - ResourceTypeOverflow, - ResourceTypeMax -} PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE; - -typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR { - PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type; - ULONG Flags; - union { - ULONG CounterIndex; - ULONG ExtendedRegisterAddress; - struct { - ULONG Begin; - ULONG End; - } Range; - } u; -} PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR; - -typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST { - ULONG Count; - PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY]; -} PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST; - -typedef VOID -(NTAPI *PciPin2Line)( - IN struct _BUS_HANDLER *BusHandler, - IN struct _BUS_HANDLER *RootHandler, - IN PCI_SLOT_NUMBER SlotNumber, - IN PPCI_COMMON_CONFIG PciData); - -typedef VOID -(NTAPI *PciLine2Pin)( - IN struct _BUS_HANDLER *BusHandler, - IN struct _BUS_HANDLER *RootHandler, - IN PCI_SLOT_NUMBER SlotNumber, - IN PPCI_COMMON_CONFIG PciNewData, - IN PPCI_COMMON_CONFIG PciOldData); - -typedef VOID -(NTAPI *PciReadWriteConfig)( - IN struct _BUS_HANDLER *BusHandler, - IN PCI_SLOT_NUMBER Slot, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -#define PCI_DATA_TAG ' ICP' -#define PCI_DATA_VERSION 1 - -typedef struct _PCIBUSDATA { - ULONG Tag; - ULONG Version; - PciReadWriteConfig ReadConfig; - PciReadWriteConfig WriteConfig; - PciPin2Line Pin2Line; - PciLine2Pin Line2Pin; - PCI_SLOT_NUMBER ParentSlot; - PVOID Reserved[4]; -} PCIBUSDATA, *PPCIBUSDATA; - -#ifndef _PCIINTRF_X_ -#define _PCIINTRF_X_ - -typedef ULONG -(NTAPI *PCI_READ_WRITE_CONFIG)( - IN PVOID Context, - IN ULONG BusOffset, - IN ULONG Slot, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef VOID -(NTAPI *PCI_PIN_TO_LINE)( - IN PVOID Context, - IN PPCI_COMMON_CONFIG PciData); - -typedef VOID -(NTAPI *PCI_LINE_TO_PIN)( - IN PVOID Context, - IN PPCI_COMMON_CONFIG PciNewData, - IN PPCI_COMMON_CONFIG PciOldData); - -typedef VOID -(NTAPI *PCI_ROOT_BUS_CAPABILITY)( - IN PVOID Context, - OUT PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability); - -typedef VOID -(NTAPI *PCI_EXPRESS_WAKE_CONTROL)( - IN PVOID Context, - IN BOOLEAN EnableWake); - -typedef struct _PCI_BUS_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PCI_READ_WRITE_CONFIG ReadConfig; - PCI_READ_WRITE_CONFIG WriteConfig; - PCI_PIN_TO_LINE PinToLine; - PCI_LINE_TO_PIN LineToPin; - PCI_ROOT_BUS_CAPABILITY RootBusCapability; - PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl; -} PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD; - -#define PCI_BUS_INTERFACE_STANDARD_VERSION 1 - -#endif /* _PCIINTRF_X_ */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX 0x00004000 -#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX 0x00008000 -#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \ - (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \ - FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX) - -#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200 -#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300 -#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300 - -#else - -#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200 -#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300 -#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300 - -#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL -#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL -#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#define FILE_CHARACTERISTICS_PROPAGATED ( FILE_REMOVABLE_MEDIA | \ - FILE_READ_ONLY_DEVICE | \ - FILE_FLOPPY_DISKETTE | \ - FILE_WRITE_ONCE_MEDIA | \ - FILE_DEVICE_SECURE_OPEN ) - -typedef struct _FILE_ALIGNMENT_INFORMATION { - ULONG AlignmentRequirement; -} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; - -typedef struct _FILE_NAME_INFORMATION { - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; - - -typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { - ULONG FileAttributes; - ULONG ReparseTag; -} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; - -typedef struct _FILE_DISPOSITION_INFORMATION { - BOOLEAN DeleteFile; -} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; - -typedef struct _FILE_END_OF_FILE_INFORMATION { - LARGE_INTEGER EndOfFile; -} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; - -typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { - LARGE_INTEGER ValidDataLength; -} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; - -typedef struct _FILE_FS_LABEL_INFORMATION { - ULONG VolumeLabelLength; - WCHAR VolumeLabel[1]; -} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; - -typedef struct _FILE_FS_VOLUME_INFORMATION { - LARGE_INTEGER VolumeCreationTime; - ULONG VolumeSerialNumber; - ULONG VolumeLabelLength; - BOOLEAN SupportsObjects; - WCHAR VolumeLabel[1]; -} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; - -typedef struct _FILE_FS_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER AvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; - -typedef struct _FILE_FS_FULL_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER CallerAvailableAllocationUnits; - LARGE_INTEGER ActualAvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; - -typedef struct _FILE_FS_OBJECTID_INFORMATION { - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; - -typedef union _FILE_SEGMENT_ELEMENT { - PVOID64 Buffer; - ULONGLONG Alignment; -}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; - -#define IOCTL_AVIO_ALLOCATE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) -#define IOCTL_AVIO_FREE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) -#define IOCTL_AVIO_MODIFY_STREAM CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) - -typedef enum _BUS_DATA_TYPE { - ConfigurationSpaceUndefined = -1, - Cmos, - EisaConfiguration, - Pos, - CbusConfiguration, - PCIConfiguration, - VMEConfiguration, - NuBusConfiguration, - PCMCIAConfiguration, - MPIConfiguration, - MPSAConfiguration, - PNPISAConfiguration, - SgiInternalConfiguration, - MaximumBusDataType -} BUS_DATA_TYPE, *PBUS_DATA_TYPE; - -/* Hardware Abstraction Layer Types */ - -typedef BOOLEAN -(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( - IN ULONG Columns, - IN ULONG Rows); - -typedef PBUS_HANDLER -(FASTCALL *pHalHandlerForBus)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber); - -typedef VOID -(FASTCALL *pHalReferenceBusHandler)( - IN PBUS_HANDLER BusHandler); - typedef enum _HAL_QUERY_INFORMATION_CLASS { HalInstalledBusInformation, HalProfileSourceInformation, @@ -1307,18 +355,92 @@ typedef enum _HAL_SET_INFORMATION_CLASS { HalProfileDpgoSourceInterruptHandler } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS; -typedef NTSTATUS -(NTAPI *pHalQuerySystemInformation)( - IN HAL_QUERY_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN OUT PVOID Buffer, - OUT PULONG ReturnedLength); +typedef struct _HAL_PROFILE_SOURCE_INTERVAL { + KPROFILE_SOURCE Source; + ULONG_PTR Interval; +} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; + +typedef struct _HAL_PROFILE_SOURCE_INFORMATION { + KPROFILE_SOURCE Source; + BOOLEAN Supported; + ULONG Interval; +} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; + +typedef struct _MAP_REGISTER_ENTRY { + PVOID MapRegister; + BOOLEAN WriteToDevice; +} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; + +typedef struct _DEBUG_DEVICE_ADDRESS { + UCHAR Type; + BOOLEAN Valid; + UCHAR Reserved[2]; + PUCHAR TranslatedAddress; + ULONG Length; +} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; + +typedef struct _DEBUG_MEMORY_REQUIREMENTS { + PHYSICAL_ADDRESS Start; + PHYSICAL_ADDRESS MaxEnd; + PVOID VirtualAddress; + ULONG Length; + BOOLEAN Cached; + BOOLEAN Aligned; +} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; + +typedef struct _DEBUG_DEVICE_DESCRIPTOR { + ULONG Bus; + ULONG Slot; + USHORT Segment; + USHORT VendorID; + USHORT DeviceID; + UCHAR BaseClass; + UCHAR SubClass; + UCHAR ProgIf; + BOOLEAN Initialized; + BOOLEAN Configured; + DEBUG_DEVICE_ADDRESS BaseAddress[6]; + DEBUG_MEMORY_REQUIREMENTS Memory; +} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; + +typedef struct _PM_DISPATCH_TABLE { + ULONG Signature; + ULONG Version; + PVOID Function[1]; +} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; + +typedef enum _RESOURCE_TRANSLATION_DIRECTION { + TranslateChildToParent, + TranslateParentToChild +} RESOURCE_TRANSLATION_DIRECTION; typedef NTSTATUS -(NTAPI *pHalSetSystemInformation)( - IN HAL_SET_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN PVOID Buffer); +(NTAPI *PTRANSLATE_RESOURCE_HANDLER)( + IN OUT PVOID Context, + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, + IN RESOURCE_TRANSLATION_DIRECTION Direction, + IN ULONG AlternativesCount OPTIONAL, + IN IO_RESOURCE_DESCRIPTOR Alternatives[], + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target); + +typedef NTSTATUS +(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)( + IN PVOID Context OPTIONAL, + IN PIO_RESOURCE_DESCRIPTOR Source, + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PULONG TargetCount, + OUT PIO_RESOURCE_DESCRIPTOR *Target); + +typedef struct _TRANSLATOR_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PTRANSLATE_RESOURCE_HANDLER TranslateResources; + PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements; +} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE; typedef VOID (FASTCALL *pHalExamineMBR)( @@ -1349,6 +471,28 @@ typedef NTSTATUS IN ULONG NumberOfHeads, IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); +typedef PBUS_HANDLER +(FASTCALL *pHalHandlerForBus)( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber); + +typedef VOID +(FASTCALL *pHalReferenceBusHandler)( + IN PBUS_HANDLER BusHandler); + +typedef NTSTATUS +(NTAPI *pHalQuerySystemInformation)( + IN HAL_QUERY_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer, + OUT PULONG ReturnedLength); + +typedef NTSTATUS +(NTAPI *pHalSetSystemInformation)( + IN HAL_SET_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN PVOID Buffer); + typedef NTSTATUS (NTAPI *pHalQueryBusSlots)( IN PBUS_HANDLER BusHandler, @@ -1360,12 +504,6 @@ typedef NTSTATUS (NTAPI *pHalInitPnpDriver)( VOID); -typedef struct _PM_DISPATCH_TABLE { - ULONG Signature; - ULONG Version; - PVOID Function[1]; -} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; - typedef NTSTATUS (NTAPI *pHalInitPowerManagement)( IN PPM_DISPATCH_TABLE PmDriverDispatchTable, @@ -1405,7 +543,12 @@ typedef NTSTATUS IN PHYSICAL_ADDRESS PhysicalAddress, IN LARGE_INTEGER NumberOfBytes); -typedef BOOLEAN +typedef VOID +(NTAPI *pHalEndOfBoot)( + VOID); + +typedef +BOOLEAN (NTAPI *pHalTranslateBusAddress)( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, @@ -1413,7 +556,8 @@ typedef BOOLEAN IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress); -typedef NTSTATUS +typedef +NTSTATUS (NTAPI *pHalAssignSlotResources)( IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, @@ -1424,24 +568,23 @@ typedef NTSTATUS IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources); -typedef VOID +typedef +VOID (NTAPI *pHalHaltSystem)( VOID); -typedef BOOLEAN +typedef +BOOLEAN (NTAPI *pHalResetDisplay)( VOID); -typedef struct _MAP_REGISTER_ENTRY { - PVOID MapRegister; - BOOLEAN WriteToDevice; -} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; - -typedef UCHAR +typedef +UCHAR (NTAPI *pHalVectorToIDTEntry)( ULONG Vector); -typedef BOOLEAN +typedef +BOOLEAN (NTAPI *pHalFindBusAddressTranslation)( IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, @@ -1449,33 +592,94 @@ typedef BOOLEAN IN OUT PULONG_PTR Context, IN BOOLEAN NextBus); -typedef VOID -(NTAPI *pHalEndOfBoot)( - VOID); +typedef +NTSTATUS +(NTAPI *pKdSetupPciDeviceForDebugging)( + IN PVOID LoaderBlock OPTIONAL, + IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); -typedef PVOID +typedef +NTSTATUS +(NTAPI *pKdReleasePciDeviceForDebugging)( + IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + +typedef +PVOID +(NTAPI *pKdGetAcpiTablePhase0)( + IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + IN ULONG Signature); + +typedef +PVOID (NTAPI *pHalGetAcpiTable)( IN ULONG Signature, IN PCSTR OemId OPTIONAL, IN PCSTR OemTableId OPTIONAL); -#if defined(_IA64_) -typedef NTSTATUS -(*pHalGetErrorCapList)( - IN OUT PULONG CapsListLength, - IN OUT PUCHAR ErrorCapList); +typedef +VOID +(NTAPI *pKdCheckPowerButton)( + VOID); -typedef NTSTATUS -(*pHalInjectError)( - IN ULONG BufferLength, - IN PUCHAR Buffer); +#if (NTDDI_VERSION >= NTDDI_VISTA) +typedef +PVOID +(NTAPI *pKdMapPhysicalMemory64)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberPages, + IN BOOLEAN FlushCurrentTLB); + +typedef +VOID +(NTAPI *pKdUnmapVirtualAddress)( + IN PVOID VirtualAddress, + IN ULONG NumberPages, + IN BOOLEAN FlushCurrentTLB); +#else +typedef +PVOID +(NTAPI *pKdMapPhysicalMemory64)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberPages); + +typedef +VOID +(NTAPI *pKdUnmapVirtualAddress)( + IN PVOID VirtualAddress, + IN ULONG NumberPages); #endif -typedef VOID + +typedef +ULONG +(NTAPI *pKdGetPciDataByOffset)( + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef +ULONG +(NTAPI *pKdSetPciDataByOffset)( + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef BOOLEAN +(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( + IN ULONG Columns, + IN ULONG Rows); + +typedef +VOID (NTAPI *PCI_ERROR_HANDLER_CALLBACK)( VOID); -typedef VOID +typedef +VOID (NTAPI *pHalSetPciErrorHandlerCallback)( IN PCI_ERROR_HANDLER_CALLBACK Callback); @@ -1549,706 +753,78 @@ extern NTKERNELAPI HAL_DISPATCH HalDispatchTable; #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory #define HalEndOfBoot HALDISPATCH->HalEndOfBoot #define HalMirrorVerify HALDISPATCH->HalMirrorVerify -#define HalGetCachedAcpiTable HALDISPATCH->HalGetCachedAcpiTable -#define HalSetPciErrorHandlerCallback HALDISPATCH->HalSetPciErrorHandlerCallback -#if defined(_IA64_) -#define HalGetErrorCapList HALDISPATCH->HalGetErrorCapList -#define HalInjectError HALDISPATCH->HalInjectError + +typedef struct _FILE_ALIGNMENT_INFORMATION { + ULONG AlignmentRequirement; +} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; + +typedef struct _FILE_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + + +typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { + ULONG FileAttributes; + ULONG ReparseTag; +} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; + +typedef struct _FILE_DISPOSITION_INFORMATION { + BOOLEAN DeleteFile; +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; + +typedef struct _FILE_END_OF_FILE_INFORMATION { + LARGE_INTEGER EndOfFile; +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; + +typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { + LARGE_INTEGER ValidDataLength; +} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; + +typedef union _FILE_SEGMENT_ELEMENT { + PVOID64 Buffer; + ULONGLONG Alignment; +}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; + +#define SE_UNSOLICITED_INPUT_PRIVILEGE 6 + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +ULONGLONG +NTAPI +VerSetConditionMask( + IN ULONGLONG ConditionMask, + IN ULONG TypeMask, + IN UCHAR Condition); #endif -typedef struct _HAL_BUS_INFORMATION { - INTERFACE_TYPE BusType; - BUS_DATA_TYPE ConfigurationType; - ULONG BusNumber; - ULONG Reserved; -} HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION; - -typedef struct _HAL_PROFILE_SOURCE_INFORMATION { - KPROFILE_SOURCE Source; - BOOLEAN Supported; - ULONG Interval; -} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; - -typedef struct _HAL_PROFILE_SOURCE_INFORMATION_EX { - KPROFILE_SOURCE Source; - BOOLEAN Supported; - ULONG_PTR Interval; - ULONG_PTR DefInterval; - ULONG_PTR MaxInterval; - ULONG_PTR MinInterval; -} HAL_PROFILE_SOURCE_INFORMATION_EX, *PHAL_PROFILE_SOURCE_INFORMATION_EX; - -typedef struct _HAL_PROFILE_SOURCE_INTERVAL { - KPROFILE_SOURCE Source; - ULONG_PTR Interval; -} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; - -typedef struct _HAL_PROFILE_SOURCE_LIST { - KPROFILE_SOURCE Source; - PWSTR Description; -} HAL_PROFILE_SOURCE_LIST, *PHAL_PROFILE_SOURCE_LIST; - -typedef enum _HAL_DISPLAY_BIOS_INFORMATION { - HalDisplayInt10Bios, - HalDisplayEmulatedBios, - HalDisplayNoBios -} HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION; - -typedef struct _HAL_POWER_INFORMATION { - ULONG TBD; -} HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION; - -typedef struct _HAL_PROCESSOR_SPEED_INFO { - ULONG ProcessorSpeed; -} HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION; - -typedef struct _HAL_CALLBACKS { - PCALLBACK_OBJECT SetSystemInformation; - PCALLBACK_OBJECT BusCheck; -} HAL_CALLBACKS, *PHAL_CALLBACKS; - -typedef struct _HAL_PROCESSOR_FEATURE { - ULONG UsableFeatureBits; -} HAL_PROCESSOR_FEATURE; - -typedef NTSTATUS -(NTAPI *PHALIOREADWRITEHANDLER)( - IN BOOLEAN fRead, - IN ULONG dwAddr, - IN ULONG dwSize, - IN OUT PULONG pdwData); - -typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST { - ULONG BadAddrBegin; - ULONG BadAddrSize; - ULONG OSVersionTrigger; - PHALIOREADWRITEHANDLER IOHandler; -} HAL_AMLI_BAD_IO_ADDRESS_LIST, *PHAL_AMLI_BAD_IO_ADDRESS_LIST; - -#if defined(_X86_) || defined(_IA64_) || defined(_AMD64_) - -typedef VOID -(NTAPI *PHALMCAINTERFACELOCK)( - VOID); - -typedef VOID -(NTAPI *PHALMCAINTERFACEUNLOCK)( - VOID); - -typedef NTSTATUS -(NTAPI *PHALMCAINTERFACEREADREGISTER)( - IN UCHAR BankNumber, - IN OUT PVOID Exception); - -typedef struct _HAL_MCA_INTERFACE { - PHALMCAINTERFACELOCK Lock; - PHALMCAINTERFACEUNLOCK Unlock; - PHALMCAINTERFACEREADREGISTER ReadRegister; -} HAL_MCA_INTERFACE; - -typedef enum { - ApicDestinationModePhysical = 1, - ApicDestinationModeLogicalFlat, - ApicDestinationModeLogicalClustered, - ApicDestinationModeUnknown -} HAL_APIC_DESTINATION_MODE, *PHAL_APIC_DESTINATION_MODE; - -#if defined(_AMD64_) - -struct _KTRAP_FRAME; -struct _KEXCEPTION_FRAME; - -typedef ERROR_SEVERITY -(NTAPI *PDRIVER_EXCPTN_CALLBACK)( - IN PVOID Context, - IN struct _KTRAP_FRAME *TrapFrame, - IN struct _KEXCEPTION_FRAME *ExceptionFrame, - IN PMCA_EXCEPTION Exception); - -#endif - -#if defined(_X86_) || defined(_IA64_) -typedef -#if defined(_IA64_) -ERROR_SEVERITY -#else -VOID -#endif -(NTAPI *PDRIVER_EXCPTN_CALLBACK)( - IN PVOID Context, - IN PMCA_EXCEPTION BankLog); -#endif - -typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK; - -typedef struct _MCA_DRIVER_INFO { - PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback; - PKDEFERRED_ROUTINE DpcCallback; - PVOID DeviceContext; -} MCA_DRIVER_INFO, *PMCA_DRIVER_INFO; - -typedef struct _HAL_ERROR_INFO { - ULONG Version; - ULONG InitMaxSize; - ULONG McaMaxSize; - ULONG McaPreviousEventsCount; - ULONG McaCorrectedEventsCount; - ULONG McaKernelDeliveryFails; - ULONG McaDriverDpcQueueFails; - ULONG McaReserved; - ULONG CmcMaxSize; - ULONG CmcPollingInterval; - ULONG CmcInterruptsCount; - ULONG CmcKernelDeliveryFails; - ULONG CmcDriverDpcQueueFails; - ULONG CmcGetStateFails; - ULONG CmcClearStateFails; - ULONG CmcReserved; - ULONGLONG CmcLogId; - ULONG CpeMaxSize; - ULONG CpePollingInterval; - ULONG CpeInterruptsCount; - ULONG CpeKernelDeliveryFails; - ULONG CpeDriverDpcQueueFails; - ULONG CpeGetStateFails; - ULONG CpeClearStateFails; - ULONG CpeInterruptSources; - ULONGLONG CpeLogId; - ULONGLONG KernelReserved[4]; -} HAL_ERROR_INFO, *PHAL_ERROR_INFO; - -#define HAL_MCE_INTERRUPTS_BASED ((ULONG)-1) -#define HAL_MCE_DISABLED ((ULONG)0) - -#define HAL_CMC_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED -#define HAL_CMC_DISABLED HAL_MCE_DISABLED - -#define HAL_CPE_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED -#define HAL_CPE_DISABLED HAL_MCE_DISABLED - -#define HAL_MCA_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED -#define HAL_MCA_DISABLED HAL_MCE_DISABLED - -typedef VOID -(NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)( - IN PVOID Context, - IN PCMC_EXCEPTION CmcLog); - -typedef VOID -(NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)( - IN PVOID Context, - IN PCPE_EXCEPTION CmcLog); - -typedef struct _CMC_DRIVER_INFO { - PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback; - PKDEFERRED_ROUTINE DpcCallback; - PVOID DeviceContext; -} CMC_DRIVER_INFO, *PCMC_DRIVER_INFO; - -typedef struct _CPE_DRIVER_INFO { - PDRIVER_CPE_EXCEPTION_CALLBACK ExceptionCallback; - PKDEFERRED_ROUTINE DpcCallback; - PVOID DeviceContext; -} CPE_DRIVER_INFO, *PCPE_DRIVER_INFO; - -#endif // defined(_X86_) || defined(_IA64_) || defined(_AMD64_) - -#if defined(_IA64_) - -typedef NTSTATUS -(*HALSENDCROSSPARTITIONIPI)( - IN USHORT ProcessorID, - IN UCHAR HardwareVector); - -typedef NTSTATUS -(*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)( - OUT PULONG Vector, - OUT PKIRQL Irql, - IN OUT PGROUP_AFFINITY Affinity, - OUT PUCHAR HardwareVector); - -typedef VOID -(*HALFREECROSSPARTITIONINTERRUPTVECTOR)( - IN ULONG Vector, - IN PGROUP_AFFINITY Affinity); - -typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE { - HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi; - HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector; - HALFREECROSSPARTITIONINTERRUPTVECTOR HalFreeCrossPartitionInterruptVector; -} HAL_CROSS_PARTITION_IPI_INTERFACE; - -#define HAL_CROSS_PARTITION_IPI_INTERFACE_MINIMUM_SIZE \ - FIELD_OFFSET(HAL_CROSS_PARTITION_IPI_INTERFACE, \ - HalFreeCrossPartitionInterruptVector) - -#endif /* defined(_IA64_) */ - -typedef struct _HAL_PLATFORM_INFORMATION { - ULONG PlatformFlags; -} HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION; - -#define HAL_PLATFORM_DISABLE_WRITE_COMBINING 0x01L -#define HAL_PLATFORM_DISABLE_PTCG 0x04L -#define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L -#define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO 0x10L -#define HAL_PLATFORM_ACPI_TABLES_CACHED 0x20L - -/****************************************************************************** - * Kernel Types * - ******************************************************************************/ - -#define NX_SUPPORT_POLICY_ALWAYSOFF 0 -#define NX_SUPPORT_POLICY_ALWAYSON 1 -#define NX_SUPPORT_POLICY_OPTIN 2 -#define NX_SUPPORT_POLICY_OPTOUT 3 - -typedef VOID -(NTAPI *PEXPAND_STACK_CALLOUT)( - IN PVOID Parameter OPTIONAL); - -typedef VOID -(NTAPI *PTIMER_APC_ROUTINE)( - IN PVOID TimerContext, - IN ULONG TimerLowValue, - IN LONG TimerHighValue); - -typedef enum _TIMER_SET_INFORMATION_CLASS { - TimerSetCoalescableTimer, - MaxTimerInfoClass -} TIMER_SET_INFORMATION_CLASS; - -#if (NTDDI_VERSION >= NTDDI_WIN7) -typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO { - IN LARGE_INTEGER DueTime; - IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL; - IN PVOID TimerContext OPTIONAL; - IN struct _COUNTED_REASON_CONTEXT *WakeContext OPTIONAL; - IN ULONG Period OPTIONAL; - IN ULONG TolerableDelay; - OUT PBOOLEAN PreviousState OPTIONAL; -} TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO; -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#define XSTATE_LEGACY_FLOATING_POINT 0 -#define XSTATE_LEGACY_SSE 1 -#define XSTATE_GSSE 2 - -#define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT)) -#define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE)) -#define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE) -#define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE)) - -#define MAXIMUM_XSTATE_FEATURES 64 - -typedef struct _XSTATE_FEATURE { - ULONG Offset; - ULONG Size; -} XSTATE_FEATURE, *PXSTATE_FEATURE; - -typedef struct _XSTATE_CONFIGURATION { - ULONG64 EnabledFeatures; - ULONG Size; - ULONG OptimizedSave:1; - XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES]; -} XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION; - -#define MAX_WOW64_SHARED_ENTRIES 16 - -typedef struct _KUSER_SHARED_DATA { - ULONG TickCountLowDeprecated; - ULONG TickCountMultiplier; - volatile KSYSTEM_TIME InterruptTime; - volatile KSYSTEM_TIME SystemTime; - volatile KSYSTEM_TIME TimeZoneBias; - USHORT ImageNumberLow; - USHORT ImageNumberHigh; - WCHAR NtSystemRoot[260]; - ULONG MaxStackTraceDepth; - ULONG CryptoExponent; - ULONG TimeZoneId; - ULONG LargePageMinimum; - ULONG Reserved2[7]; - NT_PRODUCT_TYPE NtProductType; - BOOLEAN ProductTypeIsValid; - ULONG NtMajorVersion; - ULONG NtMinorVersion; - BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; - ULONG Reserved1; - ULONG Reserved3; - volatile ULONG TimeSlip; - ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; - ULONG AltArchitecturePad[1]; - LARGE_INTEGER SystemExpirationDate; - ULONG SuiteMask; - BOOLEAN KdDebuggerEnabled; -#if (NTDDI_VERSION >= NTDDI_WINXPSP2) - UCHAR NXSupportPolicy; -#endif - volatile ULONG ActiveConsoleId; - volatile ULONG DismountCount; - ULONG ComPlusPackage; - ULONG LastSystemRITEventTickCount; - ULONG NumberOfPhysicalPages; - BOOLEAN SafeBootMode; -#if (NTDDI_VERSION >= NTDDI_WIN7) - union { - UCHAR TscQpcData; - struct { - UCHAR TscQpcEnabled:1; - UCHAR TscQpcSpareFlag:1; - UCHAR TscQpcShift:6; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - UCHAR TscQpcPad[2]; -#endif -#if (NTDDI_VERSION >= NTDDI_VISTA) - union { - ULONG SharedDataFlags; - struct { - ULONG DbgErrorPortPresent:1; - ULONG DbgElevationEnabled:1; - ULONG DbgVirtEnabled:1; - ULONG DbgInstallerDetectEnabled:1; - ULONG DbgSystemDllRelocated:1; - ULONG DbgDynProcessorEnabled:1; - ULONG DbgSEHValidationEnabled:1; - ULONG SpareBits:25; - } DUMMYSTRUCTNAME2; - } DUMMYUNIONNAME2; -#else - ULONG TraceLogging; -#endif - ULONG DataFlagsPad[1]; - ULONGLONG TestRetInstruction; - ULONG SystemCall; - ULONG SystemCallReturn; - ULONGLONG SystemCallPad[3]; - _ANONYMOUS_UNION union { - volatile KSYSTEM_TIME TickCount; - volatile ULONG64 TickCountQuad; - _ANONYMOUS_STRUCT struct { - ULONG ReservedTickCountOverlay[3]; - ULONG TickCountPad[1]; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME3; - ULONG Cookie; - ULONG CookiePad[1]; -#if (NTDDI_VERSION >= NTDDI_WS03) - LONGLONG ConsoleSessionForegroundProcessId; - ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; -#endif -#if (NTDDI_VERSION >= NTDDI_VISTA) -#if (NTDDI_VERSION >= NTDDI_WIN7) - USHORT UserModeGlobalLogger[16]; -#else - USHORT UserModeGlobalLogger[8]; - ULONG HeapTracingPid[2]; - ULONG CritSecTracingPid[2]; -#endif - ULONG ImageFileExecutionOptions; -#if (NTDDI_VERSION >= NTDDI_VISTASP1) - ULONG LangGenerationCount; -#else - /* 4 bytes padding */ -#endif - ULONGLONG Reserved5; - volatile ULONG64 InterruptTimeBias; -#endif -#if (NTDDI_VERSION >= NTDDI_WIN7) - volatile ULONG64 TscQpcBias; - volatile ULONG ActiveProcessorCount; - volatile USHORT ActiveGroupCount; - USHORT Reserved4; - volatile ULONG AitSamplingValue; - volatile ULONG AppCompatFlag; - ULONGLONG SystemDllNativeRelocation; - ULONG SystemDllWowRelocation; - ULONG XStatePad[1]; - XSTATE_CONFIGURATION XState; -#endif -} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA; - -#if (NTDDI_VERSION >= NTDDI_VISTA) -extern NTSYSAPI volatile CCHAR KeNumberProcessors; -#elif (NTDDI_VERSION >= NTDDI_WINXP) -extern NTSYSAPI CCHAR KeNumberProcessors; -#else -extern PCCHAR KeNumberProcessors; -#endif - - -/****************************************************************************** - * Kernel Debugger Types * - ******************************************************************************/ -typedef struct _DEBUG_DEVICE_ADDRESS { - UCHAR Type; - BOOLEAN Valid; - UCHAR Reserved[2]; - PUCHAR TranslatedAddress; - ULONG Length; -} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; - -typedef struct _DEBUG_MEMORY_REQUIREMENTS { - PHYSICAL_ADDRESS Start; - PHYSICAL_ADDRESS MaxEnd; - PVOID VirtualAddress; - ULONG Length; - BOOLEAN Cached; - BOOLEAN Aligned; -} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; - -typedef struct _DEBUG_DEVICE_DESCRIPTOR { - ULONG Bus; - ULONG Slot; - USHORT Segment; - USHORT VendorID; - USHORT DeviceID; - UCHAR BaseClass; - UCHAR SubClass; - UCHAR ProgIf; - BOOLEAN Initialized; - BOOLEAN Configured; - DEBUG_DEVICE_ADDRESS BaseAddress[6]; - DEBUG_MEMORY_REQUIREMENTS Memory; -} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; - -typedef NTSTATUS -(NTAPI *pKdSetupPciDeviceForDebugging)( - IN PVOID LoaderBlock OPTIONAL, - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); - -typedef NTSTATUS -(NTAPI *pKdReleasePciDeviceForDebugging)( - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); - -typedef PVOID -(NTAPI *pKdGetAcpiTablePhase0)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN ULONG Signature); - -typedef VOID -(NTAPI *pKdCheckPowerButton)( - VOID); - -#if (NTDDI_VERSION >= NTDDI_VISTA) -typedef PVOID -(NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); - -typedef VOID -(NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); -#else -typedef PVOID -(NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages); - -typedef VOID -(NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages); -#endif - -typedef ULONG -(NTAPI *pKdGetPciDataByOffset)( - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef ULONG -(NTAPI *pKdSetPciDataByOffset)( - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); -/****************************************************************************** - * Memory manager Types * - ******************************************************************************/ - -typedef struct _PHYSICAL_MEMORY_RANGE { - PHYSICAL_ADDRESS BaseAddress; - LARGE_INTEGER NumberOfBytes; -} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; - -typedef NTSTATUS -(NTAPI *PMM_ROTATE_COPY_CALLBACK_FUNCTION)( - IN PMDL DestinationMdl, - IN PMDL SourceMdl, - IN PVOID Context); - -typedef enum _MM_ROTATE_DIRECTION { - MmToFrameBuffer, - MmToFrameBufferNoCopy, - MmToRegularMemory, - MmToRegularMemoryNoCopy, - MmMaximumRotateDirection -} MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION; - - -/****************************************************************************** - * Process Manager Types * - ******************************************************************************/ - -#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001 -#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002 -#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004 -#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 -#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 - -typedef struct _QUOTA_LIMITS { - SIZE_T PagedPoolLimit; - SIZE_T NonPagedPoolLimit; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - SIZE_T PagefileLimit; - LARGE_INTEGER TimeLimit; -} QUOTA_LIMITS, *PQUOTA_LIMITS; - -typedef union _RATE_QUOTA_LIMIT { - ULONG RateData; - struct { - ULONG RatePercent:7; - ULONG Reserved0:25; - } DUMMYSTRUCTNAME; -} RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT; - -typedef struct _QUOTA_LIMITS_EX { - SIZE_T PagedPoolLimit; - SIZE_T NonPagedPoolLimit; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - SIZE_T PagefileLimit; - LARGE_INTEGER TimeLimit; - SIZE_T WorkingSetLimit; - SIZE_T Reserved2; - SIZE_T Reserved3; - SIZE_T Reserved4; - ULONG Flags; - RATE_QUOTA_LIMIT CpuRateLimit; -} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX; - -typedef struct _IO_COUNTERS { - ULONGLONG ReadOperationCount; - ULONGLONG WriteOperationCount; - ULONGLONG OtherOperationCount; - ULONGLONG ReadTransferCount; - ULONGLONG WriteTransferCount; - ULONGLONG OtherTransferCount; -} IO_COUNTERS, *PIO_COUNTERS; - -typedef struct _VM_COUNTERS { - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; -} VM_COUNTERS, *PVM_COUNTERS; - -typedef struct _VM_COUNTERS_EX { - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; - SIZE_T PrivateUsage; -} VM_COUNTERS_EX, *PVM_COUNTERS_EX; - -#define MAX_HW_COUNTERS 16 -#define THREAD_PROFILING_FLAG_DISPATCH 0x00000001 - -typedef enum _HARDWARE_COUNTER_TYPE { - PMCCounter, - MaxHardwareCounterType -} HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE; - -typedef struct _HARDWARE_COUNTER { - HARDWARE_COUNTER_TYPE Type; - ULONG Reserved; - ULONG64 Index; -} HARDWARE_COUNTER, *PHARDWARE_COUNTER; - -typedef struct _POOLED_USAGE_AND_LIMITS { - SIZE_T PeakPagedPoolUsage; - SIZE_T PagedPoolUsage; - SIZE_T PagedPoolLimit; - SIZE_T PeakNonPagedPoolUsage; - SIZE_T NonPagedPoolUsage; - SIZE_T NonPagedPoolLimit; - SIZE_T PeakPagefileUsage; - SIZE_T PagefileUsage; - SIZE_T PagefileLimit; -} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; - -typedef struct _PROCESS_ACCESS_TOKEN { - HANDLE Token; - HANDLE Thread; -} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; - -#define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS 0x00000003UL -#define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1)) - -typedef struct _PROCESS_EXCEPTION_PORT { - IN HANDLE ExceptionPortHandle; - IN OUT ULONG StateFlags; -} PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT; - -typedef VOID -(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( - IN HANDLE ParentId, - IN HANDLE ProcessId, - IN BOOLEAN Create); - -typedef struct _PS_CREATE_NOTIFY_INFO { - IN SIZE_T Size; - union { - IN ULONG Flags; - struct { - IN ULONG FileOpenNameAvailable:1; - IN ULONG Reserved:31; - }; - }; - IN HANDLE ParentProcessId; - IN CLIENT_ID CreatingThreadId; - IN OUT struct _FILE_OBJECT *FileObject; - IN PCUNICODE_STRING ImageFileName; - IN PCUNICODE_STRING CommandLine OPTIONAL; - IN OUT NTSTATUS CreationStatus; -} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO; - -typedef VOID -(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE_EX)( - IN OUT PEPROCESS Process, - IN HANDLE ProcessId, - IN PPS_CREATE_NOTIFY_INFO CreateInfo OPTIONAL); - -typedef VOID -(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( - IN HANDLE ProcessId, - IN HANDLE ThreadId, - IN BOOLEAN Create); - -#define IMAGE_ADDRESSING_MODE_32BIT 3 +#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ + ((ConditionMask) = VerSetConditionMask((ConditionMask), \ + (TypeBitMask), (ComparisonType))) + +/* RtlVerifyVersionInfo() TypeMask */ + +#define VER_MINORVERSION 0x0000001 +#define VER_MAJORVERSION 0x0000002 +#define VER_BUILDNUMBER 0x0000004 +#define VER_PLATFORMID 0x0000008 +#define VER_SERVICEPACKMINOR 0x0000010 +#define VER_SERVICEPACKMAJOR 0x0000020 +#define VER_SUITENAME 0x0000040 +#define VER_PRODUCT_TYPE 0x0000080 + +/* RtlVerifyVersionInfo() ComparisonType */ + +#define VER_EQUAL 1 +#define VER_GREATER 2 +#define VER_GREATER_EQUAL 3 +#define VER_LESS 4 +#define VER_LESS_EQUAL 5 +#define VER_AND 6 +#define VER_OR 7 + +#define VER_CONDITION_MASK 7 +#define VER_NUM_BITS_PER_CONDITION_MASK 3 typedef struct _IMAGE_INFO { _ANONYMOUS_UNION union { @@ -2258,7 +834,7 @@ typedef struct _IMAGE_INFO { ULONG SystemModeImage:1; ULONG ImageMappedToAllPids:1; ULONG ExtendedInfoPresent:1; - ULONG Reserved:21; + ULONG Reserved:22; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; PVOID ImageBase; @@ -2267,24 +843,24 @@ typedef struct _IMAGE_INFO { ULONG ImageSectionNumber; } IMAGE_INFO, *PIMAGE_INFO; -typedef struct _IMAGE_INFO_EX { - SIZE_T Size; - IMAGE_INFO ImageInfo; - struct _FILE_OBJECT *FileObject; -} IMAGE_INFO_EX, *PIMAGE_INFO_EX; +#define IMAGE_ADDRESSING_MODE_32BIT 3 -typedef VOID -(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( - IN PUNICODE_STRING FullImageName, - IN HANDLE ProcessId, - IN PIMAGE_INFO ImageInfo); - -#define THREAD_CSWITCH_PMU_DISABLE FALSE -#define THREAD_CSWITCH_PMU_ENABLE TRUE - -#define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001 - -#define PROCESS_HANDLE_TRACING_MAX_STACKS 16 +typedef enum _BUS_DATA_TYPE { + ConfigurationSpaceUndefined = -1, + Cmos, + EisaConfiguration, + Pos, + CbusConfiguration, + PCIConfiguration, + VMEConfiguration, + NuBusConfiguration, + PCMCIAConfiguration, + MPIConfiguration, + MPSAConfiguration, + PNPISAConfiguration, + SgiInternalConfiguration, + MaximumBusDataType +} BUS_DATA_TYPE, *PBUS_DATA_TYPE; typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; @@ -2418,15 +994,6 @@ typedef enum _THREADINFOCLASS { MaxThreadInfoClass } THREADINFOCLASS; -typedef struct _PAGE_PRIORITY_INFORMATION { - ULONG PagePriority; -} PAGE_PRIORITY_INFORMATION, *PPAGE_PRIORITY_INFORMATION; - -typedef struct _PROCESS_WS_WATCH_INFORMATION { - PVOID FaultingPc; - PVOID FaultingVa; -} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; - typedef struct _PROCESS_BASIC_INFORMATION { NTSTATUS ExitStatus; struct _PEB *PebBaseAddress; @@ -2436,20 +1003,10 @@ typedef struct _PROCESS_BASIC_INFORMATION { ULONG_PTR InheritedFromUniqueProcessId; } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION; -typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION { - SIZE_T Size; - PROCESS_BASIC_INFORMATION BasicInfo; - union { - ULONG Flags; - struct { - ULONG IsProtectedProcess:1; - ULONG IsWow64Process:1; - ULONG IsProcessDeleting:1; - ULONG IsCrossSessionCreate:1; - ULONG SpareBits:28; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; -} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION; +typedef struct _PROCESS_WS_WATCH_INFORMATION { + PVOID FaultingPc; + PVOID FaultingVa; +} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; typedef struct _PROCESS_DEVICEMAP_INFORMATION { __GNU_EXTENSION union { @@ -2463,263 +1020,514 @@ typedef struct _PROCESS_DEVICEMAP_INFORMATION { }; } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION; -typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX { - union { - struct { - HANDLE DirectoryHandle; - } Set; - struct { - ULONG DriveMap; - UCHAR DriveType[32]; - } Query; - } DUMMYUNIONNAME; - ULONG Flags; -} PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX; +typedef struct _KERNEL_USER_TIMES { + LARGE_INTEGER CreateTime; + LARGE_INTEGER ExitTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; +} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; + +typedef struct _PROCESS_ACCESS_TOKEN { + HANDLE Token; + HANDLE Thread; +} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; typedef struct _PROCESS_SESSION_INFORMATION { ULONG SessionId; } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION; -typedef struct _PROCESS_HANDLE_TRACING_ENABLE { - ULONG Flags; -} PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE; +typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { + IoQueryDeviceIdentifier = 0, + IoQueryDeviceConfigurationData, + IoQueryDeviceComponentInformation, + IoQueryDeviceMaxData +} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT; -typedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX { - ULONG Flags; - ULONG TotalSlots; -} PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX; +typedef struct _DISK_SIGNATURE { + ULONG PartitionStyle; + _ANONYMOUS_UNION union { + struct { + ULONG Signature; + ULONG CheckSum; + } Mbr; + struct { + GUID DiskId; + } Gpt; + } DUMMYUNIONNAME; +} DISK_SIGNATURE, *PDISK_SIGNATURE; -typedef struct _PROCESS_HANDLE_TRACING_ENTRY { - HANDLE Handle; - CLIENT_ID ClientId; - ULONG Type; - PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS]; -} PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY; +typedef ULONG_PTR +(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( + IN PVOID Context); -typedef struct _PROCESS_HANDLE_TRACING_QUERY { - HANDLE Handle; - ULONG TotalTraces; - PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1]; -} PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY; +typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { + PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; + PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; +} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; -extern NTKERNELAPI PEPROCESS PsInitialSystemProcess; - - -/****************************************************************************** - * Runtime Library Types * - ******************************************************************************/ - - - -#ifndef _RTL_RUN_ONCE_DEF -#define _RTL_RUN_ONCE_DEF - -#define RTL_RUN_ONCE_INIT {0} - -#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001UL -#define RTL_RUN_ONCE_ASYNC 0x00000002UL -#define RTL_RUN_ONCE_INIT_FAILED 0x00000004UL - -#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2 - -#define RTL_HASH_ALLOCATED_HEADER 0x00000001 - -#define RTL_HASH_RESERVED_SIGNATURE 0 - -/* RtlVerifyVersionInfo() ComparisonType */ - -#define VER_EQUAL 1 -#define VER_GREATER 2 -#define VER_GREATER_EQUAL 3 -#define VER_LESS 4 -#define VER_LESS_EQUAL 5 -#define VER_AND 6 -#define VER_OR 7 - -#define VER_CONDITION_MASK 7 -#define VER_NUM_BITS_PER_CONDITION_MASK 3 - -/* RtlVerifyVersionInfo() TypeMask */ - -#define VER_MINORVERSION 0x0000001 -#define VER_MAJORVERSION 0x0000002 -#define VER_BUILDNUMBER 0x0000004 -#define VER_PLATFORMID 0x0000008 -#define VER_SERVICEPACKMINOR 0x0000010 -#define VER_SERVICEPACKMAJOR 0x0000020 -#define VER_SUITENAME 0x0000040 -#define VER_PRODUCT_TYPE 0x0000080 - -#define VER_NT_WORKSTATION 0x0000001 -#define VER_NT_DOMAIN_CONTROLLER 0x0000002 -#define VER_NT_SERVER 0x0000003 - -#define VER_PLATFORM_WIN32s 0 -#define VER_PLATFORM_WIN32_WINDOWS 1 -#define VER_PLATFORM_WIN32_NT 2 - -typedef union _RTL_RUN_ONCE { - PVOID Ptr; -} RTL_RUN_ONCE, *PRTL_RUN_ONCE; - -typedef ULONG /* LOGICAL */ -(NTAPI *PRTL_RUN_ONCE_INIT_FN) ( - IN OUT PRTL_RUN_ONCE RunOnce, - IN OUT PVOID Parameter OPTIONAL, - IN OUT PVOID *Context OPTIONAL); - -#endif /* _RTL_RUN_ONCE_DEF */ - -typedef enum _TABLE_SEARCH_RESULT { - TableEmptyTree, - TableFoundNode, - TableInsertAsLeft, - TableInsertAsRight -} TABLE_SEARCH_RESULT; - -typedef enum _RTL_GENERIC_COMPARE_RESULTS { - GenericLessThan, - GenericGreaterThan, - GenericEqual -} RTL_GENERIC_COMPARE_RESULTS; - -// Forwarder -struct _RTL_AVL_TABLE; - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID FirstStruct, - IN PVOID SecondStruct); - -typedef PVOID -(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN CLONG ByteSize); +#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 +#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 +#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 +#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 +#define DRIVER_VERIFIER_IO_CHECKING 0x0010 typedef VOID -(NTAPI *PRTL_AVL_FREE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID Buffer); +(NTAPI *PTIMER_APC_ROUTINE)( + IN PVOID TimerContext, + IN ULONG TimerLowValue, + IN LONG TimerHighValue); -typedef NTSTATUS -(NTAPI *PRTL_AVL_MATCH_FUNCTION) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID UserData, - IN PVOID MatchData); +typedef struct _KUSER_SHARED_DATA +{ + ULONG TickCountLowDeprecated; + ULONG TickCountMultiplier; + volatile KSYSTEM_TIME InterruptTime; + volatile KSYSTEM_TIME SystemTime; + volatile KSYSTEM_TIME TimeZoneBias; + USHORT ImageNumberLow; + USHORT ImageNumberHigh; + WCHAR NtSystemRoot[260]; + ULONG MaxStackTraceDepth; + ULONG CryptoExponent; + ULONG TimeZoneId; + ULONG LargePageMinimum; + ULONG Reserved2[7]; + NT_PRODUCT_TYPE NtProductType; + BOOLEAN ProductTypeIsValid; + ULONG NtMajorVersion; + ULONG NtMinorVersion; + BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; + ULONG Reserved1; + ULONG Reserved3; + volatile ULONG TimeSlip; + ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; + ULONG AltArchitecturePad[1]; + LARGE_INTEGER SystemExpirationDate; + ULONG SuiteMask; + BOOLEAN KdDebuggerEnabled; +#if (NTDDI_VERSION >= NTDDI_WINXPSP2) + UCHAR NXSupportPolicy; +#endif + volatile ULONG ActiveConsoleId; + volatile ULONG DismountCount; + ULONG ComPlusPackage; + ULONG LastSystemRITEventTickCount; + ULONG NumberOfPhysicalPages; + BOOLEAN SafeBootMode; +#if (NTDDI_VERSION >= NTDDI_WIN7) + union { + UCHAR TscQpcData; + struct { + UCHAR TscQpcEnabled:1; + UCHAR TscQpcSpareFlag:1; + UCHAR TscQpcShift:6; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR TscQpcPad[2]; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) + union { + ULONG SharedDataFlags; + struct { + ULONG DbgErrorPortPresent:1; + ULONG DbgElevationEnabled:1; + ULONG DbgVirtEnabled:1; + ULONG DbgInstallerDetectEnabled:1; + ULONG DbgSystemDllRelocated:1; + ULONG DbgDynProcessorEnabled:1; + ULONG DbgSEHValidationEnabled:1; + ULONG SpareBits:25; + } DUMMYSTRUCTNAME2; + } DUMMYUNIONNAME2; +#else + ULONG TraceLogging; +#endif + ULONG DataFlagsPad[1]; + ULONGLONG TestRetInstruction; + ULONG SystemCall; + ULONG SystemCallReturn; + ULONGLONG SystemCallPad[3]; + _ANONYMOUS_UNION union { + volatile KSYSTEM_TIME TickCount; + volatile ULONG64 TickCountQuad; + _ANONYMOUS_STRUCT struct { + ULONG ReservedTickCountOverlay[3]; + ULONG TickCountPad[1]; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME3; + ULONG Cookie; + ULONG CookiePad[1]; +#if (NTDDI_VERSION >= NTDDI_WS03) + LONGLONG ConsoleSessionForegroundProcessId; + ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) +#if (NTDDI_VERSION >= NTDDI_WIN7) + USHORT UserModeGlobalLogger[16]; +#else + USHORT UserModeGlobalLogger[8]; + ULONG HeapTracingPid[2]; + ULONG CritSecTracingPid[2]; +#endif + ULONG ImageFileExecutionOptions; +#if (NTDDI_VERSION >= NTDDI_VISTASP1) + ULONG LangGenerationCount; +#else + /* 4 bytes padding */ +#endif + ULONGLONG Reserved5; + volatile ULONG64 InterruptTimeBias; +#endif +#if (NTDDI_VERSION >= NTDDI_WIN7) + volatile ULONG64 TscQpcBias; + volatile ULONG ActiveProcessorCount; + volatile USHORT ActiveGroupCount; + USHORT Reserved4; + volatile ULONG AitSamplingValue; + volatile ULONG AppCompatFlag; + ULONGLONG SystemDllNativeRelocation; + ULONG SystemDllWowRelocation; + ULONG XStatePad[1]; + XSTATE_CONFIGURATION XState; +#endif +} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA; -typedef struct _RTL_BALANCED_LINKS { - struct _RTL_BALANCED_LINKS *Parent; - struct _RTL_BALANCED_LINKS *LeftChild; - struct _RTL_BALANCED_LINKS *RightChild; - CHAR Balance; - UCHAR Reserved[3]; -} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; +extern NTKERNELAPI PVOID MmHighestUserAddress; +extern NTKERNELAPI PVOID MmSystemRangeStart; +extern NTKERNELAPI ULONG MmUserProbeAddress; -typedef struct _RTL_AVL_TABLE { - RTL_BALANCED_LINKS BalancedRoot; - PVOID OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - ULONG DepthOfTree; - PRTL_BALANCED_LINKS RestartKey; - ULONG DeleteCount; - PRTL_AVL_COMPARE_ROUTINE CompareRoutine; - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_AVL_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_AVL_TABLE, *PRTL_AVL_TABLE; -#ifndef RTL_USE_AVL_TABLES +#ifdef _X86_ -struct _RTL_GENERIC_TABLE; +#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress +#define MM_SYSTEM_RANGE_START MmSystemRangeStart +#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_) +#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_ +extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_; +#else +#define MM_USER_PROBE_ADDRESS MmUserProbeAddress +#endif +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START +#define MM_SYSTEM_SPACE_END 0xFFFFFFFF +#if !defined (_X86PAE_) +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 +#else +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 +#endif -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN PVOID FirstStruct, - IN PVOID SecondStruct); +#define KeGetPcr() PCR -typedef PVOID -(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN CLONG ByteSize); +#define KERNEL_STACK_SIZE 12288 +#define KERNEL_LARGE_STACK_SIZE 61440 +#define KERNEL_LARGE_STACK_COMMIT 12288 -typedef VOID -(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN PVOID Buffer); +#define SIZE_OF_80387_REGISTERS 80 -typedef struct _RTL_SPLAY_LINKS { - struct _RTL_SPLAY_LINKS *Parent; - struct _RTL_SPLAY_LINKS *LeftChild; - struct _RTL_SPLAY_LINKS *RightChild; -} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 -typedef struct _RTL_GENERIC_TABLE { - PRTL_SPLAY_LINKS TableRoot; - LIST_ENTRY InsertOrderList; - PLIST_ENTRY OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; - PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_GENERIC_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; +#if !defined(RC_INVOKED) -#endif /* !RTL_USE_AVL_TABLES */ +#define CONTEXT_i386 0x10000 +#define CONTEXT_i486 0x10000 +#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) +#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) +#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) +#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) -#ifdef RTL_USE_AVL_TABLES +#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) -#undef PRTL_GENERIC_COMPARE_ROUTINE -#undef RTL_GENERIC_COMPARE_ROUTINE -#undef PRTL_GENERIC_ALLOCATE_ROUTINE -#undef RTL_GENERIC_ALLOCATE_ROUTINE -#undef PRTL_GENERIC_FREE_ROUTINE -#undef RTL_GENERIC_FREE_ROUTINE -#undef RTL_GENERIC_TABLE -#undef PRTL_GENERIC_TABLE +#endif /* !defined(RC_INVOKED) */ -#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE -#define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE -#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE -#define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE -#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE -#define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE -#define RTL_GENERIC_TABLE RTL_AVL_TABLE -#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE +typedef struct _KPCR { + union { + NT_TIB NtTib; + struct { + struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; + PVOID Used_StackBase; + PVOID Spare2; + PVOID TssCopy; + ULONG ContextSwitches; + KAFFINITY SetMemberCopy; + PVOID Used_Self; + }; + }; + struct _KPCR *SelfPcr; + struct _KPRCB *Prcb; + KIRQL Irql; + ULONG IRR; + ULONG IrrActive; + ULONG IDR; + PVOID KdVersionBlock; + struct _KIDTENTRY *IDT; + struct _KGDTENTRY *GDT; + struct _KTSS *TSS; + USHORT MajorVersion; + USHORT MinorVersion; + KAFFINITY SetMember; + ULONG StallScaleFactor; + UCHAR SpareUnused; + UCHAR Number; + UCHAR Spare0; + UCHAR SecondLevelCacheAssociativity; + ULONG VdmAlert; + ULONG KernelReserved[14]; + ULONG SecondLevelCacheSize; + ULONG HalReserved[16]; +} KPCR, *PKPCR; -#endif /* RTL_USE_AVL_TABLES */ +FORCEINLINE +ULONG +KeGetCurrentProcessorNumber(VOID) +{ + return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); +} -typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY { - LIST_ENTRY Linkage; - ULONG_PTR Signature; -} RTL_DYNAMIC_HASH_TABLE_ENTRY, *PRTL_DYNAMIC_HASH_TABLE_ENTRY; +typedef struct _FLOATING_SAVE_AREA { + ULONG ControlWord; + ULONG StatusWord; + ULONG TagWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; + ULONG Cr0NpxState; +} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; -typedef struct _RTL_DYNAMIC_HASH_TABLE_CONTEXT { - PLIST_ENTRY ChainHead; - PLIST_ENTRY PrevLinkage; - ULONG_PTR Signature; -} RTL_DYNAMIC_HASH_TABLE_CONTEXT, *PRTL_DYNAMIC_HASH_TABLE_CONTEXT; +#include "pshpack4.h" +typedef struct _CONTEXT { + ULONG ContextFlags; + ULONG Dr0; + ULONG Dr1; + ULONG Dr2; + ULONG Dr3; + ULONG Dr6; + ULONG Dr7; + FLOATING_SAVE_AREA FloatSave; + ULONG SegGs; + ULONG SegFs; + ULONG SegEs; + ULONG SegDs; + ULONG Edi; + ULONG Esi; + ULONG Ebx; + ULONG Edx; + ULONG Ecx; + ULONG Eax; + ULONG Ebp; + ULONG Eip; + ULONG SegCs; + ULONG EFlags; + ULONG Esp; + ULONG SegSs; + UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; +} CONTEXT; +#include "poppack.h" -typedef struct _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR { - RTL_DYNAMIC_HASH_TABLE_ENTRY HashEntry; - PLIST_ENTRY ChainHead; - ULONG BucketIndex; -} RTL_DYNAMIC_HASH_TABLE_ENUMERATOR, *PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR; +#endif /* _X86_ */ -typedef struct _RTL_DYNAMIC_HASH_TABLE { - ULONG Flags; - ULONG Shift; - ULONG TableSize; - ULONG Pivot; - ULONG DivisorMask; - ULONG NumEntries; - ULONG NonEmptyBuckets; - ULONG NumEnumerators; - PVOID Directory; -} RTL_DYNAMIC_HASH_TABLE, *PRTL_DYNAMIC_HASH_TABLE; +#ifdef _AMD64_ + +#define PTI_SHIFT 12L +#define PDI_SHIFT 21L +#define PPI_SHIFT 30L +#define PXI_SHIFT 39L +#define PTE_PER_PAGE 512 +#define PDE_PER_PAGE 512 +#define PPE_PER_PAGE 512 +#define PXE_PER_PAGE 512 +#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) +#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) +#define PPI_MASK (PPE_PER_PAGE - 1) +#define PXI_MASK (PXE_PER_PAGE - 1) + +#define PXE_BASE 0xFFFFF6FB7DBED000ULL +#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL +#define PPE_BASE 0xFFFFF6FB7DA00000ULL +#define PDE_BASE 0xFFFFF6FB40000000ULL +#define PTE_BASE 0xFFFFF68000000000ULL +#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL +#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL +#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL +#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL + +#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress +#define MM_SYSTEM_RANGE_START MmSystemRangeStart +#define MM_USER_PROBE_ADDRESS MmUserProbeAddress +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL +#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL + +typedef struct DECLSPEC_ALIGN(16) _CONTEXT { + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5Home; + ULONG64 P6Home; + + /* Control flags */ + ULONG ContextFlags; + ULONG MxCsr; + + /* Segment */ + USHORT SegCs; + USHORT SegDs; + USHORT SegEs; + USHORT SegFs; + USHORT SegGs; + USHORT SegSs; + ULONG EFlags; + + /* Debug */ + ULONG64 Dr0; + ULONG64 Dr1; + ULONG64 Dr2; + ULONG64 Dr3; + ULONG64 Dr6; + ULONG64 Dr7; + + /* Integer */ + ULONG64 Rax; + ULONG64 Rcx; + ULONG64 Rdx; + ULONG64 Rbx; + ULONG64 Rsp; + ULONG64 Rbp; + ULONG64 Rsi; + ULONG64 Rdi; + ULONG64 R8; + ULONG64 R9; + ULONG64 R10; + ULONG64 R11; + ULONG64 R12; + ULONG64 R13; + ULONG64 R14; + ULONG64 R15; + + /* Counter */ + ULONG64 Rip; + + /* Floating point */ + union { + XMM_SAVE_AREA32 FltSave; + struct { + M128A Header[2]; + M128A Legacy[8]; + M128A Xmm0; + M128A Xmm1; + M128A Xmm2; + M128A Xmm3; + M128A Xmm4; + M128A Xmm5; + M128A Xmm6; + M128A Xmm7; + M128A Xmm8; + M128A Xmm9; + M128A Xmm10; + M128A Xmm11; + M128A Xmm12; + M128A Xmm13; + M128A Xmm14; + M128A Xmm15; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + + /* Vector */ + M128A VectorRegister[26]; + ULONG64 VectorControl; + + /* Debug control */ + ULONG64 DebugControl; + ULONG64 LastBranchToRip; + ULONG64 LastBranchFromRip; + ULONG64 LastExceptionToRip; + ULONG64 LastExceptionFromRip; +} CONTEXT; + +typedef struct _KPCR +{ + _ANONYMOUS_UNION union + { + NT_TIB NtTib; + _ANONYMOUS_STRUCT struct + { + union _KGDTENTRY64 *GdtBase; + struct _KTSS64 *TssBase; + ULONG64 UserRsp; + struct _KPCR *Self; + struct _KPRCB *CurrentPrcb; + PKSPIN_LOCK_QUEUE LockArray; + PVOID Used_Self; + }; + }; + union _KIDTENTRY64 *IdtBase; + ULONG64 Unused[2]; + KIRQL Irql; + UCHAR SecondLevelCacheAssociativity; + UCHAR ObsoleteNumber; + UCHAR Fill0; + ULONG Unused0[3]; + USHORT MajorVersion; + USHORT MinorVersion; + ULONG StallScaleFactor; + PVOID Unused1[3]; + ULONG KernelReserved[15]; + ULONG SecondLevelCacheSize; + ULONG HalReserved[16]; + ULONG Unused2; + PVOID KdVersionBlock; + PVOID Unused3; + ULONG PcrAlign1[24]; +} KPCR, *PKPCR; + +FORCEINLINE +PKPCR +KeGetPcr(VOID) +{ + return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); +} + +FORCEINLINE +ULONG +KeGetCurrentProcessorNumber(VOID) +{ + return (ULONG)__readgsword(0x184); +} + +#if !defined(RC_INVOKED) + +#define CONTEXT_AMD64 0x100000 + +#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) +#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) +#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) + +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) +#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) + +#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L) + +#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 +#define CONTEXT_SERVICE_ACTIVE 0x10000000 +#define CONTEXT_EXCEPTION_REQUEST 0x40000000 +#define CONTEXT_EXCEPTION_REPORTING 0x80000000 + +#endif /* RC_INVOKED */ + +#endif /* _AMD64_ */ + +typedef enum _INTERLOCKED_RESULT { + ResultNegative = RESULT_NEGATIVE, + ResultZero = RESULT_ZERO, + ResultPositive = RESULT_POSITIVE +} INTERLOCKED_RESULT; typedef struct _OSVERSIONINFOA { ULONG dwOSVersionInfoSize; @@ -2783,461 +1591,24 @@ typedef POSVERSIONINFOA POSVERSIONINFO; typedef LPOSVERSIONINFOA LPOSVERSIONINFO; #endif /* UNICODE */ -#define HASH_ENTRY_KEY(x) ((x)->Signature) +/* Executive Types */ -/****************************************************************************** - * Security Manager Types * - ******************************************************************************/ -#define SE_UNSOLICITED_INPUT_PRIVILEGE 6 +#define PROTECTED_POOL 0x80000000 -typedef enum _WELL_KNOWN_SID_TYPE { - WinNullSid = 0, - WinWorldSid = 1, - WinLocalSid = 2, - WinCreatorOwnerSid = 3, - WinCreatorGroupSid = 4, - WinCreatorOwnerServerSid = 5, - WinCreatorGroupServerSid = 6, - WinNtAuthoritySid = 7, - WinDialupSid = 8, - WinNetworkSid = 9, - WinBatchSid = 10, - WinInteractiveSid = 11, - WinServiceSid = 12, - WinAnonymousSid = 13, - WinProxySid = 14, - WinEnterpriseControllersSid = 15, - WinSelfSid = 16, - WinAuthenticatedUserSid = 17, - WinRestrictedCodeSid = 18, - WinTerminalServerSid = 19, - WinRemoteLogonIdSid = 20, - WinLogonIdsSid = 21, - WinLocalSystemSid = 22, - WinLocalServiceSid = 23, - WinNetworkServiceSid = 24, - WinBuiltinDomainSid = 25, - WinBuiltinAdministratorsSid = 26, - WinBuiltinUsersSid = 27, - WinBuiltinGuestsSid = 28, - WinBuiltinPowerUsersSid = 29, - WinBuiltinAccountOperatorsSid = 30, - WinBuiltinSystemOperatorsSid = 31, - WinBuiltinPrintOperatorsSid = 32, - WinBuiltinBackupOperatorsSid = 33, - WinBuiltinReplicatorSid = 34, - WinBuiltinPreWindows2000CompatibleAccessSid = 35, - WinBuiltinRemoteDesktopUsersSid = 36, - WinBuiltinNetworkConfigurationOperatorsSid = 37, - WinAccountAdministratorSid = 38, - WinAccountGuestSid = 39, - WinAccountKrbtgtSid = 40, - WinAccountDomainAdminsSid = 41, - WinAccountDomainUsersSid = 42, - WinAccountDomainGuestsSid = 43, - WinAccountComputersSid = 44, - WinAccountControllersSid = 45, - WinAccountCertAdminsSid = 46, - WinAccountSchemaAdminsSid = 47, - WinAccountEnterpriseAdminsSid = 48, - WinAccountPolicyAdminsSid = 49, - WinAccountRasAndIasServersSid = 50, - WinNTLMAuthenticationSid = 51, - WinDigestAuthenticationSid = 52, - WinSChannelAuthenticationSid = 53, - WinThisOrganizationSid = 54, - WinOtherOrganizationSid = 55, - WinBuiltinIncomingForestTrustBuildersSid = 56, - WinBuiltinPerfMonitoringUsersSid = 57, - WinBuiltinPerfLoggingUsersSid = 58, - WinBuiltinAuthorizationAccessSid = 59, - WinBuiltinTerminalServerLicenseServersSid = 60, - WinBuiltinDCOMUsersSid = 61, - WinBuiltinIUsersSid = 62, - WinIUserSid = 63, - WinBuiltinCryptoOperatorsSid = 64, - WinUntrustedLabelSid = 65, - WinLowLabelSid = 66, - WinMediumLabelSid = 67, - WinHighLabelSid = 68, - WinSystemLabelSid = 69, - WinWriteRestrictedCodeSid = 70, - WinCreatorOwnerRightsSid = 71, - WinCacheablePrincipalsGroupSid = 72, - WinNonCacheablePrincipalsGroupSid = 73, - WinEnterpriseReadonlyControllersSid = 74, - WinAccountReadonlyControllersSid = 75, - WinBuiltinEventLogReadersGroup = 76, - WinNewEnterpriseReadonlyControllersSid = 77, - WinBuiltinCertSvcDComAccessGroup = 78, - WinMediumPlusLabelSid = 79, - WinLocalLogonSid = 80, - WinConsoleLogonSid = 81, - WinThisOrganizationCertificateSid = 82, -} WELL_KNOWN_SID_TYPE; +typedef struct _ZONE_SEGMENT_HEADER { + SINGLE_LIST_ENTRY SegmentList; + PVOID Reserved; +} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; +typedef struct _ZONE_HEADER { + SINGLE_LIST_ENTRY FreeList; + SINGLE_LIST_ENTRY SegmentList; + ULONG BlockSize; + ULONG TotalSegmentSize; +} ZONE_HEADER, *PZONE_HEADER; +/* Executive Functions */ -#if defined(_M_IX86) - -#define PAUSE_PROCESSOR YieldProcessor(); - -#define KERNEL_STACK_SIZE 12288 -#define KERNEL_LARGE_STACK_SIZE 61440 -#define KERNEL_LARGE_STACK_COMMIT 12288 - -#define SIZE_OF_80387_REGISTERS 80 - -#if !defined(RC_INVOKED) - -#define CONTEXT_i386 0x10000 -#define CONTEXT_i486 0x10000 -#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) -#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) -#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) -#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) -#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) - -#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \ - CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \ - CONTEXT_EXTENDED_REGISTERS) - -#define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L) - -#endif /* !defined(RC_INVOKED) */ - -typedef struct _FLOATING_SAVE_AREA { - ULONG ControlWord; - ULONG StatusWord; - ULONG TagWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; - ULONG Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; - -#include "pshpack4.h" -typedef struct _CONTEXT { - ULONG ContextFlags; - ULONG Dr0; - ULONG Dr1; - ULONG Dr2; - ULONG Dr3; - ULONG Dr6; - ULONG Dr7; - FLOATING_SAVE_AREA FloatSave; - ULONG SegGs; - ULONG SegFs; - ULONG SegEs; - ULONG SegDs; - ULONG Edi; - ULONG Esi; - ULONG Ebx; - ULONG Edx; - ULONG Ecx; - ULONG Eax; - ULONG Ebp; - ULONG Eip; - ULONG SegCs; - ULONG EFlags; - ULONG Esp; - ULONG SegSs; - UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; -} CONTEXT; -#include "poppack.h" - -#define KeGetPcr() PCR - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR { - union { - NT_TIB NtTib; - struct { - struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; - PVOID Used_StackBase; - PVOID Spare2; - PVOID TssCopy; - ULONG ContextSwitches; - KAFFINITY SetMemberCopy; - PVOID Used_Self; - }; - }; - struct _KPCR *SelfPcr; - struct _KPRCB *Prcb; - KIRQL Irql; - ULONG IRR; - ULONG IrrActive; - ULONG IDR; - PVOID KdVersionBlock; - struct _KIDTENTRY *IDT; - struct _KGDTENTRY *GDT; - struct _KTSS *TSS; - USHORT MajorVersion; - USHORT MinorVersion; - KAFFINITY SetMember; - ULONG StallScaleFactor; - UCHAR SpareUnused; - UCHAR Number; - UCHAR Spare0; - UCHAR SecondLevelCacheAssociativity; - ULONG VdmAlert; - ULONG KernelReserved[14]; - ULONG SecondLevelCacheSize; - ULONG HalReserved[16]; -} KPCR, *PKPCR; - -FORCEINLINE -ULONG -KeGetCurrentProcessorNumber(VOID) -{ - return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); -} - - - - - - -extern NTKERNELAPI PVOID MmHighestUserAddress; -extern NTKERNELAPI PVOID MmSystemRangeStart; -extern NTKERNELAPI ULONG MmUserProbeAddress; - -#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress -#define MM_SYSTEM_RANGE_START MmSystemRangeStart -#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_) -#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_ -extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_; -#else -#define MM_USER_PROBE_ADDRESS MmUserProbeAddress -#endif -#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START -#define MM_SYSTEM_SPACE_END 0xFFFFFFFF -#if !defined (_X86PAE_) -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 -#else -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 -#endif - -#elif defined(_M_AMD64) - -#define PAUSE_PROCESSOR YieldProcessor(); - -#define KERNEL_STACK_SIZE 0x6000 -#define KERNEL_LARGE_STACK_SIZE 0x12000 -#define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE - -#define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000 - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 - -#if !defined(RC_INVOKED) - -#define CONTEXT_AMD64 0x100000 - -#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) -#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) -#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) -#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) - -#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L) - -#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 -#define CONTEXT_SERVICE_ACTIVE 0x10000000 -#define CONTEXT_EXCEPTION_REQUEST 0x40000000 -#define CONTEXT_EXCEPTION_REPORTING 0x80000000 - -#endif /* !defined(RC_INVOKED) */ - -#define INITIAL_MXCSR 0x1f80 -#define INITIAL_FPCSR 0x027f - -typedef struct DECLSPEC_ALIGN(16) _CONTEXT { - ULONG64 P1Home; - ULONG64 P2Home; - ULONG64 P3Home; - ULONG64 P4Home; - ULONG64 P5Home; - ULONG64 P6Home; - ULONG ContextFlags; - ULONG MxCsr; - USHORT SegCs; - USHORT SegDs; - USHORT SegEs; - USHORT SegFs; - USHORT SegGs; - USHORT SegSs; - ULONG EFlags; - ULONG64 Dr0; - ULONG64 Dr1; - ULONG64 Dr2; - ULONG64 Dr3; - ULONG64 Dr6; - ULONG64 Dr7; - ULONG64 Rax; - ULONG64 Rcx; - ULONG64 Rdx; - ULONG64 Rbx; - ULONG64 Rsp; - ULONG64 Rbp; - ULONG64 Rsi; - ULONG64 Rdi; - ULONG64 R8; - ULONG64 R9; - ULONG64 R10; - ULONG64 R11; - ULONG64 R12; - ULONG64 R13; - ULONG64 R14; - ULONG64 R15; - ULONG64 Rip; - union { - XMM_SAVE_AREA32 FltSave; - struct { - M128A Header[2]; - M128A Legacy[8]; - M128A Xmm0; - M128A Xmm1; - M128A Xmm2; - M128A Xmm3; - M128A Xmm4; - M128A Xmm5; - M128A Xmm6; - M128A Xmm7; - M128A Xmm8; - M128A Xmm9; - M128A Xmm10; - M128A Xmm11; - M128A Xmm12; - M128A Xmm13; - M128A Xmm14; - M128A Xmm15; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - M128A VectorRegister[26]; - ULONG64 VectorControl; - ULONG64 DebugControl; - ULONG64 LastBranchToRip; - ULONG64 LastBranchFromRip; - ULONG64 LastExceptionToRip; - ULONG64 LastExceptionFromRip; -} CONTEXT; - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR -{ - _ANONYMOUS_UNION union - { - NT_TIB NtTib; - _ANONYMOUS_STRUCT struct - { - union _KGDTENTRY64 *GdtBase; - struct _KTSS64 *TssBase; - ULONG64 UserRsp; - struct _KPCR *Self; - struct _KPRCB *CurrentPrcb; - PKSPIN_LOCK_QUEUE LockArray; - PVOID Used_Self; - }; - }; - union _KIDTENTRY64 *IdtBase; - ULONG64 Unused[2]; - KIRQL Irql; - UCHAR SecondLevelCacheAssociativity; - UCHAR ObsoleteNumber; - UCHAR Fill0; - ULONG Unused0[3]; - USHORT MajorVersion; - USHORT MinorVersion; - ULONG StallScaleFactor; - PVOID Unused1[3]; - ULONG KernelReserved[15]; - ULONG SecondLevelCacheSize; - ULONG HalReserved[16]; - ULONG Unused2; - PVOID KdVersionBlock; - PVOID Unused3; - ULONG PcrAlign1[24]; -} KPCR, *PKPCR; - -FORCEINLINE -PKPCR -KeGetPcr(VOID) -{ - return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); -} - -FORCEINLINE -ULONG -KeGetCurrentProcessorNumber(VOID) -{ - return (ULONG)__readgsword(0x184); -} - - -#define PTI_SHIFT 12L -#define PDI_SHIFT 21L -#define PPI_SHIFT 30L -#define PXI_SHIFT 39L -#define PTE_PER_PAGE 512 -#define PDE_PER_PAGE 512 -#define PPE_PER_PAGE 512 -#define PXE_PER_PAGE 512 -#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) -#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) -#define PPI_MASK (PPE_PER_PAGE - 1) -#define PXI_MASK (PXE_PER_PAGE - 1) - -#define PXE_BASE 0xFFFFF6FB7DBED000ULL -#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL -#define PPE_BASE 0xFFFFF6FB7DA00000ULL -#define PDE_BASE 0xFFFFF6FB40000000ULL -#define PTE_BASE 0xFFFFF68000000000ULL -#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL -#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL -#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL -#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL - -extern NTKERNELAPI PVOID MmHighestUserAddress; -extern NTKERNELAPI PVOID MmSystemRangeStart; -extern NTKERNELAPI ULONG64 MmUserProbeAddress; - -#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress -#define MM_SYSTEM_RANGE_START MmSystemRangeStart -#define MM_USER_PROBE_ADDRESS MmUserProbeAddress -#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL - - -#elif defined(_M_IA64) - -#elif defined(_M_PPC) - - -#elif defined(_M_MIPS) - -#elif defined(_M_ARM) -#else -#error Unknown Architecture -#endif - -/****************************************************************************** - * Executive Functions * - ******************************************************************************/ static __inline PVOID ExAllocateFromZone( IN PZONE_HEADER Zone) @@ -3303,37 +1674,8 @@ ExFreeToZone( #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite #define ExReleaseResourceForThread ExReleaseResourceForThreadLite -#ifdef _X86_ - -typedef enum _INTERLOCKED_RESULT { - ResultNegative = RESULT_NEGATIVE, - ResultZero = RESULT_ZERO, - ResultPositive = RESULT_POSITIVE -} INTERLOCKED_RESULT; - -NTKERNELAPI -INTERLOCKED_RESULT -FASTCALL -Exfi386InterlockedIncrementLong( - IN OUT LONG volatile *Addend); - -NTKERNELAPI -INTERLOCKED_RESULT -FASTCALL -Exfi386InterlockedDecrementLong( - IN PLONG Addend); - -NTKERNELAPI -ULONG -FASTCALL -Exfi386InterlockedExchangeUlong( - IN PULONG Target, - IN ULONG Value); -#endif - - - #if (NTDDI_VERSION >= NTDDI_WIN2K) + NTKERNELAPI NTSTATUS NTAPI @@ -3370,28 +1712,315 @@ NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI -ExRaiseAccessViolation(VOID); +ExRaiseAccessViolation( + VOID); NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI -ExRaiseDatatypeMisalignment(VOID); +ExRaiseDatatypeMisalignment( + VOID); +#endif -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +#ifdef _X86_ +NTKERNELAPI +INTERLOCKED_RESULT +FASTCALL +Exfi386InterlockedIncrementLong( + IN OUT LONG volatile *Addend); + +NTKERNELAPI +INTERLOCKED_RESULT +FASTCALL +Exfi386InterlockedDecrementLong( + IN PLONG Addend); + +NTKERNELAPI +ULONG +FASTCALL +Exfi386InterlockedExchangeUlong( + IN PULONG Target, + IN ULONG Value); + +#endif /* _X86_ */ + +#ifndef _ARC_DDK_ +#define _ARC_DDK_ +typedef enum _CONFIGURATION_TYPE { + ArcSystem, + CentralProcessor, + FloatingPointProcessor, + PrimaryIcache, + PrimaryDcache, + SecondaryIcache, + SecondaryDcache, + SecondaryCache, + EisaAdapter, + TcAdapter, + ScsiAdapter, + DtiAdapter, + MultiFunctionAdapter, + DiskController, + TapeController, + CdromController, + WormController, + SerialController, + NetworkController, + DisplayController, + ParallelController, + PointerController, + KeyboardController, + AudioController, + OtherController, + DiskPeripheral, + FloppyDiskPeripheral, + TapePeripheral, + ModemPeripheral, + MonitorPeripheral, + PrinterPeripheral, + PointerPeripheral, + KeyboardPeripheral, + TerminalPeripheral, + OtherPeripheral, + LinePeripheral, + NetworkPeripheral, + SystemMemory, + DockingInformation, + RealModeIrqRoutingTable, + RealModePCIEnumeration, + MaximumType +} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; +#endif /* !_ARC_DDK_ */ + +typedef struct _CONTROLLER_OBJECT { + CSHORT Type; + CSHORT Size; + PVOID ControllerExtension; + KDEVICE_QUEUE DeviceWaitQueue; + ULONG Spare1; + LARGE_INTEGER Spare2; +} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; + +typedef struct _CONFIGURATION_INFORMATION { + ULONG DiskCount; + ULONG FloppyCount; + ULONG CdRomCount; + ULONG TapeCount; + ULONG ScsiPortCount; + ULONG SerialCount; + ULONG ParallelCount; + BOOLEAN AtDiskPrimaryAddressClaimed; + BOOLEAN AtDiskSecondaryAddressClaimed; + ULONG Version; + ULONG MediumChangerCount; +} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; + +typedef +NTSTATUS +(NTAPI *PIO_QUERY_DEVICE_ROUTINE)( + IN PVOID Context, + IN PUNICODE_STRING PathName, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN PKEY_VALUE_FULL_INFORMATION *BusInformation, + IN CONFIGURATION_TYPE ControllerType, + IN ULONG ControllerNumber, + IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, + IN CONFIGURATION_TYPE PeripheralType, + IN ULONG PeripheralNumber, + IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); + +typedef +VOID +(NTAPI DRIVER_REINITIALIZE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN PVOID Context, + IN ULONG Count); + +typedef DRIVER_REINITIALIZE *PDRIVER_REINITIALIZE; + +/** Filesystem runtime library routines **/ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsTotalDeviceFailure( + IN NTSTATUS Status); +#endif + +/* Hardware Abstraction Layer Types */ + +typedef VOID +(NTAPI *PciPin2Line)( + IN struct _BUS_HANDLER *BusHandler, + IN struct _BUS_HANDLER *RootHandler, + IN PCI_SLOT_NUMBER SlotNumber, + IN PPCI_COMMON_CONFIG PciData); + +typedef VOID +(NTAPI *PciLine2Pin)( + IN struct _BUS_HANDLER *BusHandler, + IN struct _BUS_HANDLER *RootHandler, + IN PCI_SLOT_NUMBER SlotNumber, + IN PPCI_COMMON_CONFIG PciNewData, + IN PPCI_COMMON_CONFIG PciOldData); + +typedef VOID +(NTAPI *PciReadWriteConfig)( + IN struct _BUS_HANDLER *BusHandler, + IN PCI_SLOT_NUMBER Slot, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +#define PCI_DATA_TAG ' ICP' +#define PCI_DATA_VERSION 1 + +typedef struct _PCIBUSDATA { + ULONG Tag; + ULONG Version; + PciReadWriteConfig ReadConfig; + PciReadWriteConfig WriteConfig; + PciPin2Line Pin2Line; + PciLine2Pin Line2Pin; + PCI_SLOT_NUMBER ParentSlot; + PVOID Reserved[4]; +} PCIBUSDATA, *PPCIBUSDATA; /* Hardware Abstraction Layer Functions */ +#if !defined(NO_LEGACY_DRIVERS) + #if (NTDDI_VERSION >= NTDDI_WIN2K) -#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) +NTHALAPI +NTSTATUS +NTAPI +HalAssignSlotResources( + IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN OUT PCM_RESOURCE_LIST *AllocatedResources); -/* Nothing here */ +NTHALAPI +ULONG +NTAPI +HalGetInterruptVector( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN ULONG BusInterruptLevel, + IN ULONG BusInterruptVector, + OUT PKIRQL Irql, + OUT PKAFFINITY Affinity); -#else /* USE_DMA_MACROS ... */ +NTHALAPI +ULONG +NTAPI +HalSetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length); +#endif + +#endif /* !defined(NO_LEGACY_DRIVERS) */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTHALAPI +PADAPTER_OBJECT +NTAPI +HalGetAdapter( + IN PDEVICE_DESCRIPTION DeviceDescription, + IN OUT PULONG NumberOfMapRegisters); + +NTHALAPI +BOOLEAN +NTAPI +HalMakeBeep( + IN ULONG Frequency); + +VOID +NTAPI +HalPutDmaAdapter( + IN PADAPTER_OBJECT DmaAdapter); + +NTHALAPI +VOID +NTAPI +HalAcquireDisplayOwnership( + IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); + +NTHALAPI +ULONG +NTAPI +HalGetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Length); + +NTHALAPI +ULONG +NTAPI +HalGetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTHALAPI +ULONG +NTAPI +HalSetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTHALAPI +BOOLEAN +NTAPI +HalTranslateBusAddress( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +VOID +FASTCALL +HalExamineMBR( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID *Buffer); +#endif + +#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) +// nothing here +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) //DECLSPEC_DEPRECATED_DDK NTHALAPI VOID @@ -3457,207 +2086,12 @@ HalAllocateAdapterChannel( IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine); -#endif /* USE_DMA_MACROS ... */ - -#if !defined(NO_LEGACY_DRIVERS) -NTHALAPI -NTSTATUS -NTAPI -HalAssignSlotResources( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); - -NTHALAPI -ULONG -NTAPI -HalGetInterruptVector( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN ULONG BusInterruptLevel, - IN ULONG BusInterruptVector, - OUT PKIRQL Irql, - OUT PKAFFINITY Affinity); - -NTHALAPI -ULONG -NTAPI -HalSetBusData( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalGetBusData( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Length); - -NTHALAPI -BOOLEAN -NTAPI -HalMakeBeep( - IN ULONG Frequency); -#endif /* !defined(NO_LEGACY_DRIVERS) */ - -NTHALAPI -PADAPTER_OBJECT -NTAPI -HalGetAdapter( - IN PDEVICE_DESCRIPTION DeviceDescription, - OUT PULONG NumberOfMapRegisters); - -VOID -NTAPI -HalPutDmaAdapter( - IN PADAPTER_OBJECT DmaAdapter); - -NTHALAPI -VOID -NTAPI -HalAcquireDisplayOwnership( - IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); - -NTHALAPI -ULONG -NTAPI -HalGetBusDataByOffset( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalSetBusDataByOffset( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -NTHALAPI -BOOLEAN -NTAPI -HalTranslateBusAddress( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); - -NTHALAPI -PVOID -NTAPI -HalAllocateCrashDumpRegisters( - IN PADAPTER_OBJECT AdapterObject, - IN OUT PULONG NumberOfMapRegisters); - -NTSTATUS -NTAPI -HalGetScatterGatherList( - IN PADAPTER_OBJECT DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN PMDL Mdl, - IN PVOID CurrentVa, - IN ULONG Length, - IN PDRIVER_LIST_CONTROL ExecutionRoutine, - IN PVOID Context, - IN BOOLEAN WriteToDevice); - -VOID -NTAPI -HalPutScatterGatherList( - IN PADAPTER_OBJECT DmaAdapter, - IN PSCATTER_GATHER_LIST ScatterGather, - IN BOOLEAN WriteToDevice); - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -VOID -FASTCALL -HalExamineMBR( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ +#endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */ -#if (NTDDI_VERSION >= NTDDI_WIN7) +/* I/O Manager Functions */ -NTSTATUS -NTAPI -HalAllocateHardwareCounters( - IN PGROUP_AFFINITY GroupAffinty, - IN ULONG GroupCount, - IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList, - OUT PHANDLE CounterSetHandle); - -NTSTATUS -NTAPI -HalFreeHardwareCounters( - IN HANDLE CounterSetHandle); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#if defined(_IA64_) -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTHALAPI -ULONG -NTAPI -HalGetDmaAlignmentRequirement(VOID); -#endif -#endif /* defined(_IA64_) */ - -#if defined(_M_IX86) || defined(_M_AMD64) -#define HalGetDmaAlignmentRequirement() 1L -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -typedef struct _WHEA_ERROR_SOURCE_DESCRIPTOR *PWHEA_ERROR_SOURCE_DESCRIPTOR; -typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD; - -NTHALAPI -VOID -NTAPI -HalBugCheckSystem( - IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource, - IN PWHEA_ERROR_RECORD ErrorRecord); - -#else - -typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD; - -NTHALAPI -VOID -NTAPI -HalBugCheckSystem( - IN PWHEA_ERROR_RECORD ErrorRecord); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - -/****************************************************************************** - * I/O Manager Functions * - ******************************************************************************/ /* * VOID IoAssignArcName( * IN PUNICODE_STRING ArcName, @@ -3673,19 +2107,8 @@ HalBugCheckSystem( */ #define IoDeassignArcName IoDeleteSymbolicLink -VOID -FORCEINLINE -NTAPI -IoInitializeDriverCreateContext( - PIO_DRIVER_CREATE_CONTEXT DriverContext) -{ - RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT)); - DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT); -} - - - #if (NTDDI_VERSION >= NTDDI_WIN2K) + #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)) NTKERNELAPI NTSTATUS @@ -3698,7 +2121,6 @@ IoAllocateAdapterChannel( IN PVOID Context); #endif -#if !defined(DMA_MACROS_DEFINED) //DECLSPEC_DEPRECATED_DDK NTHALAPI PHYSICAL_ADDRESS @@ -3710,7 +2132,6 @@ IoMapTransfer( IN PVOID CurrentVa, IN OUT PULONG Length, IN BOOLEAN WriteToDevice); -#endif NTKERNELAPI VOID @@ -3742,7 +2163,8 @@ IoFreeController( NTKERNELAPI PCONFIGURATION_INFORMATION NTAPI -IoGetConfigurationInformation(VOID); +IoGetConfigurationInformation( + VOID); NTKERNELAPI PDEVICE_OBJECT @@ -3760,7 +2182,8 @@ IoCancelFileOpen( NTKERNELAPI PGENERIC_MAPPING NTAPI -IoGetFileObjectGenericMapping(VOID); +IoGetFileObjectGenericMapping( + VOID); NTKERNELAPI PIRP @@ -3832,7 +2255,7 @@ IoReportDetectedDevice( IN PCM_RESOURCE_LIST ResourceList OPTIONAL, IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL, IN BOOLEAN ResourceAssigned, - IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL); + IN OUT PDEVICE_OBJECT *DeviceObject); NTKERNELAPI NTSTATUS @@ -3878,59 +2301,9 @@ IoAssignResources( IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL, IN OUT PCM_RESOURCE_LIST *AllocatedResources); -NTKERNELAPI -BOOLEAN -NTAPI -IoSetThreadHardErrorMode( - IN BOOLEAN EnableHardErrors); - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#if (NTDDI_VERSION >= NTDDI_WIN2KSP3) - -NTKERNELAPI -BOOLEAN -NTAPI -IoIsFileOriginRemote( - IN PFILE_OBJECT FileObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetFileOrigin( - IN PFILE_OBJECT FileObject, - IN BOOLEAN Remote); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */ - #if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -NTSTATUS -FASTCALL -IoReadPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); - -NTKERNELAPI -NTSTATUS -FASTCALL -IoSetPartitionInformation( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); - -NTKERNELAPI -NTSTATUS -FASTCALL -IoWritePartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); NTKERNELAPI NTSTATUS @@ -3947,12 +2320,30 @@ IoReadDiskSignature( IN ULONG BytesPerSector, OUT PDISK_SIGNATURE Signature); +NTKERNELAPI +NTSTATUS +FASTCALL +IoReadPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + NTKERNELAPI NTSTATUS NTAPI IoReadPartitionTableEx( IN PDEVICE_OBJECT DeviceObject, - OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); + IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); + +NTKERNELAPI +NTSTATUS +FASTCALL +IoSetPartitionInformation( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType); NTKERNELAPI NTSTATUS @@ -3968,6 +2359,12 @@ NTAPI IoSetSystemPartition( IN PUNICODE_STRING VolumeNameString); +NTKERNELAPI +BOOLEAN +NTAPI +IoSetThreadHardErrorMode( + IN BOOLEAN EnableHardErrors); + NTKERNELAPI NTSTATUS NTAPI @@ -3984,30 +2381,20 @@ IoVolumeDeviceToDosName( NTKERNELAPI NTSTATUS -NTAPI -IoWritePartitionTableEx( +FASTCALL +IoWritePartitionTable( IN PDEVICE_OBJECT DeviceObject, - IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); NTKERNELAPI NTSTATUS NTAPI -IoCreateFileSpecifyDeviceObjectHint( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG Disposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength, - IN CREATE_FILE_TYPE CreateFileType, - IN PVOID InternalParameters OPTIONAL, - IN ULONG Options, - IN PVOID DeviceObject OPTIONAL); +IoWritePartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); NTKERNELAPI NTSTATUS @@ -4019,100 +2406,8 @@ IoAttachDeviceToDeviceStackSafe( #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ +/** Kernel debugger routines **/ -#if (NTDDI_VERSION >= NTDDI_WS03) -NTKERNELAPI -IO_PAGING_PRIORITY -FASTCALL -IoGetPagingIoPriority( - IN PIRP Irp); - -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ - -#if (NTDDI_VERSION >= NTDDI_WS03SP1) -BOOLEAN -NTAPI -IoTranslateBusAddress( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); -#endif - -#if (NTDDI_VERSION >= NTDDI_VISTA) -NTKERNELAPI -NTSTATUS -NTAPI -IoUpdateDiskGeometry( - IN PDEVICE_OBJECT DeviceObject, - IN struct _DISK_GEOMETRY_EX* OldDiskGeometry, - IN struct _DISK_GEOMETRY_EX* NewDiskGeometry); - -PTXN_PARAMETER_BLOCK -NTAPI -IoGetTransactionParameterBlock( - IN PFILE_OBJECT FileObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCreateFileEx( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG Disposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength, - IN CREATE_FILE_TYPE CreateFileType, - IN PVOID InternalParameters OPTIONAL, - IN ULONG Options, - IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL); - -NTSTATUS -NTAPI -IoSetIrpExtraCreateParameter( - IN OUT PIRP Irp, - IN struct _ECP_LIST *ExtraCreateParameter); - -VOID -NTAPI -IoClearIrpExtraCreateParameter( - IN OUT PIRP Irp); - -NTSTATUS -NTAPI -IoGetIrpExtraCreateParameter( - IN PIRP Irp, - OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL); - -BOOLEAN -NTAPI -IoIsFileObjectIgnoringSharing( - IN PFILE_OBJECT FileObject); - - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTSTATUS -NTAPI -IoSetFileObjectIgnoreSharing( - IN PFILE_OBJECT FileObject); - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - -/****************************************************************************** - * Kernel Debugger Functions * - ******************************************************************************/ NTSYSAPI ULONG NTAPI @@ -4121,25 +2416,16 @@ DbgPrompt( OUT PCH Response, IN ULONG MaximumResponseLength); -/****************************************************************************** - * Kernel Functions * - ******************************************************************************/ -NTKERNELAPI -VOID -FASTCALL -KeInvalidateRangeAllCaches( - IN PVOID BaseAddress, - IN ULONG Length); - +/* Kernel Functions */ #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI +DECLSPEC_NORETURN VOID NTAPI -KeSetImportanceDpc( - IN OUT PRKDPC Dpc, - IN KDPC_IMPORTANCE Importance); +KeBugCheck( + IN ULONG BugCheckCode); NTKERNELAPI LONG @@ -4156,204 +2442,24 @@ KeSetBasePriorityThread( IN OUT PRKTHREAD Thread, IN LONG Increment); -NTKERNELAPI -VOID -NTAPI -KeEnterCriticalRegion(VOID); +#endif -NTKERNELAPI -VOID -NTAPI -KeLeaveCriticalRegion(VOID); +/* Memory Manager Types */ -NTKERNELAPI -DECLSPEC_NORETURN -VOID -NTAPI -KeBugCheck( - IN ULONG BugCheckCode); +typedef struct _PHYSICAL_MEMORY_RANGE { + PHYSICAL_ADDRESS BaseAddress; + LARGE_INTEGER NumberOfBytes; +} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; - -#if defined(SINGLE_GROUP_LEGACY_API) - - -NTKERNELAPI -VOID -NTAPI -KeSetTargetProcessorDpc( - IN OUT PRKDPC Dpc, - IN CCHAR Number); - -NTKERNELAPI -KAFFINITY -NTAPI -KeQueryActiveProcessors(VOID); - -#endif /* defined(SINGLE_GROUP_LEGACY_API) */ - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -BOOLEAN -NTAPI -KeAreApcsDisabled(VOID); - - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - - -#if (NTDDI_VERSION >= NTDDI_WS03) - - -NTKERNELAPI -BOOLEAN -NTAPI -KeInvalidateAllCaches(VOID); - -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ - -#if (NTDDI_VERSION >= NTDDI_WS03SP1) - -NTKERNELAPI -NTSTATUS -NTAPI -KeExpandKernelStackAndCallout( - IN PEXPAND_STACK_CALLOUT Callout, - IN PVOID Parameter OPTIONAL, - IN SIZE_T Size); - -NTKERNELAPI -VOID -NTAPI -KeEnterGuardedRegion(VOID); - -NTKERNELAPI -VOID -NTAPI -KeLeaveGuardedRegion(VOID); - - -#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - - -#if defined(SINGLE_GROUP_LEGACY_API) -NTKERNELAPI -ULONG -NTAPI -KeQueryActiveProcessorCount( - OUT PKAFFINITY ActiveProcessors OPTIONAL); - -NTKERNELAPI -ULONG -NTAPI -KeQueryMaximumProcessorCount(VOID); - -#endif /* SINGLE_GROUP_LEGACY_API */ - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -ULONG -NTAPI -KeQueryActiveProcessorCountEx( - IN USHORT GroupNumber); - -NTKERNELAPI -ULONG -NTAPI -KeQueryMaximumProcessorCountEx( - IN USHORT GroupNumber); - -NTKERNELAPI -USHORT -NTAPI -KeQueryActiveGroupCount(VOID); - -NTKERNELAPI -USHORT -NTAPI -KeQueryMaximumGroupCount(VOID); - -NTKERNELAPI -KAFFINITY -NTAPI -KeQueryGroupAffinity( - IN USHORT GroupNumber); - -NTKERNELAPI -ULONG -NTAPI -KeGetCurrentProcessorNumberEx( - OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -KeQueryNodeActiveAffinity( - IN USHORT NodeNumber, - OUT PGROUP_AFFINITY Affinity OPTIONAL, - OUT PUSHORT Count OPTIONAL); - -NTKERNELAPI -USHORT -NTAPI -KeQueryNodeMaximumProcessorCount( - IN USHORT NodeNumber); - -NTKERNELAPI -USHORT -NTAPI -KeQueryHighestNodeNumber(VOID); - -NTKERNELAPI -USHORT -NTAPI -KeGetCurrentNodeNumber(VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -KeQueryLogicalProcessorRelationship( - IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL, - IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, - OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL, - IN OUT PULONG Length); - -NTKERNELAPI -NTSTATUS -NTAPI -KeSetHardwareCounterConfiguration( - IN PHARDWARE_COUNTER CounterArray, - IN ULONG Count); - -NTKERNELAPI -NTSTATUS -NTAPI -KeQueryHardwareCounterConfiguration( - OUT PHARDWARE_COUNTER CounterArray, - IN ULONG MaximumCount, - OUT PULONG Count); - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - -/****************************************************************************** - * Memory manager Functions * - ******************************************************************************/ +/* Memory Manager Functions */ #if (NTDDI_VERSION >= NTDDI_WIN2K) + NTKERNELAPI PPHYSICAL_MEMORY_RANGE NTAPI -MmGetPhysicalMemoryRanges(VOID); +MmGetPhysicalMemoryRanges( + VOID); NTKERNELAPI PHYSICAL_ADDRESS @@ -4427,7 +2533,8 @@ MmIsAddressValid( NTKERNELAPI BOOLEAN NTAPI -MmIsThisAnNtAsSystem(VOID); +MmIsThisAnNtAsSystem( + VOID); NTKERNELAPI VOID @@ -4475,144 +2582,9 @@ MmUnmapVideoDisplay( IN PVOID BaseAddress, IN SIZE_T NumberOfBytes); -NTKERNELAPI -NTSTATUS -NTAPI -MmAddPhysicalMemory( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemory( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemorySpecifyCache( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemorySpecifyCacheNode( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType, - IN NODE_REQUIREMENT PreferredNode); - -NTKERNELAPI -VOID -NTAPI -MmFreeContiguousMemory( - IN PVOID BaseAddress); - -NTKERNELAPI -VOID -NTAPI -MmFreeContiguousMemorySpecifyCache( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); - - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTKERNELAPI -NTSTATUS -NTAPI -MmAdvanceMdl( - IN OUT PMDL Mdl, - IN ULONG NumberOfBytes); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateMappingAddress( - IN SIZE_T NumberOfBytes, - IN ULONG PoolTag); - -NTKERNELAPI -VOID -NTAPI -MmFreeMappingAddress( - IN PVOID BaseAddress, - IN ULONG PoolTag); - -NTKERNELAPI -NTSTATUS -NTAPI -MmIsVerifierEnabled( - OUT PULONG VerifierFlags); - -NTKERNELAPI -PVOID -NTAPI -MmMapLockedPagesWithReservedMapping( - IN PVOID MappingAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList, - IN MEMORY_CACHING_TYPE CacheType); - -NTKERNELAPI -NTSTATUS -NTAPI -MmProtectMdlSystemAddress( - IN PMDL MemoryDescriptorList, - IN ULONG NewProtect); - -NTKERNELAPI -VOID -NTAPI -MmUnmapReservedMapping( - IN PVOID BaseAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList); - -NTKERNELAPI -NTSTATUS -NTAPI -MmAddVerifierThunks( - IN PVOID ThunkBuffer, - IN ULONG ThunkBufferSize); - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_WS03) -NTKERNELAPI -NTSTATUS -NTAPI -MmCreateMirror(VOID); -#endif - - -#if (NTDDI_VERSION >= NTDDI_VISTA) -NTSTATUS -NTAPI -MmRotatePhysicalView( - IN PVOID VirtualAddress, - IN OUT PSIZE_T NumberOfBytes, - IN PMDLX NewMdl OPTIONAL, - IN MM_ROTATE_DIRECTION Direction, - IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction, - IN PVOID Context OPTIONAL); - -#endif - -/****************************************************************************** - * Process Manager Functions * - ******************************************************************************/ +/* NtXxx Functions */ NTSYSCALLAPI NTSTATUS @@ -4633,15 +2605,35 @@ NtQueryInformationProcess( IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL); -#if (NTDDI_VERSION >= NTDDI_WIN2K) +/** Process manager types **/ +typedef VOID +(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( + IN HANDLE ParentId, + IN HANDLE ProcessId, + IN BOOLEAN Create); + +typedef VOID +(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( + IN HANDLE ProcessId, + IN HANDLE ThreadId, + IN BOOLEAN Create); + +typedef VOID +(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( + IN PUNICODE_STRING FullImageName, + IN HANDLE ProcessId, + IN PIMAGE_INFO ImageInfo); + +/** Process manager routines **/ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI NTSTATUS NTAPI -PsSetCreateProcessNotifyRoutine( - IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, - IN BOOLEAN Remove); +PsSetLoadImageNotifyRoutine( + IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTKERNELAPI NTSTATUS @@ -4652,18 +2644,21 @@ PsSetCreateThreadNotifyRoutine( NTKERNELAPI NTSTATUS NTAPI -PsSetLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); +PsSetCreateProcessNotifyRoutine( + IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, + IN BOOLEAN Remove); NTKERNELAPI HANDLE NTAPI -PsGetCurrentProcessId(VOID); +PsGetCurrentProcessId( + VOID); NTKERNELAPI HANDLE NTAPI -PsGetCurrentThreadId(VOID); +PsGetCurrentThreadId( + VOID); NTKERNELAPI BOOLEAN @@ -4684,12 +2679,6 @@ NTAPI PsGetProcessId( IN PEPROCESS Process); -NTKERNELAPI -HANDLE -NTAPI -PsGetThreadId( - IN PETHREAD Thread); - NTKERNELAPI NTSTATUS NTAPI @@ -4702,187 +2691,102 @@ NTAPI PsRemoveLoadImageNotifyRoutine( IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); -NTKERNELAPI -LONGLONG -NTAPI -PsGetProcessCreateTimeQuadPart( - IN PEPROCESS Process); - #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ -#if (NTDDI_VERSION >= NTDDI_WS03) -NTKERNELAPI -HANDLE -NTAPI -PsGetThreadProcessId( - IN PETHREAD Thread); -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ +extern NTKERNELAPI PEPROCESS PsInitialSystemProcess; -#if (NTDDI_VERSION >= NTDDI_VISTA) +/* RTL Types */ -NTKERNELAPI -BOOLEAN -NTAPI -PsSetCurrentThreadPrefetching( - IN BOOLEAN Prefetching); +typedef struct _RTL_SPLAY_LINKS { + struct _RTL_SPLAY_LINKS *Parent; + struct _RTL_SPLAY_LINKS *LeftChild; + struct _RTL_SPLAY_LINKS *RightChild; +} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; -NTKERNELAPI -BOOLEAN -NTAPI -PsIsCurrentThreadPrefetching(VOID); +/* RTL Functions */ -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ +#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_) -#if (NTDDI_VERSION >= NTDDI_VISTASP1) -NTKERNELAPI -NTSTATUS -NTAPI -PsSetCreateProcessNotifyRoutineEx( - IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine, - IN BOOLEAN Remove); -#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */ -/****************************************************************************** - * Runtime Library Functions * - ******************************************************************************/ +#define RtlGetCallersAddress(CallersAddress, CallersCaller) \ + *CallersAddress = (PVOID)_ReturnAddress(); \ + *CallersCaller = NULL; +#else #if (NTDDI_VERSION >= NTDDI_WIN2K) - - - -#ifndef RTL_USE_AVL_TABLES - NTSYSAPI VOID NTAPI -RtlInitializeGenericTable( - OUT PRTL_GENERIC_TABLE Table, - IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine, - IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine, - IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine, - IN PVOID TableContext OPTIONAL); +RtlGetCallersAddress( + OUT PVOID *CallersAddress, + OUT PVOID *CallersCaller); +#endif +#endif + +#if !defined(MIDL_PASS) + +FORCEINLINE +LUID +NTAPI_INLINE +RtlConvertLongToLuid( + IN LONG Val) +{ + LUID Luid; + LARGE_INTEGER Temp; + + Temp.QuadPart = Val; + Luid.LowPart = Temp.u.LowPart; + Luid.HighPart = Temp.u.HighPart; + return Luid; +} + +FORCEINLINE +LUID +NTAPI_INLINE +RtlConvertUlongToLuid( + IN ULONG Val) +{ + LUID Luid; + + Luid.LowPart = Val; + Luid.HighPart = 0; + return Luid; +} + +#endif + +#if defined(_AMD64_) || defined(_IA64_) +//DECLSPEC_DEPRECATED_DDK_WINXP +__inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + OUT PLARGE_INTEGER Remainder OPTIONAL) +{ + LARGE_INTEGER ret; + ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; + if (Remainder) + Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; + return ret; +} + +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI -PVOID +LARGE_INTEGER NTAPI -RtlInsertElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL); +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + OUT PLARGE_INTEGER Remainder OPTIONAL); +#endif -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableFull( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL, - IN PVOID NodeOrParent, - IN TABLE_SEARCH_RESULT SearchResult); +#endif /* defined(_AMD64_) || defined(_IA64_) */ -NTSYSAPI -BOOLEAN -NTAPI -RtlDeleteElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableFull( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer, - OUT PVOID *NodeOrParent, - OUT TABLE_SEARCH_RESULT *SearchResult); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN BOOLEAN Restart); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableWithoutSplaying( - IN PRTL_GENERIC_TABLE Table, - IN OUT PVOID *RestartKey); - -NTSYSAPI -PVOID -NTAPI -RtlGetElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN ULONG I); - -NTSYSAPI -ULONG -NTAPI -RtlNumberGenericTableElements( - IN PRTL_GENERIC_TABLE Table); - -NTSYSAPI -BOOLEAN -NTAPI -RtlIsGenericTableEmpty( - IN PRTL_GENERIC_TABLE Table); - -#endif /* !RTL_USE_AVL_TABLES */ - -#define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8 - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSplay( - IN OUT PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlDelete( - IN PRTL_SPLAY_LINKS Links); - -NTSYSAPI -VOID -NTAPI -RtlDeleteNoSplay( - IN PRTL_SPLAY_LINKS Links, - IN OUT PRTL_SPLAY_LINKS *Root); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreeSuccessor( - IN PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreePredecessor( - IN PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealSuccessor( - IN PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealPredecessor( - IN PRTL_SPLAY_LINKS Links); +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI BOOLEAN @@ -4941,7 +2845,7 @@ NTAPI RtlCompareString( IN const PSTRING String1, IN const PSTRING String2, - IN BOOLEAN CaseInSensitive); + BOOLEAN CaseInSensitive); NTSYSAPI VOID @@ -4980,513 +2884,9 @@ RtlWalkFrameChain( IN ULONG Count, IN ULONG Flags); - - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#if (NTDDI_VERSION >= NTDDI_WINXP) - - -NTSYSAPI -VOID -NTAPI -RtlInitializeGenericTableAvl( - OUT PRTL_AVL_TABLE Table, - IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine, - IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, - IN PRTL_AVL_FREE_ROUTINE FreeRoutine, - IN PVOID TableContext OPTIONAL); - -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL); - -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableFullAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL, - IN PVOID NodeOrParent, - IN TABLE_SEARCH_RESULT SearchResult); - -NTSYSAPI -BOOLEAN -NTAPI -RtlDeleteElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableFullAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - OUT PVOID *NodeOrParent, - OUT TABLE_SEARCH_RESULT *SearchResult); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN BOOLEAN Restart); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableWithoutSplayingAvl( - IN PRTL_AVL_TABLE Table, - IN OUT PVOID *RestartKey); - -NTSYSAPI -PVOID -NTAPI -RtlLookupFirstMatchingElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - OUT PVOID *RestartKey); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableLikeADirectory( - IN PRTL_AVL_TABLE Table, - IN PRTL_AVL_MATCH_FUNCTION MatchFunction OPTIONAL, - IN PVOID MatchData OPTIONAL, - IN ULONG NextFlag, - IN OUT PVOID *RestartKey, - IN OUT PULONG DeleteCount, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlGetElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN ULONG I); - -NTSYSAPI -ULONG -NTAPI -RtlNumberGenericTableElementsAvl( - IN PRTL_AVL_TABLE Table); - -NTSYSAPI -BOOLEAN -NTAPI -RtlIsGenericTableEmptyAvl( - IN PRTL_AVL_TABLE Table); - - - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - - -NTSYSAPI -VOID -NTAPI -RtlRunOnceInitialize( - OUT PRTL_RUN_ONCE RunOnce); - -NTSYSAPI -NTSTATUS -NTAPI -RtlRunOnceExecuteOnce( - IN OUT PRTL_RUN_ONCE RunOnce, - IN PRTL_RUN_ONCE_INIT_FN InitFn, - IN OUT PVOID Parameter OPTIONAL, - OUT PVOID *Context OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -RtlRunOnceBeginInitialize( - IN OUT PRTL_RUN_ONCE RunOnce, - IN ULONG Flags, - OUT PVOID *Context OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -RtlRunOnceComplete( - IN OUT PRTL_RUN_ONCE RunOnce, - IN ULONG Flags, - IN PVOID Context OPTIONAL); - -NTSYSAPI -BOOLEAN -NTAPI -RtlGetProductInfo( - IN ULONG OSMajorVersion, - IN ULONG OSMinorVersion, - IN ULONG SpMajorVersion, - IN ULONG SpMinorVersion, - OUT PULONG ReturnedProductType); - - - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) - - -NTSYSAPI -BOOLEAN -NTAPI -RtlCreateHashTable( - IN OUT PRTL_DYNAMIC_HASH_TABLE *HashTable OPTIONAL, - IN ULONG Shift, - IN ULONG Flags); - -NTSYSAPI -VOID -NTAPI -RtlDeleteHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); - -NTSYSAPI -BOOLEAN -NTAPI -RtlInsertEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, - IN ULONG_PTR Signature, - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); - -NTSYSAPI -BOOLEAN -NTAPI -RtlRemoveEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); - -NTSYSAPI -PRTL_DYNAMIC_HASH_TABLE_ENTRY -NTAPI -RtlLookupEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN ULONG_PTR Signature, - OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); - -NTSYSAPI -PRTL_DYNAMIC_HASH_TABLE_ENTRY -NTAPI -RtlGetNextEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); - -NTSYSAPI -BOOLEAN -NTAPI -RtlInitEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -PRTL_DYNAMIC_HASH_TABLE_ENTRY -NTAPI -RtlEnumerateEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -VOID -NTAPI -RtlEndEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -BOOLEAN -NTAPI -RtlInitWeakEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -PRTL_DYNAMIC_HASH_TABLE_ENTRY -NTAPI -RtlWeaklyEnumerateEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -VOID -NTAPI -RtlEndWeakEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -BOOLEAN -NTAPI -RtlExpandHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); - -NTSYSAPI -BOOLEAN -NTAPI -RtlContractHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); - - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - -#if defined(_AMD64_) || defined(_IA64_) - - - -//DECLSPEC_DEPRECATED_DDK_WINXP -FORCEINLINE -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL) -{ - LARGE_INTEGER ret; - ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; - if (Remainder) - Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; - return ret; -} - -#else - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -LARGE_INTEGER -NTAPI -RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL); -#endif - - -#endif /* defined(_AMD64_) || defined(_IA64_) */ - - - -#ifdef RTL_USE_AVL_TABLES - -#define RtlInitializeGenericTable RtlInitializeGenericTableAvl -#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl -#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl -#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl -#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl -#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl -#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl -#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl -#define RtlGetElementGenericTable RtlGetElementGenericTableAvl -#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl -#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl - -#endif /* RTL_USE_AVL_TABLES */ - -#define RtlInitializeSplayLinks(Links) { \ - PRTL_SPLAY_LINKS _SplayLinks; \ - _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ - _SplayLinks->Parent = _SplayLinks; \ - _SplayLinks->LeftChild = NULL; \ - _SplayLinks->RightChild = NULL; \ -} - -#define RtlIsLeftChild(Links) \ - (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlIsRightChild(Links) \ - (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlRightChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->RightChild - -#define RtlIsRoot(Links) \ - (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlLeftChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->LeftChild - -#define RtlParent(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->Parent - -#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->LeftChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->RightChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -#if !defined(MIDL_PASS) - -FORCEINLINE -LUID -NTAPI_INLINE -RtlConvertLongToLuid( - IN LONG Val) -{ - LUID Luid; - LARGE_INTEGER Temp; - - Temp.QuadPart = Val; - Luid.LowPart = Temp.u.LowPart; - Luid.HighPart = Temp.u.HighPart; - return Luid; -} - -FORCEINLINE -LUID -NTAPI_INLINE -RtlConvertUlongToLuid( - IN ULONG Val) -{ - LUID Luid; - - Luid.LowPart = Val; - Luid.HighPart = 0; - return Luid; -} - -#endif /* !defined(MIDL_PASS) */ - -#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_) -#define RtlGetCallersAddress(CallersAddress, CallersCaller) \ - *CallersAddress = (PVOID)_ReturnAddress(); \ - *CallersCaller = NULL; -#else -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -VOID -NTAPI -RtlGetCallersAddress( - OUT PVOID *CallersAddress, - OUT PVOID *CallersCaller); -#endif -#endif - -#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -FORCEINLINE -VOID -NTAPI -RtlInitHashTableContext( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) -{ - Context->ChainHead = NULL; - Context->PrevLinkage = NULL; -} - -FORCEINLINE -VOID -NTAPI -RtlInitHashTableContextFromEnumerator( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context, - IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator) -{ - Context->ChainHead = Enumerator->ChainHead; - Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink; -} - -FORCEINLINE -VOID -NTAPI -RtlReleaseHashTableContext( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) -{ - UNREFERENCED_PARAMETER(Context); - return; -} - -FORCEINLINE -ULONG -NTAPI -RtlTotalBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->TableSize; -} - -FORCEINLINE -ULONG -NTAPI -RtlNonEmptyBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->NonEmptyBuckets; -} - -FORCEINLINE -ULONG -NTAPI -RtlEmptyBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->TableSize - HashTable->NonEmptyBuckets; -} - -FORCEINLINE -ULONG -NTAPI -RtlTotalEntriesHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->NumEntries; -} - -FORCEINLINE -ULONG -NTAPI -RtlActiveEnumeratorsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->NumEnumerators; -} - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ - -/****************************************************************************** - * Security Manager Functions * - ******************************************************************************/ +/* Security reference monitor routines */ #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -5495,42 +2895,12 @@ NTAPI SeSinglePrivilegeCheck( IN LUID PrivilegeValue, IN KPROCESSOR_MODE PreviousMode); +#endif - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -/****************************************************************************** - * ZwXxx Functions * - ******************************************************************************/ - - - -NTSYSAPI -NTSTATUS -NTAPI -ZwAllocateLocallyUniqueId( - OUT PLUID Luid); - -NTSYSAPI -NTSTATUS -NTAPI -ZwTerminateProcess( - IN HANDLE ProcessHandle OPTIONAL, - IN NTSTATUS ExitStatus); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenProcess( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL); - +/* ZwXxx Functions */ #if (NTDDI_VERSION >= NTDDI_WIN2K) - NTSTATUS NTAPI ZwCancelTimer( @@ -5572,190 +2942,12 @@ ZwSetTimer( IN LONG Period OPTIONAL, OUT PBOOLEAN PreviousState OPTIONAL); -NTSYSAPI -NTSTATUS -NTAPI -ZwDisplayString( - IN PUNICODE_STRING String); - -NTSYSAPI -NTSTATUS -NTAPI -ZwPowerInformation( - IN POWER_INFORMATION_LEVEL PowerInformationLevel, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeviceIoControlFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); - - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTSTATUS -NTAPI -ZwSetTimerEx( - IN HANDLE TimerHandle, - IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass, - IN OUT PVOID TimerSetInformation, - IN ULONG TimerSetInformationLength); - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - - -/* UNSORTED */ - -#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ - ((ConditionMask) = VerSetConditionMask((ConditionMask), \ - (TypeBitMask), (ComparisonType))) - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -ULONGLONG -NTAPI -VerSetConditionMask( - IN ULONGLONG ConditionMask, - IN ULONG TypeMask, - IN UCHAR Condition); #endif -typedef struct _KERNEL_USER_TIMES { - LARGE_INTEGER CreateTime; - LARGE_INTEGER ExitTime; - LARGE_INTEGER KernelTime; - LARGE_INTEGER UserTime; -} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; - -/* NtXxx Functions */ - -typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION { - SystemFirmwareTable_Enumerate, - SystemFirmwareTable_Get -} SYSTEM_FIRMWARE_TABLE_ACTION; - -typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION { - ULONG ProviderSignature; - SYSTEM_FIRMWARE_TABLE_ACTION Action; - ULONG TableID; - ULONG TableBufferLength; - UCHAR TableBuffer[ANYSIZE_ARRAY]; -} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION; - -typedef NTSTATUS -(__cdecl *PFNFTH)( - IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo); - -typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER { - ULONG ProviderSignature; - BOOLEAN Register; - PFNFTH FirmwareTableHandler; - PVOID DriverObject; -} SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER; - -typedef ULONG_PTR -(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( - IN PVOID Context); - -typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { - PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; - PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; -} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; - -#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 -#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 -#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 -#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 -#define DRIVER_VERIFIER_IO_CHECKING 0x0010 - -#define SHARED_GLOBAL_FLAGS_ERROR_PORT_V 0x0 -#define SHARED_GLOBAL_FLAGS_ERROR_PORT (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V) - -#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V 0x1 -#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V) - -#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V 0x2 -#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V) - -#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V 0x3 -#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED \ - (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V) - -#define SHARED_GLOBAL_FLAGS_SPARE_V 0x4 -#define SHARED_GLOBAL_FLAGS_SPARE \ - (1UL << SHARED_GLOBAL_FLAGS_SPARE_V) - -#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V 0x5 -#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED \ - (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V) - -#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V 0x6 -#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED \ - (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V) - -#define EX_INIT_BITS(Flags, Bit) \ - *((Flags)) |= (Bit) // Safe to use before concurrently accessible - -#define EX_TEST_SET_BIT(Flags, Bit) \ - InterlockedBitTestAndSet ((PLONG)(Flags), (Bit)) - -#define EX_TEST_CLEAR_BIT(Flags, Bit) \ - InterlockedBitTestAndReset ((PLONG)(Flags), (Bit)) - -#define PCCARD_MAP_ERROR 0x01 -#define PCCARD_DEVICE_PCI 0x10 - -#define PCCARD_SCAN_DISABLED 0x01 -#define PCCARD_MAP_ZERO 0x02 -#define PCCARD_NO_TIMER 0x03 -#define PCCARD_NO_PIC 0x04 -#define PCCARD_NO_LEGACY_BASE 0x05 -#define PCCARD_DUP_LEGACY_BASE 0x06 -#define PCCARD_NO_CONTROLLERS 0x07 - -#define MAXIMUM_EXPANSION_SIZE (KERNEL_LARGE_STACK_SIZE - (PAGE_SIZE / 2)) - -/* Filesystem runtime library routines */ - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsTotalDeviceFailure( - IN NTSTATUS Status); -#endif - -/* FIXME : These definitions below doesn't belong to NTDDK */ #ifdef __cplusplus } #endif + + +#endif /* _NTDDK_ */ diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 15bace86764..87d0470888c 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -25,10 +25,32 @@ #define _NTIFS_INCLUDED_ #define _GNU_NTIFS_ +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif +#if !defined(_NTHALDLL_) && !defined(_BLDR_) +#define NTHALAPI DECLSPEC_IMPORT +#else +#define NTHALAPI +#endif + +/* For ReactOS */ +#if !defined(_NTOSKRNL_) && !defined(_BLDR_) +#define NTKERNELAPI DECLSPEC_IMPORT +#else +#define NTKERNELAPI +#endif + /* Dependencies */ #include #include @@ -54,6 +76,16 @@ extern "C" { #define ClearFlag(_F,_SF) ((_F) &= ~(_SF)) #endif +#define PsGetCurrentProcess IoGetCurrentProcess + +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; +#else +extern PCCHAR KeNumberProcessors; +#endif + typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; typedef STRING LSA_STRING, *PLSA_STRING; typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES; @@ -719,6 +751,8 @@ typedef enum _OBJECT_INFORMATION_CLASS { MaxObjectInfoClass /* FIXME, not in WDK */ } OBJECT_INFORMATION_CLASS; +#if (NTDDI_VERSION >= NTDDI_NT4) + NTSYSCALLAPI NTSTATUS NTAPI @@ -729,6 +763,8 @@ NtQueryObject( IN ULONG ObjectInformationLength, OUT PULONG ReturnLength OPTIONAL); +#endif + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSCALLAPI @@ -2378,11 +2414,95 @@ extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine; #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information" +#define DEVICE_TYPE ULONG + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_FIPS 0x0000003A +#define FILE_DEVICE_INFINIBAND 0x0000003B +#define FILE_DEVICE_VMBUS 0x0000003E +#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F +#define FILE_DEVICE_WPD 0x00000040 +#define FILE_DEVICE_BLUETOOTH 0x00000041 +#define FILE_DEVICE_MT_COMPOSITE 0x00000042 +#define FILE_DEVICE_MT_TRANSPORT 0x00000043 +#define FILE_DEVICE_BIOMETRIC 0x00000044 +#define FILE_DEVICE_PMI 0x00000045 + +#define CTL_CODE(DeviceType, Function, Method, Access) \ + (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) + +#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) + #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3)) +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT +#define FILE_ANY_ACCESS 0x00000000 +#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS +#define FILE_READ_ACCESS 0x00000001 +#define FILE_WRITE_ACCESS 0x00000002 + typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE; typedef enum _SECURITY_LOGON_TYPE { @@ -4553,8 +4673,6 @@ typedef struct _KAPC_STATE { #define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN)) -#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); - typedef struct _KQUEUE { DISPATCHER_HEADER Header; LIST_ENTRY EntryListHead; @@ -4689,7 +4807,7 @@ FASTCALL KeAcquireQueuedSpinLock( IN OUT KSPIN_LOCK_QUEUE_NUMBER Number); -_DECL_HAL_KE_IMPORT +NTHALAPI VOID FASTCALL KeReleaseQueuedSpinLock( @@ -4904,6 +5022,24 @@ typedef NTSTATUS #if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +VOID +NTAPI +SeCaptureSubjectContext( + OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeLockSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeUnlockSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + NTKERNELAPI VOID NTAPI @@ -5317,6 +5453,18 @@ SeLocateProcessImageName( extern NTKERNELAPI PSE_EXPORTS SeExports; +#if !defined(_PSGETCURRENTTHREAD_) +#define _PSGETCURRENTTHREAD_ + +FORCEINLINE +PETHREAD +PsGetCurrentThread( + VOID) +{ + return (PETHREAD)KeGetCurrentThread(); +} +#endif + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -5386,20 +5534,7 @@ PsReturnPoolQuota( IN POOL_TYPE PoolType, IN ULONG_PTR Amount); -NTKERNELAPI -NTSTATUS -NTAPI -PsAssignImpersonationToken( - IN PETHREAD Thread, - IN HANDLE Token OPTIONAL); - -NTKERNELAPI -HANDLE -NTAPI -PsReferencePrimaryToken( - IN OUT PEPROCESS Process); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +#endif #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -5688,6 +5823,18 @@ IoPageRead( IN PKEVENT Event, OUT PIO_STATUS_BLOCK IoStatusBlock); +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDevice( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDeviceReference( + IN PDEVICE_OBJECT DeviceObject); + NTKERNELAPI PDEVICE_OBJECT NTAPI @@ -5804,6 +5951,42 @@ NTAPI IoSetTopLevelIrp( IN PIRP Irp OPTIONAL); +NTKERNELAPI +VOID +NTAPI +IoStartNextPacket( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable); + +NTKERNELAPI +VOID +NTAPI +IoStartNextPacketByKey( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable, + IN ULONG Key); + +NTKERNELAPI +VOID +NTAPI +IoStartPacket( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PULONG Key OPTIONAL, + IN PDRIVER_CANCEL CancelFunction OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoStartTimer( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +VOID +NTAPI +IoStopTimer( + IN PDEVICE_OBJECT DeviceObject); + NTKERNELAPI NTSTATUS NTAPI @@ -5840,6 +6023,12 @@ IoVerifyVolume( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount); +NTKERNELAPI +VOID +NTAPI +IoWriteErrorLogEntry( + IN PVOID ElEntry); + NTKERNELAPI NTSTATUS NTAPI @@ -5866,6 +6055,13 @@ IoQueryFileDosDeviceName( IN PFILE_OBJECT FileObject, OUT POBJECT_NAME_INFORMATION *ObjectNameInformation); +VOID +NTAPI +IoSetStartIoAttributes( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN DeferredStartIo, + IN BOOLEAN NonCancelable); + NTKERNELAPI NTSTATUS NTAPI @@ -5964,6 +6160,53 @@ typedef struct _IO_PRIORITY_INFO { #define PO_CB_LID_SWITCH_STATE 4 #define PO_CB_PROCESSOR_POWER_POLICY 5 +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +PVOID +NTAPI +PoRegisterSystemState( + IN OUT PVOID StateHandle OPTIONAL, + IN EXECUTION_STATE Flags); + +NTKERNELAPI +VOID +NTAPI +PoUnregisterSystemState( + IN OUT PVOID StateHandle); + +NTKERNELAPI +POWER_STATE +NTAPI +PoSetPowerState( + IN PDEVICE_OBJECT DeviceObject, + IN POWER_STATE_TYPE Type, + IN POWER_STATE State); + +NTKERNELAPI +NTSTATUS +NTAPI +PoCallDriver( + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp); + +NTKERNELAPI +VOID +NTAPI +PoStartNextPowerIrp( + IN OUT PIRP Irp); + +NTKERNELAPI +PULONG +NTAPI +PoRegisterDeviceForIdleDetection( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG ConservationIdleTime, + IN ULONG PerformanceIdleTime, + IN DEVICE_POWER_STATE State); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + #if (NTDDI_VERSION >= NTDDI_WINXP) NTKERNELAPI NTSTATUS @@ -5972,6 +6215,84 @@ PoQueueShutdownWorkItem( IN OUT PWORK_QUEUE_ITEM WorkItem); #endif +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +PoRegisterPowerSettingCallback( + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + IN LPCGUID SettingGuid, + IN PPOWER_SETTING_CALLBACK Callback, + IN PVOID Context OPTIONAL, + OUT PVOID *Handle); + +NTKERNELAPI +NTSTATUS +PoUnregisterPowerSettingCallback( + IN OUT PVOID Handle); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN6SP1) +NTKERNELAPI +VOID +NTAPI +PoSetDeviceBusyEx( + IN OUT PULONG IdlePointer); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +NTSTATUS +NTAPI +PoCreatePowerRequest( + OUT PVOID *PowerRequest, + IN PDEVICE_OBJECT DeviceObject, + IN PCOUNTED_REASON_CONTEXT Context); + +NTKERNELAPI +NTSTATUS +NTAPI +PoSetPowerRequest( + IN OUT PVOID PowerRequest, + IN POWER_REQUEST_TYPE Type); + +NTKERNELAPI +NTSTATUS +NTAPI +PoClearPowerRequest( + IN OUT PVOID PowerRequest, + IN POWER_REQUEST_TYPE Type); + +NTKERNELAPI +VOID +NTAPI +PoDeletePowerRequest( + IN OUT PVOID PowerRequest); + +NTKERNELAPI +VOID +NTAPI +PoStartDeviceBusy( + IN OUT PULONG IdlePointer); + +NTKERNELAPI +VOID +NTAPI +PoEndDeviceBusy( + IN OUT PULONG IdlePointer); + +NTKERNELAPI +BOOLEAN +NTAPI +PoQueryWatchdogTime( + IN PDEVICE_OBJECT Pdo, + OUT PULONG SecondsRemaining); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + #if defined(_IA64_) #if (NTDDI_VERSION >= NTDDI_WIN2K) //DECLSPEC_DEPRECATED_DDK @@ -6247,188 +6568,6 @@ typedef struct _FILE_LOCK { LONG volatile LockRequestsInProgress; } FILE_LOCK, *PFILE_LOCK; -typedef struct _TUNNEL { - FAST_MUTEX Mutex; - PRTL_SPLAY_LINKS Cache; - LIST_ENTRY TimerQueue; - USHORT NumEntries; -} TUNNEL, *PTUNNEL; - -typedef enum _FSRTL_COMPARISON_RESULT { - LessThan = -1, - EqualTo = 0, - GreaterThan = 1 -} FSRTL_COMPARISON_RESULT; - -#define FSRTL_FAT_LEGAL 0x01 -#define FSRTL_HPFS_LEGAL 0x02 -#define FSRTL_NTFS_LEGAL 0x04 -#define FSRTL_WILD_CHARACTER 0x08 -#define FSRTL_OLE_LEGAL 0x10 -#define FSRTL_NTFS_STREAM_LEGAL (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL) - -typedef struct _BASE_MCB { - ULONG MaximumPairCount; - ULONG PairCount; - USHORT PoolType; - USHORT Flags; - PVOID Mapping; -} BASE_MCB, *PBASE_MCB; - -typedef struct _LARGE_MCB { - PKGUARDED_MUTEX GuardedMutex; - BASE_MCB BaseMcb; -} LARGE_MCB, *PLARGE_MCB; - -#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 - -typedef struct _MCB { - LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; -} MCB, *PMCB; - -typedef PVOID OPLOCK, *POPLOCK; - -typedef VOID -(NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp); - -typedef VOID -(NTAPI *POPLOCK_FS_PREPOST_IRP) ( - IN PVOID Context, - IN PIRP Irp); - -#if (NTDDI_VERSION >= NTDDI_VISTASP1) -#define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001 -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) -#define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY 0x00000002 -#define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK 0x00000004 -#define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS 0x00000008 -#define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH 0x00000001 -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -typedef struct _OPLOCK_KEY_ECP_CONTEXT { - GUID OplockKey; - ULONG Reserved; -} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT; - -DEFINE_GUID( GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f ); - -#endif - -#define FSRTL_VOLUME_DISMOUNT 1 -#define FSRTL_VOLUME_DISMOUNT_FAILED 2 -#define FSRTL_VOLUME_LOCK 3 -#define FSRTL_VOLUME_LOCK_FAILED 4 -#define FSRTL_VOLUME_UNLOCK 5 -#define FSRTL_VOLUME_MOUNT 6 -#define FSRTL_VOLUME_NEEDS_CHKDSK 7 -#define FSRTL_VOLUME_WORM_NEAR_FULL 8 -#define FSRTL_VOLUME_WEARING_OUT 9 -#define FSRTL_VOLUME_FORCED_CLOSED 10 -#define FSRTL_VOLUME_INFO_MAKE_COMPAT 11 -#define FSRTL_VOLUME_PREPARING_EJECT 12 -#define FSRTL_VOLUME_CHANGE_SIZE 13 -#define FSRTL_VOLUME_BACKGROUND_FORMAT 14 - -typedef PVOID PNOTIFY_SYNC; - -typedef BOOLEAN -(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( - IN PVOID NotifyContext, - IN PVOID TargetContext OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); - -typedef BOOLEAN -(NTAPI *PFILTER_REPORT_CHANGE) ( - IN PVOID NotifyContext, - IN PVOID FilterContext); - -typedef VOID -(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( - IN PVOID Context, - IN PKEVENT Event); - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -#define FSRTL_UNC_PROVIDER_FLAGS_MAILSLOTS_SUPPORTED 0x00000001 -#define FSRTL_UNC_PROVIDER_FLAGS_CSC_ENABLED 0x00000002 -#define FSRTL_UNC_PROVIDER_FLAGS_DOMAIN_SVC_AWARE 0x00000004 - -#define FSRTL_ALLOCATE_ECPLIST_FLAG_CHARGE_QUOTA 0x00000001 - -#define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA 0x00000001 -#define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL 0x00000002 - -#define FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL 0x00000002 - -#define FSRTL_VIRTDISK_FULLY_ALLOCATED 0x00000001 -#define FSRTL_VIRTDISK_NO_DRIVE_LETTER 0x00000002 - -typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_1 { - ULONG32 ProviderId; -} FSRTL_MUP_PROVIDER_INFO_LEVEL_1, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_1; - -typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 { - ULONG32 ProviderId; - UNICODE_STRING ProviderName; -} FSRTL_MUP_PROVIDER_INFO_LEVEL_2, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_2; - -typedef VOID -(*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) ( - IN OUT PVOID EcpContext, - IN LPCGUID EcpType); - -typedef struct _ECP_LIST ECP_LIST, *PECP_LIST; - -typedef ULONG FSRTL_ALLOCATE_ECPLIST_FLAGS; -typedef ULONG FSRTL_ALLOCATE_ECP_FLAGS; -typedef ULONG FSRTL_ECP_LOOKASIDE_FLAGS; - -typedef enum _FSRTL_CHANGE_BACKING_TYPE { - ChangeDataControlArea, - ChangeImageControlArea, - ChangeSharedCacheMap -} FSRTL_CHANGE_BACKING_TYPE, *PFSRTL_CHANGE_BACKING_TYPE; - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -typedef struct _FSRTL_PER_FILE_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; - PFREE_FUNCTION FreeCallback; -} FSRTL_PER_FILE_CONTEXT, *PFSRTL_PER_FILE_CONTEXT; - -typedef struct _FSRTL_PER_STREAM_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; - PFREE_FUNCTION FreeCallback; -} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -typedef VOID -(*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) ( - IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); -#endif - -typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; -} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; - -#define FsRtlEnterFileSystem KeEnterCriticalRegion -#define FsRtlExitFileSystem KeLeaveCriticalRegion - -#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_HARD_ERROR 0x1 -#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_LOG_ENTRY 0x2 - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -6706,2181 +6845,15 @@ FsRtlPrivateLock( IN PVOID Context, IN BOOLEAN AlreadySynchronized); -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeTunnelCache( - IN PTUNNEL Cache); - -NTKERNELAPI -VOID -NTAPI -FsRtlAddToTunnelCache( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING ShortName, - IN PUNICODE_STRING LongName, - IN BOOLEAN KeyByShortName, - IN ULONG DataLength, - IN PVOID Data); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlFindInTunnelCache( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING Name, - OUT PUNICODE_STRING ShortName, - OUT PUNICODE_STRING LongName, - IN OUT PULONG DataLength, - OUT PVOID Data); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteKeyFromTunnelCache( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteTunnelCache( - IN PTUNNEL Cache); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectDbcs( - IN ANSI_STRING Name, - OUT PANSI_STRING FirstPart, - OUT PANSI_STRING RemainingPart); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesDbcsContainWildCards( - IN PANSI_STRING Name); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsDbcsInExpression( - IN PANSI_STRING Expression, - IN PANSI_STRING Name); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsFatDbcsLegal( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsHpfsDbcsLegal( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNormalizeNtstatus( - IN NTSTATUS Exception, - IN NTSTATUS GenericException); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNtstatusExpected( - IN NTSTATUS Ntstatus); - -NTKERNELAPI -PERESOURCE -NTAPI -FsRtlAllocateResource( - VOID); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeLargeMcb( - IN PLARGE_MCB Mcb, - IN POOL_TYPE PoolType); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeLargeMcb( - IN PLARGE_MCB Mcb); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetLargeMcb( - IN PLARGE_MCB Mcb, - IN BOOLEAN SelfSynchronized); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateLargeMcb( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntry( - IN PLARGE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntryAndIndex( - IN PLARGE_MCB OpaqueMcb, - OUT PLONGLONG LargeVbn, - OUT PLONGLONG LargeLbn, - OUT PULONG Index); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInLargeMcb( - IN PLARGE_MCB Mcb); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitLargeMcb( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeMcb( - IN PMCB Mcb, - IN POOL_TYPE PoolType); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeMcb( - IN PMCB Mcb); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateMcb( - IN PMCB Mcb, - IN VBN Vbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - IN LBN Lbn, - IN ULONG SectorCount); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - IN ULONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount OPTIONAL, - OUT PULONG Index); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastMcbEntry( - IN PMCB Mcb, - OUT PVBN Vbn, - OUT PLBN Lbn); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInMcb( - IN PMCB Mcb); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextMcbEntry( - IN PMCB Mcb, - IN ULONG RunIndex, - OUT PVBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlBalanceReads( - IN PDEVICE_OBJECT TargetDevice); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeOplock( - IN OUT POPLOCK Oplock); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeOplock( - IN OUT POPLOCK Oplock); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockFsctrl( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCheckOplock( - IN POPLOCK Oplock, - IN PIRP Irp, - IN PVOID Context, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockIsFastIoPossible( - IN POPLOCK Oplock); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentBatchOplock( - IN POPLOCK Oplock); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNotifyVolumeEvent( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyInitializeSync( - IN PNOTIFY_SYNC *NotifySync); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyUninitializeSync( - IN PNOTIFY_SYNC *NotifySync); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullChangeDirectory( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp OPTIONAL, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterReportChange( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext OPTIONAL, - IN PVOID FilterContext OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullReportChange( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyCleanup( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectName( - IN UNICODE_STRING Name, - OUT PUNICODE_STRING FirstPart, - OUT PUNICODE_STRING RemainingPart); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesNameContainWildCards( - IN PUNICODE_STRING Name); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAreNamesEqual( - IN PCUNICODE_STRING Name1, - IN PCUNICODE_STRING Name2, - IN BOOLEAN IgnoreCase, - IN PCWCH UpcaseTable OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNameInExpression( - IN PUNICODE_STRING Expression, - IN PUNICODE_STRING Name, - IN BOOLEAN IgnoreCase, - IN PWCHAR UpcaseTable OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostPagingFileStackOverflow( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRegisterUncProvider( - OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirectorDeviceName, - IN BOOLEAN MailslotsSupported); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeregisterUncProvider( - IN HANDLE Handle); - -NTKERNELAPI -VOID -NTAPI -FsRtlTeardownPerStreamContexts( - IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCreateSectionForDataScan( - OUT PHANDLE SectionHandle, - OUT PVOID *SectionObject, - OUT PLARGE_INTEGER SectionFileSize OPTIONAL, - IN PFILE_OBJECT FileObject, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize OPTIONAL, - IN ULONG SectionPageProtection, - IN ULONG AllocationAttributes, - IN ULONG Flags); - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterChangeDirectory( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp OPTIONAL, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, - IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerStreamContext( - IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, - IN PFSRTL_PER_STREAM_CONTEXT Ptr); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlLookupPerStreamContextInternal( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlRemovePerStreamContext( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastReadNotPossible( - VOID); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastReadWait( - VOID); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastReadNoWait( - VOID); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastReadResourceMiss( - VOID); - -NTKERNELAPI -LOGICAL -NTAPI -FsRtlIsPagingFile( - IN PFILE_OBJECT FileObject); - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_WS03) - -NTKERNELAPI - VOID -NTAPI -FsRtlInitializeBaseMcb( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeBaseMcb( - IN PBASE_MCB Mcb); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetBaseMcb( - IN PBASE_MCB Mcb); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateBaseMcb( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlRemoveBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntry( - IN PBASE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntryAndIndex( - IN PBASE_MCB OpaqueMcb, - IN OUT PLONGLONG LargeVbn, - IN OUT PLONGLONG LargeLbn, - IN OUT PULONG Index); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInBaseMcb( - IN PBASE_MCB Mcb); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextBaseMcbEntry( - IN PBASE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitBaseMcb( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount); - -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -BOOLEAN -NTAPI -FsRtlInitializeBaseMcbEx( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType, - IN USHORT Flags); - -NTSTATUS -NTAPI -FsRtlAddBaseMcbEntryEx( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentOplock( - IN POPLOCK Oplock); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockBreakToNone( - IN OUT POPLOCK Oplock, - IN PIO_STACK_LOCATION IrpSp OPTIONAL, - IN PIRP Irp, - IN PVOID Context OPTIONAL, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNotifyVolumeEventEx( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode, - IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyCleanupAll( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList); - -NTSTATUS -NTAPI -FsRtlRegisterUncProviderEx( - OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirDevName, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG Flags); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCancellableWaitForSingleObject( - IN PVOID Object, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PIRP Irp OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCancellableWaitForMultipleObjects( - IN ULONG Count, - IN PVOID ObjectArray[], - IN WAIT_TYPE WaitType, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PKWAIT_BLOCK WaitBlockArray OPTIONAL, - IN PIRP Irp OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlMupGetProviderInfoFromFileObject( - IN PFILE_OBJECT pFileObject, - IN ULONG Level, - OUT PVOID pBuffer, - IN OUT PULONG pBufferSize); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlMupGetProviderIdFromName( - IN PUNICODE_STRING pProviderName, - OUT PULONG32 pProviderId); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastMdlReadWait( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlValidateReparsePointBuffer( - IN ULONG BufferLength, - IN PREPARSE_DATA_BUFFER ReparseBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRemoveDotsFromPath( - IN OUT PWSTR OriginalString, - IN USHORT PathLength, - OUT USHORT *NewLength); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlAllocateExtraCreateParameterList( - IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, - OUT PECP_LIST *EcpList); - -NTKERNELAPI -VOID -NTAPI -FsRtlFreeExtraCreateParameterList( - IN PECP_LIST EcpList); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlAllocateExtraCreateParameter( - IN LPCGUID EcpType, - IN ULONG SizeOfContext, - IN FSRTL_ALLOCATE_ECP_FLAGS Flags, - IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, - IN ULONG PoolTag, - OUT PVOID *EcpContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlFreeExtraCreateParameter( - IN PVOID EcpContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitExtraCreateParameterLookasideList( - IN OUT PVOID Lookaside, - IN FSRTL_ECP_LOOKASIDE_FLAGS Flags, - IN SIZE_T Size, - IN ULONG Tag); - -VOID -NTAPI -FsRtlDeleteExtraCreateParameterLookasideList( - IN OUT PVOID Lookaside, - IN FSRTL_ECP_LOOKASIDE_FLAGS Flags); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlAllocateExtraCreateParameterFromLookasideList( - IN LPCGUID EcpType, - IN ULONG SizeOfContext, - IN FSRTL_ALLOCATE_ECP_FLAGS Flags, - IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, - IN OUT PVOID LookasideList, - OUT PVOID *EcpContext); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertExtraCreateParameter( - IN OUT PECP_LIST EcpList, - IN OUT PVOID EcpContext); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlFindExtraCreateParameter( - IN PECP_LIST EcpList, - IN LPCGUID EcpType, - OUT PVOID *EcpContext OPTIONAL, - OUT ULONG *EcpContextSize OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRemoveExtraCreateParameter( - IN OUT PECP_LIST EcpList, - IN LPCGUID EcpType, - OUT PVOID *EcpContext, - OUT ULONG *EcpContextSize OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlGetEcpListFromIrp( - IN PIRP Irp, - OUT PECP_LIST *EcpList OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlSetEcpListIntoIrp( - IN OUT PIRP Irp, - IN PECP_LIST EcpList); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlGetNextExtraCreateParameter( - IN PECP_LIST EcpList, - IN PVOID CurrentEcpContext OPTIONAL, - OUT LPGUID NextEcpType OPTIONAL, - OUT PVOID *NextEcpContext OPTIONAL, - OUT ULONG *NextEcpContextSize OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlAcknowledgeEcp( - IN PVOID EcpContext); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsEcpAcknowledged( - IN PVOID EcpContext); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsEcpFromUserMode( - IN PVOID EcpContext); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlChangeBackingFileObject( - IN PFILE_OBJECT CurrentFileObject OPTIONAL, - IN PFILE_OBJECT NewFileObject, - IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, - IN ULONG Flags); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlLogCcFlushError( - IN PUNICODE_STRING FileName, - IN PDEVICE_OBJECT DeviceObject, - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN NTSTATUS FlushError, - IN ULONG Flags); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAreVolumeStartupApplicationsComplete( - VOID); - -NTKERNELAPI -ULONG -NTAPI -FsRtlQueryMaximumVirtualDiskNestingLevel( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlGetVirtualDiskNestingLevel( - IN PDEVICE_OBJECT DeviceObject, - OUT PULONG NestingLevel, - OUT PULONG NestingFlags OPTIONAL); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_VISTASP1) -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCheckOplockEx( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG Flags, - IN PVOID Context OPTIONAL, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -#endif - #if (NTDDI_VERSION >= NTDDI_WIN7) - NTKERNELAPI BOOLEAN NTAPI FsRtlAreThereCurrentOrInProgressFileLocks( IN PFILE_LOCK FileLock); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockIsSharedRequest( - IN PIRP Irp); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockBreakH( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG Flags, - IN PVOID Context OPTIONAL, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentOplockH( - IN POPLOCK Oplock); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockBreakToNoneEx( - IN OUT POPLOCK Oplock, - IN PIRP Irp, - IN ULONG Flags, - IN PVOID Context OPTIONAL, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockFsctrlEx( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount, - IN ULONG Flags); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockKeysEqual( - IN PFILE_OBJECT Fo1 OPTIONAL, - IN PFILE_OBJECT Fo2 OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInitializeExtraCreateParameterList( - IN OUT PECP_LIST EcpList); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeExtraCreateParameter( - IN PECP_HEADER Ecp, - IN ULONG EcpFlags, - IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, - IN ULONG TotalSize, - IN LPCGUID EcpType, - IN PVOID ListAllocatedFrom OPTIONAL); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerFileContext( - IN PVOID* PerFileContextPointer, - IN PFSRTL_PER_FILE_CONTEXT Ptr); - -NTKERNELAPI -PFSRTL_PER_FILE_CONTEXT -NTAPI -FsRtlLookupPerFileContext( - IN PVOID* PerFileContextPointer, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -PFSRTL_PER_FILE_CONTEXT -NTAPI -FsRtlRemovePerFileContext( - IN PVOID* PerFileContextPointer, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlTeardownPerFileContexts( - IN PVOID* PerFileContextPointer); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); - -NTKERNELAPI -PFSRTL_PER_FILEOBJECT_CONTEXT -NTAPI -FsRtlLookupPerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -PFSRTL_PER_FILEOBJECT_CONTEXT -NTAPI -FsRtlRemovePerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ - FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ -) - -#define FsRtlAreThereCurrentFileLocks(FL) ( \ - ((FL)->FastIoIsQuestionable) \ -) - -#define FsRtlIncrementLockRequestsInProgress(FL) { \ - ASSERT( (FL)->LockRequestsInProgress >= 0 ); \ - (void) \ - (InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ -} - -#define FsRtlDecrementLockRequestsInProgress(FL) { \ - ASSERT( (FL)->LockRequestsInProgress > 0 ); \ - (void) \ - (InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ -} - -extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo; -#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo - -#ifdef NLS_MB_CODE_PAGE_TAG -#undef NLS_MB_CODE_PAGE_TAG #endif -#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag - -/* GCC compatible definition, MS one is retarded */ -extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; -#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray - -#define FsRtlIsAnsiCharacterWild(C) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ -) - -#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) ( \ - FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL) \ -) - -#define FsRtlIsAnsiCharacterLegal(C,FLAGS) ( \ - FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \ -) - -#define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) ( \ - ((SCHAR)(C) < 0) ? DEFAULT_RET : \ - FlagOn( LEGAL_ANSI_CHARACTER_ARRAY[(C)], \ - (FLAGS) | \ - ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \ -) - -#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ - (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ - (NLS_MB_CODE_PAGE_TAG && \ - (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ -) - -#define FsRtlIsUnicodeCharacterWild(C) ( \ - (((C) >= 0x40) ? \ - FALSE : \ - FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ -) - -#define FsRtlInitPerFileContext( _fc, _owner, _inst, _cb) \ - ((_fc)->OwnerId = (_owner), \ - (_fc)->InstanceId = (_inst), \ - (_fc)->FreeCallback = (_cb)) - -#define FsRtlGetPerFileContextPointer(_fo) \ - (FsRtlSupportsPerFileContexts(_fo) ? \ - FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : \ - NULL) - -#define FsRtlSupportsPerFileContexts(_fo) \ - ((FsRtlGetPerStreamContextPointer(_fo) != NULL) && \ - (FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) && \ - (FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL)) - -#define FsRtlSetupAdvancedHeaderEx( _advhdr, _fmutx, _fctxptr ) \ -{ \ - FsRtlSetupAdvancedHeader( _advhdr, _fmutx ); \ - if ((_fctxptr) != NULL) { \ - (_advhdr)->FileContextSupportPointer = (_fctxptr); \ - } \ -} - -#define FsRtlGetPerStreamContextPointer(FO) ( \ - (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ -) - -#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ - (PSC)->OwnerId = (O), \ - (PSC)->InstanceId = (I), \ - (PSC)->FreeCallback = (FC) \ -) - -#define FsRtlSupportsPerStreamContexts(FO) ( \ - (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ - FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ - FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ -) - -#define FsRtlLookupPerStreamContext(_sc, _oid, _iid) \ - (((NULL != (_sc)) && \ - FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) && \ - !IsListEmpty(&(_sc)->FilterContexts)) ? \ - FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ - NULL) - -VOID -FORCEINLINE -NTAPI -FsRtlSetupAdvancedHeader( - IN PVOID AdvHdr, - IN PFAST_MUTEX FMutex ) -{ - PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr; - - localAdvHdr->Flags |= FSRTL_FLAG_ADVANCED_HEADER; - localAdvHdr->Flags2 |= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS; -#if (NTDDI_VERSION >= NTDDI_VISTA) - localAdvHdr->Version = FSRTL_FCB_HEADER_V1; -#else - localAdvHdr->Version = FSRTL_FCB_HEADER_V0; -#endif - InitializeListHead( &localAdvHdr->FilterContexts ); - if (FMutex != NULL) { - localAdvHdr->FastMutex = FMutex; - } -#if (NTDDI_VERSION >= NTDDI_VISTA) - *((PULONG_PTR)(&localAdvHdr->PushLock)) = 0; - localAdvHdr->FileContextSupportPointer = NULL; -#endif -} - -#define FsRtlInitPerFileObjectContext(_fc, _owner, _inst) \ - ((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst)) - -#define FsRtlCompleteRequest(IRP,STATUS) { \ - (IRP)->IoStatus.Status = (STATUS); \ - IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ -} - -#if (NTDDI_VERSION >= NTDDI_WIN7) -typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER; -#endif - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER { - NetworkOpenLocationAny, - NetworkOpenLocationRemote, - NetworkOpenLocationLoopback -} NETWORK_OPEN_LOCATION_QUALIFIER; - -typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER { - NetworkOpenIntegrityAny, - NetworkOpenIntegrityNone, - NetworkOpenIntegritySigned, - NetworkOpenIntegrityEncrypted, - NetworkOpenIntegrityMaximum -} NETWORK_OPEN_INTEGRITY_QUALIFIER; - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1 -#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2 -#define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000 - -typedef struct _NETWORK_OPEN_ECP_CONTEXT { - USHORT Size; - USHORT Reserved; - struct { - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - ULONG Flags; - } in; - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - ULONG Flags; - } out; - } DUMMYSTRUCTNAME; -} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; - -typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 { - USHORT Size; - USHORT Reserved; - struct { - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - } in; - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - } out; - } DUMMYSTRUCTNAME; -} NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0; - -#elif (NTDDI_VERSION >= NTDDI_VISTA) -typedef struct _NETWORK_OPEN_ECP_CONTEXT { - USHORT Size; - USHORT Reserved; - struct { - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - } in; - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - } out; - } DUMMYSTRUCTNAME; -} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; -#endif - -DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8 ); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -typedef struct _PREFETCH_OPEN_ECP_CONTEXT { - PVOID Context; -} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT; - -DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55 ); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb); -DEFINE_GUID(GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53 ); - -typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS; - -typedef struct _NFS_OPEN_ECP_CONTEXT { - PUNICODE_STRING ExportAlias; - PSOCKADDR_STORAGE_NFS ClientSocketAddress; -} NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT; - -typedef struct _SRV_OPEN_ECP_CONTEXT { - PUNICODE_STRING ShareName; - PSOCKADDR_STORAGE_NFS SocketAddress; - BOOLEAN OplockBlockState; - BOOLEAN OplockAppState; - BOOLEAN OplockFinalState; -} SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT; - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#define VACB_MAPPING_GRANULARITY (0x40000) -#define VACB_OFFSET_SHIFT (18) - -typedef struct _PUBLIC_BCB { - CSHORT NodeTypeCode; - CSHORT NodeByteSize; - ULONG MappedLength; - LARGE_INTEGER MappedFileOffset; -} PUBLIC_BCB, *PPUBLIC_BCB; - -typedef struct _CC_FILE_SIZES { - LARGE_INTEGER AllocationSize; - LARGE_INTEGER FileSize; - LARGE_INTEGER ValidDataLength; -} CC_FILE_SIZES, *PCC_FILE_SIZES; - -typedef BOOLEAN -(NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( - IN PVOID Context, - IN BOOLEAN Wait); - -typedef VOID -(NTAPI *PRELEASE_FROM_LAZY_WRITE) ( - IN PVOID Context); - -typedef BOOLEAN -(NTAPI *PACQUIRE_FOR_READ_AHEAD) ( - IN PVOID Context, - IN BOOLEAN Wait); - -typedef VOID -(NTAPI *PRELEASE_FROM_READ_AHEAD) ( - IN PVOID Context); - -typedef struct _CACHE_MANAGER_CALLBACKS { - PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; - PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; - PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; - PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; -} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; - -typedef struct _CACHE_UNINITIALIZE_EVENT { - struct _CACHE_UNINITIALIZE_EVENT *Next; - KEVENT Event; -} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; - -typedef VOID -(NTAPI *PDIRTY_PAGE_ROUTINE) ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN PLARGE_INTEGER OldestLsn, - IN PLARGE_INTEGER NewestLsn, - IN PVOID Context1, - IN PVOID Context2); - -typedef VOID -(NTAPI *PFLUSH_TO_LSN) ( - IN PVOID LogHandle, - IN LARGE_INTEGER Lsn); - -typedef VOID -(NTAPI *PCC_POST_DEFERRED_WRITE) ( - IN PVOID Context1, - IN PVOID Context2); - -#define CcIsFileCached(FO) ( \ - ((FO)->SectionObjectPointer != NULL) && \ - (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ -) - -extern ULONG CcFastMdlReadWait; - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -VOID -NTAPI -CcInitializeCacheMap( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes, - IN BOOLEAN PinAccess, - IN PCACHE_MANAGER_CALLBACKS Callbacks, - IN PVOID LazyWriteContext); - -NTKERNELAPI -BOOLEAN -NTAPI -CcUninitializeCacheMap( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER TruncateSize OPTIONAL, - IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -CcSetFileSizes( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPageThreshold( - IN PFILE_OBJECT FileObject, - IN ULONG DirtyPageThreshold); - -NTKERNELAPI -VOID -NTAPI -CcFlushCache( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - OUT PIO_STATUS_BLOCK IoStatus OPTIONAL); - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetFlushedValidData( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN BcbListHeld); - -NTKERNELAPI -BOOLEAN -NTAPI -CcZeroData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER StartOffset, - IN PLARGE_INTEGER EndOffset, - IN BOOLEAN Wait); - -NTKERNELAPI -PVOID -NTAPI -CcRemapBcb( - IN PVOID Bcb); - -NTKERNELAPI -VOID -NTAPI -CcRepinBcb( - IN PVOID Bcb); - -NTKERNELAPI -VOID -NTAPI -CcUnpinRepinnedBcb( - IN PVOID Bcb, - IN BOOLEAN WriteThrough, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromSectionPtrs( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromBcb( - IN PVOID Bcb); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCanIWrite( - IN PFILE_OBJECT FileObject, - IN ULONG BytesToWrite, - IN BOOLEAN Wait, - IN BOOLEAN Retrying); - -NTKERNELAPI -VOID -NTAPI -CcDeferWrite( - IN PFILE_OBJECT FileObject, - IN PCC_POST_DEFERRED_WRITE PostRoutine, - IN PVOID Context1, - IN PVOID Context2, - IN ULONG BytesToWrite, - IN BOOLEAN Retrying); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyRead( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN ULONG PageCount, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN PVOID Buffer); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyWrite( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN PVOID Buffer); - -NTKERNELAPI -VOID -NTAPI -CcMdlRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -VOID -NTAPI -CcMdlReadComplete( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain); - -NTKERNELAPI -VOID -NTAPI -CcPrepareMdlWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -VOID -NTAPI -CcMdlWriteComplete( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain); - -NTKERNELAPI -VOID -NTAPI -CcScheduleReadAhead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length); - -NTKERNELAPI -NTSTATUS -NTAPI -CcWaitForCurrentLazyWriterActivity( - VOID); - -NTKERNELAPI -VOID -NTAPI -CcSetReadAheadGranularity( - IN PFILE_OBJECT FileObject, - IN ULONG Granularity); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinMappedData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - IN OUT PVOID *Bcb); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPreparePinWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Zero, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPinnedData( - IN PVOID BcbVoid, - IN PLARGE_INTEGER Lsn OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -CcUnpinData( - IN PVOID Bcb); - -NTKERNELAPI -VOID -NTAPI -CcSetBcbOwnerPointer( - IN PVOID Bcb, - IN PVOID OwnerPointer); - -NTKERNELAPI -VOID -NTAPI -CcUnpinDataForThread( - IN PVOID Bcb, - IN ERESOURCE_THREAD ResourceThreadId); - -NTKERNELAPI -VOID -NTAPI -CcSetAdditionalCacheAttributes( - IN PFILE_OBJECT FileObject, - IN BOOLEAN DisableReadAhead, - IN BOOLEAN DisableWriteBehind); - -NTKERNELAPI -BOOLEAN -NTAPI -CcIsThereDirtyData( - IN PVPB Vpb); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTKERNELAPI -VOID -NTAPI -CcMdlWriteAbort( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain); - -NTKERNELAPI -VOID -NTAPI -CcSetLogHandleForFile( - IN PFILE_OBJECT FileObject, - IN PVOID LogHandle, - IN PFLUSH_TO_LSN FlushToLsnRoutine); - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetDirtyPages( - IN PVOID LogHandle, - IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, - IN PVOID Context1, - IN PVOID Context2); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -BOOLEAN -NTAPI -CcMapData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer); -#elif (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -BOOLEAN -NTAPI -CcMapData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID *Bcb, - OUT PVOID *Buffer); -#endif - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTKERNELAPI -NTSTATUS -NTAPI -CcSetFileSizesEx( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromSectionPtrsRef( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer); - -NTKERNELAPI -VOID -NTAPI -CcSetParallelFlushFile( - IN PFILE_OBJECT FileObject, - IN BOOLEAN EnableParallelFlush); - -NTKERNELAPI -BOOLEAN -CcIsThereDirtyDataEx( - IN PVPB Vpb, - IN PULONG NumberOfDirtyPages OPTIONAL); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTKERNELAPI -VOID -NTAPI -CcCoherencyFlushAndPurgeCache( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - OUT PIO_STATUS_BLOCK IoStatus, - IN ULONG Flags OPTIONAL); -#endif - -#define CcGetFileSizePointer(FO) ( \ - ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ -) - -#define UNINITIALIZE_CACHE_MAPS (1) -#define DO_NOT_RETRY_PURGE (2) -#define DO_NOT_PURGE_DIRTY_PAGES (0x4) - -#define CC_FLUSH_AND_PURGE_NO_PURGE (0x1) - -#if (NTDDI_VERSION >= NTDDI_VISTA) -NTKERNELAPI -BOOLEAN -NTAPI -CcPurgeCacheSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN ULONG Flags); -#elif (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -BOOLEAN -NTAPI -CcPurgeCacheSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN BOOLEAN UninitializeCacheMaps); -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyWriteWontFlush( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length); -#else -#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) -#endif - -#define CcReadAhead(FO, FOFF, LEN) ( \ - if ((LEN) >= 256) { \ - CcScheduleReadAhead((FO), (FOFF), (LEN)); \ - } \ -) - -#define PIN_WAIT (1) -#define PIN_EXCLUSIVE (2) -#define PIN_NO_READ (4) -#define PIN_IF_BCB (8) -#define PIN_CALLER_TRACKS_DIRTY_DATA (32) -#define PIN_HIGH_PRIORITY (64) - -#define MAP_WAIT 1 -#define MAP_NO_READ (16) -#define MAP_HIGH_PRIORITY (64) - -#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) -#define IOCTL_REDIR_QUERY_PATH_EX CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS) - -typedef struct _QUERY_PATH_REQUEST { - ULONG PathNameLength; - PIO_SECURITY_CONTEXT SecurityContext; - WCHAR FilePathName[1]; -} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; - -typedef struct _QUERY_PATH_REQUEST_EX { - PIO_SECURITY_CONTEXT pSecurityContext; - ULONG EaLength; - PVOID pEaBuffer; - UNICODE_STRING PathName; - UNICODE_STRING DomainServiceName; - ULONG_PTR Reserved[ 3 ]; -} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX; - -typedef struct _QUERY_PATH_RESPONSE { - ULONG LengthAccepted; -} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; - -#define VOLSNAPCONTROLTYPE 0x00000053 -#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryObject( - IN HANDLE Handle OPTIONAL, - IN OBJECT_INFORMATION_CLASS ObjectInformationClass, - OUT PVOID ObjectInformation OPTIONAL, - IN ULONG ObjectInformationLength, - OUT PULONG ReturnLength OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwNotifyChangeKey( - IN HANDLE KeyHandle, - IN HANDLE EventHandle OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG NotifyFilter, - IN BOOLEAN WatchSubtree, - OUT PVOID Buffer, - IN ULONG BufferLength, - IN BOOLEAN Asynchronous); - -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateEvent( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN EVENT_TYPE EventType, - IN BOOLEAN InitialState); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteFile( - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryDirectoryFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN BOOLEAN ReturnSingleEntry, - IN PUNICODE_STRING FileName OPTIONAL, - IN BOOLEAN RestartScan); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFsControlFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG FsControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateObject( - IN HANDLE SourceProcessHandle, - IN HANDLE SourceHandle, - IN HANDLE TargetProcessHandle OPTIONAL, - OUT PHANDLE TargetHandle OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - IN ULONG Options); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSAPI -NTSTATUS -NTAPI -ZwAllocateVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN OUT PSIZE_T RegionSize, - IN ULONG AllocationType, - IN ULONG Protect); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFreeVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType); - -NTSYSAPI -NTSTATUS -NTAPI -ZwWaitForSingleObject( - IN HANDLE Handle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEvent( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFlushVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - OUT PIO_STATUS_BLOCK IoStatusBlock); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG Length, - OUT PULONG ResultLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetSecurityObject( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQuerySecurityObject( - IN HANDLE FileHandle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG ResultLength); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenProcessTokenEx( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenThreadTokenEx( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); - -#endif - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTSYSAPI -NTSTATUS -NTAPI -ZwLockFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER ByteOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key, - IN BOOLEAN FailImmediately, - IN BOOLEAN ExclusiveLock); - -NTSYSAPI -NTSTATUS -NTAPI -ZwUnlockFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER ByteOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN BOOLEAN ReturnSingleEntry, - IN PVOID SidList, - IN ULONG SidListLength, - IN PSID StartSid OPTIONAL, - IN BOOLEAN RestartScan); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFlushBuffersFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTSYSAPI -NTSTATUS -NTAPI -ZwSetInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - IN PVOID TokenInformation, - IN ULONG TokenInformationLength); -#endif - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryEaFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN BOOLEAN ReturnSingleEntry, - IN PVOID EaList OPTIONAL, - IN ULONG EaListLength, - IN PULONG EaIndex OPTIONAL, - IN BOOLEAN RestartScan); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEaFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateToken( - IN HANDLE ExistingTokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN EffectiveOnly, - IN TOKEN_TYPE TokenType, - OUT PHANDLE NewTokenHandle); #pragma pack(push,4) @@ -8890,6 +6863,11 @@ ZwDuplicateToken( #include "csq.h" +#ifdef _NTOSKRNL_ +extern PUCHAR FsRtlLegalAnsiCharacterArray; +#else +extern DECLSPEC_IMPORT PUCHAR FsRtlLegalAnsiCharacterArray; +#endif extern PACL SePublicDefaultDacl; extern PACL SeSystemDefaultDacl; @@ -8912,11 +6890,30 @@ extern PACL SeSystemDefaultDacl; #define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004 +#define FSRTL_VOLUME_DISMOUNT 1 +#define FSRTL_VOLUME_DISMOUNT_FAILED 2 +#define FSRTL_VOLUME_LOCK 3 +#define FSRTL_VOLUME_LOCK_FAILED 4 +#define FSRTL_VOLUME_UNLOCK 5 +#define FSRTL_VOLUME_MOUNT 6 + +#define FSRTL_WILD_CHARACTER 0x08 + +#define FSRTL_FAT_LEGAL 0x01 +#define FSRTL_HPFS_LEGAL 0x02 +#define FSRTL_NTFS_LEGAL 0x04 +#define FSRTL_WILD_CHARACTER 0x08 +#define FSRTL_OLE_LEGAL 0x10 +#define FSRTL_NTFS_STREAM_LEGAL 0x14 + #ifdef _X86_ #define HARDWARE_PTE HARDWARE_PTE_X86 #define PHARDWARE_PTE PHARDWARE_PTE_X86 #endif +#define IO_CHECK_CREATE_PARAMETERS 0x0200 +#define IO_ATTACH_DEVICE 0x0400 + #define IO_ATTACH_DEVICE_API 0x80000000 #define IO_TYPE_APC 18 @@ -8935,6 +6932,8 @@ extern PACL SeSystemDefaultDacl; #define MEM_DOS_LIM 0x40000000 +#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 + #define OB_TYPE_TYPE 1 #define OB_TYPE_DIRECTORY 2 #define OB_TYPE_SYMBOLIC_LINK 3 @@ -8959,12 +6958,23 @@ extern PACL SeSystemDefaultDacl; #define OB_TYPE_IO_COMPLETION 22 #define OB_TYPE_FILE 23 +#define PIN_WAIT (1) +#define PIN_EXCLUSIVE (2) +#define PIN_NO_READ (4) +#define PIN_IF_BCB (8) + #define SEC_BASED 0x00200000 +#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} +#define SECURITY_WORLD_RID (0x00000000L) + /* end winnt.h */ #define TOKEN_HAS_ADMIN_GROUP 0x08 +#define VACB_MAPPING_GRANULARITY (0x40000) +#define VACB_OFFSET_SHIFT (18) + #if (VER_PRODUCTBUILD >= 1381) #define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) #endif /* (VER_PRODUCTBUILD >= 1381) */ @@ -8991,6 +7001,18 @@ extern PACL SeSystemDefaultDacl; #define FSCTL_NETWORK_SET_DOMAIN_NAME CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) + +typedef PVOID OPLOCK, *POPLOCK; + +// +// Forwarders +// +struct _RTL_AVL_TABLE; +struct _RTL_GENERIC_TABLE; + +typedef PVOID PNOTIFY_SYNC; + typedef enum _FILE_STORAGE_TYPE { StorageTypeDefault = 1, StorageTypeDirectory, @@ -9026,6 +7048,17 @@ typedef struct _BITMAP_RANGE { PULONG Bitmap; } BITMAP_RANGE, *PBITMAP_RANGE; +typedef struct _CACHE_UNINITIALIZE_EVENT { + struct _CACHE_UNINITIALIZE_EVENT *Next; + KEVENT Event; +} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; + +typedef struct _CC_FILE_SIZES { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER FileSize; + LARGE_INTEGER ValidDataLength; +} CC_FILE_SIZES, *PCC_FILE_SIZES; + typedef struct _FILE_COPY_ON_WRITE_INFORMATION { BOOLEAN ReplaceIfExists; HANDLE RootDirectory; @@ -9048,6 +7081,49 @@ typedef struct _FILE_FULL_DIRECTORY_INFORMATION { WCHAR FileName[ANYSIZE_ARRAY]; } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION; +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +#if (VER_PRODUCTBUILD >= 2195) + +typedef struct _FILE_FS_OBJECT_ID_INFORMATION { + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION; + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FS_OBJECTID_INFORMATION +{ + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; + /* raw internal file lock struct returned from FsRtlGetNextFileLock */ typedef struct _FILE_SHARED_LOCK_ENTRY { PVOID Unknown1; @@ -9132,6 +7208,51 @@ typedef struct _FILE_OLE_STATE_BITS_INFORMATION { ULONG StateBitsMask; } FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION; +typedef enum _FSRTL_COMPARISON_RESULT +{ + LessThan = -1, + EqualTo = 0, + GreaterThan = 1 +} FSRTL_COMPARISON_RESULT; + +#if (VER_PRODUCTBUILD >= 2600) + +typedef struct _FSRTL_PER_STREAM_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; + +typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT +{ + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; +} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; + +#endif /* (VER_PRODUCTBUILD >= 2600) */ + +typedef struct _BASE_MCB +{ + ULONG MaximumPairCount; + ULONG PairCount; + USHORT PoolType; + USHORT Flags; + PVOID Mapping; +} BASE_MCB, *PBASE_MCB; + +typedef struct _LARGE_MCB +{ + PKGUARDED_MUTEX GuardedMutex; + BASE_MCB BaseMcb; +} LARGE_MCB, *PLARGE_MCB; + +typedef struct _MCB +{ + LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; +} MCB, *PMCB; + typedef struct _MAPPING_PAIR { ULONGLONG Vcn; ULONGLONG Lcn; @@ -9143,6 +7264,8 @@ typedef struct _GET_RETRIEVAL_DESCRIPTOR { MAPPING_PAIR Pair[1]; } GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR; +#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); + typedef struct _MBCB { CSHORT NodeTypeCode; CSHORT NodeIsInZone; @@ -9205,6 +7328,189 @@ typedef struct _OBJECT_ALL_TYPES_INFO { OBJECT_TYPE_INFO ObjectsTypeInfo[1]; } OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO; +typedef enum _RTL_GENERIC_COMPARE_RESULTS +{ + GenericLessThan, + GenericGreaterThan, + GenericEqual +} RTL_GENERIC_COMPARE_RESULTS; + +typedef enum _TABLE_SEARCH_RESULT +{ + TableEmptyTree, + TableFoundNode, + TableInsertAsLeft, + TableInsertAsRight +} TABLE_SEARCH_RESULT; + +typedef NTSTATUS +(NTAPI *PRTL_AVL_MATCH_FUNCTION)( + struct _RTL_AVL_TABLE *Table, + PVOID UserData, + PVOID MatchData +); + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct +); + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct +); + +typedef PVOID +(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + CLONG ByteSize +); + +typedef VOID +(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID Buffer +); + +typedef PVOID +(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + CLONG ByteSize +); + +typedef VOID +(NTAPI *PRTL_AVL_FREE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + PVOID Buffer +); + +typedef struct _PUBLIC_BCB { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + ULONG MappedLength; + LARGE_INTEGER MappedFileOffset; +} PUBLIC_BCB, *PPUBLIC_BCB; + +typedef struct _QUERY_PATH_REQUEST { + ULONG PathNameLength; + PIO_SECURITY_CONTEXT SecurityContext; + WCHAR FilePathName[1]; +} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; + +typedef struct _QUERY_PATH_RESPONSE { + ULONG LengthAccepted; +} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; + +typedef struct _RTL_BALANCED_LINKS +{ + struct _RTL_BALANCED_LINKS *Parent; + struct _RTL_BALANCED_LINKS *LeftChild; + struct _RTL_BALANCED_LINKS *RightChild; + CHAR Balance; + UCHAR Reserved[3]; +} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; + +typedef struct _RTL_GENERIC_TABLE +{ + PRTL_SPLAY_LINKS TableRoot; + LIST_ENTRY InsertOrderList; + PLIST_ENTRY OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; + PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_GENERIC_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; + +#undef PRTL_GENERIC_COMPARE_ROUTINE +#undef PRTL_GENERIC_ALLOCATE_ROUTINE +#undef PRTL_GENERIC_FREE_ROUTINE +#undef RTL_GENERIC_TABLE +#undef PRTL_GENERIC_TABLE + +#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE +#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE +#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE +#define RTL_GENERIC_TABLE RTL_AVL_TABLE +#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE + +#define RtlInitializeGenericTable RtlInitializeGenericTableAvl +#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl +#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl +#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl +#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl +#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl +#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl +#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl +#define RtlGetElementGenericTable RtlGetElementGenericTableAvl +#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl +#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl + +typedef struct _RTL_AVL_TABLE +{ + RTL_BALANCED_LINKS BalancedRoot; + PVOID OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + ULONG DepthOfTree; + PRTL_BALANCED_LINKS RestartKey; + ULONG DeleteCount; + PRTL_AVL_COMPARE_ROUTINE CompareRoutine; + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_AVL_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_AVL_TABLE, *PRTL_AVL_TABLE; + +NTSYSAPI +VOID +NTAPI +RtlInitializeGenericTableAvl( + PRTL_AVL_TABLE Table, + PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + PRTL_AVL_FREE_ROUTINE FreeRoutine, + PVOID TableContext +); + +NTSYSAPI +PVOID +NTAPI +RtlInsertElementGenericTableAvl ( + PRTL_AVL_TABLE Table, + PVOID Buffer, + CLONG BufferSize, + PBOOLEAN NewElement OPTIONAL + ); + +NTSYSAPI +BOOLEAN +NTAPI +RtlDeleteElementGenericTableAvl ( + PRTL_AVL_TABLE Table, + PVOID Buffer + ); + +NTSYSAPI +PVOID +NTAPI +RtlLookupElementGenericTableAvl ( + PRTL_AVL_TABLE Table, + PVOID Buffer + ); + +NTSYSAPI +PVOID +NTAPI +RtlEnumerateGenericTableWithoutSplayingAvl ( + PRTL_AVL_TABLE Table, + PVOID *RestartKey + ); + #if defined(USE_LPC6432) #define LPC_CLIENT_ID CLIENT_ID64 #define LPC_SIZE_T ULONGLONG @@ -9269,6 +7575,13 @@ typedef struct _REMOTE_PORT_VIEW LPC_PVOID ViewBase; } REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW; +typedef struct _TUNNEL { + FAST_MUTEX Mutex; + PRTL_SPLAY_LINKS Cache; + LIST_ENTRY TimerQueue; + USHORT NumEntries; +} TUNNEL, *PTUNNEL; + typedef struct _VAD_HEADER { PVOID StartVPN; PVOID EndVPN; @@ -9283,6 +7596,150 @@ typedef struct _VAD_HEADER { LIST_ENTRY Secured; } VAD_HEADER, *PVAD_HEADER; +#if (VER_PRODUCTBUILD >= 2600) + +typedef BOOLEAN +(NTAPI *PFILTER_REPORT_CHANGE) ( + IN PVOID NotifyContext, + IN PVOID FilterContext +); + +#endif + +NTKERNELAPI +BOOLEAN +NTAPI +CcCanIWrite ( + IN PFILE_OBJECT FileObject, + IN ULONG BytesToWrite, + IN BOOLEAN Wait, + IN BOOLEAN Retrying +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN PVOID Buffer +); + +#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) + +typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) ( + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +VOID +NTAPI +CcDeferWrite ( + IN PFILE_OBJECT FileObject, + IN PCC_POST_DEFERRED_WRITE PostRoutine, + IN PVOID Context1, + IN PVOID Context2, + IN ULONG BytesToWrite, + IN BOOLEAN Retrying +); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyRead ( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN ULONG PageCount, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyWrite ( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN PVOID Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcFlushCache ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus OPTIONAL +); + +typedef VOID (NTAPI *PDIRTY_PAGE_ROUTINE) ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN PLARGE_INTEGER OldestLsn, + IN PLARGE_INTEGER NewestLsn, + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetDirtyPages ( + IN PVOID LogHandle, + IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromBcb ( + IN PVOID Bcb +); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrs ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer +); + +#define CcGetFileSizePointer(FO) ( \ + ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ +) + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetFlushedValidData ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN BcbListHeld +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + NTKERNELAPI LARGE_INTEGER NTAPI @@ -9291,6 +7748,428 @@ CcGetLsnForFileObject ( OUT PLARGE_INTEGER OldestLsn OPTIONAL ); +typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( + IN PVOID Context, + IN BOOLEAN Wait +); + +typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) ( + IN PVOID Context +); + +typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) ( + IN PVOID Context, + IN BOOLEAN Wait +); + +typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) ( + IN PVOID Context +); + +typedef struct _CACHE_MANAGER_CALLBACKS { + PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; + PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; + PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; + PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; +} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; + +NTKERNELAPI +VOID +NTAPI +CcInitializeCacheMap ( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes, + IN BOOLEAN PinAccess, + IN PCACHE_MANAGER_CALLBACKS Callbacks, + IN PVOID LazyWriteContext +); + +#define CcIsFileCached(FO) ( \ + ((FO)->SectionObjectPointer != NULL) && \ + (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ +) + +extern ULONG CcFastMdlReadWait; + +NTKERNELAPI +BOOLEAN +NTAPI +CcIsThereDirtyData ( + IN PVPB Vpb +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcMdlRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +VOID +NTAPI +CcMdlReadComplete ( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain +); + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteComplete ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain +); + +#define MAP_WAIT 1 + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinMappedData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + IN OUT PVOID *Bcb +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcPrepareMdlWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPreparePinWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Zero, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN BOOLEAN UninitializeCacheMaps +); + +#define CcReadAhead(FO, FOFF, LEN) ( \ + if ((LEN) >= 256) { \ + CcScheduleReadAhead((FO), (FOFF), (LEN)); \ + } \ +) + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +PVOID +NTAPI +CcRemapBcb ( + IN PVOID Bcb +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +VOID +NTAPI +CcRepinBcb ( + IN PVOID Bcb +); + +NTKERNELAPI +VOID +NTAPI +CcScheduleReadAhead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length +); + +NTKERNELAPI +VOID +NTAPI +CcSetAdditionalCacheAttributes ( + IN PFILE_OBJECT FileObject, + IN BOOLEAN DisableReadAhead, + IN BOOLEAN DisableWriteBehind +); + +NTKERNELAPI +VOID +NTAPI +CcSetBcbOwnerPointer ( + IN PVOID Bcb, + IN PVOID OwnerPointer +); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPageThreshold ( + IN PFILE_OBJECT FileObject, + IN ULONG DirtyPageThreshold +); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPinnedData ( + IN PVOID BcbVoid, + IN PLARGE_INTEGER Lsn OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +CcSetFileSizes ( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes +); + +typedef VOID (NTAPI *PFLUSH_TO_LSN) ( + IN PVOID LogHandle, + IN LARGE_INTEGER Lsn +); + +NTKERNELAPI +VOID +NTAPI +CcSetLogHandleForFile ( + IN PFILE_OBJECT FileObject, + IN PVOID LogHandle, + IN PFLUSH_TO_LSN FlushToLsnRoutine +); + +NTKERNELAPI +VOID +NTAPI +CcSetReadAheadGranularity ( + IN PFILE_OBJECT FileObject, + IN ULONG Granularity /* default: PAGE_SIZE */ + /* allowed: 2^n * PAGE_SIZE */ +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcUninitializeCacheMap ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER TruncateSize OPTIONAL, + IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinData ( + IN PVOID Bcb +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinDataForThread ( + IN PVOID Bcb, + IN ERESOURCE_THREAD ResourceThreadId +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinRepinnedBcb ( + IN PVOID Bcb, + IN BOOLEAN WriteThrough, + OUT PIO_STATUS_BLOCK IoStatus +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +CcWaitForCurrentLazyWriterActivity ( + VOID +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +BOOLEAN +NTAPI +CcZeroData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER StartOffset, + IN PLARGE_INTEGER EndOffset, + IN BOOLEAN Wait +); + +#if (VER_PRODUCTBUILD >= 2600) + +#ifndef __NTOSKRNL__ +NTKERNELAPI +VOID +FASTCALL +ExInitializeRundownProtection ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +VOID +FASTCALL +ExReInitializeRundownProtection ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExAcquireRundownProtection ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExAcquireRundownProtectionEx ( + IN PEX_RUNDOWN_REF RunRef, + IN ULONG Count +); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseRundownProtection ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseRundownProtectionEx ( + IN PEX_RUNDOWN_REF RunRef, + IN ULONG Count +); + +NTKERNELAPI +VOID +FASTCALL +ExRundownCompleted ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +VOID +FASTCALL +ExWaitForRundownProtectionRelease ( + IN PEX_RUNDOWN_REF RunRef +); + +#endif +#endif /* (VER_PRODUCTBUILD >= 2600) */ + + +#define FsRtlSetupAdvancedHeader( _advhdr, _fmutx ) \ +{ \ + SetFlag( (_advhdr)->Flags, FSRTL_FLAG_ADVANCED_HEADER ); \ + SetFlag( (_advhdr)->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS ); \ + (_advhdr)->Version = FSRTL_FCB_HEADER_V1; \ + InitializeListHead( &(_advhdr)->FilterContexts ); \ + if ((_fmutx) != NULL) { \ + (_advhdr)->FastMutex = (_fmutx); \ + } \ + *((PULONG_PTR)(&(_advhdr)->PushLock)) = 0; \ + /*ExInitializePushLock( &(_advhdr)->PushLock ); API Not avaliable downlevel*/\ + (_advhdr)->FileContextSupportPointer = NULL; \ +} + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddBaseMcbEntry ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddLargeMcbEntry ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddMcbEntry ( + IN PMCB Mcb, + IN VBN Vbn, + IN LBN Lbn, + IN ULONG SectorCount +); + +NTKERNELAPI +VOID +NTAPI +FsRtlAddToTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING ShortName, + IN PUNICODE_STRING LongName, + IN BOOLEAN KeyByShortName, + IN ULONG DataLength, + IN PVOID Data +); + NTKERNELAPI PVOID NTAPI @@ -9325,6 +8204,251 @@ FsRtlAllocatePoolWithTag ( IN ULONG Tag ); +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreNamesEqual ( + IN PCUNICODE_STRING Name1, + IN PCUNICODE_STRING Name2, + IN BOOLEAN IgnoreCase, + IN PCWCH UpcaseTable OPTIONAL +); + +#define FsRtlAreThereCurrentFileLocks(FL) ( \ + ((FL)->FastIoIsQuestionable) \ +) + +typedef +VOID +(NTAPI*POPLOCK_WAIT_COMPLETE_ROUTINE) ( + IN PVOID Context, + IN PIRP Irp +); + +typedef +VOID +(NTAPI*POPLOCK_FS_PREPOST_IRP) ( + IN PVOID Context, + IN PIRP Irp +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplock ( + IN POPLOCK Oplock, + IN PIRP Irp, + IN PVOID Context, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentBatchOplock ( + IN POPLOCK Oplock +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteKeyFromTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteTunnelCache ( + IN PTUNNEL Cache +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeregisterUncProvider ( + IN HANDLE Handle +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDissectDbcs ( + IN ANSI_STRING Name, + OUT PANSI_STRING FirstPart, + OUT PANSI_STRING RemainingPart +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDissectName ( + IN UNICODE_STRING Name, + OUT PUNICODE_STRING FirstPart, + OUT PUNICODE_STRING RemainingPart +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesDbcsContainWildCards ( + IN PANSI_STRING Name +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesNameContainWildCards ( + IN PUNICODE_STRING Name +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsFatDbcsLegal ( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible + ); + + +#define FsRtlCompleteRequest(IRP,STATUS) { \ + (IRP)->IoStatus.Status = (STATUS); \ + IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ +} + +#define FsRtlEnterFileSystem KeEnterCriticalRegion + +#define FsRtlExitFileSystem KeLeaveCriticalRegion + +#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ + FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ +) + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFindInTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING Name, + OUT PUNICODE_STRING ShortName, + OUT PUNICODE_STRING LongName, + IN OUT PULONG DataLength, + OUT PVOID Data +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextBaseMcbEntry ( + IN PBASE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextLargeMcbEntry ( + IN PLARGE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextMcbEntry ( + IN PMCB Mcb, + IN ULONG RunIndex, + OUT PVBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount +); + +#define FsRtlGetPerStreamContextPointer(FO) ( \ + (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ +) + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeBaseMcb ( + IN PBASE_MCB Mcb, + IN POOL_TYPE PoolType +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeLargeMcb ( + IN PLARGE_MCB Mcb, + IN POOL_TYPE PoolType +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeMcb ( + IN PMCB Mcb, + IN POOL_TYPE PoolType +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeOplock ( + IN OUT POPLOCK Oplock +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeTunnelCache ( + IN PTUNNEL Cache +); + +#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ + (PSC)->OwnerId = (O), \ + (PSC)->InstanceId = (I), \ + (PSC)->FreeCallback = (FC) \ +) + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerStreamContext ( + IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + IN PFSRTL_PER_STREAM_CONTEXT Ptr +); + +#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterWild(C) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ +) + NTKERNELAPI BOOLEAN NTAPI @@ -9335,6 +8459,142 @@ FsRtlIsFatDbcsLegal ( IN BOOLEAN LeadingBackslashPermissible ); +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsHpfsDbcsLegal ( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNameInExpression ( + IN PUNICODE_STRING Expression, + IN PUNICODE_STRING Name, + IN BOOLEAN IgnoreCase, + IN PWCHAR UpcaseTable OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNtstatusExpected ( + IN NTSTATUS Ntstatus +); + +#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo + +extern PUSHORT NlsOemLeadByteInfo; + +#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ + (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ + (NLS_MB_CODE_PAGE_TAG && \ + (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ +) + +#define FsRtlIsUnicodeCharacterWild(C) ( \ + (((C) >= 0x40) ? \ + FALSE : \ + FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ +) + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupBaseMcbEntry ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLargeMcbEntry ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntry ( + IN PBASE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntry ( + IN PLARGE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastMcbEntry ( + IN PMCB Mcb, + OUT PVBN Vbn, + OUT PLBN Lbn +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntryAndIndex ( + IN PBASE_MCB OpaqueMcb, + IN OUT PLONGLONG LargeVbn, + IN OUT PLONGLONG LargeLbn, + IN OUT PULONG Index +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntryAndIndex ( + IN PLARGE_MCB OpaqueMcb, + OUT PLONGLONG LargeVbn, + OUT PLONGLONG LargeLbn, + OUT PULONG Index +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupMcbEntry ( + IN PMCB Mcb, + IN VBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount OPTIONAL, + OUT PULONG Index +); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlLookupPerStreamContextInternal ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL +); + NTKERNELAPI BOOLEAN NTAPI @@ -9352,6 +8612,14 @@ FsRtlMdlWriteComplete ( IN PMDL MdlChain ); +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNormalizeNtstatus ( + IN NTSTATUS Exception, + IN NTSTATUS GenericException +); + NTKERNELAPI VOID NTAPI @@ -9365,6 +8633,306 @@ FsRtlNotifyChangeDirectory ( IN PIRP NotifyIrp ); +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanup ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext +); + +typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( + IN PVOID NotifyContext, + IN PVOID TargetContext, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterChangeDirectory ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, + IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterReportChange ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext, + IN PVOID FilterContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullChangeDirectory ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullReportChange ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyInitializeSync ( + IN PNOTIFY_SYNC *NotifySync +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyUninitializeSync ( + IN PNOTIFY_SYNC *NotifySync +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEvent ( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInBaseMcb ( + IN PBASE_MCB Mcb +); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInLargeMcb ( + IN PLARGE_MCB Mcb +); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInMcb ( + IN PMCB Mcb +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrl ( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsFastIoPossible ( + IN POPLOCK Oplock +); + +typedef VOID +(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( + IN PVOID Context, + IN PKEVENT Event +); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostPagingFileStackOverflow ( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine +); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostStackOverflow ( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRegisterUncProvider ( + IN OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirectorDeviceName, + IN BOOLEAN MailslotsSupported +); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveBaseMcbEntry ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount +); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveLargeMcbEntry ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount +); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveMcbEntry ( + IN PMCB Mcb, + IN VBN Vbn, + IN ULONG SectorCount +); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlRemovePerStreamContext ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetBaseMcb ( + IN PBASE_MCB Mcb +); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetLargeMcb ( + IN PLARGE_MCB Mcb, + IN BOOLEAN SelfSynchronized +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitBaseMcb ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitLargeMcb ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount +); + +#define FsRtlSupportsPerStreamContexts(FO) ( \ + (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ + FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ + FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ +) + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateBaseMcb ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn +); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateLargeMcb ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn +); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateMcb ( + IN PMCB Mcb, + IN VBN Vbn +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeBaseMcb ( + IN PBASE_MCB Mcb +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeLargeMcb ( + IN PLARGE_MCB Mcb +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeMcb ( + IN PMCB Mcb +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeOplock ( + IN OUT POPLOCK Oplock +); + NTKERNELAPI NTSTATUS NTAPI @@ -9401,6 +8969,23 @@ ObReferenceObjectByName ( OUT PVOID *Object ); +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +NTSTATUS +NTAPI +PsAssignImpersonationToken( + IN PETHREAD Thread, + IN HANDLE Token OPTIONAL); + +NTKERNELAPI +HANDLE +NTAPI +PsReferencePrimaryToken( + IN OUT PEPROCESS Process); + +#endif + #define PsDereferenceImpersonationToken(T) \ {if (ARGUMENT_PRESENT(T)) { \ (ObDereferenceObject((T))); \ @@ -9418,6 +9003,14 @@ PsLookupProcessThreadByCid ( OUT PETHREAD *Thread ); +NTSYSAPI +VOID +NTAPI +RtlSecondsSince1970ToTime ( + IN ULONG SecondsSince1970, + OUT PLARGE_INTEGER Time +); + NTSYSAPI NTSTATUS NTAPI @@ -9428,6 +9021,105 @@ RtlSetSaclSecurityDescriptor ( IN BOOLEAN SaclDefaulted ); +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeStringToCountedOemString ( + IN OUT POEM_STRING DestinationString, + IN PCUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString +); + +/* RTL Splay Tree Functions */ +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSplay(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlDelete(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +VOID +NTAPI +RtlDeleteNoSplay( + PRTL_SPLAY_LINKS Links, + PRTL_SPLAY_LINKS *Root +); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlRealSuccessor(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlRealPredecessor(PRTL_SPLAY_LINKS Links); + +#define RtlIsLeftChild(Links) \ + (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlIsRightChild(Links) \ + (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlRightChild(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->RightChild + +#define RtlIsRoot(Links) \ + (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlLeftChild(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->LeftChild + +#define RtlParent(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->Parent + +#define RtlInitializeSplayLinks(Links) \ + { \ + PRTL_SPLAY_LINKS _SplayLinks; \ + _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ + _SplayLinks->Parent = _SplayLinks; \ + _SplayLinks->LeftChild = NULL; \ + _SplayLinks->RightChild = NULL; \ + } + +#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \ + { \ + PRTL_SPLAY_LINKS _SplayParent; \ + PRTL_SPLAY_LINKS _SplayChild; \ + _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ + _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ + _SplayParent->LeftChild = _SplayChild; \ + _SplayChild->Parent = _SplayParent; \ + } + +#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \ + { \ + PRTL_SPLAY_LINKS _SplayParent; \ + PRTL_SPLAY_LINKS _SplayChild; \ + _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ + _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ + _SplayParent->RightChild = _SplayChild; \ + _SplayChild->Parent = _SplayParent; \ + } + +// +// RTL time functions +// + #define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports; #if (VER_PRODUCTBUILD >= 2195) @@ -9453,6 +9145,18 @@ ZwAlertThread ( IN HANDLE ThreadHandle ); +NTSYSAPI +NTSTATUS +NTAPI +ZwAllocateVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN OUT PSIZE_T RegionSize, + IN ULONG AllocationType, + IN ULONG Protect +); + NTSYSAPI NTSTATUS NTAPI @@ -9498,6 +9202,19 @@ ZwCloseObjectAuditAlarm ( IN BOOLEAN GenerateOnClose ); +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateSection ( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL +); + NTSYSAPI NTSTATUS NTAPI @@ -9508,6 +9225,71 @@ ZwCreateSymbolicLinkObject ( IN PUNICODE_STRING TargetName ); +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteFile ( + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteValueKey ( + IN HANDLE Handle, + IN PUNICODE_STRING Name +); + + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +NTSTATUS +NTAPI +ZwDeviceIoControlFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); +#endif + +NTSYSAPI +NTSTATUS +NTAPI +ZwDisplayString ( + IN PUNICODE_STRING String +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateObject ( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle OPTIONAL, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + IN ULONG Options +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateToken ( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle +); + NTSYSAPI NTSTATUS NTAPI @@ -9527,6 +9309,46 @@ ZwFlushBuffersFile( #if (VER_PRODUCTBUILD >= 2195) +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG FlushSize, + OUT PIO_STATUS_BLOCK IoStatusBlock +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwFreeVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + IN ULONG FreeType +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFsControlFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG FsControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength +); + +#if (VER_PRODUCTBUILD >= 2195) + NTSYSAPI NTSTATUS NTAPI @@ -9539,6 +9361,14 @@ ZwInitiatePowerAction ( #endif /* (VER_PRODUCTBUILD >= 2195) */ +NTSYSAPI +NTSTATUS +NTAPI +ZwLoadDriver ( + /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ + IN PUNICODE_STRING RegistryPath +); + NTSYSAPI NTSTATUS NTAPI @@ -9547,6 +9377,41 @@ ZwLoadKey ( IN POBJECT_ATTRIBUTES FileObjectAttributes ); +NTSYSAPI +NTSTATUS +NTAPI +ZwNotifyChangeKey ( + IN HANDLE KeyHandle, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG NotifyFilter, + IN BOOLEAN WatchSubtree, + IN PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN Asynchronous +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenDirectoryObject ( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcess ( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId OPTIONAL +); + NTSYSAPI NTSTATUS NTAPI @@ -9576,6 +9441,21 @@ ZwOpenThreadToken ( OUT PHANDLE TokenHandle ); +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwPowerInformation ( + IN POWER_INFORMATION_LEVEL PowerInformationLevel, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + NTSYSAPI NTSTATUS NTAPI @@ -9592,6 +9472,23 @@ ZwQueryDefaultLocale ( OUT PLCID Locale ); +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan +); + #if (VER_PRODUCTBUILD >= 2195) NTSYSAPI @@ -9607,6 +9504,21 @@ ZwQueryDirectoryObject ( OUT PULONG ReturnLength OPTIONAL ); +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryEaFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan +); + #endif /* (VER_PRODUCTBUILD >= 2195) */ NTSYSAPI @@ -9620,6 +9532,39 @@ ZwQueryInformationProcess ( OUT PULONG ReturnLength OPTIONAL ); +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationToken ( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG Length, + OUT PULONG ResultLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySecurityObject ( + IN HANDLE FileHandle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Length, + OUT PULONG ResultLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryVolumeInformationFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass +); + NTSYSAPI NTSTATUS NTAPI @@ -9675,8 +9620,26 @@ ZwSetDefaultUILanguage ( IN LANGID LanguageId ); +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEaFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length +); + #endif /* (VER_PRODUCTBUILD >= 2195) */ +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEvent ( + IN HANDLE EventHandle, + OUT PLONG PreviousState OPTIONAL +); + NTSYSAPI NTSTATUS NTAPI @@ -9687,6 +9650,19 @@ ZwSetInformationProcess ( IN ULONG ProcessInformationLength ); +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetSecurityObject ( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + NTSYSAPI NTSTATUS NTAPI @@ -9695,6 +9671,37 @@ ZwSetSystemTime ( OUT PLARGE_INTEGER OldTime OPTIONAL ); +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetVolumeInformationFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwTerminateProcess ( + IN HANDLE ProcessHandle OPTIONAL, + IN NTSTATUS ExitStatus +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnloadDriver ( + /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ + IN PUNICODE_STRING RegistryPath +); + NTSYSAPI NTSTATUS NTAPI @@ -9702,6 +9709,16 @@ ZwUnloadKey ( IN POBJECT_ATTRIBUTES KeyObjectAttributes ); +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForSingleObject ( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); +#endif + NTSYSAPI NTSTATUS NTAPI diff --git a/reactos/include/ddk/ntimage.h b/reactos/include/ddk/ntimage.h index 8df984763f7..e008a2daa94 100644 --- a/reactos/include/ddk/ntimage.h +++ b/reactos/include/ddk/ntimage.h @@ -394,33 +394,22 @@ typedef struct _IMAGE_NT_HEADERS64 { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; -} IMAGE_NT_HEADERS64; +} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; typedef struct _IMAGE_NT_HEADERS { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; -} IMAGE_NT_HEADERS32; +} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; #ifdef _WIN64 typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS; -#else -typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; -#endif - -#ifndef _NTDDK_ - -typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; -typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; - -#ifdef _WIN64 typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; #else +typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; #endif -#endif /* _NTDDK_ */ - // // Retreives the first image section header from the Nt Header // diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 3a523235742..ee2f034d5e1 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -38,26 +38,15 @@ #include #include #include -#include #ifndef GUID_DEFINED #include #endif -#ifdef _MAC -#ifndef _INC_STRING -#include -#endif /* _INC_STRING */ -#else -#include -#endif /* _MAC */ - #ifndef _KTMTYPES_ typedef GUID UOW, *PUOW; #endif -typedef GUID *PGUID; - #if (NTDDI_VERSION >= NTDDI_WINXP) #include #endif @@ -144,6 +133,8 @@ struct _IO_RESOURCE_DESCRIPTOR; typedef struct _OBJECT_TYPE *POBJECT_TYPE; typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; +typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; +typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; typedef struct _EPROCESS *PEPROCESS; typedef struct _ETHREAD *PETHREAD; @@ -153,42 +144,6 @@ typedef struct _KPROCESS *PKPROCESS; typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; typedef struct _CONTEXT *PCONTEXT; -#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && ( defined(_NTDDK_) || defined(_NTDRIVER_) || defined(_NTOSP_)) -typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; -#elif defined(_WDM_INCLUDED_) -typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; -#else -typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; -#endif - -#ifndef DEFINE_GUIDEX -#ifdef _MSC_VER -#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name -#else -#define DEFINE_GUIDEX(name) EXTERN_C const GUID name -#endif -#endif /* DEFINE_GUIDEX */ - -#ifndef STATICGUIDOF -#define STATICGUIDOF(guid) STATIC_##guid -#endif - -/* GUID Comparison */ -#ifndef __IID_ALIGNED__ -#define __IID_ALIGNED__ -#ifdef __cplusplus -inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) -{ - return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && - (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); -} -#else -#define IsEqualGUIDAligned(guid1, guid2) \ - ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ - (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) -#endif /* __cplusplus */ -#endif /* !__IID_ALIGNED__ */ - /****************************************************************************** * INTERLOCKED Functions * @@ -527,29 +482,17 @@ typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32; #endif /* _SLIST_HEADER_ */ -/* MS definition is broken! */ -extern BOOLEAN NTSYSAPI NlsMbCodePageTag; -extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag; + +/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */ +#if defined(_NTSYSTEM_) || defined(__GNUC__) #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag - -#define SHORT_LEAST_SIGNIFICANT_BIT 0 -#define SHORT_MOST_SIGNIFICANT_BIT 1 - -#define LONG_LEAST_SIGNIFICANT_BIT 0 -#define LONG_3RD_MOST_SIGNIFICANT_BIT 1 -#define LONG_2ND_MOST_SIGNIFICANT_BIT 2 -#define LONG_MOST_SIGNIFICANT_BIT 3 - -#define RTLVERLIB_DDI(x) Wdmlib##x - -typedef BOOLEAN -(*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)( - IN ULONG Version); - -typedef BOOLEAN -(*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)( - IN ULONG Version); +#else +#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag) +#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag) +#endif /* _NT_SYSTEM */ +extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG; +extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG; /****************************************************************************** @@ -560,116 +503,18 @@ typedef UCHAR KIRQL, *PKIRQL; typedef CCHAR KPROCESSOR_MODE; typedef LONG KPRIORITY; +typedef ULONG EXECUTION_STATE; + typedef enum _MODE { KernelMode, UserMode, MaximumMode } MODE; -#define CACHE_FULLY_ASSOCIATIVE 0xFF -#define MAXIMUM_SUSPEND_COUNT MAXCHAR - -#define EVENT_QUERY_STATE (0x0001) -#define EVENT_MODIFY_STATE (0x0002) -#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -#define LTP_PC_SMT 0x1 - #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS) #define SINGLE_GROUP_LEGACY_API 1 #endif -#define SEMAPHORE_QUERY_STATE (0x0001) -#define SEMAPHORE_MODIFY_STATE (0x0002) -#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { - RelationProcessorCore, - RelationNumaNode, - RelationCache, - RelationProcessorPackage, - RelationGroup, - RelationAll = 0xffff -} LOGICAL_PROCESSOR_RELATIONSHIP; - -typedef enum _PROCESSOR_CACHE_TYPE { - CacheUnified, - CacheInstruction, - CacheData, - CacheTrace -} PROCESSOR_CACHE_TYPE; - -typedef struct _CACHE_DESCRIPTOR { - UCHAR Level; - UCHAR Associativity; - USHORT LineSize; - ULONG Size; - PROCESSOR_CACHE_TYPE Type; -} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; - -typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { - ULONG_PTR ProcessorMask; - LOGICAL_PROCESSOR_RELATIONSHIP Relationship; - union { - struct { - UCHAR Flags; - } ProcessorCore; - struct { - ULONG NodeNumber; - } NumaNode; - CACHE_DESCRIPTOR Cache; - ULONGLONG Reserved[2]; - } DUMMYUNIONNAME; -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; - -typedef struct _PROCESSOR_RELATIONSHIP { - UCHAR Flags; - UCHAR Reserved[21]; - USHORT GroupCount; - GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; -} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; - -typedef struct _NUMA_NODE_RELATIONSHIP { - ULONG NodeNumber; - UCHAR Reserved[20]; - GROUP_AFFINITY GroupMask; -} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; - -typedef struct _CACHE_RELATIONSHIP { - UCHAR Level; - UCHAR Associativity; - USHORT LineSize; - ULONG CacheSize; - PROCESSOR_CACHE_TYPE Type; - UCHAR Reserved[20]; - GROUP_AFFINITY GroupMask; -} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; - -typedef struct _PROCESSOR_GROUP_INFO { - UCHAR MaximumProcessorCount; - UCHAR ActiveProcessorCount; - UCHAR Reserved[38]; - KAFFINITY ActiveProcessorMask; -} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; - -typedef struct _GROUP_RELATIONSHIP { - USHORT MaximumGroupCount; - USHORT ActiveGroupCount; - UCHAR Reserved[20]; - PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY]; -} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; - -typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { - LOGICAL_PROCESSOR_RELATIONSHIP Relationship; - ULONG Size; - union { - PROCESSOR_RELATIONSHIP Processor; - NUMA_NODE_RELATIONSHIP NumaNode; - CACHE_RELATIONSHIP Cache; - GROUP_RELATIONSHIP Group; - } DUMMYUNIONNAME; -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;; - /* Processor features */ #define PF_FLOATING_POINT_PRECISION_ERRATA 0 #define PF_FLOATING_POINT_EMULATED 1 @@ -690,6 +535,7 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { #define PF_CHANNELS_ENABLED 16 #define PF_XSAVE_ENABLED 17 +#define MAXIMUM_SUPPORTED_EXTENSION 512 #define MAXIMUM_WAIT_OBJECTS 64 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject) @@ -757,23 +603,6 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { #define EXCEPTION_NONCONTINUABLE 1 #define EXCEPTION_MAXIMUM_PARAMETERS 15 -#define EXCEPTION_DIVIDED_BY_ZERO 0 -#define EXCEPTION_DEBUG 1 -#define EXCEPTION_NMI 2 -#define EXCEPTION_INT3 3 -#define EXCEPTION_BOUND_CHECK 5 -#define EXCEPTION_INVALID_OPCODE 6 -#define EXCEPTION_NPX_NOT_AVAILABLE 7 -#define EXCEPTION_DOUBLE_FAULT 8 -#define EXCEPTION_NPX_OVERRUN 9 -#define EXCEPTION_INVALID_TSS 0x0A -#define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B -#define EXCEPTION_STACK_FAULT 0x0C -#define EXCEPTION_GP_FAULT 0x0D -#define EXCEPTION_RESERVED_TRAP 0x0F -#define EXCEPTION_NPX_ERROR 0x010 -#define EXCEPTION_ALIGNMENT_CHECK 0x011 - typedef struct _EXCEPTION_RECORD { NTSTATUS ExceptionCode; ULONG ExceptionFlags; @@ -825,42 +654,6 @@ typedef VOID IN ULONG ReasonSpecificDataLength); typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE; -typedef struct _KBUGCHECK_ADD_PAGES { - IN OUT PVOID Context; - IN OUT ULONG Flags; - IN ULONG BugCheckCode; - OUT ULONG_PTR Address; - OUT ULONG_PTR Count; -} KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES; - -typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA { - IN PVOID InBuffer; - IN ULONG InBufferLength; - IN ULONG MaximumAllowed; - OUT GUID Guid; - OUT PVOID OutBuffer; - OUT ULONG OutBufferLength; -} KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA; - -typedef enum _KBUGCHECK_DUMP_IO_TYPE { - KbDumpIoInvalid, - KbDumpIoHeader, - KbDumpIoBody, - KbDumpIoSecondaryData, - KbDumpIoComplete -} KBUGCHECK_DUMP_IO_TYPE; - -typedef struct _KBUGCHECK_DUMP_IO { - IN ULONG64 Offset; - IN PVOID Buffer; - IN ULONG BufferLength; - IN KBUGCHECK_DUMP_IO_TYPE Type; -} KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO; - -#define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL -#define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL -#define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL - typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD { LIST_ENTRY Entry; PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine; @@ -900,31 +693,20 @@ typedef BOOLEAN IN BOOLEAN Handled); typedef NMI_CALLBACK *PNMI_CALLBACK; -typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE { - KeProcessorAddStartNotify = 0, - KeProcessorAddCompleteNotify, - KeProcessorAddFailureNotify -} KE_PROCESSOR_CHANGE_NOTIFY_STATE; - -typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT { - KE_PROCESSOR_CHANGE_NOTIFY_STATE State; - ULONG NtNumber; - NTSTATUS Status; -#if (NTDDI_VERSION >= NTDDI_WIN7) - PROCESSOR_NUMBER ProcNumber; -#endif -} KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT; - -typedef VOID -(NTAPI PROCESSOR_CALLBACK_FUNCTION)( - IN PVOID CallbackContext, - IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, - IN OUT PNTSTATUS OperationStatus); -typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION; - -#define KE_PROCESSOR_CHANGE_ADD_EXISTING 1 - -#define INVALID_PROCESSOR_INDEX 0xffffffff +typedef enum _TRACE_INFORMATION_CLASS { + TraceIdClass, + TraceHandleClass, + TraceEnableFlagsClass, + TraceEnableLevelClass, + GlobalLoggerHandleClass, + EventLoggerHandleClass, + AllLoggerHandlesClass, + TraceHandleByNameClass, + LoggerEventsLostClass, + TraceSessionSettingsClass, + LoggerEventsLoggedClass, + MaxTraceInformationClass +} TRACE_INFORMATION_CLASS; typedef enum _KINTERRUPT_POLARITY { InterruptPolarityUnknown, @@ -1021,32 +803,36 @@ typedef enum _KINTERRUPT_MODE { #define THREAD_WAIT_OBJECTS 3 -typedef VOID -(NTAPI KSTART_ROUTINE)( - IN PVOID StartContext); -typedef KSTART_ROUTINE *PKSTART_ROUTINE; - typedef VOID (NTAPI *PKINTERRUPT_ROUTINE)( VOID); -typedef BOOLEAN -(NTAPI KSERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext); -typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; - -typedef BOOLEAN -(NTAPI KMESSAGE_SERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext, - IN ULONG MessageID); -typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE; - typedef enum _KD_OPTION { KD_OPTION_SET_BLOCK_ENABLE, } KD_OPTION; +typedef enum _INTERFACE_TYPE { + InterfaceTypeUndefined = -1, + Internal, + Isa, + Eisa, + MicroChannel, + TurboChannel, + PCIBus, + VMEBus, + NuBus, + PCMCIABus, + CBus, + MPIBus, + MPSABus, + ProcessorInternal, + InternalPowerBus, + PNPISABus, + PNPBus, + Vmcs, + MaximumInterfaceType +} INTERFACE_TYPE, *PINTERFACE_TYPE; + typedef VOID (NTAPI *PKNORMAL_ROUTINE)( IN PVOID NormalContext OPTIONAL, @@ -1084,14 +870,6 @@ typedef struct _KAPC { BOOLEAN Inserted; } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; -#define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0) -#define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1) -#define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0) -#define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1) -#define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2) -#define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex) -#define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN)) - typedef struct _KDEVICE_QUEUE_ENTRY { LIST_ENTRY DeviceListEntry; ULONG SortKey; @@ -1108,27 +886,10 @@ typedef VOID IN PVOID Parameter2 OPTIONAL, IN PVOID Parameter3 OPTIONAL); -typedef struct _KIPI_COUNTS { - ULONG Freeze; - ULONG Packet; - ULONG DPC; - ULONG APC; - ULONG FlushSingleTb; - ULONG FlushMultipleTb; - ULONG FlushEntireTb; - ULONG GenericCall; - ULONG ChangeColor; - ULONG SweepDcache; - ULONG SweepIcache; - ULONG SweepIcacheRange; - ULONG FlushIoBuffers; - ULONG GratuitousDPC; -} KIPI_COUNTS, *PKIPI_COUNTS; - -typedef ULONG_PTR -(NTAPI KIPI_BROADCAST_WORKER)( +typedef +ULONG_PTR +(NTAPI *PKIPI_BROADCAST_WORKER)( IN ULONG_PTR Argument); -typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; @@ -1327,8 +1088,6 @@ typedef struct _KSEMAPHORE { LONG Limit; } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; -#define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG)) - typedef struct _KGATE { DISPATCHER_HEADER Header; } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE; @@ -1369,14 +1128,6 @@ typedef struct _KTIMER { ULONG Period; } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; -typedef enum _LOCK_OPERATION { - IoReadAccess, - IoWriteAccess, - IoModifyAccess -} LOCK_OPERATION; - -#define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)) - typedef BOOLEAN (NTAPI *PKSYNCHRONIZE_ROUTINE)( IN PVOID SynchronizeContext); @@ -1405,32 +1156,19 @@ typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE { EndAlternatives } ALTERNATIVE_ARCHITECTURE_TYPE; -#ifndef _X86_ - -#ifndef IsNEC_98 -#define IsNEC_98 (FALSE) -#endif - -#ifndef IsNotNEC_98 -#define IsNotNEC_98 (TRUE) -#endif - -#ifndef SetNEC_98 -#define SetNEC_98 -#endif - -#ifndef SetNotNEC_98 -#define SetNotNEC_98 -#endif - -#endif - -typedef struct _KSYSTEM_TIME { +typedef struct _KSYSTEM_TIME +{ ULONG LowPart; LONG High1Time; LONG High2Time; } KSYSTEM_TIME, *PKSYSTEM_TIME; +typedef struct _PNP_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; + typedef struct DECLSPEC_ALIGN(16) _M128A { ULONGLONG Low; LONGLONG High; @@ -1462,104 +1200,12 @@ typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { #endif } XSAVE_FORMAT, *PXSAVE_FORMAT; -typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER { - ULONG64 Mask; - ULONG64 Reserved[7]; -} XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER; - -typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA { - XSAVE_FORMAT LegacyState; - XSAVE_AREA_HEADER Header; -} XSAVE_AREA, *PXSAVE_AREA; - -typedef struct _XSTATE_CONTEXT { - ULONG64 Mask; - ULONG Length; - ULONG Reserved1; - PXSAVE_AREA Area; -#if defined(_X86_) - ULONG Reserved2; -#endif - PVOID Buffer; -#if defined(_X86_) - ULONG Reserved3; -#endif -} XSTATE_CONTEXT, *PXSTATE_CONTEXT; - -typedef struct _XSTATE_SAVE { -#if defined(_AMD64_) - struct _XSTATE_SAVE* Prev; - struct _KTHREAD* Thread; - UCHAR Level; - XSTATE_CONTEXT XStateContext; -#elif defined(_IA64_) - ULONG Dummy; -#elif defined(_X86_) - union { - struct { - LONG64 Reserved1; - ULONG Reserved2; - struct _XSTATE_SAVE* Prev; - PXSAVE_AREA Reserved3; - struct _KTHREAD* Thread; - PVOID Reserved4; - UCHAR Level; - }; - XSTATE_CONTEXT XStateContext; - }; -#endif -} XSTATE_SAVE, *PXSTATE_SAVE; - -#ifdef _X86_ - -#define MAXIMUM_SUPPORTED_EXTENSION 512 - -#if !defined(__midl) && !defined(MIDL_PASS) -C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION); -#endif - -#endif /* _X86_ */ - -#define XSAVE_ALIGN 64 -#define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA) - -#if !defined(__midl) && !defined(MIDL_PASS) -C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0); -C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0); -C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64); -#endif - -typedef struct _CONTEXT_CHUNK { - LONG Offset; - ULONG Length; -} CONTEXT_CHUNK, *PCONTEXT_CHUNK; - -typedef struct _CONTEXT_EX { - CONTEXT_CHUNK All; - CONTEXT_CHUNK Legacy; - CONTEXT_CHUNK XState; -} CONTEXT_EX, *PCONTEXT_EX; - -#define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN) - -#if (NTDDI_VERSION >= NTDDI_VISTA) -extern NTSYSAPI volatile CCHAR KeNumberProcessors; -#elif (NTDDI_VERSION >= NTDDI_WINXP) -extern NTSYSAPI CCHAR KeNumberProcessors; -#else -extern PCCHAR KeNumberProcessors; -#endif /****************************************************************************** * Memory manager Types * ******************************************************************************/ -#if (NTDDI_VERSION >= NTDDI_WIN2K) -typedef ULONG NODE_REQUIREMENT; -#define MM_ANY_NODE_OK 0x80000000 -#endif - #define MM_DONT_ZERO_ALLOCATION 0x00000001 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004 @@ -1688,6 +1334,12 @@ typedef enum _MM_PAGE_PRIORITY { HighPagePriority = 32 } MM_PAGE_PRIORITY; +typedef enum _LOCK_OPERATION { + IoReadAccess, + IoWriteAccess, + IoModifyAccess +} LOCK_OPERATION; + typedef enum _MM_SYSTEM_SIZE { MmSmallSystem, MmMediumSystem, @@ -1706,6 +1358,12 @@ extern PVOID MmBadPointer; #define EX_RUNDOWN_COUNT_SHIFT 0x1 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT) +#ifdef _WIN64 +#define PORT_MAXIMUM_MESSAGE_LENGTH 512 +#else +#define PORT_MAXIMUM_MESSAGE_LENGTH 256 +#endif + typedef struct _FAST_MUTEX { volatile LONG Count; PKTHREAD Owner; @@ -1877,13 +1535,6 @@ typedef struct _EX_RUNDOWN_REF { typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE; -typedef enum _WORK_QUEUE_TYPE { - CriticalWorkQueue, - DelayedWorkQueue, - HyperCriticalWorkQueue, - MaximumWorkQueue -} WORK_QUEUE_TYPE; - typedef VOID (NTAPI WORKER_THREAD_ROUTINE)( IN PVOID Parameter); @@ -1895,78 +1546,6 @@ typedef struct _WORK_QUEUE_ITEM { volatile PVOID Parameter; } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; -typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; - -typedef struct _OWNER_ENTRY { - ERESOURCE_THREAD OwnerThread; - union { - struct { - ULONG IoPriorityBoosted:1; - ULONG OwnerReferenced:1; - ULONG OwnerCount:30; - }; - ULONG TableSize; - }; -} OWNER_ENTRY, *POWNER_ENTRY; - -typedef struct _ERESOURCE { - LIST_ENTRY SystemResourcesList; - POWNER_ENTRY OwnerTable; - SHORT ActiveCount; - USHORT Flag; - volatile PKSEMAPHORE SharedWaiters; - volatile PKEVENT ExclusiveWaiters; - OWNER_ENTRY OwnerEntry; - ULONG ActiveEntries; - ULONG ContentionCount; - ULONG NumberOfSharedWaiters; - ULONG NumberOfExclusiveWaiters; -#if defined(_WIN64) - PVOID Reserved2; -#endif - __GNU_EXTENSION union { - PVOID Address; - ULONG_PTR CreatorBackTraceIndex; - }; - KSPIN_LOCK SpinLock; -} ERESOURCE, *PERESOURCE; - -/* ERESOURCE.Flag */ -#define ResourceNeverExclusive 0x0010 -#define ResourceReleaseByOtherThread 0x0020 -#define ResourceOwnedExclusive 0x0080 - -#define RESOURCE_HASH_TABLE_SIZE 64 - -typedef struct _RESOURCE_HASH_ENTRY { - LIST_ENTRY ListEntry; - PVOID Address; - ULONG ContentionCount; - ULONG Number; -} RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY; - -typedef struct _RESOURCE_PERFORMANCE_DATA { - ULONG ActiveResourceCount; - ULONG TotalResourceCount; - ULONG ExclusiveAcquire; - ULONG SharedFirstLevel; - ULONG SharedSecondLevel; - ULONG StarveFirstLevel; - ULONG StarveSecondLevel; - ULONG WaitForExclusive; - ULONG OwnerTableExpands; - ULONG MaximumTableExpand; - LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE]; -} RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA; - -/* Global debug flag */ -#if DEVL -extern ULONG NtGlobalFlag; -#define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName)) -#else -#define IF_NTOS_DEBUG(FlagName) if(FALSE) -#endif - /****************************************************************************** * Security Manager Types * @@ -2393,144 +1972,6 @@ typedef enum _POWER_STATE_TYPE { DevicePowerState } POWER_STATE_TYPE, *PPOWER_STATE_TYPE; -#if (NTDDI_VERSION >= NTDDI_VISTA) -typedef struct _SYSTEM_POWER_STATE_CONTEXT { - union { - struct { - ULONG Reserved1:8; - ULONG TargetSystemState:4; - ULONG EffectiveSystemState:4; - ULONG CurrentSystemState:4; - ULONG IgnoreHibernationPath:1; - ULONG PseudoTransition:1; - ULONG Reserved2:10; - } DUMMYSTRUCTNAME; - ULONG ContextAsUlong; - } DUMMYUNIONNAME; -} SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT; -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) -typedef struct _COUNTED_REASON_CONTEXT { - ULONG Version; - ULONG Flags; - union { - struct { - UNICODE_STRING ResourceFileName; - USHORT ResourceReasonId; - ULONG StringCount; - PUNICODE_STRING ReasonStrings; - } DUMMYSTRUCTNAME; - UNICODE_STRING SimpleString; - } DUMMYUNIONNAME; -} COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT; -#endif - -#define IOCTL_QUERY_DEVICE_POWER_STATE \ - CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS) - -#define IOCTL_SET_DEVICE_WAKE \ - CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS) - -#define IOCTL_CANCEL_DEVICE_WAKE \ - CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS) - -#define ES_SYSTEM_REQUIRED 0x00000001 -#define ES_DISPLAY_REQUIRED 0x00000002 -#define ES_USER_PRESENT 0x00000004 -#define ES_CONTINUOUS 0x80000000 - -typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE; - -typedef enum { - LT_DONT_CARE, - LT_LOWEST_LATENCY -} LATENCY_TIME; - -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) -#define DIAGNOSTIC_REASON_VERSION 0 -#define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001 -#define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002 -#define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000 -#define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003) -#endif - -#define POWER_REQUEST_CONTEXT_VERSION 0 -#define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001 -#define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002 - -#define PowerRequestMaximum 3 - -typedef enum _POWER_REQUEST_TYPE { - PowerRequestDisplayRequired, - PowerRequestSystemRequired, - PowerRequestAwayModeRequired -} POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE; - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -#define PDCAP_D0_SUPPORTED 0x00000001 -#define PDCAP_D1_SUPPORTED 0x00000002 -#define PDCAP_D2_SUPPORTED 0x00000004 -#define PDCAP_D3_SUPPORTED 0x00000008 -#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 -#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 -#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 -#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 -#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 - -typedef struct CM_Power_Data_s { - ULONG PD_Size; - DEVICE_POWER_STATE PD_MostRecentPowerState; - ULONG PD_Capabilities; - ULONG PD_D1Latency; - ULONG PD_D2Latency; - ULONG PD_D3Latency; - DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; - SYSTEM_POWER_STATE PD_DeepestSystemWake; -} CM_POWER_DATA, *PCM_POWER_DATA; - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -typedef enum _SYSTEM_POWER_CONDITION { - PoAc, - PoDc, - PoHot, - PoConditionMaximum -} SYSTEM_POWER_CONDITION; - -typedef struct _SET_POWER_SETTING_VALUE { - ULONG Version; - GUID Guid; - SYSTEM_POWER_CONDITION PowerCondition; - ULONG DataLength; - UCHAR Data[ANYSIZE_ARRAY]; -} SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE; - -#define POWER_SETTING_VALUE_VERSION (0x1) - -typedef struct _NOTIFY_USER_POWER_SETTING { - GUID Guid; -} NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING; - -typedef struct _APPLICATIONLAUNCH_SETTING_VALUE { - LARGE_INTEGER ActivationTime; - ULONG Flags; - ULONG ButtonInstanceID; -} APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE; - -typedef enum _POWER_PLATFORM_ROLE { - PlatformRoleUnspecified = 0, - PlatformRoleDesktop, - PlatformRoleMobile, - PlatformRoleWorkstation, - PlatformRoleEnterpriseServer, - PlatformRoleSOHOServer, - PlatformRoleAppliancePC, - PlatformRolePerformanceServer, - PlatformRoleMaximum -} POWER_PLATFORM_ROLE; - #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) typedef struct { ULONG Granularity; @@ -2684,6 +2125,12 @@ NTSTATUS IN OUT PVOID Context OPTIONAL); typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; +#define PO_CB_SYSTEM_POWER_POLICY 0 +#define PO_CB_AC_STATUS 1 +#define PO_CB_BUTTON_COLLISION 2 +#define PO_CB_SYSTEM_STATE_LOCK 3 +#define PO_CB_LID_SWITCH_STATE 4 +#define PO_CB_PROCESSOR_POWER_POLICY 5 /****************************************************************************** * Configuration Manager Types * @@ -2775,15 +2222,6 @@ typedef int CM_RESOURCE_TYPE; REG_OPTION_BACKUP_RESTORE |\ REG_OPTION_OPEN_LINK) -#define REG_OPEN_LEGAL_OPTION \ - (REG_OPTION_RESERVED |\ - REG_OPTION_BACKUP_RESTORE |\ - REG_OPTION_OPEN_LINK) - -#define REG_STANDARD_FORMAT 1 -#define REG_LATEST_FORMAT 2 -#define REG_NO_COMPRESSION 4 - /* Key creation/open disposition */ #define REG_CREATED_NEW_KEY (0x00000001L) #define REG_OPENED_EXISTING_KEY (0x00000002L) @@ -2816,6 +2254,27 @@ typedef int CM_RESOURCE_TYPE; REG_NOTIFY_CHANGE_LAST_SET |\ REG_NOTIFY_CHANGE_SECURITY) +typedef struct _CM_FLOPPY_DEVICE_DATA { + USHORT Version; + USHORT Revision; + CHAR Size[8]; + ULONG MaxDensity; + ULONG MountDensity; + UCHAR StepRateHeadUnloadTime; + UCHAR HeadLoadTime; + UCHAR MotorOffTime; + UCHAR SectorLengthCode; + UCHAR SectorPerTrack; + UCHAR ReadWriteGapLength; + UCHAR DataTransferLength; + UCHAR FormatGapLength; + UCHAR FormatFillCharacter; + UCHAR HeadSettleTime; + UCHAR MotorSettleTime; + UCHAR MaximumTrackValue; + UCHAR DataTransferRate; +} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; + #include typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { UCHAR Type; @@ -2982,50 +2441,6 @@ typedef enum _CM_SHARE_DISPOSITION { #define CM_RESOURCE_DMA_TYPE_B 0x0020 #define CM_RESOURCE_DMA_TYPE_F 0x0040 -typedef struct _DEVICE_FLAGS { - ULONG Failed:1; - ULONG ReadOnly:1; - ULONG Removable:1; - ULONG ConsoleIn:1; - ULONG ConsoleOut:1; - ULONG Input:1; - ULONG Output:1; -} DEVICE_FLAGS, *PDEVICE_FLAGS; - -typedef enum _INTERFACE_TYPE { - InterfaceTypeUndefined = -1, - Internal, - Isa, - Eisa, - MicroChannel, - TurboChannel, - PCIBus, - VMEBus, - NuBus, - PCMCIABus, - CBus, - MPIBus, - MPSABus, - ProcessorInternal, - InternalPowerBus, - PNPISABus, - PNPBus, - Vmcs, - MaximumInterfaceType -} INTERFACE_TYPE, *PINTERFACE_TYPE; - -typedef struct _CM_COMPONENT_INFORMATION { - DEVICE_FLAGS Flags; - ULONG Version; - ULONG Key; - KAFFINITY AffinityMask; -} CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION; - -typedef struct _CM_ROM_BLOCK { - ULONG Address; - ULONG Size; -} CM_ROM_BLOCK, *PCM_ROM_BLOCK; - typedef struct _CM_PARTIAL_RESOURCE_LIST { USHORT Version; USHORT Revision; @@ -3044,12 +2459,6 @@ typedef struct _CM_RESOURCE_LIST { CM_FULL_RESOURCE_DESCRIPTOR List[1]; } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; -typedef struct _PNP_BUS_INFORMATION { - GUID BusTypeGuid; - INTERFACE_TYPE LegacyBusType; - ULONG BusNumber; -} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; - #include typedef struct _CM_INT13_DRIVE_PARAMETER { @@ -3060,14 +2469,6 @@ typedef struct _CM_INT13_DRIVE_PARAMETER { USHORT NumberDrives; } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; -typedef struct _CM_MCA_POS_DATA { - USHORT AdapterId; - UCHAR PosData1; - UCHAR PosData2; - UCHAR PosData3; - UCHAR PosData4; -} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; - typedef struct _CM_PNP_BIOS_DEVICE_NODE { USHORT Size; UCHAR Node; @@ -3109,82 +2510,50 @@ typedef struct _CM_KEYBOARD_DEVICE_DATA { USHORT KeyboardFlags; } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; +typedef struct _CM_MCA_POS_DATA { + USHORT AdapterId; + UCHAR PosData1; + UCHAR PosData2; + UCHAR PosData3; + UCHAR PosData4; +} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; + +#if (NTDDI_VERSION >= NTDDI_WINXP) +typedef struct CM_Power_Data_s { + ULONG PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + ULONG PD_Capabilities; + ULONG PD_D1Latency; + ULONG PD_D2Latency; + ULONG PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; + SYSTEM_POWER_STATE PD_DeepestSystemWake; +} CM_POWER_DATA, *PCM_POWER_DATA; + +#define PDCAP_D0_SUPPORTED 0x00000001 +#define PDCAP_D1_SUPPORTED 0x00000002 +#define PDCAP_D2_SUPPORTED 0x00000004 +#define PDCAP_D3_SUPPORTED 0x00000008 +#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 +#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 +#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 +#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 +#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + typedef struct _CM_SCSI_DEVICE_DATA { USHORT Version; USHORT Revision; UCHAR HostIdentifier; } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; -typedef struct _CM_VIDEO_DEVICE_DATA { - USHORT Version; - USHORT Revision; - ULONG VideoClock; -} CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA; - -typedef struct _CM_SONIC_DEVICE_DATA { - USHORT Version; - USHORT Revision; - USHORT DataConfigurationRegister; - UCHAR EthernetAddress[8]; -} CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA; - typedef struct _CM_SERIAL_DEVICE_DATA { USHORT Version; USHORT Revision; ULONG BaudClock; } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; -typedef struct _CM_MONITOR_DEVICE_DATA { - USHORT Version; - USHORT Revision; - USHORT HorizontalScreenSize; - USHORT VerticalScreenSize; - USHORT HorizontalResolution; - USHORT VerticalResolution; - USHORT HorizontalDisplayTimeLow; - USHORT HorizontalDisplayTime; - USHORT HorizontalDisplayTimeHigh; - USHORT HorizontalBackPorchLow; - USHORT HorizontalBackPorch; - USHORT HorizontalBackPorchHigh; - USHORT HorizontalFrontPorchLow; - USHORT HorizontalFrontPorch; - USHORT HorizontalFrontPorchHigh; - USHORT HorizontalSyncLow; - USHORT HorizontalSync; - USHORT HorizontalSyncHigh; - USHORT VerticalBackPorchLow; - USHORT VerticalBackPorch; - USHORT VerticalBackPorchHigh; - USHORT VerticalFrontPorchLow; - USHORT VerticalFrontPorch; - USHORT VerticalFrontPorchHigh; - USHORT VerticalSyncLow; - USHORT VerticalSync; - USHORT VerticalSyncHigh; -} CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA; - -typedef struct _CM_FLOPPY_DEVICE_DATA { - USHORT Version; - USHORT Revision; - CHAR Size[8]; - ULONG MaxDensity; - ULONG MountDensity; - UCHAR StepRateHeadUnloadTime; - UCHAR HeadLoadTime; - UCHAR MotorOffTime; - UCHAR SectorLengthCode; - UCHAR SectorPerTrack; - UCHAR ReadWriteGapLength; - UCHAR DataTransferLength; - UCHAR FormatGapLength; - UCHAR FormatFillCharacter; - UCHAR HeadSettleTime; - UCHAR MotorSettleTime; - UCHAR MaximumTrackValue; - UCHAR DataTransferRate; -} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; - typedef enum _KEY_INFORMATION_CLASS { KeyBasicInformation, KeyNodeInformation, @@ -3204,10 +2573,6 @@ typedef struct _KEY_BASIC_INFORMATION { WCHAR Name[1]; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; -typedef struct _KEY_CONTROL_FLAGS_INFORMATION { - ULONG ControlFlags; -} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION; - typedef struct _KEY_FULL_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -3222,10 +2587,6 @@ typedef struct _KEY_FULL_INFORMATION { WCHAR Class[1]; } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; -typedef struct _KEY_HANDLE_TAGS_INFORMATION { - ULONG HandleTags; -} KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION; - typedef struct _KEY_NODE_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -3235,23 +2596,6 @@ typedef struct _KEY_NODE_INFORMATION { WCHAR Name[1]; } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; -typedef enum _KEY_SET_INFORMATION_CLASS { - KeyWriteTimeInformation, - KeyWow64FlagsInformation, - KeyControlFlagsInformation, - KeySetVirtualizationInformation, - KeySetDebugInformation, - KeySetHandleTagsInformation, - MaxKeySetInfoClass -} KEY_SET_INFORMATION_CLASS; - -typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION { - ULONG VirtualTarget:1; - ULONG VirtualStore:1; - ULONG VirtualSource:1; - ULONG Reserved:29; -} KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION; - typedef struct _KEY_VALUE_BASIC_INFORMATION { ULONG TitleIndex; ULONG Type; @@ -3296,14 +2640,20 @@ typedef enum _KEY_VALUE_INFORMATION_CLASS { KeyValuePartialInformationAlign64 } KEY_VALUE_INFORMATION_CLASS; -typedef struct _KEY_WOW64_FLAGS_INFORMATION { - ULONG UserFlags; -} KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION; - typedef struct _KEY_WRITE_TIME_INFORMATION { LARGE_INTEGER LastWriteTime; } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; +typedef enum _KEY_SET_INFORMATION_CLASS { + KeyWriteTimeInformation, + KeyWow64FlagsInformation, + KeyControlFlagsInformation, + KeySetVirtualizationInformation, + KeySetDebugInformation, + KeySetHandleTagsInformation, + MaxKeySetInfoClass +} KEY_SET_INFORMATION_CLASS; + typedef enum _REG_NOTIFY_CLASS { RegNtDeleteKey, RegNtPreDeleteKey = RegNtDeleteKey, @@ -3473,54 +2823,6 @@ typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION { PVOID Reserved; } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION; -typedef struct _REG_RENAME_KEY_INFORMATION { - PVOID Object; - PUNICODE_STRING NewName; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION; - -typedef struct _REG_CREATE_KEY_INFORMATION { - PUNICODE_STRING CompleteName; - PVOID RootObject; - PVOID ObjectType; - ULONG CreateOptions; - PUNICODE_STRING Class; - PVOID SecurityDescriptor; - PVOID SecurityQualityOfService; - ACCESS_MASK DesiredAccess; - ACCESS_MASK GrantedAccess; - PULONG Disposition; - PVOID *ResultObject; - PVOID CallContext; - PVOID RootObjectContext; - PVOID Transaction; - PVOID Reserved; -} REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION; - -typedef struct _REG_CREATE_KEY_INFORMATION_V1 { - PUNICODE_STRING CompleteName; - PVOID RootObject; - PVOID ObjectType; - ULONG Options; - PUNICODE_STRING Class; - PVOID SecurityDescriptor; - PVOID SecurityQualityOfService; - ACCESS_MASK DesiredAccess; - ACCESS_MASK GrantedAccess; - PULONG Disposition; - PVOID *ResultObject; - PVOID CallContext; - PVOID RootObjectContext; - PVOID Transaction; - ULONG_PTR Version; - PUNICODE_STRING RemainingName; - ULONG Wow64Flags; - ULONG Attributes; - KPROCESSOR_MODE CheckAccessMode; -} REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1; - typedef struct _REG_PRE_CREATE_KEY_INFORMATION { PUNICODE_STRING CompleteName; } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;; @@ -3548,83 +2850,142 @@ typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { PVOID Reserved; } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION; -#if (NTDDI_VERSION >= NTDDI_VISTA) +/****************************************************************************** + * I/O Manager Types * + ******************************************************************************/ -typedef struct _REG_LOAD_KEY_INFORMATION { - PVOID Object; - PUNICODE_STRING KeyName; - PUNICODE_STRING SourceFile; - ULONG Flags; - PVOID TrustClassObject; - PVOID UserEvent; - ACCESS_MASK DesiredAccess; - PHANDLE RootHandle; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION; + /* PCI_COMMON_CONFIG.Command */ +#define PCI_ENABLE_IO_SPACE 0x0001 +#define PCI_ENABLE_MEMORY_SPACE 0x0002 +#define PCI_ENABLE_BUS_MASTER 0x0004 +#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 +#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 +#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 +#define PCI_ENABLE_PARITY 0x0040 +#define PCI_ENABLE_WAIT_CYCLE 0x0080 +#define PCI_ENABLE_SERR 0x0100 +#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 +#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 -typedef struct _REG_UNLOAD_KEY_INFORMATION { - PVOID Object; - PVOID UserEvent; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION; +/* PCI_COMMON_CONFIG.Status */ +#define PCI_STATUS_INTERRUPT_PENDING 0x0008 +#define PCI_STATUS_CAPABILITIES_LIST 0x0010 +#define PCI_STATUS_66MHZ_CAPABLE 0x0020 +#define PCI_STATUS_UDF_SUPPORTED 0x0040 +#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 +#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 +#define PCI_STATUS_DEVSEL 0x0600 +#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 +#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 +#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 +#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 +#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 -typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION { - PVOID Object; - PVOID ObjectContext; - PVOID Reserved; -} REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION; +/* PCI_COMMON_CONFIG.HeaderType */ +#define PCI_MULTIFUNCTION 0x80 +#define PCI_DEVICE_TYPE 0x00 +#define PCI_BRIDGE_TYPE 0x01 +#define PCI_CARDBUS_BRIDGE_TYPE 0x02 -typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION { - PVOID Object; - PSECURITY_INFORMATION SecurityInformation; - PSECURITY_DESCRIPTOR SecurityDescriptor; - PULONG Length; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION; +#define PCI_CONFIGURATION_TYPE(PciData) \ + (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) -typedef struct _REG_SET_KEY_SECURITY_INFORMATION { - PVOID Object; - PSECURITY_INFORMATION SecurityInformation; - PSECURITY_DESCRIPTOR SecurityDescriptor; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION; +#define PCI_MULTIFUNCTION_DEVICE(PciData) \ + ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) -typedef struct _REG_RESTORE_KEY_INFORMATION { - PVOID Object; - HANDLE FileHandle; - ULONG Flags; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION; +/* PCI device classes */ +#define PCI_CLASS_PRE_20 0x00 +#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 +#define PCI_CLASS_NETWORK_CTLR 0x02 +#define PCI_CLASS_DISPLAY_CTLR 0x03 +#define PCI_CLASS_MULTIMEDIA_DEV 0x04 +#define PCI_CLASS_MEMORY_CTLR 0x05 +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 +#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 +#define PCI_CLASS_INPUT_DEV 0x09 +#define PCI_CLASS_DOCKING_STATION 0x0a +#define PCI_CLASS_PROCESSOR 0x0b +#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c +#define PCI_CLASS_WIRELESS_CTLR 0x0d +#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e +#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f +#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 +#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 -typedef struct _REG_SAVE_KEY_INFORMATION { - PVOID Object; - HANDLE FileHandle; - ULONG Format; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION; +/* PCI device subclasses for class 0 */ +#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 +#define PCI_SUBCLASS_PRE_20_VGA 0x01 -typedef struct _REG_REPLACE_KEY_INFORMATION { - PVOID Object; - PUNICODE_STRING OldFileName; - PUNICODE_STRING NewFileName; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION; +/* PCI device subclasses for class 1 (mass storage controllers)*/ +#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 +#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 +#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 +#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 +#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 +#define PCI_SUBCLASS_MSC_OTHER 0x80 -#endif /* NTDDI_VERSION >= NTDDI_VISTA */ +/* PCI device subclasses for class 2 (network controllers)*/ +#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 +#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 +#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 +#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 +#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 +#define PCI_SUBCLASS_NET_OTHER 0x80 + +/* PCI device subclasses for class 3 (display controllers)*/ +#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 +#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 +#define PCI_SUBCLASS_VID_3D_CTLR 0x02 +#define PCI_SUBCLASS_VID_OTHER 0x80 + +/* PCI device subclasses for class 4 (multimedia device)*/ +#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 +#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 +#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 +#define PCI_SUBCLASS_MM_OTHER 0x80 + +/* PCI device subclasses for class 5 (memory controller)*/ +#define PCI_SUBCLASS_MEM_RAM 0x00 +#define PCI_SUBCLASS_MEM_FLASH 0x01 +#define PCI_SUBCLASS_MEM_OTHER 0x80 + +/* PCI device subclasses for class 6 (bridge device)*/ +#define PCI_SUBCLASS_BR_HOST 0x00 +#define PCI_SUBCLASS_BR_ISA 0x01 +#define PCI_SUBCLASS_BR_EISA 0x02 +#define PCI_SUBCLASS_BR_MCA 0x03 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 +#define PCI_SUBCLASS_BR_PCMCIA 0x05 +#define PCI_SUBCLASS_BR_NUBUS 0x06 +#define PCI_SUBCLASS_BR_CARDBUS 0x07 +#define PCI_SUBCLASS_BR_RACEWAY 0x08 +#define PCI_SUBCLASS_BR_OTHER 0x80 + +/* PCI device subclasses for class C (serial bus controller)*/ +#define PCI_SUBCLASS_SB_IEEE1394 0x00 +#define PCI_SUBCLASS_SB_ACCESS 0x01 +#define PCI_SUBCLASS_SB_SSA 0x02 +#define PCI_SUBCLASS_SB_USB 0x03 +#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 +#define PCI_SUBCLASS_SB_SMBUS 0x05 + +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 +#define PCI_MAX_BRIDGE_NUMBER 0xFF +#define PCI_INVALID_VENDORID 0xFFFF +#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) + +#define PCI_ADDRESS_IO_SPACE 0x00000001 +#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 +#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 +#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc +#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 +#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 + +#define PCI_TYPE_32BIT 0 +#define PCI_TYPE_20BIT 2 +#define PCI_TYPE_64BIT 4 #define SERVICE_KERNEL_DRIVER 0x00000001 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002 @@ -3691,37 +3052,14 @@ typedef enum _CM_ERROR_CONTROL_TYPE { CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \ CM_SERVICE_USB_DISK_BOOT_LOAD) -/****************************************************************************** - * I/O Manager Types * - ******************************************************************************/ - -#define WDM_MAJORVERSION 0x06 -#define WDM_MINORVERSION 0x00 - -#if defined(_WIN64) - -#ifndef USE_DMA_MACROS -#define USE_DMA_MACROS -#endif - -#ifndef NO_LEGACY_DRIVERS -#define NO_LEGACY_DRIVERS -#endif - -#endif /* defined(_WIN64) */ - -#define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS - -#define CONNECT_FULLY_SPECIFIED 0x1 -#define CONNECT_LINE_BASED 0x2 -#define CONNECT_MESSAGE_BASED 0x3 -#define CONNECT_FULLY_SPECIFIED_GROUP 0x4 -#define CONNECT_CURRENT_VERSION 0x4 - #define POOL_COLD_ALLOCATION 256 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16 +#define PCI_TYPE0_ADDRESSES 6 +#define PCI_TYPE1_ADDRESSES 2 +#define PCI_TYPE2_ADDRESSES 5 + #define IO_TYPE_ADAPTER 1 #define IO_TYPE_CONTROLLER 2 #define IO_TYPE_DEVICE 3 @@ -3745,6 +3083,47 @@ typedef enum _CM_ERROR_CONTROL_TYPE { #define IO_RESOURCE_DEFAULT 0x02 #define IO_RESOURCE_ALTERNATIVE 0x08 +/* DEVICE_OBJECT.Flags */ +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 + +/* DEVICE_OBJECT.Characteristics */ +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 +#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 +#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 +#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 + +/* DEVICE_OBJECT.AlignmentRequirement */ +#define FILE_BYTE_ALIGNMENT 0x00000000 +#define FILE_WORD_ALIGNMENT 0x00000001 +#define FILE_LONG_ALIGNMENT 0x00000003 +#define FILE_QUAD_ALIGNMENT 0x00000007 +#define FILE_OCTA_ALIGNMENT 0x0000000f +#define FILE_32_BYTE_ALIGNMENT 0x0000001f +#define FILE_64_BYTE_ALIGNMENT 0x0000003f +#define FILE_128_BYTE_ALIGNMENT 0x0000007f +#define FILE_256_BYTE_ALIGNMENT 0x000000ff +#define FILE_512_BYTE_ALIGNMENT 0x000001ff + +/* DEVICE_OBJECT.DeviceType */ +#define DEVICE_TYPE ULONG + #define FILE_DEVICE_BEEP 0x00000001 #define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 @@ -3813,44 +3192,6 @@ typedef enum _CM_ERROR_CONTROL_TYPE { #define FILE_DEVICE_BIOMETRIC 0x00000044 #define FILE_DEVICE_PMI 0x00000045 -#if defined(NT_PROCESSOR_GROUPS) - -typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; - -typedef enum _IRQ_DEVICE_POLICY_USHORT { - IrqPolicyMachineDefault = 0, - IrqPolicyAllCloseProcessors = 1, - IrqPolicyOneCloseProcessor = 2, - IrqPolicyAllProcessorsInMachine = 3, - IrqPolicyAllProcessorsInGroup = 3, - IrqPolicySpecifiedProcessors = 4, - IrqPolicySpreadMessagesAcrossAllProcessors = 5}; - -#else /* defined(NT_PROCESSOR_GROUPS) */ - -typedef enum _IRQ_DEVICE_POLICY { - IrqPolicyMachineDefault = 0, - IrqPolicyAllCloseProcessors, - IrqPolicyOneCloseProcessor, - IrqPolicyAllProcessorsInMachine, - IrqPolicySpecifiedProcessors, - IrqPolicySpreadMessagesAcrossAllProcessors -} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; - -#endif - -typedef enum _IRQ_PRIORITY { - IrqPriorityUndefined = 0, - IrqPriorityLow, - IrqPriorityNormal, - IrqPriorityHigh -} IRQ_PRIORITY, *PIRQ_PRIORITY; - -typedef enum _IRQ_GROUP_POLICY { - GroupAffinityAllGroupZero = 0, - GroupAffinityDontCare -} IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY; - #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) typedef struct _OBJECT_HANDLE_INFORMATION { @@ -3863,6 +3204,10 @@ typedef struct _CLIENT_ID { HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; +typedef VOID +(NTAPI *PKSTART_ROUTINE)( + IN PVOID StartContext); + typedef struct _VPB { CSHORT Type; CSHORT Size; @@ -3899,47 +3244,6 @@ typedef struct _WAIT_CONTEXT_BLOCK { PKDPC BufferChainingDpc; } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; -/* DEVICE_OBJECT.Flags */ -#define DO_VERIFY_VOLUME 0x00000002 -#define DO_BUFFERED_IO 0x00000004 -#define DO_EXCLUSIVE 0x00000008 -#define DO_DIRECT_IO 0x00000010 -#define DO_MAP_IO_BUFFER 0x00000020 -#define DO_DEVICE_INITIALIZING 0x00000080 -#define DO_SHUTDOWN_REGISTERED 0x00000800 -#define DO_BUS_ENUMERATED_DEVICE 0x00001000 -#define DO_POWER_PAGABLE 0x00002000 -#define DO_POWER_INRUSH 0x00004000 - -/* DEVICE_OBJECT.Characteristics */ -#define FILE_REMOVABLE_MEDIA 0x00000001 -#define FILE_READ_ONLY_DEVICE 0x00000002 -#define FILE_FLOPPY_DISKETTE 0x00000004 -#define FILE_WRITE_ONCE_MEDIA 0x00000008 -#define FILE_REMOTE_DEVICE 0x00000010 -#define FILE_DEVICE_IS_MOUNTED 0x00000020 -#define FILE_VIRTUAL_VOLUME 0x00000040 -#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 -#define FILE_DEVICE_SECURE_OPEN 0x00000100 -#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 -#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 -#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 - -/* DEVICE_OBJECT.AlignmentRequirement */ -#define FILE_BYTE_ALIGNMENT 0x00000000 -#define FILE_WORD_ALIGNMENT 0x00000001 -#define FILE_LONG_ALIGNMENT 0x00000003 -#define FILE_QUAD_ALIGNMENT 0x00000007 -#define FILE_OCTA_ALIGNMENT 0x0000000f -#define FILE_32_BYTE_ALIGNMENT 0x0000001f -#define FILE_64_BYTE_ALIGNMENT 0x0000003f -#define FILE_128_BYTE_ALIGNMENT 0x0000007f -#define FILE_256_BYTE_ALIGNMENT 0x000000ff -#define FILE_512_BYTE_ALIGNMENT 0x000001ff - -/* DEVICE_OBJECT.DeviceType */ -#define DEVICE_TYPE ULONG - typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; @@ -3971,153 +3275,6 @@ typedef struct _DEVICE_OBJECT { PVOID Reserved; } DEVICE_OBJECT, *PDEVICE_OBJECT; -typedef enum _IO_SESSION_STATE { - IoSessionStateCreated = 1, - IoSessionStateInitialized, - IoSessionStateConnected, - IoSessionStateDisconnected, - IoSessionStateDisconnectedLoggedOn, - IoSessionStateLoggedOn, - IoSessionStateLoggedOff, - IoSessionStateTerminated, - IoSessionStateMax -} IO_SESSION_STATE, *PIO_SESSION_STATE; - -typedef enum _IO_COMPLETION_ROUTINE_RESULT { - ContinueCompletion = STATUS_CONTINUE_COMPLETION, - StopCompletion = STATUS_MORE_PROCESSING_REQUIRED -} IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT; - -typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY { - PHYSICAL_ADDRESS MessageAddress; - KAFFINITY TargetProcessorSet; - PKINTERRUPT InterruptObject; - ULONG MessageData; - ULONG Vector; - KIRQL Irql; - KINTERRUPT_MODE Mode; - KINTERRUPT_POLARITY Polarity; -} IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY; - -typedef struct _IO_INTERRUPT_MESSAGE_INFO { - KIRQL UnifiedIrql; - ULONG MessageCount; - IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1]; -} IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO; - -typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS { - IN PDEVICE_OBJECT PhysicalDeviceObject; - OUT PKINTERRUPT *InterruptObject; - IN PKSERVICE_ROUTINE ServiceRoutine; - IN PVOID ServiceContext; - IN PKSPIN_LOCK SpinLock OPTIONAL; - IN KIRQL SynchronizeIrql; - IN BOOLEAN FloatingSave; - IN BOOLEAN ShareVector; - IN ULONG Vector; - IN KIRQL Irql; - IN KINTERRUPT_MODE InterruptMode; - IN KAFFINITY ProcessorEnableMask; - IN USHORT Group; -} IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS; - -typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS { - IN PDEVICE_OBJECT PhysicalDeviceObject; - OUT PKINTERRUPT *InterruptObject; - IN PKSERVICE_ROUTINE ServiceRoutine; - IN PVOID ServiceContext; - IN PKSPIN_LOCK SpinLock OPTIONAL; - IN KIRQL SynchronizeIrql OPTIONAL; - IN BOOLEAN FloatingSave; -} IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS; - -typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS { - IN PDEVICE_OBJECT PhysicalDeviceObject; - union { - OUT PVOID *Generic; - OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable; - OUT PKINTERRUPT *InterruptObject; - } ConnectionContext; - IN PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine; - IN PVOID ServiceContext; - IN PKSPIN_LOCK SpinLock OPTIONAL; - IN KIRQL SynchronizeIrql OPTIONAL; - IN BOOLEAN FloatingSave; - IN PKSERVICE_ROUTINE FallBackServiceRoutine OPTIONAL; -} IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS; - -typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { - IN OUT ULONG Version; - union { - IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified; - IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased; - IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased; - }; -} IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS; - -typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS { - IN ULONG Version; - union { - IN PVOID Generic; - IN PKINTERRUPT InterruptObject; - IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; - } ConnectionContext; -} IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS; - -typedef enum _IO_ACCESS_TYPE { - ReadAccess, - WriteAccess, - ModifyAccess -} IO_ACCESS_TYPE; - -typedef enum _IO_ACCESS_MODE { - SequentialAccess, - RandomAccess -} IO_ACCESS_MODE; - -typedef enum _IO_CONTAINER_NOTIFICATION_CLASS { - IoSessionStateNotification, - IoMaxContainerNotificationClass -} IO_CONTAINER_NOTIFICATION_CLASS; - -typedef struct _IO_SESSION_STATE_NOTIFICATION { - ULONG Size; - ULONG Flags; - PVOID IoObject; - ULONG EventMask; - PVOID Context; -} IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION; - -typedef enum _IO_CONTAINER_INFORMATION_CLASS { - IoSessionStateInformation, - IoMaxContainerInformationClass -} IO_CONTAINER_INFORMATION_CLASS; - -typedef struct _IO_SESSION_STATE_INFORMATION { - ULONG SessionId; - IO_SESSION_STATE SessionState; - BOOLEAN LocalSession; -} IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION; - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -typedef NTSTATUS -(NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)( - VOID); - -typedef NTSTATUS -(NTAPI IO_SESSION_NOTIFICATION_FUNCTION)( - IN PVOID SessionObject, - IN PVOID IoObject, - IN ULONG Event, - IN PVOID Context, - IN PVOID NotificationPayload, - IN ULONG PayloadLength); - -typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION; - -#endif - typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { @@ -4246,6 +3403,22 @@ typedef struct _SHARE_ACCESS { } type2; \ } u; +typedef struct _PCI_COMMON_HEADER { + PCI_COMMON_HEADER_LAYOUT +} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; + +#ifdef __cplusplus +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER_LAYOUT + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#else +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER DUMMYSTRUCTNAME; + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#endif + typedef enum _CREATE_FILE_TYPE { CreateFileTypeNone, CreateFileTypeNamedPipe, @@ -4266,12 +3439,16 @@ typedef struct _IO_STATUS_BLOCK { ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; -#if defined(_WIN64) -typedef struct _IO_STATUS_BLOCK32 { - NTSTATUS Status; - ULONG Information; -} IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32; -#endif +typedef struct _PCI_SLOT_NUMBER { + union { + struct { + ULONG DeviceNumber : 5; + ULONG FunctionNumber : 3; + ULONG Reserved : 24; + } bits; + ULONG AsULONG; + } u; +} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; typedef VOID (NTAPI *PIO_APC_ROUTINE)( @@ -4279,35 +3456,16 @@ typedef VOID IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved); -#define PIO_APC_ROUTINE_DEFINED +typedef VOID +(NTAPI *WMI_NOTIFICATION_CALLBACK)( + PVOID Wnode, + PVOID Context); -typedef enum _IO_SESSION_EVENT { - IoSessionEventIgnore = 0, - IoSessionEventCreated, - IoSessionEventTerminated, - IoSessionEventConnected, - IoSessionEventDisconnected, - IoSessionEventLogon, - IoSessionEventLogoff, - IoSessionEventMax -} IO_SESSION_EVENT, *PIO_SESSION_EVENT; - -#define IO_SESSION_STATE_ALL_EVENTS 0xffffffff -#define IO_SESSION_STATE_CREATION_EVENT 0x00000001 -#define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002 -#define IO_SESSION_STATE_CONNECT_EVENT 0x00000004 -#define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008 -#define IO_SESSION_STATE_LOGON_EVENT 0x00000010 -#define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020 - -#define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f - -#define IO_SESSION_MAX_PAYLOAD_SIZE 256L - -typedef struct _IO_SESSION_CONNECT_INFO { - ULONG SessionId; - BOOLEAN LocalSession; -} IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO; +#define WMIREG_ACTION_REGISTER 1 +#define WMIREG_ACTION_DEREGISTER 2 +#define WMIREG_ACTION_REREGISTER 3 +#define WMIREG_ACTION_UPDATE_GUIDS 4 +#define WMIREG_ACTION_BLOCK_IRPS 5 #define EVENT_INCREMENT 1 #define IO_NO_INCREMENT 0 @@ -4376,7 +3534,6 @@ typedef struct _BOOTDISK_INFORMATION_LITE { #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ -#include typedef struct _EISA_MEMORY_TYPE { UCHAR ReadWrite : 1; @@ -4388,6 +3545,7 @@ typedef struct _EISA_MEMORY_TYPE { UCHAR MoreEntries : 1; } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; +#include typedef struct _EISA_MEMORY_CONFIGURATION { EISA_MEMORY_TYPE ConfigurationByte; UCHAR DataSize; @@ -4395,6 +3553,7 @@ typedef struct _EISA_MEMORY_CONFIGURATION { UCHAR AddressHighByte; USHORT MemorySize; } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; +#include typedef struct _EISA_IRQ_DESCRIPTOR { UCHAR Interrupt : 4; @@ -4428,6 +3587,7 @@ typedef struct _EISA_DMA_CONFIGURATION { DMA_CONFIGURATION_BYTE1 ConfigurationByte1; } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; +#include typedef struct _EISA_PORT_DESCRIPTOR { UCHAR NumberPorts : 5; UCHAR Reserved : 1; @@ -4439,17 +3599,7 @@ typedef struct _EISA_PORT_CONFIGURATION { EISA_PORT_DESCRIPTOR Configuration; USHORT PortAddress; } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; - -typedef struct _CM_EISA_SLOT_INFORMATION { - UCHAR ReturnCode; - UCHAR ReturnFlags; - UCHAR MajorRevision; - UCHAR MinorRevision; - USHORT Checksum; - UCHAR NumberFunctions; - UCHAR FunctionInformation; - ULONG CompressedId; -} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; +#include typedef struct _CM_EISA_FUNCTION_INFORMATION { ULONG CompressedId; @@ -4467,8 +3617,6 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { UCHAR InitializationData[60]; } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; -#include - /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ #define EISA_FUNCTION_ENABLED 0x80 @@ -4483,9 +3631,16 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) -#define EISA_MORE_ENTRIES 0x80 -#define EISA_SYSTEM_MEMORY 0x00 -#define EISA_MEMORY_TYPE_RAM 0x01 +typedef struct _CM_EISA_SLOT_INFORMATION { + UCHAR ReturnCode; + UCHAR ReturnFlags; + UCHAR MajorRevision; + UCHAR MinorRevision; + USHORT Checksum; + UCHAR NumberFunctions; + UCHAR FunctionInformation; + ULONG CompressedId; +} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; /* CM_EISA_SLOT_INFORMATION.ReturnCode */ @@ -4532,45 +3687,6 @@ typedef ULONG IN ULONG Length); typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA; -typedef enum _DEVICE_INSTALL_STATE { - InstallStateInstalled, - InstallStateNeedsReinstall, - InstallStateFailedInstall, - InstallStateFinishInstall -} DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE; - -typedef struct _LEGACY_BUS_INFORMATION { - GUID BusTypeGuid; - INTERFACE_TYPE LegacyBusType; - ULONG BusNumber; -} LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION; - -typedef enum _DEVICE_REMOVAL_POLICY { - RemovalPolicyExpectNoRemoval = 1, - RemovalPolicyExpectOrderlyRemoval = 2, - RemovalPolicyExpectSurpriseRemoval = 3 -} DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY; - -typedef VOID -(NTAPI*PREENUMERATE_SELF)( - IN PVOID Context); - -typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf; -} REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD; - -typedef VOID -(NTAPI *PIO_DEVICE_EJECT_CALLBACK)( - IN NTSTATUS Status, - IN OUT PVOID Context OPTIONAL); - -#define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1 - /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */ #define PCI_USE_SUBSYSTEM_IDS 0x00000001 #define PCI_USE_REVISION 0x00000002 @@ -4631,6 +3747,175 @@ typedef struct _PCI_DEVICE_PRESENT_INTERFACE { PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; +typedef +BOOLEAN +(*PGPE_SERVICE_ROUTINE2)( + PVOID ObjectContext, + PVOID ServiceContext +); + +typedef +NTSTATUS +(*PGPE_CONNECT_VECTOR2)( + PVOID Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE2 ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISCONNECT_VECTOR2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_ENABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_CLEAR_STATUS2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +VOID +(*PDEVICE_NOTIFY_CALLBACK2)( + PVOID NotificationContext, + ULONG NotifyCode +); + +typedef +NTSTATUS +(*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context, + PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, + PVOID NotificationContext +); + +typedef +VOID +(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context +); + +typedef struct +{ + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR2 GpeConnectVector; + PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; + PGPE_ENABLE_EVENT2 GpeEnableEvent; + PGPE_DISABLE_EVENT2 GpeDisableEvent; + PGPE_CLEAR_STATUS2 GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; + +typedef +BOOLEAN +(*PGPE_SERVICE_ROUTINE)( + PDEVICE_OBJECT ObjectContext, + PVOID ServiceContext +); + +typedef +NTSTATUS +(*PGPE_CONNECT_VECTOR)( + PDEVICE_OBJECT Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISCONNECT_VECTOR)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_ENABLE_EVENT)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISABLE_EVENT)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_CLEAR_STATUS)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +VOID +(*PDEVICE_NOTIFY_CALLBACK)( + PVOID NotificationContext, + ULONG NotifyCode +); + +typedef +NTSTATUS +(*PREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT Context, + PDEVICE_NOTIFY_CALLBACK NotificationHandler, + PVOID NotificationContext +); + +typedef +VOID +(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT Context, + PDEVICE_NOTIFY_CALLBACK NotificationHandler +); + +typedef struct +{ + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR GpeConnectVector; + PGPE_DISCONNECT_VECTOR GpeDisconnectVector; + PGPE_ENABLE_EVENT GpeEnableEvent; + PGPE_DISABLE_EVENT GpeDisableEvent; + PGPE_CLEAR_STATUS GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; + typedef struct _DEVICE_CAPABILITIES { USHORT Size; USHORT Version; @@ -4720,139 +4005,6 @@ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { struct _FILE_OBJECT *FileObject; } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; -#if (NTDDI_VERSION >= NTDDI_VISTA) -#include -#define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001 -#endif - -#define PNP_REPLACE_NO_MAP MAXLONGLONG - -typedef NTSTATUS -(NTAPI *PREPLACE_MAP_MEMORY)( - IN PHYSICAL_ADDRESS TargetPhysicalAddress, - IN PHYSICAL_ADDRESS SparePhysicalAddress, - IN OUT PLARGE_INTEGER NumberOfBytes, - OUT PVOID *TargetAddress, - OUT PVOID *SpareAddress); - -typedef struct _PNP_REPLACE_MEMORY_LIST { - ULONG AllocatedCount; - ULONG Count; - ULONGLONG TotalLength; - struct { - PHYSICAL_ADDRESS Address; - ULONGLONG Length; - } Ranges[ANYSIZE_ARRAY]; -} PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST; - -typedef struct _PNP_REPLACE_PROCESSOR_LIST { - PKAFFINITY Affinity; - ULONG GroupCount; - ULONG AllocatedCount; - ULONG Count; - ULONG ApicIds[ANYSIZE_ARRAY]; -} PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST; - -typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 { - KAFFINITY AffinityMask; - ULONG AllocatedCount; - ULONG Count; - ULONG ApicIds[ANYSIZE_ARRAY]; -} PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1; - -#define PNP_REPLACE_PARAMETERS_VERSION 2 - -typedef struct _PNP_REPLACE_PARAMETERS { - ULONG Size; - ULONG Version; - ULONG64 Target; - ULONG64 Spare; - PPNP_REPLACE_PROCESSOR_LIST TargetProcessors; - PPNP_REPLACE_PROCESSOR_LIST SpareProcessors; - PPNP_REPLACE_MEMORY_LIST TargetMemory; - PPNP_REPLACE_MEMORY_LIST SpareMemory; - PREPLACE_MAP_MEMORY MapMemory; -} PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS; - -typedef VOID -(NTAPI *PREPLACE_UNLOAD)( - VOID); - -typedef NTSTATUS -(NTAPI *PREPLACE_BEGIN)( - IN PPNP_REPLACE_PARAMETERS Parameters, - OUT PVOID *Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_END)( - IN PVOID Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)( - IN PVOID Context, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER ByteCount); - -typedef NTSTATUS -(NTAPI *PREPLACE_SET_PROCESSOR_ID)( - IN PVOID Context, - IN ULONG ApicId, - IN BOOLEAN Target); - -typedef NTSTATUS -(NTAPI *PREPLACE_SWAP)( - IN PVOID Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)( - IN PVOID Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)( - IN PVOID Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_GET_MEMORY_DESTINATION)( - IN PVOID Context, - IN PHYSICAL_ADDRESS SourceAddress, - OUT PPHYSICAL_ADDRESS DestinationAddress); - -typedef NTSTATUS -(NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)( - IN PVOID Context, - IN BOOLEAN Enable); - -#define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1 -#define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \ - FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror) - -#define PNP_REPLACE_MEMORY_SUPPORTED 0x0001 -#define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002 -#define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004 -#define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008 -#define PNP_REPLACE_HARDWARE_QUIESCE 0x0010 - -typedef struct _PNP_REPLACE_DRIVER_INTERFACE { - ULONG Size; - ULONG Version; - ULONG Flags; - PREPLACE_UNLOAD Unload; - PREPLACE_BEGIN BeginReplace; - PREPLACE_END EndReplace; - PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory; - PREPLACE_SET_PROCESSOR_ID SetProcessorId; - PREPLACE_SWAP Swap; - PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror; - PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory; - PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination; - PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce; -} PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE; - -typedef NTSTATUS -(NTAPI *PREPLACE_DRIVER_INIT)( - IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface, - IN PVOID Unused); - typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { DeviceUsageTypeUndefined, DeviceUsageTypePaging, @@ -4899,15 +4051,6 @@ typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { EventCategoryTargetDeviceChange } IO_NOTIFICATION_EVENT_CATEGORY; -typedef enum _IO_PRIORITY_HINT { - IoPriorityVeryLow = 0, - IoPriorityLow, - IoPriorityNormal, - IoPriorityHigh, - IoPriorityCritical, - MaxIoPriorityTypes -} IO_PRIORITY_HINT; - #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 typedef NTSTATUS @@ -4984,6 +4127,7 @@ typedef struct _FILE_POSITION_INFORMATION { LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; +#include typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; @@ -4991,32 +4135,7 @@ typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER ChangeTime; ULONG FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; - -typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION { - IO_PRIORITY_HINT PriorityHint; -} FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION; - -typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION { - ULONG Flags; -} FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION; - -typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION { - PUCHAR IoStatusBlockRange; - ULONG Length; -} FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION; - -typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION { - BOOLEAN IsRemote; -} FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION; - -typedef struct _FILE_NUMA_NODE_INFORMATION { - USHORT NodeNumber; -} FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION; - -typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION { - ULONG NumberOfProcessIdsInList; - ULONG_PTR ProcessIdList[1]; -} FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION; +#include typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; @@ -5063,30 +4182,49 @@ typedef struct _FILE_FULL_EA_INFORMATION { CHAR EaName[1]; } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; -typedef struct _FILE_SFIO_RESERVE_INFORMATION { - ULONG RequestsPerPeriod; - ULONG Period; - BOOLEAN RetryFailures; - BOOLEAN Discardable; - ULONG RequestSize; - ULONG NumOutstandingRequests; -} FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION; - -typedef struct _FILE_SFIO_VOLUME_INFORMATION { - ULONG MaximumRequestsPerPeriod; - ULONG MinimumPeriod; - ULONG MinimumTransferSize; -} FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION; - -#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1 -#define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2 -#define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4 - #define FM_LOCK_BIT (0x1) #define FM_LOCK_BIT_V (0x0) #define FM_LOCK_WAITER_WOKEN (0x2) #define FM_LOCK_WAITER_INC (0x4) +typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; + +typedef struct _OWNER_ENTRY { + ERESOURCE_THREAD OwnerThread; + _ANONYMOUS_UNION union { + LONG OwnerCount; + ULONG TableSize; + } DUMMYUNIONNAME; +} OWNER_ENTRY, *POWNER_ENTRY; + +typedef struct _ERESOURCE +{ + LIST_ENTRY SystemResourcesList; + POWNER_ENTRY OwnerTable; + SHORT ActiveCount; + USHORT Flag; + volatile PKSEMAPHORE SharedWaiters; + volatile PKEVENT ExclusiveWaiters; + OWNER_ENTRY OwnerEntry; + ULONG ActiveEntries; + ULONG ContentionCount; + ULONG NumberOfSharedWaiters; + ULONG NumberOfExclusiveWaiters; + __GNU_EXTENSION union + { + PVOID Address; + ULONG_PTR CreatorBackTraceIndex; + }; + KSPIN_LOCK SpinLock; +} ERESOURCE, *PERESOURCE; + +/* ERESOURCE.Flag */ +#define ResourceNeverExclusive 0x0010 +#define ResourceReleaseByOtherThread 0x0020 +#define ResourceOwnedExclusive 0x0080 + +#define RESOURCE_HASH_TABLE_SIZE 64 + typedef BOOLEAN (NTAPI FAST_IO_CHECK_IF_POSSIBLE)( IN struct _FILE_OBJECT *FileObject, @@ -5630,12 +4768,6 @@ typedef struct _IO_ERROR_LOG_MESSAGE { #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \ IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) -#ifdef _WIN64 -#define PORT_MAXIMUM_MESSAGE_LENGTH 512 -#else -#define PORT_MAXIMUM_MESSAGE_LENGTH 256 -#endif - typedef enum _DMA_WIDTH { Width8Bits, Width16Bits, @@ -6092,6 +5224,12 @@ typedef NTSTATUS (NTAPI *PMM_DLL_UNLOAD)( VOID); +typedef BOOLEAN +(NTAPI KSERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext); +typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; + typedef VOID (NTAPI IO_TIMER_ROUTINE)( IN struct _DEVICE_OBJECT *DeviceObject, @@ -6175,135 +5313,12 @@ typedef enum _DEVICE_TEXT_TYPE { DeviceTextLocationInformation } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; -typedef BOOLEAN -(NTAPI *PGPE_SERVICE_ROUTINE)( - PVOID, - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_CONNECT_VECTOR)( - PDEVICE_OBJECT, - ULONG, - KINTERRUPT_MODE, - BOOLEAN, - PGPE_SERVICE_ROUTINE, - PVOID, - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_DISCONNECT_VECTOR)( - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_ENABLE_EVENT)( - PDEVICE_OBJECT, - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_DISABLE_EVENT)( - PDEVICE_OBJECT, - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_CLEAR_STATUS)( - PDEVICE_OBJECT, - PVOID); - -typedef VOID -(NTAPI *PDEVICE_NOTIFY_CALLBACK)( - PVOID, - ULONG); - -typedef NTSTATUS -(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT, - PDEVICE_NOTIFY_CALLBACK, - PVOID); - -typedef VOID -(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT, - PDEVICE_NOTIFY_CALLBACK); - -typedef struct _ACPI_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR GpeConnectVector; - PGPE_DISCONNECT_VECTOR GpeDisconnectVector; - PGPE_ENABLE_EVENT GpeEnableEvent; - PGPE_DISABLE_EVENT GpeDisableEvent; - PGPE_CLEAR_STATUS GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; - -typedef BOOLEAN -(NTAPI *PGPE_SERVICE_ROUTINE2)( - PVOID ObjectContext, - PVOID ServiceContext); - -typedef NTSTATUS -(NTAPI *PGPE_CONNECT_VECTOR2)( - PVOID Context, - ULONG GpeNumber, - KINTERRUPT_MODE Mode, - BOOLEAN Shareable, - PGPE_SERVICE_ROUTINE ServiceRoutine, - PVOID ServiceContext, - PVOID *ObjectContext); - -typedef NTSTATUS -(NTAPI *PGPE_DISCONNECT_VECTOR2)( - PVOID Context, - PVOID ObjectContext); - -typedef NTSTATUS -(NTAPI *PGPE_ENABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext); - -typedef NTSTATUS -(NTAPI *PGPE_DISABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext); - -typedef NTSTATUS -(NTAPI *PGPE_CLEAR_STATUS2)( - PVOID Context, - PVOID ObjectContext); - -typedef VOID -(NTAPI *PDEVICE_NOTIFY_CALLBACK2)( - PVOID NotificationContext, - ULONG NotifyCode); - -typedef NTSTATUS -(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context, - PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, - PVOID NotificationContext); - -typedef VOID -(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context); - -typedef struct _ACPI_INTERFACE_STANDARD2 { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR2 GpeConnectVector; - PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; - PGPE_ENABLE_EVENT2 GpeEnableEvent; - PGPE_DISABLE_EVENT2 GpeDisableEvent; - PGPE_CLEAR_STATUS2 GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; +typedef enum _WORK_QUEUE_TYPE { + CriticalWorkQueue, + DelayedWorkQueue, + HyperCriticalWorkQueue, + MaximumWorkQueue +} WORK_QUEUE_TYPE; #if !defined(_AMD64_) && !defined(_IA64_) #include @@ -6503,6 +5518,11 @@ typedef struct _IO_STACK_LOCATION { #define SL_INVOKE_ON_SUCCESS 0x40 #define SL_INVOKE_ON_ERROR 0x80 +/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ + +#define PCI_WHICHSPACE_CONFIG 0x0 +#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ + #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 @@ -6632,920 +5652,10 @@ typedef struct _IO_STACK_LOCATION { /* end winnt.h */ -#define WMIREG_ACTION_REGISTER 1 -#define WMIREG_ACTION_DEREGISTER 2 -#define WMIREG_ACTION_REREGISTER 3 -#define WMIREG_ACTION_UPDATE_GUIDS 4 -#define WMIREG_ACTION_BLOCK_IRPS 5 - -#define WMIREGISTER 0 -#define WMIUPDATE 1 - -typedef VOID -(NTAPI FWMI_NOTIFICATION_CALLBACK)( - PVOID Wnode, - PVOID Context); -typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK; - -#ifndef _PCI_X_ -#define _PCI_X_ - -typedef struct _PCI_SLOT_NUMBER { - union { - struct { - ULONG DeviceNumber:5; - ULONG FunctionNumber:3; - ULONG Reserved:24; - } bits; - ULONG AsULONG; - } u; -} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; - -#define PCI_TYPE0_ADDRESSES 6 -#define PCI_TYPE1_ADDRESSES 2 -#define PCI_TYPE2_ADDRESSES 5 - -typedef struct _PCI_COMMON_HEADER { - PCI_COMMON_HEADER_LAYOUT -} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; - -#ifdef __cplusplus -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER_LAYOUT - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#else -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER DUMMYSTRUCTNAME; - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#endif - -#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) - -#define PCI_EXTENDED_CONFIG_LENGTH 0x1000 - -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 -#define PCI_MAX_BRIDGE_NUMBER 0xFF -#define PCI_INVALID_VENDORID 0xFFFF - -/* PCI_COMMON_CONFIG.HeaderType */ -#define PCI_MULTIFUNCTION 0x80 -#define PCI_DEVICE_TYPE 0x00 -#define PCI_BRIDGE_TYPE 0x01 -#define PCI_CARDBUS_BRIDGE_TYPE 0x02 - -#define PCI_CONFIGURATION_TYPE(PciData) \ - (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) - -#define PCI_MULTIFUNCTION_DEVICE(PciData) \ - ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) - -/* PCI_COMMON_CONFIG.Command */ -#define PCI_ENABLE_IO_SPACE 0x0001 -#define PCI_ENABLE_MEMORY_SPACE 0x0002 -#define PCI_ENABLE_BUS_MASTER 0x0004 -#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 -#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 -#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 -#define PCI_ENABLE_PARITY 0x0040 -#define PCI_ENABLE_WAIT_CYCLE 0x0080 -#define PCI_ENABLE_SERR 0x0100 -#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 -#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 - -/* PCI_COMMON_CONFIG.Status */ -#define PCI_STATUS_INTERRUPT_PENDING 0x0008 -#define PCI_STATUS_CAPABILITIES_LIST 0x0010 -#define PCI_STATUS_66MHZ_CAPABLE 0x0020 -#define PCI_STATUS_UDF_SUPPORTED 0x0040 -#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 -#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 -#define PCI_STATUS_DEVSEL 0x0600 -#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 -#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 -#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 -#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 -#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 - -/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ - -#define PCI_WHICHSPACE_CONFIG 0x0 -#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ - -#define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01 -#define PCI_CAPABILITY_ID_AGP 0x02 -#define PCI_CAPABILITY_ID_VPD 0x03 -#define PCI_CAPABILITY_ID_SLOT_ID 0x04 -#define PCI_CAPABILITY_ID_MSI 0x05 -#define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06 -#define PCI_CAPABILITY_ID_PCIX 0x07 -#define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08 -#define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09 -#define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A -#define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B -#define PCI_CAPABILITY_ID_SHPC 0x0C -#define PCI_CAPABILITY_ID_P2P_SSID 0x0D -#define PCI_CAPABILITY_ID_AGP_TARGET 0x0E -#define PCI_CAPABILITY_ID_SECURE 0x0F -#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 -#define PCI_CAPABILITY_ID_MSIX 0x11 - -typedef struct _PCI_CAPABILITIES_HEADER { - UCHAR CapabilityID; - UCHAR Next; -} PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER; - -typedef struct _PCI_PMC { - UCHAR Version:3; - UCHAR PMEClock:1; - UCHAR Rsvd1:1; - UCHAR DeviceSpecificInitialization:1; - UCHAR Rsvd2:2; - struct _PM_SUPPORT { - UCHAR Rsvd2:1; - UCHAR D1:1; - UCHAR D2:1; - UCHAR PMED0:1; - UCHAR PMED1:1; - UCHAR PMED2:1; - UCHAR PMED3Hot:1; - UCHAR PMED3Cold:1; - } Support; -} PCI_PMC, *PPCI_PMC; - -typedef struct _PCI_PMCSR { - USHORT PowerState:2; - USHORT Rsvd1:6; - USHORT PMEEnable:1; - USHORT DataSelect:4; - USHORT DataScale:2; - USHORT PMEStatus:1; -} PCI_PMCSR, *PPCI_PMCSR; - -typedef struct _PCI_PMCSR_BSE { - UCHAR Rsvd1:6; - UCHAR D3HotSupportsStopClock:1; - UCHAR BusPowerClockControlEnabled:1; -} PCI_PMCSR_BSE, *PPCI_PMCSR_BSE; - -typedef struct _PCI_PM_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - union { - PCI_PMC Capabilities; - USHORT AsUSHORT; - } PMC; - union { - PCI_PMCSR ControlStatus; - USHORT AsUSHORT; - } PMCSR; - union { - PCI_PMCSR_BSE BridgeSupport; - UCHAR AsUCHAR; - } PMCSR_BSE; - UCHAR Data; -} PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY; - -typedef struct { - PCI_CAPABILITIES_HEADER Header; - union { - struct { - USHORT DataParityErrorRecoveryEnable:1; - USHORT EnableRelaxedOrdering:1; - USHORT MaxMemoryReadByteCount:2; - USHORT MaxOutstandingSplitTransactions:3; - USHORT Reserved:9; - } bits; - USHORT AsUSHORT; - } Command; - union { - struct { - ULONG FunctionNumber:3; - ULONG DeviceNumber:5; - ULONG BusNumber:8; - ULONG Device64Bit:1; - ULONG Capable133MHz:1; - ULONG SplitCompletionDiscarded:1; - ULONG UnexpectedSplitCompletion:1; - ULONG DeviceComplexity:1; - ULONG DesignedMaxMemoryReadByteCount:2; - ULONG DesignedMaxOutstandingSplitTransactions:3; - ULONG DesignedMaxCumulativeReadSize:3; - ULONG ReceivedSplitCompletionErrorMessage:1; - ULONG CapablePCIX266:1; - ULONG CapablePCIX533:1; - } bits; - ULONG AsULONG; - } Status; -} PCI_X_CAPABILITY, *PPCI_X_CAPABILITY; - -#define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001 -#define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002 -#define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003 -#define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004 -#define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005 -#define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006 -#define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007 -#define PCI_EXPRESS_MFVC_CAP_ID 0x0008 -#define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009 -#define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A -#define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010 - -typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER { - USHORT CapabilityID; - USHORT Version:4; - USHORT Next:12; -} PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER; - -typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - ULONG LowSerialNumber; - ULONG HighSerialNumber; -} PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY; - -typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS { - struct { - ULONG Undefined:1; - ULONG Reserved1:3; - ULONG DataLinkProtocolError:1; - ULONG SurpriseDownError:1; - ULONG Reserved2:6; - ULONG PoisonedTLP:1; - ULONG FlowControlProtocolError:1; - ULONG CompletionTimeout:1; - ULONG CompleterAbort:1; - ULONG UnexpectedCompletion:1; - ULONG ReceiverOverflow:1; - ULONG MalformedTLP:1; - ULONG ECRCError:1; - ULONG UnsupportedRequestError:1; - ULONG Reserved3:11; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS; - -typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK { - struct { - ULONG Undefined:1; - ULONG Reserved1:3; - ULONG DataLinkProtocolError:1; - ULONG SurpriseDownError:1; - ULONG Reserved2:6; - ULONG PoisonedTLP:1; - ULONG FlowControlProtocolError:1; - ULONG CompletionTimeout:1; - ULONG CompleterAbort:1; - ULONG UnexpectedCompletion:1; - ULONG ReceiverOverflow:1; - ULONG MalformedTLP:1; - ULONG ECRCError:1; - ULONG UnsupportedRequestError:1; - ULONG Reserved3:11; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK; - -typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY { - struct { - ULONG Undefined:1; - ULONG Reserved1:3; - ULONG DataLinkProtocolError:1; - ULONG SurpriseDownError:1; - ULONG Reserved2:6; - ULONG PoisonedTLP:1; - ULONG FlowControlProtocolError:1; - ULONG CompletionTimeout:1; - ULONG CompleterAbort:1; - ULONG UnexpectedCompletion:1; - ULONG ReceiverOverflow:1; - ULONG MalformedTLP:1; - ULONG ECRCError:1; - ULONG UnsupportedRequestError:1; - ULONG Reserved3:11; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY; - -typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS { - struct { - ULONG ReceiverError:1; - ULONG Reserved1:5; - ULONG BadTLP:1; - ULONG BadDLLP:1; - ULONG ReplayNumRollover:1; - ULONG Reserved2:3; - ULONG ReplayTimerTimeout:1; - ULONG AdvisoryNonFatalError:1; - ULONG Reserved3:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS; - -typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK { - struct { - ULONG ReceiverError:1; - ULONG Reserved1:5; - ULONG BadTLP:1; - ULONG BadDLLP:1; - ULONG ReplayNumRollover:1; - ULONG Reserved2:3; - ULONG ReplayTimerTimeout:1; - ULONG AdvisoryNonFatalError:1; - ULONG Reserved3:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK; - -typedef union _PCI_EXPRESS_AER_CAPABILITIES { - struct { - ULONG FirstErrorPointer:5; - ULONG ECRCGenerationCapable:1; - ULONG ECRCGenerationEnable:1; - ULONG ECRCCheckCapable:1; - ULONG ECRCCheckEnable:1; - ULONG Reserved:23; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES; - -typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND { - struct { - ULONG CorrectableErrorReportingEnable:1; - ULONG NonFatalErrorReportingEnable:1; - ULONG FatalErrorReportingEnable:1; - ULONG Reserved:29; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND; - -typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS { - struct { - ULONG CorrectableErrorReceived:1; - ULONG MultipleCorrectableErrorsReceived:1; - ULONG UncorrectableErrorReceived:1; - ULONG MultipleUncorrectableErrorsReceived:1; - ULONG FirstUncorrectableFatal:1; - ULONG NonFatalErrorMessagesReceived:1; - ULONG FatalErrorMessagesReceived:1; - ULONG Reserved:20; - ULONG AdvancedErrorInterruptMessageNumber:5; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS; - -typedef union _PCI_EXPRESS_ERROR_SOURCE_ID { - struct { - USHORT CorrectableSourceIdFun:3; - USHORT CorrectableSourceIdDev:5; - USHORT CorrectableSourceIdBus:8; - USHORT UncorrectableSourceIdFun:3; - USHORT UncorrectableSourceIdDev:5; - USHORT UncorrectableSourceIdBus:8; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID; - -typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS { - struct { - ULONG TargetAbortOnSplitCompletion:1; - ULONG MasterAbortOnSplitCompletion:1; - ULONG ReceivedTargetAbort:1; - ULONG ReceivedMasterAbort:1; - ULONG RsvdZ:1; - ULONG UnexpectedSplitCompletionError:1; - ULONG UncorrectableSplitCompletion:1; - ULONG UncorrectableDataError:1; - ULONG UncorrectableAttributeError:1; - ULONG UncorrectableAddressError:1; - ULONG DelayedTransactionDiscardTimerExpired:1; - ULONG PERRAsserted:1; - ULONG SERRAsserted:1; - ULONG InternalBridgeError:1; - ULONG Reserved:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS; - -typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK { - struct { - ULONG TargetAbortOnSplitCompletion:1; - ULONG MasterAbortOnSplitCompletion:1; - ULONG ReceivedTargetAbort:1; - ULONG ReceivedMasterAbort:1; - ULONG RsvdZ:1; - ULONG UnexpectedSplitCompletionError:1; - ULONG UncorrectableSplitCompletion:1; - ULONG UncorrectableDataError:1; - ULONG UncorrectableAttributeError:1; - ULONG UncorrectableAddressError:1; - ULONG DelayedTransactionDiscardTimerExpired:1; - ULONG PERRAsserted:1; - ULONG SERRAsserted:1; - ULONG InternalBridgeError:1; - ULONG Reserved:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK; - -typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY { - struct { - ULONG TargetAbortOnSplitCompletion:1; - ULONG MasterAbortOnSplitCompletion:1; - ULONG ReceivedTargetAbort:1; - ULONG ReceivedMasterAbort:1; - ULONG RsvdZ:1; - ULONG UnexpectedSplitCompletionError:1; - ULONG UncorrectableSplitCompletion:1; - ULONG UncorrectableDataError:1; - ULONG UncorrectableAttributeError:1; - ULONG UncorrectableAddressError:1; - ULONG DelayedTransactionDiscardTimerExpired:1; - ULONG PERRAsserted:1; - ULONG SERRAsserted:1; - ULONG InternalBridgeError:1; - ULONG Reserved:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY; - -typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES { - struct { - ULONG SecondaryUncorrectableFirstErrorPtr:5; - ULONG Reserved:27; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES; - -#define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001 -#define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002 -#define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004 - -#define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \ - (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \ - ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \ - ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING) - -typedef struct _PCI_EXPRESS_AER_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; - PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; - PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; - PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; - PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; - PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; - ULONG HeaderLog[4]; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; - PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; - ULONG SecHeaderLog[4]; -} PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY; - -typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; - PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; - PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; - PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; - PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; - PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; - ULONG HeaderLog[4]; - PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand; - PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus; - PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId; -} PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY; - -typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; - PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; - PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; - PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; - PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; - PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; - ULONG HeaderLog[4]; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; - PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; - ULONG SecHeaderLog[4]; -} PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY; - -typedef union _PCI_EXPRESS_SRIOV_CAPS { - struct { - ULONG VFMigrationCapable:1; - ULONG Reserved1:20; - ULONG VFMigrationInterruptNumber:11; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS; - -typedef union _PCI_EXPRESS_SRIOV_CONTROL { - struct { - USHORT VFEnable:1; - USHORT VFMigrationEnable:1; - USHORT VFMigrationInterruptEnable:1; - USHORT VFMemorySpaceEnable:1; - USHORT ARICapableHierarchy:1; - USHORT Reserved1:11; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL; - -typedef union _PCI_EXPRESS_SRIOV_STATUS { - struct { - USHORT VFMigrationStatus:1; - USHORT Reserved1:15; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS; - -typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY { - struct { - ULONG VFMigrationStateBIR:3; - ULONG VFMigrationStateOffset:29; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY; - -typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities; - PCI_EXPRESS_SRIOV_CONTROL SRIOVControl; - PCI_EXPRESS_SRIOV_STATUS SRIOVStatus; - USHORT InitialVFs; - USHORT TotalVFs; - USHORT NumVFs; - UCHAR FunctionDependencyLink; - UCHAR RsvdP1; - USHORT FirstVFOffset; - USHORT VFStride; - USHORT RsvdP2; - USHORT VFDeviceId; - ULONG SupportedPageSizes; - ULONG SystemPageSize; - ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; - PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset; -} PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY; - -/* PCI device classes */ -#define PCI_CLASS_PRE_20 0x00 -#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 -#define PCI_CLASS_NETWORK_CTLR 0x02 -#define PCI_CLASS_DISPLAY_CTLR 0x03 -#define PCI_CLASS_MULTIMEDIA_DEV 0x04 -#define PCI_CLASS_MEMORY_CTLR 0x05 -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 -#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 -#define PCI_CLASS_INPUT_DEV 0x09 -#define PCI_CLASS_DOCKING_STATION 0x0a -#define PCI_CLASS_PROCESSOR 0x0b -#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c -#define PCI_CLASS_WIRELESS_CTLR 0x0d -#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e -#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f -#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 -#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 -#define PCI_CLASS_NOT_DEFINED 0xff - -/* PCI device subclasses for class 0 */ -#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 -#define PCI_SUBCLASS_PRE_20_VGA 0x01 - -/* PCI device subclasses for class 1 (mass storage controllers)*/ -#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 -#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 -#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 -#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 -#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 -#define PCI_SUBCLASS_MSC_OTHER 0x80 - -/* PCI device subclasses for class 2 (network controllers)*/ -#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 -#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 -#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 -#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 -#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 -#define PCI_SUBCLASS_NET_OTHER 0x80 - -/* PCI device subclasses for class 3 (display controllers)*/ -#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 -#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 -#define PCI_SUBCLASS_VID_3D_CTLR 0x02 -#define PCI_SUBCLASS_VID_OTHER 0x80 - -/* PCI device subclasses for class 4 (multimedia device)*/ -#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 -#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 -#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 -#define PCI_SUBCLASS_MM_OTHER 0x80 - -/* PCI device subclasses for class 5 (memory controller)*/ -#define PCI_SUBCLASS_MEM_RAM 0x00 -#define PCI_SUBCLASS_MEM_FLASH 0x01 -#define PCI_SUBCLASS_MEM_OTHER 0x80 - -/* PCI device subclasses for class 6 (bridge device)*/ -#define PCI_SUBCLASS_BR_HOST 0x00 -#define PCI_SUBCLASS_BR_ISA 0x01 -#define PCI_SUBCLASS_BR_EISA 0x02 -#define PCI_SUBCLASS_BR_MCA 0x03 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 -#define PCI_SUBCLASS_BR_PCMCIA 0x05 -#define PCI_SUBCLASS_BR_NUBUS 0x06 -#define PCI_SUBCLASS_BR_CARDBUS 0x07 -#define PCI_SUBCLASS_BR_RACEWAY 0x08 -#define PCI_SUBCLASS_BR_OTHER 0x80 - -#define PCI_SUBCLASS_COM_SERIAL 0x00 -#define PCI_SUBCLASS_COM_PARALLEL 0x01 -#define PCI_SUBCLASS_COM_MULTIPORT 0x02 -#define PCI_SUBCLASS_COM_MODEM 0x03 -#define PCI_SUBCLASS_COM_OTHER 0x80 - -#define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00 -#define PCI_SUBCLASS_SYS_DMA_CTLR 0x01 -#define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02 -#define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03 -#define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04 -#define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05 -#define PCI_SUBCLASS_SYS_OTHER 0x80 - -#define PCI_SUBCLASS_INP_KEYBOARD 0x00 -#define PCI_SUBCLASS_INP_DIGITIZER 0x01 -#define PCI_SUBCLASS_INP_MOUSE 0x02 -#define PCI_SUBCLASS_INP_SCANNER 0x03 -#define PCI_SUBCLASS_INP_GAMEPORT 0x04 -#define PCI_SUBCLASS_INP_OTHER 0x80 - -#define PCI_SUBCLASS_DOC_GENERIC 0x00 -#define PCI_SUBCLASS_DOC_OTHER 0x80 - -#define PCI_SUBCLASS_PROC_386 0x00 -#define PCI_SUBCLASS_PROC_486 0x01 -#define PCI_SUBCLASS_PROC_PENTIUM 0x02 -#define PCI_SUBCLASS_PROC_ALPHA 0x10 -#define PCI_SUBCLASS_PROC_POWERPC 0x20 -#define PCI_SUBCLASS_PROC_COPROCESSOR 0x40 - -/* PCI device subclasses for class C (serial bus controller)*/ -#define PCI_SUBCLASS_SB_IEEE1394 0x00 -#define PCI_SUBCLASS_SB_ACCESS 0x01 -#define PCI_SUBCLASS_SB_SSA 0x02 -#define PCI_SUBCLASS_SB_USB 0x03 -#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 -#define PCI_SUBCLASS_SB_SMBUS 0x05 - -#define PCI_SUBCLASS_WIRELESS_IRDA 0x00 -#define PCI_SUBCLASS_WIRELESS_CON_IR 0x01 -#define PCI_SUBCLASS_WIRELESS_RF 0x10 -#define PCI_SUBCLASS_WIRELESS_OTHER 0x80 - -#define PCI_SUBCLASS_INTIO_I2O 0x00 - -#define PCI_SUBCLASS_SAT_TV 0x01 -#define PCI_SUBCLASS_SAT_AUDIO 0x02 -#define PCI_SUBCLASS_SAT_VOICE 0x03 -#define PCI_SUBCLASS_SAT_DATA 0x04 - -#define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00 -#define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10 -#define PCI_SUBCLASS_CRYPTO_OTHER 0x80 - -#define PCI_SUBCLASS_DASP_DPIO 0x00 -#define PCI_SUBCLASS_DASP_OTHER 0x80 - -#define PCI_ADDRESS_IO_SPACE 0x00000001 -#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 -#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 -#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc -#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 -#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 - -#define PCI_TYPE_32BIT 0 -#define PCI_TYPE_20BIT 2 -#define PCI_TYPE_64BIT 4 - -#define PCI_ROMADDRESS_ENABLED 0x00000001 - -#endif /* _PCI_X_ */ - -#define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1 - -typedef NTSTATUS -(NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)( - IN OUT PVOID Context); -typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE; - -typedef NTSTATUS -(NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)( - IN OUT PVOID Context); -typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE; - -typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode; - PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode; -} PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE; - -#define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1 - -typedef ULONG -(NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)( - IN PVOID Context, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef ULONG -(NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)( - IN PVOID Context, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace; - PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace; -} PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE; - -#define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1 - -typedef NTSTATUS -(NTAPI PCI_MSIX_SET_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry, - IN ULONG MessageNumber); -typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY; - -typedef NTSTATUS -(NTAPI PCI_MSIX_MASKUNMASK_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry); -typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY; - -typedef NTSTATUS -(NTAPI PCI_MSIX_GET_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry, - OUT PULONG MessageNumber, - OUT PBOOLEAN Masked); -typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY; - -typedef NTSTATUS -(NTAPI PCI_MSIX_GET_TABLE_SIZE)( - IN PVOID Context, - OUT PULONG TableSize); -typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE; - -typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PPCI_MSIX_SET_ENTRY SetTableEntry; - PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry; - PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry; - PPCI_MSIX_GET_ENTRY GetTableEntry; - PPCI_MSIX_GET_TABLE_SIZE GetTableSize; -} PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE; - -#define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \ - RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry) - /****************************************************************************** * Object Manager Types * ******************************************************************************/ -#define MAXIMUM_FILENAME_LENGTH 256 -#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') - -#define OBJECT_TYPE_CREATE 0x0001 -#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DIRECTORY_QUERY 0x0001 -#define DIRECTORY_TRAVERSE 0x0002 -#define DIRECTORY_CREATE_OBJECT 0x0004 -#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008 -#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) - -#define SYMBOLIC_LINK_QUERY 0x0001 -#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DUPLICATE_CLOSE_SOURCE 0x00000001 -#define DUPLICATE_SAME_ACCESS 0x00000002 -#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 - -#define OB_FLT_REGISTRATION_VERSION_0100 0x0100 -#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100 - -typedef ULONG OB_OPERATION; - -#define OB_OPERATION_HANDLE_CREATE 0x00000001 -#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002 - -typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION { - IN OUT ACCESS_MASK DesiredAccess; - IN ACCESS_MASK OriginalDesiredAccess; -} OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION; - -typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION { - IN OUT ACCESS_MASK DesiredAccess; - IN ACCESS_MASK OriginalDesiredAccess; - IN PVOID SourceProcess; - IN PVOID TargetProcess; -} OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION; - -typedef union _OB_PRE_OPERATION_PARAMETERS { - IN OUT OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation; - IN OUT OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; -} OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS; - -typedef struct _OB_PRE_OPERATION_INFORMATION { - IN OB_OPERATION Operation; - union { - IN ULONG Flags; - struct { - IN ULONG KernelHandle:1; - IN ULONG Reserved:31; - }; - }; - IN PVOID Object; - IN POBJECT_TYPE ObjectType; - OUT PVOID CallContext; - IN POB_PRE_OPERATION_PARAMETERS Parameters; -} OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION; - -typedef struct _OB_POST_CREATE_HANDLE_INFORMATION { - IN ACCESS_MASK GrantedAccess; -} OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION; - -typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION { - IN ACCESS_MASK GrantedAccess; -} OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION; - -typedef union _OB_POST_OPERATION_PARAMETERS { - IN OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation; - IN OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; -} OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS; - -typedef struct _OB_POST_OPERATION_INFORMATION { - IN OB_OPERATION Operation; - union { - IN ULONG Flags; - struct { - IN ULONG KernelHandle:1; - IN ULONG Reserved:31; - }; - }; - IN PVOID Object; - IN POBJECT_TYPE ObjectType; - IN PVOID CallContext; - IN NTSTATUS ReturnStatus; - IN POB_POST_OPERATION_PARAMETERS Parameters; -} OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION; - -typedef enum _OB_PREOP_CALLBACK_STATUS { - OB_PREOP_SUCCESS -} OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS; - -typedef OB_PREOP_CALLBACK_STATUS -(NTAPI *POB_PRE_OPERATION_CALLBACK)( - IN PVOID RegistrationContext, - IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation); - -typedef VOID -(NTAPI *POB_POST_OPERATION_CALLBACK)( - IN PVOID RegistrationContext, - IN POB_POST_OPERATION_INFORMATION OperationInformation); - -typedef struct _OB_OPERATION_REGISTRATION { - IN POBJECT_TYPE *ObjectType; - IN OB_OPERATION Operations; - IN POB_PRE_OPERATION_CALLBACK PreOperation; - IN POB_POST_OPERATION_CALLBACK PostOperation; -} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION; - -typedef struct _OB_CALLBACK_REGISTRATION { - IN USHORT Version; - IN USHORT OperationRegistrationCount; - IN UNICODE_STRING Altitude; - IN PVOID RegistrationContext; - IN OB_OPERATION_REGISTRATION *OperationRegistration; -} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION; - typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; @@ -7570,6 +5680,16 @@ extern POBJECT_TYPE NTSYSAPI PsProcessType; #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 +/* Process Qoutas */ +typedef struct _QUOTA_LIMITS { + SIZE_T PagedPoolLimit; + SIZE_T NonPagedPoolLimit; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + SIZE_T PagefileLimit; + LARGE_INTEGER TimeLimit; +} QUOTA_LIMITS, *PQUOTA_LIMITS; + /* Thread Access Rights */ #define THREAD_TERMINATE 0x0001 #define THREAD_SUSPEND_RESUME 0x0002 @@ -7594,76 +5714,18 @@ extern POBJECT_TYPE NTSYSAPI PsProcessType; #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF) #endif +#define ES_SYSTEM_REQUIRED 0x00000001 +#define ES_DISPLAY_REQUIRED 0x00000002 +#define ES_USER_PRESENT 0x00000004 +#define ES_CONTINUOUS 0x80000000 + #define LOW_PRIORITY 0 #define LOW_REALTIME_PRIORITY 16 #define HIGH_PRIORITY 31 #define MAXIMUM_PRIORITY 32 -/****************************************************************************** - * WMI Library Support Types * - ******************************************************************************/ - -#ifdef RUN_WPP -#include -#include -#endif - -#ifndef _TRACEHANDLE_DEFINED -#define _TRACEHANDLE_DEFINED -typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; -#endif - -#ifndef TRACE_INFORMATION_CLASS_DEFINE - -typedef struct _ETW_TRACE_SESSION_SETTINGS { - ULONG Version; - ULONG BufferSize; - ULONG MinimumBuffers; - ULONG MaximumBuffers; - ULONG LoggerMode; - ULONG FlushTimer; - ULONG FlushThreshold; - ULONG ClockType; -} ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS; - -typedef enum _TRACE_INFORMATION_CLASS { - TraceIdClass, - TraceHandleClass, - TraceEnableFlagsClass, - TraceEnableLevelClass, - GlobalLoggerHandleClass, - EventLoggerHandleClass, - AllLoggerHandlesClass, - TraceHandleByNameClass, - LoggerEventsLostClass, - TraceSessionSettingsClass, - LoggerEventsLoggedClass, - MaxTraceInformationClass -} TRACE_INFORMATION_CLASS; - -#endif /* TRACE_INFORMATION_CLASS_DEFINE */ - -#ifndef _ETW_KM_ -#define _ETW_KM_ -#endif - -#include - -typedef VOID -(NTAPI *PETWENABLECALLBACK)( - IN LPCGUID SourceId, - IN ULONG ControlCode, - IN UCHAR Level, - IN ULONGLONG MatchAnyKeyword, - IN ULONGLONG MatchAllKeyword, - IN PEVENT_FILTER_DESCRIPTOR FilterData OPTIONAL, - IN OUT PVOID CallbackContext OPTIONAL); - -#define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001 - - -#if defined(_M_IX86) +#ifdef _X86_ /** Kernel definitions for x86 **/ /* Interrupt request levels */ @@ -7824,346 +5886,11 @@ _KeQueryTickCount( } #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) +#endif /* _X86_ */ -#elif defined(_M_AMD64) -/** Kernel definitions for AMD64 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMCI_LEVEL 5 -#define CLOCK_LEVEL 13 -#define IPI_LEVEL 14 -#define DRS_LEVEL 14 -#define POWER_LEVEL 14 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL -#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) -#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) -#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) -#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L - -#define EFLAG_SIGN 0x8000 -#define EFLAG_ZERO 0x4000 -#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) - -#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) - - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; - -#define KeQueryInterruptTime() \ - (*(volatile ULONG64*)SharedInterruptTime) - -#define KeQuerySystemTime(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime - -#define KeQueryTickCount(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount - -#define KeGetDcacheFillSize() 1L - -#define YieldProcessor _mm_pause - -FORCEINLINE -KIRQL -KeGetCurrentIrql(VOID) -{ - return (KIRQL)__readcr8(); -} - -FORCEINLINE -VOID -KeLowerIrql(IN KIRQL NewIrql) -{ - //ASSERT(KeGetCurrentIrql() >= NewIrql); - __writecr8(NewIrql); -} - -FORCEINLINE -KIRQL -KfRaiseIrql(IN KIRQL NewIrql) -{ - KIRQL OldIrql; - - OldIrql = __readcr8(); - //ASSERT(OldIrql <= NewIrql); - __writecr8(NewIrql); - return OldIrql; -} -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -FORCEINLINE -KIRQL -KeRaiseIrqlToDpcLevel(VOID) -{ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -FORCEINLINE -KIRQL -KeRaiseIrqlToSynchLevel(VOID) -{ - return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 - } - -FORCEINLINE -PKTHREAD -KeGetCurrentThread(VOID) -{ - return (struct _KTHREAD *)__readgsqword(0x188); -} - -/* VOID - * KeFlushIoBuffers( - * IN PMDL Mdl, - * IN BOOLEAN ReadOperation, - * IN BOOLEAN DmaOperation) - */ -#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) - -/* x86 and x64 performs a 0x2C interrupt */ -#define DbgRaiseAssertionFailure __int2c - -#elif defined(_M_IA64) -/** Kernel definitions for IA64 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMC_LEVEL 3 -#define DEVICE_LEVEL_BASE 4 -#define PC_LEVEL 12 -#define IPI_LEVEL 14 -#define DRS_LEVEL 14 -#define CLOCK_LEVEL 13 -#define POWER_LEVEL 15 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) -extern volatile LARGE_INTEGER KeTickCount; - -#define PAUSE_PROCESSOR __yield(); - -FORCEINLINE -VOID -KeFlushWriteBuffer(VOID) -{ - __mf (); - return; -} - -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - - -#elif defined(_M_PPC) - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef struct _KPCR_TIB { - PVOID ExceptionList; /* 00 */ - PVOID StackBase; /* 04 */ - PVOID StackLimit; /* 08 */ - PVOID SubSystemTib; /* 0C */ - _ANONYMOUS_UNION union { - PVOID FiberData; /* 10 */ - ULONG Version; /* 10 */ - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; /* 14 */ - struct _KPCR_TIB *Self; /* 18 */ -} KPCR_TIB, *PKPCR_TIB; /* 1C */ - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR { - KPCR_TIB Tib; /* 00 */ - struct _KPCR *Self; /* 1C */ - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IrrActive; /* 2C */ - ULONG IDR; /* 30 */ - PVOID KdVersionBlock; /* 34 */ - PUSHORT IDT; /* 38 */ - PUSHORT GDT; /* 3C */ - struct _KTSS *TSS; /* 40 */ - USHORT MajorVersion; /* 44 */ - USHORT MinorVersion; /* 46 */ - KAFFINITY SetMember; /* 48 */ - ULONG StallScaleFactor; /* 4C */ - UCHAR SpareUnused; /* 50 */ - UCHAR Number; /* 51 */ -} KPCR, *PKPCR; /* 54 */ - -#define KeGetPcr() PCR - -#define YieldProcessor() __asm__ __volatile__("nop"); - -FORCEINLINE -ULONG -NTAPI -KeGetCurrentProcessorNumber(VOID) -{ - ULONG Number; - __asm__ __volatile__ ( - "lwz %0, %c1(12)\n" - : "=r" (Number) - : "i" (FIELD_OFFSET(KPCR, Number)) - ); - return Number; -} - -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - IN KIRQL NewIrql); -#define KeLowerIrql(a) KfLowerIrql(a) - -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - IN KIRQL NewIrql); -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - - - -#elif defined(_M_MIPS) -#error MIPS Headers are totally incorrect - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - -#define PASSIVE_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define IPI_LEVEL 29 -#define HIGH_LEVEL 31 - -typedef struct _KPCR { - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IDR; /* 30 */ -} KPCR, *PKPCR; - -#define KeGetPcr() PCR - -typedef struct _KFLOATING_SAVE { -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -static __inline -ULONG -NTAPI -KeGetCurrentProcessorNumber(VOID) -{ - return 0; -} - -#define YieldProcessor() __asm__ __volatile__("nop"); - -#define KeLowerIrql(a) KfLowerIrql(a) -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTKERNELAPI -VOID -NTAPI -KfLowerIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KfRaiseIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - - -#elif defined(_M_ARM) -#include -#else -#error Unknown Architecture -#endif - -/****************************************************************************** - * Runtime Library Functions * - ******************************************************************************/ - - -#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) - -#define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } - FORCEINLINE VOID InitializeListHead( @@ -8172,6 +5899,34 @@ InitializeListHead( ListHead->Flink = ListHead->Blink = ListHead; } +FORCEINLINE +VOID +InsertHeadList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + OldFlink = ListHead->Flink; + Entry->Flink = OldFlink; + Entry->Blink = ListHead; + OldFlink->Blink = Entry; + ListHead->Flink = Entry; +} + +FORCEINLINE +VOID +InsertTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldBlink; + OldBlink = ListHead->Blink; + Entry->Flink = ListHead; + Entry->Blink = OldBlink; + OldBlink->Flink = Entry; + ListHead->Blink = Entry; +} + BOOLEAN FORCEINLINE IsListEmpty( @@ -8180,6 +5935,29 @@ IsListEmpty( return (BOOLEAN)(ListHead->Flink == ListHead); } +FORCEINLINE +PSINGLE_LIST_ENTRY +PopEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead) +{ + PSINGLE_LIST_ENTRY FirstEntry; + FirstEntry = ListHead->Next; + if (FirstEntry != NULL) { + ListHead->Next = FirstEntry->Next; + } + return FirstEntry; +} + +FORCEINLINE +VOID +PushEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead, + IN OUT PSINGLE_LIST_ENTRY Entry) +{ + Entry->Next = ListHead->Next; + ListHead->Next = Entry; +} + FORCEINLINE BOOLEAN RemoveEntryList( @@ -8225,73 +6003,6 @@ RemoveTailList( return Entry; } -FORCEINLINE -VOID -InsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldBlink; - OldBlink = ListHead->Blink; - Entry->Flink = ListHead; - Entry->Blink = OldBlink; - OldBlink->Flink = Entry; - ListHead->Blink = Entry; -} - -FORCEINLINE -VOID -InsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldFlink; - OldFlink = ListHead->Flink; - Entry->Flink = OldFlink; - Entry->Blink = ListHead; - OldFlink->Blink = Entry; - ListHead->Flink = Entry; -} - -FORCEINLINE -VOID -AppendTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY ListToAppend) -{ - PLIST_ENTRY ListEnd = ListHead->Blink; - - ListHead->Blink->Flink = ListToAppend; - ListHead->Blink = ListToAppend->Blink; - ListToAppend->Blink->Flink = ListHead; - ListToAppend->Blink = ListEnd; -} - -FORCEINLINE -PSINGLE_LIST_ENTRY -PopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead) -{ - PSINGLE_LIST_ENTRY FirstEntry; - FirstEntry = ListHead->Next; - if (FirstEntry != NULL) { - ListHead->Next = FirstEntry->Next; - } - return FirstEntry; -} - -FORCEINLINE -VOID -PushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY Entry) -{ - Entry->Next = ListHead->Next; - ListHead->Next = Entry; -} - -#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ - NTSYSAPI VOID NTAPI @@ -8652,6 +6363,15 @@ RtlFindSetBitsAndClear( IN ULONG NumberToFind, IN ULONG HintIndex); +NTSYSAPI +NTSTATUS +NTAPI +RtlHashUnicodeString( + IN CONST UNICODE_STRING *String, + IN BOOLEAN CaseInSensitive, + IN ULONG HashAlgorithm, + OUT PULONG HashValue); + NTSYSAPI VOID NTAPI @@ -8741,10 +6461,49 @@ RtlQueryRegistryValues( #define LONGLONG_MASK (LONGLONG_SIZE - 1) #define LOWBYTE_MASK 0x00FF -#define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK) -#define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK) -#define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK) -#define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK) +/* VOID + * RtlRetrieveUlong( + * PULONG DestinationAddress, + * PULONG SourceAddress); + */ +#if defined(_AMD64_) +#define RtlRetrieveUlong(DestAddress,SrcAddress) \ + *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress) +#else +#define RtlRetrieveUlong(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ + ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ + } \ + else \ + { \ + *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ + } +#endif + +/* VOID + * RtlRetrieveUshort( + * PUSHORT DestinationAddress, + * PUSHORT SourceAddress); + */ +#if defined(_AMD64_) +#define RtlRetrieveUshort(DestAddress,SrcAddress) \ + *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress) +#else +#define RtlRetrieveUshort(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + } \ + else \ + { \ + *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ + } +#endif NTSYSAPI VOID @@ -8823,7 +6582,17 @@ RtlSetDaclSecurityDescriptor( else { \ *((PULONG)(Address)) = (ULONG) (Value); \ } +#endif +/* VOID + * RtlStoreUlonglong( + * IN OUT PULONGLONG Address, + * ULONGLONG Value); + */ +#if defined(_AMD64_) +#define RtlStoreUlonglong(Address,Value) \ + *(ULONGLONG UNALIGNED *)(Address) = (Value) +#else #define RtlStoreUlonglong(Address,Value) \ if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \ RtlStoreUlong((ULONG_PTR)(Address), \ @@ -8833,7 +6602,30 @@ RtlSetDaclSecurityDescriptor( } else { \ *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \ } +#endif +/* VOID + * RtlStoreUlongPtr( + * IN OUT PULONG_PTR Address, + * IN ULONG_PTR Value); + */ +#ifdef _WIN64 +#define RtlStoreUlongPtr(Address,Value) \ + RtlStoreUlonglong(Address,Value) +#else +#define RtlStoreUlongPtr(Address,Value) \ + RtlStoreUlong(Address,Value) +#endif + +/* VOID + * RtlStoreUshort( + * IN PUSHORT Address, + * IN USHORT Value); + */ +#if defined(_AMD64_) +#define RtlStoreUshort(Address,Value) \ + *(USHORT UNALIGNED *)(Address) = (Value) +#else #define RtlStoreUshort(Address,Value) \ if ((ULONG_PTR)(Address) & SHORT_MASK) { \ ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \ @@ -8842,44 +6634,7 @@ RtlSetDaclSecurityDescriptor( else { \ *((PUSHORT) (Address)) = (USHORT)Value; \ } - -#define RtlRetrieveUshort(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - } \ - else \ - { \ - *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ - } - -#define RtlRetrieveUlong(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ - ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ - } \ - else \ - { \ - *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ - } - -#endif /* defined(_AMD64_) */ - -#ifdef _WIN64 -/* VOID - * RtlStoreUlongPtr( - * IN OUT PULONG_PTR Address, - * IN ULONG_PTR Value); - */ -#define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value) -#else -#define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value) -#endif /* _WIN64 */ - +#endif NTSYSAPI BOOLEAN @@ -9145,34 +6900,6 @@ RtlConvertUlongToLargeInteger( return ret; } -//DECLSPEC_DEPRECATED_DDK_WINXP -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerShiftLeft( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) -{ - LARGE_INTEGER Result; - - Result.QuadPart = LargeInteger.QuadPart << ShiftCount; - return Result; -} - -//DECLSPEC_DEPRECATED_DDK_WINXP -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerShiftRight( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) -{ - LARGE_INTEGER Result; - - Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount; - return Result; -} - //DECLSPEC_DEPRECATED_DDK static __inline ULONG @@ -9187,33 +6914,6 @@ RtlEnlargedUnsignedDivide( return (ULONG)(Dividend.QuadPart / Divisor); } -//DECLSPEC_DEPRECATED_DDK -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerNegate( - IN LARGE_INTEGER Subtrahend) -{ - LARGE_INTEGER Difference; - - Difference.QuadPart = -Subtrahend.QuadPart; - return Difference; -} - -//DECLSPEC_DEPRECATED_DDK -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerSubtract( - IN LARGE_INTEGER Minuend, - IN LARGE_INTEGER Subtrahend) -{ - LARGE_INTEGER Difference; - - Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart; - return Difference; -} - //DECLSPEC_DEPRECATED_DDK static __inline LARGE_INTEGER @@ -9492,10 +7192,6 @@ RtlCheckBit( (__annotation(L"Debug", L"AssertFail", msg), \ DbgRaiseAssertionFailure(), FALSE) : TRUE) -#define NT_VERIFY NT_ASSERT -#define NT_VERIFYMSG NT_ASSERTMSG -#define NT_VERIFYMSGW NT_ASSERTMSGW - #else /* GCC doesn't support __annotation (nor PDB) */ @@ -9522,8 +7218,8 @@ RtlCheckBit( #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) #define NT_ASSERT(exp) ((VOID)0) -#define NT_ASSERTMSG(msg, exp) ((VOID)0) -#define NT_ASSERTMSGW(msg, exp) ((VOID)0) +#define NT_ASSERTMSG(exp) ((VOID)0) +#define NT_ASSERTMSGW(exp) ((VOID)0) #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE) #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE) @@ -9610,61 +7306,16 @@ InterlockedPushEntrySList( #endif /* !defined(_WINBASE_) */ -#define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset) -#define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length) -#define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \ - ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk))) -#define RTL_CONTEXT_OFFSET(Context, Chunk) \ - RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk) -#define RTL_CONTEXT_LENGTH(Context, Chunk) \ - RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk) -#define RTL_CONTEXT_CHUNK(Context, Chunk) \ - RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \ - (PCONTEXT_EX)(Context + 1), \ - Chunk) - -BOOLEAN -RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)( - IN ULONG Version); - -BOOLEAN -RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( - IN ULONG Version); - -#ifndef RtlIsNtDdiVersionAvailable -#define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable -#endif - -#ifndef RtlIsServicePackVersionInstalled -#define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled -#endif - -#define RtlInterlockedSetBits(Flags, Flag) \ - InterlockedOr((PLONG)(Flags), Flag) - -#define RtlInterlockedAndBits(Flags, Flag) \ - InterlockedAnd((PLONG)(Flags), Flag) - -#define RtlInterlockedClearBits(Flags, Flag) \ - RtlInterlockedAndBits(Flags, ~(Flag)) - -#define RtlInterlockedXorBits(Flags, Flag) \ - InterlockedXor(Flags, Flag) - -#define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \ - (VOID) RtlInterlockedSetBits(Flags, Flag) - -#define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \ - (VOID) RtlInterlockedAndBits(Flags, Flag) - -#define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \ - RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag)) - - /****************************************************************************** * Kernel Functions * ******************************************************************************/ +NTHALAPI +KIRQL +NTAPI +KeGetCurrentIrql( + VOID); + NTKERNELAPI VOID NTAPI @@ -10551,22 +8202,6 @@ KeFlushWriteBuffer(VOID); #define ALIGN_UP_POINTER(ptr, type) \ ALIGN_UP_POINTER_BY(ptr, sizeof(type)) -#ifndef FIELD_OFFSET -#define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field)) -#endif - -#ifndef FIELD_SIZE -#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) -#endif - -#define POOL_TAGGING 1 - -#if DBG -#define IF_DEBUG if (TRUE) -#else -#define IF_DEBUG if (FALSE) -#endif /* DBG */ - /* ULONG * BYTE_OFFSET( * IN PVOID Va) @@ -10579,7 +8214,7 @@ KeFlushWriteBuffer(VOID); * IN ULONG Size) */ #define BYTES_TO_PAGES(Size) \ - (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT) + (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) /* PVOID * PAGE_ALIGN( @@ -10873,16 +8508,7 @@ MmUnmapLockedPages( IN PVOID BaseAddress, IN PMDL MemoryDescriptorList); -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemorySpecifyCacheNode( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType, - IN NODE_REQUIREMENT PreferredNode); + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -10939,22 +8565,6 @@ MmUnmapReservedMapping( IN ULONG PoolTag, IN PMDL MemoryDescriptorList); -NTKERNELAPI -NTSTATUS -NTAPI -MmAddVerifierThunks( - IN PVOID ThunkBuffer, - IN ULONG ThunkBufferSize); - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_WS03) -NTKERNELAPI -LOGICAL -NTAPI -MmIsIoSpaceActive( - IN PHYSICAL_ADDRESS StartAddress, - IN SIZE_T NumberOfBytes); #endif #if (NTDDI_VERSION >= NTDDI_WS03SP1) @@ -11183,40 +8793,6 @@ CmGetBoundTransaction( * I/O Manager Functions * ******************************************************************************/ - -/* - * NTSTATUS - * IoAcquireRemoveLock( - * IN PIO_REMOVE_LOCK RemoveLock, - * IN OPTIONAL PVOID Tag) - */ -#if DBG -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) -#else -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) -#endif - -/* - * VOID - * IoAdjustPagingPathCount( - * IN PLONG Count, - * IN BOOLEAN Increment) - */ -#define IoAdjustPagingPathCount(_Count, \ - _Increment) \ -{ \ - if (_Increment) \ - { \ - InterlockedIncrement(_Count); \ - } \ - else \ - { \ - InterlockedDecrement(_Count); \ - } \ -} - #if !defined(_M_AMD64) NTHALAPI VOID @@ -11743,6 +9319,43 @@ IoAcquireRemoveLockEx( IN PCSTR File, IN ULONG Line, IN ULONG RemlockSize); +#endif + +/* + * NTSTATUS + * IoAcquireRemoveLock( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN OPTIONAL PVOID Tag) + */ +#if DBG +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) +#else +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) +#endif + +/* + * VOID + * IoAdjustPagingPathCount( + * IN PLONG Count, + * IN BOOLEAN Increment) + */ +#define IoAdjustPagingPathCount(_Count, \ + _Increment) \ +{ \ + if (_Increment) \ + { \ + InterlockedIncrement(_Count); \ + } \ + else \ + { \ + InterlockedDecrement(_Count); \ + } \ +} + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + NTKERNELAPI NTSTATUS NTAPI @@ -12538,237 +10151,9 @@ IoWMISetSingleItem( IN ULONG Version, IN ULONG ValueBufferSize, IN PVOID ValueBuffer); -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ -#if (NTDDI_VERSION >= NTDDI_WINXPSP1) -NTKERNELAPI -NTSTATUS -NTAPI -IoValidateDeviceIoControlAccess( - IN PIRP Irp, - IN ULONG RequiredAccess); #endif -#if (NTDDI_VERSION >= NTDDI_WS03) - -NTKERNELAPI -NTSTATUS -NTAPI -IoCsqInitializeEx( - IN PIO_CSQ Csq, - IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp, - IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp, - IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, - IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, - IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock, - IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCsqInsertIrpEx( - IN PIO_CSQ Csq, - IN PIRP Irp, - IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL, - IN PVOID InsertContext OPTIONAL); -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ - - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetBootDiskInformationLite( - OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCheckShareAccessEx( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess, - IN BOOLEAN Update, - IN PBOOLEAN WritePermission); - -NTKERNELAPI -NTSTATUS -NTAPI -IoConnectInterruptEx( - IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); - -NTKERNELAPI -VOID -NTAPI -IoDisconnectInterruptEx( - IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); - -LOGICAL -NTAPI -IoWithinStackLimits( - IN ULONG_PTR RegionStart, - IN SIZE_T RegionSize); - -NTKERNELAPI -VOID -NTAPI -IoSetShareAccessEx( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - OUT PSHARE_ACCESS ShareAccess, - IN PBOOLEAN WritePermission); - -ULONG -NTAPI -IoSizeofWorkItem(VOID); - -VOID -NTAPI -IoInitializeWorkItem( - IN PVOID IoObject, - IN PIO_WORKITEM IoWorkItem); - -VOID -NTAPI -IoUninitializeWorkItem( - IN PIO_WORKITEM IoWorkItem); - -VOID -NTAPI -IoQueueWorkItemEx( - IN PIO_WORKITEM IoWorkItem, - IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine, - IN WORK_QUEUE_TYPE QueueType, - IN PVOID Context OPTIONAL); - -IO_PRIORITY_HINT -NTAPI -IoGetIoPriorityHint( - IN PIRP Irp); - -NTSTATUS -NTAPI -IoSetIoPriorityHint( - IN PIRP Irp, - IN IO_PRIORITY_HINT PriorityHint); - -NTSTATUS -NTAPI -IoAllocateSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN ULONG Length, - IN PVOID Signature, - OUT PVOID *StreamIdentifier); - -PVOID -NTAPI -IoGetSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN PVOID Signature); - -NTSTATUS -NTAPI -IoFreeSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN PVOID Signature); - -NTKERNELAPI -NTSTATUS -NTAPI -IoRequestDeviceEjectEx( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL, - IN PVOID Context OPTIONAL, - IN PDRIVER_OBJECT DriverObject OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetDevicePropertyData( - IN PDEVICE_OBJECT Pdo, - IN CONST DEVPROPKEY *PropertyKey, - IN LCID Lcid, - IN ULONG Flags, - IN DEVPROPTYPE Type, - IN ULONG Size, - IN PVOID Data OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDevicePropertyData( - PDEVICE_OBJECT Pdo, - CONST DEVPROPKEY *PropertyKey, - LCID Lcid, - ULONG Flags, - ULONG Size, - PVOID Data, - PULONG RequiredSize, - PDEVPROPTYPE Type); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b) - -#if (NTDDI_VERSION >= NTDDI_WS08) -NTKERNELAPI -NTSTATUS -NTAPI -IoReplacePartitionUnit( - IN PDEVICE_OBJECT TargetPdo, - IN PDEVICE_OBJECT SparePdo, - IN ULONG Flags); -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetAffinityInterrupt( - IN PKINTERRUPT InterruptObject, - OUT PGROUP_AFFINITY GroupAffinity); - -NTSTATUS -NTAPI -IoGetContainerInformation( - IN IO_CONTAINER_INFORMATION_CLASS InformationClass, - IN PVOID ContainerObject OPTIONAL, - IN OUT PVOID Buffer OPTIONAL, - IN ULONG BufferLength); - -NTSTATUS -NTAPI -IoRegisterContainerNotification( - IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass, - IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction, - IN PVOID NotificationInformation OPTIONAL, - IN ULONG NotificationInformationLength, - OUT PVOID CallbackRegistration); - -VOID -NTAPI -IoUnregisterContainerNotification( - IN PVOID CallbackRegistration); - -NTKERNELAPI -NTSTATUS -NTAPI -IoUnregisterPlugPlayNotificationEx( - IN PVOID NotificationEntry); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDeviceNumaNode( - IN PDEVICE_OBJECT Pdo, - OUT PUSHORT NodeNumber); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - #if defined(_WIN64) NTKERNELAPI ULONG @@ -13189,57 +10574,12 @@ PoCreatePowerRequest( #define ExInitializeSListHead InitializeSListHead -#if defined(_NTHAL_) && defined(_X86_) - -NTKERNELAPI -VOID -FASTCALL -ExiAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -VOID -FASTCALL -ExiReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExiTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - +#if defined(_X86_) +#if defined(_NTHAL_) #define ExAcquireFastMutex ExiAcquireFastMutex #define ExReleaseFastMutex ExiReleaseFastMutex #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex - -#else - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -VOID -FASTCALL -ExAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#endif /* defined(_NTHAL_) && defined(_X86_) */ - -#if defined(_X86_) +#endif #define ExInterlockedAddUlong ExfInterlockedAddUlong #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList #define ExInterlockedInsertTailList ExfInterlockedInsertTailList @@ -13297,8 +10637,6 @@ FASTCALL ExInterlockedFlushSList( IN OUT PSLIST_HEADER ListHead); -#endif /* !defined(_WIN64) */ - #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) NTKERNELAPI @@ -13315,70 +10653,20 @@ ExInterlockedPushEntrySList( IN PSLIST_HEADER ListHead, IN PSINGLE_LIST_ENTRY ListEntry, IN PKSPIN_LOCK Lock); - -NTKERNELAPI -PVOID -NTAPI -ExAllocateFromPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside); - -NTKERNELAPI -VOID -NTAPI -ExFreeToPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry); - -#else /* !_WIN2K_COMPAT_SLIST_USAGE */ - -#if !defined(_WIN64) +#else #define ExInterlockedPopEntrySList(_ListHead, _Lock) \ InterlockedPopEntrySList(_ListHead) #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \ InterlockedPushEntrySList(_ListHead, _ListEntry) -#endif - -static __inline -PVOID -ExAllocateFromPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside) -{ - PVOID Entry; - - Lookaside->L.TotalAllocates++; - Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); - if (Entry == NULL) { - Lookaside->L.AllocateMisses++; - Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, - Lookaside->L.Size, - Lookaside->L.Tag); - } - return Entry; -} - -static __inline -VOID -ExFreeToPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) -{ - Lookaside->L.TotalFrees++; - if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { - Lookaside->L.FreeMisses++; - (Lookaside->L.Free)(Entry); - } else { - InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); - } -} - -#endif /* _WIN2K_COMPAT_SLIST_USAGE */ +#endif // _WIN2K_COMPAT_SLIST_USAGE +#endif // !defined(_WIN64) /* ERESOURCE_THREAD * ExGetCurrentResourceThread( * VOID); */ -#define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread()) +#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread()) #define ExReleaseResource(R) (ExReleaseResourceLite(R)) @@ -13409,6 +10697,24 @@ ExInitializeFastMutex( #if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +VOID +FASTCALL +ExAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExTryToAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + NTKERNELAPI VOID FASTCALL @@ -13456,6 +10762,10 @@ ExAllocatePool( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); +#ifdef POOL_TAGGING +#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') +#endif /* POOL_TAGGING */ + NTKERNELAPI PVOID NTAPI @@ -13463,6 +10773,10 @@ ExAllocatePoolWithQuota( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); +#ifdef POOL_TAGGING +#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') +#endif /* POOL_TAGGING */ + NTKERNELAPI PVOID NTAPI @@ -13483,10 +10797,6 @@ ExAllocatePoolWithTag( IN SIZE_T NumberOfBytes, IN ULONG Tag); -#ifndef POOL_TAGGING -#define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) -#endif - NTKERNELAPI PVOID NTAPI @@ -13535,6 +10845,10 @@ NTAPI ExFreePool( IN PVOID P); +#ifdef POOL_TAGGING +#define ExFreePool(P) ExFreePoolWithTag(P, 0) +#endif + NTKERNELAPI VOID NTAPI @@ -13962,83 +11276,35 @@ ExInitializeLookasideListEx( IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth); +#endif -NTKERNELAPI -VOID -NTAPI -ExDeleteLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside); +#if !defined(MIDL_PASS) -NTKERNELAPI -VOID -NTAPI -ExFlushLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside); - -FORCEINLINE -PVOID -ExAllocateFromLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside) +static __inline PVOID +ExAllocateFromNPagedLookasideList( + IN PNPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates += 1; Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); if (Entry == NULL) { - Lookaside->L.AllocateMisses += 1; - Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type, + Lookaside->L.AllocateMisses++; + Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, Lookaside->L.Size, - Lookaside->L.Tag, - Lookaside); + Lookaside->L.Tag); } return Entry; } -FORCEINLINE -VOID -ExFreeToLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside, - IN PVOID Entry) -{ - Lookaside->L.TotalFrees += 1; - if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { - Lookaside->L.FreeMisses += 1; - (Lookaside->L.FreeEx)(Entry, Lookaside); - } else { - InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); - } - return; -} - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -VOID -NTAPI -ExSetResourceOwnerPointerEx( - IN OUT PERESOURCE Resource, - IN PVOID OwnerPointer, - IN ULONG Flags); - -#define FLAG_OWNER_POINTER_IS_THREAD 0x1 - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - static __inline PVOID -ExAllocateFromNPagedLookasideList( - IN OUT PNPAGED_LOOKASIDE_LIST Lookaside) +ExAllocateFromPagedLookasideList( + IN PPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates++; -#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) - Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead, - &Lookaside->Lock__ObsoleteButDoNotDelete); -#else Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); -#endif if (Entry == NULL) { Lookaside->L.AllocateMisses++; Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, @@ -14058,16 +11324,25 @@ ExFreeToNPagedLookasideList( Lookaside->L.FreeMisses++; (Lookaside->L.Free)(Entry); } else { -#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) - ExInterlockedPushEntrySList(&Lookaside->L.ListHead, - (PSLIST_ENTRY)Entry, - &Lookaside->Lock__ObsoleteButDoNotDelete); -#else InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); -#endif } } +static __inline VOID +ExFreeToPagedLookasideList( + IN PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry) +{ + Lookaside->L.TotalFrees++; + if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { + Lookaside->L.FreeMisses++; + (Lookaside->L.Free)(Entry); + } else { + InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); + } +} + +#endif // !defined(MIDL_PASS) /****************************************************************************** * Object Manager Functions * @@ -14303,115 +11578,8 @@ WmiTraceMessageVa( IN va_list MessageArgList); #endif -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#ifndef TRACE_INFORMATION_CLASS_DEFINE - -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -NTSTATUS -NTAPI -WmiQueryTraceInformation( - IN TRACE_INFORMATION_CLASS TraceInformationClass, - OUT PVOID TraceInformation, - IN ULONG TraceInformationLength, - OUT PULONG RequiredLength OPTIONAL, - IN PVOID Buffer OPTIONAL); #endif -#define TRACE_INFORMATION_CLASS_DEFINE - -#endif /* TRACE_INFOPRMATION_CLASS_DEFINE */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTSTATUS -NTKERNELAPI -NTAPI -EtwRegister( - IN LPCGUID ProviderId, - IN PETWENABLECALLBACK EnableCallback OPTIONAL, - IN PVOID CallbackContext OPTIONAL, - OUT PREGHANDLE RegHandle); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwUnregister( - IN REGHANDLE RegHandle); - -BOOLEAN -NTKERNELAPI -NTAPI -EtwEventEnabled( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor); - -BOOLEAN -NTKERNELAPI -NTAPI -EtwProviderEnabled( - IN REGHANDLE RegHandle, - IN UCHAR Level, - IN ULONGLONG Keyword); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwActivityIdControl( - IN ULONG ControlCode, - IN OUT LPGUID ActivityId); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwWrite( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor, - IN LPCGUID ActivityId OPTIONAL, - IN ULONG UserDataCount, - IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwWriteTransfer( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor, - IN LPCGUID ActivityId OPTIONAL, - IN LPCGUID RelatedActivityId OPTIONAL, - IN ULONG UserDataCount, - IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwWriteString( - IN REGHANDLE RegHandle, - IN UCHAR Level, - IN ULONGLONG Keyword, - IN LPCGUID ActivityId OPTIONAL, - IN PCWSTR String); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTSTATUS -NTKERNELAPI -NTAPI -EtwWriteEx( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor, - IN ULONG64 Filter, - IN ULONG Flags, - IN LPCGUID ActivityId OPTIONAL, - IN LPCGUID RelatedActivityId OPTIONAL, - IN ULONG UserDataCount, - IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); -#endif - - - /****************************************************************************** * Kernel Debugger Functions * ******************************************************************************/ @@ -14423,86 +11591,8 @@ __cdecl DbgPrint( IN PCSTR Format, IN ...); - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -ULONG -__cdecl -DbgPrintReturnControlC( - IN PCCH Format, - IN ...); #endif -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -ULONG -__cdecl -DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCSTR Format, - IN ...); - -#ifdef _VA_LIST_DEFINED - -NTSYSAPI -ULONG -NTAPI -vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -NTSYSAPI -ULONG -NTAPI -vDbgPrintExWithPrefix( - IN PCCH Prefix, - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -#endif /* _VA_LIST_DEFINED */ - -NTSYSAPI -NTSTATUS -NTAPI -DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level); - -NTSYSAPI -NTSTATUS -NTAPI -DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOLEAN State); - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -typedef VOID -(*PDEBUG_PRINT_CALLBACK)( - IN PSTRING Output, - IN ULONG ComponentId, - IN ULONG Level); - -NTSYSAPI -NTSTATUS -NTAPI -DbgSetDebugPrintCallback( - IN PDEBUG_PRINT_CALLBACK DebugPrintCallback, - IN BOOLEAN Enable); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#endif /* _DBGNT_ */ - #if DBG #define KdPrint(_x_) DbgPrint _x_ @@ -14546,6 +11636,31 @@ extern BOOLEAN KdDebuggerEnabled; #endif +#ifdef _VA_LIST_DEFINED +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +NTAPI +vDbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +NTSYSAPI +ULONG +NTAPI +vDbgPrintExWithPrefix( + IN PCCH Prefix, + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +#endif +#endif // _VA_LIST_DEFINED + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -14572,7 +11687,42 @@ NTAPI DbgBreakPointWithStatus( IN ULONG Status); -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +NTSYSAPI +ULONG +_cdecl +DbgPrintReturnControlC( + IN PCCH Format, + IN ...); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +_cdecl +DbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCSTR Format, + IN ...); + +NTSYSAPI +NTSTATUS +NTAPI +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State); + +#endif #if (NTDDI_VERSION >= NTDDI_WS03) NTKERNELAPI @@ -14593,9 +11743,6 @@ KdChangeOption( OUT PVOID OutBuffer, OUT PULONG OutBufferNeeded OPTIONAL); #endif -/* Hardware Abstraction Layer Functions */ - -#if (NTDDI_VERSION >= NTDDI_WIN2K) #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) @@ -14649,224 +11796,14 @@ HalReadDmaCounter( return counter; } -FORCEINLINE -ULONG -HalGetDmaAlignment( - IN PDMA_ADAPTER DmaAdapter) -{ - PGET_DMA_ALIGNMENT getDmaAlignment; - ULONG alignment; +#endif - getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment; - ASSERT( getDmaAlignment != NULL ); - alignment = getDmaAlignment( DmaAdapter ); - return alignment; -} - -#endif /* USE_DMA_MACROS ... */ -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #ifndef _NTTMAPI_ #define _NTTMAPI_ #include -#define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001) -#define TRANSACTIONMANAGER_SET_INFORMATION (0x0002) -#define TRANSACTIONMANAGER_RECOVER (0x0004) -#define TRANSACTIONMANAGER_RENAME (0x0008) -#define TRANSACTIONMANAGER_CREATE_RM (0x0010) -#define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020) - -#define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ - TRANSACTIONMANAGER_QUERY_INFORMATION) - -#define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - TRANSACTIONMANAGER_SET_INFORMATION |\ - TRANSACTIONMANAGER_RECOVER |\ - TRANSACTIONMANAGER_RENAME |\ - TRANSACTIONMANAGER_CREATE_RM) - -#define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE) - -#define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - TRANSACTIONMANAGER_GENERIC_READ |\ - TRANSACTIONMANAGER_GENERIC_WRITE |\ - TRANSACTIONMANAGER_GENERIC_EXECUTE |\ - TRANSACTIONMANAGER_BIND_TRANSACTION) - -#define TRANSACTION_QUERY_INFORMATION (0x0001) -#define TRANSACTION_SET_INFORMATION (0x0002) -#define TRANSACTION_ENLIST (0x0004) -#define TRANSACTION_COMMIT (0x0008) -#define TRANSACTION_ROLLBACK (0x0010) -#define TRANSACTION_PROPAGATE (0x0020) -#define TRANSACTION_RIGHT_RESERVED1 (0x0040) - -#define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\ - TRANSACTION_QUERY_INFORMATION |\ - SYNCHRONIZE) - -#define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - TRANSACTION_SET_INFORMATION |\ - TRANSACTION_COMMIT |\ - TRANSACTION_ENLIST |\ - TRANSACTION_ROLLBACK |\ - TRANSACTION_PROPAGATE |\ - SYNCHRONIZE) - -#define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ - TRANSACTION_COMMIT |\ - TRANSACTION_ROLLBACK |\ - SYNCHRONIZE) - -#define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - TRANSACTION_GENERIC_READ |\ - TRANSACTION_GENERIC_WRITE |\ - TRANSACTION_GENERIC_EXECUTE) - -#define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\ - STANDARD_RIGHTS_WRITE |\ - TRANSACTION_SET_INFORMATION |\ - TRANSACTION_ENLIST |\ - TRANSACTION_ROLLBACK |\ - TRANSACTION_PROPAGATE |\ - SYNCHRONIZE) - -#define RESOURCEMANAGER_QUERY_INFORMATION (0x0001) -#define RESOURCEMANAGER_SET_INFORMATION (0x0002) -#define RESOURCEMANAGER_RECOVER (0x0004) -#define RESOURCEMANAGER_ENLIST (0x0008) -#define RESOURCEMANAGER_GET_NOTIFICATION (0x0010) -#define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020) -#define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040) - -#define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ - RESOURCEMANAGER_QUERY_INFORMATION |\ - SYNCHRONIZE) - -#define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - RESOURCEMANAGER_SET_INFORMATION |\ - RESOURCEMANAGER_RECOVER |\ - RESOURCEMANAGER_ENLIST |\ - RESOURCEMANAGER_GET_NOTIFICATION |\ - RESOURCEMANAGER_REGISTER_PROTOCOL |\ - RESOURCEMANAGER_COMPLETE_PROPAGATION |\ - SYNCHRONIZE) - -#define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ - RESOURCEMANAGER_RECOVER |\ - RESOURCEMANAGER_ENLIST |\ - RESOURCEMANAGER_GET_NOTIFICATION |\ - RESOURCEMANAGER_COMPLETE_PROPAGATION |\ - SYNCHRONIZE) - -#define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - RESOURCEMANAGER_GENERIC_READ |\ - RESOURCEMANAGER_GENERIC_WRITE |\ - RESOURCEMANAGER_GENERIC_EXECUTE) - -#define ENLISTMENT_QUERY_INFORMATION (0x0001) -#define ENLISTMENT_SET_INFORMATION (0x0002) -#define ENLISTMENT_RECOVER (0x0004) -#define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008) -#define ENLISTMENT_SUPERIOR_RIGHTS (0x0010) - -#define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\ - ENLISTMENT_QUERY_INFORMATION) - -#define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - ENLISTMENT_SET_INFORMATION |\ - ENLISTMENT_RECOVER |\ - ENLISTMENT_SUBORDINATE_RIGHTS |\ - ENLISTMENT_SUPERIOR_RIGHTS) - -#define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ - ENLISTMENT_RECOVER |\ - ENLISTMENT_SUBORDINATE_RIGHTS |\ - ENLISTMENT_SUPERIOR_RIGHTS) - -#define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - ENLISTMENT_GENERIC_READ |\ - ENLISTMENT_GENERIC_WRITE |\ - ENLISTMENT_GENERIC_EXECUTE) - -typedef enum _TRANSACTION_OUTCOME { - TransactionOutcomeUndetermined = 1, - TransactionOutcomeCommitted, - TransactionOutcomeAborted, -} TRANSACTION_OUTCOME; - - -typedef enum _TRANSACTION_STATE { - TransactionStateNormal = 1, - TransactionStateIndoubt, - TransactionStateCommittedNotify, -} TRANSACTION_STATE; - - -typedef struct _TRANSACTION_BASIC_INFORMATION { - GUID TransactionId; - ULONG State; - ULONG Outcome; -} TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION; - -typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION { - GUID TmIdentity; - LARGE_INTEGER VirtualClock; -} TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION; - -typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION { - GUID LogIdentity; -} TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION; - -typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION { - ULONG LogPathLength; - WCHAR LogPath[1]; -} TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION; - -typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION { - ULONGLONG LastRecoveredLsn; -} TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION; - -typedef struct _TRANSACTION_PROPERTIES_INFORMATION { - ULONG IsolationLevel; - ULONG IsolationFlags; - LARGE_INTEGER Timeout; - ULONG Outcome; - ULONG DescriptionLength; - WCHAR Description[1]; -} TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION; - -typedef struct _TRANSACTION_BIND_INFORMATION { - HANDLE TmHandle; -} TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION; - -typedef struct _TRANSACTION_ENLISTMENT_PAIR { - GUID EnlistmentId; - GUID ResourceManagerId; -} TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR; - -typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION { - ULONG NumberOfEnlistments; - TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; -} TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION; - -typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION { - TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair; -} TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION; - -typedef struct _RESOURCEMANAGER_BASIC_INFORMATION { - GUID ResourceManagerId; - ULONG DescriptionLength; - WCHAR Description[1]; -} RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION; - -typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION { - HANDLE IoCompletionPortHandle; - ULONG_PTR CompletionKey; -} RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION; - typedef enum _KTMOBJECT_TYPE { KTMOBJECT_TRANSACTION, KTMOBJECT_TRANSACTION_MANAGER, @@ -14900,421 +11837,12 @@ typedef enum _RESOURCEMANAGER_INFORMATION_CLASS { ResourceManagerCompletionInformation, } RESOURCEMANAGER_INFORMATION_CLASS; -typedef struct _ENLISTMENT_BASIC_INFORMATION { - GUID EnlistmentId; - GUID TransactionId; - GUID ResourceManagerId; -} ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION; - -typedef struct _ENLISTMENT_CRM_INFORMATION { - GUID CrmTransactionManagerId; - GUID CrmResourceManagerId; - GUID CrmEnlistmentId; -} ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION; - typedef enum _ENLISTMENT_INFORMATION_CLASS { EnlistmentBasicInformation, EnlistmentRecoveryInformation, EnlistmentCrmInformation } ENLISTMENT_INFORMATION_CLASS; -typedef struct _TRANSACTION_LIST_ENTRY { -#if defined(__cplusplus) - ::UOW UOW; -#else - UOW UOW; -#endif -} TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY; - -typedef struct _TRANSACTION_LIST_INFORMATION { - ULONG NumberOfTransactions; - TRANSACTION_LIST_ENTRY TransactionInformation[1]; -} TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION; - -typedef NTSTATUS -(NTAPI *PFN_NT_CREATE_TRANSACTION)( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN LPGUID Uow OPTIONAL, - IN HANDLE TmHandle OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN ULONG IsolationLevel OPTIONAL, - IN ULONG IsolationFlags OPTIONAL, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PUNICODE_STRING Description OPTIONAL); - -typedef NTSTATUS -(NTAPI *PFN_NT_OPEN_TRANSACTION)( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN LPGUID Uow OPTIONAL, - IN HANDLE TmHandle OPTIONAL); - -typedef NTSTATUS -(NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - OUT PVOID TransactionInformation, - IN ULONG TransactionInformationLength, - OUT PULONG ReturnLength OPTIONAL); - -typedef NTSTATUS -(NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); - -typedef NTSTATUS -(NTAPI *PFN_NT_COMMIT_TRANSACTION)( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); - -typedef NTSTATUS -(NTAPI *PFN_NT_ROLLBACK_TRANSACTION)( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateTransactionManager( - OUT PHANDLE TmHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PUNICODE_STRING LogFileName OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN ULONG CommitStrength OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenTransactionManager( - OUT PHANDLE TmHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PUNICODE_STRING LogFileName OPTIONAL, - IN LPGUID TmIdentity OPTIONAL, - IN ULONG OpenOptions OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRenameTransactionManager( - IN PUNICODE_STRING LogFileName, - IN LPGUID ExistingTransactionManagerGuid); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRollforwardTransactionManager( - IN HANDLE TransactionManagerHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRecoverTransactionManager( - IN HANDLE TransactionManagerHandle); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationTransactionManager( - IN HANDLE TransactionManagerHandle, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - OUT PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength, - OUT PULONG ReturnLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetInformationTransactionManager( - IN HANDLE TmHandle OPTIONAL, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - IN PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtEnumerateTransactionObject( - IN HANDLE RootObjectHandle OPTIONAL, - IN KTMOBJECT_TYPE QueryType, - IN OUT PKTMOBJECT_CURSOR ObjectCursor, - IN ULONG ObjectCursorLength, - OUT PULONG ReturnLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateTransaction( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN LPGUID Uow OPTIONAL, - IN HANDLE TmHandle OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN ULONG IsolationLevel OPTIONAL, - IN ULONG IsolationFlags OPTIONAL, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PUNICODE_STRING Description OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenTransaction( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN LPGUID Uow, - IN HANDLE TmHandle OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - OUT PVOID TransactionInformation, - IN ULONG TransactionInformationLength, - OUT PULONG ReturnLength OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCommitTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRollbackTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateEnlistment( - OUT PHANDLE EnlistmentHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE ResourceManagerHandle, - IN HANDLE TransactionHandle, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN NOTIFICATION_MASK NotificationMask, - IN PVOID EnlistmentKey OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenEnlistment( - OUT PHANDLE EnlistmentHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE ResourceManagerHandle, - IN LPGUID EnlistmentGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationEnlistment( - IN HANDLE EnlistmentHandle, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - OUT PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength, - OUT PULONG ReturnLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetInformationEnlistment( - IN HANDLE EnlistmentHandle OPTIONAL, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - IN PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRecoverEnlistment( - IN HANDLE EnlistmentHandle, - IN PVOID EnlistmentKey OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPrePrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCommitEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRollbackEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPrePrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCommitComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtReadOnlyEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRollbackComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSinglePhaseReject( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID RmGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN PUNICODE_STRING Description OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID ResourceManagerGuid OPTIONAL, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRecoverResourceManager( - IN HANDLE ResourceManagerHandle); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtGetNotificationResourceManager( - IN HANDLE ResourceManagerHandle, - OUT PTRANSACTION_NOTIFICATION TransactionNotification, - IN ULONG NotificationLength, - IN PLARGE_INTEGER Timeout OPTIONAL, - OUT PULONG ReturnLength OPTIONAL, - IN ULONG Asynchronous, - IN ULONG_PTR AsynchronousContext OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - OUT PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength, - OUT PULONG ReturnLength OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - IN PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRegisterProtocolAddressInformation( - IN HANDLE ResourceManager, - IN PCRM_PROTOCOL_ID ProtocolId, - IN ULONG ProtocolInformationSize, - IN PVOID ProtocolInformation, - IN ULONG CreateOptions OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPropagationComplete( - IN HANDLE ResourceManagerHandle, - IN ULONG RequestCookie, - IN ULONG BufferLength, - IN PVOID Buffer); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPropagationFailed( - IN HANDLE ResourceManagerHandle, - IN ULONG RequestCookie, - IN NTSTATUS PropStatus); - -#endif /* NTDDI_VERSION >= NTDDI_VISTA */ - #endif /* !_NTTMAPI_ */ /****************************************************************************** * ZwXxx Functions * @@ -16006,8 +12534,78 @@ ZwSetInformationKey( IN PVOID KeySetInformation, IN ULONG KeySetInformationLength); +#endif + +/****************************************************************************** + * Unsorted * + ******************************************************************************/ + +/* GUID Comparison */ +#ifndef __IID_ALIGNED__ +#define __IID_ALIGNED__ +#ifdef __cplusplus +inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) +{ + return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && + (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); +} +#else +#define IsEqualGUIDAligned(guid1, guid2) \ + ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ + (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) +#endif /* __cplusplus */ +#endif /* !__IID_ALIGNED__ */ + +typedef enum { + LT_DONT_CARE, + LT_LOWEST_LATENCY +} LATENCY_TIME; + +#define MAXIMUM_SUSPEND_COUNT MAXCHAR + +#define MAXIMUM_FILENAME_LENGTH 256 + +#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') + +#define OBJECT_TYPE_CREATE (0x0001) +#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DIRECTORY_QUERY (0x0001) +#define DIRECTORY_TRAVERSE (0x0002) +#define DIRECTORY_CREATE_OBJECT (0x0004) +#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) +#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) + +#define EVENT_QUERY_STATE (0x0001) +#define EVENT_MODIFY_STATE (0x0002) +#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define SEMAPHORE_QUERY_STATE (0x0001) +#define SEMAPHORE_MODIFY_STATE (0x0002) +#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define SYMBOLIC_LINK_QUERY 0x0001 +#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 + +/* Global debug flag */ +extern ULONG NtGlobalFlag; + +/* Service Start Types */ +#define SERVICE_BOOT_START 0x00000000 +#define SERVICE_SYSTEM_START 0x00000001 +#define SERVICE_AUTO_START 0x00000002 +#define SERVICE_DEMAND_START 0x00000003 +#define SERVICE_DISABLED 0x00000004 + +#ifndef _TRACEHANDLE_DEFINED +#define _TRACEHANDLE_DEFINED +typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; +#endif -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ #ifdef __cplusplus diff --git a/reactos/include/ndk/ketypes.h b/reactos/include/ndk/ketypes.h index 67985379372..d4ae1c545f0 100644 --- a/reactos/include/ndk/ketypes.h +++ b/reactos/include/ndk/ketypes.h @@ -546,6 +546,17 @@ typedef enum _KAPC_ENVIRONMENT InsertApcEnvironment } KAPC_ENVIRONMENT; +// +// CPU Cache Types +// +typedef enum _PROCESSOR_CACHE_TYPE +{ + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace, +} PROCESSOR_CACHE_TYPE; + // // PRCB DPC Data // @@ -566,6 +577,18 @@ typedef struct _PP_LOOKASIDE_LIST struct _GENERAL_LOOKASIDE *L; } PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST; +// +// CPU Cache Descriptor +// +typedef struct _CACHE_DESCRIPTOR +{ + UCHAR Level; + UCHAR Associativity; + USHORT LineSize; + ULONG Size; + PROCESSOR_CACHE_TYPE Type; +} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; + // // Architectural Types // From d26ada063964061de470b69ae7188077e30b6553 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 17:30:34 +0000 Subject: [PATCH 153/261] Merge changes to ketypes.h and ntimage.h from the last revert back. svn path=/trunk/; revision=46945 --- reactos/include/ddk/ntddk.h | 13 +++++++++++++ reactos/include/ddk/ntimage.h | 17 ++++++++++++++--- reactos/include/ddk/wdm.h | 32 ++++++++++++++++++++++++++++---- reactos/include/ndk/ketypes.h | 23 ----------------------- 4 files changed, 55 insertions(+), 30 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 62c1f7873f1..6d8bacd4ce8 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -72,6 +72,19 @@ typedef struct _BUS_HANDLER *PBUS_HANDLER; typedef struct _PEB *PPEB; +#ifndef _NTIMAGE_ + +typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; +typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; + +#ifdef _WIN64 +typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; +#else +typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; +#endif + +#endif /* _NTIMAGE_ */ + #define EXCEPTION_READ_FAULT 0 #define EXCEPTION_WRITE_FAULT 1 #define EXCEPTION_EXECUTE_FAULT 8 diff --git a/reactos/include/ddk/ntimage.h b/reactos/include/ddk/ntimage.h index e008a2daa94..8df984763f7 100644 --- a/reactos/include/ddk/ntimage.h +++ b/reactos/include/ddk/ntimage.h @@ -394,22 +394,33 @@ typedef struct _IMAGE_NT_HEADERS64 { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; -} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; +} IMAGE_NT_HEADERS64; typedef struct _IMAGE_NT_HEADERS { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; -} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; +} IMAGE_NT_HEADERS32; #ifdef _WIN64 typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS; -typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; #else typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; +#endif + +#ifndef _NTDDK_ + +typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; +typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; + +#ifdef _WIN64 +typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; +#else typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; #endif +#endif /* _NTDDK_ */ + // // Retreives the first image section header from the Nt Header // diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index ee2f034d5e1..285d2165008 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -515,6 +515,34 @@ typedef enum _MODE { #define SINGLE_GROUP_LEGACY_API 1 #endif +#define SEMAPHORE_QUERY_STATE (0x0001) +#define SEMAPHORE_MODIFY_STATE (0x0002) +#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { + RelationProcessorCore, + RelationNumaNode, + RelationCache, + RelationProcessorPackage, + RelationGroup, + RelationAll = 0xffff +} LOGICAL_PROCESSOR_RELATIONSHIP; + +typedef enum _PROCESSOR_CACHE_TYPE { + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace +} PROCESSOR_CACHE_TYPE; + +typedef struct _CACHE_DESCRIPTOR { + UCHAR Level; + UCHAR Associativity; + USHORT LineSize; + ULONG Size; + PROCESSOR_CACHE_TYPE Type; +} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; + /* Processor features */ #define PF_FLOATING_POINT_PRECISION_ERRATA 0 #define PF_FLOATING_POINT_EMULATED 1 @@ -12580,10 +12608,6 @@ typedef enum { #define EVENT_MODIFY_STATE (0x0002) #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) -#define SEMAPHORE_QUERY_STATE (0x0001) -#define SEMAPHORE_MODIFY_STATE (0x0002) -#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - #define SYMBOLIC_LINK_QUERY 0x0001 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) diff --git a/reactos/include/ndk/ketypes.h b/reactos/include/ndk/ketypes.h index d4ae1c545f0..67985379372 100644 --- a/reactos/include/ndk/ketypes.h +++ b/reactos/include/ndk/ketypes.h @@ -546,17 +546,6 @@ typedef enum _KAPC_ENVIRONMENT InsertApcEnvironment } KAPC_ENVIRONMENT; -// -// CPU Cache Types -// -typedef enum _PROCESSOR_CACHE_TYPE -{ - CacheUnified, - CacheInstruction, - CacheData, - CacheTrace, -} PROCESSOR_CACHE_TYPE; - // // PRCB DPC Data // @@ -577,18 +566,6 @@ typedef struct _PP_LOOKASIDE_LIST struct _GENERAL_LOOKASIDE *L; } PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST; -// -// CPU Cache Descriptor -// -typedef struct _CACHE_DESCRIPTOR -{ - UCHAR Level; - UCHAR Associativity; - USHORT LineSize; - ULONG Size; - PROCESSOR_CACHE_TYPE Type; -} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; - // // Architectural Types // From c99e966e79803480c02210b9c43682f096f4e7f6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 17:52:56 +0000 Subject: [PATCH 154/261] Patch by Jerome Gardou: add a bunch of tests for NtGdiBitBlt svn path=/trunk/; revision=46946 --- .../apitests/w32knapi/ntgdi/NtGdiBitBlt.c | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c b/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c index 14b911457e7..d2821670a74 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c @@ -3,6 +3,10 @@ INT Test_NtGdiBitBlt(PTESTINFO pti) { BOOL bRet; + HDC hdc1, hdc2; + HBITMAP hbmp1, hOldBmp1, hbmp2, hOldBmp2; + DWORD bytes1[4] = {0x00ff0000, 0x0000ff00, 0x000000ff, 0x00ffffff}; + DWORD bytes2[4] = {0x00000000, 0x0000000, 0x0000000, 0x00000000}; /* Test NULL dc */ SetLastError(ERROR_SUCCESS); @@ -15,6 +19,71 @@ Test_NtGdiBitBlt(PTESTINFO pti) bRet = NtGdiBitBlt((HDC)0x123456, 0, 0, 10, 10, (HDC)0x123456, 10, 10, SRCCOPY, 0, 0); TEST(bRet == FALSE); TEST(GetLastError() == ERROR_SUCCESS); + + hdc1 = NtGdiCreateCompatibleDC(0); + TEST(hdc1 != NULL); + + hdc2 = NtGdiCreateCompatibleDC(0); + TEST(hdc2 != NULL); + + hbmp1 = NtGdiCreateBitmap(2, 2, 1, 32, (LPBYTE)bytes1 ); + TEST(hbmp1 != NULL); + hOldBmp1 = SelectObject(hdc1, hbmp1); + + hbmp2 = NtGdiCreateBitmap(2, 2, 1, 32, (LPBYTE)bytes2 ); + TEST(hbmp2 != NULL); + hOldBmp2 = SelectObject(hdc2, hbmp2); + + bRet = NtGdiBitBlt(hdc2, 1, 1, -2, -2, hdc1, 0, 0, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x00000000, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00000000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + bRet = NtGdiBitBlt(hdc2, 1, 1, -2, -2, hdc1, 1, 1, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x000000ff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00000000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + NtGdiSetPixel(hdc2, 0, 0, 0x00000000); + + bRet = NtGdiBitBlt(hdc2, 1, 1, -2, -2, hdc1, 0, 0, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x00000000, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00000000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + bRet = NtGdiBitBlt(hdc2, 1, 1, -2, -2, hdc1, 2, 2, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x00ffffff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00000000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + bRet = NtGdiBitBlt(hdc2, 2, 2, -2, -2, hdc1, 2, 2, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x000000ff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00ff0000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x0000ff00, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00ffffff, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + SelectObject(hdc2, hOldBmp2); + SelectObject(hdc1, hOldBmp1); + + DeleteObject(hbmp2); + DeleteObject(hbmp1); + + DeleteDC(hdc1); + DeleteDC(hdc2); return APISTATUS_NORMAL; } From d39e608d4de75fd0ccdd5bb87716d0a38c4edd7a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 19:43:18 +0000 Subject: [PATCH 155/261] [NTDLL_WINETEST] - Skip broken tests svn path=/trunk/; revision=46947 --- rostests/winetests/ntdll/file.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rostests/winetests/ntdll/file.c b/rostests/winetests/ntdll/file.c index 3d28d80342d..32c8d184943 100644 --- a/rostests/winetests/ntdll/file.c +++ b/rostests/winetests/ntdll/file.c @@ -1473,7 +1473,8 @@ START_TEST(file) pNtQueryDirectoryFile = (void *)GetProcAddress(hntdll, "NtQueryDirectoryFile"); create_file_test(); - open_file_test(); + ok(0, "broken test: open_file_test\n"); + //open_file_test(); delete_file_test(); read_file_test(); nt_mailslot_test(); @@ -1482,5 +1483,6 @@ START_TEST(file) test_file_all_information(); test_file_both_information(); test_file_name_information(); - test_file_all_name_information(); + ok(0, "broken test: test_file_all_name_information \n"); + //test_file_all_name_information(); } From c31fcaaae7082a1390cef632dd8fddfdd3c6df65 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 19:45:10 +0000 Subject: [PATCH 156/261] [W32KNAPI] Patch by Jerome Gardou: more tests for NtGdiBitBlt svn path=/trunk/; revision=46948 --- .../apitests/w32knapi/ntgdi/NtGdiBitBlt.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c b/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c index d2821670a74..81bede314a5 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c @@ -30,6 +30,11 @@ Test_NtGdiBitBlt(PTESTINFO pti) TEST(hbmp1 != NULL); hOldBmp1 = SelectObject(hdc1, hbmp1); + TESTX(NtGdiGetPixel(hdc1, 0, 0) == 0x000000ff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc1, 0, 1) == 0x00ff0000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc1, 1, 0) == 0x0000ff00, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc1, 1, 1) == 0x00ffffff, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + hbmp2 = NtGdiCreateBitmap(2, 2, 1, 32, (LPBYTE)bytes2 ); TEST(hbmp2 != NULL); hOldBmp2 = SelectObject(hdc2, hbmp2); @@ -68,6 +73,8 @@ Test_NtGdiBitBlt(PTESTINFO pti) TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + NtGdiSetPixel(hdc2, 0, 0, 0x00000000); + bRet = NtGdiBitBlt(hdc2, 2, 2, -2, -2, hdc1, 2, 2, SRCCOPY, 0, 0); TEST(bRet == TRUE); TEST(GetLastError() == ERROR_SUCCESS); @@ -76,6 +83,19 @@ Test_NtGdiBitBlt(PTESTINFO pti) TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x0000ff00, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00ffffff, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + NtGdiSetPixel(hdc2, 0, 0, 0x00000000); + NtGdiSetPixel(hdc2, 1, 0, 0x00000000); + NtGdiSetPixel(hdc2, 0, 1, 0x00000000); + NtGdiSetPixel(hdc2, 1, 1, 0x00000000); + + bRet = NtGdiBitBlt(hdc2, 0, 0, 2, 2, hdc1, 0, 0, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x000000ff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00ff0000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x0000ff00, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00ffffff, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + SelectObject(hdc2, hOldBmp2); SelectObject(hdc1, hOldBmp1); From 85c5177ec9742795694bd22151a07e2fc8af70d1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 21:40:23 +0000 Subject: [PATCH 157/261] Merge back most changes to ntifs.h from lastt revert svn path=/trunk/; revision=46949 --- reactos/include/ddk/ntifs.h | 4886 ++++++++++++++++++----------------- 1 file changed, 2504 insertions(+), 2382 deletions(-) diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 87d0470888c..8af993ffd15 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -25,32 +25,10 @@ #define _NTIFS_INCLUDED_ #define _GNU_NTIFS_ -/* Helper macro to enable gcc's extension. */ -#ifndef __GNU_EXTENSION -#ifdef __GNUC__ -#define __GNU_EXTENSION __extension__ -#else -#define __GNU_EXTENSION -#endif -#endif - #ifdef __cplusplus extern "C" { #endif -#if !defined(_NTHALDLL_) && !defined(_BLDR_) -#define NTHALAPI DECLSPEC_IMPORT -#else -#define NTHALAPI -#endif - -/* For ReactOS */ -#if !defined(_NTOSKRNL_) && !defined(_BLDR_) -#define NTKERNELAPI DECLSPEC_IMPORT -#else -#define NTKERNELAPI -#endif - /* Dependencies */ #include #include @@ -76,16 +54,6 @@ extern "C" { #define ClearFlag(_F,_SF) ((_F) &= ~(_SF)) #endif -#define PsGetCurrentProcess IoGetCurrentProcess - -#if (NTDDI_VERSION >= NTDDI_VISTA) -extern NTSYSAPI volatile CCHAR KeNumberProcessors; -#elif (NTDDI_VERSION >= NTDDI_WINXP) -extern NTSYSAPI CCHAR KeNumberProcessors; -#else -extern PCCHAR KeNumberProcessors; -#endif - typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; typedef STRING LSA_STRING, *PLSA_STRING; typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES; @@ -751,8 +719,6 @@ typedef enum _OBJECT_INFORMATION_CLASS { MaxObjectInfoClass /* FIXME, not in WDK */ } OBJECT_INFORMATION_CLASS; -#if (NTDDI_VERSION >= NTDDI_NT4) - NTSYSCALLAPI NTSTATUS NTAPI @@ -763,8 +729,6 @@ NtQueryObject( IN ULONG ObjectInformationLength, OUT PULONG ReturnLength OPTIONAL); -#endif - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSCALLAPI @@ -2414,95 +2378,11 @@ extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine; #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information" -#define DEVICE_TYPE ULONG - -#define FILE_DEVICE_BEEP 0x00000001 -#define FILE_DEVICE_CD_ROM 0x00000002 -#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 -#define FILE_DEVICE_CONTROLLER 0x00000004 -#define FILE_DEVICE_DATALINK 0x00000005 -#define FILE_DEVICE_DFS 0x00000006 -#define FILE_DEVICE_DISK 0x00000007 -#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 -#define FILE_DEVICE_FILE_SYSTEM 0x00000009 -#define FILE_DEVICE_INPORT_PORT 0x0000000a -#define FILE_DEVICE_KEYBOARD 0x0000000b -#define FILE_DEVICE_MAILSLOT 0x0000000c -#define FILE_DEVICE_MIDI_IN 0x0000000d -#define FILE_DEVICE_MIDI_OUT 0x0000000e -#define FILE_DEVICE_MOUSE 0x0000000f -#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 -#define FILE_DEVICE_NAMED_PIPE 0x00000011 -#define FILE_DEVICE_NETWORK 0x00000012 -#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 -#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 -#define FILE_DEVICE_NULL 0x00000015 -#define FILE_DEVICE_PARALLEL_PORT 0x00000016 -#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 -#define FILE_DEVICE_PRINTER 0x00000018 -#define FILE_DEVICE_SCANNER 0x00000019 -#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a -#define FILE_DEVICE_SERIAL_PORT 0x0000001b -#define FILE_DEVICE_SCREEN 0x0000001c -#define FILE_DEVICE_SOUND 0x0000001d -#define FILE_DEVICE_STREAMS 0x0000001e -#define FILE_DEVICE_TAPE 0x0000001f -#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 -#define FILE_DEVICE_TRANSPORT 0x00000021 -#define FILE_DEVICE_UNKNOWN 0x00000022 -#define FILE_DEVICE_VIDEO 0x00000023 -#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 -#define FILE_DEVICE_WAVE_IN 0x00000025 -#define FILE_DEVICE_WAVE_OUT 0x00000026 -#define FILE_DEVICE_8042_PORT 0x00000027 -#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 -#define FILE_DEVICE_BATTERY 0x00000029 -#define FILE_DEVICE_BUS_EXTENDER 0x0000002a -#define FILE_DEVICE_MODEM 0x0000002b -#define FILE_DEVICE_VDM 0x0000002c -#define FILE_DEVICE_MASS_STORAGE 0x0000002d -#define FILE_DEVICE_SMB 0x0000002e -#define FILE_DEVICE_KS 0x0000002f -#define FILE_DEVICE_CHANGER 0x00000030 -#define FILE_DEVICE_SMARTCARD 0x00000031 -#define FILE_DEVICE_ACPI 0x00000032 -#define FILE_DEVICE_DVD 0x00000033 -#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 -#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 -#define FILE_DEVICE_DFS_VOLUME 0x00000036 -#define FILE_DEVICE_SERENUM 0x00000037 -#define FILE_DEVICE_TERMSRV 0x00000038 -#define FILE_DEVICE_KSEC 0x00000039 -#define FILE_DEVICE_FIPS 0x0000003A -#define FILE_DEVICE_INFINIBAND 0x0000003B -#define FILE_DEVICE_VMBUS 0x0000003E -#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F -#define FILE_DEVICE_WPD 0x00000040 -#define FILE_DEVICE_BLUETOOTH 0x00000041 -#define FILE_DEVICE_MT_COMPOSITE 0x00000042 -#define FILE_DEVICE_MT_TRANSPORT 0x00000043 -#define FILE_DEVICE_BIOMETRIC 0x00000044 -#define FILE_DEVICE_PMI 0x00000045 - -#define CTL_CODE(DeviceType, Function, Method, Access) \ - (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) - -#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) - #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3)) -#define METHOD_BUFFERED 0 -#define METHOD_IN_DIRECT 1 -#define METHOD_OUT_DIRECT 2 -#define METHOD_NEITHER 3 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT -#define FILE_ANY_ACCESS 0x00000000 -#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS -#define FILE_READ_ACCESS 0x00000001 -#define FILE_WRITE_ACCESS 0x00000002 - typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE; typedef enum _SECURITY_LOGON_TYPE { @@ -4673,6 +4553,8 @@ typedef struct _KAPC_STATE { #define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN)) +#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); + typedef struct _KQUEUE { DISPATCHER_HEADER Header; LIST_ENTRY EntryListHead; @@ -4807,7 +4689,7 @@ FASTCALL KeAcquireQueuedSpinLock( IN OUT KSPIN_LOCK_QUEUE_NUMBER Number); -NTHALAPI +_DECL_HAL_KE_IMPORT VOID FASTCALL KeReleaseQueuedSpinLock( @@ -5022,24 +4904,6 @@ typedef NTSTATUS #if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -VOID -NTAPI -SeCaptureSubjectContext( - OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); - -NTKERNELAPI -VOID -NTAPI -SeLockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); - -NTKERNELAPI -VOID -NTAPI -SeUnlockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); - NTKERNELAPI VOID NTAPI @@ -5453,18 +5317,6 @@ SeLocateProcessImageName( extern NTKERNELAPI PSE_EXPORTS SeExports; -#if !defined(_PSGETCURRENTTHREAD_) -#define _PSGETCURRENTTHREAD_ - -FORCEINLINE -PETHREAD -PsGetCurrentThread( - VOID) -{ - return (PETHREAD)KeGetCurrentThread(); -} -#endif - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -5534,7 +5386,20 @@ PsReturnPoolQuota( IN POOL_TYPE PoolType, IN ULONG_PTR Amount); -#endif +NTKERNELAPI +NTSTATUS +NTAPI +PsAssignImpersonationToken( + IN PETHREAD Thread, + IN HANDLE Token OPTIONAL); + +NTKERNELAPI +HANDLE +NTAPI +PsReferencePrimaryToken( + IN OUT PEPROCESS Process); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -5823,18 +5688,6 @@ IoPageRead( IN PKEVENT Event, OUT PIO_STATUS_BLOCK IoStatusBlock); -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDevice( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDeviceReference( - IN PDEVICE_OBJECT DeviceObject); - NTKERNELAPI PDEVICE_OBJECT NTAPI @@ -5951,42 +5804,6 @@ NTAPI IoSetTopLevelIrp( IN PIRP Irp OPTIONAL); -NTKERNELAPI -VOID -NTAPI -IoStartNextPacket( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable); - -NTKERNELAPI -VOID -NTAPI -IoStartNextPacketByKey( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable, - IN ULONG Key); - -NTKERNELAPI -VOID -NTAPI -IoStartPacket( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PULONG Key OPTIONAL, - IN PDRIVER_CANCEL CancelFunction OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -IoStartTimer( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -VOID -NTAPI -IoStopTimer( - IN PDEVICE_OBJECT DeviceObject); - NTKERNELAPI NTSTATUS NTAPI @@ -6023,12 +5840,6 @@ IoVerifyVolume( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount); -NTKERNELAPI -VOID -NTAPI -IoWriteErrorLogEntry( - IN PVOID ElEntry); - NTKERNELAPI NTSTATUS NTAPI @@ -6055,13 +5866,6 @@ IoQueryFileDosDeviceName( IN PFILE_OBJECT FileObject, OUT POBJECT_NAME_INFORMATION *ObjectNameInformation); -VOID -NTAPI -IoSetStartIoAttributes( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN DeferredStartIo, - IN BOOLEAN NonCancelable); - NTKERNELAPI NTSTATUS NTAPI @@ -6160,53 +5964,6 @@ typedef struct _IO_PRIORITY_INFO { #define PO_CB_LID_SWITCH_STATE 4 #define PO_CB_PROCESSOR_POWER_POLICY 5 -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -PVOID -NTAPI -PoRegisterSystemState( - IN OUT PVOID StateHandle OPTIONAL, - IN EXECUTION_STATE Flags); - -NTKERNELAPI -VOID -NTAPI -PoUnregisterSystemState( - IN OUT PVOID StateHandle); - -NTKERNELAPI -POWER_STATE -NTAPI -PoSetPowerState( - IN PDEVICE_OBJECT DeviceObject, - IN POWER_STATE_TYPE Type, - IN POWER_STATE State); - -NTKERNELAPI -NTSTATUS -NTAPI -PoCallDriver( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp); - -NTKERNELAPI -VOID -NTAPI -PoStartNextPowerIrp( - IN OUT PIRP Irp); - -NTKERNELAPI -PULONG -NTAPI -PoRegisterDeviceForIdleDetection( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG ConservationIdleTime, - IN ULONG PerformanceIdleTime, - IN DEVICE_POWER_STATE State); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - #if (NTDDI_VERSION >= NTDDI_WINXP) NTKERNELAPI NTSTATUS @@ -6215,84 +5972,6 @@ PoQueueShutdownWorkItem( IN OUT PWORK_QUEUE_ITEM WorkItem); #endif -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTKERNELAPI -NTSTATUS -NTAPI -PoRegisterPowerSettingCallback( - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN LPCGUID SettingGuid, - IN PPOWER_SETTING_CALLBACK Callback, - IN PVOID Context OPTIONAL, - OUT PVOID *Handle); - -NTKERNELAPI -NTSTATUS -PoUnregisterPowerSettingCallback( - IN OUT PVOID Handle); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN6SP1) -NTKERNELAPI -VOID -NTAPI -PoSetDeviceBusyEx( - IN OUT PULONG IdlePointer); -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -NTSTATUS -NTAPI -PoCreatePowerRequest( - OUT PVOID *PowerRequest, - IN PDEVICE_OBJECT DeviceObject, - IN PCOUNTED_REASON_CONTEXT Context); - -NTKERNELAPI -NTSTATUS -NTAPI -PoSetPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); - -NTKERNELAPI -NTSTATUS -NTAPI -PoClearPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); - -NTKERNELAPI -VOID -NTAPI -PoDeletePowerRequest( - IN OUT PVOID PowerRequest); - -NTKERNELAPI -VOID -NTAPI -PoStartDeviceBusy( - IN OUT PULONG IdlePointer); - -NTKERNELAPI -VOID -NTAPI -PoEndDeviceBusy( - IN OUT PULONG IdlePointer); - -NTKERNELAPI -BOOLEAN -NTAPI -PoQueryWatchdogTime( - IN PDEVICE_OBJECT Pdo, - OUT PULONG SecondsRemaining); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - #if defined(_IA64_) #if (NTDDI_VERSION >= NTDDI_WIN2K) //DECLSPEC_DEPRECATED_DDK @@ -6568,6 +6247,188 @@ typedef struct _FILE_LOCK { LONG volatile LockRequestsInProgress; } FILE_LOCK, *PFILE_LOCK; +typedef struct _TUNNEL { + FAST_MUTEX Mutex; + PRTL_SPLAY_LINKS Cache; + LIST_ENTRY TimerQueue; + USHORT NumEntries; +} TUNNEL, *PTUNNEL; + +typedef enum _FSRTL_COMPARISON_RESULT { + LessThan = -1, + EqualTo = 0, + GreaterThan = 1 +} FSRTL_COMPARISON_RESULT; + +#define FSRTL_FAT_LEGAL 0x01 +#define FSRTL_HPFS_LEGAL 0x02 +#define FSRTL_NTFS_LEGAL 0x04 +#define FSRTL_WILD_CHARACTER 0x08 +#define FSRTL_OLE_LEGAL 0x10 +#define FSRTL_NTFS_STREAM_LEGAL (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL) + +typedef struct _BASE_MCB { + ULONG MaximumPairCount; + ULONG PairCount; + USHORT PoolType; + USHORT Flags; + PVOID Mapping; +} BASE_MCB, *PBASE_MCB; + +typedef struct _LARGE_MCB { + PKGUARDED_MUTEX GuardedMutex; + BASE_MCB BaseMcb; +} LARGE_MCB, *PLARGE_MCB; + +#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 + +typedef struct _MCB { + LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; +} MCB, *PMCB; + +typedef PVOID OPLOCK, *POPLOCK; + +typedef VOID +(NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) ( + IN PVOID Context, + IN PIRP Irp); + +typedef VOID +(NTAPI *POPLOCK_FS_PREPOST_IRP) ( + IN PVOID Context, + IN PIRP Irp); + +#if (NTDDI_VERSION >= NTDDI_VISTASP1) +#define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001 +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +#define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY 0x00000002 +#define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK 0x00000004 +#define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS 0x00000008 +#define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH 0x00000001 +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +typedef struct _OPLOCK_KEY_ECP_CONTEXT { + GUID OplockKey; + ULONG Reserved; +} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT; + +DEFINE_GUID( GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f ); + +#endif + +#define FSRTL_VOLUME_DISMOUNT 1 +#define FSRTL_VOLUME_DISMOUNT_FAILED 2 +#define FSRTL_VOLUME_LOCK 3 +#define FSRTL_VOLUME_LOCK_FAILED 4 +#define FSRTL_VOLUME_UNLOCK 5 +#define FSRTL_VOLUME_MOUNT 6 +#define FSRTL_VOLUME_NEEDS_CHKDSK 7 +#define FSRTL_VOLUME_WORM_NEAR_FULL 8 +#define FSRTL_VOLUME_WEARING_OUT 9 +#define FSRTL_VOLUME_FORCED_CLOSED 10 +#define FSRTL_VOLUME_INFO_MAKE_COMPAT 11 +#define FSRTL_VOLUME_PREPARING_EJECT 12 +#define FSRTL_VOLUME_CHANGE_SIZE 13 +#define FSRTL_VOLUME_BACKGROUND_FORMAT 14 + +typedef PVOID PNOTIFY_SYNC; + +typedef BOOLEAN +(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( + IN PVOID NotifyContext, + IN PVOID TargetContext OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +typedef BOOLEAN +(NTAPI *PFILTER_REPORT_CHANGE) ( + IN PVOID NotifyContext, + IN PVOID FilterContext); + +typedef VOID +(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( + IN PVOID Context, + IN PKEVENT Event); + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +#define FSRTL_UNC_PROVIDER_FLAGS_MAILSLOTS_SUPPORTED 0x00000001 +#define FSRTL_UNC_PROVIDER_FLAGS_CSC_ENABLED 0x00000002 +#define FSRTL_UNC_PROVIDER_FLAGS_DOMAIN_SVC_AWARE 0x00000004 + +#define FSRTL_ALLOCATE_ECPLIST_FLAG_CHARGE_QUOTA 0x00000001 + +#define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA 0x00000001 +#define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL 0x00000002 + +#define FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL 0x00000002 + +#define FSRTL_VIRTDISK_FULLY_ALLOCATED 0x00000001 +#define FSRTL_VIRTDISK_NO_DRIVE_LETTER 0x00000002 + +typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_1 { + ULONG32 ProviderId; +} FSRTL_MUP_PROVIDER_INFO_LEVEL_1, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_1; + +typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 { + ULONG32 ProviderId; + UNICODE_STRING ProviderName; +} FSRTL_MUP_PROVIDER_INFO_LEVEL_2, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_2; + +typedef VOID +(*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) ( + IN OUT PVOID EcpContext, + IN LPCGUID EcpType); + +typedef struct _ECP_LIST ECP_LIST, *PECP_LIST; + +typedef ULONG FSRTL_ALLOCATE_ECPLIST_FLAGS; +typedef ULONG FSRTL_ALLOCATE_ECP_FLAGS; +typedef ULONG FSRTL_ECP_LOOKASIDE_FLAGS; + +typedef enum _FSRTL_CHANGE_BACKING_TYPE { + ChangeDataControlArea, + ChangeImageControlArea, + ChangeSharedCacheMap +} FSRTL_CHANGE_BACKING_TYPE, *PFSRTL_CHANGE_BACKING_TYPE; + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +typedef struct _FSRTL_PER_FILE_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_FILE_CONTEXT, *PFSRTL_PER_FILE_CONTEXT; + +typedef struct _FSRTL_PER_STREAM_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +typedef VOID +(*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) ( + IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); +#endif + +typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; +} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; + +#define FsRtlEnterFileSystem KeEnterCriticalRegion +#define FsRtlExitFileSystem KeLeaveCriticalRegion + +#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_HARD_ERROR 0x1 +#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_LOG_ENTRY 0x2 + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -6845,15 +6706,2320 @@ FsRtlPrivateLock( IN PVOID Context, IN BOOLEAN AlreadySynchronized); +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeTunnelCache( + IN PTUNNEL Cache); + +NTKERNELAPI +VOID +NTAPI +FsRtlAddToTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING ShortName, + IN PUNICODE_STRING LongName, + IN BOOLEAN KeyByShortName, + IN ULONG DataLength, + IN PVOID Data); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFindInTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING Name, + OUT PUNICODE_STRING ShortName, + OUT PUNICODE_STRING LongName, + IN OUT PULONG DataLength, + OUT PVOID Data); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteKeyFromTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteTunnelCache( + IN PTUNNEL Cache); + +NTKERNELAPI +#define IO_ATTACH_DEVICE 0x0400 +struct _RTL_AVL_TABLE; +struct _RTL_GENERIC_TABLE; + +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FS_OBJECTID_INFORMATION +{ + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; + +typedef enum _RTL_GENERIC_COMPARE_RESULTS +{ + GenericLessThan, + GenericGreaterThan, + GenericEqual +} RTL_GENERIC_COMPARE_RESULTS; + +typedef enum _TABLE_SEARCH_RESULT +{ + TableEmptyTree, + TableFoundNode, + TableInsertAsLeft, + TableInsertAsRight +} TABLE_SEARCH_RESULT; + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct +); + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct +); + +typedef PVOID +(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + CLONG ByteSize +); + +typedef VOID +(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID Buffer +); + +typedef PVOID +(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + CLONG ByteSize +); + +typedef VOID +(NTAPI *PRTL_AVL_FREE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + PVOID Buffer +); + +typedef struct _RTL_BALANCED_LINKS +{ + struct _RTL_BALANCED_LINKS *Parent; + struct _RTL_BALANCED_LINKS *LeftChild; + struct _RTL_BALANCED_LINKS *RightChild; + CHAR Balance; + UCHAR Reserved[3]; +} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; + +typedef struct _RTL_GENERIC_TABLE +{ + PRTL_SPLAY_LINKS TableRoot; + LIST_ENTRY InsertOrderList; + PLIST_ENTRY OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; + PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_GENERIC_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; + +typedef struct _RTL_AVL_TABLE +{ + RTL_BALANCED_LINKS BalancedRoot; + PVOID OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + ULONG DepthOfTree; + PRTL_BALANCED_LINKS RestartKey; + ULONG DeleteCount; + PRTL_AVL_COMPARE_ROUTINE CompareRoutine; + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_AVL_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_AVL_TABLE, *PRTL_AVL_TABLE; + +NTSYSAPI +VOID +NTAPI +RtlInitializeGenericTableAvl( + PRTL_AVL_TABLE Table, + PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + PRTL_AVL_FREE_ROUTINE FreeRoutine, + PVOID TableContext +); + +VOID +NTAPI +FsRtlDissectDbcs( + IN ANSI_STRING Name, + OUT PANSI_STRING FirstPart, + OUT PANSI_STRING RemainingPart); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesDbcsContainWildCards( + IN PANSI_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsDbcsInExpression( + IN PANSI_STRING Expression, + IN PANSI_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsFatDbcsLegal( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsHpfsDbcsLegal( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNormalizeNtstatus( + IN NTSTATUS Exception, + IN NTSTATUS GenericException); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNtstatusExpected( + IN NTSTATUS Ntstatus); + +NTKERNELAPI +PERESOURCE +NTAPI +FsRtlAllocateResource( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeLargeMcb( + IN PLARGE_MCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeLargeMcb( + IN PLARGE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetLargeMcb( + IN PLARGE_MCB Mcb, + IN BOOLEAN SelfSynchronized); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateLargeMcb( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntry( + IN PLARGE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntryAndIndex( + IN PLARGE_MCB OpaqueMcb, + OUT PLONGLONG LargeVbn, + OUT PLONGLONG LargeLbn, + OUT PULONG Index); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInLargeMcb( + IN PLARGE_MCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitLargeMcb( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeMcb( + IN PMCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeMcb( + IN PMCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateMcb( + IN PMCB Mcb, + IN VBN Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + IN LBN Lbn, + IN ULONG SectorCount); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + IN ULONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount OPTIONAL, + OUT PULONG Index); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastMcbEntry( + IN PMCB Mcb, + OUT PVBN Vbn, + OUT PLBN Lbn); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInMcb( + IN PMCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextMcbEntry( + IN PMCB Mcb, + IN ULONG RunIndex, + OUT PVBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlBalanceReads( + IN PDEVICE_OBJECT TargetDevice); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeOplock( + IN OUT POPLOCK Oplock); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeOplock( + IN OUT POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrl( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplock( + IN POPLOCK Oplock, + IN PIRP Irp, + IN PVOID Context, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsFastIoPossible( + IN POPLOCK Oplock); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentBatchOplock( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEvent( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyInitializeSync( + IN PNOTIFY_SYNC *NotifySync); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyUninitializeSync( + IN PNOTIFY_SYNC *NotifySync); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullChangeDirectory( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp OPTIONAL, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterReportChange( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext OPTIONAL, + IN PVOID FilterContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullReportChange( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanup( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlDissectName( + IN UNICODE_STRING Name, + OUT PUNICODE_STRING FirstPart, + OUT PUNICODE_STRING RemainingPart); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesNameContainWildCards( + IN PUNICODE_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreNamesEqual( + IN PCUNICODE_STRING Name1, + IN PCUNICODE_STRING Name2, + IN BOOLEAN IgnoreCase, + IN PCWCH UpcaseTable OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNameInExpression( + IN PUNICODE_STRING Expression, + IN PUNICODE_STRING Name, + IN BOOLEAN IgnoreCase, + IN PWCHAR UpcaseTable OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostPagingFileStackOverflow( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostStackOverflow ( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRegisterUncProvider( + OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirectorDeviceName, + IN BOOLEAN MailslotsSupported); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeregisterUncProvider( + IN HANDLE Handle); + +NTKERNELAPI +VOID +NTAPI +FsRtlTeardownPerStreamContexts( + IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCreateSectionForDataScan( + OUT PHANDLE SectionHandle, + OUT PVOID *SectionObject, + OUT PLARGE_INTEGER SectionFileSize OPTIONAL, + IN PFILE_OBJECT FileObject, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN ULONG Flags); + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterChangeDirectory( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp OPTIONAL, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, + IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerStreamContext( + IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + IN PFSRTL_PER_STREAM_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlLookupPerStreamContextInternal( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlRemovePerStreamContext( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadNotPossible( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadWait( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadNoWait( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadResourceMiss( + VOID); + +NTKERNELAPI +LOGICAL +NTAPI +FsRtlIsPagingFile( + IN PFILE_OBJECT FileObject); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTKERNELAPI + VOID +NTAPI +FsRtlInitializeBaseMcb( + IN PBASE_MCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateBaseMcb( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlRemoveBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntry( + IN PBASE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntryAndIndex( + IN PBASE_MCB OpaqueMcb, + IN OUT PLONGLONG LargeVbn, + IN OUT PLONGLONG LargeLbn, + IN OUT PULONG Index); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextBaseMcbEntry( + IN PBASE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitBaseMcb( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount); + +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +BOOLEAN +NTAPI +FsRtlInitializeBaseMcbEx( + IN PBASE_MCB Mcb, + IN POOL_TYPE PoolType, + IN USHORT Flags); + +NTSTATUS +NTAPI +FsRtlAddBaseMcbEntryEx( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentOplock( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakToNone( + IN OUT POPLOCK Oplock, + IN PIO_STACK_LOCATION IrpSp OPTIONAL, + IN PIRP Irp, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEventEx( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode, + IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanupAll( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList); + +NTSTATUS +NTAPI +FsRtlRegisterUncProviderEx( + OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirDevName, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCancellableWaitForSingleObject( + IN PVOID Object, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PIRP Irp OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCancellableWaitForMultipleObjects( + IN ULONG Count, + IN PVOID ObjectArray[], + IN WAIT_TYPE WaitType, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PKWAIT_BLOCK WaitBlockArray OPTIONAL, + IN PIRP Irp OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlMupGetProviderInfoFromFileObject( + IN PFILE_OBJECT pFileObject, + IN ULONG Level, + OUT PVOID pBuffer, + IN OUT PULONG pBufferSize); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlMupGetProviderIdFromName( + IN PUNICODE_STRING pProviderName, + OUT PULONG32 pProviderId); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastMdlReadWait( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlValidateReparsePointBuffer( + IN ULONG BufferLength, + IN PREPARSE_DATA_BUFFER ReparseBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRemoveDotsFromPath( + IN OUT PWSTR OriginalString, + IN USHORT PathLength, + OUT USHORT *NewLength); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameterList( + IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, + OUT PECP_LIST *EcpList); + +NTKERNELAPI +VOID +NTAPI +FsRtlFreeExtraCreateParameterList( + IN PECP_LIST EcpList); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameter( + IN LPCGUID EcpType, + IN ULONG SizeOfContext, + IN FSRTL_ALLOCATE_ECP_FLAGS Flags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN ULONG PoolTag, + OUT PVOID *EcpContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlFreeExtraCreateParameter( + IN PVOID EcpContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitExtraCreateParameterLookasideList( + IN OUT PVOID Lookaside, + IN FSRTL_ECP_LOOKASIDE_FLAGS Flags, + IN SIZE_T Size, + IN ULONG Tag); + +VOID +NTAPI +FsRtlDeleteExtraCreateParameterLookasideList( + IN OUT PVOID Lookaside, + IN FSRTL_ECP_LOOKASIDE_FLAGS Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameterFromLookasideList( + IN LPCGUID EcpType, + IN ULONG SizeOfContext, + IN FSRTL_ALLOCATE_ECP_FLAGS Flags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN OUT PVOID LookasideList, + OUT PVOID *EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertExtraCreateParameter( + IN OUT PECP_LIST EcpList, + IN OUT PVOID EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFindExtraCreateParameter( + IN PECP_LIST EcpList, + IN LPCGUID EcpType, + OUT PVOID *EcpContext OPTIONAL, + OUT ULONG *EcpContextSize OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRemoveExtraCreateParameter( + IN OUT PECP_LIST EcpList, + IN LPCGUID EcpType, + OUT PVOID *EcpContext, + OUT ULONG *EcpContextSize OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetEcpListFromIrp( + IN PIRP Irp, + OUT PECP_LIST *EcpList OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlSetEcpListIntoIrp( + IN OUT PIRP Irp, + IN PECP_LIST EcpList); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetNextExtraCreateParameter( + IN PECP_LIST EcpList, + IN PVOID CurrentEcpContext OPTIONAL, + OUT LPGUID NextEcpType OPTIONAL, + OUT PVOID *NextEcpContext OPTIONAL, + OUT ULONG *NextEcpContextSize OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlAcknowledgeEcp( + IN PVOID EcpContext); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsEcpAcknowledged( + IN PVOID EcpContext); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsEcpFromUserMode( + IN PVOID EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlChangeBackingFileObject( + IN PFILE_OBJECT CurrentFileObject OPTIONAL, + IN PFILE_OBJECT NewFileObject, + IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, + IN ULONG Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlLogCcFlushError( + IN PUNICODE_STRING FileName, + IN PDEVICE_OBJECT DeviceObject, + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN NTSTATUS FlushError, + IN ULONG Flags); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreVolumeStartupApplicationsComplete( + VOID); + +NTKERNELAPI +ULONG +NTAPI +FsRtlQueryMaximumVirtualDiskNestingLevel( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetVirtualDiskNestingLevel( + IN PDEVICE_OBJECT DeviceObject, + OUT PULONG NestingLevel, + OUT PULONG NestingFlags OPTIONAL); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_VISTASP1) +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplockEx( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +#endif + #if (NTDDI_VERSION >= NTDDI_WIN7) + NTKERNELAPI BOOLEAN NTAPI FsRtlAreThereCurrentOrInProgressFileLocks( IN PFILE_LOCK FileLock); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsSharedRequest( + IN PIRP Irp); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakH( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentOplockH( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakToNoneEx( + IN OUT POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrlEx( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount, + IN ULONG Flags); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockKeysEqual( + IN PFILE_OBJECT Fo1 OPTIONAL, + IN PFILE_OBJECT Fo2 OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInitializeExtraCreateParameterList( + IN OUT PECP_LIST EcpList); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeExtraCreateParameter( + IN PECP_HEADER Ecp, + IN ULONG EcpFlags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN ULONG TotalSize, + IN LPCGUID EcpType, + IN PVOID ListAllocatedFrom OPTIONAL); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerFileContext( + IN PVOID* PerFileContextPointer, + IN PFSRTL_PER_FILE_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_FILE_CONTEXT +NTAPI +FsRtlLookupPerFileContext( + IN PVOID* PerFileContextPointer, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_FILE_CONTEXT +NTAPI +FsRtlRemovePerFileContext( + IN PVOID* PerFileContextPointer, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlTeardownPerFileContexts( + IN PVOID* PerFileContextPointer); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_FILEOBJECT_CONTEXT +NTAPI +FsRtlLookupPerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_FILEOBJECT_CONTEXT +NTAPI +FsRtlRemovePerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ + FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ +) + +#define FsRtlAreThereCurrentFileLocks(FL) ( \ + ((FL)->FastIoIsQuestionable) \ +) + +#define FsRtlIncrementLockRequestsInProgress(FL) { \ + ASSERT( (FL)->LockRequestsInProgress >= 0 ); \ + (void) \ + (InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ +} + +#define FsRtlDecrementLockRequestsInProgress(FL) { \ + ASSERT( (FL)->LockRequestsInProgress > 0 ); \ + (void) \ + (InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ +} + +extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo; +#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo + +#ifdef NLS_MB_CODE_PAGE_TAG +#undef NLS_MB_CODE_PAGE_TAG #endif +#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag + +/* GCC compatible definition, MS one is retarded */ +extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; +#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray + +#define FsRtlIsAnsiCharacterWild(C) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ +) + +#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) ( \ + FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL) \ +) + +#define FsRtlIsAnsiCharacterLegal(C,FLAGS) ( \ + FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \ +) + +#define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) ( \ + ((SCHAR)(C) < 0) ? DEFAULT_RET : \ + FlagOn( LEGAL_ANSI_CHARACTER_ARRAY[(C)], \ + (FLAGS) | \ + ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \ +) + +#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ + (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ + (NLS_MB_CODE_PAGE_TAG && \ + (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ +) + +#define FsRtlIsUnicodeCharacterWild(C) ( \ + (((C) >= 0x40) ? \ + FALSE : \ + FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ +) + +#define FsRtlInitPerFileContext( _fc, _owner, _inst, _cb) \ + ((_fc)->OwnerId = (_owner), \ + (_fc)->InstanceId = (_inst), \ + (_fc)->FreeCallback = (_cb)) + +#define FsRtlGetPerFileContextPointer(_fo) \ + (FsRtlSupportsPerFileContexts(_fo) ? \ + FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : \ + NULL) + +#define FsRtlSupportsPerFileContexts(_fo) \ + ((FsRtlGetPerStreamContextPointer(_fo) != NULL) && \ + (FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) && \ + (FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL)) + +#define FsRtlSetupAdvancedHeaderEx( _advhdr, _fmutx, _fctxptr ) \ +{ \ + FsRtlSetupAdvancedHeader( _advhdr, _fmutx ); \ + if ((_fctxptr) != NULL) { \ + (_advhdr)->FileContextSupportPointer = (_fctxptr); \ + } \ +} + +#define FsRtlGetPerStreamContextPointer(FO) ( \ + (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ +) + +#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ + (PSC)->OwnerId = (O), \ + (PSC)->InstanceId = (I), \ + (PSC)->FreeCallback = (FC) \ +) + +#define FsRtlSupportsPerStreamContexts(FO) ( \ + (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ + FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ + FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ +) + +#define FsRtlLookupPerStreamContext(_sc, _oid, _iid) \ + (((NULL != (_sc)) && \ + FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) && \ + !IsListEmpty(&(_sc)->FilterContexts)) ? \ + FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ + NULL) + +VOID +FORCEINLINE +NTAPI +FsRtlSetupAdvancedHeader( + IN PVOID AdvHdr, + IN PFAST_MUTEX FMutex ) +{ + PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr; + + localAdvHdr->Flags |= FSRTL_FLAG_ADVANCED_HEADER; + localAdvHdr->Flags2 |= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS; +#if (NTDDI_VERSION >= NTDDI_VISTA) + localAdvHdr->Version = FSRTL_FCB_HEADER_V1; +#else + localAdvHdr->Version = FSRTL_FCB_HEADER_V0; +#endif + InitializeListHead( &localAdvHdr->FilterContexts ); + if (FMutex != NULL) { + localAdvHdr->FastMutex = FMutex; + } +#if (NTDDI_VERSION >= NTDDI_VISTA) + *((PULONG_PTR)(&localAdvHdr->PushLock)) = 0; + localAdvHdr->FileContextSupportPointer = NULL; +#endif +} + +#define FsRtlInitPerFileObjectContext(_fc, _owner, _inst) \ + ((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst)) + +#define FsRtlCompleteRequest(IRP,STATUS) { \ + (IRP)->IoStatus.Status = (STATUS); \ + IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ +} + +#if (NTDDI_VERSION >= NTDDI_WIN7) +typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER; +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER { + NetworkOpenLocationAny, + NetworkOpenLocationRemote, + NetworkOpenLocationLoopback +} NETWORK_OPEN_LOCATION_QUALIFIER; + +typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER { + NetworkOpenIntegrityAny, + NetworkOpenIntegrityNone, + NetworkOpenIntegritySigned, + NetworkOpenIntegrityEncrypted, + NetworkOpenIntegrityMaximum +} NETWORK_OPEN_INTEGRITY_QUALIFIER; + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1 +#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2 +#define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000 + +typedef struct _NETWORK_OPEN_ECP_CONTEXT { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + ULONG Flags; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + ULONG Flags; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; + +typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0; + +#elif (NTDDI_VERSION >= NTDDI_VISTA) +typedef struct _NETWORK_OPEN_ECP_CONTEXT { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; +#endif + +DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8 ); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef struct _PREFETCH_OPEN_ECP_CONTEXT { + PVOID Context; +} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT; + +DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55 ); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb); +DEFINE_GUID(GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53 ); + +typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS; + +typedef struct _NFS_OPEN_ECP_CONTEXT { + PUNICODE_STRING ExportAlias; + PSOCKADDR_STORAGE_NFS ClientSocketAddress; +} NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT; + +typedef struct _SRV_OPEN_ECP_CONTEXT { + PUNICODE_STRING ShareName; + PSOCKADDR_STORAGE_NFS SocketAddress; + BOOLEAN OplockBlockState; + BOOLEAN OplockAppState; + BOOLEAN OplockFinalState; +} SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT; + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#define VACB_MAPPING_GRANULARITY (0x40000) +#define VACB_OFFSET_SHIFT (18) + +typedef struct _PUBLIC_BCB { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + ULONG MappedLength; + LARGE_INTEGER MappedFileOffset; +} PUBLIC_BCB, *PPUBLIC_BCB; + +typedef struct _CC_FILE_SIZES { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER FileSize; + LARGE_INTEGER ValidDataLength; +} CC_FILE_SIZES, *PCC_FILE_SIZES; + +typedef BOOLEAN +(NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( + IN PVOID Context, + IN BOOLEAN Wait); + +typedef VOID +(NTAPI *PRELEASE_FROM_LAZY_WRITE) ( + IN PVOID Context); + +typedef BOOLEAN +(NTAPI *PACQUIRE_FOR_READ_AHEAD) ( + IN PVOID Context, + IN BOOLEAN Wait); + +typedef VOID +(NTAPI *PRELEASE_FROM_READ_AHEAD) ( + IN PVOID Context); + +typedef struct _CACHE_MANAGER_CALLBACKS { + PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; + PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; + PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; + PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; +} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; + +typedef struct _CACHE_UNINITIALIZE_EVENT { + struct _CACHE_UNINITIALIZE_EVENT *Next; + KEVENT Event; +} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; + +typedef VOID +(NTAPI *PDIRTY_PAGE_ROUTINE) ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN PLARGE_INTEGER OldestLsn, + IN PLARGE_INTEGER NewestLsn, + IN PVOID Context1, + IN PVOID Context2); + +typedef VOID +(NTAPI *PFLUSH_TO_LSN) ( + IN PVOID LogHandle, + IN LARGE_INTEGER Lsn); + +typedef VOID +(NTAPI *PCC_POST_DEFERRED_WRITE) ( + IN PVOID Context1, + IN PVOID Context2); + +#define CcIsFileCached(FO) ( \ + ((FO)->SectionObjectPointer != NULL) && \ + (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ +) + +extern ULONG CcFastMdlReadWait; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +NTAPI +CcInitializeCacheMap( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes, + IN BOOLEAN PinAccess, + IN PCACHE_MANAGER_CALLBACKS Callbacks, + IN PVOID LazyWriteContext); + +NTKERNELAPI +BOOLEAN +NTAPI +CcUninitializeCacheMap( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER TruncateSize OPTIONAL, + IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +CcSetFileSizes( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPageThreshold( + IN PFILE_OBJECT FileObject, + IN ULONG DirtyPageThreshold); + +NTKERNELAPI +VOID +NTAPI +CcFlushCache( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus OPTIONAL); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetFlushedValidData( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN BcbListHeld); + +NTKERNELAPI +BOOLEAN +NTAPI +CcZeroData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER StartOffset, + IN PLARGE_INTEGER EndOffset, + IN BOOLEAN Wait); + +NTKERNELAPI +PVOID +NTAPI +CcRemapBcb( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcRepinBcb( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcUnpinRepinnedBcb( + IN PVOID Bcb, + IN BOOLEAN WriteThrough, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrs( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromBcb( + IN PVOID Bcb); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCanIWrite( + IN PFILE_OBJECT FileObject, + IN ULONG BytesToWrite, + IN BOOLEAN Wait, + IN BOOLEAN Retrying); + +NTKERNELAPI +VOID +NTAPI +CcDeferWrite( + IN PFILE_OBJECT FileObject, + IN PCC_POST_DEFERRED_WRITE PostRoutine, + IN PVOID Context1, + IN PVOID Context2, + IN ULONG BytesToWrite, + IN BOOLEAN Retrying); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyRead( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN ULONG PageCount, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN PVOID Buffer); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyWrite( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN PVOID Buffer); + +NTKERNELAPI +VOID +NTAPI +CcMdlRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcMdlReadComplete( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcPrepareMdlWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteComplete( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcScheduleReadAhead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length); + +NTKERNELAPI +NTSTATUS +NTAPI +CcWaitForCurrentLazyWriterActivity( + VOID); + +NTKERNELAPI +VOID +NTAPI +CcSetReadAheadGranularity( + IN PFILE_OBJECT FileObject, + IN ULONG Granularity); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinMappedData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + IN OUT PVOID *Bcb); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPreparePinWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Zero, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPinnedData( + IN PVOID BcbVoid, + IN PLARGE_INTEGER Lsn OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +CcUnpinData( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcSetBcbOwnerPointer( + IN PVOID Bcb, + IN PVOID OwnerPointer); + +NTKERNELAPI +VOID +NTAPI +CcUnpinDataForThread( + IN PVOID Bcb, + IN ERESOURCE_THREAD ResourceThreadId); + +NTKERNELAPI +VOID +NTAPI +CcSetAdditionalCacheAttributes( + IN PFILE_OBJECT FileObject, + IN BOOLEAN DisableReadAhead, + IN BOOLEAN DisableWriteBehind); + +NTKERNELAPI +BOOLEAN +NTAPI +CcIsThereDirtyData( + IN PVPB Vpb); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteAbort( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcSetLogHandleForFile( + IN PFILE_OBJECT FileObject, + IN PVOID LogHandle, + IN PFLUSH_TO_LSN FlushToLsnRoutine); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetDirtyPages( + IN PVOID LogHandle, + IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + IN PVOID Context1, + IN PVOID Context2); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); +#elif (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID *Bcb, + OUT PVOID *Buffer); +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +CcSetFileSizesEx( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrsRef( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + +NTKERNELAPI +VOID +NTAPI +CcSetParallelFlushFile( + IN PFILE_OBJECT FileObject, + IN BOOLEAN EnableParallelFlush); + +NTKERNELAPI +BOOLEAN +CcIsThereDirtyDataEx( + IN PVPB Vpb, + IN PULONG NumberOfDirtyPages OPTIONAL); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +VOID +NTAPI +CcCoherencyFlushAndPurgeCache( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus, + IN ULONG Flags OPTIONAL); +#endif + +#define CcGetFileSizePointer(FO) ( \ + ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ +) + +#define UNINITIALIZE_CACHE_MAPS (1) +#define DO_NOT_RETRY_PURGE (2) +#define DO_NOT_PURGE_DIRTY_PAGES (0x4) + +#define CC_FLUSH_AND_PURGE_NO_PURGE (0x1) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN ULONG Flags); +#elif (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN BOOLEAN UninitializeCacheMaps); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWriteWontFlush( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length); +#else +#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) +#endif + +#define CcReadAhead(FO, FOFF, LEN) ( \ + if ((LEN) >= 256) { \ + CcScheduleReadAhead((FO), (FOFF), (LEN)); \ + } \ +) + +#define PIN_WAIT (1) +#define PIN_EXCLUSIVE (2) +#define PIN_NO_READ (4) +#define PIN_IF_BCB (8) +#define PIN_CALLER_TRACKS_DIRTY_DATA (32) +#define PIN_HIGH_PRIORITY (64) + +#define MAP_WAIT 1 +#define MAP_NO_READ (16) +#define MAP_HIGH_PRIORITY (64) + +#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_REDIR_QUERY_PATH_EX CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS) + +typedef struct _QUERY_PATH_REQUEST { + ULONG PathNameLength; + PIO_SECURITY_CONTEXT SecurityContext; + WCHAR FilePathName[1]; +} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; + +typedef struct _QUERY_PATH_REQUEST_EX { + PIO_SECURITY_CONTEXT pSecurityContext; + ULONG EaLength; + PVOID pEaBuffer; + UNICODE_STRING PathName; + UNICODE_STRING DomainServiceName; + ULONG_PTR Reserved[ 3 ]; +} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX; + +typedef struct _QUERY_PATH_RESPONSE { + ULONG LengthAccepted; +} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; + +#define VOLSNAPCONTROLTYPE 0x00000053 +#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryObject( + IN HANDLE Handle OPTIONAL, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + OUT PVOID ObjectInformation OPTIONAL, + IN ULONG ObjectInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwNotifyChangeKey( + IN HANDLE KeyHandle, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG NotifyFilter, + IN BOOLEAN WatchSubtree, + OUT PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN Asynchronous); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateEvent( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN EVENT_TYPE EventType, + IN BOOLEAN InitialState); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteFile( + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFsControlFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG FsControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateObject( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle OPTIONAL, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + IN ULONG Options); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenDirectoryObject( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwAllocateVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN OUT PSIZE_T RegionSize, + IN ULONG AllocationType, + IN ULONG Protect); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFreeVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + IN ULONG FreeType); + +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForSingleObject( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEvent( + IN HANDLE EventHandle, + OUT PLONG PreviousState OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetSecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySecurityObject( + IN HANDLE FileHandle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Length, + OUT PULONG ResultLength); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcessTokenEx( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + OUT PHANDLE TokenHandle); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenThreadTokenEx( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + IN ULONG HandleAttributes, + OUT PHANDLE TokenHandle); + +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSYSAPI +NTSTATUS +NTAPI +ZwLockFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER ByteOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key, + IN BOOLEAN FailImmediately, + IN BOOLEAN ExclusiveLock); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnlockFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER ByteOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryQuotaInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID SidList, + IN ULONG SidListLength, + IN PSID StartSid OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetQuotaInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushBuffersFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + IN PVOID TokenInformation, + IN ULONG TokenInformationLength); +#endif + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateToken( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle); #pragma pack(push,4) @@ -6863,11 +9029,6 @@ FsRtlAreThereCurrentOrInProgressFileLocks( #include "csq.h" -#ifdef _NTOSKRNL_ -extern PUCHAR FsRtlLegalAnsiCharacterArray; -#else -extern DECLSPEC_IMPORT PUCHAR FsRtlLegalAnsiCharacterArray; -#endif extern PACL SePublicDefaultDacl; extern PACL SeSystemDefaultDacl; @@ -6890,30 +9051,11 @@ extern PACL SeSystemDefaultDacl; #define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004 -#define FSRTL_VOLUME_DISMOUNT 1 -#define FSRTL_VOLUME_DISMOUNT_FAILED 2 -#define FSRTL_VOLUME_LOCK 3 -#define FSRTL_VOLUME_LOCK_FAILED 4 -#define FSRTL_VOLUME_UNLOCK 5 -#define FSRTL_VOLUME_MOUNT 6 - -#define FSRTL_WILD_CHARACTER 0x08 - -#define FSRTL_FAT_LEGAL 0x01 -#define FSRTL_HPFS_LEGAL 0x02 -#define FSRTL_NTFS_LEGAL 0x04 -#define FSRTL_WILD_CHARACTER 0x08 -#define FSRTL_OLE_LEGAL 0x10 -#define FSRTL_NTFS_STREAM_LEGAL 0x14 - #ifdef _X86_ #define HARDWARE_PTE HARDWARE_PTE_X86 #define PHARDWARE_PTE PHARDWARE_PTE_X86 #endif -#define IO_CHECK_CREATE_PARAMETERS 0x0200 -#define IO_ATTACH_DEVICE 0x0400 - #define IO_ATTACH_DEVICE_API 0x80000000 #define IO_TYPE_APC 18 @@ -6932,8 +9074,6 @@ extern PACL SeSystemDefaultDacl; #define MEM_DOS_LIM 0x40000000 -#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 - #define OB_TYPE_TYPE 1 #define OB_TYPE_DIRECTORY 2 #define OB_TYPE_SYMBOLIC_LINK 3 @@ -6958,23 +9098,12 @@ extern PACL SeSystemDefaultDacl; #define OB_TYPE_IO_COMPLETION 22 #define OB_TYPE_FILE 23 -#define PIN_WAIT (1) -#define PIN_EXCLUSIVE (2) -#define PIN_NO_READ (4) -#define PIN_IF_BCB (8) - #define SEC_BASED 0x00200000 -#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} -#define SECURITY_WORLD_RID (0x00000000L) - /* end winnt.h */ #define TOKEN_HAS_ADMIN_GROUP 0x08 -#define VACB_MAPPING_GRANULARITY (0x40000) -#define VACB_OFFSET_SHIFT (18) - #if (VER_PRODUCTBUILD >= 1381) #define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) #endif /* (VER_PRODUCTBUILD >= 1381) */ @@ -7001,18 +9130,6 @@ extern PACL SeSystemDefaultDacl; #define FSCTL_NETWORK_SET_DOMAIN_NAME CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) - -typedef PVOID OPLOCK, *POPLOCK; - -// -// Forwarders -// -struct _RTL_AVL_TABLE; -struct _RTL_GENERIC_TABLE; - -typedef PVOID PNOTIFY_SYNC; - typedef enum _FILE_STORAGE_TYPE { StorageTypeDefault = 1, StorageTypeDirectory, @@ -7048,17 +9165,6 @@ typedef struct _BITMAP_RANGE { PULONG Bitmap; } BITMAP_RANGE, *PBITMAP_RANGE; -typedef struct _CACHE_UNINITIALIZE_EVENT { - struct _CACHE_UNINITIALIZE_EVENT *Next; - KEVENT Event; -} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; - -typedef struct _CC_FILE_SIZES { - LARGE_INTEGER AllocationSize; - LARGE_INTEGER FileSize; - LARGE_INTEGER ValidDataLength; -} CC_FILE_SIZES, *PCC_FILE_SIZES; - typedef struct _FILE_COPY_ON_WRITE_INFORMATION { BOOLEAN ReplaceIfExists; HANDLE RootDirectory; @@ -7081,49 +9187,6 @@ typedef struct _FILE_FULL_DIRECTORY_INFORMATION { WCHAR FileName[ANYSIZE_ARRAY]; } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION; -typedef struct _FILE_FS_FULL_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER CallerAvailableAllocationUnits; - LARGE_INTEGER ActualAvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; - -typedef struct _FILE_FS_LABEL_INFORMATION { - ULONG VolumeLabelLength; - WCHAR VolumeLabel[1]; -} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; - -#if (VER_PRODUCTBUILD >= 2195) - -typedef struct _FILE_FS_OBJECT_ID_INFORMATION { - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION; - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -typedef struct _FILE_FS_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER AvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; - -typedef struct _FILE_FS_VOLUME_INFORMATION { - LARGE_INTEGER VolumeCreationTime; - ULONG VolumeSerialNumber; - ULONG VolumeLabelLength; - BOOLEAN SupportsObjects; - WCHAR VolumeLabel[1]; -} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; - -typedef struct _FILE_FS_OBJECTID_INFORMATION -{ - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; - /* raw internal file lock struct returned from FsRtlGetNextFileLock */ typedef struct _FILE_SHARED_LOCK_ENTRY { PVOID Unknown1; @@ -7208,51 +9271,6 @@ typedef struct _FILE_OLE_STATE_BITS_INFORMATION { ULONG StateBitsMask; } FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION; -typedef enum _FSRTL_COMPARISON_RESULT -{ - LessThan = -1, - EqualTo = 0, - GreaterThan = 1 -} FSRTL_COMPARISON_RESULT; - -#if (VER_PRODUCTBUILD >= 2600) - -typedef struct _FSRTL_PER_STREAM_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; - PFREE_FUNCTION FreeCallback; -} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; - -typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT -{ - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; -} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; - -#endif /* (VER_PRODUCTBUILD >= 2600) */ - -typedef struct _BASE_MCB -{ - ULONG MaximumPairCount; - ULONG PairCount; - USHORT PoolType; - USHORT Flags; - PVOID Mapping; -} BASE_MCB, *PBASE_MCB; - -typedef struct _LARGE_MCB -{ - PKGUARDED_MUTEX GuardedMutex; - BASE_MCB BaseMcb; -} LARGE_MCB, *PLARGE_MCB; - -typedef struct _MCB -{ - LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; -} MCB, *PMCB; - typedef struct _MAPPING_PAIR { ULONGLONG Vcn; ULONGLONG Lcn; @@ -7264,8 +9282,6 @@ typedef struct _GET_RETRIEVAL_DESCRIPTOR { MAPPING_PAIR Pair[1]; } GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR; -#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); - typedef struct _MBCB { CSHORT NodeTypeCode; CSHORT NodeIsInZone; @@ -7328,189 +9344,6 @@ typedef struct _OBJECT_ALL_TYPES_INFO { OBJECT_TYPE_INFO ObjectsTypeInfo[1]; } OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO; -typedef enum _RTL_GENERIC_COMPARE_RESULTS -{ - GenericLessThan, - GenericGreaterThan, - GenericEqual -} RTL_GENERIC_COMPARE_RESULTS; - -typedef enum _TABLE_SEARCH_RESULT -{ - TableEmptyTree, - TableFoundNode, - TableInsertAsLeft, - TableInsertAsRight -} TABLE_SEARCH_RESULT; - -typedef NTSTATUS -(NTAPI *PRTL_AVL_MATCH_FUNCTION)( - struct _RTL_AVL_TABLE *Table, - PVOID UserData, - PVOID MatchData -); - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef PVOID -(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID Buffer -); - -typedef PVOID -(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_AVL_FREE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID Buffer -); - -typedef struct _PUBLIC_BCB { - CSHORT NodeTypeCode; - CSHORT NodeByteSize; - ULONG MappedLength; - LARGE_INTEGER MappedFileOffset; -} PUBLIC_BCB, *PPUBLIC_BCB; - -typedef struct _QUERY_PATH_REQUEST { - ULONG PathNameLength; - PIO_SECURITY_CONTEXT SecurityContext; - WCHAR FilePathName[1]; -} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; - -typedef struct _QUERY_PATH_RESPONSE { - ULONG LengthAccepted; -} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; - -typedef struct _RTL_BALANCED_LINKS -{ - struct _RTL_BALANCED_LINKS *Parent; - struct _RTL_BALANCED_LINKS *LeftChild; - struct _RTL_BALANCED_LINKS *RightChild; - CHAR Balance; - UCHAR Reserved[3]; -} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; - -typedef struct _RTL_GENERIC_TABLE -{ - PRTL_SPLAY_LINKS TableRoot; - LIST_ENTRY InsertOrderList; - PLIST_ENTRY OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; - PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_GENERIC_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; - -#undef PRTL_GENERIC_COMPARE_ROUTINE -#undef PRTL_GENERIC_ALLOCATE_ROUTINE -#undef PRTL_GENERIC_FREE_ROUTINE -#undef RTL_GENERIC_TABLE -#undef PRTL_GENERIC_TABLE - -#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE -#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE -#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE -#define RTL_GENERIC_TABLE RTL_AVL_TABLE -#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE - -#define RtlInitializeGenericTable RtlInitializeGenericTableAvl -#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl -#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl -#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl -#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl -#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl -#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl -#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl -#define RtlGetElementGenericTable RtlGetElementGenericTableAvl -#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl -#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl - -typedef struct _RTL_AVL_TABLE -{ - RTL_BALANCED_LINKS BalancedRoot; - PVOID OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - ULONG DepthOfTree; - PRTL_BALANCED_LINKS RestartKey; - ULONG DeleteCount; - PRTL_AVL_COMPARE_ROUTINE CompareRoutine; - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_AVL_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_AVL_TABLE, *PRTL_AVL_TABLE; - -NTSYSAPI -VOID -NTAPI -RtlInitializeGenericTableAvl( - PRTL_AVL_TABLE Table, - PRTL_AVL_COMPARE_ROUTINE CompareRoutine, - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, - PRTL_AVL_FREE_ROUTINE FreeRoutine, - PVOID TableContext -); - -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer, - CLONG BufferSize, - PBOOLEAN NewElement OPTIONAL - ); - -NTSYSAPI -BOOLEAN -NTAPI -RtlDeleteElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer - ); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer - ); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableWithoutSplayingAvl ( - PRTL_AVL_TABLE Table, - PVOID *RestartKey - ); - #if defined(USE_LPC6432) #define LPC_CLIENT_ID CLIENT_ID64 #define LPC_SIZE_T ULONGLONG @@ -7575,13 +9408,6 @@ typedef struct _REMOTE_PORT_VIEW LPC_PVOID ViewBase; } REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW; -typedef struct _TUNNEL { - FAST_MUTEX Mutex; - PRTL_SPLAY_LINKS Cache; - LIST_ENTRY TimerQueue; - USHORT NumEntries; -} TUNNEL, *PTUNNEL; - typedef struct _VAD_HEADER { PVOID StartVPN; PVOID EndVPN; @@ -7596,150 +9422,6 @@ typedef struct _VAD_HEADER { LIST_ENTRY Secured; } VAD_HEADER, *PVAD_HEADER; -#if (VER_PRODUCTBUILD >= 2600) - -typedef BOOLEAN -(NTAPI *PFILTER_REPORT_CHANGE) ( - IN PVOID NotifyContext, - IN PVOID FilterContext -); - -#endif - -NTKERNELAPI -BOOLEAN -NTAPI -CcCanIWrite ( - IN PFILE_OBJECT FileObject, - IN ULONG BytesToWrite, - IN BOOLEAN Wait, - IN BOOLEAN Retrying -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN PVOID Buffer -); - -#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) - -typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) ( - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -VOID -NTAPI -CcDeferWrite ( - IN PFILE_OBJECT FileObject, - IN PCC_POST_DEFERRED_WRITE PostRoutine, - IN PVOID Context1, - IN PVOID Context2, - IN ULONG BytesToWrite, - IN BOOLEAN Retrying -); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyRead ( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN ULONG PageCount, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyWrite ( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN PVOID Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcFlushCache ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - OUT PIO_STATUS_BLOCK IoStatus OPTIONAL -); - -typedef VOID (NTAPI *PDIRTY_PAGE_ROUTINE) ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN PLARGE_INTEGER OldestLsn, - IN PLARGE_INTEGER NewestLsn, - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetDirtyPages ( - IN PVOID LogHandle, - IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromBcb ( - IN PVOID Bcb -); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromSectionPtrs ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer -); - -#define CcGetFileSizePointer(FO) ( \ - ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ -) - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetFlushedValidData ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN BcbListHeld -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTKERNELAPI LARGE_INTEGER NTAPI @@ -7748,428 +9430,6 @@ CcGetLsnForFileObject ( OUT PLARGE_INTEGER OldestLsn OPTIONAL ); -typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( - IN PVOID Context, - IN BOOLEAN Wait -); - -typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) ( - IN PVOID Context -); - -typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) ( - IN PVOID Context, - IN BOOLEAN Wait -); - -typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) ( - IN PVOID Context -); - -typedef struct _CACHE_MANAGER_CALLBACKS { - PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; - PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; - PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; - PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; -} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; - -NTKERNELAPI -VOID -NTAPI -CcInitializeCacheMap ( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes, - IN BOOLEAN PinAccess, - IN PCACHE_MANAGER_CALLBACKS Callbacks, - IN PVOID LazyWriteContext -); - -#define CcIsFileCached(FO) ( \ - ((FO)->SectionObjectPointer != NULL) && \ - (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ -) - -extern ULONG CcFastMdlReadWait; - -NTKERNELAPI -BOOLEAN -NTAPI -CcIsThereDirtyData ( - IN PVPB Vpb -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcMapData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcMdlRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -VOID -NTAPI -CcMdlReadComplete ( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain -); - -NTKERNELAPI -VOID -NTAPI -CcMdlWriteComplete ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain -); - -#define MAP_WAIT 1 - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinMappedData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - IN OUT PVOID *Bcb -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcPrepareMdlWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPreparePinWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Zero, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPurgeCacheSection ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN BOOLEAN UninitializeCacheMaps -); - -#define CcReadAhead(FO, FOFF, LEN) ( \ - if ((LEN) >= 256) { \ - CcScheduleReadAhead((FO), (FOFF), (LEN)); \ - } \ -) - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -PVOID -NTAPI -CcRemapBcb ( - IN PVOID Bcb -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -VOID -NTAPI -CcRepinBcb ( - IN PVOID Bcb -); - -NTKERNELAPI -VOID -NTAPI -CcScheduleReadAhead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length -); - -NTKERNELAPI -VOID -NTAPI -CcSetAdditionalCacheAttributes ( - IN PFILE_OBJECT FileObject, - IN BOOLEAN DisableReadAhead, - IN BOOLEAN DisableWriteBehind -); - -NTKERNELAPI -VOID -NTAPI -CcSetBcbOwnerPointer ( - IN PVOID Bcb, - IN PVOID OwnerPointer -); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPageThreshold ( - IN PFILE_OBJECT FileObject, - IN ULONG DirtyPageThreshold -); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPinnedData ( - IN PVOID BcbVoid, - IN PLARGE_INTEGER Lsn OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -CcSetFileSizes ( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes -); - -typedef VOID (NTAPI *PFLUSH_TO_LSN) ( - IN PVOID LogHandle, - IN LARGE_INTEGER Lsn -); - -NTKERNELAPI -VOID -NTAPI -CcSetLogHandleForFile ( - IN PFILE_OBJECT FileObject, - IN PVOID LogHandle, - IN PFLUSH_TO_LSN FlushToLsnRoutine -); - -NTKERNELAPI -VOID -NTAPI -CcSetReadAheadGranularity ( - IN PFILE_OBJECT FileObject, - IN ULONG Granularity /* default: PAGE_SIZE */ - /* allowed: 2^n * PAGE_SIZE */ -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcUninitializeCacheMap ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER TruncateSize OPTIONAL, - IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinData ( - IN PVOID Bcb -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinDataForThread ( - IN PVOID Bcb, - IN ERESOURCE_THREAD ResourceThreadId -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinRepinnedBcb ( - IN PVOID Bcb, - IN BOOLEAN WriteThrough, - OUT PIO_STATUS_BLOCK IoStatus -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -CcWaitForCurrentLazyWriterActivity ( - VOID -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -BOOLEAN -NTAPI -CcZeroData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER StartOffset, - IN PLARGE_INTEGER EndOffset, - IN BOOLEAN Wait -); - -#if (VER_PRODUCTBUILD >= 2600) - -#ifndef __NTOSKRNL__ -NTKERNELAPI -VOID -FASTCALL -ExInitializeRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExReInitializeRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExAcquireRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExAcquireRundownProtectionEx ( - IN PEX_RUNDOWN_REF RunRef, - IN ULONG Count -); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseRundownProtectionEx ( - IN PEX_RUNDOWN_REF RunRef, - IN ULONG Count -); - -NTKERNELAPI -VOID -FASTCALL -ExRundownCompleted ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExWaitForRundownProtectionRelease ( - IN PEX_RUNDOWN_REF RunRef -); - -#endif -#endif /* (VER_PRODUCTBUILD >= 2600) */ - - -#define FsRtlSetupAdvancedHeader( _advhdr, _fmutx ) \ -{ \ - SetFlag( (_advhdr)->Flags, FSRTL_FLAG_ADVANCED_HEADER ); \ - SetFlag( (_advhdr)->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS ); \ - (_advhdr)->Version = FSRTL_FCB_HEADER_V1; \ - InitializeListHead( &(_advhdr)->FilterContexts ); \ - if ((_fmutx) != NULL) { \ - (_advhdr)->FastMutex = (_fmutx); \ - } \ - *((PULONG_PTR)(&(_advhdr)->PushLock)) = 0; \ - /*ExInitializePushLock( &(_advhdr)->PushLock ); API Not avaliable downlevel*/\ - (_advhdr)->FileContextSupportPointer = NULL; \ -} - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - IN LBN Lbn, - IN ULONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlAddToTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING ShortName, - IN PUNICODE_STRING LongName, - IN BOOLEAN KeyByShortName, - IN ULONG DataLength, - IN PVOID Data -); - NTKERNELAPI PVOID NTAPI @@ -8204,251 +9464,6 @@ FsRtlAllocatePoolWithTag ( IN ULONG Tag ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAreNamesEqual ( - IN PCUNICODE_STRING Name1, - IN PCUNICODE_STRING Name2, - IN BOOLEAN IgnoreCase, - IN PCWCH UpcaseTable OPTIONAL -); - -#define FsRtlAreThereCurrentFileLocks(FL) ( \ - ((FL)->FastIoIsQuestionable) \ -) - -typedef -VOID -(NTAPI*POPLOCK_WAIT_COMPLETE_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp -); - -typedef -VOID -(NTAPI*POPLOCK_FS_PREPOST_IRP) ( - IN PVOID Context, - IN PIRP Irp -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCheckOplock ( - IN POPLOCK Oplock, - IN PIRP Irp, - IN PVOID Context, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentBatchOplock ( - IN POPLOCK Oplock -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteKeyFromTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteTunnelCache ( - IN PTUNNEL Cache -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeregisterUncProvider ( - IN HANDLE Handle -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectDbcs ( - IN ANSI_STRING Name, - OUT PANSI_STRING FirstPart, - OUT PANSI_STRING RemainingPart -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectName ( - IN UNICODE_STRING Name, - OUT PUNICODE_STRING FirstPart, - OUT PUNICODE_STRING RemainingPart -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesDbcsContainWildCards ( - IN PANSI_STRING Name -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesNameContainWildCards ( - IN PUNICODE_STRING Name -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsFatDbcsLegal ( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible - ); - - -#define FsRtlCompleteRequest(IRP,STATUS) { \ - (IRP)->IoStatus.Status = (STATUS); \ - IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ -} - -#define FsRtlEnterFileSystem KeEnterCriticalRegion - -#define FsRtlExitFileSystem KeLeaveCriticalRegion - -#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ - FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ -) - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlFindInTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING Name, - OUT PUNICODE_STRING ShortName, - OUT PUNICODE_STRING LongName, - IN OUT PULONG DataLength, - OUT PVOID Data -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextMcbEntry ( - IN PMCB Mcb, - IN ULONG RunIndex, - OUT PVBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount -); - -#define FsRtlGetPerStreamContextPointer(FO) ( \ - (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ -) - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeBaseMcb ( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeLargeMcb ( - IN PLARGE_MCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeMcb ( - IN PMCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeOplock ( - IN OUT POPLOCK Oplock -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeTunnelCache ( - IN PTUNNEL Cache -); - -#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ - (PSC)->OwnerId = (O), \ - (PSC)->InstanceId = (I), \ - (PSC)->FreeCallback = (FC) \ -) - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerStreamContext ( - IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, - IN PFSRTL_PER_STREAM_CONTEXT Ptr -); - -#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterWild(C) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ -) - NTKERNELAPI BOOLEAN NTAPI @@ -8459,142 +9474,6 @@ FsRtlIsFatDbcsLegal ( IN BOOLEAN LeadingBackslashPermissible ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsHpfsDbcsLegal ( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNameInExpression ( - IN PUNICODE_STRING Expression, - IN PUNICODE_STRING Name, - IN BOOLEAN IgnoreCase, - IN PWCHAR UpcaseTable OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNtstatusExpected ( - IN NTSTATUS Ntstatus -); - -#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo - -extern PUSHORT NlsOemLeadByteInfo; - -#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ - (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ - (NLS_MB_CODE_PAGE_TAG && \ - (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ -) - -#define FsRtlIsUnicodeCharacterWild(C) ( \ - (((C) >= 0x40) ? \ - FALSE : \ - FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ -) - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntry ( - IN PBASE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntry ( - IN PLARGE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastMcbEntry ( - IN PMCB Mcb, - OUT PVBN Vbn, - OUT PLBN Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntryAndIndex ( - IN PBASE_MCB OpaqueMcb, - IN OUT PLONGLONG LargeVbn, - IN OUT PLONGLONG LargeLbn, - IN OUT PULONG Index -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntryAndIndex ( - IN PLARGE_MCB OpaqueMcb, - OUT PLONGLONG LargeVbn, - OUT PLONGLONG LargeLbn, - OUT PULONG Index -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount OPTIONAL, - OUT PULONG Index -); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlLookupPerStreamContextInternal ( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL -); - NTKERNELAPI BOOLEAN NTAPI @@ -8612,14 +9491,6 @@ FsRtlMdlWriteComplete ( IN PMDL MdlChain ); -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNormalizeNtstatus ( - IN NTSTATUS Exception, - IN NTSTATUS GenericException -); - NTKERNELAPI VOID NTAPI @@ -8633,306 +9504,6 @@ FsRtlNotifyChangeDirectory ( IN PIRP NotifyIrp ); -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyCleanup ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext -); - -typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( - IN PVOID NotifyContext, - IN PVOID TargetContext, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterChangeDirectory ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, - IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterReportChange ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext, - IN PVOID FilterContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullChangeDirectory ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullReportChange ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyInitializeSync ( - IN PNOTIFY_SYNC *NotifySync -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyUninitializeSync ( - IN PNOTIFY_SYNC *NotifySync -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNotifyVolumeEvent ( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInLargeMcb ( - IN PLARGE_MCB Mcb -); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInMcb ( - IN PMCB Mcb -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockFsctrl ( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockIsFastIoPossible ( - IN POPLOCK Oplock -); - -typedef VOID -(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( - IN PVOID Context, - IN PKEVENT Event -); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostPagingFileStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine -); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRegisterUncProvider ( - IN OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirectorDeviceName, - IN BOOLEAN MailslotsSupported -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - IN ULONG SectorCount -); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlRemovePerStreamContext ( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetLargeMcb ( - IN PLARGE_MCB Mcb, - IN BOOLEAN SelfSynchronized -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitBaseMcb ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitLargeMcb ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount -); - -#define FsRtlSupportsPerStreamContexts(FO) ( \ - (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ - FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ - FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ -) - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateBaseMcb ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateLargeMcb ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateMcb ( - IN PMCB Mcb, - IN VBN Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeLargeMcb ( - IN PLARGE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeMcb ( - IN PMCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeOplock ( - IN OUT POPLOCK Oplock -); - NTKERNELAPI NTSTATUS NTAPI @@ -8969,23 +9540,6 @@ ObReferenceObjectByName ( OUT PVOID *Object ); -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -NTSTATUS -NTAPI -PsAssignImpersonationToken( - IN PETHREAD Thread, - IN HANDLE Token OPTIONAL); - -NTKERNELAPI -HANDLE -NTAPI -PsReferencePrimaryToken( - IN OUT PEPROCESS Process); - -#endif - #define PsDereferenceImpersonationToken(T) \ {if (ARGUMENT_PRESENT(T)) { \ (ObDereferenceObject((T))); \ @@ -9003,14 +9557,6 @@ PsLookupProcessThreadByCid ( OUT PETHREAD *Thread ); -NTSYSAPI -VOID -NTAPI -RtlSecondsSince1970ToTime ( - IN ULONG SecondsSince1970, - OUT PLARGE_INTEGER Time -); - NTSYSAPI NTSTATUS NTAPI @@ -9021,105 +9567,6 @@ RtlSetSaclSecurityDescriptor ( IN BOOLEAN SaclDefaulted ); -NTSYSAPI -NTSTATUS -NTAPI -RtlUnicodeStringToCountedOemString ( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString -); - -/* RTL Splay Tree Functions */ -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSplay(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlDelete(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -VOID -NTAPI -RtlDeleteNoSplay( - PRTL_SPLAY_LINKS Links, - PRTL_SPLAY_LINKS *Root -); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealSuccessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealPredecessor(PRTL_SPLAY_LINKS Links); - -#define RtlIsLeftChild(Links) \ - (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlIsRightChild(Links) \ - (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlRightChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->RightChild - -#define RtlIsRoot(Links) \ - (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlLeftChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->LeftChild - -#define RtlParent(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->Parent - -#define RtlInitializeSplayLinks(Links) \ - { \ - PRTL_SPLAY_LINKS _SplayLinks; \ - _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ - _SplayLinks->Parent = _SplayLinks; \ - _SplayLinks->LeftChild = NULL; \ - _SplayLinks->RightChild = NULL; \ - } - -#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->LeftChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->RightChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -// -// RTL time functions -// - #define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports; #if (VER_PRODUCTBUILD >= 2195) @@ -9145,18 +9592,6 @@ ZwAlertThread ( IN HANDLE ThreadHandle ); -NTSYSAPI -NTSTATUS -NTAPI -ZwAllocateVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN OUT PSIZE_T RegionSize, - IN ULONG AllocationType, - IN ULONG Protect -); - NTSYSAPI NTSTATUS NTAPI @@ -9202,19 +9637,6 @@ ZwCloseObjectAuditAlarm ( IN BOOLEAN GenerateOnClose ); -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateSection ( - OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize OPTIONAL, - IN ULONG SectionPageProtection, - IN ULONG AllocationAttributes, - IN HANDLE FileHandle OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9225,71 +9647,6 @@ ZwCreateSymbolicLinkObject ( IN PUNICODE_STRING TargetName ); -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteFile ( - IN POBJECT_ATTRIBUTES ObjectAttributes -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteValueKey ( - IN HANDLE Handle, - IN PUNICODE_STRING Name -); - - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -NTSTATUS -NTAPI -ZwDeviceIoControlFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); -#endif - -NTSYSAPI -NTSTATUS -NTAPI -ZwDisplayString ( - IN PUNICODE_STRING String -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateObject ( - IN HANDLE SourceProcessHandle, - IN HANDLE SourceHandle, - IN HANDLE TargetProcessHandle OPTIONAL, - OUT PHANDLE TargetHandle OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - IN ULONG Options -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateToken ( - IN HANDLE ExistingTokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN EffectiveOnly, - IN TOKEN_TYPE TokenType, - OUT PHANDLE NewTokenHandle -); - NTSYSAPI NTSTATUS NTAPI @@ -9309,46 +9666,6 @@ ZwFlushBuffersFile( #if (VER_PRODUCTBUILD >= 2195) -NTSYSAPI -NTSTATUS -NTAPI -ZwFlushVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PULONG FlushSize, - OUT PIO_STATUS_BLOCK IoStatusBlock -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTSYSAPI -NTSTATUS -NTAPI -ZwFreeVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFsControlFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG FsControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength -); - -#if (VER_PRODUCTBUILD >= 2195) - NTSYSAPI NTSTATUS NTAPI @@ -9361,14 +9678,6 @@ ZwInitiatePowerAction ( #endif /* (VER_PRODUCTBUILD >= 2195) */ -NTSYSAPI -NTSTATUS -NTAPI -ZwLoadDriver ( - /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ - IN PUNICODE_STRING RegistryPath -); - NTSYSAPI NTSTATUS NTAPI @@ -9377,41 +9686,6 @@ ZwLoadKey ( IN POBJECT_ATTRIBUTES FileObjectAttributes ); -NTSYSAPI -NTSTATUS -NTAPI -ZwNotifyChangeKey ( - IN HANDLE KeyHandle, - IN HANDLE EventHandle OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG NotifyFilter, - IN BOOLEAN WatchSubtree, - IN PVOID Buffer, - IN ULONG BufferLength, - IN BOOLEAN Asynchronous -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenDirectoryObject ( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenProcess ( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9441,21 +9715,6 @@ ZwOpenThreadToken ( OUT PHANDLE TokenHandle ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwPowerInformation ( - IN POWER_INFORMATION_LEVEL PowerInformationLevel, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTSYSAPI NTSTATUS NTAPI @@ -9472,23 +9731,6 @@ ZwQueryDefaultLocale ( OUT PLCID Locale ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryDirectoryFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN BOOLEAN ReturnSingleEntry, - IN PUNICODE_STRING FileName OPTIONAL, - IN BOOLEAN RestartScan -); - #if (VER_PRODUCTBUILD >= 2195) NTSYSAPI @@ -9504,21 +9746,6 @@ ZwQueryDirectoryObject ( OUT PULONG ReturnLength OPTIONAL ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryEaFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN BOOLEAN ReturnSingleEntry, - IN PVOID EaList OPTIONAL, - IN ULONG EaListLength, - IN PULONG EaIndex OPTIONAL, - IN BOOLEAN RestartScan -); - #endif /* (VER_PRODUCTBUILD >= 2195) */ NTSYSAPI @@ -9532,39 +9759,6 @@ ZwQueryInformationProcess ( OUT PULONG ReturnLength OPTIONAL ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryInformationToken ( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG Length, - OUT PULONG ResultLength -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQuerySecurityObject ( - IN HANDLE FileHandle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG ResultLength -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryVolumeInformationFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass -); - NTSYSAPI NTSTATUS NTAPI @@ -9620,26 +9814,8 @@ ZwSetDefaultUILanguage ( IN LANGID LanguageId ); -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEaFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length -); - #endif /* (VER_PRODUCTBUILD >= 2195) */ -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEvent ( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9650,19 +9826,6 @@ ZwSetInformationProcess ( IN ULONG ProcessInformationLength ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetSecurityObject ( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTSYSAPI NTSTATUS NTAPI @@ -9671,37 +9834,6 @@ ZwSetSystemTime ( OUT PLARGE_INTEGER OldTime OPTIONAL ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetVolumeInformationFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTSYSAPI -NTSTATUS -NTAPI -ZwTerminateProcess ( - IN HANDLE ProcessHandle OPTIONAL, - IN NTSTATUS ExitStatus -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwUnloadDriver ( - /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ - IN PUNICODE_STRING RegistryPath -); - NTSYSAPI NTSTATUS NTAPI @@ -9709,16 +9841,6 @@ ZwUnloadKey ( IN POBJECT_ATTRIBUTES KeyObjectAttributes ); -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -NTSTATUS -NTAPI -ZwWaitForSingleObject ( - IN HANDLE Handle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); -#endif - NTSYSAPI NTSTATUS NTAPI From 0cb69766f39bdb2d73c163b52c113b5761f2c50f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 08:30:10 +0000 Subject: [PATCH 158/261] - Sync comdlg32, crypt32, gdiplus, hhctrl.ocx to Wine-1.1.43. svn path=/trunk/; revision=46955 --- reactos/dll/win32/comdlg32/filedlg.c | 16 +- reactos/dll/win32/comdlg32/fontdlg.c | 12 +- reactos/dll/win32/comdlg32/printdlg.c | 8 +- reactos/dll/win32/crypt32/decode.c | 4 +- reactos/dll/win32/gdiplus/brush.c | 12 +- reactos/dll/win32/gdiplus/font.c | 24 +- reactos/dll/win32/gdiplus/gdiplus.spec | 2 +- reactos/dll/win32/gdiplus/gdiplus_private.h | 24 + reactos/dll/win32/gdiplus/graphics.c | 986 +++++++++++++------- reactos/dll/win32/gdiplus/image.c | 209 ++++- reactos/dll/win32/hhctrl.ocx/hhctrl.c | 2 +- reactos/include/psdk/gdiplusflat.h | 3 +- 12 files changed, 926 insertions(+), 376 deletions(-) diff --git a/reactos/dll/win32/comdlg32/filedlg.c b/reactos/dll/win32/comdlg32/filedlg.c index 58b57ccbbac..64cb3935ab2 100644 --- a/reactos/dll/win32/comdlg32/filedlg.c +++ b/reactos/dll/win32/comdlg32/filedlg.c @@ -176,7 +176,7 @@ static SIZE MemDialogSize = { 0, 0}; /* keep size of the (resizable) dialog */ /* Internal functions used by the dialog */ static LRESULT FILEDLG95_ResizeControls(HWND hwnd, WPARAM wParam, LPARAM lParam); static LRESULT FILEDLG95_FillControls(HWND hwnd, WPARAM wParam, LPARAM lParam); -static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam); +static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam); static LRESULT FILEDLG95_OnWMGetIShellBrowser(HWND hwnd); static BOOL FILEDLG95_OnOpen(HWND hwnd); static LRESULT FILEDLG95_InitControls(HWND hwnd); @@ -240,7 +240,7 @@ static BOOL GetFileName95(FileOpenDlgInfos *fodInfos) { LRESULT lRes; - LPCVOID template; + LPVOID template; HRSRC hRes; HANDLE hDlgTmpl = 0; HRESULT hr; @@ -991,7 +991,7 @@ static LRESULT FILEDLG95_OnWMGetMMI( HWND hwnd, LPMINMAXINFO mmiptr) * vertically or horizontally to get out of the way. Only the "grip" * is moved in both directions to stay in the corner. */ -static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam) +static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam) { RECT rc, rcview; int chgx, chgy; @@ -1223,11 +1223,11 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l return 0; } case WM_SIZE: - return FILEDLG95_OnWMSize(hwnd, wParam, lParam); + return FILEDLG95_OnWMSize(hwnd, wParam); case WM_GETMINMAXINFO: return FILEDLG95_OnWMGetMMI( hwnd, (LPMINMAXINFO)lParam); case WM_COMMAND: - return FILEDLG95_OnWMCommand(hwnd, wParam, lParam); + return FILEDLG95_OnWMCommand(hwnd, wParam); case WM_DRAWITEM: { switch(((LPDRAWITEMSTRUCT)lParam)->CtlID) @@ -1733,7 +1733,7 @@ void FILEDLG95_Clean(HWND hwnd) * * WM_COMMAND message handler */ -static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) +static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam) { WORD wNotifyCode = HIWORD(wParam); /* notification code */ WORD wID = LOWORD(wParam); /* item, control, or accelerator identifier */ @@ -3799,7 +3799,7 @@ BOOL FD32_GetTemplate(PFD31_DATA lfs) /*********************************************************************** * FD32_WMMeasureItem [internal] */ -static LONG FD32_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) +static LONG FD32_WMMeasureItem(LPARAM lParam) { LPMEASUREITEMSTRUCT lpmeasure; @@ -3832,7 +3832,7 @@ static INT_PTR CALLBACK FD32_FileOpenDlgProc(HWND hWnd, UINT wMsg, return FD31_WMInitDialog(hWnd, wParam, lParam); case WM_MEASUREITEM: - return FD32_WMMeasureItem(hWnd, wParam, lParam); + return FD32_WMMeasureItem(lParam); case WM_DRAWITEM: return FD31_WMDrawItem(hWnd, wParam, lParam, !lfs->open, (DRAWITEMSTRUCT *)lParam); diff --git a/reactos/dll/win32/comdlg32/fontdlg.c b/reactos/dll/win32/comdlg32/fontdlg.c index 1ad881c72d2..80f1ad9345b 100644 --- a/reactos/dll/win32/comdlg32/fontdlg.c +++ b/reactos/dll/win32/comdlg32/fontdlg.c @@ -766,7 +766,7 @@ static LRESULT CFn_WMInitDialog(HWND hDlg, LPARAM lParam, LPCHOOSEFONTW lpcf) /*********************************************************************** * CFn_WMMeasureItem [internal] */ -static LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam) +static LRESULT CFn_WMMeasureItem(HWND hDlg, LPARAM lParam) { HDC hdc; HFONT hfontprev; @@ -794,7 +794,7 @@ static LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam) /*********************************************************************** * CFn_WMDrawItem [internal] */ -static LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam) +static LRESULT CFn_WMDrawItem(LPARAM lParam) { HBRUSH hBrush; WCHAR buffer[40]; @@ -1190,9 +1190,9 @@ static INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_MEASUREITEM: - return CFn_WMMeasureItem(hDlg, wParam, lParam); + return CFn_WMMeasureItem(hDlg,lParam); case WM_DRAWITEM: - return CFn_WMDrawItem(hDlg, wParam, lParam); + return CFn_WMDrawItem(lParam); case WM_COMMAND: return CFn_WMCommand(hDlg, wParam, lParam, lpcfw); case WM_DESTROY: @@ -1239,9 +1239,9 @@ static INT_PTR CALLBACK FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_MEASUREITEM: - return CFn_WMMeasureItem(hDlg, wParam, lParam); + return CFn_WMMeasureItem(hDlg, lParam); case WM_DRAWITEM: - return CFn_WMDrawItem(hDlg, wParam, lParam); + return CFn_WMDrawItem(lParam); case WM_COMMAND: return CFn_WMCommand(hDlg, wParam, lParam, lpcf); case WM_DESTROY: diff --git a/reactos/dll/win32/comdlg32/printdlg.c b/reactos/dll/win32/comdlg32/printdlg.c index f653251ed16..74a06ffa3d5 100644 --- a/reactos/dll/win32/comdlg32/printdlg.c +++ b/reactos/dll/win32/comdlg32/printdlg.c @@ -1504,7 +1504,7 @@ static LRESULT PRINTDLG_WMInitDialogW(HWND hDlg, * PRINTDLG_WMCommand [internal] */ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, - LPARAM lParam, PRINT_PTRA* PrintStructures) + PRINT_PTRA* PrintStructures) { LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; @@ -1658,7 +1658,7 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, } static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, - LPARAM lParam, PRINT_PTRW* PrintStructures) + PRINT_PTRW* PrintStructures) { LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; @@ -1846,7 +1846,7 @@ static INT_PTR CALLBACK PrintDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_COMMAND: - return PRINTDLG_WMCommandA(hDlg, wParam, lParam, PrintStructures); + return PRINTDLG_WMCommandA(hDlg, wParam, PrintStructures); case WM_DESTROY: DestroyIcon(PrintStructures->hCollateIcon); @@ -1892,7 +1892,7 @@ static INT_PTR CALLBACK PrintDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_COMMAND: - return PRINTDLG_WMCommandW(hDlg, wParam, lParam, PrintStructures); + return PRINTDLG_WMCommandW(hDlg, wParam, PrintStructures); case WM_DESTROY: DestroyIcon(PrintStructures->hCollateIcon); diff --git a/reactos/dll/win32/crypt32/decode.c b/reactos/dll/win32/crypt32/decode.c index fb3d36e8124..655a5b2c5d6 100644 --- a/reactos/dll/win32/crypt32/decode.c +++ b/reactos/dll/win32/crypt32/decode.c @@ -523,9 +523,11 @@ static BOOL CRYPT_AsnDecodeSequence(struct AsnDecodeSequenceItem items[], for (i = 0; i < cItem; i++) { - bytesNeeded += items[i].size; + if (items[i].size > items[i].minSize) + bytesNeeded += items[i].size - items[i].minSize; structSize = max( structSize, items[i].offset + items[i].minSize ); } + bytesNeeded += structSize; if (pcbDecoded) *pcbDecoded = 1 + lenBytes + cbDecoded; if (!pvStructInfo) diff --git a/reactos/dll/win32/gdiplus/brush.c b/reactos/dll/win32/gdiplus/brush.c index 2d28004c95d..67be6b49836 100644 --- a/reactos/dll/win32/gdiplus/brush.c +++ b/reactos/dll/win32/gdiplus/brush.c @@ -1194,6 +1194,16 @@ GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorsWithCount(GpPathGradient return NotImplemented; } +GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT *count) +{ + TRACE("(%p, %p)\n", brush, count); + + if (!brush || !count) + return InvalidParameter; + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipGetPathGradientWrapMode(GpPathGradient *brush, GpWrapMode *wrapmode) { @@ -1559,7 +1569,7 @@ GpStatus WINGDIPAPI GdipSetPathGradientSigmaBlend(GpPathGradient *grad, } GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient - *grad, ARGB *argb, INT *count) + *grad, GDIPCONST ARGB *argb, INT *count) { static int calls; diff --git a/reactos/dll/win32/gdiplus/font.c b/reactos/dll/win32/gdiplus/font.c index fda5428a7dd..3a29771c710 100644 --- a/reactos/dll/win32/gdiplus/font.c +++ b/reactos/dll/win32/gdiplus/font.c @@ -489,6 +489,7 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, switch (font->unit) { case UnitPixel: + case UnitWorld: *height = font_height; break; case UnitPoint: @@ -520,7 +521,7 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, static INT CALLBACK is_font_installed_proc(const LOGFONTW *elf, const TEXTMETRICW *ntm, DWORD type, LPARAM lParam) { - if (!ntm) + if (!ntm || type == RASTER_FONTTYPE) { return 1; } @@ -642,12 +643,14 @@ GpStatus WINGDIPAPI GdipCloneFontFamily(GpFontFamily* FontFamily, GpFontFamily** GpStatus WINGDIPAPI GdipGetFamilyName (GDIPCONST GpFontFamily *family, WCHAR *name, LANGID language) { + static int lang_fixme; + if (family == NULL) return InvalidParameter; TRACE("%p, %p, %d\n", family, name, language); - if (language != LANG_NEUTRAL) + if (language != LANG_NEUTRAL && !lang_fixme++) FIXME("No support for handling of multiple languages!\n"); lstrcpynW (name, family->FamilyName, LF_FACESIZE); @@ -826,15 +829,21 @@ GpStatus WINGDIPAPI GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily) */ GpStatus WINGDIPAPI GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily) { - /* FIXME: On Windows this is called Microsoft Sans Serif, this shouldn't - * affect anything */ - static const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'}; + GpStatus stat; + static const WCHAR MicrosoftSansSerif[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f','\0'}; + static const WCHAR Tahoma[] = {'T','a','h','o','m','a','\0'}; TRACE("(%p)\n", nativeFamily); if (nativeFamily == NULL) return InvalidParameter; - return GdipCreateFontFamilyFromName(MSSansSerif, NULL, nativeFamily); + stat = GdipCreateFontFamilyFromName(MicrosoftSansSerif, NULL, nativeFamily); + + if (stat == FontFamilyNotFound) + /* FIXME: Microsoft Sans Serif is not installed on Wine. */ + stat = GdipCreateFontFamilyFromName(Tahoma, NULL, nativeFamily); + + return stat; } /***************************************************************************** @@ -957,6 +966,9 @@ static INT CALLBACK add_font_proc(const LOGFONTW *lfw, const TEXTMETRICW *ntm, GpFontCollection* fonts = (GpFontCollection*)lParam; int i; + if (type == RASTER_FONTTYPE) + return 1; + /* skip duplicates */ for (i=0; icount; i++) if (strcmpiW(lfw->lfFaceName, fonts->FontFamilies[i]->FamilyName) == 0) diff --git a/reactos/dll/win32/gdiplus/gdiplus.spec b/reactos/dll/win32/gdiplus/gdiplus.spec index e6cea5ad443..14e7fbff4a8 100644 --- a/reactos/dll/win32/gdiplus/gdiplus.spec +++ b/reactos/dll/win32/gdiplus/gdiplus.spec @@ -338,7 +338,7 @@ @ stub GdipGetPathGradientPresetBlendCount @ stdcall GdipGetPathGradientRect(ptr ptr) @ stdcall GdipGetPathGradientRectI(ptr ptr) -@ stub GdipGetPathGradientSurroundColorCount +@ stdcall GdipGetPathGradientSurroundColorCount(ptr ptr) @ stdcall GdipGetPathGradientSurroundColorsWithCount(ptr ptr ptr) @ stub GdipGetPathGradientTransform @ stdcall GdipGetPathGradientWrapMode(ptr ptr) diff --git a/reactos/dll/win32/gdiplus/gdiplus_private.h b/reactos/dll/win32/gdiplus/gdiplus_private.h index ca1cba6175c..5ff71255b9d 100644 --- a/reactos/dll/win32/gdiplus/gdiplus_private.h +++ b/reactos/dll/win32/gdiplus/gdiplus_private.h @@ -78,6 +78,29 @@ static inline REAL deg2rad(REAL degrees) return M_PI * degrees / 180.0; } +static inline ARGB color_over(ARGB bg, ARGB fg) +{ + BYTE b, g, r, a; + BYTE bg_alpha, fg_alpha; + + fg_alpha = (fg>>24)&0xff; + + if (fg_alpha == 0xff) return fg; + + if (fg_alpha == 0) return bg; + + bg_alpha = (((bg>>24)&0xff) * (0xff-fg_alpha)) / 0xff; + + if (bg_alpha == 0) return fg; + + a = bg_alpha + fg_alpha; + b = ((bg&0xff)*bg_alpha + (fg&0xff)*fg_alpha)*0xff/a; + g = (((bg>>8)&0xff)*bg_alpha + ((fg>>8)&0xff)*fg_alpha)*0xff/a; + r = (((bg>>16)&0xff)*bg_alpha + ((fg>>16)&0xff)*fg_alpha)*0xff/a; + + return (a<<24)|(r<<16)|(g<<8)|b; +} + extern const char *debugstr_rectf(CONST RectF* rc); extern const char *debugstr_pointf(CONST PointF* pt); @@ -112,6 +135,7 @@ struct GpGraphics{ HDC hdc; HWND hwnd; BOOL owndc; + GpImage *image; SmoothingMode smoothing; CompositingQuality compqual; InterpolationMode interpolation; diff --git a/reactos/dll/win32/gdiplus/graphics.c b/reactos/dll/win32/gdiplus/graphics.c index 1fd870e3d42..7a6fad301c9 100644 --- a/reactos/dll/win32/gdiplus/graphics.c +++ b/reactos/dll/win32/gdiplus/graphics.c @@ -173,6 +173,74 @@ static void transform_and_round_points(GpGraphics *graphics, POINT *pti, } } +/* Draw non-premultiplied ARGB data to the given graphics object */ +static GpStatus alpha_blend_pixels(GpGraphics *graphics, INT dst_x, INT dst_y, + const BYTE *src, INT src_width, INT src_height, INT src_stride) +{ + if (graphics->image && graphics->image->type == ImageTypeBitmap) + { + GpBitmap *dst_bitmap = (GpBitmap*)graphics->image; + INT x, y; + + for (x=0; xhdc, dst_x, dst_y, src_width, src_height, + hdc, 0, 0, src_width, src_height, bf); + + SelectObject(hdc, old_hbm); + DeleteDC(hdc); + DeleteObject(hbitmap); + + return Ok; + } +} + static ARGB blend_colors(ARGB start, ARGB end, REAL position) { ARGB result=0; @@ -1273,10 +1341,10 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete, (*metafile)->bounds.X = ((REAL) placeable->BoundingBox.Left) / ((REAL) placeable->Inch); (*metafile)->bounds.Y = ((REAL) placeable->BoundingBox.Top) / ((REAL) placeable->Inch); (*metafile)->bounds.Width = ((REAL) (placeable->BoundingBox.Right - - placeable->BoundingBox.Left)) / ((REAL) placeable->Inch); + - placeable->BoundingBox.Left)); (*metafile)->bounds.Height = ((REAL) (placeable->BoundingBox.Bottom - - placeable->BoundingBox.Top)) / ((REAL) placeable->Inch); - (*metafile)->unit = UnitInch; + - placeable->BoundingBox.Top)); + (*metafile)->unit = UnitPixel; if(delete) DeleteMetaFile(hwmf); @@ -1866,15 +1934,15 @@ GpStatus WINGDIPAPI GdipDrawImagePointsI(GpGraphics *graphics, GpImage *image, return NotImplemented; } -/* FIXME: partially implemented (only works for rectangular parallelograms) */ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image, GDIPCONST GpPointF *points, INT count, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes* imageAttributes, DrawImageAbort callback, VOID * callbackData) { - GpPointF ptf[3]; - POINT pti[3]; + GpPointF ptf[4]; + POINT pti[4]; REAL dx, dy; + GpStatus stat; TRACE("(%p, %p, %p, %d, %f, %f, %f, %f, %d, %p, %p, %p)\n", graphics, image, points, count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, @@ -1887,10 +1955,13 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image debugstr_pointf(&points[2])); memcpy(ptf, points, 3 * sizeof(GpPointF)); - transform_and_round_points(graphics, pti, ptf, 3); + ptf[3].X = ptf[2].X + ptf[1].X - ptf[0].X; + ptf[3].Y = ptf[2].Y + ptf[1].Y - ptf[0].Y; + transform_and_round_points(graphics, pti, ptf, 4); if (image->picture) { + /* FIXME: partially implemented (only works for rectangular parallelograms) */ if(srcUnit == UnitInch) dx = dy = (REAL) INCH_HIMETRIC; else if(srcUnit == UnitPixel){ @@ -1914,10 +1985,8 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image } else if (image->type == ImageTypeBitmap && ((GpBitmap*)image)->hbitmap) { - HDC hdc; GpBitmap* bitmap = (GpBitmap*)image; - int temp_hdc=0, temp_bitmap=0; - HBITMAP hbitmap, old_hbm=NULL; + int use_software=0; if (srcUnit == UnitInch) dx = dy = 96.0; /* FIXME: use the image resolution */ @@ -1926,83 +1995,233 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image else return NotImplemented; - if (!(bitmap->format == PixelFormat16bppRGB555 || - bitmap->format == PixelFormat24bppRGB || - bitmap->format == PixelFormat32bppRGB || - bitmap->format == PixelFormat32bppPARGB)) + if (imageAttributes || + (graphics->image && graphics->image->type == ImageTypeBitmap) || + ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X) + use_software = 1; + + if (use_software) { - BITMAPINFOHEADER bih; - BYTE *temp_bits; - PixelFormat dst_format; + RECT src_area, dst_area; + int i, x, y, stride; + GpMatrix *dst_to_src; + REAL m11, m12, m21, m22, mdx, mdy; + LPBYTE data; - /* we can't draw a bitmap of this format directly */ - hdc = CreateCompatibleDC(0); - temp_hdc = 1; - temp_bitmap = 1; + src_area.left = srcx*dx; + src_area.top = srcy*dy; + src_area.right = (srcx+srcwidth)*dx; + src_area.bottom = (srcy+srcheight)*dy; - bih.biSize = sizeof(BITMAPINFOHEADER); - bih.biWidth = bitmap->width; - bih.biHeight = -bitmap->height; - bih.biPlanes = 1; - bih.biBitCount = 32; - bih.biCompression = BI_RGB; - bih.biSizeImage = 0; - bih.biXPelsPerMeter = 0; - bih.biYPelsPerMeter = 0; - bih.biClrUsed = 0; - bih.biClrImportant = 0; + dst_area.left = dst_area.right = pti[0].x; + dst_area.top = dst_area.bottom = pti[0].y; + for (i=1; i<4; i++) + { + if (dst_area.left > pti[i].x) dst_area.left = pti[i].x; + if (dst_area.right < pti[i].x) dst_area.right = pti[i].x; + if (dst_area.top > pti[i].y) dst_area.top = pti[i].y; + if (dst_area.bottom < pti[i].y) dst_area.bottom = pti[i].y; + } - hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, - (void**)&temp_bits, NULL, 0); + m11 = (ptf[1].X - ptf[0].X) / srcwidth; + m21 = (ptf[2].X - ptf[0].X) / srcheight; + mdx = ptf[0].X - m11 * srcx - m21 * srcy; + m12 = (ptf[1].Y - ptf[0].Y) / srcwidth; + m22 = (ptf[2].Y - ptf[0].Y) / srcheight; + mdy = ptf[0].Y - m12 * srcx - m22 * srcy; + + stat = GdipCreateMatrix2(m11, m12, m21, m22, mdx, mdy, &dst_to_src); + if (stat != Ok) return stat; + + stat = GdipInvertMatrix(dst_to_src); + if (stat != Ok) + { + GdipDeleteMatrix(dst_to_src); + return stat; + } + + data = GdipAlloc(sizeof(ARGB) * (dst_area.right - dst_area.left) * (dst_area.bottom - dst_area.top)); + if (!data) + { + GdipDeleteMatrix(dst_to_src); + return OutOfMemory; + } + + stride = sizeof(ARGB) * (dst_area.right - dst_area.left); + + for (x=dst_area.left; x= src_area.right || + src_y < src_area.top || src_y >= src_area.bottom) + /* FIXME: Use wrapmode */ + *src_color = 0; + else + GdipBitmapGetPixel(bitmap, src_x, src_y, src_color); + } + } + + GdipDeleteMatrix(dst_to_src); + + if (imageAttributes) + { + if (imageAttributes->colorkeys[ColorAdjustTypeBitmap].enabled || + imageAttributes->colorkeys[ColorAdjustTypeDefault].enabled) + { + static int fixme; + if (!fixme++) + FIXME("Color keying not implemented\n"); + } + + if (imageAttributes->colorremaptables[ColorAdjustTypeBitmap].enabled || + imageAttributes->colorremaptables[ColorAdjustTypeDefault].enabled) + { + const struct color_remap_table *table; + + if (imageAttributes->colorremaptables[ColorAdjustTypeBitmap].enabled) + table = &imageAttributes->colorremaptables[ColorAdjustTypeBitmap]; + else + table = &imageAttributes->colorremaptables[ColorAdjustTypeDefault]; + + for (x=dst_area.left; xmapsize; i++) + { + if (*src_color == table->colormap[i].oldColor.Argb) + { + *src_color = table->colormap[i].newColor.Argb; + break; + } + } + } + } + + if (imageAttributes->colormatrices[ColorAdjustTypeBitmap].enabled || + imageAttributes->colormatrices[ColorAdjustTypeDefault].enabled) + { + static int fixme; + if (!fixme++) + FIXME("Color transforms not implemented\n"); + } + + if (imageAttributes->gamma_enabled[ColorAdjustTypeBitmap] || + imageAttributes->gamma_enabled[ColorAdjustTypeDefault]) + { + static int fixme; + if (!fixme++) + FIXME("Gamma adjustment not implemented\n"); + } + } + + stat = alpha_blend_pixels(graphics, dst_area.left, dst_area.top, + data, dst_area.right - dst_area.left, dst_area.bottom - dst_area.top, stride); + + GdipFree(data); + + return stat; + } + else + { + HDC hdc; + int temp_hdc=0, temp_bitmap=0; + HBITMAP hbitmap, old_hbm=NULL; + + if (!(bitmap->format == PixelFormat16bppRGB555 || + bitmap->format == PixelFormat24bppRGB || + bitmap->format == PixelFormat32bppRGB || + bitmap->format == PixelFormat32bppPARGB)) + { + BITMAPINFOHEADER bih; + BYTE *temp_bits; + PixelFormat dst_format; + + /* we can't draw a bitmap of this format directly */ + hdc = CreateCompatibleDC(0); + temp_hdc = 1; + temp_bitmap = 1; + + bih.biSize = sizeof(BITMAPINFOHEADER); + bih.biWidth = bitmap->width; + bih.biHeight = -bitmap->height; + bih.biPlanes = 1; + bih.biBitCount = 32; + bih.biCompression = BI_RGB; + bih.biSizeImage = 0; + bih.biXPelsPerMeter = 0; + bih.biYPelsPerMeter = 0; + bih.biClrUsed = 0; + bih.biClrImportant = 0; + + hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, + (void**)&temp_bits, NULL, 0); + + if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) + dst_format = PixelFormat32bppPARGB; + else + dst_format = PixelFormat32bppRGB; + + convert_pixels(bitmap->width, bitmap->height, + bitmap->width*4, temp_bits, dst_format, + bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries); + } + else + { + hbitmap = bitmap->hbitmap; + hdc = bitmap->hdc; + temp_hdc = (hdc == 0); + } + + if (temp_hdc) + { + if (!hdc) hdc = CreateCompatibleDC(0); + old_hbm = SelectObject(hdc, hbitmap); + } if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) - dst_format = PixelFormat32bppPARGB; + { + BLENDFUNCTION bf; + + bf.BlendOp = AC_SRC_OVER; + bf.BlendFlags = 0; + bf.SourceConstantAlpha = 255; + bf.AlphaFormat = AC_SRC_ALPHA; + + GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, + hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, bf); + } else - dst_format = PixelFormat32bppRGB; + { + StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, + hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, SRCCOPY); + } - convert_pixels(bitmap->width, bitmap->height, - bitmap->width*4, temp_bits, dst_format, - bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries); + if (temp_hdc) + { + SelectObject(hdc, old_hbm); + DeleteDC(hdc); + } + + if (temp_bitmap) + DeleteObject(hbitmap); } - else - { - hbitmap = bitmap->hbitmap; - hdc = bitmap->hdc; - temp_hdc = (hdc == 0); - } - - if (temp_hdc) - { - if (!hdc) hdc = CreateCompatibleDC(0); - old_hbm = SelectObject(hdc, hbitmap); - } - - if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) - { - BLENDFUNCTION bf; - - bf.BlendOp = AC_SRC_OVER; - bf.BlendFlags = 0; - bf.SourceConstantAlpha = 255; - bf.AlphaFormat = AC_SRC_ALPHA; - - GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, - hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, bf); - } - else - { - StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, - hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, SRCCOPY); - } - - if (temp_hdc) - { - SelectObject(hdc, old_hbm); - DeleteDC(hdc); - } - - if (temp_bitmap) - DeleteObject(hbitmap); } else { @@ -2403,208 +2622,6 @@ GpStatus WINGDIPAPI GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, return ret; } -GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string, - INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, - GDIPCONST GpStringFormat *format, GDIPCONST GpBrush *brush) -{ - HRGN rgn = NULL; - HFONT gdifont; - LOGFONTW lfw; - TEXTMETRICW textmet; - GpPointF pt[3], rectcpy[4]; - POINT corners[4]; - WCHAR* stringdup; - REAL angle, ang_cos, ang_sin, rel_width, rel_height; - INT sum = 0, height = 0, offsety = 0, fit, fitcpy, save_state, i, j, lret, nwidth, - nheight, lineend; - SIZE size; - POINT drawbase; - UINT drawflags; - RECT drawcoord; - - TRACE("(%p, %s, %i, %p, %s, %p, %p)\n", graphics, debugstr_wn(string, length), - length, font, debugstr_rectf(rect), format, brush); - - if(!graphics || !string || !font || !brush || !rect) - return InvalidParameter; - - if((brush->bt != BrushTypeSolidColor)){ - FIXME("not implemented for given parameters\n"); - return NotImplemented; - } - - if(format){ - TRACE("may be ignoring some format flags: attr %x\n", format->attr); - - /* Should be no need to explicitly test for StringAlignmentNear as - * that is default behavior if no alignment is passed. */ - if(format->vertalign != StringAlignmentNear){ - RectF bounds; - GdipMeasureString(graphics, string, length, font, rect, format, &bounds, 0, 0); - - if(format->vertalign == StringAlignmentCenter) - offsety = (rect->Height - bounds.Height) / 2; - else if(format->vertalign == StringAlignmentFar) - offsety = (rect->Height - bounds.Height); - } - } - - if(length == -1) length = lstrlenW(string); - - stringdup = GdipAlloc(length * sizeof(WCHAR)); - if(!stringdup) return OutOfMemory; - - save_state = SaveDC(graphics->hdc); - SetBkMode(graphics->hdc, TRANSPARENT); - SetTextColor(graphics->hdc, brush->lb.lbColor); - - pt[0].X = 0.0; - pt[0].Y = 0.0; - pt[1].X = 1.0; - pt[1].Y = 0.0; - pt[2].X = 0.0; - pt[2].Y = 1.0; - GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, pt, 3); - angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X)); - ang_cos = cos(angle); - ang_sin = sin(angle); - rel_width = sqrt((pt[1].Y-pt[0].Y)*(pt[1].Y-pt[0].Y)+ - (pt[1].X-pt[0].X)*(pt[1].X-pt[0].X)); - rel_height = sqrt((pt[2].Y-pt[0].Y)*(pt[2].Y-pt[0].Y)+ - (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X)); - - rectcpy[3].X = rectcpy[0].X = rect->X; - rectcpy[1].Y = rectcpy[0].Y = rect->Y + offsety; - rectcpy[2].X = rectcpy[1].X = rect->X + rect->Width; - rectcpy[3].Y = rectcpy[2].Y = rect->Y + offsety + rect->Height; - transform_and_round_points(graphics, corners, rectcpy, 4); - - if (roundr(rect->Width) == 0) - nwidth = INT_MAX; - else - nwidth = roundr(rel_width * rect->Width); - - if (roundr(rect->Height) == 0) - nheight = INT_MAX; - else - nheight = roundr(rel_height * rect->Height); - - if (roundr(rect->Width) != 0 && roundr(rect->Height) != 0) - { - /* FIXME: If only the width or only the height is 0, we should probably still clip */ - rgn = CreatePolygonRgn(corners, 4, ALTERNATE); - SelectClipRgn(graphics->hdc, rgn); - } - - /* Use gdi to find the font, then perform transformations on it (height, - * width, angle). */ - SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); - GetTextMetricsW(graphics->hdc, &textmet); - lfw = font->lfw; - - lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height); - lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width); - - lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0); - - gdifont = CreateFontIndirectW(&lfw); - DeleteObject(SelectObject(graphics->hdc, CreateFontIndirectW(&lfw))); - - for(i = 0, j = 0; i < length; i++){ - if(!isprintW(string[i]) && (string[i] != '\n')) - continue; - - stringdup[j] = string[i]; - j++; - } - - length = j; - - if (!format || format->align == StringAlignmentNear) - { - drawbase.x = corners[0].x; - drawbase.y = corners[0].y; - drawflags = DT_NOCLIP | DT_EXPANDTABS; - } - else if (format->align == StringAlignmentCenter) - { - drawbase.x = (corners[0].x + corners[1].x)/2; - drawbase.y = (corners[0].y + corners[1].y)/2; - drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_CENTER; - } - else /* (format->align == StringAlignmentFar) */ - { - drawbase.x = corners[1].x; - drawbase.y = corners[1].y; - drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_RIGHT; - } - - while(sum < length){ - drawcoord.left = drawcoord.right = drawbase.x + roundr(ang_sin * (REAL) height); - drawcoord.top = drawcoord.bottom = drawbase.y + roundr(ang_cos * (REAL) height); - - GetTextExtentExPointW(graphics->hdc, stringdup + sum, length - sum, - nwidth, &fit, NULL, &size); - fitcpy = fit; - - if(fit == 0){ - DrawTextW(graphics->hdc, stringdup + sum, 1, &drawcoord, drawflags); - break; - } - - for(lret = 0; lret < fit; lret++) - if(*(stringdup + sum + lret) == '\n') - break; - - /* Line break code (may look strange, but it imitates windows). */ - if(lret < fit) - lineend = fit = lret; /* this is not an off-by-one error */ - else if(fit < (length - sum)){ - if(*(stringdup + sum + fit) == ' ') - while(*(stringdup + sum + fit) == ' ') - fit++; - else - while(*(stringdup + sum + fit - 1) != ' '){ - fit--; - - if(*(stringdup + sum + fit) == '\t') - break; - - if(fit == 0){ - fit = fitcpy; - break; - } - } - lineend = fit; - while(*(stringdup + sum + lineend - 1) == ' ' || - *(stringdup + sum + lineend - 1) == '\t') - lineend--; - } - else - lineend = fit; - DrawTextW(graphics->hdc, stringdup + sum, min(length - sum, lineend), - &drawcoord, drawflags); - - sum += fit + (lret < fitcpy ? 1 : 0); - height += size.cy; - - if(height > nheight) - break; - - /* Stop if this was a linewrap (but not if it was a linebreak). */ - if((lret == fitcpy) && format && (format->attr & StringFormatFlagsNoWrap)) - break; - } - - GdipFree(stringdup); - DeleteObject(rgn); - DeleteObject(gdifont); - - RestoreDC(graphics->hdc, save_state); - - return Ok; -} - GpStatus WINGDIPAPI GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, INT count, REAL tension, GpFillMode fill) { @@ -3074,8 +3091,6 @@ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush, GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) { - static int calls; - TRACE("(%p,%u)\n", graphics, intention); if(!graphics) @@ -3084,10 +3099,12 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) if(graphics->busy) return ObjectBusy; - if(!(calls++)) - FIXME("not implemented\n"); + /* We have no internal operation queue, so there's no need to clear it. */ - return NotImplemented; + if (graphics->hdc) + GdiFlush(); + + return Ok; } /***************************************************************************** @@ -3465,61 +3482,37 @@ GpStatus WINGDIPAPI GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y, INT w return GdipIsVisibleRect(graphics, (REAL)x, (REAL)y, (REAL)width, (REAL)height, result); } -GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, - GDIPCONST WCHAR* string, INT length, GDIPCONST GpFont* font, - GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat, - INT regionCount, GpRegion** regions) -{ - FIXME("stub: %p %s %d %p %p %p %d %p\n", graphics, debugstr_w(string), - length, font, layoutRect, stringFormat, regionCount, regions); +typedef GpStatus (*gdip_format_string_callback)(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data); - if (!(graphics && string && font && layoutRect && stringFormat && regions)) - return InvalidParameter; - - return NotImplemented; -} - -/* Find the smallest rectangle that bounds the text when it is printed in rect - * according to the format options listed in format. If rect has 0 width and - * height, then just find the smallest rectangle that bounds the text when it's - * printed at location (rect->X, rect-Y). */ -GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, +static GpStatus gdip_format_string(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, RectF *bounds, - INT *codepointsfitted, INT *linesfilled) + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + gdip_format_string_callback callback, void *user_data) { - HFONT oldfont; WCHAR* stringdup; - INT sum = 0, height = 0, fit, fitcpy, max_width = 0, i, j, lret, nwidth, - nheight, lineend; + INT sum = 0, height = 0, fit, fitcpy, i, j, lret, nwidth, + nheight, lineend, lineno = 0; + RectF bounds; + StringAlignment halign; + GpStatus stat = Ok; SIZE size; - TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics, - debugstr_wn(string, length), length, font, debugstr_rectf(rect), format, - bounds, codepointsfitted, linesfilled); - - if(!graphics || !string || !font || !rect) - return InvalidParameter; - - if(linesfilled) *linesfilled = 0; - if(codepointsfitted) *codepointsfitted = 0; - - if(format) - TRACE("may be ignoring some format flags: attr %x\n", format->attr); - if(length == -1) length = lstrlenW(string); stringdup = GdipAlloc((length + 1) * sizeof(WCHAR)); if(!stringdup) return OutOfMemory; - oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); nwidth = roundr(rect->Width); nheight = roundr(rect->Height); - if((nwidth == 0) && (nheight == 0)) - nwidth = nheight = INT_MAX; + if (nwidth == 0) nwidth = INT_MAX; + if (nheight == 0) nheight = INT_MAX; for(i = 0, j = 0; i < length; i++){ + /* FIXME: This makes the indexes passed to callback inaccurate. */ if(!isprintW(string[i]) && (string[i] != '\n')) continue; @@ -3527,9 +3520,11 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, j++; } - stringdup[j] = 0; length = j; + if (format) halign = format->align; + else halign = StringAlignmentNear; + while(sum < length){ GetTextExtentExPointW(graphics->hdc, stringdup + sum, length - sum, nwidth, &fit, NULL, &size); @@ -3572,12 +3567,38 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, GetTextExtentExPointW(graphics->hdc, stringdup + sum, lineend, nwidth, &j, NULL, &size); - sum += fit + (lret < fitcpy ? 1 : 0); - if(codepointsfitted) *codepointsfitted = sum; + bounds.Width = size.cx; + if(height + size.cy > nheight) + bounds.Height = nheight - (height + size.cy); + else + bounds.Height = size.cy; + + bounds.Y = rect->Y + height; + + switch (halign) + { + case StringAlignmentNear: + default: + bounds.X = rect->X; + break; + case StringAlignmentCenter: + bounds.X = rect->X + (rect->Width/2) - (bounds.Width/2); + break; + case StringAlignmentFar: + bounds.X = rect->X + rect->Width - bounds.Width; + break; + } + + stat = callback(graphics, stringdup, sum, lineend, + font, rect, format, lineno, &bounds, user_data); + + if (stat != Ok) + break; + + sum += fit + (lret < fitcpy ? 1 : 0); height += size.cy; - if(linesfilled) *linesfilled += size.cy; - max_width = max(max_width, size.cx); + lineno++; if(height > nheight) break; @@ -3587,17 +3608,311 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, break; } + GdipFree(stringdup); + + return stat; +} + +struct measure_ranges_args { + GpRegion **regions; +}; + +GpStatus measure_ranges_callback(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data) +{ + int i; + GpStatus stat = Ok; + struct measure_ranges_args *args = user_data; + + for (i=0; irange_count; i++) + { + INT range_start = max(index, format->character_ranges[i].First); + INT range_end = min(index+length, format->character_ranges[i].First+format->character_ranges[i].Length); + if (range_start < range_end) + { + GpRectF range_rect; + SIZE range_size; + + range_rect.Y = bounds->Y; + range_rect.Height = bounds->Height; + + GetTextExtentExPointW(graphics->hdc, string + index, range_start - index, + INT_MAX, NULL, NULL, &range_size); + range_rect.X = bounds->X + range_size.cx; + + GetTextExtentExPointW(graphics->hdc, string + index, range_end - index, + INT_MAX, NULL, NULL, &range_size); + range_rect.Width = (bounds->X + range_size.cx) - range_rect.X; + + stat = GdipCombineRegionRect(args->regions[i], &range_rect, CombineModeUnion); + if (stat != Ok) + break; + } + } + + return stat; +} + +GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, + GDIPCONST WCHAR* string, INT length, GDIPCONST GpFont* font, + GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat, + INT regionCount, GpRegion** regions) +{ + GpStatus stat; + int i; + HFONT oldfont; + struct measure_ranges_args args; + + TRACE("(%p %s %d %p %s %p %d %p)\n", graphics, debugstr_w(string), + length, font, debugstr_rectf(layoutRect), stringFormat, regionCount, regions); + + if (!(graphics && string && font && layoutRect && stringFormat && regions)) + return InvalidParameter; + + if (regionCount < stringFormat->range_count) + return InvalidParameter; + + if (stringFormat->attr) + TRACE("may be ignoring some format flags: attr %x\n", stringFormat->attr); + + oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); + + for (i=0; irange_count; i++) + { + stat = GdipSetEmpty(regions[i]); + if (stat != Ok) + return stat; + } + + args.regions = regions; + + stat = gdip_format_string(graphics, string, length, font, layoutRect, stringFormat, + measure_ranges_callback, &args); + + DeleteObject(SelectObject(graphics->hdc, oldfont)); + + return stat; +} + +struct measure_string_args { + RectF *bounds; + INT *codepointsfitted; + INT *linesfilled; +}; + +static GpStatus measure_string_callback(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data) +{ + struct measure_string_args *args = user_data; + + if (bounds->Width > args->bounds->Width) + args->bounds->Width = bounds->Width; + + if (bounds->Height + bounds->Y > args->bounds->Height + args->bounds->Y) + args->bounds->Height = bounds->Height + bounds->Y - args->bounds->Y; + + if (args->codepointsfitted) + *args->codepointsfitted = index + length; + + if (args->linesfilled) + (*args->linesfilled)++; + + return Ok; +} + +/* Find the smallest rectangle that bounds the text when it is printed in rect + * according to the format options listed in format. If rect has 0 width and + * height, then just find the smallest rectangle that bounds the text when it's + * printed at location (rect->X, rect-Y). */ +GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, RectF *bounds, + INT *codepointsfitted, INT *linesfilled) +{ + HFONT oldfont; + struct measure_string_args args; + + TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics, + debugstr_wn(string, length), length, font, debugstr_rectf(rect), format, + bounds, codepointsfitted, linesfilled); + + if(!graphics || !string || !font || !rect || !bounds) + return InvalidParameter; + + if(linesfilled) *linesfilled = 0; + if(codepointsfitted) *codepointsfitted = 0; + + if(format) + TRACE("may be ignoring some format flags: attr %x\n", format->attr); + + oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); + bounds->X = rect->X; bounds->Y = rect->Y; - bounds->Width = (REAL)max_width; - bounds->Height = (REAL) min(height, nheight); + bounds->Width = 0.0; + bounds->Height = 0.0; + + args.bounds = bounds; + args.codepointsfitted = codepointsfitted; + args.linesfilled = linesfilled; + + gdip_format_string(graphics, string, length, font, rect, format, + measure_string_callback, &args); - GdipFree(stringdup); DeleteObject(SelectObject(graphics->hdc, oldfont)); return Ok; } +struct draw_string_args { + POINT drawbase; + UINT drawflags; + REAL ang_cos, ang_sin; +}; + +static GpStatus draw_string_callback(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data) +{ + struct draw_string_args *args = user_data; + RECT drawcoord; + + drawcoord.left = drawcoord.right = args->drawbase.x + roundr(args->ang_sin * bounds->Y); + drawcoord.top = drawcoord.bottom = args->drawbase.y + roundr(args->ang_cos * bounds->Y); + + DrawTextW(graphics->hdc, string + index, length, &drawcoord, args->drawflags); + + return Ok; +} + +GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string, + INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, + GDIPCONST GpStringFormat *format, GDIPCONST GpBrush *brush) +{ + HRGN rgn = NULL; + HFONT gdifont; + LOGFONTW lfw; + TEXTMETRICW textmet; + GpPointF pt[3], rectcpy[4]; + POINT corners[4]; + REAL angle, rel_width, rel_height; + INT offsety = 0, save_state; + struct draw_string_args args; + RectF scaled_rect; + + TRACE("(%p, %s, %i, %p, %s, %p, %p)\n", graphics, debugstr_wn(string, length), + length, font, debugstr_rectf(rect), format, brush); + + if(!graphics || !string || !font || !brush || !rect) + return InvalidParameter; + + if((brush->bt != BrushTypeSolidColor)){ + FIXME("not implemented for given parameters\n"); + return NotImplemented; + } + + if(format){ + TRACE("may be ignoring some format flags: attr %x\n", format->attr); + + /* Should be no need to explicitly test for StringAlignmentNear as + * that is default behavior if no alignment is passed. */ + if(format->vertalign != StringAlignmentNear){ + RectF bounds; + GdipMeasureString(graphics, string, length, font, rect, format, &bounds, 0, 0); + + if(format->vertalign == StringAlignmentCenter) + offsety = (rect->Height - bounds.Height) / 2; + else if(format->vertalign == StringAlignmentFar) + offsety = (rect->Height - bounds.Height); + } + } + + save_state = SaveDC(graphics->hdc); + SetBkMode(graphics->hdc, TRANSPARENT); + SetTextColor(graphics->hdc, brush->lb.lbColor); + + pt[0].X = 0.0; + pt[0].Y = 0.0; + pt[1].X = 1.0; + pt[1].Y = 0.0; + pt[2].X = 0.0; + pt[2].Y = 1.0; + GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, pt, 3); + angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X)); + args.ang_cos = cos(angle); + args.ang_sin = sin(angle); + rel_width = sqrt((pt[1].Y-pt[0].Y)*(pt[1].Y-pt[0].Y)+ + (pt[1].X-pt[0].X)*(pt[1].X-pt[0].X)); + rel_height = sqrt((pt[2].Y-pt[0].Y)*(pt[2].Y-pt[0].Y)+ + (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X)); + + rectcpy[3].X = rectcpy[0].X = rect->X; + rectcpy[1].Y = rectcpy[0].Y = rect->Y + offsety; + rectcpy[2].X = rectcpy[1].X = rect->X + rect->Width; + rectcpy[3].Y = rectcpy[2].Y = rect->Y + offsety + rect->Height; + transform_and_round_points(graphics, corners, rectcpy, 4); + + scaled_rect.X = 0.0; + scaled_rect.Y = 0.0; + scaled_rect.Width = rel_width * rect->Width; + scaled_rect.Height = rel_height * rect->Height; + + if (roundr(scaled_rect.Width) != 0 && roundr(scaled_rect.Height) != 0) + { + /* FIXME: If only the width or only the height is 0, we should probably still clip */ + rgn = CreatePolygonRgn(corners, 4, ALTERNATE); + SelectClipRgn(graphics->hdc, rgn); + } + + /* Use gdi to find the font, then perform transformations on it (height, + * width, angle). */ + SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); + GetTextMetricsW(graphics->hdc, &textmet); + lfw = font->lfw; + + lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height); + lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width); + + lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0); + + gdifont = CreateFontIndirectW(&lfw); + DeleteObject(SelectObject(graphics->hdc, CreateFontIndirectW(&lfw))); + + if (!format || format->align == StringAlignmentNear) + { + args.drawbase.x = corners[0].x; + args.drawbase.y = corners[0].y; + args.drawflags = DT_NOCLIP | DT_EXPANDTABS; + } + else if (format->align == StringAlignmentCenter) + { + args.drawbase.x = (corners[0].x + corners[1].x)/2; + args.drawbase.y = (corners[0].y + corners[1].y)/2; + args.drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_CENTER; + } + else /* (format->align == StringAlignmentFar) */ + { + args.drawbase.x = corners[1].x; + args.drawbase.y = corners[1].y; + args.drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_RIGHT; + } + + gdip_format_string(graphics, string, length, font, &scaled_rect, format, + draw_string_callback, &args); + + DeleteObject(rgn); + DeleteObject(gdifont); + + RestoreDC(graphics->hdc, save_state); + + return Ok; +} + GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics) { TRACE("(%p)\n", graphics); @@ -4300,7 +4615,12 @@ GpStatus WINGDIPAPI GdipTransformPointsI(GpGraphics *graphics, GpCoordinateSpace HPALETTE WINGDIPAPI GdipCreateHalftonePalette(void) { - FIXME("\n"); + static int calls; + + TRACE("\n"); + + if (!calls++) + FIXME("stub\n"); return NULL; } diff --git a/reactos/dll/win32/gdiplus/image.c b/reactos/dll/win32/gdiplus/image.c index 58f3c6570be..0a73dcf6ca4 100644 --- a/reactos/dll/win32/gdiplus/image.c +++ b/reactos/dll/win32/gdiplus/image.c @@ -122,7 +122,7 @@ static inline void getpixel_16bppGrayScale(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppRGB555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((WORD*)(row)+x); + WORD pixel = *((const WORD*)(row)+x); *r = (pixel>>7&0xf8)|(pixel>>12&0x7); *g = (pixel>>2&0xf8)|(pixel>>6&0x7); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -132,7 +132,7 @@ static inline void getpixel_16bppRGB555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppRGB565(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((WORD*)(row)+x); + WORD pixel = *((const WORD*)(row)+x); *r = (pixel>>8&0xf8)|(pixel>>13&0x7); *g = (pixel>>3&0xfc)|(pixel>>9&0x3); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -142,7 +142,7 @@ static inline void getpixel_16bppRGB565(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppARGB1555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((WORD*)(row)+x); + WORD pixel = *((const WORD*)(row)+x); *r = (pixel>>7&0xf8)|(pixel>>12&0x7); *g = (pixel>>2&0xf8)|(pixel>>6&0x7); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -1831,6 +1831,37 @@ GpStatus WINGDIPAPI GdipEmfToWmfBits(HENHMETAFILE hemf, UINT cbData16, return NotImplemented; } +/* Internal utility function: Replace the image data of dst with that of src, + * and free src. */ +static void move_bitmap(GpBitmap *dst, GpBitmap *src, BOOL clobber_palette) +{ + GdipFree(dst->bitmapbits); + DeleteDC(dst->hdc); + DeleteObject(dst->hbitmap); + + if (clobber_palette) + { + GdipFree(dst->image.palette_entries); + dst->image.palette_flags = src->image.palette_flags; + dst->image.palette_count = src->image.palette_count; + dst->image.palette_entries = src->image.palette_entries; + } + else + GdipFree(src->image.palette_entries); + + dst->image.xres = src->image.xres; + dst->image.yres = src->image.yres; + dst->width = src->width; + dst->height = src->height; + dst->format = src->format; + dst->hbitmap = src->hbitmap; + dst->hdc = src->hdc; + dst->bits = src->bits; + dst->stride = src->stride; + + GdipFree(src); +} + GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image) { TRACE("%p\n", image); @@ -1946,6 +1977,7 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image, GpGraphics **graphics) { HDC hdc; + GpStatus stat; TRACE("%p %p\n", image, graphics); @@ -1965,7 +1997,12 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image, ((GpBitmap*)image)->hdc = hdc; } - return GdipCreateFromHDC(hdc, graphics); + stat = GdipCreateFromHDC(hdc, graphics); + + if (stat == Ok) + (*graphics)->image = image; + + return stat; } GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height) @@ -2459,6 +2496,11 @@ static GpStatus decode_image_gif(IStream* stream, REFCLSID clsid, GpImage **imag return decode_image_wic(stream, &CLSID_WICGifDecoder, image); } +static GpStatus decode_image_tiff(IStream* stream, REFCLSID clsid, GpImage **image) +{ + return decode_image_wic(stream, &CLSID_WICTiffDecoder, image); +} + static GpStatus decode_image_olepicture_metafile(IStream* stream, REFCLSID clsid, GpImage **image) { IPicture *pic; @@ -2505,6 +2547,7 @@ typedef enum { BMP, JPEG, GIF, + TIFF, EMF, WMF, PNG, @@ -2517,10 +2560,11 @@ static const struct image_codec codecs[NUM_CODECS]; static GpStatus get_decoder_info(IStream* stream, const struct image_codec **result) { BYTE signature[8]; + const BYTE *pattern, *mask; LARGE_INTEGER seek; HRESULT hr; UINT bytesread; - int i, j; + int i, j, sig; /* seek to the start of the stream */ seek.QuadPart = 0; @@ -2528,7 +2572,7 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res if (FAILED(hr)) return hresult_to_status(hr); /* read the first 8 bytes */ - /* FIXME: This assumes all codecs have one signature <= 8 bytes in length */ + /* FIXME: This assumes all codecs have signatures <= 8 bytes in length */ hr = IStream_Read(stream, signature, 8, &bytesread); if (FAILED(hr)) return hresult_to_status(hr); if (hr == S_FALSE || bytesread == 0) return GenericError; @@ -2537,13 +2581,18 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res if ((codecs[i].info.Flags & ImageCodecFlagsDecoder) && bytesread >= codecs[i].info.SigSize) { - for (j=0; jtype != ImageTypeBitmap) + { + FIXME("Not implemented for type %i\n", image->type); + return NotImplemented; + } + + bitmap = (GpBitmap*)image; + bpp = PIXELFORMATBPP(bitmap->format); + + if (bpp < 8) + { + FIXME("Not implemented for %i bit images\n", bpp); + return NotImplemented; + } + + if (rotate_90) + { + width = bitmap->height; + height = bitmap->width; + } + else + { + width = bitmap->width; + height = bitmap->height; + } + + bytesperpixel = bpp/8; + + stat = GdipCreateBitmapFromScan0(width, height, 0, bitmap->format, NULL, &new_bitmap); + + if (stat != Ok) + return stat; + + stat = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, bitmap->format, &src_lock); + + if (stat == Ok) + { + stat = GdipBitmapLockBits(new_bitmap, NULL, ImageLockModeWrite, bitmap->format, &dst_lock); + + if (stat == Ok) + { + LPBYTE src_row, src_pixel; + LPBYTE dst_row, dst_pixel; + + src_origin = src_lock.Scan0; + if (flip_x) src_origin += bytesperpixel * (bitmap->width - 1); + if (flip_y) src_origin += src_lock.Stride * (bitmap->height - 1); + + if (rotate_90) + { + if (flip_y) src_x_offset = -src_lock.Stride; + else src_x_offset = src_lock.Stride; + if (flip_x) src_y_offset = -bytesperpixel; + else src_y_offset = bytesperpixel; + } + else + { + if (flip_x) src_x_offset = -bytesperpixel; + else src_x_offset = bytesperpixel; + if (flip_y) src_y_offset = -src_lock.Stride; + else src_y_offset = src_lock.Stride; + } + + src_row = src_origin; + dst_row = dst_lock.Scan0; + for (y=0; y Date: Tue, 20 Apr 2010 16:42:47 +0000 Subject: [PATCH 159/261] - Sync inetcomm, inseng, jscript to Wine-1.1.43. svn path=/trunk/; revision=46956 --- reactos/dll/win32/inetcomm/mimeintl.c | 2 +- reactos/dll/win32/inetcomm/mimeole.c | 72 ++++++++-------- reactos/dll/win32/inseng/inseng_main.c | 1 - reactos/dll/win32/jscript/jscript.h | 1 + reactos/dll/win32/jscript/regexp.c | 111 +++++++++++++++++++++---- reactos/dll/win32/jscript/string.c | 59 +++---------- 6 files changed, 145 insertions(+), 101 deletions(-) diff --git a/reactos/dll/win32/inetcomm/mimeintl.c b/reactos/dll/win32/inetcomm/mimeintl.c index 6d37147e2bf..97b482ed3c7 100644 --- a/reactos/dll/win32/inetcomm/mimeintl.c +++ b/reactos/dll/win32/inetcomm/mimeintl.c @@ -268,7 +268,7 @@ static HRESULT WINAPI MimeInternat_FindCharset(IMimeInternational *iface, LPCSTR if(SUCCEEDED(hr)) *phCharset = add_charset(&This->charsets, &mlang_info, - (HCHARSET)InterlockedIncrement(&This->next_charset_handle)); + UlongToHandle(InterlockedIncrement(&This->next_charset_handle))); } LeaveCriticalSection(&This->cs); diff --git a/reactos/dll/win32/inetcomm/mimeole.c b/reactos/dll/win32/inetcomm/mimeole.c index 992949a44ef..f297c2973b4 100644 --- a/reactos/dll/win32/inetcomm/mimeole.c +++ b/reactos/dll/win32/inetcomm/mimeole.c @@ -1419,7 +1419,7 @@ static HRESULT create_sub_stream(IStream *stream, ULARGE_INTEGER start, ULARGE_I typedef struct body_t { struct list entry; - HBODY hbody; + DWORD index; IMimeBody *mime_body; struct body_t *parent; @@ -1434,7 +1434,7 @@ typedef struct MimeMessage IStream *stream; struct list body_tree; - HBODY next_hbody; + DWORD next_index; } MimeMessage; static HRESULT WINAPI MimeMessage_QueryInterface(IMimeMessage *iface, REFIID riid, void **ppv) @@ -1512,13 +1512,13 @@ static HRESULT WINAPI MimeMessage_IsDirty( return E_NOTIMPL; } -static body_t *new_body_entry(IMimeBody *mime_body, HBODY hbody, body_t *parent) +static body_t *new_body_entry(IMimeBody *mime_body, DWORD index, body_t *parent) { body_t *body = HeapAlloc(GetProcessHeap(), 0, sizeof(*body)); if(body) { body->mime_body = mime_body; - body->hbody = hbody; + body->index = index; list_init(&body->children); body->parent = parent; } @@ -1630,8 +1630,7 @@ static body_t *create_sub_body(MimeMessage *msg, IStream *pStm, BODYOFFSETS *off offset->cbBodyStart = cur.u.LowPart + offset->cbHeaderStart; if(parent) MimeBody_set_offsets(impl_from_IMimeBody(mime_body), offset); IMimeBody_SetData(mime_body, IET_BINARY, NULL, NULL, &IID_IStream, pStm); - body = new_body_entry(mime_body, msg->next_hbody, parent); - msg->next_hbody = (HBODY)((DWORD)msg->next_hbody + 1); + body = new_body_entry(mime_body, msg->next_index++, parent); if(IMimeBody_IsContentType(mime_body, "multipart", NULL) == S_OK) { @@ -1812,7 +1811,7 @@ static HRESULT find_body(struct list *list, HBODY hbody, body_t **body) LIST_FOR_EACH_ENTRY(cur, list, body_t, entry) { - if(cur->hbody == hbody) + if(cur->index == HandleToUlong(hbody)) { *body = cur; return S_OK; @@ -1948,7 +1947,7 @@ static HRESULT WINAPI MimeMessage_GetBody( hr = get_body(This, location, hPivot, &body); - if(hr == S_OK) *phBody = body->hbody; + if(hr == S_OK) *phBody = UlongToHandle(body->index); return hr; } @@ -2003,38 +2002,35 @@ static HRESULT WINAPI MimeMessage_CountBodies( return S_OK; } -static HRESULT find_next(IMimeMessage *msg, LPFINDBODY find_body, HBODY *out) +static HRESULT find_next(IMimeMessage *msg, body_t *body, LPFINDBODY find, HBODY *out) { - HRESULT hr; - IMimeBody *mime_body; + MimeMessage *This = (MimeMessage *)msg; + struct list *ptr; HBODY next; - if(find_body->dwReserved == 0) - find_body->dwReserved = (DWORD)HBODY_ROOT; - else + for (;;) { - hr = IMimeMessage_GetBody(msg, IBL_FIRST, (HBODY)find_body->dwReserved, &next); - if(hr == S_OK) - find_body->dwReserved = (DWORD)next; + if (!body) ptr = list_head( &This->body_tree ); else { - hr = IMimeMessage_GetBody(msg, IBL_NEXT, (HBODY)find_body->dwReserved, &next); - if(hr == S_OK) - find_body->dwReserved = (DWORD)next; - else - return MIME_E_NOT_FOUND; + ptr = list_head( &body->children ); + while (!ptr) + { + if (!body->parent) return MIME_E_NOT_FOUND; + if (!(ptr = list_next( &body->parent->children, &body->entry ))) body = body->parent; + } + } + + body = LIST_ENTRY( ptr, body_t, entry ); + next = UlongToHandle( body->index ); + find->dwReserved = body->index; + if (IMimeBody_IsContentType(body->mime_body, find->pszPriType, find->pszSubType) == S_OK) + { + *out = next; + return S_OK; } } - - hr = IMimeMessage_BindToObject(msg, (HBODY)find_body->dwReserved, &IID_IMimeBody, (void**)&mime_body); - if(IMimeBody_IsContentType(mime_body, find_body->pszPriType, find_body->pszSubType) == S_OK) - { - IMimeBody_Release(mime_body); - *out = (HBODY)find_body->dwReserved; - return S_OK; - } - IMimeBody_Release(mime_body); - return find_next(msg, find_body, out); + return MIME_E_NOT_FOUND; } static HRESULT WINAPI MimeMessage_FindFirst( @@ -2045,7 +2041,7 @@ static HRESULT WINAPI MimeMessage_FindFirst( TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); pFindBody->dwReserved = 0; - return find_next(iface, pFindBody, phBody); + return find_next( iface, NULL, pFindBody, phBody ); } static HRESULT WINAPI MimeMessage_FindNext( @@ -2053,9 +2049,15 @@ static HRESULT WINAPI MimeMessage_FindNext( LPFINDBODY pFindBody, LPHBODY phBody) { + MimeMessage *This = (MimeMessage *)iface; + body_t *body; + HRESULT hr; + TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); - return find_next(iface, pFindBody, phBody); + hr = find_body( &This->body_tree, UlongToHandle( pFindBody->dwReserved ), &body ); + if (hr != S_OK) return MIME_E_NOT_FOUND; + return find_next( iface, body, pFindBody, phBody ); } static HRESULT WINAPI MimeMessage_ResolveURL( @@ -2562,7 +2564,7 @@ HRESULT MimeMessage_create(IUnknown *outer, void **obj) This->refs = 1; This->stream = NULL; list_init(&This->body_tree); - This->next_hbody = (HBODY)1; + This->next_index = 1; *obj = &This->lpVtbl; return S_OK; diff --git a/reactos/dll/win32/inseng/inseng_main.c b/reactos/dll/win32/inseng/inseng_main.c index 8ceb252b511..f1f148b4398 100644 --- a/reactos/dll/win32/inseng/inseng_main.c +++ b/reactos/dll/win32/inseng/inseng_main.c @@ -61,7 +61,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) HRESULT WINAPI DllCanUnloadNow(void) { - FIXME("\n"); return S_FALSE; } diff --git a/reactos/dll/win32/jscript/jscript.h b/reactos/dll/win32/jscript/jscript.h index 00688273de8..c1c8e60f35b 100644 --- a/reactos/dll/win32/jscript/jscript.h +++ b/reactos/dll/win32/jscript/jscript.h @@ -324,6 +324,7 @@ HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,DWORD,const WCHAR*,DWORD,con DWORD*,DWORD*,match_result_t*); HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*); HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*); +HRESULT regexp_string_match(script_ctx_t*,DispatchEx*,BSTR,VARIANT*,jsexcept_t*); static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i) { diff --git a/reactos/dll/win32/jscript/regexp.c b/reactos/dll/win32/jscript/regexp.c index 04575458105..7861d229826 100644 --- a/reactos/dll/win32/jscript/regexp.c +++ b/reactos/dll/win32/jscript/regexp.c @@ -2384,7 +2384,7 @@ SimpleMatch(REGlobalData *gData, REMatchState *x, REOp op, RECharSet *charSet; const char *opname = reop_names[op]; - TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program, + TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program), (int)gData->stateStackTop * 2, "", opname); switch (op) { @@ -2623,7 +2623,7 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x) for (;;) { const char *opname = reop_names[op]; - TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program, + TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program), (int)gData->stateStackTop * 2, "", opname); if (REOP_IS_SIMPLE(op)) { @@ -3637,25 +3637,25 @@ static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, VARIANT *arg, jsexce hres = to_string(ctx, arg, ei, &string); if(FAILED(hres)) return hres; + length = SysStringLen(string); }else { - string = SysAllocStringLen(NULL, 0); - if(!string) - return E_OUTOFMEMORY; + string = NULL; + length = 0; } - if(regexp->last_index < 0) { - SysFreeString(string); - set_last_index(regexp, 0); - *ret = VARIANT_FALSE; - if(input) { - *input = NULL; + if(regexp->jsregexp->flags & JSREG_GLOB) { + if(regexp->last_index < 0) { + SysFreeString(string); + set_last_index(regexp, 0); + *ret = VARIANT_FALSE; + if(input) { + *input = NULL; + } + return S_OK; } - return S_OK; - } - length = SysStringLen(string); - if(regexp->jsregexp->flags & JSREG_GLOB) last_index = regexp->last_index; + } cp = string + last_index; hres = regexp_match_next(ctx, ®exp->dispex, REM_RESET_INDEX, string, length, &cp, parens, @@ -3878,6 +3878,87 @@ HRESULT create_regexp_var(script_ctx_t *ctx, VARIANT *src_arg, VARIANT *flags_ar return create_regexp(ctx, src, -1, flags, ret); } +HRESULT regexp_string_match(script_ctx_t *ctx, DispatchEx *re, BSTR str, + VARIANT *retv, jsexcept_t *ei) +{ + RegExpInstance *regexp = (RegExpInstance*)re; + match_result_t *match_result; + DWORD match_cnt, i, length; + DispatchEx *array; + VARIANT var; + HRESULT hres; + + length = SysStringLen(str); + + if(!(regexp->jsregexp->flags & JSREG_GLOB)) { + match_result_t match, *parens = NULL; + DWORD parens_cnt, parens_size = 0; + const WCHAR *cp = str; + + hres = regexp_match_next(ctx, ®exp->dispex, 0, str, length, &cp, &parens, &parens_size, &parens_cnt, &match); + if(FAILED(hres)) + return hres; + + if(retv) { + if(hres == S_OK) { + IDispatch *ret; + + hres = create_match_array(ctx, str, &match, parens, parens_cnt, ei, &ret); + if(SUCCEEDED(hres)) { + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = ret; + } + }else { + V_VT(retv) = VT_NULL; + } + } + + heap_free(parens); + return S_OK; + } + + hres = regexp_match(ctx, ®exp->dispex, str, length, FALSE, &match_result, &match_cnt); + if(FAILED(hres)) + return hres; + + if(!match_cnt) { + TRACE("no match\n"); + + if(retv) + V_VT(retv) = VT_NULL; + return S_OK; + } + + hres = create_array(ctx, match_cnt, &array); + if(FAILED(hres)) + return hres; + + V_VT(&var) = VT_BSTR; + + for(i=0; i < match_cnt; i++) { + V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len); + if(!V_BSTR(&var)) { + hres = E_OUTOFMEMORY; + break; + } + + hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/); + SysFreeString(V_BSTR(&var)); + if(FAILED(hres)) + break; + } + + heap_free(match_result); + + if(SUCCEEDED(hres) && retv) { + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); + }else { + jsdisp_release(array); + } + return hres; +} + static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { diff --git a/reactos/dll/win32/jscript/string.c b/reactos/dll/win32/jscript/string.c index df43fee27ed..510dcc272c6 100644 --- a/reactos/dll/win32/jscript/string.c +++ b/reactos/dll/win32/jscript/string.c @@ -622,11 +622,9 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { const WCHAR *str; - match_result_t *match_result; DispatchEx *regexp; - DispatchEx *array; - VARIANT var, *arg_var; - DWORD length, match_cnt, i; + VARIANT *arg_var; + DWORD length; BSTR val_str = NULL; HRESULT hres = S_OK; @@ -645,7 +643,7 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP case VT_DISPATCH: regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg_var)); if(regexp) { - if(regexp->builtin_info->class == JSCLASS_REGEXP) + if(is_class(regexp, JSCLASS_REGEXP)) break; jsdisp_release(regexp); } @@ -664,54 +662,17 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP } hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str); - if(SUCCEEDED(hres)) - hres = regexp_match(ctx, regexp, str, length, FALSE, &match_result, &match_cnt); - jsdisp_release(regexp); - if(FAILED(hres)) { - SysFreeString(val_str); - return hres; - } - - if(!match_cnt) { - TRACE("no match\n"); - - if(retv) - V_VT(retv) = VT_NULL; - - SysFreeString(val_str); - return S_OK; - } - - hres = create_array(ctx, match_cnt, &array); - if(FAILED(hres)) { - SysFreeString(val_str); - return hres; - } - - V_VT(&var) = VT_BSTR; - - for(i=0; i < match_cnt; i++) { - V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len); - if(!V_BSTR(&var)) { + if(SUCCEEDED(hres)) { + if(!val_str) + val_str = SysAllocStringLen(str, length); + if(val_str) + hres = regexp_string_match(ctx, regexp, val_str, retv, ei); + else hres = E_OUTOFMEMORY; - break; - } - - hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/); - SysFreeString(V_BSTR(&var)); - if(FAILED(hres)) - break; } - heap_free(match_result); + jsdisp_release(regexp); SysFreeString(val_str); - - if(SUCCEEDED(hres) && retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); - }else { - jsdisp_release(array); - } return hres; } From 4a1f6e12e3faa48d51faf652b2b1f9fcf7a0a94b Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 17:16:57 +0000 Subject: [PATCH 160/261] - Sync localspl, mciavi32, mcicda, mciqtz32, mciseq, mciwave, mscoree, msctf, msgsm32.acm, mshtml to Wine-1.1.43. svn path=/trunk/; revision=46957 --- reactos/dll/win32/localspl/provider.c | 12 +- reactos/dll/win32/mciavi32/mciavi.c | 17 +- reactos/dll/win32/mcicda/mcicda.c | 5 +- reactos/dll/win32/mciqtz32/mciqtz.c | 9 +- reactos/dll/win32/mciqtz32/mciqtz_private.h | 1 + reactos/dll/win32/mciseq/mcimidi.c | 30 ++- reactos/dll/win32/mciwave/mciwave.c | 104 +++++--- reactos/dll/win32/mscoree/mscoree.rbuild | 1 + reactos/dll/win32/mscoree/mscoree_main.c | 236 +++++++++++++----- reactos/dll/win32/mscoree/mscoree_private.h | 13 + reactos/dll/win32/msctf/displayattributemgr.c | 139 +++++++++++ reactos/dll/win32/msctf/inputprocessor.c | 4 +- reactos/dll/win32/msctf/msctf.c | 1 + reactos/dll/win32/msctf/msctf.rbuild | 1 + reactos/dll/win32/msctf/msctf_internal.h | 1 + reactos/dll/win32/msctf/regsvr.c | 7 + reactos/dll/win32/msgsm32.acm/msgsm32.c | 4 +- reactos/dll/win32/mshtml/dispex.c | 224 +++++++++++------ reactos/dll/win32/mshtml/editor.c | 1 - reactos/dll/win32/mshtml/htmlelem.c | 6 +- reactos/dll/win32/mshtml/htmlwindow.c | 20 ++ reactos/dll/win32/mshtml/install.c | 20 +- reactos/dll/win32/mshtml/mshtml_private.h | 12 +- reactos/dll/win32/mshtml/navigate.c | 70 +++++- reactos/dll/win32/mshtml/nsembed.c | 64 +---- reactos/dll/win32/mshtml/nsevents.c | 8 +- reactos/dll/win32/mshtml/nsio.c | 61 ++++- reactos/dll/win32/mshtml/olecmd.c | 3 - reactos/dll/win32/mshtml/view.c | 9 +- 29 files changed, 777 insertions(+), 306 deletions(-) create mode 100644 reactos/dll/win32/msctf/displayattributemgr.c diff --git a/reactos/dll/win32/localspl/provider.c b/reactos/dll/win32/localspl/provider.c index b17e074b845..322418804c3 100644 --- a/reactos/dll/win32/localspl/provider.c +++ b/reactos/dll/win32/localspl/provider.c @@ -1375,7 +1375,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo } /* Verified with the Adobe PS Driver, that w2k does not use di.Version */ - RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (LPBYTE) &env->driverversion, + RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (const BYTE*) &env->driverversion, sizeof(DWORD)); RegSetValueExW(hdrv, driverW, 0, REG_SZ, (LPBYTE) di.pDriverPath, @@ -1395,7 +1395,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE) di.pHelpFile, (lstrlenW(di.pHelpFile)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); apd_copyfile(di.pHelpFile, &apd); @@ -1404,7 +1404,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE) di.pDependentFiles, multi_sz_lenW(di.pDependentFiles)); else - RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW)); while ((ptr != NULL) && (ptr[0])) { if (apd_copyfile(ptr, &apd)) { ptr += lstrlenW(ptr) + 1; @@ -1420,20 +1420,20 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE) di.pMonitorName, (lstrlenW(di.pMonitorName)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); if (di.pDefaultDataType) RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (LPBYTE) di.pDefaultDataType, (lstrlenW(di.pDefaultDataType)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); /* settings for level 4 */ if (di.pszzPreviousNames) RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (LPBYTE) di.pszzPreviousNames, multi_sz_lenW(di.pszzPreviousNames)); else - RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW)); if (level > 5) TRACE("level %u for Driver %s is incomplete\n", level, debugstr_w(di.pName)); diff --git a/reactos/dll/win32/mciavi32/mciavi.c b/reactos/dll/win32/mciavi32/mciavi.c index d77525ca4ff..1c15dc55dbc 100644 --- a/reactos/dll/win32/mciavi32/mciavi.c +++ b/reactos/dll/win32/mciavi32/mciavi.c @@ -89,6 +89,7 @@ static DWORD MCIAVI_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp) wma->hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL); wma->wDevID = modp->wDeviceID; wma->wCommandTable = mciLoadCommandResource(MCIAVI_hInstance, mciAviWStr, 0); + wma->dwStatus = MCI_MODE_NOT_READY; modp->wCustomCommandTable = wma->wCommandTable; modp->wType = MCI_DEVTYPE_DIGITAL_VIDEO; mciSetDriverData(wma->wDevID, (DWORD_PTR)wma); @@ -301,11 +302,11 @@ DWORD MCIAVI_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; + MCIAVI_mciStop(wDevID, MCI_WAIT, NULL); + EnterCriticalSection(&wma->cs); if (wma->nUseCount == 1) { - if (wma->dwStatus != MCI_MODE_STOP) - dwRet = MCIAVI_mciStop(wDevID, MCI_WAIT, NULL); MCIAVI_CleanUp(wma); if ((dwFlags & MCI_NOTIFY) && lpParms) { @@ -836,14 +837,14 @@ static DWORD MCIAVI_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_P { WINE_MCIAVI *wma; - FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms); - if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + FIXME("(%04x, %08x, %p) Item %04x: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETAUDIO_ITEM ? lpParms->dwItem : 0); + wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; - return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */ + return 0; } /****************************************************************************** @@ -870,14 +871,14 @@ static DWORD MCIAVI_mciSetVideo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_P { WINE_MCIAVI *wma; - FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms); - if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + FIXME("(%04x, %08x, %p) Item %04x: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETVIDEO_ITEM ? lpParms->dwItem : 0); + wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; - return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */ + return 0; } /****************************************************************************** diff --git a/reactos/dll/win32/mcicda/mcicda.c b/reactos/dll/win32/mcicda/mcicda.c index cf9132cdcff..6ea996a21b9 100644 --- a/reactos/dll/win32/mcicda/mcicda.c +++ b/reactos/dll/win32/mcicda/mcicda.c @@ -420,7 +420,8 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar if (dwFlags & MCI_OPEN_ELEMENT) { if (dwFlags & MCI_OPEN_ELEMENT_ID) { WARN("MCI_OPEN_ELEMENT_ID %p! Abort\n", lpOpenParms->lpstrElementName); - return MCIERR_NO_ELEMENT_ALLOWED; + ret = MCIERR_NO_ELEMENT_ALLOWED; + goto the_error; } TRACE("MCI_OPEN_ELEMENT element name: %s\n", debugstr_w(lpOpenParms->lpstrElementName)); if (!isalpha(lpOpenParms->lpstrElementName[0]) || lpOpenParms->lpstrElementName[1] != ':' || @@ -483,6 +484,8 @@ static DWORD MCICDA_Close(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParm if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; + MCICDA_Stop(wDevID, MCI_WAIT, NULL); + if (--wmcda->nUseCount == 0) { CloseHandle(wmcda->handle); } diff --git a/reactos/dll/win32/mciqtz32/mciqtz.c b/reactos/dll/win32/mciqtz32/mciqtz.c index b98e163ebbc..c826de17633 100644 --- a/reactos/dll/win32/mciqtz32/mciqtz.c +++ b/reactos/dll/win32/mciqtz32/mciqtz.c @@ -153,7 +153,8 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL); - CoInitializeEx(NULL, COINIT_MULTITHREADED); + hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + wma->uninit = SUCCEEDED(hr); hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (LPVOID*)&wma->pgraph); if (FAILED(hr)) { @@ -197,7 +198,8 @@ err: IMediaControl_Release(wma->pmctrl); wma->pmctrl = NULL; - CoUninitialize(); + if (wma->uninit) + CoUninitialize(); return MCIERR_INTERNAL; } @@ -220,7 +222,8 @@ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP if (wma->opened) { IGraphBuilder_Release(wma->pgraph); IMediaControl_Release(wma->pmctrl); - CoUninitialize(); + if (wma->uninit) + CoUninitialize(); wma->opened = FALSE; } diff --git a/reactos/dll/win32/mciqtz32/mciqtz_private.h b/reactos/dll/win32/mciqtz32/mciqtz_private.h index dcfcad0eb4a..caf80de4dc9 100644 --- a/reactos/dll/win32/mciqtz32/mciqtz_private.h +++ b/reactos/dll/win32/mciqtz32/mciqtz_private.h @@ -28,6 +28,7 @@ typedef struct { MCIDEVICEID wDevID; BOOL opened; + BOOL uninit; IGraphBuilder* pgraph; IMediaControl* pmctrl; BOOL started; diff --git a/reactos/dll/win32/mciseq/mcimidi.c b/reactos/dll/win32/mciseq/mcimidi.c index 301428d517d..87753c33dde 100644 --- a/reactos/dll/win32/mciseq/mcimidi.c +++ b/reactos/dll/win32/mciseq/mcimidi.c @@ -62,6 +62,7 @@ typedef struct tagWINE_MCIMIDI { UINT wDevID; /* the MCI one */ HMIDI hMidi; int nUseCount; /* Incremented for each shared open */ + WORD wPort; /* the WINMM device unit */ WORD wNotifyDeviceID; /* MCI device ID with a pending notification */ HANDLE hCallback; /* Callback handle for pending notification */ HMMIO hFile; /* mmio file handle open as Element */ @@ -726,6 +727,7 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) wmm->hFile = 0; wmm->hMidi = 0; + wmm->wPort = MIDI_MAPPER; wmm->lpstrElementName = NULL; dwDeviceID = lpParms->wDeviceID; @@ -962,8 +964,8 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) MIDI_mciReadNextEvent(wmm, mmt); /* FIXME == 0 */ } - dwRet = midiOutOpen((LPHMIDIOUT)&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL); - /* dwRet = midiInOpen(&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL);*/ + dwRet = midiOutOpen((LPHMIDIOUT)&wmm->hMidi, wmm->wPort, 0L, 0L, CALLBACK_NULL); + /* dwRet = midiInOpen(&wmm->hMidi, wmm->wPort, 0L, 0L, CALLBACK_NULL);*/ if (dwRet != MMSYSERR_NOERROR) { return dwRet; } @@ -1290,7 +1292,7 @@ static DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa /************************************************************************** * MIDI_mciSet [internal] */ -static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) +static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms) { WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); @@ -1359,8 +1361,15 @@ static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) TRACE("MCI_SEQ_SET_SLAVE !\n"); if (dwFlags & MCI_SEQ_SET_OFFSET) TRACE("MCI_SEQ_SET_OFFSET !\n"); - if (dwFlags & MCI_SEQ_SET_PORT) - TRACE("MCI_SEQ_SET_PORT !\n"); + if (dwFlags & MCI_SEQ_SET_PORT) { + TRACE("MCI_SEQ_SET_PORT = %d\n", lpParms->dwPort); + if ((UINT16)lpParms->dwPort != (UINT16)MIDI_MAPPER && + (UINT16)lpParms->dwPort >= midiOutGetNumDevs()) + /* FIXME: input/output port distinction? */ + return MCIERR_SEQ_PORT_NONEXISTENT; + /* FIXME: Native manages to swap the device while playing! */ + wmm->wPort = lpParms->dwPort; + } if (dwFlags & MCI_SEQ_SET_TEMPO) TRACE("MCI_SEQ_SET_TEMPO !\n"); return 0; @@ -1459,8 +1468,13 @@ static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar lpParms->dwReturn = 0; break; case MCI_SEQ_STATUS_PORT: - TRACE("MCI_SEQ_STATUS_PORT (%u)!\n", wmm->wDevID); - lpParms->dwReturn = MIDI_MAPPER; + if (wmm->wPort != (UINT16)MIDI_MAPPER) + lpParms->dwReturn = wmm->wPort; + else { + lpParms->dwReturn = MAKEMCIRESOURCE(MIDI_MAPPER, MCI_SEQ_MAPPER_S); + ret = MCI_RESOURCE_RETURNED; + } + TRACE("MCI_SEQ_STATUS_PORT (%u) => %d\n", wmm->wDevID, wmm->wPort); break; case MCI_SEQ_STATUS_TEMPO: TRACE("MCI_SEQ_STATUS_TEMPO !\n"); @@ -1664,7 +1678,7 @@ LRESULT CALLBACK MCIMIDI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case MCI_PLAY: return MIDI_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2); case MCI_RECORD: return MIDI_mciRecord (dwDevID, dwParam1, (LPMCI_RECORD_PARMS) dwParam2); case MCI_STOP: return MIDI_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); - case MCI_SET: return MIDI_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2); + case MCI_SET: return MIDI_mciSet (dwDevID, dwParam1, (LPMCI_SEQ_SET_PARMS) dwParam2); case MCI_PAUSE: return MIDI_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_RESUME: return MIDI_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_STATUS: return MIDI_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2); diff --git a/reactos/dll/win32/mciwave/mciwave.c b/reactos/dll/win32/mciwave/mciwave.c index 24e75ee9dac..87dc260207c 100644 --- a/reactos/dll/win32/mciwave/mciwave.c +++ b/reactos/dll/win32/mciwave/mciwave.c @@ -47,6 +47,8 @@ typedef struct { WAVEFORMATEX wfxRef; LPWAVEFORMATEX lpWaveFormat; /* Points to wfxRef until set by OPEN or RECORD */ BOOL fInput; /* FALSE = Output, TRUE = Input */ + WORD wInput; /* wave input device */ + WORD wOutput; /* wave output device */ volatile WORD dwStatus; /* one from MCI_MODE_xxxx */ DWORD dwMciTimeFormat;/* One of the supported MCI_FORMAT_xxxx */ DWORD dwPosition; /* position in bytes in chunk */ @@ -529,6 +531,7 @@ static LRESULT WAVE_mciOpen(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_P wmw->nUseCount++; + wmw->wInput = wmw->wOutput = WAVE_MAPPER; wmw->fInput = FALSE; wmw->hWave = 0; wmw->dwStatus = MCI_MODE_NOT_READY; @@ -831,8 +834,7 @@ static DWORD WAVE_mciPlay(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt, */ mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */ - /* FIXME: how to choose between several output channels ? here mapper is forced */ - dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat, + dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, wmw->wOutput, wmw->lpWaveFormat, (DWORD_PTR)WAVE_mciPlayCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION); if (dwRet != 0) { @@ -1064,11 +1066,7 @@ static DWORD WAVE_mciRecord(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt */ mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */ - /* By default the device will be opened for output, the MCI_CUE function is there to - * change from output to input and back - */ - /* FIXME: how to choose between several output channels ? here mapper is forced */ - dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat, + dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, wmw->wInput, wmw->lpWaveFormat, (DWORD_PTR)WAVE_mciRecordCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION); if (dwRet != MMSYSERR_NOERROR) { @@ -1279,7 +1277,7 @@ static DWORD WAVE_mciSeek(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lp /************************************************************************** * WAVE_mciSet [internal] */ -static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) +static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_SET_PARMS lpParms) { WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID); @@ -1337,44 +1335,64 @@ static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpPa default: WARN("Unknown audio channel %u\n", lpParms->dwAudio); break; } } - if (dwFlags & MCI_WAVE_INPUT) - TRACE("MCI_WAVE_INPUT !\n"); - if (dwFlags & MCI_WAVE_OUTPUT) - TRACE("MCI_WAVE_OUTPUT !\n"); - if (dwFlags & MCI_WAVE_SET_ANYINPUT) - TRACE("MCI_WAVE_SET_ANYINPUT !\n"); - if (dwFlags & MCI_WAVE_SET_ANYOUTPUT) - TRACE("MCI_WAVE_SET_ANYOUTPUT !\n"); + if (dwFlags & MCI_WAVE_INPUT) { + TRACE("MCI_WAVE_INPUT = %d\n", lpParms->wInput); + if (lpParms->wInput >= waveInGetNumDevs()) + return MCIERR_OUTOFRANGE; + if (wmw->wInput != (WORD)lpParms->wInput) + WAVE_mciStop(wDevID, MCI_WAIT, NULL); + wmw->wInput = lpParms->wInput; + } + if (dwFlags & MCI_WAVE_OUTPUT) { + TRACE("MCI_WAVE_OUTPUT = %d\n", lpParms->wOutput); + if (lpParms->wOutput >= waveOutGetNumDevs()) + return MCIERR_OUTOFRANGE; + if (wmw->wOutput != (WORD)lpParms->wOutput) + WAVE_mciStop(wDevID, MCI_WAIT, NULL); + wmw->wOutput = lpParms->wOutput; + } + if (dwFlags & MCI_WAVE_SET_ANYINPUT) { + TRACE("MCI_WAVE_SET_ANYINPUT\n"); + if (wmw->wInput != (WORD)lpParms->wInput) + WAVE_mciStop(wDevID, MCI_WAIT, NULL); + wmw->wInput = WAVE_MAPPER; + } + if (dwFlags & MCI_WAVE_SET_ANYOUTPUT) { + TRACE("MCI_WAVE_SET_ANYOUTPUT\n"); + if (wmw->wOutput != (WORD)lpParms->wOutput) + WAVE_mciStop(wDevID, MCI_WAIT, NULL); + wmw->wOutput = WAVE_MAPPER; + } /* Set wave format parameters is refused after Open or Record.*/ if (dwFlags & MCI_WAVE_SET_FORMATTAG) { - TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", ((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag); + TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", lpParms->wFormatTag); if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - if (((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag != WAVE_FORMAT_PCM) + if (lpParms->wFormatTag != WAVE_FORMAT_PCM) return MCIERR_OUTOFRANGE; } if (dwFlags & MCI_WAVE_SET_AVGBYTESPERSEC) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nAvgBytesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nAvgBytesPerSec; + wmw->wfxRef.nAvgBytesPerSec = lpParms->nAvgBytesPerSec; TRACE("MCI_WAVE_SET_AVGBYTESPERSEC = %d\n", wmw->wfxRef.nAvgBytesPerSec); } if (dwFlags & MCI_WAVE_SET_BITSPERSAMPLE) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.wBitsPerSample = ((LPMCI_WAVE_SET_PARMS)lpParms)->wBitsPerSample; + wmw->wfxRef.wBitsPerSample = lpParms->wBitsPerSample; TRACE("MCI_WAVE_SET_BITSPERSAMPLE = %d\n", wmw->wfxRef.wBitsPerSample); } if (dwFlags & MCI_WAVE_SET_BLOCKALIGN) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nBlockAlign = ((LPMCI_WAVE_SET_PARMS)lpParms)->nBlockAlign; + wmw->wfxRef.nBlockAlign = lpParms->nBlockAlign; TRACE("MCI_WAVE_SET_BLOCKALIGN = %d\n", wmw->wfxRef.nBlockAlign); } if (dwFlags & MCI_WAVE_SET_CHANNELS) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nChannels = ((LPMCI_WAVE_SET_PARMS)lpParms)->nChannels; + wmw->wfxRef.nChannels = lpParms->nChannels; TRACE("MCI_WAVE_SET_CHANNELS = %d\n", wmw->wfxRef.nChannels); } if (dwFlags & MCI_WAVE_SET_SAMPLESPERSEC) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nSamplesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nSamplesPerSec; + wmw->wfxRef.nSamplesPerSec = lpParms->nSamplesPerSec; TRACE("MCI_WAVE_SET_SAMPLESPERSEC = %d\n", wmw->wfxRef.nSamplesPerSec); } if (dwFlags & MCI_NOTIFY) @@ -1500,24 +1518,34 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM ret = MCI_RESOURCE_RETURNED; break; case MCI_WAVE_INPUT: - TRACE("MCI_WAVE_INPUT !\n"); - lpParms->dwReturn = 0; - ret = MCIERR_WAVE_INPUTUNSPECIFIED; + if (wmw->wInput != (WORD)WAVE_MAPPER) + lpParms->dwReturn = wmw->wInput; + else { + lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_MAPPER, WAVE_MAPPER_S); + ret = MCI_RESOURCE_RETURNED; + } + TRACE("MCI_WAVE_INPUT => %d\n", (signed)wmw->wInput); break; case MCI_WAVE_OUTPUT: - TRACE("MCI_WAVE_OUTPUT !\n"); - { - UINT id; - if (waveOutGetID(wmw->hWave, &id) == MMSYSERR_NOERROR) { - lpParms->dwReturn = id; - } else { - lpParms->dwReturn = 0; - ret = MCIERR_WAVE_OUTPUTUNSPECIFIED; - } + if (wmw->wOutput != (WORD)WAVE_MAPPER) + lpParms->dwReturn = wmw->wOutput; + else { + lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_MAPPER, WAVE_MAPPER_S); + ret = MCI_RESOURCE_RETURNED; } + TRACE("MCI_WAVE_OUTPUT => %d\n", (signed)wmw->wOutput); break; /* It is always ok to query wave format parameters, * except on auto-open yield MCIERR_UNSUPPORTED_FUNCTION. */ + case MCI_WAVE_STATUS_FORMATTAG: + if (wmw->lpWaveFormat->wFormatTag != WAVE_FORMAT_PCM) + lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag; + else { + lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_FORMAT_PCM, WAVE_FORMAT_PCM_S); + ret = MCI_RESOURCE_RETURNED; + } + TRACE("MCI_WAVE_FORMATTAG => %lu\n", lpParms->dwReturn); + break; case MCI_WAVE_STATUS_AVGBYTESPERSEC: lpParms->dwReturn = wmw->lpWaveFormat->nAvgBytesPerSec; TRACE("MCI_WAVE_STATUS_AVGBYTESPERSEC => %lu\n", lpParms->dwReturn); @@ -1534,10 +1562,6 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM lpParms->dwReturn = wmw->lpWaveFormat->nChannels; TRACE("MCI_WAVE_STATUS_CHANNELS => %lu\n", lpParms->dwReturn); break; - case MCI_WAVE_STATUS_FORMATTAG: - lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag; - TRACE("MCI_WAVE_FORMATTAG => %lu\n", lpParms->dwReturn); - break; case MCI_WAVE_STATUS_SAMPLESPERSEC: lpParms->dwReturn = wmw->lpWaveFormat->nSamplesPerSec; TRACE("MCI_WAVE_STATUS_SAMPLESPERSEC => %lu\n", lpParms->dwReturn); @@ -1705,7 +1729,7 @@ LRESULT CALLBACK MCIWAVE_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case MCI_PLAY: return WAVE_mciPlay (dwDevID, dwParam1, dwParam2, NULL); case MCI_RECORD: return WAVE_mciRecord (dwDevID, dwParam1, dwParam2, NULL); case MCI_STOP: return WAVE_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); - case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2); + case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_WAVE_SET_PARMS) dwParam2); case MCI_PAUSE: return WAVE_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_RESUME: return WAVE_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_STATUS: return WAVE_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2); diff --git a/reactos/dll/win32/mscoree/mscoree.rbuild b/reactos/dll/win32/mscoree/mscoree.rbuild index 2fa0743f07a..a014334a962 100644 --- a/reactos/dll/win32/mscoree/mscoree.rbuild +++ b/reactos/dll/win32/mscoree/mscoree.rbuild @@ -5,6 +5,7 @@ wine advapi32 + shell32 uuid corruntimehost.c mscoree_main.c diff --git a/reactos/dll/win32/mscoree/mscoree_main.c b/reactos/dll/win32/mscoree/mscoree_main.c index 5b20c854c2e..0e6f25204cc 100644 --- a/reactos/dll/win32/mscoree/mscoree_main.c +++ b/reactos/dll/win32/mscoree/mscoree_main.c @@ -21,11 +21,14 @@ #include +#include "wine/unicode.h" #include "windef.h" #include "winbase.h" #include "winuser.h" +#include "winnls.h" #include "winreg.h" #include "ole2.h" +#include "shellapi.h" #include "initguid.h" #include "cor.h" @@ -36,26 +39,25 @@ WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); -static LPWSTR get_mono_exe(void) +static BOOL get_mono_path(LPWSTR path) { - static const WCHAR mono_exe[] = {'b','i','n','\\','m','o','n','o','.','e','x','e',' ',0}; static const WCHAR mono_key[] = {'S','o','f','t','w','a','r','e','\\','N','o','v','e','l','l','\\','M','o','n','o',0}; static const WCHAR defaul_clr[] = {'D','e','f','a','u','l','t','C','L','R',0}; static const WCHAR install_root[] = {'S','d','k','I','n','s','t','a','l','l','R','o','o','t',0}; static const WCHAR slash[] = {'\\',0}; - WCHAR version[64], version_key[MAX_PATH], root[MAX_PATH], *ret; - DWORD len, size; + WCHAR version[64], version_key[MAX_PATH]; + DWORD len; HKEY key; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, mono_key, 0, KEY_READ, &key)) - return NULL; + return FALSE; len = sizeof(version); if (RegQueryValueExW(key, defaul_clr, 0, NULL, (LPBYTE)version, &len)) { RegCloseKey(key); - return NULL; + return FALSE; } RegCloseKey(key); @@ -64,24 +66,129 @@ static LPWSTR get_mono_exe(void) lstrcatW(version_key, version); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, version_key, 0, KEY_READ, &key)) - return NULL; + return FALSE; - len = sizeof(root); - if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)root, &len)) + len = sizeof(WCHAR) * MAX_PATH; + if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)path, &len)) { RegCloseKey(key); - return NULL; + return FALSE; } RegCloseKey(key); - size = len + sizeof(slash) + sizeof(mono_exe); - if (!(ret = HeapAlloc(GetProcessHeap(), 0, size))) return NULL; + return TRUE; +} - lstrcpyW(ret, root); - lstrcatW(ret, slash); - lstrcatW(ret, mono_exe); +static CRITICAL_SECTION mono_lib_cs; +static CRITICAL_SECTION_DEBUG mono_lib_cs_debug = +{ + 0, 0, &mono_lib_cs, + { &mono_lib_cs_debug.ProcessLocksList, + &mono_lib_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": mono_lib_cs") } +}; +static CRITICAL_SECTION mono_lib_cs = { &mono_lib_cs_debug, -1, 0, 0, 0, 0 }; - return ret; +HMODULE mono_handle; + +void (*mono_config_parse)(const char *filename); +MonoAssembly* (*mono_domain_assembly_open) (MonoDomain *domain, const char *name); +void (*mono_jit_cleanup)(MonoDomain *domain); +int (*mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]); +MonoDomain* (*mono_jit_init)(const char *file); +int (*mono_jit_set_trace_options)(const char* options); +void (*mono_set_dirs)(const char *assembly_dir, const char *config_dir); + +static void set_environment(LPCWSTR bin_path) +{ + WCHAR path_env[MAX_PATH]; + int len; + + static const WCHAR pathW[] = {'P','A','T','H',0}; + + /* We have to modify PATH as Mono loads other DLLs from this directory. */ + GetEnvironmentVariableW(pathW, path_env, sizeof(path_env)/sizeof(WCHAR)); + len = strlenW(path_env); + path_env[len++] = ';'; + strcpyW(path_env+len, bin_path); + SetEnvironmentVariableW(pathW, path_env); +} + +static HMODULE load_mono(void) +{ + static const WCHAR mono_dll[] = {'\\','b','i','n','\\','m','o','n','o','.','d','l','l',0}; + static const WCHAR libmono_dll[] = {'\\','b','i','n','\\','l','i','b','m','o','n','o','.','d','l','l',0}; + static const WCHAR bin[] = {'\\','b','i','n',0}; + static const WCHAR lib[] = {'\\','l','i','b',0}; + static const WCHAR etc[] = {'\\','e','t','c',0}; + HMODULE result; + WCHAR mono_path[MAX_PATH], mono_dll_path[MAX_PATH+16], mono_bin_path[MAX_PATH+4]; + WCHAR mono_lib_path[MAX_PATH+4], mono_etc_path[MAX_PATH+4]; + char mono_lib_path_a[MAX_PATH], mono_etc_path_a[MAX_PATH]; + + EnterCriticalSection(&mono_lib_cs); + + if (!mono_handle) + { + if (!get_mono_path(mono_path)) goto end; + + strcpyW(mono_bin_path, mono_path); + strcatW(mono_bin_path, bin); + set_environment(mono_bin_path); + + strcpyW(mono_lib_path, mono_path); + strcatW(mono_lib_path, lib); + WideCharToMultiByte(CP_UTF8, 0, mono_lib_path, -1, mono_lib_path_a, MAX_PATH, NULL, NULL); + + strcpyW(mono_etc_path, mono_path); + strcatW(mono_etc_path, etc); + WideCharToMultiByte(CP_UTF8, 0, mono_etc_path, -1, mono_etc_path_a, MAX_PATH, NULL, NULL); + + strcpyW(mono_dll_path, mono_path); + strcatW(mono_dll_path, mono_dll); + mono_handle = LoadLibraryW(mono_dll_path); + + if (!mono_handle) + { + strcpyW(mono_dll_path, mono_path); + strcatW(mono_dll_path, libmono_dll); + mono_handle = LoadLibraryW(mono_dll_path); + } + + if (!mono_handle) goto end; + +#define LOAD_MONO_FUNCTION(x) do { \ + x = (void*)GetProcAddress(mono_handle, #x); \ + if (!x) { \ + mono_handle = NULL; \ + goto end; \ + } \ +} while (0); + + LOAD_MONO_FUNCTION(mono_config_parse); + LOAD_MONO_FUNCTION(mono_domain_assembly_open); + LOAD_MONO_FUNCTION(mono_jit_cleanup); + LOAD_MONO_FUNCTION(mono_jit_exec); + LOAD_MONO_FUNCTION(mono_jit_init); + LOAD_MONO_FUNCTION(mono_jit_set_trace_options); + LOAD_MONO_FUNCTION(mono_set_dirs); + +#undef LOAD_MONO_FUNCTION + + mono_set_dirs(mono_lib_path_a, mono_etc_path_a); + + mono_config_parse(NULL); + } + +end: + result = mono_handle; + + LeaveCriticalSection(&mono_lib_cs); + + if (!result) + MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n"); + + return result; } HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, @@ -89,20 +196,16 @@ HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor DWORD startupFlags, REFCLSID rclsid, REFIID riid, LPVOID *ppv) { - WCHAR *mono_exe; - FIXME("(%s, %s, %s, %p, %d, %s, %s, %p): semi-stub!\n", debugstr_w(pwszVersion), debugstr_w(pwszBuildFlavor), debugstr_w(pwszHostConfigFile), pReserved, startupFlags, debugstr_guid(rclsid), debugstr_guid(riid), ppv); - if (!(mono_exe = get_mono_exe())) + if (!get_mono_path(NULL)) { MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n"); return E_FAIL; } - HeapFree(GetProcessHeap(), 0, mono_exe); - return S_OK; } @@ -138,68 +241,73 @@ BOOL WINAPI _CorDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; } +static void get_utf8_args(int *argc, char ***argv) +{ + WCHAR **argvw; + int size=0, i; + char *current_arg; + + argvw = CommandLineToArgvW(GetCommandLineW(), argc); + + for (i=0; i<*argc; i++) + { + size += sizeof(char*); + size += WideCharToMultiByte(CP_UTF8, 0, argvw[i], -1, NULL, 0, NULL, NULL); + } + size += sizeof(char*); + + *argv = HeapAlloc(GetProcessHeap(), 0, size); + current_arg = (char*)(*argv + *argc + 1); + + for (i=0; i<*argc; i++) + { + (*argv)[i] = current_arg; + current_arg += WideCharToMultiByte(CP_UTF8, 0, argvw[i], -1, current_arg, size, NULL, NULL); + } + + (*argv)[*argc] = NULL; + + HeapFree(GetProcessHeap(), 0, argvw); +} + __int32 WINAPI _CorExeMain(void) { - STARTUPINFOW si; - PROCESS_INFORMATION pi; - WCHAR *mono_exe, *cmd_line; - DWORD size, exit_code; - static const WCHAR WINE_MONO_TRACE[]={'W','I','N','E','_','M','O','N','O','_','T','R','A','C','E',0}; - static const WCHAR trace_switch_start[]={'"','-','-','t','r','a','c','e','=',0}; - static const WCHAR trace_switch_end[]={'"',' ',0}; + int exit_code; int trace_size; - WCHAR trace_setting[256]; + char trace_setting[256]; + int argc; + char **argv; + MonoDomain *domain; + MonoAssembly *assembly; + char filename[MAX_PATH]; - if (!(mono_exe = get_mono_exe())) + if (!load_mono()) { - MESSAGE("install the Windows version of Mono to run .NET executables\n"); return -1; } - trace_size = GetEnvironmentVariableW(WINE_MONO_TRACE, trace_setting, sizeof(trace_setting)/sizeof(WCHAR)); + get_utf8_args(&argc, &argv); - size = (lstrlenW(mono_exe) + lstrlenW(GetCommandLineW()) + 1) * sizeof(WCHAR); - - if (trace_size) - size += (trace_size + lstrlenW(trace_switch_start) + lstrlenW(trace_switch_end)) * sizeof(WCHAR); - - if (!(cmd_line = HeapAlloc(GetProcessHeap(), 0, size))) - { - HeapFree(GetProcessHeap(), 0, mono_exe); - return -1; - } - - lstrcpyW(cmd_line, mono_exe); - HeapFree(GetProcessHeap(), 0, mono_exe); + trace_size = GetEnvironmentVariableA("WINE_MONO_TRACE", trace_setting, sizeof(trace_setting)); if (trace_size) { - lstrcatW(cmd_line, trace_switch_start); - lstrcatW(cmd_line, trace_setting); - lstrcatW(cmd_line, trace_switch_end); + mono_jit_set_trace_options(trace_setting); } - lstrcatW(cmd_line, GetCommandLineW()); + GetModuleFileNameA(NULL, filename, MAX_PATH); - TRACE("new command line: %s\n", debugstr_w(cmd_line)); + domain = mono_jit_init(filename); - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - if (!CreateProcessW(NULL, cmd_line, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) - { - HeapFree(GetProcessHeap(), 0, cmd_line); - return -1; - } - HeapFree(GetProcessHeap(), 0, cmd_line); + assembly = mono_domain_assembly_open(domain, filename); - /* wait for the process to exit */ - WaitForSingleObject(pi.hProcess, INFINITE); - GetExitCodeProcess(pi.hProcess, &exit_code); + exit_code = mono_jit_exec(domain, assembly, argc, argv); - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); + mono_jit_cleanup(domain); - return (int)exit_code; + HeapFree(GetProcessHeap(), 0, argv); + + return exit_code; } __int32 WINAPI _CorExeMain2(PBYTE ptrMemory, DWORD cntMemory, LPWSTR imageName, LPWSTR loaderName, LPWSTR cmdLine) diff --git a/reactos/dll/win32/mscoree/mscoree_private.h b/reactos/dll/win32/mscoree/mscoree_private.h index f329455fff1..f14da1d15cd 100644 --- a/reactos/dll/win32/mscoree/mscoree_private.h +++ b/reactos/dll/win32/mscoree/mscoree_private.h @@ -22,5 +22,18 @@ extern IUnknown* create_corruntimehost(void); +/* Mono 2.6 embedding */ +typedef struct _MonoDomain MonoDomain; +typedef struct _MonoAssembly MonoAssembly; + +extern HMODULE mono_handle; + +extern void (*mono_config_parse)(const char *filename); +extern MonoAssembly* (*mono_domain_assembly_open) (MonoDomain *domain, const char *name); +extern void (*mono_jit_cleanup)(MonoDomain *domain); +extern int (*mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]); +extern MonoDomain* (*mono_jit_init)(const char *file); +extern int (*mono_jit_set_trace_options)(const char* options); +extern void (*mono_set_dirs)(const char *assembly_dir, const char *config_dir); #endif /* __MSCOREE_PRIVATE__ */ diff --git a/reactos/dll/win32/msctf/displayattributemgr.c b/reactos/dll/win32/msctf/displayattributemgr.c new file mode 100644 index 00000000000..75248cd4393 --- /dev/null +++ b/reactos/dll/win32/msctf/displayattributemgr.c @@ -0,0 +1,139 @@ +/* + * ITfDisplayAttributeMgr implementation + * + * Copyright 2010 CodeWeavers, Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS + +#include "wine/debug.h" +#include "winbase.h" +#include "winreg.h" +#include "shlwapi.h" + +#include "msctf.h" +#include "msctf_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagDisplayAttributeMgr { + const ITfDisplayAttributeMgrVtbl *DisplayAttributeMgrVtbl; + + LONG refCount; + +} DisplayAttributeMgr; + +static void DisplayAttributeMgr_Destructor(DisplayAttributeMgr *This) +{ + TRACE("destroying %p\n", This); + + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI DisplayAttributeMgr_QueryInterface(ITfDisplayAttributeMgr *iface, REFIID iid, LPVOID *ppvOut) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfDisplayAttributeMgr)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI DisplayAttributeMgr_AddRef(ITfDisplayAttributeMgr *iface) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI DisplayAttributeMgr_Release(ITfDisplayAttributeMgr *iface) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + DisplayAttributeMgr_Destructor(This); + return ret; +} + +/***************************************************** + * ITfDisplayAttributeMgr functions + *****************************************************/ + +static HRESULT WINAPI DisplayAttributeMgr_OnUpdateInfo(ITfDisplayAttributeMgr *iface) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI DisplayAttributeMgr_EnumDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, IEnumTfDisplayAttributeInfo **ppEnum) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI DisplayAttributeMgr_GetDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, REFGUID guid, ITfDisplayAttributeInfo **ppInfo, CLSID *pclsidOwner) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static const ITfDisplayAttributeMgrVtbl DisplayAttributeMgr_DisplayAttributeMgrVtbl = +{ + DisplayAttributeMgr_QueryInterface, + DisplayAttributeMgr_AddRef, + DisplayAttributeMgr_Release, + + DisplayAttributeMgr_OnUpdateInfo, + DisplayAttributeMgr_EnumDisplayAttributeInfo, + DisplayAttributeMgr_GetDisplayAttributeInfo +}; + +HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +{ + DisplayAttributeMgr *This; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(),0,sizeof(DisplayAttributeMgr)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->DisplayAttributeMgrVtbl= &DisplayAttributeMgr_DisplayAttributeMgrVtbl; + This->refCount = 1; + + TRACE("returning %p\n", This); + *ppOut = (IUnknown *)This; + return S_OK; +} diff --git a/reactos/dll/win32/msctf/inputprocessor.c b/reactos/dll/win32/msctf/inputprocessor.c index ba4a76d83b5..34e35c41cb1 100644 --- a/reactos/dll/win32/msctf/inputprocessor.c +++ b/reactos/dll/win32/msctf/inputprocessor.c @@ -279,8 +279,8 @@ static HRESULT WINAPI InputProcessorProfiles_AddLanguageProfile( if (!res) { DWORD zero = 0x0; - RegSetValueExW(fmtkey, desc, 0, REG_SZ, (LPBYTE)pchDesc, cchDesc * sizeof(WCHAR)); - RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (LPBYTE)pchIconFile, cchFile * sizeof(WCHAR)); + RegSetValueExW(fmtkey, desc, 0, REG_SZ, (const BYTE*)pchDesc, cchDesc * sizeof(WCHAR)); + RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (const BYTE*)pchIconFile, cchFile * sizeof(WCHAR)); RegSetValueExW(fmtkey, icni, 0, REG_DWORD, (LPBYTE)&uIconIndex, sizeof(DWORD)); if (disposition == REG_CREATED_NEW_KEY) RegSetValueExW(fmtkey, szwEnable, 0, REG_DWORD, (LPBYTE)&zero, sizeof(DWORD)); diff --git a/reactos/dll/win32/msctf/msctf.c b/reactos/dll/win32/msctf/msctf.c index 62d1ff2abd8..759fe7ec579 100644 --- a/reactos/dll/win32/msctf/msctf.c +++ b/reactos/dll/win32/msctf/msctf.c @@ -88,6 +88,7 @@ static const struct { {&CLSID_TF_InputProcessorProfiles, InputProcessorProfiles_Constructor}, {&CLSID_TF_CategoryMgr, CategoryMgr_Constructor}, {&CLSID_TF_LangBarMgr, LangBarMgr_Constructor}, + {&CLSID_TF_DisplayAttributeMgr, DisplayAttributeMgr_Constructor}, {NULL, NULL} }; diff --git a/reactos/dll/win32/msctf/msctf.rbuild b/reactos/dll/win32/msctf/msctf.rbuild index de8f52bf64d..cb072f676e7 100644 --- a/reactos/dll/win32/msctf/msctf.rbuild +++ b/reactos/dll/win32/msctf/msctf.rbuild @@ -11,6 +11,7 @@ categorymgr.c compartmentmgr.c context.c + displayattributemgr.c documentmgr.c inputprocessor.c langbarmgr.c diff --git a/reactos/dll/win32/msctf/msctf_internal.h b/reactos/dll/win32/msctf/msctf_internal.h index 57423e996fc..9aaaad0fb1b 100644 --- a/reactos/dll/win32/msctf/msctf_internal.h +++ b/reactos/dll/win32/msctf/msctf_internal.h @@ -41,6 +41,7 @@ extern HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, extern HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut); extern HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *This); extern HRESULT LangBarMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); +extern HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager); extern HRESULT Context_Uninitialize(ITfContext *cxt); diff --git a/reactos/dll/win32/msctf/regsvr.c b/reactos/dll/win32/msctf/regsvr.c index 2af1f241154..65ebb1da122 100644 --- a/reactos/dll/win32/msctf/regsvr.c +++ b/reactos/dll/win32/msctf/regsvr.c @@ -469,6 +469,13 @@ static struct regsvr_coclass const coclass_list[] = { "msctf.dll", "Apartment" }, + { + &CLSID_TF_DisplayAttributeMgr, + "TF_DisplayAttributeMgr", + NULL, + "msctf.dll", + "Apartment" + }, { NULL } /* list terminator */ }; diff --git a/reactos/dll/win32/msgsm32.acm/msgsm32.c b/reactos/dll/win32/msgsm32.acm/msgsm32.c index e760ac3a0ed..12dfef91d3b 100644 --- a/reactos/dll/win32/msgsm32.acm/msgsm32.c +++ b/reactos/dll/win32/msgsm32.acm/msgsm32.c @@ -179,10 +179,10 @@ static DWORD GSM_FormatValidate(const WAVEFORMATEX *wfx) WARN("GSM nBlockAlign %u\n", wfx->nBlockAlign); return 0; } - if (((GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock != 320) + if (((const GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock != 320) { WARN("GSM wSamplesPerBlock %u\n", - ((GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock); + ((const GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock); return 0; } if (wfx->nAvgBytesPerSec != wfx->nSamplesPerSec * 65 / 320) diff --git a/reactos/dll/win32/mshtml/dispex.c b/reactos/dll/win32/mshtml/dispex.c index 4b1bd882e5e..de0c94871f6 100644 --- a/reactos/dll/win32/mshtml/dispex.c +++ b/reactos/dll/win32/mshtml/dispex.c @@ -52,8 +52,11 @@ struct dispex_data_t { typedef struct { VARIANT var; LPWSTR name; + DWORD flags; } dynamic_prop_t; +#define DYNPROP_DELETED 0x01 + typedef struct { DispatchEx dispex; const IUnknownVtbl *lpIUnknownVtbl; @@ -245,12 +248,12 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUN static int dispid_cmp(const void *p1, const void *p2) { - return ((func_info_t*)p1)->id - ((func_info_t*)p2)->id; + return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id; } static int func_name_cmp(const void *p1, const void *p2) { - return strcmpiW((*(func_info_t**)p1)->name, (*(func_info_t**)p2)->name); + return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name); } static dispex_data_t *preprocess_dispex_data(DispatchEx *This) @@ -319,7 +322,7 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This) static int id_cmp(const void *p1, const void *p2) { - return *(DISPID*)p1 - *(DISPID*)p2; + return *(const DISPID*)p1 - *(const DISPID*)p2; } HRESULT get_dispids(tid_t tid, DWORD *ret_size, DISPID **ret) @@ -442,7 +445,7 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags { const BOOL alloc = flags & fdexNameEnsure; dispex_dynamic_data_t *data; - unsigned i; + dynamic_prop_t *prop; data = get_dynamic_data(This, alloc); if(!data) { @@ -453,9 +456,14 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags return DISP_E_UNKNOWNNAME; } - for(i=0; i < data->prop_cnt; i++) { - if(flags & fdexNameCaseInsensitive ? !strcmpiW(data->props[i].name, name) : !strcmpW(data->props[i].name, name)) { - *ret = data->props+i; + for(prop = data->props; prop < data->props+data->prop_cnt; prop++) { + if(flags & fdexNameCaseInsensitive ? !strcmpiW(prop->name, name) : !strcmpW(prop->name, name)) { + if(prop->flags & DYNPROP_DELETED) { + if(!alloc) + return DISP_E_UNKNOWNNAME; + prop->flags &= ~DYNPROP_DELETED; + } + *ret = prop; return S_OK; } } @@ -481,10 +489,16 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags data->buf_size <<= 1; } - data->props[data->prop_cnt].name = heap_strdupW(name); - VariantInit(&data->props[data->prop_cnt].var); - *ret = data->props + data->prop_cnt++; + prop = data->props + data->prop_cnt; + prop->name = heap_strdupW(name); + if(!prop->name) + return E_OUTOFMEMORY; + + VariantInit(&prop->var); + prop->flags = 0; + data->prop_cnt++; + *ret = prop; return S_OK; } @@ -729,6 +743,109 @@ static HRESULT get_builtin_func(dispex_data_t *data, DISPID id, func_info_t **re return DISP_E_UNKNOWNNAME; } +static HRESULT get_builtin_id(DispatchEx *This, BSTR name, DWORD grfdex, DISPID *ret) +{ + dispex_data_t *data; + int min, max, n, c; + + data = get_dispex_data(This); + if(!data) + return E_FAIL; + + min = 0; + max = data->func_cnt-1; + + while(min <= max) { + n = (min+max)/2; + + c = strcmpiW(data->name_table[n]->name, name); + if(!c) { + if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, name)) + break; + + *ret = data->name_table[n]->id; + return S_OK; + } + + if(c > 0) + max = n-1; + else + min = n+1; + } + + if(This->data->vtbl && This->data->vtbl->get_dispid) { + HRESULT hres; + + hres = This->data->vtbl->get_dispid(This->outer, name, grfdex, ret); + if(hres != DISP_E_UNKNOWNNAME) + return hres; + } + + return DISP_E_UNKNOWNNAME; +} + +static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +{ + dispex_data_t *data; + func_info_t *func; + HRESULT hres; + + data = get_dispex_data(This); + if(!data) + return E_FAIL; + + hres = get_builtin_func(data, id, &func); + if(id == DISPID_VALUE && hres == DISP_E_UNKNOWNNAME) + return dispex_value(This, lcid, flags, dp, res, ei, caller); + if(FAILED(hres)) + return hres; + + if(func->func_disp_idx == -1) + hres = typeinfo_invoke(This, func, flags, dp, res, ei); + else + hres = function_invoke(This, func, flags, dp, res, ei); + + return hres; +} + +HRESULT remove_prop(DispatchEx *This, BSTR name, VARIANT_BOOL *success) +{ + dynamic_prop_t *prop; + DISPID id; + HRESULT hres; + + hres = get_builtin_id(This, name, 0, &id); + if(hres == S_OK) { + DISPID named_id = DISPID_PROPERTYPUT; + VARIANT var; + DISPPARAMS dp = {&var,&named_id,1,1}; + EXCEPINFO ei; + + V_VT(&var) = VT_EMPTY; + memset(&ei, 0, sizeof(ei)); + hres = invoke_builtin_prop(This, id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); + if(FAILED(hres)) + return hres; + + *success = VARIANT_TRUE; + return S_OK; + } + + hres = get_dynamic_prop(This, name, 0, &prop); + if(FAILED(hres)) { + if(hres != DISP_E_UNKNOWNNAME) + return hres; + *success = VARIANT_FALSE; + return S_OK; + } + + VariantClear(&prop->var); + prop->flags |= DYNPROP_DELETED; + *success = VARIANT_TRUE; + return S_OK; +} + #define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface) static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) @@ -815,8 +932,6 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW { DispatchEx *This = DISPATCHEX_THIS(iface); dynamic_prop_t *dprop; - dispex_data_t *data; - int min, max, n, c; HRESULT hres; TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); @@ -824,38 +939,9 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK)) FIXME("Unsupported grfdex %x\n", grfdex); - data = get_dispex_data(This); - if(!data) - return E_FAIL; - - min = 0; - max = data->func_cnt-1; - - while(min <= max) { - n = (min+max)/2; - - c = strcmpiW(data->name_table[n]->name, bstrName); - if(!c) { - if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, bstrName)) - break; - - *pid = data->name_table[n]->id; - return S_OK; - } - - if(c > 0) - max = n-1; - else - min = n+1; - } - - if(This->data->vtbl && This->data->vtbl->get_dispid) { - HRESULT hres; - - hres = This->data->vtbl->get_dispid(This->outer, bstrName, grfdex, pid); - if(hres != DISP_E_UNKNOWNNAME) - return hres; - } + hres = get_builtin_id(This, bstrName, grfdex, pid); + if(hres != DISP_E_UNKNOWNNAME) + return hres; hres = get_dynamic_prop(This, bstrName, grfdex, &dprop); if(FAILED(hres)) @@ -869,8 +955,6 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { DispatchEx *This = DISPATCHEX_THIS(iface); - dispex_data_t *data; - func_info_t *func; HRESULT hres; TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); @@ -893,12 +977,12 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc if(is_dynamic_dispid(id)) { DWORD idx = id - DISPID_DYNPROP_0; - VARIANT *var; + dynamic_prop_t *prop; if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx) return DISP_E_UNKNOWNNAME; - var = &This->dynamic_data->props[idx].var; + prop = This->dynamic_data->props+idx; switch(wFlags) { case DISPATCH_METHOD|DISPATCH_PROPERTYGET: @@ -909,8 +993,8 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc DISPPARAMS dp = {NULL, &named_arg, 0, 1}; IDispatchEx *dispex; - if(V_VT(var) != VT_DISPATCH) { - FIXME("invoke vt %d\n", V_VT(var)); + if(V_VT(&prop->var) != VT_DISPATCH) { + FIXME("invoke %s\n", debugstr_variant(&prop->var)); return E_NOTIMPL; } @@ -929,14 +1013,14 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc V_VT(dp.rgvarg) = VT_DISPATCH; V_DISPATCH(dp.rgvarg) = (IDispatch*)DISPATCHEX(This); - hres = IDispatch_QueryInterface(V_DISPATCH(var), &IID_IDispatchEx, (void**)&dispex); + hres = IDispatch_QueryInterface(V_DISPATCH(&prop->var), &IID_IDispatchEx, (void**)&dispex); TRACE("%s call\n", debugstr_w(This->dynamic_data->props[idx].name)); if(SUCCEEDED(hres)) { hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, lcid, wFlags, &dp, pvarRes, pei, pspCaller); IDispatchEx_Release(dispex); }else { ULONG err = 0; - hres = IDispatch_Invoke(V_DISPATCH(var), DISPID_VALUE, &IID_NULL, lcid, wFlags, pdp, pvarRes, pei, &err); + hres = IDispatch_Invoke(V_DISPATCH(&prop->var), DISPID_VALUE, &IID_NULL, lcid, wFlags, pdp, pvarRes, pei, &err); } TRACE("%s ret %08x\n", debugstr_w(This->dynamic_data->props[idx].name), hres); @@ -944,7 +1028,9 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc return hres; } case DISPATCH_PROPERTYGET: - return VariantCopy(pvarRes, var); + if(prop->flags & DYNPROP_DELETED) + return DISP_E_UNKNOWNNAME; + return VariantCopy(pvarRes, &prop->var); case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: case DISPATCH_PROPERTYPUT: if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) @@ -954,30 +1040,20 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc } TRACE("put %s\n", debugstr_variant(pdp->rgvarg)); - VariantClear(var); - return VariantCopy(var, pdp->rgvarg); + VariantClear(&prop->var); + hres = VariantCopy(&prop->var, pdp->rgvarg); + if(FAILED(hres)) + return hres; + + prop->flags &= ~DYNPROP_DELETED; + return S_OK; default: FIXME("unhandled wFlags %x\n", wFlags); return E_NOTIMPL; } } - data = get_dispex_data(This); - if(!data) - return E_FAIL; - - hres = get_builtin_func(data, id, &func); - if(id == DISPID_VALUE && hres == DISP_E_UNKNOWNNAME) - return dispex_value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller); - if(FAILED(hres)) - return hres; - - if(func->func_disp_idx == -1) - hres = typeinfo_invoke(This, func, wFlags, pdp, pvarRes, pei); - else - hres = function_invoke(This, func, wFlags, pdp, pvarRes, pei); - - return hres; + return invoke_builtin_prop(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); } static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) @@ -1055,12 +1131,14 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx) return DISP_E_UNKNOWNNAME; - if(idx+1 == This->dynamic_data->prop_cnt) { + while(++idx < This->dynamic_data->prop_cnt && This->dynamic_data->props[idx].flags & DYNPROP_DELETED); + + if(idx == This->dynamic_data->prop_cnt) { *pid = DISPID_STARTENUM; return S_FALSE; } - *pid = id+1; + *pid = DISPID_DYNPROP_0+idx; return S_OK; } diff --git a/reactos/dll/win32/mshtml/editor.c b/reactos/dll/win32/mshtml/editor.c index 961bb916370..14e7ebb6f64 100644 --- a/reactos/dll/win32/mshtml/editor.c +++ b/reactos/dll/win32/mshtml/editor.c @@ -508,7 +508,6 @@ void handle_edit_event(HTMLDocument *This, nsIDOMEvent *event) void handle_edit_load(HTMLDocument *This) { - This->doc_obj->nscontainer->reset_focus = GetFocus(); get_editor_controller(This->doc_obj->nscontainer); } diff --git a/reactos/dll/win32/mshtml/htmlelem.c b/reactos/dll/win32/mshtml/htmlelem.c index e77c1dc4c42..b0cb791a1e8 100644 --- a/reactos/dll/win32/mshtml/htmlelem.c +++ b/reactos/dll/win32/mshtml/htmlelem.c @@ -198,8 +198,10 @@ static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strA LONG lFlags, VARIANT_BOOL *pfSuccess) { HTMLElement *This = HTMLELEM_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess); + + return remove_prop(&This->node.dispex, strAttributeName, pfSuccess); } static HRESULT WINAPI HTMLElement_put_className(IHTMLElement *iface, BSTR v) diff --git a/reactos/dll/win32/mshtml/htmlwindow.c b/reactos/dll/win32/mshtml/htmlwindow.c index 2aafaa3e4b4..5dbea55905c 100644 --- a/reactos/dll/win32/mshtml/htmlwindow.c +++ b/reactos/dll/win32/mshtml/htmlwindow.c @@ -57,6 +57,26 @@ static void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node) if(doc_node) htmldoc_addref(&doc_node->basedoc); } + + if(doc_node && window->doc_obj->usermode == EDITMODE) { + nsIDOMNSHTMLDocument *nshtmldoc; + nsAString mode_str; + nsresult nsres; + + static const PRUnichar onW[] = {'o','n',0}; + + nsres = nsIDOMHTMLDocument_QueryInterface(doc_node->nsdoc, &IID_nsIDOMNSHTMLDocument, (void**)&nshtmldoc); + if(NS_SUCCEEDED(nsres)) { + nsAString_Init(&mode_str, onW); + nsres = nsIDOMNSHTMLDocument_SetDesignMode(nshtmldoc, &mode_str); + nsAString_Finish(&mode_str); + nsIDOMNSHTMLDocument_Release(nshtmldoc); + if(NS_FAILED(nsres)) + ERR("SetDesignMode failed: %08x\n", nsres); + }else { + ERR("Could not get nsIDOMNSHTMLDocument interface: %08x\n", nsres); + } + } } nsIDOMWindow *get_nsdoc_window(nsIDOMDocument *nsdoc) diff --git a/reactos/dll/win32/mshtml/install.c b/reactos/dll/win32/mshtml/install.c index e47c28423d0..4122194a7cc 100644 --- a/reactos/dll/win32/mshtml/install.c +++ b/reactos/dll/win32/mshtml/install.c @@ -60,11 +60,6 @@ static const WCHAR mshtml_keyW[] = '\\','W','i','n','e', '\\','M','S','H','T','M','L',0}; -static const CHAR mshtml_keyA[] = - {'S','o','f','t','w','a','r','e', - '\\','W','i','n','e', - '\\','M','S','H','T','M','L',0}; - static HWND install_dialog = NULL; static LPWSTR tmp_file_name = NULL; static HANDLE tmp_file = INVALID_HANDLE_VALUE; @@ -230,18 +225,23 @@ static BOOL install_from_unix_file(const char *file_name) static BOOL install_from_registered_dir(void) { char *file_name; + HKEY hkey; DWORD res, type, size = MAX_PATH; BOOL ret; - file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME)); /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */ - res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size); + res = RegOpenKeyW(HKEY_CURRENT_USER, mshtml_keyW, &hkey); + if(res != ERROR_SUCCESS) + return FALSE; + + file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME)); + res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size); if(res == ERROR_MORE_DATA) { file_name = heap_realloc(file_name, size+sizeof(GECKO_FILE_NAME)); - res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size); + res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size); } - - if(res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ)) { + RegCloseKey(hkey); + if(res != ERROR_SUCCESS || type != REG_SZ) { heap_free(file_name); return FALSE; } diff --git a/reactos/dll/win32/mshtml/mshtml_private.h b/reactos/dll/win32/mshtml/mshtml_private.h index 228be35864e..3db8d791e48 100644 --- a/reactos/dll/win32/mshtml/mshtml_private.h +++ b/reactos/dll/win32/mshtml/mshtml_private.h @@ -38,6 +38,7 @@ #define NS_ERROR_FAILURE ((nsresult)0x80004005L) #define NS_NOINTERFACE ((nsresult)0x80004002L) #define NS_ERROR_NOT_IMPLEMENTED ((nsresult)0x80004001L) +#define NS_ERROR_NOT_AVAILABLE ((nsresult)0x80040111L) #define NS_ERROR_INVALID_ARG ((nsresult)0x80070057L) #define NS_ERROR_UNEXPECTED ((nsresult)0x8000ffffL) #define NS_ERROR_UNKNOWN_PROTOCOL ((nsresult)0x804b0012L) @@ -171,6 +172,7 @@ void release_dispex(DispatchEx*); BOOL dispex_query_interface(DispatchEx*,REFIID,void**); HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**); HRESULT get_dispids(tid_t,DWORD*,DISPID**); +HRESULT remove_prop(DispatchEx*,BSTR,VARIANT_BOOL*); typedef struct HTMLWindow HTMLWindow; typedef struct HTMLDocumentNode HTMLDocumentNode; @@ -435,8 +437,6 @@ struct NSContainer { nsIURIContentListener *content_listener; HWND hwnd; - - HWND reset_focus; /* hack */ }; typedef struct nsWineURI nsWineURI; @@ -461,9 +461,16 @@ typedef struct { char *content_type; char *charset; PRUint32 response_status; + struct list response_headers; UINT url_scheme; } nsChannel; +struct ResponseHeader { + struct list entry; + WCHAR *header; + WCHAR *data; +}; + typedef struct { HRESULT (*qi)(HTMLDOMNode*,REFIID,void**); void (*destructor)(HTMLDOMNode*); @@ -836,7 +843,6 @@ void update_title(HTMLDocumentObj*); /* editor */ void init_editor(HTMLDocument*); -void set_ns_editmode(NSContainer*); void handle_edit_event(HTMLDocument*,nsIDOMEvent*); HRESULT editor_exec_copy(HTMLDocument*,DWORD,VARIANT*,VARIANT*); HRESULT editor_exec_cut(HTMLDocument*,DWORD,VARIANT*,VARIANT*); diff --git a/reactos/dll/win32/mshtml/navigate.c b/reactos/dll/win32/mshtml/navigate.c index cc2aeb3f6c2..7a777957ce1 100644 --- a/reactos/dll/win32/mshtml/navigate.c +++ b/reactos/dll/win32/mshtml/navigate.c @@ -62,7 +62,7 @@ typedef struct { HRESULT (*stop_binding)(BSCallback*,HRESULT); HRESULT (*read_data)(BSCallback*,IStream*); HRESULT (*on_progress)(BSCallback*,ULONG,LPCWSTR); - HRESULT (*on_response)(BSCallback*,DWORD); + HRESULT (*on_response)(BSCallback*,DWORD,LPCWSTR); } BSCallbackVtbl; struct BSCallback { @@ -493,7 +493,7 @@ static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD dwR TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders), debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders); - return This->vtbl->on_response(This, dwResponseCode); + return This->vtbl->on_response(This, dwResponseCode, szResponseHeaders); } static HRESULT WINAPI HttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface, @@ -825,7 +825,8 @@ static HRESULT BufferBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCWSTR return S_OK; } -static HRESULT BufferBSC_on_response(BSCallback *bsc, DWORD response_code) +static HRESULT BufferBSC_on_response(BSCallback *bsc, DWORD response_code, + LPCWSTR response_headers) { return S_OK; } @@ -1099,11 +1100,72 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCW return S_OK; } -static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code) +static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code, + LPCWSTR response_headers) { nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); This->nschannel->response_status = response_code; + + if(response_headers) { + const WCHAR *hdr_start, *hdr_end; + + hdr_start = strchrW(response_headers, '\r'); + while(hdr_start) { + const WCHAR *colon; + struct ResponseHeader *new_header; + int len; + + hdr_start += 2; + hdr_end = strchrW(hdr_start, '\r'); + if(!hdr_end) { + WARN("Header doesn't end with CRLF: %s\n", wine_dbgstr_w(hdr_start)); + break; + } + if(hdr_end == hdr_start) + break; + + for(colon = hdr_start; *colon != ':' && colon != hdr_end; ++colon); + if(*colon != ':') { + WARN("Header missing colon: %s\n", wine_dbgstr_w(hdr_start)); + hdr_start = strchrW(hdr_start, '\r'); + continue; + } + + new_header = heap_alloc(sizeof(struct ResponseHeader)); + if(!new_header) + return E_OUTOFMEMORY; + + len = colon - hdr_start; + new_header->header = heap_alloc((len + 1) * sizeof(WCHAR)); + if(!new_header->header) { + heap_free(new_header); + return E_OUTOFMEMORY; + } + memcpy(new_header->header, hdr_start, len * sizeof(WCHAR)); + new_header->header[len] = 0; + + colon++; + while(*colon == ' ') + colon++; + + len = hdr_end - colon; + new_header->data = heap_alloc((len + 1) * sizeof(WCHAR)); + if(!new_header->data) { + heap_free(new_header->header); + heap_free(new_header); + return E_OUTOFMEMORY; + } + memcpy(new_header->data, colon, len * sizeof(WCHAR)); + new_header->data[len] = 0; + + list_add_head(&This->nschannel->response_headers, &new_header->entry); + TRACE("Adding header to list: (%s):(%s)\n", wine_dbgstr_w(new_header->header), wine_dbgstr_w(new_header->data)); + + hdr_start = strchrW(hdr_start, '\r'); + } + } + return S_OK; } diff --git a/reactos/dll/win32/mshtml/nsembed.c b/reactos/dll/win32/mshtml/nsembed.c index fa8aa41fedf..8a590079278 100644 --- a/reactos/dll/win32/mshtml/nsembed.c +++ b/reactos/dll/win32/mshtml/nsembed.c @@ -80,8 +80,6 @@ static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e',' static ATOM nscontainer_class; -#define WM_RESETFOCUS_HACK WM_USER+600 - static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { NSContainer *This; @@ -106,20 +104,13 @@ static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP WARN("SetSize failed: %08x\n", nsres); break; - case WM_RESETFOCUS_HACK: - /* - * FIXME - * Gecko grabs focus in edit mode and some apps don't like it. - * We should somehow prevent grabbing focus. - */ + case WM_PARENTNOTIFY: + TRACE("WM_PARENTNOTIFY %x\n", (unsigned)wParam); - TRACE("WM_RESETFOCUS_HACK\n"); - - if(This->reset_focus) { - SetFocus(This->reset_focus); - This->reset_focus = NULL; - if(This->doc) - This->doc->focus = FALSE; + switch(wParam) { + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + nsIWebBrowserFocus_Activate(This->focus); } } @@ -776,46 +767,6 @@ void get_editor_controller(NSContainer *This) } } -void set_ns_editmode(NSContainer *This) -{ - nsIEditingSession *editing_session = NULL; - nsIURIContentListener *listener = NULL; - nsIDOMWindow *dom_window = NULL; - nsresult nsres; - - nsres = get_nsinterface((nsISupports*)This->webbrowser, &IID_nsIEditingSession, - (void**)&editing_session); - if(NS_FAILED(nsres)) { - ERR("Could not get nsIEditingSession: %08x\n", nsres); - return; - } - - nsres = nsIWebBrowser_GetContentDOMWindow(This->webbrowser, &dom_window); - if(NS_FAILED(nsres)) { - ERR("Could not get content DOM window: %08x\n", nsres); - nsIEditingSession_Release(editing_session); - return; - } - - nsres = nsIEditingSession_MakeWindowEditable(editing_session, dom_window, - NULL, FALSE, TRUE, TRUE); - nsIEditingSession_Release(editing_session); - nsIDOMWindow_Release(dom_window); - if(NS_FAILED(nsres)) { - ERR("MakeWindowEditable failed: %08x\n", nsres); - return; - } - - /* MakeWindowEditable changes WebBrowser's parent URI content listener. - * It seams to be a bug in Gecko. To workaround it we set our content - * listener again and Gecko's one as its parent. - */ - nsIWebBrowser_GetParentURIContentListener(This->webbrowser, &listener); - nsIURIContentListener_SetParentContentListener(NSURICL(This), listener); - nsIURIContentListener_Release(listener); - nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This)); -} - void close_gecko(void) { TRACE("()\n"); @@ -1316,9 +1267,6 @@ static nsresult NSAPI nsEmbeddingSiteWindow_SetFocus(nsIEmbeddingSiteWindow *ifa TRACE("(%p)\n", This); - if(This->reset_focus) - PostMessageW(This->hwnd, WM_RESETFOCUS_HACK, 0, 0); - return nsIBaseWindow_SetFocus(This->window); } diff --git a/reactos/dll/win32/mshtml/nsevents.c b/reactos/dll/win32/mshtml/nsevents.c index c491424fdd4..3e0314966db 100644 --- a/reactos/dll/win32/mshtml/nsevents.c +++ b/reactos/dll/win32/mshtml/nsevents.c @@ -109,11 +109,11 @@ static nsrefcnt NSAPI nsDOMEventListener_Release(nsIDOMEventListener *iface) return release_listener(This); } -static BOOL is_doc_child_focus(HTMLDocumentObj *doc) +static BOOL is_doc_child_focus(NSContainer *nscontainer) { HWND hwnd; - for(hwnd = GetFocus(); hwnd && hwnd != doc->hwnd; hwnd = GetParent(hwnd)); + for(hwnd = GetFocus(); hwnd && hwnd != nscontainer->hwnd; hwnd = GetParent(hwnd)); return hwnd != NULL; } @@ -129,7 +129,7 @@ static nsresult NSAPI handle_blur(nsIDOMEventListener *iface, nsIDOMEvent *event return NS_ERROR_FAILURE; doc_obj = doc->basedoc.doc_obj; - if(!doc_obj->nscontainer->reset_focus && doc_obj->focus && !is_doc_child_focus(doc_obj)) { + if(doc_obj->focus && !is_doc_child_focus(doc_obj->nscontainer)) { doc_obj->focus = FALSE; notif_focus(doc_obj); } @@ -148,7 +148,7 @@ static nsresult NSAPI handle_focus(nsIDOMEventListener *iface, nsIDOMEvent *even return NS_ERROR_FAILURE; doc_obj = doc->basedoc.doc_obj; - if(!doc_obj->nscontainer->reset_focus && !doc_obj->focus) { + if(!doc_obj->focus) { doc_obj->focus = TRUE; notif_focus(doc_obj); } diff --git a/reactos/dll/win32/mshtml/nsio.c b/reactos/dll/win32/mshtml/nsio.c index 88a4e55254b..0c8e45704d7 100644 --- a/reactos/dll/win32/mshtml/nsio.c +++ b/reactos/dll/win32/mshtml/nsio.c @@ -307,7 +307,7 @@ static void set_uri_window(nsWineURI *This, HTMLWindow *window) static inline BOOL is_http_channel(nsChannel *This) { - return This->url_scheme == URL_SCHEME_HTTP || This->url_scheme == URL_SCHEME_HTTP; + return This->url_scheme == URL_SCHEME_HTTP || This->url_scheme == URL_SCHEME_HTTPS; } #define NSCHANNEL_THIS(iface) DEFINE_THIS(nsChannel, HttpChannel, iface) @@ -363,6 +363,8 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface) LONG ref = InterlockedDecrement(&This->ref); if(!ref) { + struct ResponseHeader *header, *next_hdr; + nsIURI_Release(NSURI(This->uri)); if(This->owner) nsISupports_Release(This->owner); @@ -376,6 +378,14 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface) nsIURI_Release(This->original_uri); heap_free(This->content_type); heap_free(This->charset); + + LIST_FOR_EACH_ENTRY_SAFE(header, next_hdr, &This->response_headers, struct ResponseHeader, entry) { + list_remove(&header->entry); + heap_free(header->header); + heap_free(header->data); + heap_free(header); + } + heap_free(This); } @@ -933,9 +943,9 @@ static nsresult NSAPI nsChannel_SetRequestMethod(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aRequestMethod); + TRACE("(%p)->(%p): Returning NS_OK\n", This, aRequestMethod); - return NS_ERROR_NOT_IMPLEMENTED; + return NS_OK; } static nsresult NSAPI nsChannel_GetReferrer(nsIHttpChannel *iface, nsIURI **aReferrer) @@ -1052,19 +1062,48 @@ static nsresult NSAPI nsChannel_GetRequestSucceeded(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aRequestSucceeded); + TRACE("(%p)->(%p)\n", This, aRequestSucceeded); - return NS_ERROR_NOT_IMPLEMENTED; + if(!This->response_status) + return NS_ERROR_NOT_AVAILABLE; + + *aRequestSucceeded = This->response_status/100 == 2; + + return NS_OK; } static nsresult NSAPI nsChannel_GetResponseHeader(nsIHttpChannel *iface, const nsACString *header, nsACString *_retval) { nsChannel *This = NSCHANNEL_THIS(iface); + const char *header_str; + WCHAR *header_wstr; + struct ResponseHeader *this_header; - FIXME("(%p)->(%p %p)\n", This, header, _retval); + nsACString_GetData(header, &header_str); + TRACE("(%p)->(%p(%s) %p)\n", This, header, header_str, _retval); - return NS_ERROR_NOT_IMPLEMENTED; + header_wstr = heap_strdupAtoW(header_str); + if(!header_wstr) + return NS_ERROR_UNEXPECTED; + + LIST_FOR_EACH_ENTRY(this_header, &This->response_headers, struct ResponseHeader, entry) { + if(!strcmpW(this_header->header, header_wstr)) { + char *data = heap_strdupWtoA(this_header->data); + if(!data) { + heap_free(header_wstr); + return NS_ERROR_UNEXPECTED; + } + nsACString_SetData(_retval, data); + heap_free(data); + heap_free(header_wstr); + return NS_OK; + } + } + + heap_free(header_wstr); + + return NS_ERROR_NOT_AVAILABLE; } static nsresult NSAPI nsChannel_SetResponseHeader(nsIHttpChannel *iface, @@ -2414,7 +2453,6 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * HTMLWindow *window = NULL; nsIURI *uri = NULL; LPCWSTR base_wine_url = NULL; - BOOL is_wine_uri = FALSE; nsresult nsres; nsACString_GetData(aSpec, &spec); @@ -2425,10 +2463,8 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * if(is_gecko_special_uri(spec)) return nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, _retval); - if(!strncmp(spec, "wine:", 5)) { + if(!strncmp(spec, "wine:", 5)) spec += 5; - is_wine_uri = TRUE; - } if(aBaseURI) { PARSEDURLA parsed_url = {sizeof(PARSEDURLA)}; @@ -2473,7 +2509,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * set_wine_url(wine_uri, url); else WARN("CoCombineUrl failed: %08x\n", hres); - }else if(is_wine_uri) { + }else { WCHAR url[INTERNET_MAX_URL_LENGTH]; MultiByteToWideChar(CP_ACP, 0, spec, -1, url, sizeof(url)/sizeof(WCHAR)); @@ -2516,6 +2552,7 @@ static nsresult NSAPI nsIOService_NewChannelFromURI(nsIIOService *iface, nsIURI ret->lpIHttpChannelInternalVtbl = &nsHttpChannelInternalVtbl; ret->ref = 1; ret->uri = wine_uri; + list_init(&ret->response_headers); nsIURI_AddRef(aURI); ret->original_uri = aURI; diff --git a/reactos/dll/win32/mshtml/olecmd.c b/reactos/dll/win32/mshtml/olecmd.c index b54f06420fb..4d5967a923f 100644 --- a/reactos/dll/win32/mshtml/olecmd.c +++ b/reactos/dll/win32/mshtml/olecmd.c @@ -616,9 +616,6 @@ static HRESULT exec_editmode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, IDocHostUIHandler_HideUI(This->doc_obj->hostui); } - if(This->doc_obj->nscontainer) - set_ns_editmode(This->doc_obj->nscontainer); - if(This->doc_obj->ui_active) { RECT rcBorderWidths; diff --git a/reactos/dll/win32/mshtml/view.c b/reactos/dll/win32/mshtml/view.c index 261e959b0ad..5c096ed9928 100644 --- a/reactos/dll/win32/mshtml/view.c +++ b/reactos/dll/win32/mshtml/view.c @@ -92,7 +92,6 @@ static void activate_gecko(NSContainer *This) nsIBaseWindow_SetVisibility(This->window, TRUE); nsIBaseWindow_SetEnabled(This->window, TRUE); - nsIWebBrowserFocus_Activate(This->focus); } void update_doc(HTMLDocument *This, DWORD flags) @@ -216,6 +215,10 @@ static LRESULT WINAPI serverwnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM break; case WM_TIMER: return on_timer(This); + case WM_SETFOCUS: + TRACE("(%p) WM_SETFOCUS\n", This); + nsIWebBrowserFocus_Activate(This->nscontainer->focus); + break; case WM_MOUSEACTIVATE: return MA_ACTIVATE; } @@ -664,6 +667,8 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f This->doc_obj->ui_active = TRUE; }else { + This->doc_obj->focus = FALSE; + nsIWebBrowserFocus_Deactivate(This->doc_obj->nscontainer->focus); if(This->doc_obj->ui_active) { This->doc_obj->ui_active = FALSE; if(This->doc_obj->ip_window) @@ -811,7 +816,7 @@ static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, TRACE("(%p)->(%d %d %p)\n", This, aspects, advf, pAdvSink); if(aspects != DVASPECT_CONTENT || advf != ADVF_PRIMEFIRST) - FIXME("unsuported arguments\n"); + FIXME("unsupported arguments\n"); if(This->doc_obj->view_sink) IAdviseSink_Release(This->doc_obj->view_sink); From fd7bc65588044b83db9c4537b961bc9663630367 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 17:24:00 +0000 Subject: [PATCH 161/261] - Sync msimtf, msvfw32, msvidc32, msxml3 to Wine-1.1.43. svn path=/trunk/; revision=46958 --- reactos/dll/win32/msimtf/activeimmapp.c | 2 +- reactos/dll/win32/msvfw32/mciwnd.c | 29 +- reactos/dll/win32/msvfw32/msvfw32_ros.diff | 14 - reactos/dll/win32/msvfw32/msvideo16.c | 916 --------------------- reactos/dll/win32/msvfw32/vfw16.h | 130 --- reactos/dll/win32/msvidc32/msvideo1.c | 59 +- reactos/dll/win32/msxml3/dispex.c | 4 +- reactos/dll/win32/msxml3/element.c | 2 +- reactos/dll/win32/msxml3/main.c | 2 +- reactos/dll/win32/msxml3/node.c | 36 +- 10 files changed, 57 insertions(+), 1137 deletions(-) delete mode 100644 reactos/dll/win32/msvfw32/msvfw32_ros.diff delete mode 100644 reactos/dll/win32/msvfw32/msvideo16.c delete mode 100644 reactos/dll/win32/msvfw32/vfw16.h diff --git a/reactos/dll/win32/msimtf/activeimmapp.c b/reactos/dll/win32/msimtf/activeimmapp.c index d8446267893..73ce0758c70 100644 --- a/reactos/dll/win32/msimtf/activeimmapp.c +++ b/reactos/dll/win32/msimtf/activeimmapp.c @@ -655,7 +655,7 @@ static HRESULT WINAPI ActiveIMMApp_Deactivate(IActiveIMMApp* This) static HRESULT WINAPI ActiveIMMApp_OnDefWindowProc(IActiveIMMApp* This, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { - //FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); + FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); return E_FAIL; } diff --git a/reactos/dll/win32/msvfw32/mciwnd.c b/reactos/dll/win32/msvfw32/mciwnd.c index ff8a0369df0..96b64207825 100644 --- a/reactos/dll/win32/msvfw32/mciwnd.c +++ b/reactos/dll/win32/msvfw32/mciwnd.c @@ -1298,30 +1298,23 @@ end_of_mci_open: } case MCI_SEEK: + case MCI_STEP: { - MCI_SEEK_PARMS mci_seek; - - switch (lParam) - { - case MCIWND_START: - lParam = SendMessageW(hWnd, MCIWNDM_GETSTART, 0, 0); - break; - - case MCIWND_END: - lParam = SendMessageW(hWnd, MCIWNDM_GETEND, 0, 0); - break; - } + MCI_SEEK_PARMS mci_seek; /* Layout is usable as MCI_XYZ_STEP_PARMS */ + DWORD flags = MCI_STEP == wMsg ? 0 : + MCIWND_START == lParam ? MCI_SEEK_TO_START : + MCIWND_END == lParam ? MCI_SEEK_TO_END : MCI_TO; mci_seek.dwTo = lParam; - mwi->lasterror = mciSendCommandW(mwi->mci, MCI_SEEK, - MCI_TO, (DWORD_PTR)&mci_seek); + mwi->lasterror = mciSendCommandW(mwi->mci, wMsg, + flags, (DWORD_PTR)&mci_seek); if (mwi->lasterror) { MCIWND_notify_error(mwi); return mwi->lasterror; } /* update window to reflect the state */ - InvalidateRect(hWnd, NULL, TRUE); + else InvalidateRect(hWnd, NULL, TRUE); return 0; } @@ -1364,15 +1357,9 @@ end_of_mci_open: } case MCI_PAUSE: - case MCI_STEP: case MCI_STOP: case MCI_RESUME: mci_generic_command(mwi, wMsg); - if (wMsg == MCI_STEP && !mwi->lasterror) - { - /* update window to reflect the state */ - InvalidateRect(hWnd, NULL, TRUE); - } return mwi->lasterror; case MCI_CONFIGURE: diff --git a/reactos/dll/win32/msvfw32/msvfw32_ros.diff b/reactos/dll/win32/msvfw32/msvfw32_ros.diff deleted file mode 100644 index 331b478ad6d..00000000000 --- a/reactos/dll/win32/msvfw32/msvfw32_ros.diff +++ /dev/null @@ -1,14 +0,0 @@ -Index: msvideo_private.h -=================================================================== ---- msvideo_private.h (revision 25690) -+++ msvideo_private.h (working copy) -@@ -19,6 +19,9 @@ - #ifndef __WINE_MSVIDEO_PRIVATE_H - #define __WINE_MSVIDEO_PRIVATE_H - -+/* Installable Compressor Manager */ -+#define ICVERSION 0x0104 -+ - #define ICM_CHOOSE_COMPRESSOR 1 - #define IDC_COMP_LIST 880 - #define IDS_FULLFRAMES 901 diff --git a/reactos/dll/win32/msvfw32/msvideo16.c b/reactos/dll/win32/msvfw32/msvideo16.c deleted file mode 100644 index c873da57f45..00000000000 --- a/reactos/dll/win32/msvfw32/msvideo16.c +++ /dev/null @@ -1,916 +0,0 @@ -/* - * msvideo 16-bit functions - * - * Copyright 1998 Marcus Meissner - * Copyright 2000 Bradley Baetz - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include -#include -#include - -#include "windef.h" -#include "winbase.h" -#include "winver.h" -#include "winnls.h" -#include "winreg.h" -#include "winuser.h" -#include "vfw16.h" -#include "msvideo_private.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(msvideo); - -/* Drivers32 settings */ -#define HKLM_DRIVERS32 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32" - -/*********************************************************************** - * DrawDibOpen [MSVIDEO.102] - */ -HDRAWDIB16 VFWAPI DrawDibOpen16(void) -{ - return HDRAWDIB_16(DrawDibOpen()); -} - -/*********************************************************************** - * DrawDibClose [MSVIDEO.103] - */ -BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd) -{ - return DrawDibClose(HDRAWDIB_32(hdd)); -} - -/************************************************************************ - * DrawDibBegin [MSVIDEO.104] - */ -BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd, HDC16 hdc, INT16 dxDst, - INT16 dyDst, LPBITMAPINFOHEADER lpbi, INT16 dxSrc, - INT16 dySrc, UINT16 wFlags) -{ - return DrawDibBegin(HDRAWDIB_32(hdd), HDC_32(hdc), dxDst, dyDst, lpbi, - dxSrc, dySrc, wFlags); -} - -/*********************************************************************** - * DrawDibEnd [MSVIDEO.105] - */ -BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd) -{ - return DrawDibEnd(HDRAWDIB_32(hdd)); -} - -/********************************************************************** - * DrawDibDraw [MSVIDEO.106] - */ -BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd, HDC16 hdc, INT16 xDst, INT16 yDst, - INT16 dxDst, INT16 dyDst, LPBITMAPINFOHEADER lpbi, - LPVOID lpBits, INT16 xSrc, INT16 ySrc, INT16 dxSrc, - INT16 dySrc, UINT16 wFlags) -{ - return DrawDibDraw(HDRAWDIB_32(hdd), HDC_32(hdc), xDst, yDst, dxDst, - dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, wFlags); -} - -/*********************************************************************** - * DrawDibGetPalette [MSVIDEO.108] - */ -HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd) -{ - return HPALETTE_16(DrawDibGetPalette(HDRAWDIB_32(hdd))); -} - -/*********************************************************************** - * DrawDibSetPalette [MSVIDEO.110] - */ -BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal) -{ - return DrawDibSetPalette(HDRAWDIB_32(hdd), HPALETTE_32(hpal)); -} - -/*********************************************************************** - * DrawDibRealize [MSVIDEO.112] - */ -UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc, - BOOL16 fBackground) -{ - return (UINT16)DrawDibRealize(HDRAWDIB_32(hdd), HDC_32(hdc), fBackground); -} - -/************************************************************************* - * DrawDibStart [MSVIDEO.118] - */ -BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate) -{ - return DrawDibStart(HDRAWDIB_32(hdd), rate); -} - -/************************************************************************* - * DrawDibStop [MSVIDEO.119] - */ -BOOL16 VFWAPI DrawDibStop16(HDRAWDIB16 hdd) -{ - return DrawDibStop(HDRAWDIB_32(hdd)); -} - -/*********************************************************************** - * ICOpen [MSVIDEO.203] - */ -HIC16 VFWAPI ICOpen16(DWORD fccType, DWORD fccHandler, UINT16 wMode) -{ - return HIC_16(ICOpen(fccType, fccHandler, wMode)); -} - -/*********************************************************************** - * ICClose [MSVIDEO.204] - */ -LRESULT WINAPI ICClose16(HIC16 hic) -{ - return ICClose(HIC_32(hic)); -} - -/*********************************************************************** - * _ICMessage [MSVIDEO.207] - */ -LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ) -{ - LPWORD lpData; - SEGPTR segData; - LRESULT ret; - UINT16 i; - - lpData = HeapAlloc(GetProcessHeap(), 0, cb); - - TRACE("0x%08x, %u, %u, ...)\n", (DWORD) hic, msg, cb); - - for (i = 0; i < cb / sizeof(WORD); i++) - { - lpData[i] = VA_ARG16(valist, WORD); - } - - segData = MapLS(lpData); - ret = ICSendMessage16(hic, msg, segData, (DWORD) cb); - UnMapLS(segData); - HeapFree(GetProcessHeap(), 0, lpData); - return ret; -} - -/*********************************************************************** - * ICGetInfo [MSVIDEO.212] - */ -LRESULT VFWAPI ICGetInfo16(HIC16 hic, ICINFO16 * picinfo, DWORD cb) -{ - LRESULT ret; - - TRACE("(0x%08x,%p,%d)\n", (DWORD) hic, picinfo, cb); - ret = ICSendMessage16(hic, ICM_GETINFO, (DWORD) picinfo, cb); - TRACE(" -> 0x%08lx\n", ret); - return ret; -} - -/*********************************************************************** - * ICLocate [MSVIDEO.213] - */ -HIC16 VFWAPI ICLocate16(DWORD fccType, DWORD fccHandler, - LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, - WORD wFlags) -{ - return HIC_16(ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, wFlags)); -} - -/*********************************************************************** - * _ICCompress [MSVIDEO.224] - */ -DWORD VFWAPIV ICCompress16(HIC16 hic, DWORD dwFlags, - LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData, - LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits, - LPDWORD lpckid, LPDWORD lpdwFlags, - LONG lFrameNum, DWORD dwFrameSize, - DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev, - LPVOID lpPrev) -{ - DWORD ret; - ICCOMPRESS iccmp; - SEGPTR seg_iccmp; - - TRACE("(0x%08x,%d,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags, - lpbiOutput, lpData, lpbiInput, lpBits); - - iccmp.dwFlags = dwFlags; - - iccmp.lpbiOutput = lpbiOutput; - iccmp.lpOutput = lpData; - iccmp.lpbiInput = lpbiInput; - iccmp.lpInput = lpBits; - - iccmp.lpckid = lpckid; - iccmp.lpdwFlags = lpdwFlags; - iccmp.lFrameNum = lFrameNum; - iccmp.dwFrameSize = dwFrameSize; - iccmp.dwQuality = dwQuality; - iccmp.lpbiPrev = lpbiPrev; - iccmp.lpPrev = lpPrev; - seg_iccmp = MapLS(&iccmp); - ret = ICSendMessage16(hic, ICM_COMPRESS, seg_iccmp, sizeof(ICCOMPRESS)); - UnMapLS(seg_iccmp); - return ret; -} - -/*********************************************************************** - * _ICDecompress [MSVIDEO.230] - */ -DWORD VFWAPIV ICDecompress16(HIC16 hic, DWORD dwFlags, - LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData, - LPBITMAPINFOHEADER lpbi, LPVOID lpBits) -{ - ICDECOMPRESS icd; - SEGPTR segptr; - DWORD ret; - - TRACE("(0x%08x,%d,%p,%p,%p,%p)\n", (DWORD) hic, dwFlags, lpbiFormat, - lpData, lpbi, lpBits); - - icd.dwFlags = dwFlags; - icd.lpbiInput = lpbiFormat; - icd.lpInput = lpData; - icd.lpbiOutput = lpbi; - icd.lpOutput = lpBits; - icd.ckid = 0; - segptr = MapLS(&icd); - ret = ICSendMessage16(hic, ICM_DECOMPRESS, segptr, sizeof(ICDECOMPRESS)); - UnMapLS(segptr); - return ret; -} - -/*********************************************************************** - * _ICDrawBegin [MSVIDEO.232] - */ -DWORD VFWAPIV ICDrawBegin16(HIC16 hic, /* [in] */ - DWORD dwFlags, /* [in] flags */ - HPALETTE16 hpal, /* [in] palette to draw with */ - HWND16 hwnd, /* [in] window to draw to */ - HDC16 hdc, /* [in] HDC to draw to */ - INT16 xDst, /* [in] destination rectangle */ - INT16 yDst, /* [in] */ - INT16 dxDst, /* [in] */ - INT16 dyDst, /* [in] */ - LPBITMAPINFOHEADER lpbi, /* [in] format of frame to draw NOTE: SEGPTR */ - INT16 xSrc, /* [in] source rectangle */ - INT16 ySrc, /* [in] */ - INT16 dxSrc, /* [in] */ - INT16 dySrc, /* [in] */ - DWORD dwRate, /* [in] frames/second = (dwRate/dwScale) */ - DWORD dwScale) /* [in] */ -{ - DWORD ret; - ICDRAWBEGIN16 icdb; - SEGPTR seg_icdb; - - TRACE ("(0x%08x,%d,0x%08x,0x%08x,0x%08x,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n", - (DWORD) hic, dwFlags, (DWORD) hpal, (DWORD) hwnd, (DWORD) hdc, - xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, - dwScale); - - icdb.dwFlags = dwFlags; - icdb.hpal = hpal; - icdb.hwnd = hwnd; - icdb.hdc = hdc; - icdb.xDst = xDst; - icdb.yDst = yDst; - icdb.dxDst = dxDst; - icdb.dyDst = dyDst; - icdb.lpbi = lpbi; /* Keep this as SEGPTR for the mapping code to deal with */ - icdb.xSrc = xSrc; - icdb.ySrc = ySrc; - icdb.dxSrc = dxSrc; - icdb.dySrc = dySrc; - icdb.dwRate = dwRate; - icdb.dwScale = dwScale; - seg_icdb = MapLS(&icdb); - ret = (DWORD) ICSendMessage16(hic, ICM_DRAW_BEGIN, seg_icdb, - sizeof(ICDRAWBEGIN16)); - UnMapLS(seg_icdb); - return ret; -} - -/*********************************************************************** - * _ICDraw [MSVIDEO.234] - */ -DWORD VFWAPIV ICDraw16(HIC16 hic, DWORD dwFlags, - LPVOID lpFormat, /* [???] NOTE: SEGPTR */ - LPVOID lpData, /* [???] NOTE: SEGPTR */ - DWORD cbData, LONG lTime) -{ - DWORD ret; - ICDRAW icd; - SEGPTR seg_icd; - - TRACE("(0x%08x,0x%08x,%p,%p,%d,%d)\n", (DWORD) hic, dwFlags, - lpFormat, lpData, cbData, lTime); - icd.dwFlags = dwFlags; - icd.lpFormat = lpFormat; - icd.lpData = lpData; - icd.cbData = cbData; - icd.lTime = lTime; - seg_icd = MapLS(&icd); - ret = ICSendMessage16(hic, ICM_DRAW, seg_icd, sizeof(ICDRAW)); - UnMapLS(seg_icd); - return ret; -} - -/*********************************************************************** - * ICGetDisplayFormat [MSVIDEO.239] - */ -HIC16 VFWAPI ICGetDisplayFormat16(HIC16 hic, LPBITMAPINFOHEADER lpbiIn, - LPBITMAPINFOHEADER lpbiOut, INT16 depth, - INT16 dx, INT16 dy) -{ - return HIC_16(ICGetDisplayFormat(HIC_32(hic), lpbiIn, lpbiOut, depth, - dx, dy)); -} - -#define COPY(x,y) (x->y = x##16->y); -#define COPYPTR(x,y) (x->y = MapSL((SEGPTR)x##16->y)); - -/****************************************************************** - * MSVIDEO_MapICDEX16To32 - * - * - */ -static LPVOID MSVIDEO_MapICDEX16To32(LPDWORD lParam) -{ - LPVOID ret; - - ICDECOMPRESSEX *icdx = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESSEX)); - ICDECOMPRESSEX16 *icdx16 = MapSL(*lParam); - ret = icdx16; - - COPY(icdx, dwFlags); - COPYPTR(icdx, lpbiSrc); - COPYPTR(icdx, lpSrc); - COPYPTR(icdx, lpbiDst); - COPYPTR(icdx, lpDst); - COPY(icdx, xDst); - COPY(icdx, yDst); - COPY(icdx, dxDst); - COPY(icdx, dyDst); - COPY(icdx, xSrc); - COPY(icdx, ySrc); - COPY(icdx, dxSrc); - COPY(icdx, dySrc); - - *lParam = (DWORD)(icdx); - return ret; -} - -/****************************************************************** - * MSVIDEO_MapMsg16To32 - * - * - */ -static LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2) -{ - LPVOID ret = 0; - - TRACE("Mapping %d\n", msg); - - switch (msg) - { - case DRV_LOAD: - case DRV_ENABLE: - case DRV_CLOSE: - case DRV_DISABLE: - case DRV_FREE: - case ICM_ABOUT: - case ICM_CONFIGURE: - case ICM_COMPRESS_END: - case ICM_DECOMPRESS_END: - case ICM_DECOMPRESSEX_END: - case ICM_SETQUALITY: - case ICM_DRAW_START_PLAY: - case ICM_DRAW_STOP_PLAY: - case ICM_DRAW_REALIZE: - case ICM_DRAW_RENDERBUFFER: - case ICM_DRAW_END: - break; - case DRV_OPEN: - case ICM_GETDEFAULTQUALITY: - case ICM_GETQUALITY: - case ICM_SETSTATE: - case ICM_DRAW_WINDOW: - case ICM_GETBUFFERSWANTED: - *lParam1 = (DWORD)MapSL(*lParam1); - break; - case ICM_GETINFO: - { - ICINFO *ici = HeapAlloc(GetProcessHeap(), 0, sizeof(ICINFO)); - ICINFO16 *ici16; - - ici16 = MapSL(*lParam1); - ret = ici16; - - ici->dwSize = sizeof(ICINFO); - COPY(ici, fccType); - COPY(ici, fccHandler); - COPY(ici, dwFlags); - COPY(ici, dwVersion); - COPY(ici, dwVersionICM); - MultiByteToWideChar( CP_ACP, 0, ici16->szName, -1, ici->szName, 16 ); - MultiByteToWideChar( CP_ACP, 0, ici16->szDescription, -1, ici->szDescription, 128 ); - MultiByteToWideChar( CP_ACP, 0, ici16->szDriver, -1, ici->szDriver, 128 ); - *lParam1 = (DWORD)(ici); - *lParam2 = sizeof(ICINFO); - } - break; - case ICM_COMPRESS: - { - ICCOMPRESS *icc = HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS)); - ICCOMPRESS *icc16; - - icc16 = MapSL(*lParam1); - ret = icc16; - - COPY(icc, dwFlags); - COPYPTR(icc, lpbiOutput); - COPYPTR(icc, lpOutput); - COPYPTR(icc, lpbiInput); - COPYPTR(icc, lpInput); - COPYPTR(icc, lpckid); - COPYPTR(icc, lpdwFlags); - COPY(icc, lFrameNum); - COPY(icc, dwFrameSize); - COPY(icc, dwQuality); - COPYPTR(icc, lpbiPrev); - COPYPTR(icc, lpPrev); - - *lParam1 = (DWORD)(icc); - *lParam2 = sizeof(ICCOMPRESS); - } - break; - case ICM_DECOMPRESS: - { - ICDECOMPRESS *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS)); - ICDECOMPRESS *icd16; /* Same structure except for the pointers */ - - icd16 = MapSL(*lParam1); - ret = icd16; - - COPY(icd, dwFlags); - COPYPTR(icd, lpbiInput); - COPYPTR(icd, lpInput); - COPYPTR(icd, lpbiOutput); - COPYPTR(icd, lpOutput); - COPY(icd, ckid); - - *lParam1 = (DWORD)(icd); - *lParam2 = sizeof(ICDECOMPRESS); - } - break; - case ICM_COMPRESS_BEGIN: - case ICM_COMPRESS_GET_FORMAT: - case ICM_COMPRESS_GET_SIZE: - case ICM_COMPRESS_QUERY: - case ICM_DECOMPRESS_GET_FORMAT: - case ICM_DECOMPRESS_QUERY: - case ICM_DECOMPRESS_BEGIN: - case ICM_DECOMPRESS_SET_PALETTE: - case ICM_DECOMPRESS_GET_PALETTE: - *lParam1 = (DWORD)MapSL(*lParam1); - *lParam2 = (DWORD)MapSL(*lParam2); - break; - case ICM_DECOMPRESSEX_QUERY: - if ((*lParam2 != sizeof(ICDECOMPRESSEX16)) && (*lParam2 != 0)) - WARN("*lParam2 has unknown value %p\n", (ICDECOMPRESSEX16*)*lParam2); - /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16) - * This is because of ICMessage(). Special case it? - { - LPVOID* addr = HeapAlloc(GetProcessHeap(), 0, 2*sizeof(LPVOID)); - addr[0] = MSVIDEO_MapICDEX16To32(lParam1); - if (*lParam2) - addr[1] = MSVIDEO_MapICDEX16To32(lParam2); - else - addr[1] = 0; - - ret = addr; - } - break;*/ - case ICM_DECOMPRESSEX_BEGIN: - case ICM_DECOMPRESSEX: - ret = MSVIDEO_MapICDEX16To32(lParam1); - *lParam2 = sizeof(ICDECOMPRESSEX); - break; - case ICM_DRAW_BEGIN: - { - ICDRAWBEGIN *icdb = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN)); - ICDRAWBEGIN16 *icdb16 = MapSL(*lParam1); - ret = icdb16; - - COPY(icdb, dwFlags); - icdb->hpal = HPALETTE_32(icdb16->hpal); - icdb->hwnd = HWND_32(icdb16->hwnd); - icdb->hdc = HDC_32(icdb16->hdc); - COPY(icdb, xDst); - COPY(icdb, yDst); - COPY(icdb, dxDst); - COPY(icdb, dyDst); - COPYPTR(icdb, lpbi); - COPY(icdb, xSrc); - COPY(icdb, ySrc); - COPY(icdb, dxSrc); - COPY(icdb, dySrc); - COPY(icdb, dwRate); - COPY(icdb, dwScale); - - *lParam1 = (DWORD)(icdb); - *lParam2 = sizeof(ICDRAWBEGIN); - } - break; - case ICM_DRAW_SUGGESTFORMAT: - { - ICDRAWSUGGEST *icds = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWSUGGEST)); - ICDRAWSUGGEST16 *icds16 = MapSL(*lParam1); - - ret = icds16; - - COPY(icds, dwFlags); - COPYPTR(icds, lpbiIn); - COPYPTR(icds, lpbiSuggest); - COPY(icds, dxSrc); - COPY(icds, dySrc); - COPY(icds, dxDst); - COPY(icds, dyDst); - icds->hicDecompressor = HIC_32(icds16->hicDecompressor); - - *lParam1 = (DWORD)(icds); - *lParam2 = sizeof(ICDRAWSUGGEST); - } - break; - case ICM_DRAW: - { - ICDRAW *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAW)); - ICDRAW *icd16 = MapSL(*lParam1); - ret = icd16; - - COPY(icd, dwFlags); - COPYPTR(icd, lpFormat); - COPYPTR(icd, lpData); - COPY(icd, cbData); - COPY(icd, lTime); - - *lParam1 = (DWORD)(icd); - *lParam2 = sizeof(ICDRAW); - } - break; - case ICM_DRAW_START: - case ICM_DRAW_STOP: - break; - default: - FIXME("%d is not yet handled. Expect a crash.\n", msg); - } - return ret; -} - -#undef COPY -#undef COPYPTR - -/****************************************************************** - * MSVIDEO_UnmapMsg16To32 - * - * - */ -static void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID data16, LPDWORD lParam1, LPDWORD lParam2) -{ - TRACE("Unmapping %d\n", msg); - -#define UNCOPY(x, y) (x##16->y = x->y); - - switch (msg) - { - case ICM_GETINFO: - { - ICINFO *ici = (ICINFO*)(*lParam1); - ICINFO16 *ici16 = data16; - - UNCOPY(ici, fccType); - UNCOPY(ici, fccHandler); - UNCOPY(ici, dwFlags); - UNCOPY(ici, dwVersion); - UNCOPY(ici, dwVersionICM); - WideCharToMultiByte( CP_ACP, 0, ici->szName, -1, ici16->szName, - sizeof(ici16->szName), NULL, NULL ); - ici16->szName[sizeof(ici16->szName)-1] = 0; - WideCharToMultiByte( CP_ACP, 0, ici->szDescription, -1, ici16->szDescription, - sizeof(ici16->szDescription), NULL, NULL ); - ici16->szDescription[sizeof(ici16->szDescription)-1] = 0; - /* This just gives garbage for some reason - BB - lstrcpynWtoA(ici16->szDriver, ici->szDriver, 128);*/ - - HeapFree(GetProcessHeap(), 0, ici); - } - break; - case ICM_DECOMPRESS_QUERY: - /*{ - LPVOID* x = data16; - HeapFree(GetProcessHeap(), 0, x[0]); - if (x[1]) - HeapFree(GetProcessHeap(), 0, x[1]); - } - break;*/ - case ICM_COMPRESS: - case ICM_DECOMPRESS: - case ICM_DECOMPRESSEX_QUERY: - case ICM_DECOMPRESSEX_BEGIN: - case ICM_DECOMPRESSEX: - case ICM_DRAW_BEGIN: - case ICM_DRAW_SUGGESTFORMAT: - case ICM_DRAW: - HeapFree(GetProcessHeap(), 0, data16); - break; - default: - ERR("Unmapping unmapped msg %d\n", msg); - } -#undef UNCOPY -} - -/*********************************************************************** - * ICInfo [MSVIDEO.200] - */ -BOOL16 VFWAPI ICInfo16(DWORD fccType, DWORD fccHandler, ICINFO16 *lpicinfo) -{ - BOOL16 ret; - LPVOID lpv; - DWORD lParam = (DWORD)lpicinfo; - DWORD size = ((ICINFO*)(MapSL((SEGPTR)lpicinfo)))->dwSize; - - /* Use the mapping functions to map the ICINFO structure */ - lpv = MSVIDEO_MapMsg16To32(ICM_GETINFO, &lParam, &size); - - ret = ICInfo(fccType, fccHandler, (ICINFO*)lParam); - - MSVIDEO_UnmapMsg16To32(ICM_GETINFO, lpv, &lParam, &size); - - return ret; -} - -/****************************************************************** - * IC_Callback3216 - * - * - */ -static LRESULT CALLBACK IC_Callback3216(HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2) -{ - WINE_HIC* whic; - WORD args[8]; - - whic = MSVIDEO_GetHicPtr(hic); - if (whic) - { - DWORD ret = 0; - switch (msg) - { - case DRV_OPEN: - lp2 = (DWORD)MapLS((void*)lp2); - break; - } - args[7] = HIWORD(hic); - args[6] = LOWORD(hic); - args[5] = HDRVR_16(whic->hdrv); - args[4] = msg; - args[3] = HIWORD(lp1); - args[2] = LOWORD(lp1); - args[1] = HIWORD(lp2); - args[0] = LOWORD(lp2); - WOWCallback16Ex( whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &ret ); - - switch (msg) - { - case DRV_OPEN: - UnMapLS(lp2); - break; - } - return ret; - } - else return ICERR_BADHANDLE; -} - -/*********************************************************************** - * ICOpenFunction [MSVIDEO.206] - */ -HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler) -{ - HIC hic32; - - hic32 = MSVIDEO_OpenFunction(fccType, fccHandler, wMode, - (DRIVERPROC)IC_Callback3216, (DWORD)lpfnHandler); - return HIC_16(hic32); -} - -/*********************************************************************** - * ICSendMessage [MSVIDEO.205] - */ -LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2) -{ - LRESULT ret = ICERR_BADHANDLE; - WINE_HIC* whic; - - whic = MSVIDEO_GetHicPtr(HIC_32(hic)); - if (whic) - { - /* we've got a 16 bit driver proc... call it directly */ - if (whic->driverproc16) - { - WORD args[8]; - DWORD result; - - /* FIXME: original code was passing hdrv first and hic second */ - /* but this doesn't match what IC_Callback3216 does */ - args[7] = HIWORD(hic); - args[6] = LOWORD(hic); - args[5] = HDRVR_16(whic->hdrv); - args[4] = msg; - args[3] = HIWORD(lParam1); - args[2] = LOWORD(lParam1); - args[1] = HIWORD(lParam2); - args[0] = LOWORD(lParam2); - WOWCallback16Ex( whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &result ); - ret = result; - } - else - { - /* map the message for a 32 bit infrastructure, and pass it along */ - void* data16 = MSVIDEO_MapMsg16To32(msg, &lParam1, &lParam2); - - ret = MSVIDEO_SendMessage(whic, msg, lParam1, lParam2); - if (data16) - MSVIDEO_UnmapMsg16To32(msg, data16, &lParam1, &lParam2); - } - } - return ret; -} - -/*********************************************************************** - * VideoCapDriverDescAndVer [MSVIDEO.22] - */ -DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len, - LPSTR buf2, WORD buf2len) -{ - static const char version_info_spec[] = "\\StringFileInfo\\040904E4\\FileDescription"; - DWORD verhandle; - DWORD infosize; - UINT subblocklen; - char *s, buf[2048], fn[260]; - LPBYTE infobuf; - LPVOID subblock; - DWORD i, cnt = 0, lRet; - DWORD bufLen, fnLen; - FILETIME lastWrite; - HKEY hKey; - BOOL found = FALSE; - - TRACE("(%d,%p,%d,%p,%d)\n", nr, buf1, buf1len, buf2, buf2len); - lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey); - if (lRet == ERROR_SUCCESS) - { - RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0); - for (i = 0; i < cnt; i++) - { - bufLen = sizeof(buf) / sizeof(buf[0]); - lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite); - if (lRet != ERROR_SUCCESS) continue; - if (strncasecmp(buf, "vid", 3)) continue; - if (nr--) continue; - fnLen = sizeof(fn); - lRet = RegQueryValueExA(hKey, buf, 0, 0, (LPBYTE)fn, &fnLen); - if (lRet == ERROR_SUCCESS) found = TRUE; - break; - } - RegCloseKey( hKey ); - } - - /* search system.ini if not found in the registry */ - if (!found && GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini")) - { - for (s = buf; *s; s += strlen(s) + 1) - { - if (strncasecmp(s, "vid", 3)) continue; - if (nr--) continue; - if (GetPrivateProfileStringA("drivers32", s, NULL, fn, sizeof(fn), "system.ini")) - found = TRUE; - break; - } - } - - if (!found) - { - TRACE("No more VID* entries found nr=%d\n", nr); - return 20; - } - infosize = GetFileVersionInfoSizeA(fn, &verhandle); - if (!infosize) - { - TRACE("%s has no fileversioninfo.\n", fn); - return 18; - } - infobuf = HeapAlloc(GetProcessHeap(), 0, infosize); - if (GetFileVersionInfoA(fn, verhandle, infosize, infobuf)) - { - /* Yes, two space behind : */ - /* FIXME: test for buflen */ - snprintf(buf2, buf2len, "Version: %d.%d.%d.%d\n", - ((WORD*)infobuf)[0x0f], - ((WORD*)infobuf)[0x0e], - ((WORD*)infobuf)[0x11], - ((WORD*)infobuf)[0x10] - ); - TRACE("version of %s is %s\n", fn, buf2); - } - else - { - TRACE("GetFileVersionInfoA failed for %s.\n", fn); - lstrcpynA(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/ - } - /* FIXME: language problem? */ - if (VerQueryValueA( infobuf, - version_info_spec, - &subblock, - &subblocklen - )) - { - UINT copylen = min(subblocklen,buf1len-1); - memcpy(buf1, subblock, copylen); - buf1[copylen] = '\0'; - TRACE("VQA returned %s\n", (LPCSTR)subblock); - } - else - { - TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n"); - lstrcpynA(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/ - } - HeapFree(GetProcessHeap(), 0, infobuf); - return 0; -} - -/****************************************************************** - * IC_CallTo16 - * - * - */ -static LRESULT CALLBACK IC_CallTo16(HDRVR hdrv, HIC hic, UINT msg, LPARAM lp1, LPARAM lp2) -{ -#if 0 - WINE_HIC* whic = IC_GetPtr(hic); - LRESULT ret = 0; - - - if (whic->driverproc) - { - ret = whic->driverproc(hic, whic->hdrv, msg, lParam1, lParam2); - } - else - { - ret = SendDriverMessage(whic->hdrv, msg, lParam1, lParam2); - } -#else - FIXME("No 32=>16 conversion yet\n"); -#endif - return 0; -} - -/************************************************************************** - * DllEntryPoint (MSVIDEO.3) - * - * MSVIDEO DLL entry point - * - */ -BOOL WINAPI VIDEO_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds, - WORD wHeapSize, DWORD dwReserved1, WORD wReserved2) -{ - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - /* hook in our 16 bit management functions */ - pFnCallTo16 = IC_CallTo16; - break; - case DLL_PROCESS_DETACH: - /* remove our 16 bit management functions */ - pFnCallTo16 = NULL; - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - break; - } - return TRUE; -} diff --git a/reactos/dll/win32/msvfw32/vfw16.h b/reactos/dll/win32/msvfw32/vfw16.h deleted file mode 100644 index 5cf97915dbc..00000000000 --- a/reactos/dll/win32/msvfw32/vfw16.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 1999 Marcus Meissner - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef __WINE_VFW16_H -#define __WINE_VFW16_H - -#include - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "vfw.h" -#include "wownt32.h" -#include "wine/windef16.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -typedef HANDLE16 HDRAWDIB16; - -#include "pshpack1.h" - -typedef struct { - DWORD dwSize; - DWORD fccType; - DWORD fccHandler; - DWORD dwFlags; - DWORD dwVersion; - DWORD dwVersionICM; - /* - * under Win16, normal chars are used - */ - CHAR szName[16]; - CHAR szDescription[128]; - CHAR szDriver[128]; -} ICINFO16; - -typedef struct { - DWORD dwFlags; - LPBITMAPINFOHEADER lpbiSrc; - LPVOID lpSrc; - LPBITMAPINFOHEADER lpbiDst; - LPVOID lpDst; - - INT16 xDst; /* destination rectangle */ - INT16 yDst; - INT16 dxDst; - INT16 dyDst; - - INT16 xSrc; /* source rectangle */ - INT16 ySrc; - INT16 dxSrc; - INT16 dySrc; -} ICDECOMPRESSEX16; - -typedef struct { - DWORD dwFlags; - HPALETTE16 hpal; - HWND16 hwnd; - HDC16 hdc; - INT16 xDst; - INT16 yDst; - INT16 dxDst; - INT16 dyDst; - LPBITMAPINFOHEADER lpbi; - INT16 xSrc; - INT16 ySrc; - INT16 dxSrc; - INT16 dySrc; - DWORD dwRate; - DWORD dwScale; -} ICDRAWBEGIN16; - -#include "poppack.h" - -typedef struct { - DWORD dwFlags; - LPBITMAPINFOHEADER lpbiIn; - LPBITMAPINFOHEADER lpbiSuggest; - INT16 dxSrc; - INT16 dySrc; - INT16 dxDst; - INT16 dyDst; - HIC16 hicDecompressor; -} ICDRAWSUGGEST16; - -DWORD VFWAPIV ICDraw16(HIC16,DWORD,LPVOID,LPVOID,DWORD,LONG); -DWORD VFWAPIV ICDrawBegin16(HIC16,DWORD,HPALETTE16,HWND16,HDC16,INT16, - INT16,INT16,INT16,LPBITMAPINFOHEADER, - INT16,INT16,INT16,INT16,DWORD,DWORD); -LRESULT WINAPI ICClose16(HIC16); -DWORD VFWAPIV ICCompress16(HIC16,DWORD,LPBITMAPINFOHEADER,LPVOID, - LPBITMAPINFOHEADER,LPVOID,LPDWORD, - LPDWORD,LONG,DWORD,DWORD, - LPBITMAPINFOHEADER,LPVOID); -DWORD VFWAPIV ICDecompress16(HIC16,DWORD,LPBITMAPINFOHEADER,LPVOID, - LPBITMAPINFOHEADER,LPVOID); -HIC16 VFWAPI ICGetDisplayFormat16(HIC16,LPBITMAPINFOHEADER, - LPBITMAPINFOHEADER,INT16,INT16, - INT16); -LRESULT VFWAPI ICGetInfo16(HIC16,ICINFO16 *,DWORD); -BOOL16 VFWAPI ICInfo16(DWORD,DWORD,ICINFO16 *); -HIC16 VFWAPI ICLocate16(DWORD,DWORD,LPBITMAPINFOHEADER, - LPBITMAPINFOHEADER,WORD); -LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ); -HIC16 VFWAPI ICOpen16(DWORD,DWORD,UINT16); -HIC16 VFWAPI ICOpenFunction16(DWORD,DWORD,UINT16,FARPROC16); -LRESULT VFWAPI ICSendMessage16(HIC16,UINT16,DWORD,DWORD); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __WINE_VFW16_H */ diff --git a/reactos/dll/win32/msvidc32/msvideo1.c b/reactos/dll/win32/msvidc32/msvideo1.c index 19784eb888e..68a52c651dd 100644 --- a/reactos/dll/win32/msvidc32/msvideo1.c +++ b/reactos/dll/win32/msvidc32/msvideo1.c @@ -95,10 +95,18 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s blocks_high = height / 4; total_blocks = blocks_wide * blocks_high; block_inc = 4; +#ifdef ORIGINAL row_dec = stride + 4; +#else + row_dec = - (stride - 4); /* such that -row_dec > 0 */ +#endif for (block_y = blocks_high; block_y > 0; block_y--) { +#ifdef ORIGINAL block_ptr = ((block_y * 4) - 1) * stride; +#else + block_ptr = ((blocks_high - block_y) * 4) * stride; +#endif for (block_x = blocks_wide; block_x > 0; block_x--) { /* check if this block should be skipped */ if (skip_blocks) { @@ -131,16 +139,7 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) - { -#ifdef ORIGINAL pixels[pixel_ptr++] = colors[(flags & 0x1) ^ 1]; -#else - pixels[width*(height-(pixel_ptr/width)-1) + - pixel_ptr%width] = - colors[(flags & 0x1) ^ 1]; - pixel_ptr++; -#endif - } pixel_ptr -= row_dec; } } else if (byte_b >= 0x90) { @@ -153,19 +152,9 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) - { -#ifdef ORIGINAL - pixels[pixel_ptr++] = - colors[((pixel_y & 0x2) << 1) + + pixels[pixel_ptr++] = + colors[((pixel_y & 0x2) << 1) + (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; -#else - pixels[width*(height-(pixel_ptr/width)-1) + - pixel_ptr%width] = - colors[((pixel_y & 0x2) << 1) + - (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; - pixel_ptr++; -#endif - } pixel_ptr -= row_dec; } } else { @@ -174,15 +163,7 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++) - { -#ifdef ORIGINAL pixels[pixel_ptr++] = colors[0]; -#else - pixels[width*(height-(pixel_ptr/width)-1) + - pixel_ptr%width] = colors[0]; - pixel_ptr++; -#endif - } pixel_ptr -= row_dec; } } @@ -218,10 +199,18 @@ msvideo1_decode_16bit( int width, int height, const unsigned char *buf, int buf_ blocks_high = height / 4; total_blocks = blocks_wide * blocks_high; block_inc = 4; +#ifdef ORIGINAL row_dec = stride + 4; +#else + row_dec = - (stride - 4); /* such that -row_dec > 0 */ +#endif for (block_y = blocks_high; block_y > 0; block_y--) { +#ifdef ORIGINAL block_ptr = ((block_y * 4) - 1) * stride; +#else + block_ptr = ((blocks_high - block_y) * 4) * stride; +#endif for (block_x = blocks_wide; block_x > 0; block_x--) { /* check if this block should be skipped */ if (skip_blocks) { @@ -272,8 +261,8 @@ msvideo1_decode_16bit( int width, int height, const unsigned char *buf, int buf_ for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) - pixels[pixel_ptr++] = - colors[((pixel_y & 0x2) << 1) + + pixels[pixel_ptr++] = + colors[((pixel_y & 0x2) << 1) + (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; pixel_ptr -= row_dec; } @@ -408,7 +397,7 @@ static LRESULT CRAM_Decompress( Msvideo1Context *info, ICDECOMPRESS *icd, DWORD width = icd->lpbiInput->biWidth; height = icd->lpbiInput->biHeight; bit_per_pixel = icd->lpbiInput->biBitCount; - stride = width*bit_per_pixel/8; + stride = width; /* in bytes or 16bit words */ sz = icd->lpbiInput->biSizeImage; if (info->mode_8bit) @@ -440,7 +429,7 @@ static LRESULT CRAM_DecompressEx( Msvideo1Context *info, ICDECOMPRESSEX *icd, DW width = icd->lpbiSrc->biWidth; height = icd->lpbiSrc->biHeight; bit_per_pixel = icd->lpbiSrc->biBitCount; - stride = width*bit_per_pixel/8; + stride = width; sz = icd->lpbiSrc->biSizeImage; if (info->mode_8bit) @@ -562,6 +551,10 @@ LRESULT WINAPI CRAM_DriverProc( DWORD_PTR dwDriverId, HDRVR hdrvr, UINT msg, (DWORD) lParam2 ); break; + case ICM_DECOMPRESS_END: + r = ICERR_OK; + break; + case ICM_COMPRESS_QUERY: FIXME("compression not implemented\n"); r = ICERR_BADFORMAT; diff --git a/reactos/dll/win32/msxml3/dispex.c b/reactos/dll/win32/msxml3/dispex.c index 529f9a452ee..09b71fed39d 100644 --- a/reactos/dll/win32/msxml3/dispex.c +++ b/reactos/dll/win32/msxml3/dispex.c @@ -196,12 +196,12 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, DISPID id static int dispid_cmp(const void *p1, const void *p2) { - return ((func_info_t*)p1)->id - ((func_info_t*)p2)->id; + return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id; } static int func_name_cmp(const void *p1, const void *p2) { - return strcmpiW((*(func_info_t**)p1)->name, (*(func_info_t**)p2)->name); + return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name); } static dispex_data_t *preprocess_dispex_data(DispatchEx *This) diff --git a/reactos/dll/win32/msxml3/element.c b/reactos/dll/win32/msxml3/element.c index b6caf73df15..617c008e288 100644 --- a/reactos/dll/win32/msxml3/element.c +++ b/reactos/dll/win32/msxml3/element.c @@ -594,7 +594,7 @@ static HRESULT WINAPI domelem_removeAttribute( IXMLDOMNamedNodeMap *attr; HRESULT hr; - TRACE("(%p)->(%s)", This, debugstr_w(p)); + TRACE("(%p)->(%s)\n", This, debugstr_w(p)); hr = IXMLDOMElement_get_attributes(iface, &attr); if (hr != S_OK) return hr; diff --git a/reactos/dll/win32/msxml3/main.c b/reactos/dll/win32/msxml3/main.c index 9b1eb823fbe..60b0cbd7b53 100644 --- a/reactos/dll/win32/msxml3/main.c +++ b/reactos/dll/win32/msxml3/main.c @@ -62,7 +62,7 @@ static int wineXmlMatchCallback (char const * filename) static void *wineXmlOpenCallback (char const * filename) { - BSTR sFilename = bstr_from_xmlChar( (xmlChar*)filename); + BSTR sFilename = bstr_from_xmlChar( (const xmlChar*)filename); HANDLE hFile; TRACE("%s\n", debugstr_w(sFilename)); diff --git a/reactos/dll/win32/msxml3/node.c b/reactos/dll/win32/msxml3/node.c index ac97681aac9..e263a2a143d 100644 --- a/reactos/dll/win32/msxml3/node.c +++ b/reactos/dll/win32/msxml3/node.c @@ -934,8 +934,9 @@ static HRESULT WINAPI xmlnode_get_specified( VARIANT_BOOL* isSpecified) { xmlnode *This = impl_from_IXMLDOMNode( iface ); - FIXME("(%p)->(%p)\n", This, isSpecified); - return E_NOTIMPL; + FIXME("(%p)->(%p) stub!\n", This, isSpecified); + *isSpecified = VARIANT_TRUE; + return S_OK; } static HRESULT WINAPI xmlnode_get_definition( @@ -1190,8 +1191,8 @@ static HRESULT WINAPI xmlnode_get_dataType( switch ( This->node->type ) { case XML_ELEMENT_NODE: - pVal = xmlGetNsProp(This->node, (xmlChar*)"dt", - (xmlChar*)"urn:schemas-microsoft-com:datatypes"); + pVal = xmlGetNsProp(This->node, (const xmlChar*)"dt", + (const xmlChar*)"urn:schemas-microsoft-com:datatypes"); if (pVal) { V_VT(dataTypeName) = VT_BSTR; @@ -1260,20 +1261,20 @@ static HRESULT WINAPI xmlnode_put_dataType( xmlAttrPtr pAttr = NULL; xmlChar* str = xmlChar_from_wchar(dataTypeName); - pAttr = xmlHasNsProp(This->node, (xmlChar*)"dt", - (xmlChar*)"urn:schemas-microsoft-com:datatypes"); + pAttr = xmlHasNsProp(This->node, (const xmlChar*)"dt", + (const xmlChar*)"urn:schemas-microsoft-com:datatypes"); if (pAttr) { - pAttr = xmlSetNsProp(This->node, pAttr->ns, (xmlChar*)"dt", str); + pAttr = xmlSetNsProp(This->node, pAttr->ns, (const xmlChar*)"dt", str); hr = S_OK; } else { - pNS = xmlNewNs(This->node, (xmlChar*)"urn:schemas-microsoft-com:datatypes", (xmlChar*)"dt"); + pNS = xmlNewNs(This->node, (const xmlChar*)"urn:schemas-microsoft-com:datatypes", (const xmlChar*)"dt"); if(pNS) { - pAttr = xmlNewNsProp(This->node, pNS, (xmlChar*)"dt", str); + pAttr = xmlNewNsProp(This->node, pNS, (const xmlChar*)"dt", str); if(pAttr) { xmlAddChild(This->node, (xmlNodePtr)pAttr); @@ -1294,8 +1295,6 @@ static HRESULT WINAPI xmlnode_put_dataType( static BSTR EnsureCorrectEOL(BSTR sInput) { - static const WCHAR SZ_RETURN[] = {'\n',0}; - static const WCHAR SZ_LINEFEED[] = {'\r',0}; int nNum = 0; BSTR sNew; int nLen; @@ -1305,7 +1304,7 @@ static BSTR EnsureCorrectEOL(BSTR sInput) /* Count line endings */ for(i=0; i < nLen; i++) { - if(sInput[i] == SZ_RETURN[0]) + if(sInput[i] == '\n') nNum++; } @@ -1318,9 +1317,9 @@ static BSTR EnsureCorrectEOL(BSTR sInput) sNew = SysAllocStringLen(NULL, nLen + nNum+1); for(i=0; i < nLen; i++) { - if(sInput[i] == SZ_RETURN[0]) + if(sInput[i] == '\n') { - sNew[i+nPlace] = SZ_LINEFEED[0]; + sNew[i+nPlace] = '\r'; nPlace++; } sNew[i+nPlace] = sInput[i]; @@ -1371,7 +1370,7 @@ static BSTR EnsureNoEncoding(BSTR sInput) /* * We are trying to replicate the same behaviour as msxml by converting - * line endings to \r\n and using idents as \t. The problem is that msxml + * line endings to \r\n and using indents as \t. The problem is that msxml * only formats nodes that have a line ending. Using libxml we cannot * reproduce behaviour exactly. * @@ -1402,7 +1401,7 @@ static HRESULT WINAPI xmlnode_get_xml( /* Attribute Nodes return a space in front of their name */ pContent = xmlBufferContent(pXmlBuf); - if( ((char*)pContent)[0] == ' ') + if( ((const char*)pContent)[0] == ' ') bstrContent = bstr_from_xmlChar(pContent+1); else bstrContent = bstr_from_xmlChar(pContent); @@ -1550,8 +1549,9 @@ static HRESULT WINAPI xmlnode_get_parsed( VARIANT_BOOL* isParsed) { xmlnode *This = impl_from_IXMLDOMNode( iface ); - FIXME("(%p)->(%p)\n", This, isParsed); - return E_NOTIMPL; + FIXME("(%p)->(%p) stub!\n", This, isParsed); + *isParsed = VARIANT_TRUE; + return S_OK; } static HRESULT WINAPI xmlnode_get_namespaceURI( From 590cff7bd18dc92d414690454d4fdab624155e4b Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 17:36:44 +0000 Subject: [PATCH 162/261] - Add Wow64* functions declarations to winbase.h - Export Wow64* functions in kernel32, because 32bit Windows also exports them. - Sync ole32, oleaut32 with Wine-1.1.43. svn path=/trunk/; revision=46959 --- reactos/dll/win32/kernel32/kernel32.pspec | 2 - reactos/dll/win32/ole32/compobj.c | 4 +- reactos/dll/win32/ole32/ftmarshal.c | 29 ++-- reactos/dll/win32/ole32/ifs.c | 175 ---------------------- reactos/dll/win32/ole32/moniker.c | 3 + reactos/dll/win32/ole32/ole32.rbuild | 1 + reactos/dll/win32/ole32/rpc.c | 56 ++++--- reactos/dll/win32/ole32/storage32.c | 125 +++++++++++----- reactos/dll/win32/ole32/storage32.h | 9 ++ reactos/dll/win32/oleaut32/olepicture.c | 2 +- reactos/dll/win32/oleaut32/regsvr.c | 6 + reactos/dll/win32/oleaut32/typelib.c | 115 +++++++------- reactos/dll/win32/oleaut32/typelib2.c | 4 +- reactos/dll/win32/oleaut32/vartype.c | 2 +- reactos/include/psdk/winbase.h | 3 + 15 files changed, 232 insertions(+), 304 deletions(-) diff --git a/reactos/dll/win32/kernel32/kernel32.pspec b/reactos/dll/win32/kernel32/kernel32.pspec index b952a287b5d..cba32d9f29d 100644 --- a/reactos/dll/win32/kernel32/kernel32.pspec +++ b/reactos/dll/win32/kernel32/kernel32.pspec @@ -966,11 +966,9 @@ @ stdcall WaitNamedPipeW (wstr long) @ stdcall WideCharToMultiByte(long long wstr long ptr long ptr ptr) @ stdcall WinExec(str long) -#ifdef _M_AMD64 @ stdcall Wow64EnableWow64FsRedirection(long) @ stdcall Wow64DisableWow64FsRedirection(long) @ stdcall Wow64RevertWow64FsRedirection(long) -#endif @ stdcall WriteConsoleA(long ptr long ptr ptr) @ stdcall WriteConsoleInputA(long ptr long ptr) @ stdcall WriteConsoleInputVDMA(long long long long) diff --git a/reactos/dll/win32/ole32/compobj.c b/reactos/dll/win32/ole32/compobj.c index 0625c0b8949..0fb074dc50c 100644 --- a/reactos/dll/win32/ole32/compobj.c +++ b/reactos/dll/win32/ole32/compobj.c @@ -1506,7 +1506,7 @@ HRESULT WINAPI CoCreateGuid(GUID *pguid) * SEE ALSO * StringFromCLSID */ -static HRESULT __CLSIDFromString(LPCWSTR s, CLSID *id) +static HRESULT __CLSIDFromString(LPCWSTR s, LPCLSID id) { int i; BYTE table[256]; @@ -4153,11 +4153,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) case DLL_PROCESS_ATTACH: hProxyDll = hinstDLL; COMPOBJ_InitProcess(); - if (TRACE_ON(ole)) CoRegisterMallocSpy((LPVOID)-1); break; case DLL_PROCESS_DETACH: - if (TRACE_ON(ole)) CoRevokeMallocSpy(); OLEDD_UnInitialize(); COMPOBJ_UninitProcess(); RPC_UnregisterAllChannelHooks(); diff --git a/reactos/dll/win32/ole32/ftmarshal.c b/reactos/dll/win32/ole32/ftmarshal.c index 13802854fa6..d8f4bf649b8 100644 --- a/reactos/dll/win32/ole32/ftmarshal.c +++ b/reactos/dll/win32/ole32/ftmarshal.c @@ -204,8 +204,11 @@ FTMarshalImpl_MarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid, vo hres = IStream_Write (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; - hres = IStream_Write (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_MEDIUMFULL; + if (sizeof(object) == sizeof(DWORD)) + { + hres = IStream_Write (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_MEDIUMFULL; + } hres = IStream_Write (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; @@ -237,10 +240,13 @@ FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid, hres = IStream_Read (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_READFAULT; - hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_READFAULT; - if (constant != 0) - FIXME("constant is 0x%x instead of 0\n", constant); + if (sizeof(object) == sizeof(DWORD)) + { + hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_READFAULT; + if (constant != 0) + FIXME("constant is 0x%x instead of 0\n", constant); + } hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_READFAULT; @@ -267,10 +273,13 @@ static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData (LPMARSHAL iface, IStream hres = IStream_Read (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_READFAULT; - hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_READFAULT; - if (constant != 0) - FIXME("constant is 0x%x instead of 0\n", constant); + if (sizeof(object) == sizeof(DWORD)) + { + hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_READFAULT; + if (constant != 0) + FIXME("constant is 0x%x instead of 0\n", constant); + } hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_READFAULT; diff --git a/reactos/dll/win32/ole32/ifs.c b/reactos/dll/win32/ole32/ifs.c index dc625bcc99e..c6a6962cd72 100644 --- a/reactos/dll/win32/ole32/ifs.c +++ b/reactos/dll/win32/ole32/ifs.c @@ -359,173 +359,6 @@ static const IMallocVtbl VT_IMalloc32 = IMalloc_fnHeapMinimize }; -/****************************************************************************** - * IMallocSpy implementation - *****************************************************************************/ - -/* set the vtable later */ -static const IMallocSpyVtbl VT_IMallocSpy; - -typedef struct { - const IMallocSpyVtbl *lpVtbl; - LONG ref; -} _MallocSpy; - -/* this is the static object instance */ -static _MallocSpy MallocSpy = {&VT_IMallocSpy, 0}; - -/****************************************************************************** - * IMalloc32_QueryInterface [VTABLE] - */ -static HRESULT WINAPI IMallocSpy_fnQueryInterface(LPMALLOCSPY iface,REFIID refiid,LPVOID *obj) -{ - - TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); - - if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMallocSpy,refiid)) { - *obj = &MallocSpy; - return S_OK; - } - return E_NOINTERFACE; -} - -/****************************************************************************** - * IMalloc32_AddRef [VTABLE] - */ -static ULONG WINAPI IMallocSpy_fnAddRef (LPMALLOCSPY iface) -{ - - _MallocSpy *This = (_MallocSpy *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE ("(%p)->(count=%u)\n", This, ref - 1); - - return ref; -} - -/****************************************************************************** - * IMalloc32_AddRelease [VTABLE] - * - * NOTES - * Our MallocSpy is static. If the count reaches 0 we dump the leaks - */ -static ULONG WINAPI IMallocSpy_fnRelease (LPMALLOCSPY iface) -{ - - _MallocSpy *This = (_MallocSpy *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE ("(%p)->(count=%u)\n", This, ref + 1); - - if (!ref) { - /* our allocation list MUST be empty here */ - } - return ref; -} - -static ULONG WINAPI IMallocSpy_fnPreAlloc(LPMALLOCSPY iface, ULONG cbRequest) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%u)\n", This, cbRequest); - return cbRequest; -} -static PVOID WINAPI IMallocSpy_fnPostAlloc(LPMALLOCSPY iface, void* pActual) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p)\n", This, pActual); - return pActual; -} - -static PVOID WINAPI IMallocSpy_fnPreFree(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); - return pRequest; -} -static void WINAPI IMallocSpy_fnPostFree(LPMALLOCSPY iface, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%u)\n", This, fSpyed); -} - -static ULONG WINAPI IMallocSpy_fnPreRealloc(LPMALLOCSPY iface, void* pRequest, ULONG cbRequest, void** ppNewRequest, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u %u)\n", This, pRequest, cbRequest, fSpyed); - *ppNewRequest = pRequest; - return cbRequest; -} - -static PVOID WINAPI IMallocSpy_fnPostRealloc(LPMALLOCSPY iface, void* pActual, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u)\n", This, pActual, fSpyed); - return pActual; -} - -static PVOID WINAPI IMallocSpy_fnPreGetSize(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); - return pRequest; -} - -static ULONG WINAPI IMallocSpy_fnPostGetSize(LPMALLOCSPY iface, ULONG cbActual, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%u %u)\n", This, cbActual, fSpyed); - return cbActual; -} - -static PVOID WINAPI IMallocSpy_fnPreDidAlloc(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); - return pRequest; -} - -static int WINAPI IMallocSpy_fnPostDidAlloc(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed, int fActual) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u %u)\n", This, pRequest, fSpyed, fActual); - return fActual; -} - -static void WINAPI IMallocSpy_fnPreHeapMinimize(LPMALLOCSPY iface) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->()\n", This); -} - -static void WINAPI IMallocSpy_fnPostHeapMinimize(LPMALLOCSPY iface) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->()\n", This); -} - -static void MallocSpyDumpLeaks(void) { - TRACE("leaks: %u\n", Malloc32.SpyedAllocationsLeft); -} - -static const IMallocSpyVtbl VT_IMallocSpy = -{ - IMallocSpy_fnQueryInterface, - IMallocSpy_fnAddRef, - IMallocSpy_fnRelease, - IMallocSpy_fnPreAlloc, - IMallocSpy_fnPostAlloc, - IMallocSpy_fnPreFree, - IMallocSpy_fnPostFree, - IMallocSpy_fnPreRealloc, - IMallocSpy_fnPostRealloc, - IMallocSpy_fnPreGetSize, - IMallocSpy_fnPostGetSize, - IMallocSpy_fnPreDidAlloc, - IMallocSpy_fnPostDidAlloc, - IMallocSpy_fnPreHeapMinimize, - IMallocSpy_fnPostHeapMinimize -}; - /****************************************************************************** * CoGetMalloc [OLE32.@] * @@ -620,9 +453,6 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy) TRACE("\n"); - /* HACK TO ACTIVATE OUT SPY */ - if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)&MallocSpy; - if(Malloc32.pSpy) return CO_E_OBJISREG; EnterCriticalSection(&IMalloc32_SpyCS); @@ -661,11 +491,6 @@ HRESULT WINAPI CoRevokeMallocSpy(void) EnterCriticalSection(&IMalloc32_SpyCS); - /* if it's our spy it's time to dump the leaks */ - if (Malloc32.pSpy == (IMallocSpy*)&MallocSpy) { - MallocSpyDumpLeaks(); - } - if (Malloc32.SpyedAllocationsLeft) { TRACE("SpyReleasePending with %u allocations left\n", Malloc32.SpyedAllocationsLeft); Malloc32.SpyReleasePending = TRUE; diff --git a/reactos/dll/win32/ole32/moniker.c b/reactos/dll/win32/ole32/moniker.c index a7c5a11c98b..2fb03ae6650 100644 --- a/reactos/dll/win32/ole32/moniker.c +++ b/reactos/dll/win32/ole32/moniker.c @@ -127,6 +127,7 @@ static BOOL start_rpcss(void) WCHAR cmd[MAX_PATH]; static const WCHAR rpcss[] = {'\\','r','p','c','s','s','.','e','x','e',0}; BOOL rslt; + void *redir; TRACE("\n"); @@ -135,7 +136,9 @@ static BOOL start_rpcss(void) GetSystemDirectoryW( cmd, MAX_PATH - sizeof(rpcss)/sizeof(WCHAR) ); strcatW( cmd, rpcss ); + Wow64DisableWow64FsRedirection( &redir ); rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); + Wow64RevertWow64FsRedirection( redir ); if (rslt) { diff --git a/reactos/dll/win32/ole32/ole32.rbuild b/reactos/dll/win32/ole32/ole32.rbuild index 24f60c87a32..85710a6b20f 100644 --- a/reactos/dll/win32/ole32/ole32.rbuild +++ b/reactos/dll/win32/ole32/ole32.rbuild @@ -20,6 +20,7 @@ ole32_irot_client ole32_proxy rpcrt4 + kernel32 ntdll uuid pseh diff --git a/reactos/dll/win32/ole32/rpc.c b/reactos/dll/win32/ole32/rpc.c index 0daa4ab815d..75b6b1f7ab3 100644 --- a/reactos/dll/win32/ole32/rpc.c +++ b/reactos/dll/win32/ole32/rpc.c @@ -144,6 +144,28 @@ typedef struct /* [size_is((size+7)&~7)] */ unsigned char data[1]; } WIRE_ORPC_EXTENT; +typedef struct +{ + ULONG size; + ULONG reserved; + unsigned char extent[1]; +} WIRE_ORPC_EXTENT_ARRAY; + +typedef struct +{ + ULONG version; + ULONG flags; + ULONG reserved1; + GUID cid; + unsigned char extensions[1]; +} WIRE_ORPCTHIS; + +typedef struct +{ + ULONG flags; + unsigned char extensions[1]; +} WIRE_ORPCTHAT; + struct channel_hook_entry { struct list entry; @@ -503,10 +525,10 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, extensions_size = ChannelHooks_ServerGetSize(&message_state->channel_hook_info, &channel_hook_data, &channel_hook_count, &extension_count); - msg->BufferLength += FIELD_OFFSET(ORPCTHAT, extensions) + 4; + msg->BufferLength += FIELD_OFFSET(WIRE_ORPCTHAT, extensions) + sizeof(DWORD); if (extensions_size) { - msg->BufferLength += FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent) + 2*sizeof(DWORD) + extensions_size; + msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent[2*sizeof(DWORD) + extensions_size]); if (extension_count & 1) msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT, data[0]); } @@ -523,7 +545,7 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, status = I_RpcGetBuffer(msg); orpcthat = msg->Buffer; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHAT, extensions); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHAT, extensions); orpcthat->flags = ORPCF_NULL /* FIXME? */; @@ -533,10 +555,10 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, if (extensions_size) { - ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; + WIRE_ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; orpc_extent_array->size = extension_count; orpc_extent_array->reserved = 0; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); /* NDR representation of orpc_extent_array->extent */ *(DWORD *)msg->Buffer = 1; msg->Buffer = (char *)msg->Buffer + sizeof(DWORD); @@ -645,10 +667,10 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, extensions_size = ChannelHooks_ClientGetSize(&message_state->channel_hook_info, &channel_hook_data, &channel_hook_count, &extension_count); - msg->BufferLength += FIELD_OFFSET(ORPCTHIS, extensions) + 4; + msg->BufferLength += FIELD_OFFSET(WIRE_ORPCTHIS, extensions) + sizeof(DWORD); if (extensions_size) { - msg->BufferLength += FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent) + 2*sizeof(DWORD) + extensions_size; + msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent[2*sizeof(DWORD) + extensions_size]); if (extension_count & 1) msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT, data[0]); } @@ -703,7 +725,7 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, if (status == RPC_S_OK) { orpcthis = msg->Buffer; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHIS, extensions); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHIS, extensions); orpcthis->version.MajorVersion = COM_MAJOR_VERSION; orpcthis->version.MinorVersion = COM_MINOR_VERSION; @@ -720,7 +742,7 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; orpc_extent_array->size = extension_count; orpc_extent_array->reserved = 0; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); /* NDR representation of orpc_extent_array->extent */ *(DWORD *)msg->Buffer = 1; msg->Buffer = (char *)msg->Buffer + sizeof(DWORD); @@ -1152,8 +1174,8 @@ static HRESULT unmarshal_ORPC_EXTENT_ARRAY(RPC_MESSAGE *msg, const char *end, DWORD pointer_id; DWORD i; - memcpy(extensions, msg->Buffer, FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); + memcpy(extensions, msg->Buffer, FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); if ((const char *)msg->Buffer + 2 * sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; @@ -1205,14 +1227,14 @@ static HRESULT unmarshal_ORPCTHIS(RPC_MESSAGE *msg, ORPCTHIS *orpcthis, *first_wire_orpc_extent = NULL; - if (msg->BufferLength < FIELD_OFFSET(ORPCTHIS, extensions) + 4) + if (msg->BufferLength < FIELD_OFFSET(WIRE_ORPCTHIS, extensions) + sizeof(DWORD)) { ERR("invalid buffer length\n"); return RPC_E_INVALID_HEADER; } - memcpy(orpcthis, msg->Buffer, FIELD_OFFSET(ORPCTHIS, extensions)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHIS, extensions); + memcpy(orpcthis, msg->Buffer, FIELD_OFFSET(WIRE_ORPCTHIS, extensions)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHIS, extensions); if ((const char *)msg->Buffer + sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; @@ -1256,14 +1278,14 @@ static HRESULT unmarshal_ORPCTHAT(RPC_MESSAGE *msg, ORPCTHAT *orpcthat, *first_wire_orpc_extent = NULL; - if (msg->BufferLength < FIELD_OFFSET(ORPCTHAT, extensions) + 4) + if (msg->BufferLength < FIELD_OFFSET(WIRE_ORPCTHAT, extensions) + sizeof(DWORD)) { ERR("invalid buffer length\n"); return RPC_E_INVALID_HEADER; } - memcpy(orpcthat, msg->Buffer, FIELD_OFFSET(ORPCTHAT, extensions)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHAT, extensions); + memcpy(orpcthat, msg->Buffer, FIELD_OFFSET(WIRE_ORPCTHAT, extensions)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHAT, extensions); if ((const char *)msg->Buffer + sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; diff --git a/reactos/dll/win32/ole32/storage32.c b/reactos/dll/win32/ole32/storage32.c index f1706da72fb..434d8b24606 100644 --- a/reactos/dll/win32/ole32/storage32.c +++ b/reactos/dll/win32/ole32/storage32.c @@ -2583,6 +2583,7 @@ static HRESULT StorageImpl_Construct( DWORD openFlags, BOOL fileBased, BOOL create, + ULONG sector_size, StorageImpl** result) { StorageImpl* This; @@ -2634,7 +2635,7 @@ static HRESULT StorageImpl_Construct( /* * Initialize the big block cache. */ - This->bigBlockSize = DEF_BIG_BLOCK_SIZE; + This->bigBlockSize = sector_size; This->smallBlockSize = DEF_SMALL_BLOCK_SIZE; This->bigBlockFile = BIGBLOCKFILE_Construct(hFile, pLkbyt, @@ -2665,8 +2666,12 @@ static HRESULT StorageImpl_Construct( This->bigBlockDepotCount = 1; This->bigBlockDepotStart[0] = 0; This->rootStartBlock = 1; + This->smallBlockLimit = LIMIT_TO_USE_SMALL_BLOCK; This->smallBlockDepotStart = BLOCK_END_OF_CHAIN; - This->bigBlockSizeBits = DEF_BIG_BLOCK_SIZE_BITS; + if (sector_size == 4096) + This->bigBlockSizeBits = MAX_BIG_BLOCK_SIZE_BITS; + else + This->bigBlockSizeBits = MIN_BIG_BLOCK_SIZE_BITS; This->smallBlockSizeBits = DEF_SMALL_BLOCK_SIZE_BITS; This->extBigBlockDepotStart = BLOCK_END_OF_CHAIN; This->extBigBlockDepotCount = 0; @@ -2711,6 +2716,8 @@ static HRESULT StorageImpl_Construct( */ This->prevFreeBlock = 0; + This->firstFreeSmallBlock = 0; + /* * Create the block chain abstractions. */ @@ -3348,6 +3355,11 @@ static HRESULT StorageImpl_LoadFileHeader( OFFSET_ROOTSTARTBLOCK, &This->rootStartBlock); + StorageUtl_ReadDWord( + headerBigBlock, + OFFSET_SMALLBLOCKLIMIT, + &This->smallBlockLimit); + StorageUtl_ReadDWord( headerBigBlock, OFFSET_SBDEPOTSTART, @@ -3382,9 +3394,11 @@ static HRESULT StorageImpl_LoadFileHeader( * blocks, just make sure they are what we're expecting. */ if ((This->bigBlockSize != MIN_BIG_BLOCK_SIZE && This->bigBlockSize != MAX_BIG_BLOCK_SIZE) || - This->smallBlockSize != DEF_SMALL_BLOCK_SIZE) + This->smallBlockSize != DEF_SMALL_BLOCK_SIZE || + This->smallBlockLimit != LIMIT_TO_USE_SMALL_BLOCK) { - WARN("Broken OLE storage file\n"); + FIXME("Broken OLE storage file? bigblock=0x%x, smallblock=0x%x, sblimit=0x%x\n", + This->bigBlockSize, This->smallBlockSize, This->smallBlockLimit); hr = STG_E_INVALIDHEADER; } else @@ -3438,7 +3452,6 @@ static void StorageImpl_SaveFileHeader( StorageUtl_WriteWord(headerBigBlock, 0x18, 0x3b); StorageUtl_WriteWord(headerBigBlock, 0x1a, 0x3); StorageUtl_WriteWord(headerBigBlock, 0x1c, (WORD)-2); - StorageUtl_WriteDWord(headerBigBlock, 0x38, (DWORD)0x1000); } /* @@ -3464,6 +3477,11 @@ static void StorageImpl_SaveFileHeader( OFFSET_ROOTSTARTBLOCK, This->rootStartBlock); + StorageUtl_WriteDWord( + headerBigBlock, + OFFSET_SMALLBLOCKLIMIT, + This->smallBlockLimit); + StorageUtl_WriteDWord( headerBigBlock, OFFSET_SBDEPOTSTART, @@ -4341,13 +4359,14 @@ static HRESULT Storage_Construct( DWORD openFlags, BOOL fileBased, BOOL create, + ULONG sector_size, StorageBaseImpl** result) { StorageImpl *newStorage; StorageBaseImpl *newTransactedStorage; HRESULT hr; - hr = StorageImpl_Construct(hFile, pwcsName, pLkbyt, openFlags, fileBased, create, &newStorage); + hr = StorageImpl_Construct(hFile, pwcsName, pLkbyt, openFlags, fileBased, create, sector_size, &newStorage); if (FAILED(hr)) goto end; if (openFlags & STGM_TRANSACTED) @@ -4840,6 +4859,7 @@ static StorageInternalImpl* StorageInternalImpl_Construct( * Initialize the virtual function table. */ newStorage->base.lpVtbl = &Storage32InternalImpl_Vtbl; + newStorage->base.pssVtbl = &IPropertySetStorage_Vtbl; newStorage->base.baseVtbl = &StorageInternalImpl_BaseVtbl; newStorage->base.openFlags = (openFlags & ~STGM_CREATE); @@ -5710,7 +5730,7 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock( ULARGE_INTEGER offsetOfBlockInDepot; DWORD buffer; ULONG bytesRead; - ULONG blockIndex = 0; + ULONG blockIndex = This->parentStorage->firstFreeSmallBlock; ULONG nextBlockIndex = BLOCK_END_OF_CHAIN; HRESULT res = S_OK; ULONG smallBlocksPerBigBlock; @@ -5819,6 +5839,8 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock( } } + This->parentStorage->firstFreeSmallBlock = blockIndex+1; + smallBlocksPerBigBlock = This->parentStorage->bigBlockSize / This->parentStorage->smallBlockSize; @@ -6117,6 +6139,7 @@ static BOOL SmallBlockChainStream_Shrink( &blockIndex))) return FALSE; SmallBlockChainStream_FreeBlock(This, extraBlock); + This->parentStorage->firstFreeSmallBlock = min(This->parentStorage->firstFreeSmallBlock, extraBlock); extraBlock = blockIndex; } @@ -6293,30 +6316,13 @@ static ULARGE_INTEGER SmallBlockChainStream_GetSize(SmallBlockChainStream* This) return chainEntry.size; } -/****************************************************************************** - * StgCreateDocfile [OLE32.@] - * Creates a new compound file storage object - * - * PARAMS - * pwcsName [ I] Unicode string with filename (can be relative or NULL) - * grfMode [ I] Access mode for opening the new storage object (see STGM_ constants) - * reserved [ ?] unused?, usually 0 - * ppstgOpen [IO] A pointer to IStorage pointer to the new onject - * - * RETURNS - * S_OK if the file was successfully created - * some STG_E_ value if error - * NOTES - * if pwcsName is NULL, create file with new unique name - * the function can returns - * STG_S_CONVERTED if the specified file was successfully converted to storage format - * (unrealized now) - */ -HRESULT WINAPI StgCreateDocfile( +static HRESULT create_storagefile( LPCOLESTR pwcsName, DWORD grfMode, - DWORD reserved, - IStorage **ppstgOpen) + DWORD grfAttrs, + STGOPTIONS* pStgOptions, + REFIID riid, + void** ppstgOpen) { StorageBaseImpl* newStorage = 0; HANDLE hFile = INVALID_HANDLE_VALUE; @@ -6327,13 +6333,10 @@ HRESULT WINAPI StgCreateDocfile( DWORD fileAttributes; WCHAR tempFileName[MAX_PATH]; - TRACE("(%s, %x, %d, %p)\n", - debugstr_w(pwcsName), grfMode, - reserved, ppstgOpen); - if (ppstgOpen == 0) return STG_E_INVALIDPOINTER; - if (reserved != 0) + + if (pStgOptions->ulSectorSize != MIN_BIG_BLOCK_SIZE && pStgOptions->ulSectorSize != MAX_BIG_BLOCK_SIZE) return STG_E_INVALIDPARAMETER; /* if no share mode given then DENY_NONE is the default */ @@ -6435,6 +6438,7 @@ HRESULT WINAPI StgCreateDocfile( grfMode, TRUE, TRUE, + pStgOptions->ulSectorSize, &newStorage); if (FAILED(hr)) @@ -6442,10 +6446,9 @@ HRESULT WINAPI StgCreateDocfile( goto end; } - /* - * Get an "out" pointer for the caller. - */ - *ppstgOpen = (IStorage*)newStorage; + hr = IStorage_QueryInterface((IStorage*)newStorage, riid, ppstgOpen); + + IStorage_Release((IStorage*)newStorage); end: TRACE("<-- %p r = %08x\n", *ppstgOpen, hr); @@ -6453,6 +6456,45 @@ end: return hr; } +/****************************************************************************** + * StgCreateDocfile [OLE32.@] + * Creates a new compound file storage object + * + * PARAMS + * pwcsName [ I] Unicode string with filename (can be relative or NULL) + * grfMode [ I] Access mode for opening the new storage object (see STGM_ constants) + * reserved [ ?] unused?, usually 0 + * ppstgOpen [IO] A pointer to IStorage pointer to the new onject + * + * RETURNS + * S_OK if the file was successfully created + * some STG_E_ value if error + * NOTES + * if pwcsName is NULL, create file with new unique name + * the function can returns + * STG_S_CONVERTED if the specified file was successfully converted to storage format + * (unrealized now) + */ +HRESULT WINAPI StgCreateDocfile( + LPCOLESTR pwcsName, + DWORD grfMode, + DWORD reserved, + IStorage **ppstgOpen) +{ + STGOPTIONS stgoptions = {1, 0, 512}; + + TRACE("(%s, %x, %d, %p)\n", + debugstr_w(pwcsName), grfMode, + reserved, ppstgOpen); + + if (ppstgOpen == 0) + return STG_E_INVALIDPOINTER; + if (reserved != 0) + return STG_E_INVALIDPARAMETER; + + return create_storagefile(pwcsName, grfMode, 0, &stgoptions, &IID_IStorage, (void**)ppstgOpen); +} + /****************************************************************************** * StgCreateStorageEx [OLE32.@] */ @@ -6481,10 +6523,10 @@ HRESULT WINAPI StgCreateStorageEx(const WCHAR* pwcsName, DWORD grfMode, DWORD st if (stgfmt == STGFMT_STORAGE || stgfmt == STGFMT_DOCFILE) { - FIXME("Stub: calling StgCreateDocfile, but ignoring pStgOptions and grfAttrs\n"); - return StgCreateDocfile(pwcsName, grfMode, 0, (IStorage **)ppObjectOpen); + return create_storagefile(pwcsName, grfMode, grfAttrs, pStgOptions, riid, ppObjectOpen); } + ERR("Invalid stgfmt argument\n"); return STG_E_INVALIDPARAMETER; } @@ -6707,6 +6749,7 @@ HRESULT WINAPI StgOpenStorage( grfMode, TRUE, FALSE, + 512, &newStorage); if (FAILED(hr)) @@ -6754,6 +6797,7 @@ HRESULT WINAPI StgCreateDocfileOnILockBytes( grfMode, FALSE, TRUE, + 512, &newStorage); if (FAILED(hr)) @@ -6801,6 +6845,7 @@ HRESULT WINAPI StgOpenStorageOnILockBytes( grfMode, FALSE, FALSE, + 512, &newStorage); if (FAILED(hr)) diff --git a/reactos/dll/win32/ole32/storage32.h b/reactos/dll/win32/ole32/storage32.h index fad5d7766f7..36a7d679af6 100644 --- a/reactos/dll/win32/ole32/storage32.h +++ b/reactos/dll/win32/ole32/storage32.h @@ -46,6 +46,7 @@ static const ULONG OFFSET_BIGBLOCKSIZEBITS = 0x0000001e; static const ULONG OFFSET_SMALLBLOCKSIZEBITS = 0x00000020; static const ULONG OFFSET_BBDEPOTCOUNT = 0x0000002C; static const ULONG OFFSET_ROOTSTARTBLOCK = 0x00000030; +static const ULONG OFFSET_SMALLBLOCKLIMIT = 0x00000038; static const ULONG OFFSET_SBDEPOTSTART = 0x0000003C; static const ULONG OFFSET_SBDEPOTCOUNT = 0x00000040; static const ULONG OFFSET_EXTBBDEPOTSTART = 0x00000044; @@ -65,6 +66,8 @@ static const ULONG OFFSET_PS_MTIMEHIGH = 0x00000070; static const ULONG OFFSET_PS_STARTBLOCK = 0x00000074; static const ULONG OFFSET_PS_SIZE = 0x00000078; static const WORD DEF_BIG_BLOCK_SIZE_BITS = 0x0009; +static const WORD MIN_BIG_BLOCK_SIZE_BITS = 0x0009; +static const WORD MAX_BIG_BLOCK_SIZE_BITS = 0x000c; static const WORD DEF_SMALL_BLOCK_SIZE_BITS = 0x0006; static const WORD DEF_BIG_BLOCK_SIZE = 0x0200; static const WORD DEF_SMALL_BLOCK_SIZE = 0x0040; @@ -97,6 +100,8 @@ static const ULONG DIRENTRY_NULL = 0xFFFFFFFF; #define STGTY_ROOT 0x05 #define COUNT_BBDEPOTINHEADER 109 + +/* FIXME: This value is stored in the header, but we hard-code it to 0x1000. */ #define LIMIT_TO_USE_SMALL_BLOCK 0x1000 #define STGM_ACCESS_MODE(stgm) ((stgm)&0x0000f) @@ -351,6 +356,7 @@ struct StorageImpl ULONG smallBlockSize; ULONG bigBlockDepotCount; ULONG rootStartBlock; + ULONG smallBlockLimit; ULONG smallBlockDepotStart; ULONG extBigBlockDepotStart; ULONG extBigBlockDepotCount; @@ -360,6 +366,9 @@ struct StorageImpl ULONG indexBlockDepotCached; ULONG prevFreeBlock; + /* All small blocks before this one are known to be in use. */ + ULONG firstFreeSmallBlock; + /* * Abstraction of the big block chains for the chains of the header. */ diff --git a/reactos/dll/win32/oleaut32/olepicture.c b/reactos/dll/win32/oleaut32/olepicture.c index 7a5bc29a4e5..c7a3411cf04 100644 --- a/reactos/dll/win32/oleaut32/olepicture.c +++ b/reactos/dll/win32/oleaut32/olepicture.c @@ -1273,7 +1273,7 @@ static HRESULT OLEPictureImpl_LoadEnhMetafile(OLEPictureImpl *This, static HRESULT OLEPictureImpl_LoadAPM(OLEPictureImpl *This, const BYTE *data, ULONG size) { - APM_HEADER *header = (APM_HEADER *)data; + const APM_HEADER *header = (const APM_HEADER *)data; HMETAFILE hmf; if (size < sizeof(APM_HEADER)) diff --git a/reactos/dll/win32/oleaut32/regsvr.c b/reactos/dll/win32/oleaut32/regsvr.c index 12f64faa516..f97544f51ed 100644 --- a/reactos/dll/win32/oleaut32/regsvr.c +++ b/reactos/dll/win32/oleaut32/regsvr.c @@ -480,6 +480,12 @@ static struct regsvr_coclass const coclass_list[] = { "Obsolete Font", "OldFont" }, + { &IID_ISupportErrorInfo, + "PSSupportErrorInfo", + "ole2disp.dll", + "oleaut32.dll", + NULL + }, { NULL } /* list terminator */ }; diff --git a/reactos/dll/win32/oleaut32/typelib.c b/reactos/dll/win32/oleaut32/typelib.c index b09f7ab64d1..5792cc51870 100644 --- a/reactos/dll/win32/oleaut32/typelib.c +++ b/reactos/dll/win32/oleaut32/typelib.c @@ -283,30 +283,9 @@ static WCHAR *get_lcid_subkey( LCID lcid, SYSKIND syskind, WCHAR *buffer ) static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath, ITypeLib2 **ppTypeLib); -/**************************************************************************** - * QueryPathOfRegTypeLib [OLEAUT32.164] - * - * Gets the path to a registered type library. - * - * PARAMS - * guid [I] referenced guid - * wMaj [I] major version - * wMin [I] minor version - * lcid [I] locale id - * path [O] path of typelib - * - * RETURNS - * Success: S_OK. - * Failure: If the type library is not registered then TYPE_E_LIBNOTREGISTERED - * or TYPE_E_REGISTRYACCESS if the type library registration key couldn't be - * opened. - */ -HRESULT WINAPI QueryPathOfRegTypeLib( - REFGUID guid, - WORD wMaj, - WORD wMin, - LCID lcid, - LPBSTR path ) +/* Get the path to a registered type library. Helper for QueryPathOfRegTypeLib. */ +static HRESULT query_typelib_path( REFGUID guid, WORD wMaj, WORD wMin, + SYSKIND syskind, LCID lcid, LPBSTR path ) { HRESULT hr = TYPE_E_LIBNOTREGISTERED; LCID myLCID = lcid; @@ -336,7 +315,7 @@ HRESULT WINAPI QueryPathOfRegTypeLib( { LONG dwPathLen = sizeof(Path); - get_lcid_subkey( myLCID, SYS_WIN32, buffer ); + get_lcid_subkey( myLCID, syskind, buffer ); if (RegQueryValueW(hkey, buffer, Path, &dwPathLen)) { @@ -368,6 +347,29 @@ HRESULT WINAPI QueryPathOfRegTypeLib( return hr; } +/**************************************************************************** + * QueryPathOfRegTypeLib [OLEAUT32.164] + * + * Gets the path to a registered type library. + * + * PARAMS + * guid [I] referenced guid + * wMaj [I] major version + * wMin [I] minor version + * lcid [I] locale id + * path [O] path of typelib + * + * RETURNS + * Success: S_OK. + * Failure: If the type library is not registered then TYPE_E_LIBNOTREGISTERED + * or TYPE_E_REGISTRYACCESS if the type library registration key couldn't be + * opened. + */ +HRESULT WINAPI QueryPathOfRegTypeLib( REFGUID guid, WORD wMaj, WORD wMin, LCID lcid, LPBSTR path ) +{ + return query_typelib_path( guid, wMaj, wMin, SYS_WIN32, lcid, path ); +} + /****************************************************************************** * CreateTypeLib [OLEAUT32.160] creates a typelib * @@ -691,7 +693,10 @@ HRESULT WINAPI RegisterTypeLib( MESSAGE("\n"); } - if (tattr->wTypeFlags & (TYPEFLAG_FOLEAUTOMATION|TYPEFLAG_FDUAL|TYPEFLAG_FDISPATCHABLE)) + /* Register all dispinterfaces (which includes dual interfaces) and + oleautomation interfaces */ + if ((kind == TKIND_INTERFACE && (tattr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) || + kind == TKIND_DISPATCH) { /* register interface<->typelib coupling */ get_interface_key( &tattr->guid, keyName ); @@ -796,7 +801,7 @@ HRESULT WINAPI UnRegisterTypeLib( } /* get the path to the typelib on disk */ - if (QueryPathOfRegTypeLib(libid, wVerMajor, wVerMinor, lcid, &tlibPath) != S_OK) { + if (query_typelib_path(libid, wVerMajor, wVerMinor, syskind, lcid, &tlibPath) != S_OK) { result = E_INVALIDARG; goto end; } @@ -832,19 +837,23 @@ HRESULT WINAPI UnRegisterTypeLib( goto enddeleteloop; } - /* the path to the type */ - get_interface_key( &typeAttr->guid, subKeyName ); + if ((kind == TKIND_INTERFACE && (typeAttr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) || + kind == TKIND_DISPATCH) + { + /* the path to the type */ + get_interface_key( &typeAttr->guid, subKeyName ); - /* Delete its bits */ - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) { - goto enddeleteloop; + /* Delete its bits */ + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) + goto enddeleteloop; + + RegDeleteKeyW(subKey, ProxyStubClsidW); + RegDeleteKeyW(subKey, ProxyStubClsid32W); + RegDeleteKeyW(subKey, TypeLibW); + RegCloseKey(subKey); + subKey = NULL; + RegDeleteKeyW(HKEY_CLASSES_ROOT, subKeyName); } - RegDeleteKeyW(subKey, ProxyStubClsidW); - RegDeleteKeyW(subKey, ProxyStubClsid32W); - RegDeleteKeyW(subKey, TypeLibW); - RegCloseKey(subKey); - subKey = NULL; - RegDeleteKeyW(HKEY_CLASSES_ROOT, subKeyName); enddeleteloop: if (typeAttr) ITypeInfo_ReleaseTypeAttr(typeInfo, typeAttr); @@ -1901,7 +1910,7 @@ MSFT_DoFuncs(TLBContext* pcx, { if (!IS_INTRESOURCE(pFuncRec->OptAttr[2])) ERR("ordinal 0x%08x invalid, IS_INTRESOURCE is false\n", pFuncRec->OptAttr[2]); - (*pptfd)->Entry = (BSTR)pFuncRec->OptAttr[2]; + (*pptfd)->Entry = (BSTR)(DWORD_PTR)LOWORD(pFuncRec->OptAttr[2]); } else { @@ -2927,7 +2936,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) else if(td[0] == VT_CARRAY) { /* array descr table here */ - pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)((int) td[2]); /* temp store offset in*/ + pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)(INT_PTR)td[2]; /* temp store offset in*/ } else if(td[0] == VT_USERDEFINED) { @@ -2942,7 +2951,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) if(pTypeLibImpl->pTypeDesc[i].vt != VT_CARRAY) continue; if(tlbSegDir.pArrayDescriptions.offset>0) { - MSFT_ReadLEWords(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (int) pTypeLibImpl->pTypeDesc[i].u.lpadesc); + MSFT_ReadLEWords(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (INT_PTR)pTypeLibImpl->pTypeDesc[i].u.lpadesc); pTypeLibImpl->pTypeDesc[i].u.lpadesc = TLB_Alloc(sizeof(ARRAYDESC)+sizeof(SAFEARRAYBOUND)*(td[3]-1)); if(td[1]<0) @@ -4779,13 +4788,7 @@ static HRESULT WINAPI ITypeLibComp_fnBind( &subtypeinfo, &subdesckind, &subbindptr); if (SUCCEEDED(hr) && (subdesckind != DESCKIND_NONE)) { - TYPEDESC tdesc_appobject = - { - { - (TYPEDESC *)pTypeInfo->hreftype - }, - VT_USERDEFINED - }; + TYPEDESC tdesc_appobject; const VARDESC vardesc_appobject = { -2, /* memid */ @@ -4807,6 +4810,9 @@ static HRESULT WINAPI ITypeLibComp_fnBind( VAR_STATIC /* varkind */ }; + tdesc_appobject.u.hreftype = pTypeInfo->hreftype; + tdesc_appobject.vt = VT_USERDEFINED; + TRACE("found in implicit app object: %s\n", debugstr_w(szName)); /* cleanup things filled in by Bind call so we can put our @@ -5696,7 +5702,8 @@ _invoke(FARPROC func,CALLCONV callconv, int nrargs, DWORD *args) { if (TRACE_ON(ole)) { int i; TRACE("Calling %p(",func); - for (i=0;i 30) TRACE("..."); TRACE(")\n"); } @@ -6102,10 +6109,11 @@ static HRESULT WINAPI ITypeInfo_fnInvoke( continue; } + src_arg = NULL; + if (cNamedArgs) { USHORT j; - src_arg = NULL; for (j = 0; j < cNamedArgs; j++) if (rgdispidNamedArgs[j] == i || (i == func_desc->cParams-1 && rgdispidNamedArgs[j] == DISPID_PROPERTYPUT)) { @@ -6113,9 +6121,10 @@ static HRESULT WINAPI ITypeInfo_fnInvoke( break; } } - else + + if (!src_arg && vargs_converted + cNamedArgs < pDispParams->cArgs) { - src_arg = vargs_converted < pDispParams->cArgs ? &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted] : NULL; + src_arg = &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted]; vargs_converted++; } @@ -6596,7 +6605,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDllEntry( ITypeInfo2 *iface, MEMBERID memid if (pBstrName) *pBstrName = NULL; if (pwOrdinal) - *pwOrdinal = (DWORD)pFDesc->Entry; + *pwOrdinal = LOWORD(pFDesc->Entry); return S_OK; } return TYPE_E_ELEMENTNOTFOUND; diff --git a/reactos/dll/win32/oleaut32/typelib2.c b/reactos/dll/win32/oleaut32/typelib2.c index 6b1aea062ba..a93e5a4962a 100644 --- a/reactos/dll/win32/oleaut32/typelib2.c +++ b/reactos/dll/win32/oleaut32/typelib2.c @@ -2456,7 +2456,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut( return hres; } - This->typeinfo->cbSizeVft = typeattr->cbSizeVft; + This->typeinfo->cbSizeVft = typeattr->cbSizeVft * 4 / sizeof(void *); ITypeInfo_ReleaseTypeAttr(inherited, typeattr); ITypeInfo_Release(inherited); @@ -2928,7 +2928,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetTypeAttr( (*ppTypeAttr)->cFuncs += 7; (*ppTypeAttr)->cVars = This->typeinfo->cElement>>16; (*ppTypeAttr)->cImplTypes = This->typeinfo->cImplTypes; - (*ppTypeAttr)->cbSizeVft = This->typekind==TKIND_DISPATCH ? 28 : This->typeinfo->cbSizeVft; + (*ppTypeAttr)->cbSizeVft = This->typekind==TKIND_DISPATCH ? 7 * sizeof(void*) : This->typeinfo->cbSizeVft; (*ppTypeAttr)->cbAlignment = (This->typeinfo->typekind>>11) & 0x1f; (*ppTypeAttr)->wTypeFlags = This->typeinfo->flags; (*ppTypeAttr)->wMajorVerNum = This->typeinfo->version&0xffff; diff --git a/reactos/dll/win32/oleaut32/vartype.c b/reactos/dll/win32/oleaut32/vartype.c index da1288d4a7c..cfd5e8f8353 100644 --- a/reactos/dll/win32/oleaut32/vartype.c +++ b/reactos/dll/win32/oleaut32/vartype.c @@ -3503,7 +3503,7 @@ HRESULT WINAPI VarCyFromR4(FLOAT fltIn, CY* pCyOut) */ HRESULT WINAPI VarCyFromR8(double dblIn, CY* pCyOut) { -#if defined(__GNUC__) && defined(__i386__) +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) /* This code gives identical results to Win32 on Intel. * Here we use fp exceptions to catch overflows when storing the value. */ diff --git a/reactos/include/psdk/winbase.h b/reactos/include/psdk/winbase.h index 6b38dacb365..79c52ac5579 100644 --- a/reactos/include/psdk/winbase.h +++ b/reactos/include/psdk/winbase.h @@ -2301,6 +2301,9 @@ VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE); VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE); #endif BOOL WINAPI WinLoadTrustProvider(GUID*); +BOOL WINAPI Wow64DisableWow64FsRedirection(PVOID*); +BOOLEAN WINAPI Wow64EnableWow64FsRedirection(BOOLEAN); +BOOL WINAPI Wow64RevertWow64FsRedirection(PVOID); BOOL WINAPI WriteFile(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED); BOOL WINAPI WriteFileEx(HANDLE,LPCVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); BOOL WINAPI WriteFileGather(HANDLE,FILE_SEGMENT_ELEMENT*,DWORD,LPDWORD,LPOVERLAPPED); From b88a39e105b5545d31ed3293d35882956ac0a88e Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 20 Apr 2010 18:36:39 +0000 Subject: [PATCH 163/261] [User32] - Dmitry Timoshkov : Do not ask DrawFrameControl() to modify the passed in rectangle. - Nikolay Sivov : Set WM_EXITMENULOOP wParam same way as for WM_ENTERMENULOOP. svn path=/trunk/; revision=46961 --- reactos/dll/win32/user32/controls/button.c | 13 ++++--------- reactos/dll/win32/user32/windows/menu.c | 10 +++++----- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/reactos/dll/win32/user32/controls/button.c b/reactos/dll/win32/user32/controls/button.c index 1f448bd1885..8b4003bbe58 100644 --- a/reactos/dll/win32/user32/controls/button.c +++ b/reactos/dll/win32/user32/controls/button.c @@ -829,7 +829,7 @@ static void BUTTON_DrawLabel(HWND hwnd, HDC hdc, UINT dtFlags, const RECT *rc) */ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) { - RECT rc, focus_rect, r; + RECT rc, r; UINT dtFlags, uState; HPEN hOldPen; HBRUSH hOldBrush; @@ -865,13 +865,11 @@ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); InflateRect( &rc, -1, -1 ); } - - focus_rect = rc; /* completely skip the drawing if only focus has changed */ if (action == ODA_FOCUS) goto draw_focus; - uState = DFCS_BUTTONPUSH | DFCS_ADJUSTRECT; + uState = DFCS_BUTTONPUSH; if (style & BS_FLAT) uState |= DFCS_MONO; @@ -898,8 +896,6 @@ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) if (pushedState) OffsetRect(&r, 1, 1); - IntersectClipRect(hDC, rc.left, rc.top, rc.right, rc.bottom); - oldTxtColor = SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) ); BUTTON_DrawLabel(hwnd, hDC, dtFlags, &r); @@ -912,9 +908,8 @@ draw_focus: { if (!(get_ui_state(hwnd) & UISF_HIDEFOCUS)) { - InflateRect( &focus_rect, -1, -1 ); - IntersectRect(&focus_rect, &focus_rect, &rc); - DrawFocusRect( hDC, &focus_rect ); + InflateRect( &rc, -2, -2 ); + DrawFocusRect( hDC, &rc ); } } diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index ade437c840a..1178558dda0 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -3524,11 +3524,11 @@ static BOOL FASTCALL MenuInitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT /*********************************************************************** * MenuExitTracking */ -static BOOL FASTCALL MenuExitTracking(HWND hWnd) +static BOOL FASTCALL MenuExitTracking(HWND hWnd, BOOL bPopup) { TRACE("hwnd=%p\n", hWnd); - SendMessageW( hWnd, WM_EXITMENULOOP, 0, 0 ); + SendMessageW( hWnd, WM_EXITMENULOOP, bPopup, 0 ); ShowCaret(0); top_popup = 0; top_popup_hmenu = NULL; @@ -3558,7 +3558,7 @@ VOID MenuTrackMouseMenuBar( HWND hWnd, ULONG ht, POINT pt) MenuInitTracking(hWnd, hMenu, FALSE, wFlags); MenuTrackMenu(hMenu, wFlags, pt.x, pt.y, hWnd, NULL); - MenuExitTracking(hWnd); + MenuExitTracking(hWnd, FALSE); } } @@ -3633,7 +3633,7 @@ VOID MenuTrackKbdMenuBar(HWND hwnd, UINT wParam, WCHAR wChar) track_menu: MenuTrackMenu( hTrackMenu, wFlags, 0, 0, hwnd, NULL ); - MenuExitTracking( hwnd ); + MenuExitTracking( hwnd, FALSE ); } @@ -3660,7 +3660,7 @@ BOOL WINAPI TrackPopupMenuEx( HMENU Menu, UINT Flags, int x, int y, if (MenuShowPopup(Wnd, Menu, 0, Flags, x, y, 0, 0 )) ret = MenuTrackMenu(Menu, Flags | TPM_POPUPMENU, 0, 0, Wnd, Tpm ? &Tpm->rcExclude : NULL); - MenuExitTracking(Wnd); + MenuExitTracking(Wnd, TRUE); return ret; } From 1aa7aa1be5c1f1c6cfac43fb22e4ca61644fcabf Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 18:55:05 +0000 Subject: [PATCH 164/261] - If MSDN says "BOOLEAN", let it be "BOOLEAN". Fixes build. svn path=/trunk/; revision=46962 --- reactos/dll/win32/kernel32/misc/stubs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/kernel32/misc/stubs.c b/reactos/dll/win32/kernel32/misc/stubs.c index d22e9baed17..c852f34d1f9 100644 --- a/reactos/dll/win32/kernel32/misc/stubs.c +++ b/reactos/dll/win32/kernel32/misc/stubs.c @@ -885,9 +885,9 @@ NlsGetCacheUpdateCount(VOID) return 0; } -BOOL +BOOLEAN WINAPI -Wow64EnableWow64FsRedirection (BOOL Wow64EnableWow64FsRedirection) +Wow64EnableWow64FsRedirection (BOOLEAN Wow64EnableWow64FsRedirection) { STUB; return FALSE; From b423af097fb007a70366534dcfacf5bf00b14a42 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Tue, 20 Apr 2010 18:59:58 +0000 Subject: [PATCH 165/261] [NTVDM] Load resource strings in Unicode when printing them in Unicode svn path=/trunk/; revision=46963 --- reactos/subsystems/ntvdm/ntvdm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/ntvdm/ntvdm.c b/reactos/subsystems/ntvdm/ntvdm.c index afa44ef23de..5a9a29a8e58 100644 --- a/reactos/subsystems/ntvdm/ntvdm.c +++ b/reactos/subsystems/ntvdm/ntvdm.c @@ -282,8 +282,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho WCHAR PromptMsg[RC_STRING_MAX_SIZE]; CHAR InputBuffer[255]; - LoadString( GetModuleHandle(NULL), STRING_WelcomeMsg, (LPTSTR) WelcomeMsg,sizeof(WelcomeMsg) / sizeof(WelcomeMsg[0])); - LoadString( GetModuleHandle(NULL), STRING_PromptMsg, (LPTSTR) PromptMsg ,sizeof(PromptMsg) / sizeof(PromptMsg[0])); + LoadStringW( GetModuleHandle(NULL), STRING_WelcomeMsg, WelcomeMsg,sizeof(WelcomeMsg) / sizeof(WelcomeMsg[0])); + LoadStringW( GetModuleHandle(NULL), STRING_PromptMsg, PromptMsg ,sizeof(PromptMsg) / sizeof(PromptMsg[0])); AllocConsole(); SetConsoleTitleW(L"ntvdm"); From 34b02b74caa575bfbba74cb508e67f8c3bf9f11f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 21:18:54 +0000 Subject: [PATCH 166/261] - Sync rsaenh, schannel, shlwapi, sti, urlmon, usp10, version, windowscodecs, wininet, wintrust to Wine-1.1.43. - Update README.WINE. svn path=/trunk/; revision=46967 --- reactos/dll/win32/lpk/dllmain.c | 2 +- reactos/dll/win32/rsaenh/rsaenh.c | 39 +- reactos/dll/win32/rsaenh/sha2.c | 44 +- reactos/dll/win32/schannel/lsamode.c | 14 +- reactos/dll/win32/shlwapi/ordinal.c | 376 +++++--- reactos/dll/win32/shlwapi/shlwapi.spec | 2 +- reactos/dll/win32/shlwapi/url.c | 13 +- reactos/dll/win32/sti/regsvr.c | 15 +- reactos/dll/win32/sti/sti.c | 352 +++++++ reactos/dll/win32/sti/sti.rbuild | 20 +- reactos/dll/win32/sti/sti.spec | 6 +- reactos/dll/win32/sti/sti_main.c | 140 ++- reactos/dll/win32/sti/sti_private.h | 32 + reactos/dll/win32/sti/sti_wia.idl | 19 + reactos/dll/win32/urlmon/bindprot.c | 4 +- reactos/dll/win32/urlmon/regsvr.c | 2 +- reactos/dll/win32/urlmon/urlmon_main.c | 4 +- reactos/dll/win32/urlmon/urlmon_main.h | 3 +- reactos/dll/win32/urlmon/urlmon_urlmon.idl | 2 +- reactos/dll/win32/urlmon/usrmarshal.c | 2 +- reactos/dll/win32/usp10/bidi.c | 893 ++++++++++++++++++ reactos/dll/win32/usp10/usp10.c | 136 ++- reactos/dll/win32/usp10/usp10.rbuild | 1 + reactos/dll/win32/usp10/usp10.spec | 2 +- reactos/dll/win32/usp10/usp10_internal.h | 28 + reactos/dll/win32/version/resource.c | 33 +- reactos/dll/win32/windowscodecs/bmpdecode.c | 137 ++- reactos/dll/win32/windowscodecs/clsfactory.c | 1 + reactos/dll/win32/windowscodecs/converter.c | 39 +- reactos/dll/win32/windowscodecs/gifformat.c | 22 +- reactos/dll/win32/windowscodecs/icoformat.c | 60 +- reactos/dll/win32/windowscodecs/jpegformat.c | 28 +- reactos/dll/win32/windowscodecs/palette.c | 21 + reactos/dll/win32/windowscodecs/pngformat.c | 186 +++- reactos/dll/win32/windowscodecs/regsvr.c | 53 +- reactos/dll/win32/windowscodecs/stream.c | 54 +- reactos/dll/win32/windowscodecs/tiffformat.c | 866 +++++++++++++++++ .../win32/windowscodecs/wincodecs_private.h | 1 + .../win32/windowscodecs/windowscodecs.rbuild | 1 + reactos/dll/win32/wininet/internet.c | 18 +- reactos/dll/win32/wininet/urlcache.c | 44 +- reactos/dll/win32/wintrust/asn.c | 2 +- reactos/include/psdk/ntsecpkg.h | 36 + reactos/include/psdk/psdk.rbuild | 3 + reactos/include/psdk/shdeprecated.idl | 31 + reactos/include/psdk/shlwapi.h | 27 +- reactos/include/psdk/sti.h | 141 +++ reactos/include/psdk/wia.h | 28 + reactos/include/psdk/wia_lh.idl | 127 +++ reactos/include/psdk/wia_xp.idl | 127 +++ reactos/media/doc/README.WINE | 12 +- 51 files changed, 3806 insertions(+), 443 deletions(-) create mode 100644 reactos/dll/win32/sti/sti.c create mode 100644 reactos/dll/win32/sti/sti_private.h create mode 100644 reactos/dll/win32/sti/sti_wia.idl create mode 100644 reactos/dll/win32/usp10/bidi.c create mode 100644 reactos/dll/win32/usp10/usp10_internal.h create mode 100644 reactos/dll/win32/windowscodecs/tiffformat.c create mode 100644 reactos/include/psdk/shdeprecated.idl create mode 100644 reactos/include/psdk/wia.h create mode 100644 reactos/include/psdk/wia_lh.idl create mode 100644 reactos/include/psdk/wia_xp.idl diff --git a/reactos/dll/win32/lpk/dllmain.c b/reactos/dll/win32/lpk/dllmain.c index 9b7c8e11d0d..1d5bdc0e781 100644 --- a/reactos/dll/win32/lpk/dllmain.c +++ b/reactos/dll/win32/lpk/dllmain.c @@ -36,7 +36,7 @@ LpkDllInitialize ( case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hDll); /* Tell usp10 it is activated usp10 */ - LpkPresent(); + //LpkPresent(); break; default: diff --git a/reactos/dll/win32/rsaenh/rsaenh.c b/reactos/dll/win32/rsaenh/rsaenh.c index 74ad392f2f2..8a5be9935c3 100644 --- a/reactos/dll/win32/rsaenh/rsaenh.c +++ b/reactos/dll/win32/rsaenh/rsaenh.c @@ -3354,6 +3354,33 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam setup_key(pCryptKey); return TRUE; + case KP_SALT: + switch (pCryptKey->aiAlgid) { + case CALG_RC2: + case CALG_RC4: + if (!pbData) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + /* MSDN: the base provider always sets eleven bytes of + * salt value. + */ + memcpy(pCryptKey->abKeyValue + pCryptKey->dwKeyLen, + pbData, 11); + pCryptKey->dwSaltLen = 11; + setup_key(pCryptKey); + /* Strange but true: salt length reset to 0 after setting + * it via KP_SALT. + */ + pCryptKey->dwSaltLen = 0; + break; + default: + SetLastError(NTE_BAD_KEY); + return FALSE; + } + return TRUE; + case KP_SALT_EX: { CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)pbData; @@ -3486,8 +3513,16 @@ BOOL WINAPI RSAENH_CPGetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam pCryptKey->dwBlockLen); case KP_SALT: - return copy_param(pbData, pdwDataLen, - &pCryptKey->abKeyValue[pCryptKey->dwKeyLen], pCryptKey->dwSaltLen); + switch (pCryptKey->aiAlgid) { + case CALG_RC2: + case CALG_RC4: + return copy_param(pbData, pdwDataLen, + &pCryptKey->abKeyValue[pCryptKey->dwKeyLen], + pCryptKey->dwSaltLen); + default: + SetLastError(NTE_BAD_KEY); + return FALSE; + } case KP_PADDING: dwValue = PKCS5_PADDING; diff --git a/reactos/dll/win32/rsaenh/sha2.c b/reactos/dll/win32/rsaenh/sha2.c index 559323c54e5..ea5bb28b48f 100644 --- a/reactos/dll/win32/rsaenh/sha2.c +++ b/reactos/dll/win32/rsaenh/sha2.c @@ -273,7 +273,7 @@ static const char sha2_hex_digits[] = "0123456789abcdef"; /*** SHA-256: *********************************************************/ void SHA256_Init(SHA256_CTX* context) { - if (context == (SHA256_CTX*)0) { + if (context == NULL) { return; } MEMCPY_BCOPY(context->state, sha256_initial_hash_value, SHA256_DIGEST_LENGTH); @@ -465,7 +465,7 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { } /* Sanity check: */ - assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0); + assert(context != NULL && data != NULL); usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; if (usedspace > 0) { @@ -490,7 +490,7 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { } while (len >= SHA256_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA256_Transform(context, (sha2_word32*)data); + SHA256_Transform(context, (const sha2_word32*)data); context->bitcount += SHA256_BLOCK_LENGTH << 3; len -= SHA256_BLOCK_LENGTH; data += SHA256_BLOCK_LENGTH; @@ -509,10 +509,10 @@ void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) { unsigned int usedspace; /* Sanity check: */ - assert(context != (SHA256_CTX*)0); + assert(context != NULL); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; #ifndef WORDS_BIGENDIAN /* Convert FROM host byte order */ @@ -572,9 +572,9 @@ char *SHA256_End(SHA256_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != (SHA256_CTX*)0); + assert(context != NULL); - if (buffer != (char*)0) { + if (buffer != NULL) { SHA256_Final(digest, context); for (i = 0; i < SHA256_DIGEST_LENGTH; i++) { @@ -582,7 +582,7 @@ char *SHA256_End(SHA256_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = (char)0; + *buffer = 0; } else { MEMSET_BZERO(context, sizeof(context)); } @@ -601,7 +601,7 @@ char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_S /*** SHA-512: *********************************************************/ void SHA512_Init(SHA512_CTX* context) { - if (context == (SHA512_CTX*)0) { + if (context == NULL) { return; } MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH); @@ -787,7 +787,7 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { } /* Sanity check: */ - assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0); + assert(context != NULL && data != NULL); usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH; if (usedspace > 0) { @@ -812,7 +812,7 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { } while (len >= SHA512_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA512_Transform(context, (sha2_word64*)data); + SHA512_Transform(context, (const sha2_word64*)data); ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3); len -= SHA512_BLOCK_LENGTH; data += SHA512_BLOCK_LENGTH; @@ -871,10 +871,10 @@ void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ - assert(context != (SHA512_CTX*)0); + assert(context != NULL); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { SHA512_Last(context); /* Save the hash data for output: */ @@ -901,9 +901,9 @@ char *SHA512_End(SHA512_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != (SHA512_CTX*)0); + assert(context != NULL); - if (buffer != (char*)0) { + if (buffer != NULL) { SHA512_Final(digest, context); for (i = 0; i < SHA512_DIGEST_LENGTH; i++) { @@ -911,7 +911,7 @@ char *SHA512_End(SHA512_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = (char)0; + *buffer = 0; } else { MEMSET_BZERO(context, sizeof(context)); } @@ -930,7 +930,7 @@ char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_S /*** SHA-384: *********************************************************/ void SHA384_Init(SHA384_CTX* context) { - if (context == (SHA384_CTX*)0) { + if (context == NULL) { return; } MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH); @@ -946,10 +946,10 @@ void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ - assert(context != (SHA384_CTX*)0); + assert(context != NULL); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { SHA512_Last((SHA512_CTX*)context); /* Save the hash data for output: */ @@ -976,9 +976,9 @@ char *SHA384_End(SHA384_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != (SHA384_CTX*)0); + assert(context != NULL); - if (buffer != (char*)0) { + if (buffer != NULL) { SHA384_Final(digest, context); for (i = 0; i < SHA384_DIGEST_LENGTH; i++) { @@ -986,7 +986,7 @@ char *SHA384_End(SHA384_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = (char)0; + *buffer = 0; } else { MEMSET_BZERO(context, sizeof(context)); } diff --git a/reactos/dll/win32/schannel/lsamode.c b/reactos/dll/win32/schannel/lsamode.c index 23d85994cc4..f43150e3d3a 100644 --- a/reactos/dll/win32/schannel/lsamode.c +++ b/reactos/dll/win32/schannel/lsamode.c @@ -109,6 +109,12 @@ static SECPKG_FUNCTION_TABLE secPkgFunctionTable[2] = NULL, /* SetExtendedInformation */ NULL, /* SetContextAttributes */ NULL, /* SetCredentialsAttributes */ + NULL, /* ChangeAccountPassword */ + NULL, /* QueryMetaData */ + NULL, /* ExchangeMetaData */ + NULL, /* GetCredUIContext */ + NULL, /* UpdateCredentials */ + NULL, /* ValidateTargetInfo */ }, { NULL, /* InitializePackage */ NULL, /* LsaLogonUser */ @@ -139,6 +145,12 @@ static SECPKG_FUNCTION_TABLE secPkgFunctionTable[2] = NULL, /* SetExtendedInformation */ NULL, /* SetContextAttributes */ NULL, /* SetCredentialsAttributes */ + NULL, /* ChangeAccountPassword */ + NULL, /* QueryMetaData */ + NULL, /* ExchangeMetaData */ + NULL, /* GetCredUIContext */ + NULL, /* UpdateCredentials */ + NULL, /* ValidateTargetInfo */ } }; @@ -150,7 +162,7 @@ NTSTATUS WINAPI SpLsaModeInitialize(ULONG LsaVersion, PULONG PackageVersion, { TRACE("(%u, %p, %p, %p)\n", LsaVersion, PackageVersion, ppTables, pcTables); - *PackageVersion = SECPKG_INTERFACE_VERSION_3; + *PackageVersion = SECPKG_INTERFACE_VERSION_6; *pcTables = 2; *ppTables = secPkgFunctionTable; diff --git a/reactos/dll/win32/shlwapi/ordinal.c b/reactos/dll/win32/shlwapi/ordinal.c index 364bbfe8af8..332bdb67f79 100644 --- a/reactos/dll/win32/shlwapi/ordinal.c +++ b/reactos/dll/win32/shlwapi/ordinal.c @@ -42,6 +42,7 @@ #include "mmsystem.h" #include "objbase.h" #include "exdisp.h" +#include "shdeprecated.h" #include "shlobj.h" #include "shlwapi.h" #include "shellapi.h" @@ -309,24 +310,22 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) BSTR property; IEnumFORMATETC* pIEnumFormatEtc = NULL; VARIANTARG var; - HRESULT hRet; - IWebBrowserApp* pBrowser = NULL; + HRESULT hr; + IWebBrowserApp* pBrowser; TRACE("(%p, %p)\n", lpBC, lpUnknown); - /* Get An IWebBrowserApp interface from lpUnknown */ - hRet = IUnknown_QueryService(lpUnknown, &IID_IWebBrowserApp, &IID_IWebBrowserApp, (PVOID)&pBrowser); - if (FAILED(hRet) || !pBrowser) - return E_NOINTERFACE; + hr = IUnknown_QueryService(lpUnknown, &IID_IWebBrowserApp, &IID_IWebBrowserApp, (void**)&pBrowser); + if (FAILED(hr)) + return hr; V_VT(&var) = VT_EMPTY; /* The property we get is the browsers clipboard enumerator */ property = SysAllocString(szProperty); - hRet = IWebBrowserApp_GetProperty(pBrowser, property, &var); + hr = IWebBrowserApp_GetProperty(pBrowser, property, &var); SysFreeString(property); - if (FAILED(hRet)) - return hRet; + if (FAILED(hr)) goto exit; if (V_VT(&var) == VT_EMPTY) { @@ -340,7 +339,10 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) if (!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\Current" "Version\\Internet Settings\\Accepted Documents", &hDocs)) - return E_FAIL; + { + hr = E_FAIL; + goto exit; + } /* Get count of values in key */ while (!dwRet) @@ -355,7 +357,11 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) /* Note: dwCount = number of items + 1; The extra item is the end node */ format = formatList = HeapAlloc(GetProcessHeap(), 0, dwCount * sizeof(FORMATETC)); if (!formatList) - return E_OUTOFMEMORY; + { + RegCloseKey(hDocs); + hr = E_OUTOFMEMORY; + goto exit; + } if (dwNumValues > 1) { @@ -372,7 +378,12 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) dwRet = RegEnumValueA(hDocs, dwCount, szKeyBuff, &dwKeySize, 0, &dwType, (PBYTE)szValueBuff, &dwValueSize); if (!dwRet) - return E_FAIL; + { + HeapFree(GetProcessHeap(), 0, formatList); + RegCloseKey(hDocs); + hr = E_FAIL; + goto exit; + } format->cfFormat = RegisterClipboardFormatA(szValueBuff); format->ptd = NULL; @@ -385,6 +396,8 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) } } + RegCloseKey(hDocs); + /* Terminate the (maybe empty) list, last entry has a cfFormat of 0 */ format->cfFormat = 0; format->ptd = NULL; @@ -393,22 +406,21 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) format->tymed = -1; /* Create a clipboard enumerator */ - hRet = CreateFormatEnumerator(dwNumValues, formatList, &pIEnumFormatEtc); - - if (FAILED(hRet) || !pIEnumFormatEtc) - return hRet; + hr = CreateFormatEnumerator(dwNumValues, formatList, &pIEnumFormatEtc); + HeapFree(GetProcessHeap(), 0, formatList); + if (FAILED(hr)) goto exit; /* Set our enumerator as the browsers property */ V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)pIEnumFormatEtc; property = SysAllocString(szProperty); - hRet = IWebBrowserApp_PutProperty(pBrowser, property, var); + hr = IWebBrowserApp_PutProperty(pBrowser, property, var); SysFreeString(property); - if (FAILED(hRet)) + if (FAILED(hr)) { IEnumFORMATETC_Release(pIEnumFormatEtc); - goto RegisterDefaultAcceptHeaders_Exit; + goto exit; } } @@ -422,28 +434,26 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) /* Get an IEnumFormatEtc interface from the variants value */ pIEnumFormatEtc = NULL; - hRet = IUnknown_QueryInterface(pIUnknown, &IID_IEnumFORMATETC, - (PVOID)&pIEnumFormatEtc); - if (hRet == S_OK && pIEnumFormatEtc) + hr = IUnknown_QueryInterface(pIUnknown, &IID_IEnumFORMATETC, (void**)&pIEnumFormatEtc); + if (hr == S_OK && pIEnumFormatEtc) { /* Clone and register the enumerator */ - hRet = IEnumFORMATETC_Clone(pIEnumFormatEtc, &pClone); - if (hRet == S_OK && pClone) + hr = IEnumFORMATETC_Clone(pIEnumFormatEtc, &pClone); + if (hr == S_OK && pClone) { RegisterFormatEnumerator(lpBC, pClone, 0); IEnumFORMATETC_Release(pClone); } - /* Release the IEnumFormatEtc interface */ IEnumFORMATETC_Release(pIUnknown); } IUnknown_Release(V_UNKNOWN(&var)); } -RegisterDefaultAcceptHeaders_Exit: +exit: IWebBrowserApp_Release(pBrowser); - return hRet; + return hr; } /************************************************************************* @@ -500,7 +510,7 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen) return S_OK; } - /* Did not find a value in the registry or the user buffer is to small */ + /* Did not find a value in the registry or the user buffer is too small */ mylcid = GetUserDefaultLCID(); retval = LcidToRfc1766W(mylcid, mystr, mystrlen); len = lstrlenW(mystr); @@ -1201,7 +1211,7 @@ HRESULT WINAPI ConnectToConnectionPoint(IUnknown* lpUnkSink, REFIID riid, BOOL f /************************************************************************* * @ [SHLWAPI.169] * - * Release an interface. + * Release an interface and zero a supplied pointer. * * PARAMS * lpUnknown [I] Object to release @@ -1209,19 +1219,16 @@ HRESULT WINAPI ConnectToConnectionPoint(IUnknown* lpUnkSink, REFIID riid, BOOL f * RETURNS * Nothing. */ -DWORD WINAPI IUnknown_AtomicRelease(IUnknown ** lpUnknown) +void WINAPI IUnknown_AtomicRelease(IUnknown ** lpUnknown) { - IUnknown *temp; + TRACE("(%p)\n", lpUnknown); - TRACE("(%p)\n",lpUnknown); - - if(!lpUnknown || !*((LPDWORD)lpUnknown)) return 0; - temp = *lpUnknown; - *lpUnknown = NULL; + if(!lpUnknown || !*lpUnknown) return; TRACE("doing Release\n"); - return IUnknown_Release(temp); + IUnknown_Release(*lpUnknown); + *lpUnknown = NULL; } /************************************************************************* @@ -1258,9 +1265,10 @@ LPCSTR WINAPI PathSkipLeadingSlashesA(LPCSTR lpszSrc) */ BOOL WINAPI SHIsSameObject(IUnknown* lpInt1, IUnknown* lpInt2) { - LPVOID lpUnknown1, lpUnknown2; + IUnknown *lpUnknown1, *lpUnknown2; + BOOL ret; - TRACE("%p %p\n", lpInt1, lpInt2); + TRACE("(%p %p)\n", lpInt1, lpInt2); if (!lpInt1 || !lpInt2) return FALSE; @@ -1268,16 +1276,21 @@ BOOL WINAPI SHIsSameObject(IUnknown* lpInt1, IUnknown* lpInt2) if (lpInt1 == lpInt2) return TRUE; - if (FAILED(IUnknown_QueryInterface(lpInt1, &IID_IUnknown, &lpUnknown1))) + if (IUnknown_QueryInterface(lpInt1, &IID_IUnknown, (void**)&lpUnknown1) != S_OK) return FALSE; - if (FAILED(IUnknown_QueryInterface(lpInt2, &IID_IUnknown, &lpUnknown2))) + if (IUnknown_QueryInterface(lpInt2, &IID_IUnknown, (void**)&lpUnknown2) != S_OK) + { + IUnknown_Release(lpUnknown1); return FALSE; + } - if (lpUnknown1 == lpUnknown2) - return TRUE; + ret = lpUnknown1 == lpUnknown2; - return FALSE; + IUnknown_Release(lpUnknown1); + IUnknown_Release(lpUnknown2); + + return ret; } /************************************************************************* @@ -1337,36 +1350,32 @@ HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd) /************************************************************************* * @ [SHLWAPI.173] * - * Call a method on as as yet unidentified object. + * Call a SetOwner method of IShellService from specified object. * * PARAMS - * pUnk [I] Object supporting the unidentified interface, - * arg [I] Argument for the call on the object. + * iface [I] Object that supports IShellService + * pUnk [I] Argument for the SetOwner call * * RETURNS - * S_OK. + * Corresponding return value from last call or E_FAIL for null input */ -HRESULT WINAPI IUnknown_SetOwner(IUnknown *pUnk, ULONG arg) +HRESULT WINAPI IUnknown_SetOwner(IUnknown *iface, IUnknown *pUnk) { - static const GUID guid_173 = { - 0x5836fb00, 0x8187, 0x11cf, { 0xa1,0x2b,0x00,0xaa,0x00,0x4a,0xe8,0x37 } - }; - IMalloc *pUnk2; + IShellService *service; + HRESULT hr; - TRACE("(%p,%d)\n", pUnk, arg); + TRACE("(%p, %p)\n", iface, pUnk); - /* Note: arg may not be a ULONG and pUnk2 is for sure not an IMalloc - - * We use this interface as its vtable entry is compatible with the - * object in question. - * FIXME: Find out what this object is and where it should be defined. - */ - if (pUnk && - SUCCEEDED(IUnknown_QueryInterface(pUnk, &guid_173, (void**)&pUnk2))) + if (!iface) return E_FAIL; + + hr = IUnknown_QueryInterface(iface, &IID_IShellService, (void**)&service); + if (hr == S_OK) { - IMalloc_Alloc(pUnk2, arg); /* Faked call!! */ - IMalloc_Release(pUnk2); + hr = IShellService_SetOwner(service, pUnk); + IShellService_Release(service); } - return S_OK; + + return hr; } /************************************************************************* @@ -1473,7 +1482,6 @@ HRESULT WINAPI IUnknown_QueryService(IUnknown* lpUnknown, REFGUID sid, REFIID ri if (!lpUnknown) return E_FAIL; - /* Get an IServiceProvider interface from the object */ hRet = IUnknown_QueryInterface(lpUnknown, &IID_IServiceProvider, (LPVOID*)&pService); @@ -1486,12 +1494,92 @@ HRESULT WINAPI IUnknown_QueryService(IUnknown* lpUnknown, REFGUID sid, REFIID ri TRACE("(IServiceProvider*)%p returned (IUnknown*)%p\n", pService, *lppOut); - /* Release the IServiceProvider interface */ IUnknown_Release(pService); } return hRet; } +/************************************************************************* + * @ [SHLWAPI.484] + * + * Calls IOleCommandTarget::Exec() for specified service object. + * + * PARAMS + * lpUnknown [I] Object to get an IServiceProvider interface from + * service [I] Service ID for IServiceProvider_QueryService() call + * group [I] Group ID for IOleCommandTarget::Exec() call + * cmdId [I] Command ID for IOleCommandTarget::Exec() call + * cmdOpt [I] Options flags for command + * pIn [I] Input arguments for command + * pOut [O] Output arguments for command + * + * RETURNS + * Success: S_OK. lppOut contains an object providing the requested service + * Failure: An HRESULT error code + * + * NOTES + * lpUnknown is expected to support the IServiceProvider interface. + */ +HRESULT WINAPI IUnknown_QueryServiceExec(IUnknown *lpUnknown, REFIID service, + const GUID *group, DWORD cmdId, DWORD cmdOpt, VARIANT *pIn, VARIANT *pOut) +{ + IOleCommandTarget *target; + HRESULT hr; + + TRACE("%p %s %s %d %08x %p %p\n", lpUnknown, debugstr_guid(service), + debugstr_guid(group), cmdId, cmdOpt, pIn, pOut); + + hr = IUnknown_QueryService(lpUnknown, service, &IID_IOleCommandTarget, (void**)&target); + if (hr == S_OK) + { + hr = IOleCommandTarget_Exec(target, group, cmdId, cmdOpt, pIn, pOut); + IOleCommandTarget_Release(target); + } + + TRACE("<-- hr=0x%08x\n", hr); + + return hr; +} + +/************************************************************************* + * @ [SHLWAPI.514] + * + * Calls IProfferService methods to proffer/revoke specified service. + * + * PARAMS + * lpUnknown [I] Object to get an IServiceProvider interface from + * service [I] Service ID for IProfferService::Proffer/Revoke calls + * pService [I] Service to proffer. If NULL ::Revoke is called + * pCookie [IO] Group ID for IOleCommandTarget::Exec() call + * + * RETURNS + * Success: S_OK. IProffer method returns S_OK + * Failure: An HRESULT error code + * + * NOTES + * lpUnknown is expected to support the IServiceProvider interface. + */ +HRESULT WINAPI IUnknown_ProfferService(IUnknown *lpUnknown, REFGUID service, IServiceProvider *pService, DWORD *pCookie) +{ + IProfferService *proffer; + HRESULT hr; + + TRACE("%p %s %p %p\n", lpUnknown, debugstr_guid(service), pService, pCookie); + + hr = IUnknown_QueryService(lpUnknown, &IID_IProfferService, &IID_IProfferService, (void**)&proffer); + if (hr == S_OK) + { + if (pService) + hr = IProfferService_ProfferService(proffer, service, pService, pCookie); + else + hr = IProfferService_RevokeService(proffer, *pCookie); + + IProfferService_Release(proffer); + } + + return hr; +} + /************************************************************************* * @ [SHLWAPI.479] * @@ -1546,6 +1634,8 @@ BOOL WINAPI SHLoadMenuPopup(HINSTANCE hInst, LPCWSTR szName) { HMENU hMenu; + TRACE("%p %s\n", hInst, debugstr_w(szName)); + if ((hMenu = LoadMenuW(hInst, szName))) { if (GetSubMenu(hMenu, 0)) @@ -1629,6 +1719,9 @@ void WINAPI SHPropagateMessage(HWND hWnd, UINT uiMsgId, WPARAM wParam, LPARAM lP DWORD WINAPI SHRemoveAllSubMenus(HMENU hMenu) { int iItemCount = GetMenuItemCount(hMenu) - 1; + + TRACE("%p\n", hMenu); + while (iItemCount >= 0) { HMENU hSubMenu = GetSubMenu(hMenu, iItemCount); @@ -1654,6 +1747,7 @@ DWORD WINAPI SHRemoveAllSubMenus(HMENU hMenu) */ UINT WINAPI SHEnableMenuItem(HMENU hMenu, UINT wItemID, BOOL bEnable) { + TRACE("%p, %u, %d\n", hMenu, wItemID, bEnable); return EnableMenuItem(hMenu, wItemID, bEnable ? MF_ENABLED : MF_GRAYED); } @@ -1672,6 +1766,7 @@ UINT WINAPI SHEnableMenuItem(HMENU hMenu, UINT wItemID, BOOL bEnable) */ DWORD WINAPI SHCheckMenuItem(HMENU hMenu, UINT uID, BOOL bCheck) { + TRACE("%p, %u, %d\n", hMenu, uID, bCheck); return CheckMenuItem(hMenu, uID, bCheck ? MF_CHECKED : MF_UNCHECKED); } @@ -1703,6 +1798,8 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD dwEffect = DROPEFFECT_LINK | DROPEFFECT_MOVE | DROPEFFECT_COPY; POINTL pt = { 0, 0 }; + TRACE("%p %p 0x%08x %p %p\n", pDrop, pDataObj, grfKeyState, lpPt, pdwEffect); + if (!lpPt) lpPt = &pt; @@ -1711,7 +1808,7 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, IDropTarget_DragEnter(pDrop, pDataObj, grfKeyState, *lpPt, pdwEffect); - if (*pdwEffect) + if (*pdwEffect != DROPEFFECT_NONE) return IDropTarget_Drop(pDrop, pDataObj, grfKeyState, *lpPt, pdwEffect); IDropTarget_DragLeave(pDrop); @@ -1803,7 +1900,7 @@ HRESULT WINAPI IUnknown_OnFocusOCS(IUnknown *lpUnknown, BOOL fGotFocus) IOleControlSite* lpCSite = NULL; HRESULT hRet = E_FAIL; - TRACE("(%p,%s)\n", lpUnknown, fGotFocus ? "TRUE" : "FALSE"); + TRACE("(%p, %d)\n", lpUnknown, fGotFocus); if (lpUnknown) { hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleControlSite, @@ -2061,12 +2158,10 @@ VOID WINAPI IUnknown_Set(IUnknown **lppDest, IUnknown *lpUnknown) { TRACE("(%p,%p)\n", lppDest, lpUnknown); - if (lppDest) - IUnknown_AtomicRelease(lppDest); /* Release existing interface */ + IUnknown_AtomicRelease(lppDest); if (lpUnknown) { - /* Copy */ IUnknown_AddRef(lpUnknown); *lppDest = lpUnknown; } @@ -2256,12 +2351,6 @@ BOOL WINAPI FDSA_DeleteItem(FDSA_info *info, DWORD where) return TRUE; } - -typedef struct { - REFIID refid; - DWORD indx; -} IFACE_INDEX_TBL; - /************************************************************************* * @ [SHLWAPI.219] * @@ -2272,22 +2361,22 @@ typedef struct { * Failure: E_POINTER or E_NOINTERFACE. */ HRESULT WINAPI QISearch( - LPVOID w, /* [in] Table of interfaces */ - IFACE_INDEX_TBL *x, /* [in] Array of REFIIDs and indexes into the table */ + void *base, /* [in] Table of interfaces */ + const QITAB *table, /* [in] Array of REFIIDs and indexes into the table */ REFIID riid, /* [in] REFIID to get interface for */ - LPVOID *ppv) /* [out] Destination for interface pointer */ + void **ppv) /* [out] Destination for interface pointer */ { HRESULT ret; IUnknown *a_vtbl; - IFACE_INDEX_TBL *xmove; + const QITAB *xmove; - TRACE("(%p %p %s %p)\n", w,x,debugstr_guid(riid),ppv); + TRACE("(%p %p %s %p)\n", base, table, debugstr_guid(riid), ppv); if (ppv) { - xmove = x; - while (xmove->refid) { - TRACE("trying (indx %d) %s\n", xmove->indx, debugstr_guid(xmove->refid)); - if (IsEqualIID(riid, xmove->refid)) { - a_vtbl = (IUnknown*)(xmove->indx + (LPBYTE)w); + xmove = table; + while (xmove->piid) { + TRACE("trying (offset %d) %s\n", xmove->dwOffset, debugstr_guid(xmove->piid)); + if (IsEqualIID(riid, xmove->piid)) { + a_vtbl = (IUnknown*)(xmove->dwOffset + (LPBYTE)base); TRACE("matched, returning (%p)\n", a_vtbl); *ppv = a_vtbl; IUnknown_AddRef(a_vtbl); @@ -2297,7 +2386,7 @@ HRESULT WINAPI QISearch( } if (IsEqualIID(riid, &IID_IUnknown)) { - a_vtbl = (IUnknown*)(x->indx + (LPBYTE)w); + a_vtbl = (IUnknown*)(table->dwOffset + (LPBYTE)base); TRACE("returning first for IUnknown (%p)\n", a_vtbl); *ppv = a_vtbl; IUnknown_AddRef(a_vtbl); @@ -2506,27 +2595,27 @@ HRESULT WINAPI IUnknown_GetSite(LPUNKNOWN lpUnknown, REFIID iid, PVOID *lppSite) * dwExStyle [I] Extra style flags * dwStyle [I] Style flags * hMenu [I] Window menu - * z [I] Unknown + * wnd_extra [I] Window extra bytes value * * RETURNS * Success: The window handle of the newly created window. * Failure: 0. */ HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle, - DWORD dwStyle, HMENU hMenu, LONG z) + DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra) { static const char szClass[] = "WorkerA"; WNDCLASSA wc; HWND hWnd; - TRACE("(0x%08x,%p,0x%08x,0x%08x,%p,0x%08x)\n", - wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); + TRACE("(0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08lx)\n", + wndProc, hWndParent, dwExStyle, dwStyle, hMenu, wnd_extra); /* Create Window class */ wc.style = 0; wc.lpfnWndProc = DefWindowProcA; wc.cbClsExtra = 0; - wc.cbWndExtra = 4; + wc.cbWndExtra = sizeof(LONG_PTR); wc.hInstance = shlwapi_hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursorA(NULL, (LPSTR)IDC_ARROW); @@ -2534,19 +2623,17 @@ HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle wc.lpszMenuName = NULL; wc.lpszClassName = szClass; - SHRegisterClassA(&wc); /* Register class */ - - /* FIXME: Set extra bits in dwExStyle */ + SHRegisterClassA(&wc); hWnd = CreateWindowExA(dwExStyle, szClass, 0, dwStyle, 0, 0, 0, 0, hWndParent, hMenu, shlwapi_hInstance, 0); if (hWnd) { - SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, z); + SetWindowLongPtrW(hWnd, 0, wnd_extra); - if (wndProc) - SetWindowLongPtrA(hWnd, GWLP_WNDPROC, wndProc); + if (wndProc) SetWindowLongPtrA(hWnd, GWLP_WNDPROC, wndProc); } + return hWnd; } @@ -2729,7 +2816,7 @@ BOOL WINAPI GUIDFromStringA(LPCSTR idstr, CLSID *id) */ BOOL WINAPI GUIDFromStringW(LPCWSTR idstr, CLSID *id) { - return SUCCEEDED(CLSIDFromString((LPOLESTR)idstr, id)); + return SUCCEEDED(CLSIDFromString((LPCOLESTR)idstr, id)); } /************************************************************************* @@ -2804,18 +2891,21 @@ DWORD WINAPI WhichPlatform(void) * Unicode version of SHCreateWorkerWindowA. */ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle, - DWORD dwStyle, HMENU hMenu, LONG z) + DWORD dwStyle, HMENU hMenu, LONG msg_result) { - static const WCHAR szClass[] = { 'W', 'o', 'r', 'k', 'e', 'r', 'W', '\0' }; + static const WCHAR szClass[] = { 'W', 'o', 'r', 'k', 'e', 'r', 'W', 0 }; WNDCLASSW wc; HWND hWnd; - TRACE("(0x%08x,%p,0x%08x,0x%08x,%p,0x%08x)\n", - wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); + TRACE("(0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08x)\n", + wndProc, hWndParent, dwExStyle, dwStyle, hMenu, msg_result); - /* If our OS is natively ASCII, use the ASCII version */ - if (!(GetVersion() & 0x80000000)) /* NT */ - return SHCreateWorkerWindowA(wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); + /* If our OS is natively ANSI, use the ANSI version */ + if (GetVersion() & 0x80000000) /* not NT */ + { + TRACE("fallback to ANSI, ver 0x%08x\n", GetVersion()); + return SHCreateWorkerWindowA(wndProc, hWndParent, dwExStyle, dwStyle, hMenu, msg_result); + } /* Create Window class */ wc.style = 0; @@ -2829,19 +2919,17 @@ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle wc.lpszMenuName = NULL; wc.lpszClassName = szClass; - SHRegisterClassW(&wc); /* Register class */ - - /* FIXME: Set extra bits in dwExStyle */ + SHRegisterClassW(&wc); hWnd = CreateWindowExW(dwExStyle, szClass, 0, dwStyle, 0, 0, 0, 0, hWndParent, hMenu, shlwapi_hInstance, 0); if (hWnd) { - SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, z); + SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, msg_result); - if (wndProc) - SetWindowLongPtrW(hWnd, GWLP_WNDPROC, wndProc); + if (wndProc) SetWindowLongPtrW(hWnd, GWLP_WNDPROC, wndProc); } + return hWnd; } @@ -2861,7 +2949,8 @@ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle */ HRESULT WINAPI SHInvokeDefaultCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST lpApidl) { - return SHInvokeCommand(hWnd, lpFolder, lpApidl, FALSE); + TRACE("%p %p %p\n", hWnd, lpFolder, lpApidl); + return SHInvokeCommand(hWnd, lpFolder, lpApidl, FALSE); } /************************************************************************* @@ -3376,12 +3465,12 @@ UINT WINAPI SHDefExtractIconWrapW(LPCWSTR pszIconFile, int iIndex, UINT uFlags, HRESULT WINAPI SHInvokeCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST lpApidl, BOOL bInvokeDefault) { IContextMenu *iContext; - HRESULT hRet = E_FAIL; + HRESULT hRet; - TRACE("(%p,%p,%p,%d)\n", hWnd, lpFolder, lpApidl, bInvokeDefault); + TRACE("(%p, %p, %p, %d)\n", hWnd, lpFolder, lpApidl, bInvokeDefault); if (!lpFolder) - return hRet; + return E_FAIL; /* Get the context menu from the shell folder */ hRet = IShellFolder_GetUIObjectOf(lpFolder, hWnd, 1, &lpApidl, @@ -3401,7 +3490,7 @@ HRESULT WINAPI SHInvokeCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST if (SUCCEEDED(hQuery)) { if (bInvokeDefault && - (dwDefaultId = GetMenuDefaultItem(hMenu, 0, 0)) != 0xFFFFFFFF) + (dwDefaultId = GetMenuDefaultItem(hMenu, 0, 0)) != (UINT)-1) { CMINVOKECOMMANDINFO cmIci; /* Invoke the default item */ @@ -3810,7 +3899,7 @@ DWORD WINAPI SHSendMessageBroadcastW(UINT uMsg, WPARAM wParam, LPARAM lParam) */ HRESULT WINAPI CLSIDFromStringWrap(LPCWSTR idstr, CLSID *id) { - return CLSIDFromString((LPOLESTR)idstr, id); + return CLSIDFromString((LPCOLESTR)idstr, id); } /************************************************************************* @@ -4171,18 +4260,24 @@ BOOL WINAPI SHIsLowMemoryMachine (DWORD x) */ INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID) { - MENUITEMINFOW mi; - INT nCount = GetMenuItemCount(hMenu), nIter = 0; + MENUITEMINFOW mi; + INT nCount = GetMenuItemCount(hMenu), nIter = 0; - while (nIter < nCount) - { - mi.cbSize = sizeof(mi); - mi.fMask = MIIM_ID; - if (GetMenuItemInfoW(hMenu, nIter, TRUE, &mi) && mi.wID == wID) - return nIter; - nIter++; - } - return -1; + TRACE("%p %u\n", hMenu, wID); + + while (nIter < nCount) + { + mi.cbSize = sizeof(mi); + mi.fMask = MIIM_ID; + if (GetMenuItemInfoW(hMenu, nIter, TRUE, &mi) && mi.wID == wID) + { + TRACE("ret %d\n", nIter); + return nIter; + } + nIter++; + } + + return -1; } /************************************************************************* @@ -4192,6 +4287,7 @@ INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID) */ DWORD WINAPI SHMenuIndexFromID(HMENU hMenu, UINT uID) { + TRACE("%p %u\n", hMenu, uID); return GetMenuPosFromID(hMenu, uID); } @@ -4270,10 +4366,10 @@ BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid) /*********************************************************************** * SHGetShellKey (SHLWAPI.@) */ -DWORD WINAPI SHGetShellKey(DWORD a, DWORD b, DWORD c) +HKEY WINAPI SHGetShellKey(DWORD flags, LPCWSTR sub_key, BOOL create) { - FIXME("(%x, %x, %x): stub\n", a, b, c); - return 0x50; + FIXME("(0x%08x, %s, %d): stub\n", flags, debugstr_w(sub_key), create); + return (HKEY)0x50; } /*********************************************************************** @@ -4422,20 +4518,6 @@ INT WINAPIV ShellMessageBoxWrapW(HINSTANCE hInstance, HWND hWnd, LPCWSTR lpText, return ret; } -HRESULT WINAPI IUnknown_QueryServiceExec(IUnknown *unk, REFIID service, REFIID clsid, - DWORD x1, DWORD x2, DWORD x3, void **ppvOut) -{ - FIXME("%p %s %s %08x %08x %08x %p\n", unk, - debugstr_guid(service), debugstr_guid(clsid), x1, x2, x3, ppvOut); - return E_NOTIMPL; -} - -HRESULT WINAPI IUnknown_ProfferService(IUnknown *unk, void *x0, void *x1, void *x2) -{ - FIXME("%p %p %p %p\n", unk, x0, x1, x2); - return E_NOTIMPL; -} - /*********************************************************************** * ZoneComputePaneSize [SHLWAPI.382] */ diff --git a/reactos/dll/win32/shlwapi/shlwapi.spec b/reactos/dll/win32/shlwapi/shlwapi.spec index d899232f9c5..367046b5ebc 100644 --- a/reactos/dll/win32/shlwapi/shlwapi.spec +++ b/reactos/dll/win32/shlwapi/shlwapi.spec @@ -216,7 +216,7 @@ 216 stdcall -noname SHAnsiToUnicodeCP(long str ptr long) 217 stdcall -noname SHUnicodeToAnsi(wstr ptr ptr) 218 stdcall -noname SHUnicodeToAnsiCP(long wstr ptr long) -219 stdcall -noname QISearch(long long long long) +219 stdcall QISearch(long long long long) 220 stdcall -noname SHSetDefaultDialogFont(ptr long) 221 stdcall -noname SHRemoveDefaultDialogFont(ptr) 222 stdcall -noname SHGlobalCounterCreate(long) diff --git a/reactos/dll/win32/shlwapi/url.c b/reactos/dll/win32/shlwapi/url.c index 958a8429f53..cd83b457178 100644 --- a/reactos/dll/win32/shlwapi/url.c +++ b/reactos/dll/win32/shlwapi/url.c @@ -278,7 +278,8 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, { HRESULT hr = S_OK; DWORD EscapeFlags; - LPWSTR lpszUrlCpy, wk1, wk2, mp, mp2, root; + LPCWSTR wk1, root; + LPWSTR lpszUrlCpy, wk2, mp, mp2; INT state; DWORD nByteLen, nLen, nWkLen; WCHAR slash = '/'; @@ -322,7 +323,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, * 6 have location (found /) save root location */ - wk1 = (LPWSTR)pszUrl; + wk1 = pszUrl; wk2 = lpszUrlCpy; state = 0; @@ -662,7 +663,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, } } - /* If there is a '#' and the characters immediately preceeding it are + /* If there is a '#' and the characters immediately preceding it are * ".htm[l]", then begin looking for the last leaf starting from * the '#'. Otherwise the '#' is not meaningful and just start * looking from the end. */ @@ -1718,6 +1719,9 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis) TRACE("(%s %d)\n", debugstr_a(pszUrl), Urlis); + if(!pszUrl) + return FALSE; + switch (Urlis) { case URLIS_OPAQUE: @@ -1768,6 +1772,9 @@ BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis) TRACE("(%s %d)\n", debugstr_w(pszUrl), Urlis); + if(!pszUrl) + return FALSE; + switch (Urlis) { case URLIS_OPAQUE: diff --git a/reactos/dll/win32/sti/regsvr.c b/reactos/dll/win32/sti/regsvr.c index 018c1781ef6..3e582ec4964 100644 --- a/reactos/dll/win32/sti/regsvr.c +++ b/reactos/dll/win32/sti/regsvr.c @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ - #include #include @@ -31,6 +30,7 @@ #include "objbase.h" #include "initguid.h" #include "sti.h" +#include "wia_lh.h" #include "wine/debug.h" #include "wine/unicode.h" @@ -395,8 +395,11 @@ static struct regsvr_interface const interface_list[] = { { NULL } /* list terminator */ }; +extern HRESULT WINAPI STI_DllRegisterServer(void) DECLSPEC_HIDDEN; +extern HRESULT WINAPI STI_DllUnregisterServer(void) DECLSPEC_HIDDEN; + /*********************************************************************** - * DllRegisterServer (INETCOMM.@) + * DllRegisterServer (STI.@) */ HRESULT WINAPI DllRegisterServer(void) { @@ -404,14 +407,16 @@ HRESULT WINAPI DllRegisterServer(void) TRACE("\n"); - hr = register_coclasses(coclass_list); + hr = STI_DllRegisterServer(); + if (SUCCEEDED(hr)) + hr = register_coclasses(coclass_list); if (SUCCEEDED(hr)) hr = register_interfaces(interface_list); return hr; } /*********************************************************************** - * DllUnregisterServer (INETCOMM.@) + * DllUnregisterServer (STI.@) */ HRESULT WINAPI DllUnregisterServer(void) { @@ -422,5 +427,7 @@ HRESULT WINAPI DllUnregisterServer(void) hr = unregister_coclasses(coclass_list); if (SUCCEEDED(hr)) hr = unregister_interfaces(interface_list); + if (SUCCEEDED(hr)) + hr = STI_DllUnregisterServer(); return hr; } diff --git a/reactos/dll/win32/sti/sti.c b/reactos/dll/win32/sti/sti.c new file mode 100644 index 00000000000..974bd06f693 --- /dev/null +++ b/reactos/dll/win32/sti/sti.c @@ -0,0 +1,352 @@ +/* + * Copyright (C) 2002 Aric Stewart for CodeWeavers + * Copyright (C) 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winerror.h" +#include "objbase.h" +#include "sti.h" + +#include "sti_private.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(sti); + +static const WCHAR registeredAppsLaunchPath[] = { + 'S','O','F','T','W','A','R','E','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'S','t','i','l','l','I','m','a','g','e','\\', + 'R','e','g','i','s','t','e','r','e','d',' ','A','p','p','l','i','c','a','t','i','o','n','s',0 +}; + +static inline stillimage *impl_from_StillImageW(IStillImageW *iface) +{ + return (stillimage *)((char*)iface - FIELD_OFFSET(stillimage, lpVtbl)); +} + +static HRESULT WINAPI stillimagew_QueryInterface(IStillImageW *iface, REFIID riid, void **ppvObject) +{ + stillimage *This = impl_from_StillImageW(iface); + TRACE("(%p %s %p)\n", This, debugstr_guid(riid), ppvObject); + return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); +} + +static ULONG WINAPI stillimagew_AddRef(IStillImageW *iface) +{ + stillimage *This = impl_from_StillImageW(iface); + return IUnknown_AddRef(This->pUnkOuter); +} + +static ULONG WINAPI stillimagew_Release(IStillImageW *iface) +{ + stillimage *This = impl_from_StillImageW(iface); + return IUnknown_Release(This->pUnkOuter); +} + +static HRESULT WINAPI stillimagew_Initialize(IStillImageW *iface, HINSTANCE hinst, DWORD dwVersion) +{ + stillimage *This = impl_from_StillImageW(iface); + TRACE("(%p, %p, 0x%X)\n", This, hinst, dwVersion); + return S_OK; +} + +static HRESULT WINAPI stillimagew_GetDeviceList(IStillImageW *iface, DWORD dwType, DWORD dwFlags, + DWORD *pdwItemsReturned, LPVOID *ppBuffer) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %u, 0x%X, %p, %p): stub\n", This, dwType, dwFlags, pdwItemsReturned, ppBuffer); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_GetDeviceInfo(IStillImageW *iface, LPWSTR pwszDeviceName, + LPVOID *ppBuffer) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), ppBuffer); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_CreateDevice(IStillImageW *iface, LPWSTR pwszDeviceName, DWORD dwMode, + PSTIDEVICEW *pDevice, LPUNKNOWN pUnkOuter) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %u, %p, %p): stub\n", This, debugstr_w(pwszDeviceName), dwMode, pDevice, pUnkOuter); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_GetDeviceValue(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pValueName, + LPDWORD pType, LPBYTE pData, LPDWORD cbData) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %s, %p, %p, %p): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pValueName), + pType, pData, cbData); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_SetDeviceValue(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pValueName, + DWORD type, LPBYTE pData, DWORD cbData) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %s, %u, %p, %u): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pValueName), + type, pData, cbData); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_GetSTILaunchInformation(IStillImageW *iface, LPWSTR pwszDeviceName, + DWORD *pdwEventCode, LPWSTR pwszEventName) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %p, %p, %p): stub\n", This, pwszDeviceName, + pdwEventCode, pwszEventName); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_RegisterLaunchApplication(IStillImageW *iface, LPWSTR pwszAppName, + LPWSTR pwszCommandLine) +{ + static const WCHAR format[] = {'%','s',' ','%','s',0}; + static const WCHAR commandLineSuffix[] = { + '/','S','t','i','D','e','v','i','c','e',':','%','1',' ', + '/','S','t','i','E','v','e','n','t',':','%','2',0}; + HKEY registeredAppsKey = NULL; + DWORD ret; + HRESULT hr = S_OK; + stillimage *This = impl_from_StillImageW(iface); + + TRACE("(%p, %s, %s)\n", This, debugstr_w(pwszAppName), debugstr_w(pwszCommandLine)); + + ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, registeredAppsLaunchPath, ®isteredAppsKey); + if (ret == ERROR_SUCCESS) + { + WCHAR *value = HeapAlloc(GetProcessHeap(), 0, + (lstrlenW(pwszCommandLine) + 1 + lstrlenW(commandLineSuffix) + 1) * sizeof(WCHAR)); + if (value) + { + sprintfW(value, format, pwszCommandLine, commandLineSuffix); + ret = RegSetValueExW(registeredAppsKey, pwszAppName, 0, + REG_SZ, (BYTE*)value, (lstrlenW(value)+1)*sizeof(WCHAR)); + if (ret != ERROR_SUCCESS) + hr = HRESULT_FROM_WIN32(ret); + HeapFree(GetProcessHeap(), 0, value); + } + else + hr = E_OUTOFMEMORY; + RegCloseKey(registeredAppsKey); + } + else + hr = HRESULT_FROM_WIN32(ret); + return hr; +} + +static HRESULT WINAPI stillimagew_UnregisterLaunchApplication(IStillImageW *iface, LPWSTR pwszAppName) +{ + stillimage *This = impl_from_StillImageW(iface); + HKEY registeredAppsKey = NULL; + DWORD ret; + HRESULT hr = S_OK; + + TRACE("(%p, %s)\n", This, debugstr_w(pwszAppName)); + + ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, registeredAppsLaunchPath, ®isteredAppsKey); + if (ret == ERROR_SUCCESS) + { + ret = RegDeleteValueW(registeredAppsKey, pwszAppName); + if (ret != ERROR_SUCCESS) + hr = HRESULT_FROM_WIN32(ret); + RegCloseKey(registeredAppsKey); + } + else + hr = HRESULT_FROM_WIN32(ret); + return hr; +} + +static HRESULT WINAPI stillimagew_EnableHwNotifications(IStillImageW *iface, LPCWSTR pwszDeviceName, + BOOL bNewState) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %u): stub\n", This, debugstr_w(pwszDeviceName), bNewState); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_GetHwNotificationState(IStillImageW *iface, LPCWSTR pwszDeviceName, + BOOL *pbCurrentState) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), pbCurrentState); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_RefreshDeviceBus(IStillImageW *iface, LPCWSTR pwszDeviceName) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s): stub\n", This, debugstr_w(pwszDeviceName)); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_LaunchApplicationForDevice(IStillImageW *iface, LPWSTR pwszDeviceName, + LPWSTR pwszAppName, LPSTINOTIFY pStiNotify) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pwszAppName), + pStiNotify); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_SetupDeviceParameters(IStillImageW *iface, PSTI_DEVICE_INFORMATIONW pDevInfo) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %p): stub\n", This, pDevInfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_WriteToErrorLog(IStillImageW *iface, DWORD dwMessageType, LPCWSTR pszMessage) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %u, %s): stub\n", This, dwMessageType, debugstr_w(pszMessage)); + return E_NOTIMPL; +} + +static const struct IStillImageWVtbl stillimagew_vtbl = +{ + stillimagew_QueryInterface, + stillimagew_AddRef, + stillimagew_Release, + stillimagew_Initialize, + stillimagew_GetDeviceList, + stillimagew_GetDeviceInfo, + stillimagew_CreateDevice, + stillimagew_GetDeviceValue, + stillimagew_SetDeviceValue, + stillimagew_GetSTILaunchInformation, + stillimagew_RegisterLaunchApplication, + stillimagew_UnregisterLaunchApplication, + stillimagew_EnableHwNotifications, + stillimagew_GetHwNotificationState, + stillimagew_RefreshDeviceBus, + stillimagew_LaunchApplicationForDevice, + stillimagew_SetupDeviceParameters, + stillimagew_WriteToErrorLog +}; + +static inline stillimage *impl_from_InternalUnknown(IUnknown *iface) +{ + return (stillimage *)((char*)iface - FIELD_OFFSET(stillimage, lpInternalUnkVtbl)); +} + +static HRESULT WINAPI Internal_QueryInterface(IUnknown *iface, REFIID riid, void **ppvObject) +{ + stillimage *This = impl_from_InternalUnknown(iface); + + TRACE("(%p %s %p)\n", This, debugstr_guid(riid), ppvObject); + + if (IsEqualGUID(riid, &IID_IUnknown)) + *ppvObject = iface; + else if (IsEqualGUID(riid, &IID_IStillImageW)) + *ppvObject = &This->lpVtbl; + else + { + if (IsEqualGUID(riid, &IID_IStillImageA)) + FIXME("interface IStillImageA is unsupported on Windows Vista too, please report if it's needed\n"); + else + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + *ppvObject = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*) *ppvObject); + return S_OK; +} + +static ULONG WINAPI Internal_AddRef(IUnknown *iface) +{ + stillimage *This = impl_from_InternalUnknown(iface); + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI Internal_Release(IUnknown *iface) +{ + ULONG ref; + stillimage *This = impl_from_InternalUnknown(iface); + + ref = InterlockedDecrement(&This->ref); + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + return ref; +} + +static const struct IUnknownVtbl internal_unk_vtbl = +{ + Internal_QueryInterface, + Internal_AddRef, + Internal_Release +}; + +/****************************************************************************** + * StiCreateInstanceA (STI.@) + */ +HRESULT WINAPI StiCreateInstanceA(HINSTANCE hinst, DWORD dwVer, PSTIA *ppSti, LPUNKNOWN pUnkOuter) +{ + FIXME("(%p, %u, %p, %p): stub, unimplemented on Windows Vista too, please report if it's needed\n", hinst, dwVer, ppSti, pUnkOuter); + return STG_E_UNIMPLEMENTEDFUNCTION; +} + +/****************************************************************************** + * StiCreateInstanceW (STI.@) + */ +HRESULT WINAPI StiCreateInstanceW(HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter) +{ + stillimage *This; + HRESULT hr; + + TRACE("(%p, %u, %p, %p)\n", hinst, dwVer, ppSti, pUnkOuter); + + This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(stillimage)); + if (This) + { + This->lpVtbl = &stillimagew_vtbl; + This->lpInternalUnkVtbl = &internal_unk_vtbl; + if (pUnkOuter) + This->pUnkOuter = pUnkOuter; + else + This->pUnkOuter = (IUnknown*) &This->lpInternalUnkVtbl; + This->ref = 1; + + hr = IStillImage_Initialize((IStillImageW*) &This->lpVtbl, hinst, dwVer); + if (SUCCEEDED(hr)) + { + if (pUnkOuter) + *ppSti = (IStillImageW*) &This->lpInternalUnkVtbl; + else + *ppSti = (IStillImageW*) &This->lpVtbl; + } + } + else + hr = E_OUTOFMEMORY; + + return hr; +} diff --git a/reactos/dll/win32/sti/sti.rbuild b/reactos/dll/win32/sti/sti.rbuild index 592c5f123af..edce67acab8 100644 --- a/reactos/dll/win32/sti/sti.rbuild +++ b/reactos/dll/win32/sti/sti.rbuild @@ -8,11 +8,29 @@ include/reactos/wine 0x600 + STI_ + + + regsvr.c + sti.c sti_main.c + sti_wia.idl wine - advapi32 + sti_proxy ole32 + oleaut32 + rpcrt4 + advapi32 + pseh + uuid ntdll + + + STI_ + + + sti_wia.idl + diff --git a/reactos/dll/win32/sti/sti.spec b/reactos/dll/win32/sti/sti.spec index 186f382f195..300e7fac4b7 100644 --- a/reactos/dll/win32/sti/sti.spec +++ b/reactos/dll/win32/sti/sti.spec @@ -1,7 +1,7 @@ -@ stub DllCanUnloadNow -@ stub DllGetClassObject +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer() -@ stdcall StiCreateInstance(ptr long ptr ptr) +@ stdcall StiCreateInstance(ptr long ptr ptr) StiCreateInstanceW @ stdcall StiCreateInstanceA(ptr long ptr ptr) @ stdcall StiCreateInstanceW(ptr long ptr ptr) diff --git a/reactos/dll/win32/sti/sti_main.c b/reactos/dll/win32/sti/sti_main.c index 1d4e6ad0408..711c17f14eb 100644 --- a/reactos/dll/win32/sti/sti_main.c +++ b/reactos/dll/win32/sti/sti_main.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2002 Aric Stewart for CodeWeavers + * Copyright (C) 2009 Damjan Jovanovic * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,31 +19,148 @@ #include +#define COBJMACROS + #include "windef.h" #include "winbase.h" #include "winreg.h" #include "winerror.h" +#include "objbase.h" +#include "sti.h" -/****************************************************************************** - * StiCreateInstance (STI.@) - */ -HRESULT WINAPI StiCreateInstance( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(sti); + +extern HRESULT WINAPI STI_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLSPEC_HIDDEN; +extern BOOL WINAPI STI_DllMain(HINSTANCE, DWORD, LPVOID) DECLSPEC_HIDDEN; + +typedef HRESULT (*fnCreateInstance)(REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj); + +typedef struct { - return STG_E_UNIMPLEMENTEDFUNCTION; + const struct IClassFactoryVtbl *vtbl; + fnCreateInstance pfnCreateInstance; +} sti_cf; + +static inline sti_cf *impl_from_IClassFactory( IClassFactory *iface ) +{ + return (sti_cf *)((char *)iface - FIELD_OFFSET( sti_cf, vtbl )); +} + +static HRESULT sti_create( REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj ) +{ + if (pUnkOuter != NULL && !IsEqualIID(riid, &IID_IUnknown)) + return CLASS_E_NOAGGREGATION; + + if (IsEqualGUID(riid, &IID_IUnknown)) + return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, pUnkOuter); + else if (IsEqualGUID(riid, &IID_IStillImageW)) + return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, NULL); + else if (IsEqualGUID(riid, &IID_IStillImageA)) + return StiCreateInstanceA(GetCurrentProcess(), STI_VERSION_REAL, (PSTIA*) ppObj, NULL); + else + { + FIXME("no interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } +} + +static HRESULT WINAPI sti_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) +{ + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IClassFactory)) + { + IClassFactory_AddRef( iface ); + *ppobj = iface; + return S_OK; + } + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI sti_cf_AddRef( IClassFactory *iface ) +{ + return 2; +} + +static ULONG WINAPI sti_cf_Release( IClassFactory *iface ) +{ + return 1; +} + +static HRESULT WINAPI sti_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, + REFIID riid, LPVOID *ppobj ) +{ + sti_cf *This = impl_from_IClassFactory( iface ); + HRESULT r; + IUnknown *punk; + + TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + r = This->pfnCreateInstance( riid, pOuter, (LPVOID *)&punk ); + if (FAILED(r)) + return r; + + r = IUnknown_QueryInterface( punk, riid, ppobj ); + if (FAILED(r)) + return r; + + IUnknown_Release( punk ); + return r; +} + +static HRESULT WINAPI sti_cf_LockServer( IClassFactory *iface, BOOL dolock ) +{ + FIXME("(%p)->(%d)\n", iface, dolock); + return S_OK; +} + +static const struct IClassFactoryVtbl sti_cf_vtbl = +{ + sti_cf_QueryInterface, + sti_cf_AddRef, + sti_cf_Release, + sti_cf_CreateInstance, + sti_cf_LockServer +}; + +static sti_cf the_sti_cf = { &sti_cf_vtbl, sti_create }; + +BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("(0x%p, %d, %p)\n",hInstDLL,fdwReason,lpvReserved); + + if (fdwReason == DLL_WINE_PREATTACH) + return FALSE; + return STI_DllMain(hInstDLL, fdwReason, lpvReserved); } /****************************************************************************** - * StiCreateInstanceA (STI.@) + * DllGetClassObject (STI.@) */ -HRESULT WINAPI StiCreateInstanceA( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) { - return STG_E_UNIMPLEMENTEDFUNCTION; + IClassFactory *cf = NULL; + + TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); + + if (IsEqualGUID( rclsid, &CLSID_Sti )) + { + cf = (IClassFactory *)&the_sti_cf.vtbl; + } + + if (cf) + return IClassFactory_QueryInterface( cf, iid, ppv ); + return STI_DllGetClassObject( rclsid, iid, ppv ); } /****************************************************************************** - * StiCreateInstanceW (STI.@) + * DllCanUnloadNow (STI.@) */ -HRESULT WINAPI StiCreateInstanceW( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +HRESULT WINAPI DllCanUnloadNow( void ) { - return STG_E_UNIMPLEMENTEDFUNCTION; + return S_FALSE; } diff --git a/reactos/dll/win32/sti/sti_private.h b/reactos/dll/win32/sti/sti_private.h new file mode 100644 index 00000000000..b5e106b60b6 --- /dev/null +++ b/reactos/dll/win32/sti/sti_private.h @@ -0,0 +1,32 @@ +/* + * STI private definitions + * + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __STI_PRIVATE__ +#define __STI_PRIVATE__ + +typedef struct _stillimage +{ + const struct IStillImageWVtbl *lpVtbl; + const struct IUnknownVtbl *lpInternalUnkVtbl; + IUnknown *pUnkOuter; + LONG ref; +} stillimage; + +#endif /* __STI_PRIVATE__ */ diff --git a/reactos/dll/win32/sti/sti_wia.idl b/reactos/dll/win32/sti/sti_wia.idl new file mode 100644 index 00000000000..aaac943445f --- /dev/null +++ b/reactos/dll/win32/sti/sti_wia.idl @@ -0,0 +1,19 @@ +/* + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wia_lh.idl" diff --git a/reactos/dll/win32/urlmon/bindprot.c b/reactos/dll/win32/urlmon/bindprot.c index 07d6fc2f525..29b8532b13d 100644 --- a/reactos/dll/win32/urlmon/bindprot.c +++ b/reactos/dll/win32/urlmon/bindprot.c @@ -155,7 +155,7 @@ HWND get_notif_hwnd(void) NULL }; - wndclass.hInstance = URLMON_hInstance; + wndclass.hInstance = hProxyDll; wnd_class = RegisterClassExW(&wndclass); if (!wnd_class && GetLastError() == ERROR_CLASS_ALREADY_EXISTS) @@ -164,7 +164,7 @@ HWND get_notif_hwnd(void) tls_data->notif_hwnd = CreateWindowExW(0, wszURLMonikerNotificationWindow, wszURLMonikerNotificationWindow, 0, 0, 0, 0, 0, HWND_MESSAGE, - NULL, URLMON_hInstance, NULL); + NULL, hProxyDll, NULL); if(tls_data->notif_hwnd) tls_data->notif_hwnd_cnt++; diff --git a/reactos/dll/win32/urlmon/regsvr.c b/reactos/dll/win32/urlmon/regsvr.c index 9e278259e37..6e417ac9607 100644 --- a/reactos/dll/win32/urlmon/regsvr.c +++ b/reactos/dll/win32/urlmon/regsvr.c @@ -560,7 +560,7 @@ static HRESULT register_inf(BOOL doregister) hAdvpack = LoadLibraryW(wszAdvpack); pRegInstall = (void *)GetProcAddress(hAdvpack, "RegInstall"); - hres = pRegInstall(URLMON_hInstance, doregister ? "RegisterDll" : "UnregisterDll", &strtable); + hres = pRegInstall(hProxyDll, doregister ? "RegisterDll" : "UnregisterDll", &strtable); for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) heap_free(pse[i].pszValue); diff --git a/reactos/dll/win32/urlmon/urlmon_main.c b/reactos/dll/win32/urlmon/urlmon_main.c index 272884eb2a6..edaad42289f 100644 --- a/reactos/dll/win32/urlmon/urlmon_main.c +++ b/reactos/dll/win32/urlmon/urlmon_main.c @@ -34,7 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); LONG URLMON_refCount = 0; -HINSTANCE URLMON_hInstance = 0; static HMODULE hCabinet = NULL; static DWORD urlmon_tls = TLS_OUT_OF_INDEXES; @@ -144,9 +143,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) { TRACE("%p 0x%x %p\n", hinstDLL, fdwReason, fImpLoad); + URLMON_DllMain( hinstDLL, fdwReason, fImpLoad ); + switch(fdwReason) { case DLL_PROCESS_ATTACH: - URLMON_hInstance = hinstDLL; init_session(TRUE); break; diff --git a/reactos/dll/win32/urlmon/urlmon_main.h b/reactos/dll/win32/urlmon/urlmon_main.h index 8db786b7d80..071af8dd73e 100644 --- a/reactos/dll/win32/urlmon/urlmon_main.h +++ b/reactos/dll/win32/urlmon/urlmon_main.h @@ -36,7 +36,7 @@ #include "wine/unicode.h" #include "wine/list.h" -extern HINSTANCE URLMON_hInstance; +extern HINSTANCE hProxyDll DECLSPEC_HIDDEN; extern HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT ZoneMgrImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT StdURLMoniker_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); @@ -48,6 +48,7 @@ extern HRESULT GopherProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT MkProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT MimeFilter_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); +extern BOOL WINAPI URLMON_DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllRegisterServer(void) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllUnregisterServer(void) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/urlmon/urlmon_urlmon.idl b/reactos/dll/win32/urlmon/urlmon_urlmon.idl index 71a0719d7d9..d45ba07e456 100644 --- a/reactos/dll/win32/urlmon/urlmon_urlmon.idl +++ b/reactos/dll/win32/urlmon/urlmon_urlmon.idl @@ -1,5 +1,5 @@ /* - * Copyright 2009 Piotr Caban for Codeweavers + * Copyright 2009 Piotr Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/reactos/dll/win32/urlmon/usrmarshal.c b/reactos/dll/win32/urlmon/usrmarshal.c index b94556362be..6ff8f04ef26 100644 --- a/reactos/dll/win32/urlmon/usrmarshal.c +++ b/reactos/dll/win32/urlmon/usrmarshal.c @@ -1,5 +1,5 @@ /* - * Copyright 2009 Piotr Caban for Codeweavers + * Copyright 2009 Piotr Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/reactos/dll/win32/usp10/bidi.c b/reactos/dll/win32/usp10/bidi.c new file mode 100644 index 00000000000..28b5d3e76ce --- /dev/null +++ b/reactos/dll/win32/usp10/bidi.c @@ -0,0 +1,893 @@ +/* + * Uniscribe BiDirectional handling + * + * Copyright 2003 Shachar Shemesh + * Copyright 2007 Maarten Lankhorst + * Copyright 2010 CodeWeavers, Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Code derived from the modified reference implementation + * that was found in revision 17 of http://unicode.org/reports/tr9/ + * "Unicode Standard Annex #9: THE BIDIRECTIONAL ALGORITHM" + * + * -- Copyright (C) 1999-2005, ASMUS, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of the Unicode data files and any associated documentation (the + * "Data Files") or Unicode software and any associated documentation (the + * "Software") to deal in the Data Files or Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, and/or sell copies of the Data Files or Software, + * and to permit persons to whom the Data Files or Software are furnished + * to do so, provided that (a) the above copyright notice(s) and this + * permission notice appear with all copies of the Data Files or Software, + * (b) both the above copyright notice(s) and this permission notice appear + * in associated documentation, and (c) there is clear notice in each + * modified Data File or in the Software as well as in the documentation + * associated with the Data File(s) or Software that the data or software + * has been modified. + */ + +#include "config.h" + +#include +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winnls.h" +#include "usp10.h" +#include "wine/unicode.h" +#include "wine/debug.h" + +#include "usp10_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(bidi); + +#define ASSERT(x) do { if (!(x)) FIXME("assert failed: %s\n", #x); } while(0) +#define MAX_LEVEL 61 + +/* HELPER FUNCTIONS AND DECLARATIONS */ + +/*------------------------------------------------------------------------ + Bidirectional Character Types + + as defined by the Unicode Bidirectional Algorithm Table 3-7. + + Note: + + The list of bidirectional character types here is not grouped the + same way as the table 3-7, since the numberic values for the types + are chosen to keep the state and action tables compact. +------------------------------------------------------------------------*/ +enum directions +{ + /* input types */ + /* ON MUST be zero, code relies on ON = N = 0 */ + ON = 0, /* Other Neutral */ + L, /* Left Letter */ + R, /* Right Letter */ + AN, /* Arabic Number */ + EN, /* European Number */ + AL, /* Arabic Letter (Right-to-left) */ + NSM, /* Non-spacing Mark */ + CS, /* Common Separator */ + ES, /* European Separator */ + ET, /* European Terminator (post/prefix e.g. $ and %) */ + + /* resolved types */ + BN, /* Boundary neutral (type of RLE etc after explicit levels) */ + + /* input types, */ + S, /* Segment Separator (TAB) // used only in L1 */ + WS, /* White space // used only in L1 */ + B, /* Paragraph Separator (aka as PS) */ + + /* types for explicit controls */ + RLO, /* these are used only in X1-X9 */ + RLE, + LRO, + LRE, + PDF, + + /* resolved types, also resolved directions */ + N = ON, /* alias, where ON, WS and S are treated the same */ +}; + +/* HELPER FUNCTIONS */ +/* the character type contains the C1_* flags in the low 12 bits */ +/* and the C2_* type in the high 4 bits */ +static __inline unsigned short get_char_typeW( WCHAR ch ) +{ + WORD CharType; + GetStringTypeW(CT_CTYPE1, &ch, 1, &CharType); + return CharType; +} + +/* Convert the libwine information to the direction enum */ +static void classify(LPCWSTR lpString, WORD *chartype, DWORD uCount, const SCRIPT_CONTROL *c) +{ + static const enum directions dir_map[16] = + { + L, /* unassigned defaults to L */ + L, + R, + EN, + ES, + ET, + AN, + CS, + B, + S, + WS, + ON, + AL, + NSM, + BN, + PDF /* also LRE, LRO, RLE, RLO */ + }; + + unsigned i; + + for (i = 0; i < uCount; ++i) + { + chartype[i] = dir_map[get_char_typeW(lpString[i]) >> 12]; + switch (chartype[i]) + { + case ES: + if (!c->fLegacyBidiClass) break; + switch (lpString[i]) + { + case '-': + case '+': chartype[i] = N; break; + case '/': chartype[i] = CS; break; + } + break; + case PDF: + switch (lpString[i]) + { + case 0x202A: chartype[i] = LRE; break; + case 0x202B: chartype[i] = RLE; break; + case 0x202C: chartype[i] = PDF; break; + case 0x202D: chartype[i] = LRO; break; + case 0x202E: chartype[i] = RLO; break; + } + break; + } + } +} + +/* Set a run of cval values at locations all prior to, but not including */ +/* iStart, to the new value nval. */ +static void SetDeferredRun(WORD *pval, int cval, int iStart, int nval) +{ + int i = iStart - 1; + for (; i >= iStart - cval; i--) + { + pval[i] = nval; + } +} + +/* RESOLVE EXPLICIT */ + +static WORD GreaterEven(int i) +{ + return odd(i) ? i + 1 : i + 2; +} + +static WORD GreaterOdd(int i) +{ + return odd(i) ? i + 2 : i + 1; +} + +static WORD EmbeddingDirection(int level) +{ + return odd(level) ? R : L; +} + +/*------------------------------------------------------------------------ + Function: resolveExplicit + + Recursively resolves explicit embedding levels and overrides. + Implements rules X1-X9, of the Unicode Bidirectional Algorithm. + + Input: Base embedding level and direction + Character count + + Output: Array of embedding levels + + In/Out: Array of direction classes + + + Note: The function uses two simple counters to keep track of + matching explicit codes and PDF. Use the default argument for + the outermost call. The nesting counter counts the recursion + depth and not the embedding level. +------------------------------------------------------------------------*/ + +static int resolveExplicit(int level, int dir, WORD *pcls, WORD *plevel, int cch, int nNest) +{ + /* always called with a valid nesting level + nesting levels are != embedding levels */ + int nLastValid = nNest; + int ich = 0; + + /* check input values */ + ASSERT(nNest >= 0 && level >= 0 && level <= MAX_LEVEL); + + /* process the text */ + for (; ich < cch; ich++) + { + WORD cls = pcls[ich]; + switch (cls) + { + case LRO: + case LRE: + nNest++; + if (GreaterEven(level) <= MAX_LEVEL - (cls == LRO ? 2 : 0)) + { + plevel[ich] = GreaterEven(level); + pcls[ich] = BN; + ich += resolveExplicit(plevel[ich], (cls == LRE ? N : L), + &pcls[ich+1], &plevel[ich+1], + cch - (ich+1), nNest); + nNest--; + continue; + } + cls = pcls[ich] = BN; + break; + + case RLO: + case RLE: + nNest++; + if (GreaterOdd(level) <= MAX_LEVEL - (cls == RLO ? 2 : 0)) + { + plevel[ich] = GreaterOdd(level); + pcls[ich] = BN; + ich += resolveExplicit(plevel[ich], (cls == RLE ? N : R), + &pcls[ich+1], &plevel[ich+1], + cch - (ich+1), nNest); + nNest--; + continue; + } + cls = pcls[ich] = BN; + break; + + case PDF: + cls = pcls[ich] = BN; + if (nNest) + { + if (nLastValid < nNest) + { + nNest--; + } + else + { + cch = ich; /* break the loop, but complete body */ + } + } + } + + /* Apply the override */ + if (dir != N) + { + cls = dir; + } + plevel[ich] = level; + if (pcls[ich] != BN) + pcls[ich] = cls; + } + + return ich; +} + +/* RESOLVE WEAK TYPES */ + +enum states /* possible states */ +{ + xa, /* arabic letter */ + xr, /* right letter */ + xl, /* left letter */ + + ao, /* arabic lett. foll by ON */ + ro, /* right lett. foll by ON */ + lo, /* left lett. foll by ON */ + + rt, /* ET following R */ + lt, /* ET following L */ + + cn, /* EN, AN following AL */ + ra, /* arabic number foll R */ + re, /* european number foll R */ + la, /* arabic number foll L */ + le, /* european number foll L */ + + ac, /* CS following cn */ + rc, /* CS following ra */ + rs, /* CS,ES following re */ + lc, /* CS following la */ + ls, /* CS,ES following le */ + + ret, /* ET following re */ + let, /* ET following le */ +} ; + +static const int stateWeak[][10] = +{ + /* N, L, R, AN, EN, AL,NSM, CS, ES, ET */ +/*xa*/ { ao, xl, xr, cn, cn, xa, xa, ao, ao, ao }, /* arabic letter */ +/*xr*/ { ro, xl, xr, ra, re, xa, xr, ro, ro, rt }, /* right letter */ +/*xl*/ { lo, xl, xr, la, le, xa, xl, lo, lo, lt }, /* left letter */ + +/*ao*/ { ao, xl, xr, cn, cn, xa, ao, ao, ao, ao }, /* arabic lett. foll by ON*/ +/*ro*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* right lett. foll by ON */ +/*lo*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* left lett. foll by ON */ + +/*rt*/ { ro, xl, xr, ra, re, xa, rt, ro, ro, rt }, /* ET following R */ +/*lt*/ { lo, xl, xr, la, le, xa, lt, lo, lo, lt }, /* ET following L */ + +/*cn*/ { ao, xl, xr, cn, cn, xa, cn, ac, ao, ao }, /* EN, AN following AL */ +/*ra*/ { ro, xl, xr, ra, re, xa, ra, rc, ro, rt }, /* arabic number foll R */ +/*re*/ { ro, xl, xr, ra, re, xa, re, rs, rs,ret }, /* european number foll R */ +/*la*/ { lo, xl, xr, la, le, xa, la, lc, lo, lt }, /* arabic number foll L */ +/*le*/ { lo, xl, xr, la, le, xa, le, ls, ls,let }, /* european number foll L */ + +/*ac*/ { ao, xl, xr, cn, cn, xa, ao, ao, ao, ao }, /* CS following cn */ +/*rc*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* CS following ra */ +/*rs*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* CS,ES following re */ +/*lc*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* CS following la */ +/*ls*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* CS,ES following le */ + +/*ret*/{ ro, xl, xr, ra, re, xa,ret, ro, ro,ret }, /* ET following re */ +/*let*/{ lo, xl, xr, la, le, xa,let, lo, lo,let }, /* ET following le */ +}; + +enum actions /* possible actions */ +{ + /* primitives */ + IX = 0x100, /* increment */ + XX = 0xF, /* no-op */ + + /* actions */ + xxx = (XX << 4) + XX, /* no-op */ + xIx = IX + xxx, /* increment run */ + xxN = (XX << 4) + ON, /* set current to N */ + xxE = (XX << 4) + EN, /* set current to EN */ + xxA = (XX << 4) + AN, /* set current to AN */ + xxR = (XX << 4) + R, /* set current to R */ + xxL = (XX << 4) + L, /* set current to L */ + Nxx = (ON << 4) + 0xF, /* set run to neutral */ + Axx = (AN << 4) + 0xF, /* set run to AN */ + ExE = (EN << 4) + EN, /* set run to EN, set current to EN */ + NIx = (ON << 4) + 0xF + IX, /* set run to N, increment */ + NxN = (ON << 4) + ON, /* set run to N, set current to N */ + NxR = (ON << 4) + R, /* set run to N, set current to R */ + NxE = (ON << 4) + EN, /* set run to N, set current to EN */ + + AxA = (AN << 4) + AN, /* set run to AN, set current to AN */ + NxL = (ON << 4) + L, /* set run to N, set current to L */ + LxL = (L << 4) + L, /* set run to L, set current to L */ +} ; + +static const int actionWeak[][10] = +{ + /* N, L, R, AN, EN, AL, NSM, CS, ES, ET */ +/*xa*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxR, xxN, xxN, xxN }, /* arabic letter */ +/*xr*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxR, xxN, xxN, xIx }, /* right letter */ +/*xl*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxL, xxN, xxN, xIx }, /* left letter */ + +/*ao*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxN, xxN, xxN, xxN }, /* arabic lett. foll by ON */ +/*ro*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxN, xxN, xxN, xIx }, /* right lett. foll by ON */ +/*lo*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxN, xxN, xxN, xIx }, /* left lett. foll by ON */ + +/*rt*/ { Nxx, Nxx, Nxx, Nxx, ExE, NxR, xIx, NxN, NxN, xIx }, /* ET following R */ +/*lt*/ { Nxx, Nxx, Nxx, Nxx, LxL, NxR, xIx, NxN, NxN, xIx }, /* ET following L */ + +/*cn*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxA, xIx, xxN, xxN }, /* EN, AN following AL */ +/*ra*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxA, xIx, xxN, xIx }, /* arabic number foll R */ +/*re*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxE, xIx, xIx, xxE }, /* european number foll R */ +/*la*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxA, xIx, xxN, xIx }, /* arabic number foll L */ +/*le*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxL, xIx, xIx, xxL }, /* european number foll L */ + +/*ac*/ { Nxx, Nxx, Nxx, Axx, AxA, NxR, NxN, NxN, NxN, NxN }, /* CS following cn */ +/*rc*/ { Nxx, Nxx, Nxx, Axx, NxE, NxR, NxN, NxN, NxN, NIx }, /* CS following ra */ +/*rs*/ { Nxx, Nxx, Nxx, Nxx, ExE, NxR, NxN, NxN, NxN, NIx }, /* CS,ES following re */ +/*lc*/ { Nxx, Nxx, Nxx, Axx, NxL, NxR, NxN, NxN, NxN, NIx }, /* CS following la */ +/*ls*/ { Nxx, Nxx, Nxx, Nxx, LxL, NxR, NxN, NxN, NxN, NIx }, /* CS,ES following le */ + +/*ret*/{ xxx, xxx, xxx, xxx, xxE, xxR, xxE, xxN, xxN, xxE }, /* ET following re */ +/*let*/{ xxx, xxx, xxx, xxx, xxL, xxR, xxL, xxN, xxN, xxL }, /* ET following le */ +}; + +static int GetDeferredType(int action) +{ + return (action >> 4) & 0xF; +} + +static int GetResolvedType(int action) +{ + return action & 0xF; +} + +/* Note on action table: + + States can be of two kinds: + - Immediate Resolution State, where each input token + is resolved as soon as it is seen. These states have + only single action codes (xxN) or the no-op (xxx) + for static input tokens. + - Deferred Resolution State, where input tokens either + either extend the run (xIx) or resolve its Type (e.g. Nxx). + + Input classes are of three kinds + - Static Input Token, where the class of the token remains + unchanged on output (AN, L, N, R) + - Replaced Input Token, where the class of the token is + always replaced on output (AL, BN, NSM, CS, ES, ET) + - Conditional Input Token, where the class of the token is + changed on output in some, but not all, cases (EN) + + Where tokens are subject to change, a double action + (e.g. NxA, or NxN) is _required_ after deferred states, + resolving both the deferred state and changing the current token. +*/ + +/*------------------------------------------------------------------------ + Function: resolveWeak + + Resolves the directionality of numeric and other weak character types + + Implements rules X10 and W1-W6 of the Unicode Bidirectional Algorithm. + + Input: Array of embedding levels + Character count + + In/Out: Array of directional classes + + Note: On input only these directional classes are expected + AL, HL, R, L, ON, BN, NSM, AN, EN, ES, ET, CS, +------------------------------------------------------------------------*/ +static void resolveWeak(int baselevel, WORD *pcls, WORD *plevel, int cch) +{ + int state = odd(baselevel) ? xr : xl; + int cls; + + int level = baselevel; + int action, clsRun, clsNew; + int cchRun = 0; + int ich = 0; + + for (; ich < cch; ich++) + { + /* ignore boundary neutrals */ + if (pcls[ich] == BN) + { + /* must flatten levels unless at a level change; */ + plevel[ich] = level; + + /* lookahead for level changes */ + if (ich + 1 == cch && level != baselevel) + { + /* have to fixup last BN before end of the loop, since + * its fix-upped value will be needed below the assert */ + pcls[ich] = EmbeddingDirection(level); + } + else if (ich + 1 < cch && level != plevel[ich+1] && pcls[ich+1] != BN) + { + /* fixup LAST BN in front / after a level run to make + * it act like the SOR/EOR in rule X10 */ + int newlevel = plevel[ich+1]; + if (level > newlevel) { + newlevel = level; + } + plevel[ich] = newlevel; + + /* must match assigned level */ + pcls[ich] = EmbeddingDirection(newlevel); + level = plevel[ich+1]; + } + else + { + /* don't interrupt runs */ + if (cchRun) + { + cchRun++; + } + continue; + } + } + + ASSERT(pcls[ich] <= BN); + cls = pcls[ich]; + + action = actionWeak[state][cls]; + + /* resolve the directionality for deferred runs */ + clsRun = GetDeferredType(action); + if (clsRun != XX) + { + SetDeferredRun(pcls, cchRun, ich, clsRun); + cchRun = 0; + } + + /* resolve the directionality class at the current location */ + clsNew = GetResolvedType(action); + if (clsNew != XX) + pcls[ich] = clsNew; + + /* increment a deferred run */ + if (IX & action) + cchRun++; + + state = stateWeak[state][cls]; + } + + /* resolve any deferred runs + * use the direction of the current level to emulate PDF */ + cls = EmbeddingDirection(level); + + /* resolve the directionality for deferred runs */ + clsRun = GetDeferredType(actionWeak[state][cls]); + if (clsRun != XX) + SetDeferredRun(pcls, cchRun, ich, clsRun); +} + +/* RESOLVE NEUTRAL TYPES */ + +/* action values */ +enum neutralactions +{ + /* action to resolve previous input */ + nL = L, /* resolve EN to L */ + En = 3 << 4, /* resolve neutrals run to embedding level direction */ + Rn = R << 4, /* resolve neutrals run to strong right */ + Ln = L << 4, /* resolved neutrals run to strong left */ + In = (1<<8), /* increment count of deferred neutrals */ + LnL = (1<<4)+L, /* set run and EN to L */ +}; + +static int GetDeferredNeutrals(int action, int level) +{ + action = (action >> 4) & 0xF; + if (action == (En >> 4)) + return EmbeddingDirection(level); + else + return action; +} + +static int GetResolvedNeutrals(int action) +{ + action = action & 0xF; + if (action == In) + return 0; + else + return action; +} + +/* state values */ +enum resolvestates +{ + /* new temporary class */ + r, /* R and characters resolved to R */ + l, /* L and characters resolved to L */ + rn, /* N preceded by right */ + ln, /* N preceded by left */ + a, /* AN preceded by left (the abbreviation 'la' is used up above) */ + na, /* N preceded by a */ +} ; + + +/*------------------------------------------------------------------------ + Notes: + + By rule W7, whenever a EN is 'dominated' by an L (including start of + run with embedding direction = L) it is resolved to, and further treated + as L. + + This leads to the need for 'a' and 'na' states. +------------------------------------------------------------------------*/ + +static const int actionNeutrals[][5] = +{ +/* N, L, R, AN, EN = cls */ + { In, 0, 0, 0, 0 }, /* r right */ + { In, 0, 0, 0, L }, /* l left */ + + { In, En, Rn, Rn, Rn }, /* rn N preceded by right */ + { In, Ln, En, En, LnL}, /* ln N preceded by left */ + + { In, 0, 0, 0, L }, /* a AN preceded by left */ + { In, En, Rn, Rn, En }, /* na N preceded by a */ +} ; + +static const int stateNeutrals[][5] = +{ +/* N, L, R, AN, EN */ + { rn, l, r, r, r }, /* r right */ + { ln, l, r, a, l }, /* l left */ + + { rn, l, r, r, r }, /* rn N preceded by right */ + { ln, l, r, a, l }, /* ln N preceded by left */ + + { na, l, r, a, l }, /* a AN preceded by left */ + { na, l, r, a, l }, /* na N preceded by la */ +} ; + +/*------------------------------------------------------------------------ + Function: resolveNeutrals + + Resolves the directionality of neutral character types. + + Implements rules W7, N1 and N2 of the Unicode Bidi Algorithm. + + Input: Array of embedding levels + Character count + Baselevel + + In/Out: Array of directional classes + + Note: On input only these directional classes are expected + R, L, N, AN, EN and BN + + W8 resolves a number of ENs to L +------------------------------------------------------------------------*/ +static void resolveNeutrals(int baselevel, WORD *pcls, const WORD *plevel, int cch) +{ + /* the state at the start of text depends on the base level */ + int state = odd(baselevel) ? r : l; + int cls; + + int cchRun = 0; + int level = baselevel; + + int action, clsRun, clsNew; + int ich = 0; + for (; ich < cch; ich++) + { + /* ignore boundary neutrals */ + if (pcls[ich] == BN) + { + /* include in the count for a deferred run */ + if (cchRun) + cchRun++; + + /* skip any further processing */ + continue; + } + + ASSERT(pcls[ich] < 5); /* "Only N, L, R, AN, EN are allowed" */ + cls = pcls[ich]; + + action = actionNeutrals[state][cls]; + + /* resolve the directionality for deferred runs */ + clsRun = GetDeferredNeutrals(action, level); + if (clsRun != N) + { + SetDeferredRun(pcls, cchRun, ich, clsRun); + cchRun = 0; + } + + /* resolve the directionality class at the current location */ + clsNew = GetResolvedNeutrals(action); + if (clsNew != N) + pcls[ich] = clsNew; + + if (In & action) + cchRun++; + + state = stateNeutrals[state][cls]; + level = plevel[ich]; + } + + /* resolve any deferred runs */ + cls = EmbeddingDirection(level); /* eor has type of current level */ + + /* resolve the directionality for deferred runs */ + clsRun = GetDeferredNeutrals(actionNeutrals[state][cls], level); + if (clsRun != N) + SetDeferredRun(pcls, cchRun, ich, clsRun); +} + +/* RESOLVE IMPLICIT */ + +/*------------------------------------------------------------------------ + Function: resolveImplicit + + Recursively resolves implicit embedding levels. + Implements rules I1 and I2 of the Unicode Bidirectional Algorithm. + + Input: Array of direction classes + Character count + Base level + + In/Out: Array of embedding levels + + Note: levels may exceed 15 on output. + Accepted subset of direction classes + R, L, AN, EN +------------------------------------------------------------------------*/ +static const WORD addLevel[][4] = +{ + /* L, R, AN, EN */ +/* even */ { 0, 1, 2, 2, }, +/* odd */ { 1, 0, 1, 1, } + +}; + +static void resolveImplicit(const WORD * pcls, WORD *plevel, int cch) +{ + int ich = 0; + for (; ich < cch; ich++) + { + /* cannot resolve bn here, since some bn were resolved to strong + * types in resolveWeak. To remove these we need the original + * types, which are available again in resolveWhiteSpace */ + if (pcls[ich] == BN) + { + continue; + } + ASSERT(pcls[ich] > 0); /* "No Neutrals allowed to survive here." */ + ASSERT(pcls[ich] < 5); /* "Out of range." */ + plevel[ich] += addLevel[odd(plevel[ich])][pcls[ich] - 1]; + } +} + +/************************************************************* + * BIDI_DeterminLevels + */ +BOOL BIDI_DetermineLevels( + LPCWSTR lpString, /* [in] The string for which information is to be returned */ + INT uCount, /* [in] Number of WCHARs in string. */ + const SCRIPT_STATE *s, + const SCRIPT_CONTROL *c, + WORD *lpOutLevels /* [out] final string levels */ + ) +{ + WORD *chartype; + unsigned baselevel = 0,j; + TRACE("%s, %d", debugstr_wn(lpString, uCount), uCount); + + chartype = HeapAlloc(GetProcessHeap(), 0, uCount * sizeof(WORD)); + if (!chartype) + { + WARN("Out of memory\n"); + return FALSE; + } + + baselevel = s->uBidiLevel; + + classify(lpString, chartype, uCount, c); + + for (j = 0; j < uCount; ++j) + switch(chartype[j]) + { + case B: + case S: + case WS: + case ON: chartype[j] = N; + default: continue; + } + + /* resolve explicit */ + resolveExplicit(baselevel, N, chartype, lpOutLevels, uCount, 0); + + /* resolve weak */ + resolveWeak(baselevel, chartype, lpOutLevels, uCount); + + /* resolve neutrals */ + resolveNeutrals(baselevel, chartype, lpOutLevels, uCount); + + /* resolveImplicit */ + resolveImplicit(chartype, lpOutLevels, uCount); + + HeapFree(GetProcessHeap(), 0, chartype); + return TRUE; +} + +/* reverse cch indexes */ +static void reverse(int *pidx, int cch) +{ + int temp; + int ich = 0; + for (; ich < --cch; ich++) + { + temp = pidx[ich]; + pidx[ich] = pidx[cch]; + pidx[cch] = temp; + } +} + + +/*------------------------------------------------------------------------ + Functions: reorder/reorderLevel + + Recursively reorders the display string + "From the highest level down, reverse all characters at that level and + higher, down to the lowest odd level" + + Implements rule L2 of the Unicode bidi Algorithm. + + Input: Array of embedding levels + Character count + Flag enabling reversal (set to false by initial caller) + + In/Out: Text to reorder + + Note: levels may exceed 15 resp. 61 on input. + + Rule L3 - reorder combining marks is not implemented here + Rule L4 - glyph mirroring is implemented as a display option below + + Note: this should be applied a line at a time +-------------------------------------------------------------------------*/ +int BIDI_ReorderV2lLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse) +{ + int ich = 0; + + /* true as soon as first odd level encountered */ + fReverse = fReverse || odd(level); + + for (; ich < cch; ich++) + { + if (plevel[ich] < level) + { + break; + } + else if (plevel[ich] > level) + { + ich += BIDI_ReorderV2lLevel(level + 1, pIndexs + ich, plevel + ich, + cch - ich, fReverse) - 1; + } + } + if (fReverse) + { + reverse(pIndexs, ich); + } + return ich; +} + +/* Applies the reorder in reverse. Taking an already reordered string and returing the original */ +int BIDI_ReorderL2vLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse) +{ + int ich = 0; + int newlevel = -1; + + /* true as soon as first odd level encountered */ + fReverse = fReverse || odd(level); + + for (; ich < cch; ich++) + { + if (plevel[ich] < level) + break; + else if (plevel[ich] > level) + newlevel = ich; + } + if (fReverse) + { + reverse(pIndexs, ich); + } + + if (newlevel > 1) + { + ich = 0; + for (; ich < cch; ich++) + if (plevel[ich] > level) + ich += BIDI_ReorderL2vLevel(level + 1, pIndexs + ich, plevel + ich, + cch - ich, fReverse) - 1; + } + + return ich; +} diff --git a/reactos/dll/win32/usp10/usp10.c b/reactos/dll/win32/usp10/usp10.c index cdd6d7b2919..85957143557 100644 --- a/reactos/dll/win32/usp10/usp10.c +++ b/reactos/dll/win32/usp10/usp10.c @@ -3,6 +3,7 @@ * * Copyright 2005 Steven Edwards for CodeWeavers * Copyright 2006 Hans Leidekker + * Copyright 2010 CodeWeavers, Aric Stewart * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -32,6 +33,8 @@ #include "winnls.h" #include "usp10.h" +#include "usp10_internal.h" + #include "wine/debug.h" #include "wine/unicode.h" @@ -524,6 +527,7 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem int cnt = 0, index = 0; int New_Script = SCRIPT_UNDEFINED; + WORD *levels = NULL; TRACE("%s,%d,%d,%p,%p,%p,%p\n", debugstr_wn(pwcInChars, cInChars), cInChars, cMaxItems, psControl, psState, pItems, pcItems); @@ -531,6 +535,24 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem if (!pwcInChars || !cInChars || !pItems || cMaxItems < 2) return E_INVALIDARG; + if (psState && psControl) + { + int i; + levels = heap_alloc_zero(cInChars * sizeof(WORD)); + if (!levels) + return E_OUTOFMEMORY; + + BIDI_DetermineLevels(pwcInChars, cInChars, psState, psControl, levels); + for (i = 0; i < cInChars; i++) + if (levels[i]!=levels[0]) + break; + if (i >= cInChars) + { + heap_free(levels); + levels = NULL; + } + } + pItems[index].iCharPos = 0; memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS)); @@ -549,15 +571,29 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem if (pwcInChars[cnt] >= Latin_start && pwcInChars[cnt] <= Latin_stop) pItems[index].a.eScript = Script_Latin; - if (pItems[index].a.eScript == Script_Arabic) + if (levels) + { + pItems[index].a.fRTL = odd(levels[cnt]); + pItems[index].a.fLayoutRTL = odd(levels[cnt]); + pItems[index].a.s.uBidiLevel = levels[cnt]; + } + else if (pItems[index].a.eScript == Script_Arabic) + { pItems[index].a.s.uBidiLevel = 1; + pItems[index].a.fRTL = 1; + pItems[index].a.fLayoutRTL = 1; + } - TRACE("New_Script=%d, eScript=%d index=%d cnt=%d iCharPos=%d\n", - New_Script, pItems[index].a.eScript, index, cnt, + + TRACE("New_Level=%i New_Script=%d, eScript=%d index=%d cnt=%d iCharPos=%d\n", + levels?levels[cnt]:-1, New_Script, pItems[index].a.eScript, index, cnt, pItems[index].iCharPos); for (cnt=1; cnt < cInChars; cnt++) { + if (levels && (levels[cnt] == pItems[index].a.s.uBidiLevel)) + continue; + if (pwcInChars[cnt] == '\r') New_Script = Script_CR; else @@ -578,9 +614,9 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem else New_Script = SCRIPT_UNDEFINED; - if (New_Script != pItems[index].a.eScript) + if ((levels && (levels[cnt] != pItems[index].a.s.uBidiLevel)) || New_Script != pItems[index].a.eScript) { - TRACE("New_Script=%d, eScript=%d ", New_Script, pItems[index].a.eScript); + TRACE("New_Level = %i, New_Script=%d, eScript=%d ", levels?levels[cnt]:-1, New_Script, pItems[index].a.eScript); index++; if (index+1 > cMaxItems) return E_OUTOFMEMORY; @@ -588,9 +624,18 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem pItems[index].iCharPos = cnt; memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS)); - if (New_Script == Script_Arabic) + if (levels) + { + pItems[index].a.fRTL = odd(levels[cnt]); + pItems[index].a.fLayoutRTL = odd(levels[cnt]); + pItems[index].a.s.uBidiLevel = levels[cnt]; + } + else if (New_Script == Script_Arabic) + { pItems[index].a.s.uBidiLevel = 1; - + pItems[index].a.fRTL = 1; + pItems[index].a.fLayoutRTL = 1; + } pItems[index].a.eScript = New_Script; TRACE("index=%d cnt=%d iCharPos=%d\n", index, cnt, pItems[index].iCharPos); @@ -610,6 +655,7 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem /* Set SCRIPT_ITEM */ pItems[index+1].iCharPos = cnt; /* the last + 1 item contains the ptr to the lastchar */ + heap_free(levels); return S_OK; } @@ -686,7 +732,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString, int numGlyphsReturned; /* FIXME: non unicode strings */ - WCHAR* pStr = (WCHAR*)pString; + const WCHAR* pStr = (const WCHAR*)pString; hr = ScriptShape(hdc, sc, &pStr[analysis->pItem[i].iCharPos], cChar, numGlyphs, &analysis->pItem[i].a, glyphs, pwLogClust, psva, &numGlyphsReturned); @@ -1286,6 +1332,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, { HRESULT hr; unsigned int i; + BOOL rtl; TRACE("(%p, %p, %s, %d, %d, %p, %p, %p, %p, %p)\n", hdc, psc, debugstr_wn(pwcChars, cChars), cChars, cMaxGlyphs, psa, pwOutGlyphs, pwLogClust, psva, pcGlyphs); @@ -1295,6 +1342,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, if (!psva || !pcGlyphs) return E_INVALIDARG; if (cChars > cMaxGlyphs) return E_OUTOFMEMORY; + rtl = (!psa->fLogicalOrder && psa->fRTL); *pcGlyphs = cChars; if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; @@ -1304,33 +1352,42 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, { for (i = 0; i < cChars; i++) { - if (!(pwOutGlyphs[i] = get_cache_glyph(psc, pwcChars[i]))) + int idx = i; + if (rtl) idx = cChars - 1 - i; + if (!(pwOutGlyphs[i] = get_cache_glyph(psc, pwcChars[idx]))) { WORD glyph; if (!hdc) return E_PENDING; - if (GetGlyphIndicesW(hdc, &pwcChars[i], 1, &glyph, 0) == GDI_ERROR) return S_FALSE; - pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[i], glyph); + if (GetGlyphIndicesW(hdc, &pwcChars[idx], 1, &glyph, 0) == GDI_ERROR) return S_FALSE; + pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[idx], glyph); } } } else { TRACE("no glyph translation\n"); - for (i = 0; i < cChars; i++) pwOutGlyphs[i] = pwcChars[i]; + for (i = 0; i < cChars; i++) + { + int idx = i; + if (rtl) idx = cChars - 1 - i; + pwOutGlyphs[i] = pwcChars[idx]; + } } /* set up a valid SCRIPT_VISATTR and LogClust for each char in this run */ for (i = 0; i < cChars; i++) { + int idx = i; + if (rtl) idx = cChars - 1 - i; /* FIXME: set to better values */ - psva[i].uJustification = (pwcChars[i] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; + psva[i].uJustification = (pwcChars[idx] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; psva[i].fClusterStart = 1; psva[i].fDiacritic = 0; psva[i].fZeroWidth = 0; psva[i].fReserved = 0; psva[i].fShapeReserved = 0; - pwLogClust[i] = i; + pwLogClust[i] = idx; } return S_OK; } @@ -1573,28 +1630,45 @@ HRESULT WINAPI ScriptGetGlyphABCWidth(HDC hdc, SCRIPT_CACHE *psc, WORD glyph, AB */ HRESULT WINAPI ScriptLayout(int runs, const BYTE *level, int *vistolog, int *logtovis) { - int i, j = runs - 1, k = 0; + int* indexs; + int ich; TRACE("(%d, %p, %p, %p)\n", runs, level, vistolog, logtovis); if (!level || (!vistolog && !logtovis)) return E_INVALIDARG; - for (i = 0; i < runs; i++) + indexs = heap_alloc(sizeof(int) * runs); + if (!indexs) + return E_OUTOFMEMORY; + + + if (vistolog) { - if (level[i] % 2) - { - if (vistolog) *vistolog++ = j; - if (logtovis) *logtovis++ = j; - j--; - } - else - { - if (vistolog) *vistolog++ = k; - if (logtovis) *logtovis++ = k; - k++; - } + for( ich = 0; ich < runs; ich++) + indexs[ich] = ich; + + ich = 0; + while (ich < runs) + ich += BIDI_ReorderV2lLevel(0, indexs+ich, level+ich, runs - ich, FALSE); + for (ich = 0; ich < runs; ich++) + vistolog[ich] = indexs[ich]; } + + + if (logtovis) + { + for( ich = 0; ich < runs; ich++) + indexs[ich] = ich; + + ich = 0; + while (ich < runs) + ich += BIDI_ReorderL2vLevel(0, indexs+ich, level+ich, runs - ich, FALSE); + for (ich = 0; ich < runs; ich++) + logtovis[ich] = indexs[ich]; + } + heap_free(indexs); + return S_OK; } @@ -1839,9 +1913,3 @@ HRESULT WINAPI ScriptJustify(const SCRIPT_VISATTR *sva, const int *advance, for (i = 0; i < num_glyphs; i++) justify[i] = advance[i]; return S_OK; } - -BOOL gbLpkPresent = FALSE; -VOID WINAPI LpkPresent() -{ - gbLpkPresent = TRUE; /* Turn it on this way! Wine is out of control! */ -} diff --git a/reactos/dll/win32/usp10/usp10.rbuild b/reactos/dll/win32/usp10/usp10.rbuild index ad071018a46..527578c6edd 100644 --- a/reactos/dll/win32/usp10/usp10.rbuild +++ b/reactos/dll/win32/usp10/usp10.rbuild @@ -6,6 +6,7 @@ . include/reactos/wine + bidi.c usp10.c wine gdi32 diff --git a/reactos/dll/win32/usp10/usp10.spec b/reactos/dll/win32/usp10/usp10.spec index 0f7b0aa87c5..5e358707c41 100644 --- a/reactos/dll/win32/usp10/usp10.spec +++ b/reactos/dll/win32/usp10/usp10.spec @@ -1,4 +1,4 @@ -@ stdcall LpkPresent() +@ stub LpkPresent @ stdcall ScriptApplyDigitSubstitution(ptr ptr ptr) @ stdcall ScriptApplyLogicalWidth(ptr long long ptr ptr ptr ptr ptr ptr) @ stdcall ScriptBreak(ptr long ptr ptr) diff --git a/reactos/dll/win32/usp10/usp10_internal.h b/reactos/dll/win32/usp10/usp10_internal.h new file mode 100644 index 00000000000..60e4eff14ab --- /dev/null +++ b/reactos/dll/win32/usp10/usp10_internal.h @@ -0,0 +1,28 @@ +/* + * Implementation of Uniscribe Script Processor (usp10.dll) + * + * Copyright 2010 CodeWeavers, Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#define odd(x) ((x) & 1) + +BOOL BIDI_DetermineLevels( LPCWSTR lpString, INT uCount, const SCRIPT_STATE *s, + const SCRIPT_CONTROL *c, WORD *lpOutLevels ); + +INT BIDI_ReorderV2lLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse); +INT BIDI_ReorderL2vLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse); diff --git a/reactos/dll/win32/version/resource.c b/reactos/dll/win32/version/resource.c index e7d34e08a88..16d9eacf83e 100644 --- a/reactos/dll/win32/version/resource.c +++ b/reactos/dll/win32/version/resource.c @@ -199,7 +199,11 @@ static BOOL find_ne_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) */ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) { - IMAGE_NT_HEADERS pehd; + union + { + IMAGE_NT_HEADERS32 nt32; + IMAGE_NT_HEADERS64 nt64; + } pehd; DWORD pehdoffset; PIMAGE_DATA_DIRECTORY resDataDir; PIMAGE_SECTION_HEADER sections; @@ -208,14 +212,27 @@ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) const void *resDir; const IMAGE_RESOURCE_DIRECTORY *resPtr; const IMAGE_RESOURCE_DATA_ENTRY *resData; - int i, nSections; + int i, len, nSections; BOOL ret = FALSE; /* Read in PE header */ pehdoffset = LZSeek( lzfd, 0, SEEK_CUR ); - if ( sizeof(pehd) != LZRead( lzfd, (LPSTR)&pehd, sizeof(pehd) ) ) return 0; + len = LZRead( lzfd, (LPSTR)&pehd, sizeof(pehd) ); + if (len < sizeof(pehd.nt32.FileHeader)) return 0; + if (len < sizeof(pehd)) memset( (char *)&pehd + len, 0, sizeof(pehd) - len ); + + switch (pehd.nt32.OptionalHeader.Magic) + { + case IMAGE_NT_OPTIONAL_HDR32_MAGIC: + resDataDir = pehd.nt32.OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_RESOURCE; + break; + case IMAGE_NT_OPTIONAL_HDR64_MAGIC: + resDataDir = pehd.nt64.OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_RESOURCE; + break; + default: + return 0; + } - resDataDir = pehd.OptionalHeader.DataDirectory+IMAGE_DIRECTORY_ENTRY_RESOURCE; if ( !resDataDir->Size ) { TRACE("No resources in PE dll\n" ); @@ -223,15 +240,13 @@ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) } /* Read in section table */ - nSections = pehd.FileHeader.NumberOfSections; + nSections = pehd.nt32.FileHeader.NumberOfSections; sections = HeapAlloc( GetProcessHeap(), 0, nSections * sizeof(IMAGE_SECTION_HEADER) ); if ( !sections ) return FALSE; - LZSeek( lzfd, pehdoffset + - sizeof(DWORD) + /* Signature */ - sizeof(IMAGE_FILE_HEADER) + - pehd.FileHeader.SizeOfOptionalHeader, SEEK_SET ); + len = FIELD_OFFSET( IMAGE_NT_HEADERS32, OptionalHeader ) + pehd.nt32.FileHeader.SizeOfOptionalHeader; + LZSeek( lzfd, pehdoffset + len, SEEK_SET ); if ( nSections * sizeof(IMAGE_SECTION_HEADER) != LZRead( lzfd, (LPSTR)sections, nSections * sizeof(IMAGE_SECTION_HEADER) ) ) diff --git a/reactos/dll/win32/windowscodecs/bmpdecode.c b/reactos/dll/win32/windowscodecs/bmpdecode.c index 5c805c8c098..854b3374b02 100644 --- a/reactos/dll/win32/windowscodecs/bmpdecode.c +++ b/reactos/dll/win32/windowscodecs/bmpdecode.c @@ -58,12 +58,14 @@ typedef struct { DWORD bc2AppData; } BITMAPCOREHEADER2; -struct BmpFrameDecode; -typedef HRESULT (*ReadDataFunc)(struct BmpFrameDecode* This); +struct BmpDecoder; +typedef HRESULT (*ReadDataFunc)(struct BmpDecoder* This); -typedef struct BmpFrameDecode { - const IWICBitmapFrameDecodeVtbl *lpVtbl; +typedef struct BmpDecoder { + const IWICBitmapDecoderVtbl *lpVtbl; + const IWICBitmapFrameDecodeVtbl *lpFrameVtbl; LONG ref; + BOOL initialized; IStream *stream; BITMAPFILEHEADER bfh; BITMAPV5HEADER bih; @@ -73,12 +75,17 @@ typedef struct BmpFrameDecode { INT stride; BYTE *imagedata; BYTE *imagedatastart; -} BmpFrameDecode; + CRITICAL_SECTION lock; /* must be held when initialized/imagedata is set or stream is accessed */ +} BmpDecoder; + +static inline BmpDecoder *impl_from_frame(IWICBitmapFrameDecode *iface) +{ + return CONTAINING_RECORD(iface, BmpDecoder, lpFrameVtbl); +} static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, void **ppv) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); if (!ppv) return E_INVALIDARG; @@ -87,7 +94,7 @@ static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface IsEqualIID(&IID_IWICBitmapSource, iid) || IsEqualIID(&IID_IWICBitmapFrameDecode, iid)) { - *ppv = This; + *ppv = iface; } else { @@ -101,35 +108,22 @@ static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface static ULONG WINAPI BmpFrameDecode_AddRef(IWICBitmapFrameDecode *iface) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; - ULONG ref = InterlockedIncrement(&This->ref); + BmpDecoder *This = impl_from_frame(iface); - TRACE("(%p) refcount=%u\n", iface, ref); - - return ref; + return IUnknown_AddRef((IUnknown*)This); } static ULONG WINAPI BmpFrameDecode_Release(IWICBitmapFrameDecode *iface) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; - ULONG ref = InterlockedDecrement(&This->ref); + BmpDecoder *This = impl_from_frame(iface); - TRACE("(%p) refcount=%u\n", iface, ref); - - if (ref == 0) - { - IStream_Release(This->stream); - HeapFree(GetProcessHeap(), 0, This->imagedata); - HeapFree(GetProcessHeap(), 0, This); - } - - return ref; + return IUnknown_Release((IUnknown*)This); } static HRESULT WINAPI BmpFrameDecode_GetSize(IWICBitmapFrameDecode *iface, UINT *puiWidth, UINT *puiHeight) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; + BmpDecoder *This = impl_from_frame(iface); TRACE("(%p,%p,%p)\n", iface, puiWidth, puiHeight); if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER)) @@ -149,7 +143,7 @@ static HRESULT WINAPI BmpFrameDecode_GetSize(IWICBitmapFrameDecode *iface, static HRESULT WINAPI BmpFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface, WICPixelFormatGUID *pPixelFormat) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; + BmpDecoder *This = impl_from_frame(iface); TRACE("(%p,%p)\n", iface, pPixelFormat); memcpy(pPixelFormat, This->pixelformat, sizeof(GUID)); @@ -180,7 +174,7 @@ static HRESULT BmpHeader_GetResolution(BITMAPV5HEADER *bih, double *pDpiX, doubl static HRESULT WINAPI BmpFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, double *pDpiX, double *pDpiY) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; + BmpDecoder *This = impl_from_frame(iface); TRACE("(%p,%p,%p)\n", iface, pDpiX, pDpiY); return BmpHeader_GetResolution(&This->bih, pDpiX, pDpiY); @@ -190,13 +184,15 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette) { HRESULT hr; - BmpFrameDecode *This = (BmpFrameDecode*)iface; + BmpDecoder *This = impl_from_frame(iface); int count; WICColor *wiccolors=NULL; RGBTRIPLE *bgrcolors=NULL; TRACE("(%p,%p)\n", iface, pIPalette); + EnterCriticalSection(&This->lock); + if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER)) { BITMAPCOREHEADER *bch = (BITMAPCOREHEADER*)&This->bih; @@ -238,7 +234,8 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, } else { - return WINCODEC_ERR_PALETTEUNAVAILABLE; + hr = WINCODEC_ERR_PALETTEUNAVAILABLE; + goto end; } } else @@ -256,7 +253,11 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, tablesize = sizeof(WICColor) * count; wiccolors = HeapAlloc(GetProcessHeap(), 0, tablesize); - if (!wiccolors) return E_OUTOFMEMORY; + if (!wiccolors) + { + hr = E_OUTOFMEMORY; + goto end; + } offset.QuadPart = sizeof(BITMAPFILEHEADER) + This->bih.bV5Size; hr = IStream_Seek(This->stream, offset, STREAM_SEEK_SET, NULL); @@ -275,13 +276,18 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, } else { - return WINCODEC_ERR_PALETTEUNAVAILABLE; + hr = WINCODEC_ERR_PALETTEUNAVAILABLE; + goto end; } } - hr = IWICPalette_InitializeCustom(pIPalette, wiccolors, count); - end: + + LeaveCriticalSection(&This->lock); + + if (SUCCEEDED(hr)) + hr = IWICPalette_InitializeCustom(pIPalette, wiccolors, count); + HeapFree(GetProcessHeap(), 0, wiccolors); HeapFree(GetProcessHeap(), 0, bgrcolors); return hr; @@ -290,16 +296,18 @@ end: static HRESULT WINAPI BmpFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; - HRESULT hr; + BmpDecoder *This = impl_from_frame(iface); + HRESULT hr=S_OK; UINT width, height; TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); + EnterCriticalSection(&This->lock); if (!This->imagedata) { hr = This->read_data_func(This); - if (FAILED(hr)) return hr; } + LeaveCriticalSection(&This->lock); + if (FAILED(hr)) return hr; hr = BmpFrameDecode_GetSize(iface, &width, &height); if (FAILED(hr)) return hr; @@ -330,7 +338,7 @@ static HRESULT WINAPI BmpFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface, return WINCODEC_ERR_CODECNOTHUMBNAIL; } -static HRESULT BmpFrameDecode_ReadUncompressed(BmpFrameDecode* This) +static HRESULT BmpFrameDecode_ReadUncompressed(BmpDecoder* This) { UINT bytesperrow; UINT width, height; @@ -387,7 +395,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadRLE8(BmpFrameDecode* This) +static HRESULT BmpFrameDecode_ReadRLE8(BmpDecoder* This) { UINT bytesperrow; UINT width, height; @@ -493,7 +501,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadRLE4(BmpFrameDecode* This) +static HRESULT BmpFrameDecode_ReadRLE4(BmpDecoder* This) { UINT bytesperrow; UINT width, height; @@ -614,7 +622,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadUnsupported(BmpFrameDecode* This) +static HRESULT BmpFrameDecode_ReadUnsupported(BmpDecoder* This) { return E_FAIL; } @@ -637,7 +645,7 @@ static const struct bitfields_format bitfields_formats[] = { {0} }; -static const IWICBitmapFrameDecodeVtbl BmpFrameDecode_Vtbl = { +static const IWICBitmapFrameDecodeVtbl BmpDecoder_FrameVtbl = { BmpFrameDecode_QueryInterface, BmpFrameDecode_AddRef, BmpFrameDecode_Release, @@ -651,19 +659,6 @@ static const IWICBitmapFrameDecodeVtbl BmpFrameDecode_Vtbl = { BmpFrameDecode_GetThumbnail }; -typedef struct { - const IWICBitmapDecoderVtbl *lpVtbl; - LONG ref; - BOOL initialized; - IStream *stream; - BITMAPFILEHEADER bfh; - BITMAPV5HEADER bih; - BmpFrameDecode *framedecode; - const WICPixelFormatGUID *pixelformat; - int bitsperpixel; - ReadDataFunc read_data_func; -} BmpDecoder; - static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream) { HRESULT hr; @@ -873,7 +868,9 @@ static ULONG WINAPI BmpDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { if (This->stream) IStream_Release(This->stream); - if (This->framedecode) IUnknown_Release((IUnknown*)This->framedecode); + HeapFree(GetProcessHeap(), 0, This->imagedata); + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This); } @@ -886,7 +883,9 @@ static HRESULT WINAPI BmpDecoder_QueryCapability(IWICBitmapDecoder *iface, IStre HRESULT hr; BmpDecoder *This = (BmpDecoder*)iface; + EnterCriticalSection(&This->lock); hr = BmpDecoder_ReadHeaders(This, pIStream); + LeaveCriticalSection(&This->lock); if (FAILED(hr)) return hr; if (This->read_data_func == BmpFrameDecode_ReadUnsupported) @@ -903,6 +902,7 @@ static HRESULT WINAPI BmpDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p HRESULT hr; BmpDecoder *This = (BmpDecoder*)iface; + EnterCriticalSection(&This->lock); hr = BmpDecoder_ReadHeaders(This, pIStream); if (SUCCEEDED(hr)) @@ -910,6 +910,7 @@ static HRESULT WINAPI BmpDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p This->stream = pIStream; IStream_AddRef(pIStream); } + LeaveCriticalSection(&This->lock); return hr; } @@ -992,25 +993,8 @@ static HRESULT WINAPI BmpDecoder_GetFrame(IWICBitmapDecoder *iface, if (!This->stream) return WINCODEC_ERR_WRONGSTATE; - if (!This->framedecode) - { - This->framedecode = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpFrameDecode)); - if (!This->framedecode) return E_OUTOFMEMORY; - - This->framedecode->lpVtbl = &BmpFrameDecode_Vtbl; - This->framedecode->ref = 1; - This->framedecode->stream = This->stream; - IStream_AddRef(This->stream); - This->framedecode->bfh = This->bfh; - This->framedecode->bih = This->bih; - This->framedecode->pixelformat = This->pixelformat; - This->framedecode->bitsperpixel = This->bitsperpixel; - This->framedecode->read_data_func = This->read_data_func; - This->framedecode->imagedata = NULL; - } - - *ppIBitmapFrame = (IWICBitmapFrameDecode*)This->framedecode; - IWICBitmapFrameDecode_AddRef((IWICBitmapFrameDecode*)This->framedecode); + *ppIBitmapFrame = (IWICBitmapFrameDecode*)&This->lpFrameVtbl; + IWICBitmapDecoder_AddRef(iface); return S_OK; } @@ -1047,10 +1031,13 @@ HRESULT BmpDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) if (!This) return E_OUTOFMEMORY; This->lpVtbl = &BmpDecoder_Vtbl; + This->lpFrameVtbl = &BmpDecoder_FrameVtbl; This->ref = 1; This->initialized = FALSE; This->stream = NULL; - This->framedecode = NULL; + This->imagedata = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BmpDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/clsfactory.c b/reactos/dll/win32/windowscodecs/clsfactory.c index d8d21052d5e..68e0530fbdc 100644 --- a/reactos/dll/win32/windowscodecs/clsfactory.c +++ b/reactos/dll/win32/windowscodecs/clsfactory.c @@ -50,6 +50,7 @@ static classinfo wic_classes[] = { {&CLSID_WICGifDecoder, GifDecoder_CreateInstance}, {&CLSID_WICIcoDecoder, IcoDecoder_CreateInstance}, {&CLSID_WICJpegDecoder, JpegDecoder_CreateInstance}, + {&CLSID_WICTiffDecoder, TiffDecoder_CreateInstance}, {&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance}, {0}}; diff --git a/reactos/dll/win32/windowscodecs/converter.c b/reactos/dll/win32/windowscodecs/converter.c index 15c7b0f380a..b1c0952b9a2 100644 --- a/reactos/dll/win32/windowscodecs/converter.c +++ b/reactos/dll/win32/windowscodecs/converter.c @@ -71,6 +71,7 @@ typedef struct FormatConverter { WICBitmapDitherType dither; double alpha_threshold; WICBitmapPaletteType palette_type; + CRITICAL_SECTION lock; /* must be held when initialized */ } FormatConverter; static void make_grayscale_palette(WICColor *colors, UINT num_colors) @@ -765,6 +766,8 @@ static ULONG WINAPI FormatConverter_Release(IWICFormatConverter *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); if (This->source) IWICBitmapSource_Release(This->source); HeapFree(GetProcessHeap(), 0, This); } @@ -841,38 +844,56 @@ static HRESULT WINAPI FormatConverter_Initialize(IWICFormatConverter *iface, const struct pixelformatinfo *srcinfo, *dstinfo; static INT fixme=0; GUID srcFormat; - HRESULT res; + HRESULT res=S_OK; TRACE("(%p,%p,%s,%u,%p,%0.1f,%u)\n", iface, pISource, debugstr_guid(dstFormat), dither, pIPalette, alphaThresholdPercent, paletteTranslate); if (pIPalette && !fixme++) FIXME("ignoring palette\n"); - if (This->source) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (This->source) + { + res = WINCODEC_ERR_WRONGSTATE; + goto end; + } res = IWICBitmapSource_GetPixelFormat(pISource, &srcFormat); - if (FAILED(res)) return res; + if (FAILED(res)) goto end; srcinfo = get_formatinfo(&srcFormat); - if (!srcinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; + if (!srcinfo) + { + res = WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; + goto end; + } dstinfo = get_formatinfo(dstFormat); - if (!dstinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; + if (!dstinfo) + { + res = WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; + goto end; + } if (dstinfo->copy_function) { IWICBitmapSource_AddRef(pISource); - This->source = pISource; This->src_format = srcinfo; This->dst_format = dstinfo; This->dither = dither; This->alpha_threshold = alphaThresholdPercent; This->palette_type = paletteTranslate; + This->source = pISource; } else - return WINCODEC_ERR_UNSUPPORTEDOPERATION; + res = WINCODEC_ERR_UNSUPPORTEDOPERATION; - return S_OK; +end: + + LeaveCriticalSection(&This->lock); + + return res; } static HRESULT WINAPI FormatConverter_CanConvert(IWICFormatConverter *iface, @@ -930,6 +951,8 @@ HRESULT FormatConverter_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** p This->lpVtbl = &FormatConverter_Vtbl; This->ref = 1; This->source = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FormatConverter.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/gifformat.c b/reactos/dll/win32/windowscodecs/gifformat.c index 0597b1afbe3..3443b2c1ae1 100644 --- a/reactos/dll/win32/windowscodecs/gifformat.c +++ b/reactos/dll/win32/windowscodecs/gifformat.c @@ -40,6 +40,7 @@ typedef struct { LONG ref; BOOL initialized; GifFileType *gif; + CRITICAL_SECTION lock; } GifDecoder; typedef struct { @@ -302,6 +303,8 @@ static ULONG WINAPI GifDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); DGifCloseFile(This->gif); HeapFree(GetProcessHeap(), 0, This); } @@ -341,9 +344,12 @@ static HRESULT WINAPI GifDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); + EnterCriticalSection(&This->lock); + if (This->initialized || This->gif) { WARN("already initialized\n"); + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; } @@ -353,16 +359,26 @@ static HRESULT WINAPI GifDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p /* read all data from the stream */ This->gif = DGifOpen((void*)pIStream, _gif_inputfunc); - if (!This->gif) return E_FAIL; + if (!This->gif) + { + LeaveCriticalSection(&This->lock); + return E_FAIL; + } ret = DGifSlurp(This->gif); - if (ret == GIF_ERROR) return E_FAIL; + if (ret == GIF_ERROR) + { + LeaveCriticalSection(&This->lock); + return E_FAIL; + } /* make sure we don't use the stream after this method returns */ This->gif->UserData = NULL; This->initialized = TRUE; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -502,6 +518,8 @@ HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->ref = 1; This->initialized = FALSE; This->gif = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": GifDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/icoformat.c b/reactos/dll/win32/windowscodecs/icoformat.c index ab30ab0a8af..e1ea7c6c8d6 100644 --- a/reactos/dll/win32/windowscodecs/icoformat.c +++ b/reactos/dll/win32/windowscodecs/icoformat.c @@ -62,6 +62,7 @@ typedef struct { BOOL initialized; IStream *stream; ICONHEADER header; + CRITICAL_SECTION lock; /* must be held when accessing stream */ } IcoDecoder; typedef struct { @@ -512,15 +513,17 @@ static HRESULT WINAPI IcoFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) { IcoFrameDecode *This = (IcoFrameDecode*)iface; - HRESULT hr; + HRESULT hr=S_OK; UINT width, height, stride; TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); + EnterCriticalSection(&This->parent->lock); if (!This->bits) { hr = IcoFrameDecode_ReadPixels(This); - if (FAILED(hr)) return hr; } + LeaveCriticalSection(&This->parent->lock); + if (FAILED(hr)) return hr; width = This->entry.bWidth ? This->entry.bWidth : 256; height = This->entry.bHeight ? This->entry.bHeight : 256; @@ -606,6 +609,8 @@ static ULONG WINAPI IcoDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); if (This->stream) IStream_Release(This->stream); HeapFree(GetProcessHeap(), 0, This); } @@ -629,23 +634,37 @@ static HRESULT WINAPI IcoDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p ULONG bytesread; TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); - if (This->initialized) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (This->initialized) + { + hr = WINCODEC_ERR_WRONGSTATE; + goto end; + } seek.QuadPart = 0; hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL); - if (FAILED(hr)) return hr; + if (FAILED(hr)) goto end; hr = IStream_Read(pIStream, &This->header, sizeof(ICONHEADER), &bytesread); - if (FAILED(hr)) return hr; + if (FAILED(hr)) goto end; if (bytesread != sizeof(ICONHEADER) || This->header.idReserved != 0 || - This->header.idType != 1) return E_FAIL; + This->header.idType != 1) + { + hr = E_FAIL; + goto end; + } This->initialized = TRUE; This->stream = pIStream; IStream_AddRef(pIStream); - return S_OK; +end: + + LeaveCriticalSection(&This->lock); + + return hr; } static HRESULT WINAPI IcoDecoder_GetContainerFormat(IWICBitmapDecoder *iface, @@ -715,18 +734,32 @@ static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface, UINT index, IWICBitmapFrameDecode **ppIBitmapFrame) { IcoDecoder *This = (IcoDecoder*)iface; - IcoFrameDecode *result; + IcoFrameDecode *result=NULL; LARGE_INTEGER seek; HRESULT hr; ULONG bytesread; TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame); - if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED; + EnterCriticalSection(&This->lock); - if (This->header.idCount < index) return E_INVALIDARG; + if (!This->initialized) + { + hr = WINCODEC_ERR_NOTINITIALIZED; + goto fail; + } + + if (This->header.idCount < index) + { + hr = E_INVALIDARG; + goto fail; + } result = HeapAlloc(GetProcessHeap(), 0, sizeof(IcoFrameDecode)); - if (!result) return E_OUTOFMEMORY; + if (!result) + { + hr = E_OUTOFMEMORY; + goto fail; + } result->lpVtbl = &IcoFrameDecode_Vtbl; result->ref = 1; @@ -745,9 +778,12 @@ static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface, *ppIBitmapFrame = (IWICBitmapFrameDecode*)result; + LeaveCriticalSection(&This->lock); + return S_OK; fail: + LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, result); if (SUCCEEDED(hr)) hr = E_FAIL; TRACE("<-- %x\n", hr); @@ -789,6 +825,8 @@ HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->ref = 1; This->stream = NULL; This->initialized = FALSE; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IcoDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/jpegformat.c b/reactos/dll/win32/windowscodecs/jpegformat.c index 017e6045790..b5676eaacc8 100644 --- a/reactos/dll/win32/windowscodecs/jpegformat.c +++ b/reactos/dll/win32/windowscodecs/jpegformat.c @@ -103,6 +103,7 @@ typedef struct { struct jpeg_source_mgr source_mgr; BYTE source_buffer[1024]; BYTE *image_data; + CRITICAL_SECTION lock; } JpegDecoder; static inline JpegDecoder *decoder_from_decompress(j_decompress_ptr decompress) @@ -156,6 +157,8 @@ static ULONG WINAPI JpegDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); if (This->cinfo_initialized) pjpeg_destroy_decompress(&This->cinfo); if (This->stream) IStream_Release(This->stream); HeapFree(GetProcessHeap(), 0, This->image_data); @@ -225,7 +228,13 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * int ret; TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOptions); - if (This->cinfo_initialized) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (This->cinfo_initialized) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } This->cinfo.err = pjpeg_std_error(&This->jerr); @@ -249,6 +258,7 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * if (ret != JPEG_HEADER_OK) { WARN("Jpeg image in stream has bad format, read header returned %d.\n",ret); + LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -260,11 +270,14 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * if (!pjpeg_start_decompress(&This->cinfo)) { ERR("jpeg_start_decompress failed\n"); + LeaveCriticalSection(&This->lock); return E_FAIL; } This->initialized = TRUE; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -448,10 +461,16 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, max_row_needed = prc->Y + prc->Height; if (max_row_needed > This->cinfo.output_height) return E_INVALIDARG; + EnterCriticalSection(&This->lock); + if (!This->image_data) { This->image_data = HeapAlloc(GetProcessHeap(), 0, data_size); - if (!This->image_data) return E_OUTOFMEMORY; + if (!This->image_data) + { + LeaveCriticalSection(&This->lock); + return E_OUTOFMEMORY; + } } while (max_row_needed > This->cinfo.output_scanline) @@ -471,6 +490,7 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, if (ret == 0) { ERR("read_scanlines failed\n"); + LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -492,6 +512,8 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, } } + LeaveCriticalSection(&This->lock); + return copy_pixels(bpp, This->image_data, This->cinfo.output_width, This->cinfo.output_height, stride, prc, cbStride, cbBufferSize, pbBuffer); @@ -559,6 +581,8 @@ HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->cinfo_initialized = FALSE; This->stream = NULL; This->image_data = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JpegDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/palette.c b/reactos/dll/win32/windowscodecs/palette.c index 842d3b51c30..40ab190958e 100644 --- a/reactos/dll/win32/windowscodecs/palette.c +++ b/reactos/dll/win32/windowscodecs/palette.c @@ -40,6 +40,7 @@ typedef struct { UINT count; WICColor *colors; WICBitmapPaletteType type; + CRITICAL_SECTION lock; /* must be held when count, colors, or type is accessed */ } PaletteImpl; static HRESULT WINAPI PaletteImpl_QueryInterface(IWICPalette *iface, REFIID iid, @@ -83,6 +84,8 @@ static ULONG WINAPI PaletteImpl_Release(IWICPalette *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->colors); HeapFree(GetProcessHeap(), 0, This); } @@ -117,10 +120,12 @@ static HRESULT WINAPI PaletteImpl_InitializeCustom(IWICPalette *iface, memcpy(new_colors, pColors, sizeof(WICColor) * colorCount); } + EnterCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->colors); This->colors = new_colors; This->count = colorCount; This->type = WICBitmapPaletteTypeCustom; + LeaveCriticalSection(&This->lock); return S_OK; } @@ -148,7 +153,9 @@ static HRESULT WINAPI PaletteImpl_GetType(IWICPalette *iface, if (!pePaletteType) return E_INVALIDARG; + EnterCriticalSection(&This->lock); *pePaletteType = This->type; + LeaveCriticalSection(&This->lock); return S_OK; } @@ -161,7 +168,9 @@ static HRESULT WINAPI PaletteImpl_GetColorCount(IWICPalette *iface, UINT *pcCoun if (!pcCount) return E_INVALIDARG; + EnterCriticalSection(&This->lock); *pcCount = This->count; + LeaveCriticalSection(&This->lock); return S_OK; } @@ -175,12 +184,16 @@ static HRESULT WINAPI PaletteImpl_GetColors(IWICPalette *iface, UINT colorCount, if (!pColors || !pcActualColors) return E_INVALIDARG; + EnterCriticalSection(&This->lock); + if (This->count < colorCount) colorCount = This->count; memcpy(pColors, This->colors, sizeof(WICColor) * colorCount); *pcActualColors = colorCount; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -192,10 +205,12 @@ static HRESULT WINAPI PaletteImpl_IsBlackWhite(IWICPalette *iface, BOOL *pfIsBla if (!pfIsBlackWhite) return E_INVALIDARG; + EnterCriticalSection(&This->lock); if (This->type == WICBitmapPaletteTypeFixedBW) *pfIsBlackWhite = TRUE; else *pfIsBlackWhite = FALSE; + LeaveCriticalSection(&This->lock); return S_OK; } @@ -208,6 +223,7 @@ static HRESULT WINAPI PaletteImpl_IsGrayscale(IWICPalette *iface, BOOL *pfIsGray if (!pfIsGrayscale) return E_INVALIDARG; + EnterCriticalSection(&This->lock); switch(This->type) { case WICBitmapPaletteTypeFixedBW: @@ -219,6 +235,7 @@ static HRESULT WINAPI PaletteImpl_IsGrayscale(IWICPalette *iface, BOOL *pfIsGray default: *pfIsGrayscale = FALSE; } + LeaveCriticalSection(&This->lock); return S_OK; } @@ -234,12 +251,14 @@ static HRESULT WINAPI PaletteImpl_HasAlpha(IWICPalette *iface, BOOL *pfHasAlpha) *pfHasAlpha = FALSE; + EnterCriticalSection(&This->lock); for (i=0; icount; i++) if ((This->colors[i]&0xff000000) != 0xff000000) { *pfHasAlpha = TRUE; break; } + LeaveCriticalSection(&This->lock); return S_OK; } @@ -272,6 +291,8 @@ HRESULT PaletteImpl_Create(IWICPalette **palette) This->count = 0; This->colors = NULL; This->type = WICBitmapPaletteTypeCustom; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PaletteImpl.lock"); *palette = (IWICPalette*)This; diff --git a/reactos/dll/win32/windowscodecs/pngformat.c b/reactos/dll/win32/windowscodecs/pngformat.c index 5af680e876c..3dcbd9aeb44 100644 --- a/reactos/dll/win32/windowscodecs/pngformat.c +++ b/reactos/dll/win32/windowscodecs/pngformat.c @@ -162,6 +162,7 @@ typedef struct { UINT stride; const WICPixelFormatGUID *format; BYTE *image_bits; + CRITICAL_SECTION lock; /* must be held when png structures are accessed or initialized is set */ } PngDecoder; static inline PngDecoder *impl_from_frame(IWICBitmapFrameDecode *iface) @@ -214,6 +215,8 @@ static ULONG WINAPI PngDecoder_Release(IWICBitmapDecoder *iface) { if (This->png_ptr) ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info); + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->image_bits); HeapFree(GetProcessHeap(), 0, This); } @@ -246,7 +249,7 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p { PngDecoder *This = (PngDecoder*)iface; LARGE_INTEGER seek; - HRESULT hr; + HRESULT hr=S_OK; png_bytep *row_pointers=NULL; UINT image_size; UINT i; @@ -259,16 +262,23 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); + EnterCriticalSection(&This->lock); + /* initialize libpng */ This->png_ptr = ppng_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!This->png_ptr) return E_FAIL; + if (!This->png_ptr) + { + hr = E_FAIL; + goto end; + } This->info_ptr = ppng_create_info_struct(This->png_ptr); if (!This->info_ptr) { ppng_destroy_read_struct(&This->png_ptr, NULL, NULL); This->png_ptr = NULL; - return E_FAIL; + hr = E_FAIL; + goto end; } This->end_info = ppng_create_info_struct(This->png_ptr); @@ -276,7 +286,8 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p { ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, NULL); This->png_ptr = NULL; - return E_FAIL; + hr = E_FAIL; + goto end; } /* set up setjmp/longjmp error handling */ @@ -285,14 +296,15 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info); HeapFree(GetProcessHeap(), 0, row_pointers); This->png_ptr = NULL; - return E_FAIL; + hr = E_FAIL; + goto end; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); /* seek to the start of the stream */ seek.QuadPart = 0; hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL); - if (FAILED(hr)) return hr; + if (FAILED(hr)) goto end; /* set up custom i/o handling */ ppng_set_read_fn(This->png_ptr, pIStream, user_read_data); @@ -340,7 +352,8 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat16bppGray; break; default: ERR("invalid grayscale bit depth: %i\n", bit_depth); - return E_FAIL; + hr = E_FAIL; + goto end; } break; case PNG_COLOR_TYPE_GRAY_ALPHA: @@ -357,7 +370,8 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat64bppRGBA; break; default: ERR("invalid RGBA bit depth: %i\n", bit_depth); - return E_FAIL; + hr = E_FAIL; + goto end; } break; case PNG_COLOR_TYPE_PALETTE: @@ -370,7 +384,8 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 8: This->format = &GUID_WICPixelFormat8bppIndexed; break; default: ERR("invalid indexed color bit depth: %i\n", bit_depth); - return E_FAIL; + hr = E_FAIL; + goto end; } break; case PNG_COLOR_TYPE_RGB: @@ -384,12 +399,14 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat48bppRGB; break; default: ERR("invalid RGB color bit depth: %i\n", bit_depth); - return E_FAIL; + hr = E_FAIL; + goto end; } break; default: ERR("invalid color type %i\n", color_type); - return E_FAIL; + hr = E_FAIL; + goto end; } /* read the image data */ @@ -399,10 +416,18 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p image_size = This->stride * This->height; This->image_bits = HeapAlloc(GetProcessHeap(), 0, image_size); - if (!This->image_bits) return E_OUTOFMEMORY; + if (!This->image_bits) + { + hr = E_OUTOFMEMORY; + goto end; + } row_pointers = HeapAlloc(GetProcessHeap(), 0, sizeof(png_bytep)*This->height); - if (!row_pointers) return E_OUTOFMEMORY; + if (!row_pointers) + { + hr = E_OUTOFMEMORY; + goto end; + } for (i=0; iheight; i++) row_pointers[i] = This->image_bits + i * This->stride; @@ -416,7 +441,11 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p This->initialized = TRUE; - return S_OK; +end: + + LeaveCriticalSection(&This->lock); + + return hr; } static HRESULT WINAPI PngDecoder_GetContainerFormat(IWICBitmapDecoder *iface, @@ -570,6 +599,8 @@ static HRESULT WINAPI PngDecoder_Frame_GetResolution(IWICBitmapFrameDecode *ifac png_uint_32 ret, xres, yres; int unit_type; + EnterCriticalSection(&This->lock); + ret = ppng_get_pHYs(This->png_ptr, This->info_ptr, &xres, &yres, &unit_type); if (ret && unit_type == PNG_RESOLUTION_METER) @@ -583,6 +614,8 @@ static HRESULT WINAPI PngDecoder_Frame_GetResolution(IWICBitmapFrameDecode *ifac *pDpiX = *pDpiY = 96.0; } + LeaveCriticalSection(&This->lock); + TRACE("(%p)->(%0.2f,%0.2f)\n", iface, *pDpiX, *pDpiY); return S_OK; @@ -600,16 +633,24 @@ static HRESULT WINAPI PngDecoder_Frame_CopyPalette(IWICBitmapFrameDecode *iface, int num_trans; png_color_16p trans_values; int i; + HRESULT hr=S_OK; TRACE("(%p,%p)\n", iface, pIPalette); + EnterCriticalSection(&This->lock); + ret = ppng_get_PLTE(This->png_ptr, This->info_ptr, &png_palette, &num_palette); - if (!ret) return WINCODEC_ERR_PALETTEUNAVAILABLE; + if (!ret) + { + hr = WINCODEC_ERR_PALETTEUNAVAILABLE; + goto end; + } if (num_palette > 256) { ERR("palette has %i colors?!\n", num_palette); - return E_FAIL; + hr = E_FAIL; + goto end; } for (i=0; ilock); + + if (SUCCEEDED(hr)) + hr = IWICPalette_InitializeCustom(pIPalette, palette, num_palette); + + return hr; } static HRESULT WINAPI PngDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, @@ -706,6 +754,8 @@ HRESULT PngDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->end_info = NULL; This->initialized = FALSE; This->image_bits = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PngDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); @@ -752,6 +802,7 @@ typedef struct PngEncoder { UINT lines_written; BOOL frame_committed; BOOL committed; + CRITICAL_SECTION lock; } PngEncoder; static inline PngEncoder *encoder_from_frame(IWICBitmapFrameEncode *iface) @@ -800,10 +851,18 @@ static HRESULT WINAPI PngFrameEncode_Initialize(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%p)\n", iface, pIEncoderOptions); - if (This->frame_initialized) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (This->frame_initialized) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } This->frame_initialized = TRUE; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -813,11 +872,19 @@ static HRESULT WINAPI PngFrameEncode_SetSize(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%u,%u)\n", iface, uiWidth, uiHeight); - if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (!This->frame_initialized || This->info_written) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } This->width = uiWidth; This->height = uiHeight; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -827,11 +894,19 @@ static HRESULT WINAPI PngFrameEncode_SetResolution(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%0.2f,%0.2f)\n", iface, dpiX, dpiY); - if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (!This->frame_initialized || This->info_written) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } This->xres = dpiX; This->yres = dpiY; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -842,7 +917,13 @@ static HRESULT WINAPI PngFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface int i; TRACE("(%p,%s)\n", iface, debugstr_guid(pPixelFormat)); - if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (!This->frame_initialized || This->info_written) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } for (i=0; formats[i].guid; i++) { @@ -855,6 +936,8 @@ static HRESULT WINAPI PngFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface This->format = &formats[i]; memcpy(pPixelFormat, This->format->guid, sizeof(GUID)); + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -888,15 +971,24 @@ static HRESULT WINAPI PngFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, jmp_buf jmpbuf; TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels); + EnterCriticalSection(&This->lock); + if (!This->frame_initialized || !This->width || !This->height || !This->format) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; + } if (lineCount == 0 || lineCount + This->lines_written > This->height) + { + LeaveCriticalSection(&This->lock); return E_INVALIDARG; + } /* set up setjmp/longjmp error handling */ if (setjmp(jmpbuf)) { + LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, row_pointers); return E_FAIL; } @@ -927,7 +1019,10 @@ static HRESULT WINAPI PngFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, row_pointers = HeapAlloc(GetProcessHeap(), 0, lineCount * sizeof(png_byte*)); if (!row_pointers) + { + LeaveCriticalSection(&This->lock); return E_OUTOFMEMORY; + } for (i=0; ipng_ptr, row_pointers, lineCount); This->lines_written += lineCount; + LeaveCriticalSection(&This->lock); + HeapFree(GetProcessHeap(), 0, row_pointers); return S_OK; @@ -1019,12 +1116,18 @@ static HRESULT WINAPI PngFrameEncode_Commit(IWICBitmapFrameEncode *iface) jmp_buf jmpbuf; TRACE("(%p)\n", iface); + EnterCriticalSection(&This->lock); + if (!This->info_written || This->lines_written != This->height || This->frame_committed) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; + } /* set up setjmp/longjmp error handling */ if (setjmp(jmpbuf)) { + LeaveCriticalSection(&This->lock); return E_FAIL; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); @@ -1033,6 +1136,8 @@ static HRESULT WINAPI PngFrameEncode_Commit(IWICBitmapFrameEncode *iface) This->frame_committed = TRUE; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -1102,6 +1207,8 @@ static ULONG WINAPI PngEncoder_Release(IWICBitmapEncoder *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); if (This->png_ptr) ppng_destroy_write_struct(&This->png_ptr, &This->info_ptr); if (This->stream) @@ -1137,19 +1244,28 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOption); + EnterCriticalSection(&This->lock); + if (This->png_ptr) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; + } /* initialize libpng */ This->png_ptr = ppng_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!This->png_ptr) + { + LeaveCriticalSection(&This->lock); return E_FAIL; + } This->info_ptr = ppng_create_info_struct(This->png_ptr); if (!This->info_ptr) { ppng_destroy_write_struct(&This->png_ptr, NULL); This->png_ptr = NULL; + LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -1163,6 +1279,7 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, This->png_ptr = NULL; IStream_Release(This->stream); This->stream = NULL; + LeaveCriticalSection(&This->lock); return E_FAIL; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); @@ -1170,6 +1287,8 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, /* set up custom i/o handling */ ppng_set_write_fn(This->png_ptr, This, user_write_data, user_flush); + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -1219,17 +1338,31 @@ static HRESULT WINAPI PngEncoder_CreateNewFrame(IWICBitmapEncoder *iface, HRESULT hr; TRACE("(%p,%p,%p)\n", iface, ppIFrameEncode, ppIEncoderOptions); + EnterCriticalSection(&This->lock); + if (This->frame_count != 0) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_UNSUPPORTEDOPERATION; + } if (!This->stream) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_NOTINITIALIZED; + } hr = CreatePropertyBag2(ppIEncoderOptions); - if (FAILED(hr)) return hr; + if (FAILED(hr)) + { + LeaveCriticalSection(&This->lock); + return hr; + } This->frame_count = 1; + LeaveCriticalSection(&This->lock); + IWICBitmapEncoder_AddRef(iface); *ppIFrameEncode = (IWICBitmapFrameEncode*)&This->lpFrameVtbl; @@ -1241,11 +1374,18 @@ static HRESULT WINAPI PngEncoder_Commit(IWICBitmapEncoder *iface) PngEncoder *This = (PngEncoder*)iface; TRACE("(%p)\n", iface); + EnterCriticalSection(&This->lock); + if (!This->frame_committed || This->committed) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; + } This->committed = TRUE; + EnterCriticalSection(&This->lock); + return S_OK; } @@ -1309,6 +1449,8 @@ HRESULT PngEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->lines_written = 0; This->frame_committed = FALSE; This->committed = FALSE; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PngEncoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/regsvr.c b/reactos/dll/win32/windowscodecs/regsvr.c index c87aa4b2458..c5828a6b8b9 100644 --- a/reactos/dll/win32/windowscodecs/regsvr.c +++ b/reactos/dll/win32/windowscodecs/regsvr.c @@ -727,25 +727,25 @@ static struct regsvr_coclass const coclass_list[] = { "WIC Imaging Factory", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICBmpDecoder, "WIC BMP Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICPngDecoder, "WIC PNG Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICPngEncoder, "WIC PNG Encoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICBmpEncoder, "WIC BMP Encoder", @@ -757,25 +757,31 @@ static struct regsvr_coclass const coclass_list[] = { "WIC GIF Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICIcoDecoder, "WIC ICO Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICJpegDecoder, "WIC JPEG Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" + }, + { &CLSID_WICTiffDecoder, + "WIC TIFF Decoder", + NULL, + "windowscodecs.dll", + "Both" }, { &CLSID_WICDefaultFormatConverter, "WIC Default Format Converter", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { NULL } /* list terminator */ }; @@ -868,6 +874,27 @@ static struct decoder_pattern const png_patterns[] = { {0} }; +static const BYTE tiff_magic_le[] = {0x49,0x49,42,0}; +static const BYTE tiff_magic_be[] = {0x4d,0x4d,0,42}; + +static GUID const * const tiff_formats[] = { + &GUID_WICPixelFormatBlackWhite, + &GUID_WICPixelFormat4bppGray, + &GUID_WICPixelFormat8bppGray, + &GUID_WICPixelFormat4bppIndexed, + &GUID_WICPixelFormat8bppIndexed, + &GUID_WICPixelFormat32bppBGR, + &GUID_WICPixelFormat32bppBGRA, + &GUID_WICPixelFormat32bppPBGRA, + NULL +}; + +static struct decoder_pattern const tiff_patterns[] = { + {4,0,tiff_magic_le,mask_all,0}, + {4,0,tiff_magic_be,mask_all,0}, + {0} +}; + static struct regsvr_decoder const decoder_list[] = { { &CLSID_WICBmpDecoder, "The Wine Project", @@ -919,6 +946,16 @@ static struct regsvr_decoder const decoder_list[] = { png_formats, png_patterns }, + { &CLSID_WICTiffDecoder, + "The Wine Project", + "TIFF Decoder", + "1.0.0.0", + &GUID_VendorMicrosoft, + "image/tiff", + ".tif;.tiff", + tiff_formats, + tiff_patterns + }, { NULL } /* list terminator */ }; diff --git a/reactos/dll/win32/windowscodecs/stream.c b/reactos/dll/win32/windowscodecs/stream.c index c59a9d27861..bd5592b9f30 100644 --- a/reactos/dll/win32/windowscodecs/stream.c +++ b/reactos/dll/win32/windowscodecs/stream.c @@ -41,6 +41,8 @@ typedef struct StreamOnMemory { BYTE *pbMemory; DWORD dwMemsize; DWORD dwCurPos; + + CRITICAL_SECTION lock; /* must be held when pbMemory or dwCurPos is accessed */ } StreamOnMemory; static HRESULT WINAPI StreamOnMemory_QueryInterface(IStream *iface, @@ -82,6 +84,8 @@ static ULONG WINAPI StreamOnMemory_Release(IStream *iface) TRACE("(%p) refcount=%u\n", iface, ref); if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -96,9 +100,12 @@ static HRESULT WINAPI StreamOnMemory_Read(IStream *iface, if (!pv) return E_INVALIDARG; + EnterCriticalSection(&This->lock); uBytesRead = min(cb, This->dwMemsize - This->dwCurPos); memcpy(pv, This->pbMemory + This->dwCurPos, uBytesRead); This->dwCurPos += uBytesRead; + LeaveCriticalSection(&This->lock); + if (pcbRead) *pcbRead = uBytesRead; return S_OK; @@ -108,18 +115,24 @@ static HRESULT WINAPI StreamOnMemory_Write(IStream *iface, void const *pv, ULONG cb, ULONG *pcbWritten) { StreamOnMemory *This = (StreamOnMemory*)iface; + HRESULT hr; TRACE("(%p)\n", This); if (!pv) return E_INVALIDARG; - if (cb > This->dwMemsize - This->dwCurPos) return STG_E_MEDIUMFULL; - if (cb) { + EnterCriticalSection(&This->lock); + if (cb > This->dwMemsize - This->dwCurPos) { + hr = STG_E_MEDIUMFULL; + } + else { memcpy(This->pbMemory + This->dwCurPos, pv, cb); This->dwCurPos += cb; + hr = S_OK; + if (pcbWritten) *pcbWritten = cb; } - if (pcbWritten) *pcbWritten = cb; + LeaveCriticalSection(&This->lock); - return S_OK; + return hr; } static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface, @@ -127,20 +140,29 @@ static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface, { StreamOnMemory *This = (StreamOnMemory*)iface; LARGE_INTEGER NewPosition; + HRESULT hr=S_OK; TRACE("(%p)\n", This); + EnterCriticalSection(&This->lock); if (dwOrigin == STREAM_SEEK_SET) NewPosition.QuadPart = dlibMove.QuadPart; else if (dwOrigin == STREAM_SEEK_CUR) NewPosition.QuadPart = This->dwCurPos + dlibMove.QuadPart; else if (dwOrigin == STREAM_SEEK_END) NewPosition.QuadPart = This->dwMemsize + dlibMove.QuadPart; - else return E_INVALIDARG; + else hr = E_INVALIDARG; - if (NewPosition.u.HighPart) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - if (NewPosition.QuadPart > This->dwMemsize) return E_INVALIDARG; - if (NewPosition.QuadPart < 0) return E_INVALIDARG; - This->dwCurPos = NewPosition.u.LowPart; + if (SUCCEEDED(hr)) { + if (NewPosition.u.HighPart) hr = HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + else if (NewPosition.QuadPart > This->dwMemsize) hr = E_INVALIDARG; + else if (NewPosition.QuadPart < 0) hr = E_INVALIDARG; + } - if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos; - return S_OK; + if (SUCCEEDED(hr)) { + This->dwCurPos = NewPosition.u.LowPart; + + if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos; + } + LeaveCriticalSection(&This->lock); + + return hr; } /* SetSize isn't implemented in the native windowscodecs DLL either */ @@ -450,8 +472,16 @@ static HRESULT WINAPI IWICStreamImpl_InitializeFromMemory(IWICStream *iface, pObject->pbMemory = pbBuffer; pObject->dwMemsize = cbBufferSize; pObject->dwCurPos = 0; + InitializeCriticalSection(&pObject->lock); + pObject->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": StreamOnMemory.lock"); + + if (InterlockedCompareExchangePointer((void**)&This->pStream, pObject, NULL)) + { + /* Some other thread set the stream first. */ + IStream_Release((IStream*)pObject); + return WINCODEC_ERR_WRONGSTATE; + } - This->pStream = (IStream*)pObject; return S_OK; } diff --git a/reactos/dll/win32/windowscodecs/tiffformat.c b/reactos/dll/win32/windowscodecs/tiffformat.c new file mode 100644 index 00000000000..fe87ddd6ba5 --- /dev/null +++ b/reactos/dll/win32/windowscodecs/tiffformat.c @@ -0,0 +1,866 @@ +/* + * Copyright 2010 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_TIFFIO_H +#include +#endif + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "wincodec.h" + +#include "wincodecs_private.h" + +#include "wine/debug.h" +#include "wine/library.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); + +#ifdef SONAME_LIBTIFF + +static CRITICAL_SECTION init_tiff_cs; +static CRITICAL_SECTION_DEBUG init_tiff_cs_debug = +{ + 0, 0, &init_tiff_cs, + { &init_tiff_cs_debug.ProcessLocksList, + &init_tiff_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": init_tiff_cs") } +}; +static CRITICAL_SECTION init_tiff_cs = { &init_tiff_cs_debug, -1, 0, 0, 0, 0 }; + +static void *libtiff_handle; +#define MAKE_FUNCPTR(f) static typeof(f) * p##f +MAKE_FUNCPTR(TIFFClientOpen); +MAKE_FUNCPTR(TIFFClose); +MAKE_FUNCPTR(TIFFCurrentDirectory); +MAKE_FUNCPTR(TIFFGetField); +MAKE_FUNCPTR(TIFFReadDirectory); +MAKE_FUNCPTR(TIFFReadEncodedStrip); +MAKE_FUNCPTR(TIFFSetDirectory); +#undef MAKE_FUNCPTR + +static void *load_libtiff(void) +{ + void *result; + + EnterCriticalSection(&init_tiff_cs); + + if (!libtiff_handle && + (libtiff_handle = wine_dlopen(SONAME_LIBTIFF, RTLD_NOW, NULL, 0)) != NULL) + { + +#define LOAD_FUNCPTR(f) \ + if((p##f = wine_dlsym(libtiff_handle, #f, NULL, 0)) == NULL) { \ + ERR("failed to load symbol %s\n", #f); \ + libtiff_handle = NULL; \ + LeaveCriticalSection(&init_tiff_cs); \ + return NULL; \ + } + LOAD_FUNCPTR(TIFFClientOpen); + LOAD_FUNCPTR(TIFFClose); + LOAD_FUNCPTR(TIFFCurrentDirectory); + LOAD_FUNCPTR(TIFFGetField); + LOAD_FUNCPTR(TIFFReadDirectory); + LOAD_FUNCPTR(TIFFReadEncodedStrip); + LOAD_FUNCPTR(TIFFSetDirectory); +#undef LOAD_FUNCPTR + + } + + result = libtiff_handle; + + LeaveCriticalSection(&init_tiff_cs); + return result; +} + +static tsize_t tiff_stream_read(thandle_t client_data, tdata_t data, tsize_t size) +{ + IStream *stream = (IStream*)client_data; + ULONG bytes_read; + HRESULT hr; + + hr = IStream_Read(stream, data, size, &bytes_read); + if (FAILED(hr)) bytes_read = 0; + return bytes_read; +} + +static tsize_t tiff_stream_write(thandle_t client_data, tdata_t data, tsize_t size) +{ + IStream *stream = (IStream*)client_data; + ULONG bytes_written; + HRESULT hr; + + hr = IStream_Write(stream, data, size, &bytes_written); + if (FAILED(hr)) bytes_written = 0; + return bytes_written; +} + +static toff_t tiff_stream_seek(thandle_t client_data, toff_t offset, int whence) +{ + IStream *stream = (IStream*)client_data; + LARGE_INTEGER move; + DWORD origin; + ULARGE_INTEGER new_position; + HRESULT hr; + + move.QuadPart = offset; + switch (whence) + { + case SEEK_SET: + origin = STREAM_SEEK_SET; + break; + case SEEK_CUR: + origin = STREAM_SEEK_CUR; + break; + case SEEK_END: + origin = STREAM_SEEK_END; + break; + default: + ERR("unknown whence value %i\n", whence); + return -1; + } + + hr = IStream_Seek(stream, move, origin, &new_position); + if (SUCCEEDED(hr)) return new_position.QuadPart; + else return -1; +} + +static int tiff_stream_close(thandle_t client_data) +{ + /* Caller is responsible for releasing the stream object. */ + return 0; +} + +static toff_t tiff_stream_size(thandle_t client_data) +{ + IStream *stream = (IStream*)client_data; + STATSTG statstg; + HRESULT hr; + + hr = IStream_Stat(stream, &statstg, STATFLAG_NONAME); + + if (SUCCEEDED(hr)) return statstg.cbSize.QuadPart; + else return -1; +} + +static int tiff_stream_map(thandle_t client_data, tdata_t *addr, toff_t *size) +{ + /* Cannot mmap streams */ + return 0; +} + +static void tiff_stream_unmap(thandle_t client_data, tdata_t addr, toff_t size) +{ + /* No need to ever do this, since we can't map things. */ +} + +static TIFF* tiff_open_stream(IStream *stream, const char *mode) +{ + return pTIFFClientOpen("", mode, stream, tiff_stream_read, + tiff_stream_write, tiff_stream_seek, tiff_stream_close, + tiff_stream_size, tiff_stream_map, tiff_stream_unmap); +} + +typedef struct { + const IWICBitmapDecoderVtbl *lpVtbl; + LONG ref; + IStream *stream; + CRITICAL_SECTION lock; /* Must be held when tiff is used or initiailzed is set */ + TIFF *tiff; + BOOL initialized; +} TiffDecoder; + +typedef struct { + const WICPixelFormatGUID *format; + int bpp; + int indexed; + int reverse_bgr; + UINT width, height; + UINT tile_width, tile_height; + UINT tile_stride; + UINT tile_size; +} tiff_decode_info; + +typedef struct { + const IWICBitmapFrameDecodeVtbl *lpVtbl; + LONG ref; + TiffDecoder *parent; + UINT index; + tiff_decode_info decode_info; + INT cached_tile_x, cached_tile_y; + BYTE *cached_tile; +} TiffFrameDecode; + +static const IWICBitmapFrameDecodeVtbl TiffFrameDecode_Vtbl; + +static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info) +{ + uint16 photometric, bps, samples, planar; + int ret; + + decode_info->indexed = 0; + decode_info->reverse_bgr = 0; + + ret = pTIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); + if (!ret) + { + WARN("missing PhotometricInterpretation tag\n"); + return E_FAIL; + } + + ret = pTIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bps); + if (!ret) bps = 1; + + switch(photometric) + { + case 1: /* BlackIsZero */ + decode_info->bpp = bps; + switch (bps) + { + case 1: + decode_info->format = &GUID_WICPixelFormatBlackWhite; + break; + case 4: + decode_info->format = &GUID_WICPixelFormat4bppGray; + break; + case 8: + decode_info->format = &GUID_WICPixelFormat8bppGray; + break; + default: + FIXME("unhandled greyscale bit count %u\n", bps); + return E_FAIL; + } + break; + case 2: /* RGB */ + if (bps != 8) + { + FIXME("unhandled RGB bit count %u\n", bps); + return E_FAIL; + } + ret = pTIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samples); + if (samples != 3) + { + FIXME("unhandled RGB sample count %u\n", samples); + return E_FAIL; + } + ret = pTIFFGetField(tiff, TIFFTAG_PLANARCONFIG, &planar); + if (!ret) planar = 1; + if (planar != 1) + { + FIXME("unhandled planar configuration %u\n", planar); + return E_FAIL; + } + decode_info->bpp = bps * samples; + decode_info->reverse_bgr = 1; + decode_info->format = &GUID_WICPixelFormat24bppBGR; + break; + case 3: /* RGB Palette */ + decode_info->indexed = 1; + decode_info->bpp = bps; + switch (bps) + { + case 4: + decode_info->format = &GUID_WICPixelFormat4bppIndexed; + break; + case 8: + decode_info->format = &GUID_WICPixelFormat8bppIndexed; + break; + default: + FIXME("unhandled indexed bit count %u\n", bps); + return E_FAIL; + } + break; + case 0: /* WhiteIsZero */ + case 4: /* Transparency mask */ + case 5: /* CMYK */ + case 6: /* YCbCr */ + case 8: /* CIELab */ + default: + FIXME("unhandled PhotometricInterpretation %u\n", photometric); + return E_FAIL; + } + + ret = pTIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &decode_info->width); + if (!ret) + { + WARN("missing image width\n"); + return E_FAIL; + } + + ret = pTIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &decode_info->height); + if (!ret) + { + WARN("missing image length\n"); + return E_FAIL; + } + + ret = pTIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &decode_info->tile_height); + if (ret) + { + decode_info->tile_width = decode_info->width; + decode_info->tile_stride = ((decode_info->bpp * decode_info->tile_width + 7)/8); + decode_info->tile_size = decode_info->tile_height * decode_info->tile_stride; + } + else + { + /* Probably a tiled image */ + FIXME("missing RowsPerStrip value\n"); + return E_FAIL; + } + + return S_OK; +} + +static HRESULT WINAPI TiffDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid, + void **ppv) +{ + TiffDecoder *This = (TiffDecoder*)iface; + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid)) + { + *ppv = This; + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI TiffDecoder_AddRef(IWICBitmapDecoder *iface) +{ + TiffDecoder *This = (TiffDecoder*)iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + return ref; +} + +static ULONG WINAPI TiffDecoder_Release(IWICBitmapDecoder *iface) +{ + TiffDecoder *This = (TiffDecoder*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + { + if (This->tiff) pTIFFClose(This->tiff); + if (This->stream) IStream_Release(This->stream); + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI TiffDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *pIStream, + DWORD *pdwCapability) +{ + FIXME("(%p,%p,%p): stub\n", iface, pIStream, pdwCapability); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream, + WICDecodeOptions cacheOptions) +{ + TiffDecoder *This = (TiffDecoder*)iface; + TIFF *tiff; + HRESULT hr=S_OK; + + TRACE("(%p,%p,%x): stub\n", iface, pIStream, cacheOptions); + + EnterCriticalSection(&This->lock); + + if (This->initialized) + { + hr = WINCODEC_ERR_WRONGSTATE; + goto exit; + } + + tiff = tiff_open_stream(pIStream, "r"); + + if (!tiff) + { + hr = E_FAIL; + goto exit; + } + + This->tiff = tiff; + This->stream = pIStream; + IStream_AddRef(pIStream); + This->initialized = TRUE; + +exit: + LeaveCriticalSection(&This->lock); + return hr; +} + +static HRESULT WINAPI TiffDecoder_GetContainerFormat(IWICBitmapDecoder *iface, + GUID *pguidContainerFormat) +{ + memcpy(pguidContainerFormat, &GUID_ContainerFormatTiff, sizeof(GUID)); + return S_OK; +} + +static HRESULT WINAPI TiffDecoder_GetDecoderInfo(IWICBitmapDecoder *iface, + IWICBitmapDecoderInfo **ppIDecoderInfo) +{ + FIXME("(%p,%p): stub\n", iface, ppIDecoderInfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_CopyPalette(IWICBitmapDecoder *iface, + IWICPalette *pIPalette) +{ + FIXME("(%p,%p): stub\n", iface, pIPalette); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface, + IWICMetadataQueryReader **ppIMetadataQueryReader) +{ + FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_GetPreview(IWICBitmapDecoder *iface, + IWICBitmapSource **ppIBitmapSource) +{ + FIXME("(%p,%p): stub\n", iface, ppIBitmapSource); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_GetColorContexts(IWICBitmapDecoder *iface, + UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount) +{ + FIXME("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_GetThumbnail(IWICBitmapDecoder *iface, + IWICBitmapSource **ppIThumbnail) +{ + TRACE("(%p,%p)\n", iface, ppIThumbnail); + return WINCODEC_ERR_CODECNOTHUMBNAIL; +} + +static HRESULT WINAPI TiffDecoder_GetFrameCount(IWICBitmapDecoder *iface, + UINT *pCount) +{ + TiffDecoder *This = (TiffDecoder*)iface; + + if (!This->tiff) + { + WARN("(%p) <-- WINCODEC_ERR_WRONGSTATE\n", iface); + return WINCODEC_ERR_WRONGSTATE; + } + + EnterCriticalSection(&This->lock); + while (pTIFFReadDirectory(This->tiff)) { } + *pCount = pTIFFCurrentDirectory(This->tiff)+1; + LeaveCriticalSection(&This->lock); + + TRACE("(%p) <-- %i\n", iface, *pCount); + + return S_OK; +} + +static HRESULT WINAPI TiffDecoder_GetFrame(IWICBitmapDecoder *iface, + UINT index, IWICBitmapFrameDecode **ppIBitmapFrame) +{ + TiffDecoder *This = (TiffDecoder*)iface; + TiffFrameDecode *result; + int res; + tiff_decode_info decode_info; + HRESULT hr; + + TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame); + + if (!This->tiff) + return WINCODEC_ERR_WRONGSTATE; + + EnterCriticalSection(&This->lock); + res = pTIFFSetDirectory(This->tiff, index); + if (!res) hr = E_INVALIDARG; + else hr = tiff_get_decode_info(This->tiff, &decode_info); + LeaveCriticalSection(&This->lock); + + if (SUCCEEDED(hr)) + { + result = HeapAlloc(GetProcessHeap(), 0, sizeof(TiffFrameDecode)); + + if (result) + { + result->lpVtbl = &TiffFrameDecode_Vtbl; + result->ref = 1; + result->parent = This; + result->index = index; + result->decode_info = decode_info; + result->cached_tile_x = -1; + result->cached_tile = HeapAlloc(GetProcessHeap(), 0, decode_info.tile_size); + + if (result->cached_tile) + *ppIBitmapFrame = (IWICBitmapFrameDecode*)result; + else + { + hr = E_OUTOFMEMORY; + HeapFree(GetProcessHeap(), 0, result); + } + } + else hr = E_OUTOFMEMORY; + } + + if (FAILED(hr)) *ppIBitmapFrame = NULL; + + return hr; +} + +static const IWICBitmapDecoderVtbl TiffDecoder_Vtbl = { + TiffDecoder_QueryInterface, + TiffDecoder_AddRef, + TiffDecoder_Release, + TiffDecoder_QueryCapability, + TiffDecoder_Initialize, + TiffDecoder_GetContainerFormat, + TiffDecoder_GetDecoderInfo, + TiffDecoder_CopyPalette, + TiffDecoder_GetMetadataQueryReader, + TiffDecoder_GetPreview, + TiffDecoder_GetColorContexts, + TiffDecoder_GetThumbnail, + TiffDecoder_GetFrameCount, + TiffDecoder_GetFrame +}; + +static HRESULT WINAPI TiffFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, + void **ppv) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, iid) || + IsEqualIID(&IID_IWICBitmapSource, iid) || + IsEqualIID(&IID_IWICBitmapFrameDecode, iid)) + { + *ppv = This; + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI TiffFrameDecode_AddRef(IWICBitmapFrameDecode *iface) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + return ref; +} + +static ULONG WINAPI TiffFrameDecode_Release(IWICBitmapFrameDecode *iface) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + { + HeapFree(GetProcessHeap(), 0, This->cached_tile); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI TiffFrameDecode_GetSize(IWICBitmapFrameDecode *iface, + UINT *puiWidth, UINT *puiHeight) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + + *puiWidth = This->decode_info.width; + *puiHeight = This->decode_info.height; + + TRACE("(%p) <-- %ux%u\n", iface, *puiWidth, *puiHeight); + + return S_OK; +} + +static HRESULT WINAPI TiffFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface, + WICPixelFormatGUID *pPixelFormat) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + + memcpy(pPixelFormat, This->decode_info.format, sizeof(GUID)); + + TRACE("(%p) <-- %s\n", This, debugstr_guid(This->decode_info.format)); + + return S_OK; +} + +static HRESULT WINAPI TiffFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, + double *pDpiX, double *pDpiY) +{ + FIXME("(%p,%p,%p)\n", iface, pDpiX, pDpiY); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, + IWICPalette *pIPalette) +{ + FIXME("(%p,%p)\n", iface, pIPalette); + return E_NOTIMPL; +} + +static HRESULT TiffFrameDecode_ReadTile(TiffFrameDecode *This, UINT tile_x, UINT tile_y) +{ + HRESULT hr=S_OK; + tsize_t ret; + + ret = pTIFFSetDirectory(This->parent->tiff, This->index); + + if (ret == -1) + hr = E_FAIL; + + if (hr == S_OK) + { + ret = pTIFFReadEncodedStrip(This->parent->tiff, tile_y, This->cached_tile, This->decode_info.tile_size); + + if (ret == -1) + hr = E_FAIL; + } + + if (hr == S_OK && This->decode_info.reverse_bgr) + { + if (This->decode_info.format == &GUID_WICPixelFormat24bppBGR) + { + UINT i, total_pixels; + BYTE *pixel, temp; + + total_pixels = This->decode_info.tile_width * This->decode_info.tile_height; + pixel = This->cached_tile; + for (i=0; icached_tile_x = tile_x; + This->cached_tile_y = tile_y; + } + + return hr; +} + +static HRESULT WINAPI TiffFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, + const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + UINT min_tile_x, max_tile_x, min_tile_y, max_tile_y; + UINT tile_x, tile_y; + WICRect rc; + HRESULT hr=S_OK; + BYTE *dst_tilepos; + UINT bytesperrow; + + TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); + + if (prc->X < 0 || prc->Y < 0 || prc->X+prc->Width > This->decode_info.width || + prc->Y+prc->Height > This->decode_info.height) + return E_INVALIDARG; + + bytesperrow = ((This->decode_info.bpp * prc->Width)+7)/8; + + if (cbStride < bytesperrow) + return E_INVALIDARG; + + if ((cbStride * prc->Height) > cbBufferSize) + return E_INVALIDARG; + + min_tile_x = prc->X / This->decode_info.tile_width; + min_tile_y = prc->Y / This->decode_info.tile_height; + max_tile_x = (prc->X+prc->Width-1) / This->decode_info.tile_width; + max_tile_y = (prc->Y+prc->Height-1) / This->decode_info.tile_height; + + EnterCriticalSection(&This->parent->lock); + + for (tile_x=min_tile_x; tile_x <= max_tile_x; tile_x++) + { + for (tile_y=min_tile_y; tile_y <= max_tile_y; tile_y++) + { + if (tile_x != This->cached_tile_x || tile_y != This->cached_tile_y) + { + hr = TiffFrameDecode_ReadTile(This, tile_x, tile_y); + } + + if (SUCCEEDED(hr)) + { + if (prc->X < tile_x * This->decode_info.tile_width) + rc.X = 0; + else + rc.X = prc->X - tile_x * This->decode_info.tile_width; + + if (prc->Y < tile_y * This->decode_info.tile_height) + rc.Y = 0; + else + rc.Y = prc->Y - tile_y * This->decode_info.tile_height; + + if (prc->X+prc->Width > (tile_x+1) * This->decode_info.tile_width) + rc.Width = This->decode_info.tile_width - rc.X; + else + rc.Width = prc->Width + rc.X - prc->X; + + if (prc->Y+prc->Height > (tile_y+1) * This->decode_info.tile_height) + rc.Height = This->decode_info.tile_height - rc.Y; + else + rc.Height = prc->Height + rc.Y - prc->Y; + + dst_tilepos = pbBuffer + (cbStride * (rc.Y - prc->Y)) + + ((This->decode_info.bpp * (rc.X - prc->X) + 7) / 8); + + hr = copy_pixels(This->decode_info.bpp, This->cached_tile, + This->decode_info.tile_width, This->decode_info.tile_height, This->decode_info.tile_stride, + &rc, cbStride, cbBufferSize, dst_tilepos); + } + + if (FAILED(hr)) + { + LeaveCriticalSection(&This->parent->lock); + TRACE("<-- 0x%x\n", hr); + return hr; + } + } + } + + LeaveCriticalSection(&This->parent->lock); + + return S_OK; +} + +static HRESULT WINAPI TiffFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode *iface, + IWICMetadataQueryReader **ppIMetadataQueryReader) +{ + FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface, + UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount) +{ + FIXME("(%p,%u,%p,%p): stub\n", iface, cCount, ppIColorContexts, pcActualCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface, + IWICBitmapSource **ppIThumbnail) +{ + FIXME("(%p,%p): stub\n", iface, ppIThumbnail); + return E_NOTIMPL; +} + +static const IWICBitmapFrameDecodeVtbl TiffFrameDecode_Vtbl = { + TiffFrameDecode_QueryInterface, + TiffFrameDecode_AddRef, + TiffFrameDecode_Release, + TiffFrameDecode_GetSize, + TiffFrameDecode_GetPixelFormat, + TiffFrameDecode_GetResolution, + TiffFrameDecode_CopyPalette, + TiffFrameDecode_CopyPixels, + TiffFrameDecode_GetMetadataQueryReader, + TiffFrameDecode_GetColorContexts, + TiffFrameDecode_GetThumbnail +}; + +HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) +{ + HRESULT ret; + TiffDecoder *This; + + TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); + + *ppv = NULL; + + if (pUnkOuter) return CLASS_E_NOAGGREGATION; + + if (!load_libtiff()) + { + ERR("Failed reading TIFF because unable to load %s\n",SONAME_LIBTIFF); + return E_FAIL; + } + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(TiffDecoder)); + if (!This) return E_OUTOFMEMORY; + + This->lpVtbl = &TiffDecoder_Vtbl; + This->ref = 1; + This->stream = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": TiffDecoder.lock"); + This->tiff = NULL; + This->initialized = FALSE; + + ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); + IUnknown_Release((IUnknown*)This); + + return ret; +} + +#else /* !SONAME_LIBTIFF */ + +HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) +{ + ERR("Trying to load TIFF picture, but Wine was compiled without TIFF support.\n"); + return E_FAIL; +} + +#endif diff --git a/reactos/dll/win32/windowscodecs/wincodecs_private.h b/reactos/dll/win32/windowscodecs/wincodecs_private.h index 632f82206da..0e72793dafc 100644 --- a/reactos/dll/win32/windowscodecs/wincodecs_private.h +++ b/reactos/dll/win32/windowscodecs/wincodecs_private.h @@ -28,6 +28,7 @@ extern HRESULT BmpEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** extern HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void** ppv); extern HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); +extern HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT PaletteImpl_Create(IWICPalette **palette); extern HRESULT StreamImpl_Create(IWICStream **stream); diff --git a/reactos/dll/win32/windowscodecs/windowscodecs.rbuild b/reactos/dll/win32/windowscodecs/windowscodecs.rbuild index 563a7a99352..da8e3e46618 100644 --- a/reactos/dll/win32/windowscodecs/windowscodecs.rbuild +++ b/reactos/dll/win32/windowscodecs/windowscodecs.rbuild @@ -28,6 +28,7 @@ propertybag.c regsvr.c stream.c + tiffformat.c ungif.c version.rc diff --git a/reactos/dll/win32/wininet/internet.c b/reactos/dll/win32/wininet/internet.c index f4b8a0a3abd..6fc8a212c89 100644 --- a/reactos/dll/win32/wininet/internet.c +++ b/reactos/dll/win32/wininet/internet.c @@ -102,8 +102,8 @@ static CRITICAL_SECTION_DEBUG WININET_cs_debug = static CRITICAL_SECTION WININET_cs = { &WININET_cs_debug, -1, 0, 0, 0, 0 }; static object_header_t **WININET_Handles; -static UINT WININET_dwNextHandle; -static UINT WININET_dwMaxHandles; +static UINT_PTR WININET_dwNextHandle; +static UINT_PTR WININET_dwMaxHandles; typedef struct { @@ -122,7 +122,7 @@ static const WCHAR szProxyEnable[] = { 'P','r','o','x','y','E','n','a','b','l',' HINTERNET WININET_AllocHandle( object_header_t *info ) { object_header_t **p; - UINT handle = 0, num; + UINT_PTR handle = 0, num; list_init( &info->children ); @@ -173,7 +173,7 @@ object_header_t *WININET_AddRef( object_header_t *info ) object_header_t *WININET_GetObject( HINTERNET hinternet ) { object_header_t *info = NULL; - UINT handle = (UINT) hinternet; + UINT_PTR handle = (UINT_PTR) hinternet; EnterCriticalSection( &WININET_cs ); @@ -183,7 +183,7 @@ object_header_t *WININET_GetObject( HINTERNET hinternet ) LeaveCriticalSection( &WININET_cs ); - TRACE("handle %d -> %p\n", handle, info); + TRACE("handle %ld -> %p\n", handle, info); return info; } @@ -218,7 +218,7 @@ BOOL WININET_Release( object_header_t *info ) BOOL WININET_FreeHandle( HINTERNET hinternet ) { BOOL ret = FALSE; - UINT handle = (UINT) hinternet; + UINT_PTR handle = (UINT_PTR) hinternet; object_header_t *info = NULL, *child, *next; EnterCriticalSection( &WININET_cs ); @@ -229,7 +229,7 @@ BOOL WININET_FreeHandle( HINTERNET hinternet ) if( WININET_Handles[handle] ) { info = WININET_Handles[handle]; - TRACE( "destroying handle %d for object %p\n", handle+1, info); + TRACE( "destroying handle %ld for object %p\n", handle+1, info); WININET_Handles[handle] = NULL; ret = TRUE; } @@ -245,8 +245,8 @@ BOOL WININET_FreeHandle( HINTERNET hinternet ) /* Free all children as native does */ LIST_FOR_EACH_ENTRY_SAFE( child, next, &info->children, object_header_t, entry ) { - TRACE( "freeing child handle %d for parent handle %d\n", - (UINT)child->hInternet, handle+1); + TRACE( "freeing child handle %ld for parent handle %ld\n", + (UINT_PTR)child->hInternet, handle+1); WININET_FreeHandle( child->hInternet ); } WININET_Release( info ); diff --git a/reactos/dll/win32/wininet/urlcache.c b/reactos/dll/win32/wininet/urlcache.c index 29d26ab0b6b..6a39c691475 100644 --- a/reactos/dll/win32/wininet/urlcache.c +++ b/reactos/dll/win32/wininet/urlcache.c @@ -986,9 +986,9 @@ static DWORD URLCache_CopyEntry( ZeroMemory((LPBYTE)lpCacheEntryInfo + dwRequiredSize, 4 - (dwRequiredSize % 4)); dwRequiredSize = DWORD_ALIGN(dwRequiredSize); if (bUnicode) - lenUrl = MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, NULL, 0); + lenUrl = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, NULL, 0); else - lenUrl = strlen((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); + lenUrl = strlen((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); dwRequiredSize += (lenUrl + 1) * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); /* FIXME: is source url optional? */ @@ -998,9 +998,9 @@ static DWORD URLCache_CopyEntry( lpCacheEntryInfo->lpszSourceUrlName = (LPSTR)lpCacheEntryInfo + dwRequiredSize - lenUrlBytes; if (bUnicode) - MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenUrl + 1); + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenUrl + 1); else - memcpy(lpCacheEntryInfo->lpszSourceUrlName, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, lenUrlBytes); + memcpy(lpCacheEntryInfo->lpszSourceUrlName, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, lenUrlBytes); } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1029,7 +1029,7 @@ static DWORD URLCache_CopyEntry( if (*lpdwBufferSize >= dwRequiredSize) { lpCacheEntryInfo->lpHeaderInfo = (LPBYTE)lpCacheEntryInfo + dwRequiredSize - pUrlEntry->dwHeaderInfoSize - 1; - memcpy(lpCacheEntryInfo->lpHeaderInfo, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo, pUrlEntry->dwHeaderInfoSize); + memcpy(lpCacheEntryInfo->lpHeaderInfo, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo, pUrlEntry->dwHeaderInfoSize); ((LPBYTE)lpCacheEntryInfo)[dwRequiredSize - 1] = '\0'; } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1041,18 +1041,18 @@ static DWORD URLCache_CopyEntry( int lenExtension; if (bUnicode) - lenExtension = MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, NULL, 0); + lenExtension = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, NULL, 0); else - lenExtension = strlen((LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension) + 1; + lenExtension = strlen((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension) + 1; dwRequiredSize += lenExtension * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); if (*lpdwBufferSize >= dwRequiredSize) { lpCacheEntryInfo->lpszFileExtension = (LPSTR)lpCacheEntryInfo + dwRequiredSize - lenExtension; if (bUnicode) - MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenExtension); + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenExtension); else - memcpy(lpCacheEntryInfo->lpszFileExtension, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, lenExtension * sizeof(CHAR)); + memcpy(lpCacheEntryInfo->lpszFileExtension, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, lenExtension * sizeof(CHAR)); } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1175,8 +1175,8 @@ static inline HASH_CACHEFILE_ENTRY * URLCache_HashEntryFromOffset(LPCURLCACHE_HE static inline BOOL URLCache_IsHashEntryValid(LPCURLCACHE_HEADER pHeader, const HASH_CACHEFILE_ENTRY *pHashEntry) { /* check pHashEntry located within acceptable bounds in the URL cache mapping */ - return ((DWORD)((LPBYTE)pHashEntry - (LPBYTE)pHeader) >= ENTRY_START_OFFSET) && - ((DWORD)((LPBYTE)pHashEntry - (LPBYTE)pHeader) < pHeader->dwFileSize); + return ((DWORD)((const BYTE*)pHashEntry - (const BYTE*)pHeader) >= ENTRY_START_OFFSET) && + ((DWORD)((const BYTE*)pHashEntry - (const BYTE*)pHeader) < pHeader->dwFileSize); } static BOOL URLCache_FindHash(LPCURLCACHE_HEADER pHeader, LPCSTR lpszUrl, struct _HASH_ENTRY ** ppHashEntry) @@ -1557,15 +1557,15 @@ BOOL WINAPI GetUrlCacheEntryInfoA( if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); + TRACE("Found URL: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); if (pUrlEntry->dwOffsetHeaderInfo) - TRACE("Header info: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); + TRACE("Header info: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); if (lpdwCacheEntryInfoBufferSize) { @@ -1639,14 +1639,14 @@ BOOL WINAPI GetUrlCacheEntryInfoW(LPCWSTR lpszUrl, if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); - TRACE("Header info: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); + TRACE("Found URL: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); + TRACE("Header info: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); if (lpdwCacheEntryInfoBufferSize) { @@ -3265,9 +3265,9 @@ BOOL WINAPI FindNextUrlCacheEntryA( if (pEntry->dwSignature != URL_SIGNATURE) continue; - pUrlEntry = (URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); - TRACE("Header info: %s\n", (LPBYTE)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo); + pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; + TRACE("Found URL: %s\n", (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); + TRACE("Header info: %s\n", (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo); error = URLCache_CopyEntry( pContainer, @@ -3563,7 +3563,7 @@ BOOL WINAPI IsUrlCacheEntryExpiredA( LPCSTR url, DWORD dwFlags, FILETIME* pftLas if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } @@ -3625,7 +3625,7 @@ BOOL WINAPI IsUrlCacheEntryExpiredW( LPCWSTR url, DWORD dwFlags, FILETIME* pftLa if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } diff --git a/reactos/dll/win32/wintrust/asn.c b/reactos/dll/win32/wintrust/asn.c index 69c9dd3d604..865926640a3 100644 --- a/reactos/dll/win32/wintrust/asn.c +++ b/reactos/dll/win32/wintrust/asn.c @@ -1348,7 +1348,7 @@ static BOOL CRYPT_AsnDecodeSPCLinkInternal(DWORD dwCertEncodingType, link->dwLinkChoice = SPC_FILE_LINK_CHOICE; for (i = 0; i < dataLen / sizeof(WCHAR); i++) link->u.pwszFile[i] = - hton16(*(WORD *)(ptr + i * sizeof(WCHAR))); + hton16(*(const WORD *)(ptr + i * sizeof(WCHAR))); link->u.pwszFile[realDataLen / sizeof(WCHAR)] = '\0'; TRACE("returning file %s\n", debugstr_w(link->u.pwszFile)); } diff --git a/reactos/include/psdk/ntsecpkg.h b/reactos/include/psdk/ntsecpkg.h index 4de56cc05b0..b83d364544b 100644 --- a/reactos/include/psdk/ntsecpkg.h +++ b/reactos/include/psdk/ntsecpkg.h @@ -19,6 +19,10 @@ #ifndef _NTSECPKG_H #define _NTSECPKG_H +#ifdef __cplusplus +extern "C" { +#endif + /* Flags for the MachineState field in SECPKG_PARAMETERS */ #define SECPKG_STATE_ENCRYPTION_PERMITTED 0x01 #define SECPKG_STATE_STRONG_ENCRYPTION_PERMITTED 0x02 @@ -30,6 +34,9 @@ #define SECPKG_INTERFACE_VERSION 0x10000 #define SECPKG_INTERFACE_VERSION_2 0x20000 #define SECPKG_INTERFACE_VERSION_3 0x40000 +#define SECPKG_INTERFACE_VERSION_4 0x80000 +#define SECPKG_INTERFACE_VERSION_5 0x100000 +#define SECPKG_INTERFACE_VERSION_6 0x200000 /* enum definitions for Secure Service Provider/Authentication Packages */ typedef enum _LSA_TOKEN_INFORMATION_TYPE { @@ -140,6 +147,11 @@ typedef struct _SECPKG_EXTENDED_INFORMATION { } Info; } SECPKG_EXTENDED_INFORMATION, *PSECPKG_EXTENDED_INFORMATION; +typedef struct _SECPKG_TARGETINFO { + PSID DomainSid; + PCWSTR ComputerName; +} SECPKG_TARGETINFO, *PSECPKG_TARGETINFO; + /* callbacks implemented by SSP/AP dlls and called by the LSA */ typedef VOID (NTAPI *PLSA_CALLBACK_FUNCTION)(ULONG_PTR, ULONG_PTR, PSecBuffer, PSecBuffer); @@ -341,6 +353,18 @@ typedef NTSTATUS (NTAPI SpSetContextAttributesFn)(LSA_SEC_HANDLE, ULONG, PVOID, ULONG); typedef NTSTATUS (NTAPI SpSetCredentialsAttributesFn)(LSA_SEC_HANDLE, ULONG, PVOID, ULONG); +typedef NTSTATUS (NTAPI SpChangeAccountPasswordFn)(PUNICODE_STRING, + PUNICODE_STRING, PUNICODE_STRING, PUNICODE_STRING, BOOLEAN, PSecBufferDesc); +typedef NTSTATUS (NTAPI SpQueryMetaDataFn)(LSA_SEC_HANDLE, PUNICODE_STRING, + ULONG, PULONG, PUCHAR *, PLSA_SEC_HANDLE); +typedef NTSTATUS (NTAPI SpExchangeMetaDataFn)(LSA_SEC_HANDLE, PUNICODE_STRING, + ULONG, ULONG, PUCHAR, PLSA_SEC_HANDLE); +typedef NTSTATUS (NTAPI SpGetCredUIContextFn)(LSA_SEC_HANDLE, GUID *, PULONG, + PUCHAR *); +typedef NTSTATUS (NTAPI SpUpdateCredentialsFn)(LSA_SEC_HANDLE, GUID *, ULONG, + PUCHAR); +typedef NTSTATUS (NTAPI SpValidateTargetInfoFn)(PLSA_CLIENT_REQUEST, PVOID, + PVOID, ULONG, PSECPKG_TARGETINFO); /* User-mode functions implemented by SSP/AP obtainable by a dispatch table */ typedef NTSTATUS (NTAPI SpInstanceInitFn)(ULONG, PSECPKG_DLL_FUNCTIONS, @@ -402,6 +426,15 @@ typedef struct SECPKG_FUNCTION_TABLE { /* Packages with version SECPKG_INTERFACE_VERSION_2 end here */ SpSetCredentialsAttributesFn *SetCredentialsAttributes; /* Packages with version SECPKG_INTERFACE_VERSION_3 end here */ + SpChangeAccountPasswordFn *ChangeAccountPassword; + /* Packages with version SECPKG_INTERFACE_VERSION_4 end here */ + SpQueryMetaDataFn *QueryMetaData; + SpExchangeMetaDataFn *ExchangeMetaData; + SpGetCredUIContextFn *GetCredUIContext; + SpUpdateCredentialsFn *UpdateCredentials; + /* Packages with version SECPKG_INTERFACE_VERSION_5 end here */ + SpValidateTargetInfoFn *ValidateTargetInfo; + /* Packages with version SECPKG_INTERFACE_VERSION_6 end here */ } SECPKG_FUNCTION_TABLE, *PSECPKG_FUNCTION_TABLE; @@ -432,4 +465,7 @@ typedef NTSTATUS (NTAPI *SpLsaModeInitializeFn)(ULONG, PULONG, typedef NTSTATUS (WINAPI *SpUserModeInitializeFn)(ULONG, PULONG, PSECPKG_USER_FUNCTION_TABLE *, PULONG); +#ifdef __cplusplus +} +#endif #endif /* _NTSECPKG_H */ diff --git a/reactos/include/psdk/psdk.rbuild b/reactos/include/psdk/psdk.rbuild index 02256ebc338..ebf38da2d59 100644 --- a/reactos/include/psdk/psdk.rbuild +++ b/reactos/include/psdk/psdk.rbuild @@ -47,6 +47,7 @@ richole.idl sensevts.idl servprov.idl + shdeprecated.idl shldisp.idl shobjidl.idl shtypes.idl @@ -68,6 +69,8 @@ xmldso.idl xmldom.idl xmllite.idl + wia_lh.idl + wia_xp.idl stdole2.idl diff --git a/reactos/include/psdk/shdeprecated.idl b/reactos/include/psdk/shdeprecated.idl new file mode 100644 index 00000000000..304b0875224 --- /dev/null +++ b/reactos/include/psdk/shdeprecated.idl @@ -0,0 +1,31 @@ +/* + * Deprecated shell interfaces + * + * Copyright (C) 2010 Nikolay Sivov for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "objidl.idl"; + +[ + object, + local, + uuid(5836fb00-8187-11cf-a12b-00aa004ae837) +] +interface IShellService : IUnknown +{ + HRESULT SetOwner( [in] IUnknown *pUnk ); +} diff --git a/reactos/include/psdk/shlwapi.h b/reactos/include/psdk/shlwapi.h index 29e70b76d8c..223bcdd3c05 100644 --- a/reactos/include/psdk/shlwapi.h +++ b/reactos/include/psdk/shlwapi.h @@ -1028,24 +1028,6 @@ typedef struct _DLLVERSIONINFO2 { HRESULT WINAPI DllInstall(BOOL,LPCWSTR) DECLSPEC_HIDDEN; -#if (_WIN32_IE >= 0x0600) -#define SHGVSPB_PERUSER 0x00000001 -#define SHGVSPB_ALLUSERS 0x00000002 -#define SHGVSPB_PERFOLDER 0x00000004 -#define SHGVSPB_ALLFOLDERS 0x00000008 -#define SHGVSPB_INHERIT 0x00000010 -#define SHGVSPB_ROAM 0x00000020 -#define SHGVSPB_NOAUTODEFAULTS 0x80000000 - -#define SHGVSPB_FOLDER (SHGVSPB_PERUSER | SHGVSPB_PERFOLDER) -#define SHGVSPB_FOLDERNODEFAULTS (SHGVSPB_PERUSER | SHGVSPB_PERFOLDER | SHGVSPB_NOAUTODEFAULTS) -#define SHGVSPB_USERDEFAULTS (SHGVSPB_PERUSER | SHGVSPB_ALLFOLDERS) -#define SHGVSPB_GLOBALDEAFAULTS (SHGVSPB_ALLUSERS | SHGVSPB_ALLFOLDERS) - -HRESULT WINAPI SHGetViewStatePropertyBag(LPCITEMIDLIST pidl, LPWSTR bag_name, DWORD flags, REFIID riid, void **ppv); -#endif /* (_WIN32_IE >= 0x0600) */ - - /* IsOS definitions */ #define OS_WIN32SORGREATER 0x00 @@ -1103,6 +1085,15 @@ BOOL WINAPI IsOS(DWORD); #define FDTF_RTLDATE 0x00000200 #define FDTF_NOAUTOREADINGORDER 0x00000400 + +typedef struct +{ + const IID *piid; + int dwOffset; +} QITAB, *LPQITAB; + +HRESULT WINAPI QISearch(void* base, const QITAB *pqit, REFIID riid, void **ppv); + #include #ifdef __cplusplus diff --git a/reactos/include/psdk/sti.h b/reactos/include/psdk/sti.h index 56650f5a011..204492d9a2f 100644 --- a/reactos/include/psdk/sti.h +++ b/reactos/include/psdk/sti.h @@ -31,6 +31,147 @@ extern "C" { DEFINE_GUID(CLSID_Sti, 0xB323F8E0L, 0x2E68, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C); +DEFINE_GUID(IID_IStillImageW, 0x641BD880, 0x2DC8, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C); + +DEFINE_GUID(IID_IStillImageA, 0xA7B1F740, 0x1D7F, 0x11D1, 0xAC, 0xA9, 0x00, 0xA0, 0x24, 0x38, 0xAD, 0x48); + +#define STI_VERSION_REAL 0x00000002 +#define STI_VERSION_FLAG_UNICODE 0x01000000 + +#ifndef WINE_NO_UNICODE_MACROS +# ifdef UNICODE +# define STI_VERSION (STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE) +# else +# define STI_VERSION (STI_VERSION_REAL) +# endif +#endif + +typedef struct IStillImageA *PSTIA; +typedef struct IStillImageW *PSTIW; +DECL_WINELIB_TYPE_AW(PSTI) +typedef struct IStillImageA *LPSTILLIMAGEA; +typedef struct IStillImageW *LPSTILLIMAGEW; +DECL_WINELIB_TYPE_AW(LPSTILLIMAGE) +typedef struct IStiDeviceA *PSTIDEVICEA; +typedef struct IStiDeviceW *PSTIDEVICEW; +DECL_WINELIB_TYPE_AW(PSTIDEVICE) + +HRESULT WINAPI StiCreateInstanceA(HINSTANCE hinst, DWORD dwVer, PSTIA *ppSti, LPUNKNOWN pUnkOuter); +HRESULT WINAPI StiCreateInstanceW(HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter); +#define StiCreateInstance WINELIB_NAME_AW(StiCreateInstance) + +typedef DWORD STI_DEVICE_TYPE; +typedef enum _STI_DEVICE_MJ_TYPE +{ + StiDeviceTypeDefault = 0, + StiDeviceTypeScanner = 1, + StiDeviceTypeDigitalCamera = 2, + StiDeviceTypeStreamingVideo = 3 +} STI_DEVICE_MJ_TYPE; + +#define GET_STIDEVICE_TYPE(dwDevType) HIWORD(dwDevType) +#define GET_STIDEVICE_SUBTYPE(dwDevType) LOWORD(dwDevType) + +typedef struct _STI_DEV_CAPS { + DWORD dwGeneric; +} STI_DEV_CAPS, *PSTI_DEV_CAPS; + +#define STI_MAX_INTERNAL_NAME_LENGTH 128 + +typedef struct _STI_DEVICE_INFORMATIONW { + DWORD dwSize; + STI_DEVICE_TYPE DeviceType; + WCHAR szDeviceInternalName[STI_MAX_INTERNAL_NAME_LENGTH]; + STI_DEV_CAPS DeviceCapabilities; + DWORD dwHardwareConfiguration; + LPWSTR pszVendorDescription; + LPWSTR pszDeviceDescription; + LPWSTR pszPortName; + LPWSTR pszPropProvider; + LPWSTR pszLocalName; +} STI_DEVICE_INFORMATIONW, *PSTI_DEVICE_INFORMATIONW; + +typedef STI_DEVICE_INFORMATIONW STI_DEVICE_INFORMATION; +typedef PSTI_DEVICE_INFORMATIONW PSTI_DEVICE_INFORMATION; + +#define MAX_NOTIFICATION_DATA 64 + +typedef struct _STINOTIFY { + DWORD dwSize; + GUID guidNotificationCode; + BYTE abNotificationData[MAX_NOTIFICATION_DATA]; +} STINOTIFY,*LPSTINOTIFY; + +#define INTERFACE IStillImageW +DECLARE_INTERFACE_(IStillImageW, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IStillImageW methods ***/ + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; + STDMETHOD(GetDeviceList)(THIS_ DWORD dwType, DWORD dwFlags, DWORD *pdwItemsReturned, LPVOID *ppBuffer) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPWSTR pwszDeviceName, LPVOID *ppBuffer) PURE; + STDMETHOD(CreateDevice)(THIS_ LPWSTR pwszDeviceName, DWORD dwMode, PSTIDEVICEW *pDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(GetDeviceValue)(THIS_ LPWSTR pwszDeviceName, LPWSTR pValueName, LPDWORD pType, LPBYTE pData, LPDWORD cbData) PURE; + STDMETHOD(SetDeviceValue)(THIS_ LPWSTR pwszDeviceName, LPWSTR pValueName, DWORD type, LPBYTE pData, DWORD cbData) PURE; + STDMETHOD(GetSTILaunchInformation)(THIS_ LPWSTR pwszDeviceName, DWORD *pdwEventCode, LPWSTR pwszEventName) PURE; + STDMETHOD(RegisterLaunchApplication)(THIS_ LPWSTR pwszAppName, LPWSTR pwszCommandLine) PURE; + STDMETHOD(UnregisterLaunchApplication)(THIS_ LPWSTR pwszAppName) PURE; + STDMETHOD(EnableHwNotifications)(THIS_ LPCWSTR pwszDeviceName, BOOL bNewState) PURE; + STDMETHOD(GetHwNotificationState)(THIS_ LPCWSTR pwszDeviceName, BOOL *pbCurrentState) PURE; + STDMETHOD(RefreshDeviceBus)(THIS_ LPCWSTR pwszDeviceName) PURE; + STDMETHOD(LaunchApplicationForDevice)(THIS_ LPWSTR pwszDeviceName, LPWSTR pwszAppName, LPSTINOTIFY pStiNotify); + STDMETHOD(SetupDeviceParameters)(THIS_ PSTI_DEVICE_INFORMATIONW pDevInfo); + STDMETHOD(WriteToErrorLog)(THIS_ DWORD dwMessageType, LPCWSTR pszMessage) PURE; +}; +#undef INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IStillImage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IStillImage_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IStillImage_Release(p) (p)->lpVtbl->Release(p) +/*** IStillImage methods ***/ +#define IStillImage_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IStillImage_GetDeviceList(p,a,b,c,d) (p)->lpVtbl->GetDeviceList(p,a,b,c,d) +#define IStillImage_GetDeviceInfo(p,a,b) (p)->lpVtbl->GetDeviceInfo(p,a,b) +#define IStillImage_CreateDevice(p,a,b,c,d) (p)->lpVtbl->CreateDevice(p,a,b,c,d) +#define IStillImage_GetDeviceValue(p,a,b,c,d,e) (p)->lpVtbl->GetDeviceValue(p,a,b,c,d,e) +#define IStillImage_SetDeviceValue(p,a,b,c,d,e) (p)->lpVtbl->SetDeviceValue(p,a,b,c,d,e) +#define IStillImage_GetSTILaunchInformation(p,a,b,c) (p)->lpVtbl->GetSTILaunchInformation(p,a,b,c) +#define IStillImage_RegisterLaunchApplication(p,a,b) (p)->lpVtbl->RegisterLaunchApplication(p,a,b) +#define IStillImage_UnregisterLaunchApplication(p,a) (p)->lpVtbl->UnregisterLaunchApplication(p,a) +#define IStillImage_EnableHwNotifications(p,a,b) (p)->lpVtbl->EnableHwNotifications(p,a,b) +#define IStillImage_GetHwNotificationState(p,a,b) (p)->lpVtbl->GetHwNotificationState(p,a,b) +#define IStillImage_RefreshDeviceBus(p,a) (p)->lpVtbl->RefreshDeviceBus(p,a) +#define IStillImage_LaunchApplicationForDevice(p,a,b,c) (p)->lpVtbl->LaunchApplicationForDevice(p,a,b,c) +#define IStillImage_SetupDeviceParameters(p,a) (p)->lpVtbl->SetupDeviceParameters(p,a) +#define IStillImage_WriteToErrorLog(p,a,b) (p)->lpVtbl->WriteToErrorLog(p,a,b) +#else +/*** IUnknown methods ***/ +#define IStillImage_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IStillImage_AddRef(p) (p)->AddRef() +#define IStillImage_Release(p) (p)->Release() +/*** IStillImage methods ***/ +#define IStillImage_Initialize(p,a,b) (p)->Initialize(a,b) +#define IStillImage_GetDeviceList(p,a,b,c,d) (p)->GetDeviceList(a,b,c,d) +#define IStillImage_GetDeviceInfo(p,a,b) (p)->GetDeviceInfo(a,b) +#define IStillImage_CreateDevice(p,a,b,c,d) (p)->CreateDevice(a,b,c,d) +#define IStillImage_GetDeviceValue(p,a,b,c,d,e) (p)->GetDeviceValue(a,b,c,d,e) +#define IStillImage_SetDeviceValue(p,a,b,c,d,e) (p)->SetDeviceValue(a,b,c,d,e) +#define IStillImage_GetSTILaunchInformation(p,a,b,c) (p)->GetSTILaunchInformation(a,b,c) +#define IStillImage_RegisterLaunchApplication(p,a,b) (p)->RegisterLaunchApplication(a,b) +#define IStillImage_UnregisterLaunchApplication(p,a) (p)->UnregisterLaunchApplication(a) +#define IStillImage_EnableHwNotifications(p,a,b) (p)->EnableHwNotifications(a,b) +#define IStillImage_GetHwNotificationState(p,a,b) (p)->GetHwNotificationState(a,b) +#define IStillImage_RefreshDeviceBus(p,a) (p)->RefreshDeviceBus(a) +#define IStillImage_LaunchApplicationForDevice(p,a,b,c) (p)->LaunchApplicationForDevice(a,b,c) +#define IStillImage_SetupDeviceParameters(p,a) (p)->SetupDeviceParameters(a) +#define IStillImage_WriteToErrorLog(p,a,b) (p)->WriteToErrorLog(a,b) +#endif + #ifdef __cplusplus }; #endif diff --git a/reactos/include/psdk/wia.h b/reactos/include/psdk/wia.h new file mode 100644 index 00000000000..3a0497e6d83 --- /dev/null +++ b/reactos/include/psdk/wia.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +#ifdef __WINESRC__ +#error Specify wia_lh.h or wia_xp.h explicitly in Wine +#endif + +#if (_WIN32_WINNT >= 0x0600) +#include +#elif (_WIN32_WINNT >= 0x0501) +#include +#endif diff --git a/reactos/include/psdk/wia_lh.idl b/reactos/include/psdk/wia_lh.idl new file mode 100644 index 00000000000..5024787a6fc --- /dev/null +++ b/reactos/include/psdk/wia_lh.idl @@ -0,0 +1,127 @@ +/* + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "wtypes.idl"; +import "objidl.idl"; + +interface IEnumWIA_DEV_INFO; +interface IWiaItem; +interface IWiaEventCallback; + +cpp_quote("DEFINE_GUID(CLSID_WiaDevMgr, 0xa1f4e726,0x8cf1,0x11d1,0xbf,0x92,0x00,0x60,0x08,0x1e,0xd8,0x11);") + +[ + object, + uuid(5eb2502a-8cf1-11d1-bf92-0060081ed811) +] +interface IWiaDevMgr : IUnknown +{ + HRESULT EnumDeviceInfo( + [in] LONG lFlag, + [retval, out] IEnumWIA_DEV_INFO **ppIEnum); + + HRESULT CreateDevice( + [in] BSTR bstrDeviceID, + [out] IWiaItem **ppWiaItemRoot); + + HRESULT SelectDeviceDlg( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [in, out] BSTR *pbstrDeviceID, + [retval, out] IWiaItem **ppItemRoot); + + HRESULT SelectDeviceDlgID( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [retval, out] BSTR *pbstrDeviceID); + + HRESULT GetImageDlg( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [in] LONG lIntent, + [in] IWiaItem *pItemRoot, + [in] BSTR bstrFilename, + [in, out] GUID *pguidFormat); + + HRESULT RegisterEventCallbackProgram( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [in] BSTR bstrCommandline, + [in] BSTR bstrName, + [in] BSTR bstrDescription, + [in] BSTR bstrIcon); + + HRESULT RegisterEventCallbackInterface( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [unique, in] IWiaEventCallback *pIWiaEventCallback, + [out] IUnknown **pEventObject); + + HRESULT RegisterEventCallbackCLSID( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [unique, in] const GUID *pClsID, + [in] BSTR bstrName, + [in] BSTR bstrDescription, + [in] BSTR bstrIcon); + + HRESULT AddDeviceDlg( + [in] HWND hwndParent, + [in] LONG lFlags); +} + +[ + object, + uuid(5e38b83c-8cf1-11d1-bf92-0060081ed811) +] +interface IEnumWIA_DEV_INFO : IUnknown +{ + /* fill in */ +} + +[ + object, + uuid(4db1ad10-3391-11d2-9a33-00c04fa36145) +] +interface IWiaItem : IUnknown +{ + /* FIXME: fill in */ +} + +[ + object, + uuid(ae6287b0-0084-11d2-973b-00a0c9068f2e) +] +interface IWiaEventCallback : IUnknown +{ + HRESULT ImageEventCallback( + [in] const GUID *pEventGUID, + [in] BSTR bstrEventDescription, + [in] BSTR bstrDeviceID, + [in] BSTR bstrDeviceDescription, + [in] DWORD dwDeviceType, + [in] BSTR bstrFullItemName, + [in,out] ULONG *pulEventType, + [in] ULONG ulReserved); +} diff --git a/reactos/include/psdk/wia_xp.idl b/reactos/include/psdk/wia_xp.idl new file mode 100644 index 00000000000..5024787a6fc --- /dev/null +++ b/reactos/include/psdk/wia_xp.idl @@ -0,0 +1,127 @@ +/* + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "wtypes.idl"; +import "objidl.idl"; + +interface IEnumWIA_DEV_INFO; +interface IWiaItem; +interface IWiaEventCallback; + +cpp_quote("DEFINE_GUID(CLSID_WiaDevMgr, 0xa1f4e726,0x8cf1,0x11d1,0xbf,0x92,0x00,0x60,0x08,0x1e,0xd8,0x11);") + +[ + object, + uuid(5eb2502a-8cf1-11d1-bf92-0060081ed811) +] +interface IWiaDevMgr : IUnknown +{ + HRESULT EnumDeviceInfo( + [in] LONG lFlag, + [retval, out] IEnumWIA_DEV_INFO **ppIEnum); + + HRESULT CreateDevice( + [in] BSTR bstrDeviceID, + [out] IWiaItem **ppWiaItemRoot); + + HRESULT SelectDeviceDlg( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [in, out] BSTR *pbstrDeviceID, + [retval, out] IWiaItem **ppItemRoot); + + HRESULT SelectDeviceDlgID( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [retval, out] BSTR *pbstrDeviceID); + + HRESULT GetImageDlg( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [in] LONG lIntent, + [in] IWiaItem *pItemRoot, + [in] BSTR bstrFilename, + [in, out] GUID *pguidFormat); + + HRESULT RegisterEventCallbackProgram( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [in] BSTR bstrCommandline, + [in] BSTR bstrName, + [in] BSTR bstrDescription, + [in] BSTR bstrIcon); + + HRESULT RegisterEventCallbackInterface( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [unique, in] IWiaEventCallback *pIWiaEventCallback, + [out] IUnknown **pEventObject); + + HRESULT RegisterEventCallbackCLSID( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [unique, in] const GUID *pClsID, + [in] BSTR bstrName, + [in] BSTR bstrDescription, + [in] BSTR bstrIcon); + + HRESULT AddDeviceDlg( + [in] HWND hwndParent, + [in] LONG lFlags); +} + +[ + object, + uuid(5e38b83c-8cf1-11d1-bf92-0060081ed811) +] +interface IEnumWIA_DEV_INFO : IUnknown +{ + /* fill in */ +} + +[ + object, + uuid(4db1ad10-3391-11d2-9a33-00c04fa36145) +] +interface IWiaItem : IUnknown +{ + /* FIXME: fill in */ +} + +[ + object, + uuid(ae6287b0-0084-11d2-973b-00a0c9068f2e) +] +interface IWiaEventCallback : IUnknown +{ + HRESULT ImageEventCallback( + [in] const GUID *pEventGUID, + [in] BSTR bstrEventDescription, + [in] BSTR bstrDeviceID, + [in] BSTR bstrDeviceDescription, + [in] DWORD dwDeviceType, + [in] BSTR bstrFullItemName, + [in,out] ULONG *pulEventType, + [in] ULONG ulReserved); +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 828e413dbc1..a1fbc15d694 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -52,13 +52,13 @@ reactos/dll/win32/comctl32 # Autosync ?? reactos/dll/win32/comdlg32 # Autosync reactos/dll/win32/compstui # Autosync reactos/dll/win32/credui # Autosync -reactos/dll/win32/crypt32 # Synced to Wine-1_1_40 +reactos/dll/win32/crypt32 # Synced to Wine-1_1_43 reactos/dll/win32/cryptdlg # Autosync reactos/dll/win32/cryptdll # Autosync reactos/dll/win32/cryptnet # Autosync reactos/dll/win32/cryptui # Autosync reactos/dll/win32/dbghelp # Synced to Wine-20080802 -reactos/dll/win32/dciman32 # Synced to Wine-1_0-rc2 +reactos/dll/win32/dciman32 # Synced to Wine-1_1_43 reactos/dll/win32/dwmapi # Autosync reactos/dll/win32/fusion # Autosync reactos/dll/win32/gdiplus # Autosync @@ -113,7 +113,7 @@ reactos/dll/win32/mstask # Autosync reactos/dll/win32/msvcrt20 # Autosync reactos/dll/win32/msvfw32 # Autosync reactos/dll/win32/msvidc32 # Autosync -reactos/dll/win32/msxml3 # Synced to Wine-1_1_40 +reactos/dll/win32/msxml3 # Synced to Wine-1_1_43 reactos/dll/win32/nddeapi # Autosync reactos/dll/win32/netapi32 # Autosync reactos/dll/win32/ntdsapi # Autosync @@ -144,6 +144,8 @@ reactos/dll/win32/rsabase # Autosync reactos/dll/win32/rsaenh # Autosync reactos/dll/win32/sccbase # Autosync reactos/dll/win32/schannel # Autosync ?? +reactos/dll/win32/secur32 # Forked +reactos/dll/win32/security # Forked (different .spec) reactos/dll/win32/sensapi # Autosync reactos/dll/win32/setupapi # Forked at Wine-20050524 reactos/dll/win32/shell32 # Forked at Wine-20071011 @@ -154,7 +156,7 @@ reactos/dll/win32/slbcsp # Autosync reactos/dll/win32/softpub # Autosync reactos/dll/win32/spoolss # Autosync reactos/dll/win32/stdole2.tlb # Autosync -reactos/dll/win32/sti # Autosync ?? +reactos/dll/win32/sti # Autosync reactos/dll/win32/sxs # Autosync reactos/dll/win32/tapi32 # Autosync reactos/dll/win32/traffic # Autosync @@ -203,7 +205,7 @@ In addition the following libs, dlls and source files are mostly based on code p from Winehq CVS. If you are looking to update something in these files check Wine current souces first as it may already be fixed. -reactos/lib/uuid # Synced to Wine-20080114 +reactos/lib/sdk/uuid # Synced to Wine-1.1.42 advapi32 - reactos/dll/win32/advapi32/crypt/*.c # ekohl says we're not sharing this From f90e9cc90348ef708d8cacdcf34c14c6ddec399d Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 20 Apr 2010 22:47:51 +0000 Subject: [PATCH 167/261] [NTOS]: Read almost all the Memory Management variables into the system configuration vector. These includes pool limits, percentages, debugging flags, behavioral changes, and others. [NTOS]: Minimal stubbed support for some large page functionality in case it gets implemented later and these things would've been ignored. One critical change is that now the MmProcessList is initialized, and the system process is added to it. Other processes should be added later. [NTOS]: Add stubbed support for parsing the registry list of drivers that should have large pages enabled. [NTOS]: Initialize the loaded module list before working set work. [NTOS]: Reload the boot drivers much earlier, as part of ARM3 initialization. [NTOS]: Start doing some minor MmResidentAvailablePages accounting during bootup. [NTOS]: Start doing the math required for computing the appropriate MmSystemCacheWsMinimum on the booting system (based on RAM). [NTOS]: Now that we use the HAL heap, add the code to scan it for I/O mappings. These are dangerous because we need to sync up caching attributes (not yet used in ReactOS, so not a problem for now). [NTOS]: Add more header definitions, and helper definitions such as PDE_MAPPED_VA instead of doing the math by hand. [NTOS]: Move MmPageEntireDriver and MmResetDriverPaging to sysldr.c since drvmgmt.c is more for Driver Verifier-style functionality. svn path=/trunk/; revision=46971 --- reactos/ntoskrnl/config/cmdata.c | 53 ++++----- reactos/ntoskrnl/mm/ARM3/drvmgmt.c | 117 ++------------------ reactos/ntoskrnl/mm/ARM3/largepag.c | 102 ++++++++++++++++++ reactos/ntoskrnl/mm/ARM3/mdlsup.c | 3 + reactos/ntoskrnl/mm/ARM3/miarm.h | 110 ++++++++++++++++++- reactos/ntoskrnl/mm/ARM3/mminit.c | 132 +++++++++++++++++++++-- reactos/ntoskrnl/mm/ARM3/pfnlist.c | 3 + reactos/ntoskrnl/mm/ARM3/pool.c | 2 + reactos/ntoskrnl/mm/freelist.c | 5 +- reactos/ntoskrnl/mm/mminit.c | 9 +- reactos/ntoskrnl/mm/pagefile.c | 2 + reactos/ntoskrnl/mm/section.c | 2 + reactos/ntoskrnl/mm/sysldr.c | 84 +++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 14 files changed, 465 insertions(+), 160 deletions(-) create mode 100644 reactos/ntoskrnl/mm/ARM3/largepag.c diff --git a/reactos/ntoskrnl/config/cmdata.c b/reactos/ntoskrnl/config/cmdata.c index b3df10ce438..6dbf2a0380d 100644 --- a/reactos/ntoskrnl/config/cmdata.c +++ b/reactos/ntoskrnl/config/cmdata.c @@ -11,7 +11,8 @@ #include "ntoskrnl.h" #define NDEBUG #include "debug.h" - +#include "./../mm/ARM3/miarm.h" + /* GLOBALS *******************************************************************/ ULONG DummyData; @@ -252,7 +253,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"DynamicMemory", - &DummyData, + &MmDynamicPfn, NULL, NULL }, @@ -260,7 +261,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"Mirroring", - &DummyData, + &MmMirroring, NULL, NULL }, @@ -273,14 +274,6 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = NULL }, - { - L"Session Manager\\Memory Management", - L"SessionViewSize", - &DummyData, - NULL, - NULL - }, - { L"Session Manager\\Memory Management", L"SessionImageSize", @@ -300,7 +293,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"PoolUsageMaximum", - &DummyData, + &MmConsumedPoolPercentage, NULL, NULL }, @@ -308,7 +301,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"MapAllocationFragment", - &DummyData, + &MmAllocationFragment, NULL, NULL }, @@ -316,7 +309,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"PagedPoolSize", - &DummyData, + &MmSizeOfPagedPoolInBytes, NULL, NULL }, @@ -324,7 +317,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"NonPagedPoolSize", - &DummyData, + &MmSizeOfNonPagedPoolInBytes, NULL, NULL }, @@ -340,7 +333,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"LargeSystemCache", - &DummyData, + &MmLargeSystemCache, NULL, NULL }, @@ -356,7 +349,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"SystemPages", - &DummyData, + &MmNumberOfSystemPtes, NULL, NULL }, @@ -364,7 +357,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"LowMemoryThreshold", - &DummyData, + &MmLowMemoryThreshold, NULL, NULL }, @@ -372,7 +365,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"HighMemoryThreshold", - &DummyData, + &MmHighMemoryThreshold, NULL, NULL }, @@ -396,7 +389,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"SecondLevelDataCache", - &DummyData, + &MmSecondaryColors, NULL, NULL }, @@ -404,7 +397,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"ClearPageFileAtShutdown", - &DummyData, + &MmZeroPageFile, NULL, NULL }, @@ -452,7 +445,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"ProtectNonPagedPool", - &DummyData, + &MmProtectFreedNonPagedPool, NULL, NULL }, @@ -460,7 +453,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"TrackLockedPages", - &DummyData, + &MmTrackLockedPages, NULL, NULL }, @@ -468,7 +461,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"TrackPtes", - &DummyData, + &MmTrackPtes, NULL, NULL }, @@ -476,15 +469,15 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"VerifyDrivers", - &DummyData, - &DummyData, - &DummyData + MmVerifyDriverBuffer, + &MmVerifyDriverBufferLength, + &MmVerifyDriverBufferType }, { L"Session Manager\\Memory Management", L"VerifyDriverLevel", - &DummyData, + &MmVerifyDriverLevel, NULL, NULL }, @@ -508,7 +501,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"EnforceWriteProtection", - &DummyData, + &MmEnforceWriteProtection, NULL, NULL }, @@ -516,7 +509,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"MakeLowMemory", - &DummyData, + &MmMakeLowMemory, NULL, NULL }, diff --git a/reactos/ntoskrnl/mm/ARM3/drvmgmt.c b/reactos/ntoskrnl/mm/ARM3/drvmgmt.c index 4811a441dd4..ad85c479ca5 100644 --- a/reactos/ntoskrnl/mm/ARM3/drvmgmt.c +++ b/reactos/ntoskrnl/mm/ARM3/drvmgmt.c @@ -21,55 +21,12 @@ MM_DRIVER_VERIFIER_DATA MmVerifierData; LIST_ENTRY MiVerifierDriverAddedThunkListHead; ULONG MiActiveVerifierThunks; - -/* PRIVATE FUNCTIONS *********************************************************/ - -PLDR_DATA_TABLE_ENTRY -NTAPI -MiLookupDataTableEntry(IN PVOID Address) -{ - PLDR_DATA_TABLE_ENTRY LdrEntry, FoundEntry = NULL; - PLIST_ENTRY NextEntry; - PAGED_CODE(); - - // - // Loop entries - // - NextEntry = PsLoadedModuleList.Flink; - do - { - // - // Get the loader entry - // - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - // - // Check if the address matches - // - if ((Address >= LdrEntry->DllBase) && - (Address < (PVOID)((ULONG_PTR)LdrEntry->DllBase + - LdrEntry->SizeOfImage))) - { - // - // Found a match - // - FoundEntry = LdrEntry; - break; - } - - // - // Move on - // - NextEntry = NextEntry->Flink; - } while(NextEntry != &PsLoadedModuleList); - - // - // Return the entry - // - return FoundEntry; -} +WCHAR MmVerifyDriverBuffer[512] = {0}; +ULONG MmVerifyDriverBufferLength = sizeof(MmVerifyDriverBuffer); +ULONG MmVerifyDriverBufferType = REG_NONE; +ULONG MmVerifyDriverLevel = -1; +PVOID MmTriageActionTaken; +PVOID KernelVerifier; /* PUBLIC FUNCTIONS ***********************************************************/ @@ -107,68 +64,6 @@ MmLockPageableDataSection(IN PVOID AddressWithinSection) return AddressWithinSection; } -/* - * @unimplemented - */ -PVOID -NTAPI -MmPageEntireDriver(IN PVOID AddressWithinSection) -{ - //PMMPTE StartPte, EndPte; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PAGED_CODE(); - - // - // Get the loader entry - // - LdrEntry = MiLookupDataTableEntry(AddressWithinSection); - if (!LdrEntry) return NULL; - - // - // Check if paging of kernel mode is disabled or if the driver is mapped as - // an image - // - if ((MmDisablePagingExecutive & 0x1) || (LdrEntry->SectionPointer)) - { - // - // Don't do anything, just return the base address - // - return LdrEntry->DllBase; - } - - // - // Wait for active DPCs to finish before we page out the driver - // - KeFlushQueuedDpcs(); - - // - // Get the PTE range for the whole driver image - // - //StartPte = MiGetPteAddress(LdrEntry->DllBase); - //EndPte = MiGetPteAddress(LdrEntry->DllBase + - // LdrEntry->SizeOfImage); - - // - // Enable paging for the PTE range - // - //MiSetPagingOfDriver(StartPte, EndPte); - - // - // Return the base address - // - return LdrEntry->DllBase; -} - -/* - * @unimplemented - */ -VOID -NTAPI -MmResetDriverPaging(IN PVOID AddressWithinSection) -{ - UNIMPLEMENTED; -} - /* * @unimplemented */ diff --git a/reactos/ntoskrnl/mm/ARM3/largepag.c b/reactos/ntoskrnl/mm/ARM3/largepag.c new file mode 100644 index 00000000000..0cd1e502f2e --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/largepag.c @@ -0,0 +1,102 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/largepag.c + * PURPOSE: ARM Memory Manager Large Page Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::LARGEPAGE" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +LIST_ENTRY MmProcessList; +PMMPTE MiLargePageHyperPte; +ULONG MiLargePageRangeIndex; +MI_LARGE_PAGE_RANGES MiLargePageRanges[64]; +WCHAR MmLargePageDriverBuffer[512] = {0}; +ULONG MmLargePageDriverBufferLength = -1; +LIST_ENTRY MiLargePageDriverList; +BOOLEAN MiLargePageAllDrivers; + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +MiInitializeLargePageSupport(VOID) +{ +#if _MI_PAGING_LEVELS > 2 +#error "PAE/x64 Not Implemented" +#else + /* Initialize the large-page hyperspace PTE used for initial mapping */ + MiLargePageHyperPte = MiReserveSystemPtes(1, SystemPteSpace); + ASSERT(MiLargePageHyperPte); + MiLargePageHyperPte->u.Long = 0; + + /* Initialize the process tracking list, and insert the system process */ + InitializeListHead(&MmProcessList); + InsertTailList(&MmProcessList, &PsGetCurrentProcess()->MmProcessLinks); +#endif +} + +VOID +NTAPI +MiSyncCachedRanges(VOID) +{ + ULONG i; + + /* Scan every range */ + for (i = 0; i < MiLargePageRangeIndex; i++) + { + DPRINT1("No support for large pages\n"); + while (TRUE); + } +} + +VOID +NTAPI +MiInitializeDriverLargePageList(VOID) +{ + PWCHAR p, pp; + + /* Initialize the list */ + InitializeListHead(&MiLargePageDriverList); + + /* Bail out if there's nothing */ + if (MmLargePageDriverBufferLength == 0xFFFFFFFF) return; + + /* Loop from start to finish */ + p = MmLargePageDriverBuffer; + pp = MmLargePageDriverBuffer + (MmLargePageDriverBufferLength / sizeof(WCHAR)); + while (p < pp) + { + /* Skip whitespaces */ + if ((*p == L' ') || (*p == L'\n') || (*p == L'\r') || (*p == L'\t')) + { + /* Skip the character */ + p++; + continue; + } + + /* A star means everything */ + if (*p == L'*') + { + /* No need to keep going */ + MiLargePageAllDrivers = TRUE; + break; + } + + DPRINT1("Large page drivers not supported\n"); + ASSERT(FALSE); + } +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index 0100040f1c7..1b95448fc43 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -16,6 +16,9 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h" +BOOLEAN MmTrackPtes; +BOOLEAN MmTrackLockedPages; + /* PUBLIC FUNCTIONS ***********************************************************/ /* diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 1ced65de25d..11d4189a958 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -42,6 +42,9 @@ #define _1KB (1024) #define _1MB (1024 * _1KB) +/* Are mapped by a PDE */ +#define PDE_MAPPED_VA (PTE_COUNT * PAGE_SIZE) + /* Size of a PDE directory, and size of a page table */ #define PDE_SIZE (PDE_COUNT * sizeof(MMPDE)) #define PT_SIZE (PTE_COUNT * sizeof(MMPTE)) @@ -59,6 +62,40 @@ #error Define these please! #endif +#ifdef _M_IX86 +#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_I386 +#elif _M_ARM +#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_ARM +#elif _M_AMD64 +#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_AMD64 +#else +#error Define these please! +#endif + +// +// Protection Bits part of the internal memory manager Protection Mask +// Taken from http://www.reactos.org/wiki/Techwiki:Memory_management_in_the_Windows_XP_kernel +// and public assertions. +// +#define MM_ZERO_ACCESS 0 +#define MM_READONLY 1 +#define MM_EXECUTE 2 +#define MM_EXECUTE_READ 3 +#define MM_READWRITE 4 +#define MM_WRITECOPY 5 +#define MM_EXECUTE_READWRITE 6 +#define MM_EXECUTE_WRITECOPY 7 +#define MM_NOCACHE 8 +#define MM_DECOMMIT 0x10 +#define MM_NOACCESS (MM_DECOMMIT | MM_NOCACHE) + +// +// Special values for LoadedImports +// +#define MM_SYSLDR_NO_IMPORTS (PVOID)0xFFFFFFFE +#define MM_SYSLDR_BOOT_LOADED (PVOID)0xFFFFFFFF +#define MM_SYSLDR_SINGLE_ENTRY 0x1 + // // PFN List Sentinel // @@ -168,10 +205,34 @@ typedef struct _MMCOLOR_TABLES PFN_NUMBER Count; } MMCOLOR_TABLES, *PMMCOLOR_TABLES; +typedef struct _MI_LARGE_PAGE_RANGES +{ + PFN_NUMBER StartFrame; + PFN_NUMBER LastFrame; +} MI_LARGE_PAGE_RANGES, *PMI_LARGE_PAGE_RANGES; + extern MMPTE HyperTemplatePte; extern MMPTE ValidKernelPde; extern MMPTE ValidKernelPte; - +extern BOOLEAN MmLargeSystemCache; +extern BOOLEAN MmZeroPageFile; +extern BOOLEAN MmProtectFreedNonPagedPool; +extern BOOLEAN MmTrackLockedPages; +extern BOOLEAN MmTrackPtes; +extern BOOLEAN MmDynamicPfn; +extern BOOLEAN MmMirroring; +extern BOOLEAN MmMakeLowMemory; +extern BOOLEAN MmEnforceWriteProtection; +extern ULONG MmAllocationFragment; +extern ULONG MmConsumedPoolPercentage; +extern ULONG MmVerifyDriverBufferType; +extern ULONG MmVerifyDriverLevel; +extern WCHAR MmVerifyDriverBuffer[512]; +extern WCHAR MmLargePageDriverBuffer[512]; +extern LIST_ENTRY MiLargePageDriverList; +extern BOOLEAN MiLargePageAllDrivers; +extern ULONG MmVerifyDriverBufferLength; +extern ULONG MmLargePageDriverBufferLength; extern ULONG MmSizeOfNonPagedPoolInBytes; extern ULONG MmMaximumNonPagedPoolInBytes; extern PFN_NUMBER MmMaximumNonPagedPoolInPages; @@ -243,11 +304,32 @@ extern PFN_NUMBER MmMinimumFreePages; extern PFN_NUMBER MmPlentyFreePages; extern PFN_NUMBER MiExpansionPoolPagesInitialCharge; extern PFN_NUMBER MmResidentAvailablePages; -extern PFN_NUMBER MmResidentAvailablePagesAtInit; +extern PFN_NUMBER MmResidentAvailableAtInit; +extern ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes]; +extern PFN_NUMBER MmTotalSystemDriverPages; +extern PVOID MiSessionImageStart; +extern PVOID MiSessionImageEnd; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) +#define MI_IS_SESSION_IMAGE_ADDRESS(Address) \ + (((Address) >= MiSessionImageStart) && ((Address) < MiSessionImageEnd)) + +#define MI_IS_SESSION_ADDRESS(Address) \ + (((Address) >= MmSessionBase) && ((Address) < MiSessionSpaceEnd)) + +FORCEINLINE +BOOLEAN +MI_IS_PHYSICAL_ADDRESS(IN PVOID Address) +{ + PMMPDE PointerPde; + + /* Large pages are never paged out, always physically resident */ + PointerPde = MiAddressToPde(Address); + return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid)); +} + NTSTATUS NTAPI MmArmInitSystem( @@ -457,4 +539,28 @@ MiInsertPageInFreeList( IN PFN_NUMBER PageFrameIndex ); +PLDR_DATA_TABLE_ENTRY +NTAPI +MiLookupDataTableEntry( + IN PVOID Address +); + +VOID +NTAPI +MiInitializeDriverLargePageList( + VOID +); + +VOID +NTAPI +MiInitializeLargePageSupport( + VOID +); + +VOID +NTAPI +MiSyncCachedRanges( + VOID +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 89d082e4f95..d21adc08758 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -301,6 +301,20 @@ PFN_NUMBER MmPlentyFreePages = 400; ULONG MmProductType; MM_SYSTEMSIZE MmSystemSize; +/* + * These values store the cache working set minimums and maximums, in pages + * + * The minimum value is boosted on systems with more than 24MB of RAM, and cut + * down to only 32 pages on embedded (<24MB RAM) systems. + * + * An extra boost of 2MB is given on systems with more than 33MB of RAM. + */ +PFN_NUMBER MmSystemCacheWsMinimum = 288; +PFN_NUMBER MmSystemCacheWsMaximum = 350; + +/* FIXME: Move to cache/working set code later */ +BOOLEAN MmLargeSystemCache; + /* PRIVATE FUNCTIONS **********************************************************/ // @@ -742,7 +756,7 @@ MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) else { /* Next PDE mapped address */ - BaseAddress += PTE_COUNT * PAGE_SIZE; + BaseAddress += PDE_MAPPED_VA; } /* Next PTE */ @@ -1159,6 +1173,61 @@ MiInitializeMemoryEvents(VOID) return TRUE; } +VOID +NTAPI +MiAddHalIoMappings(VOID) +{ + PVOID BaseAddress; + PMMPTE PointerPde; + PMMPTE PointerPte; + ULONG i, j, PdeCount; + PFN_NUMBER PageFrameIndex; + + /* HAL Heap address -- should be on a PDE boundary */ + BaseAddress = (PVOID)0xFFC00000; + ASSERT(MiAddressToPteOffset(BaseAddress) == 0); + + /* Check how many PDEs the heap has */ + PointerPde = MiAddressToPde(BaseAddress); + PdeCount = PDE_COUNT - ADDR_TO_PDE_OFFSET(BaseAddress); + for (i = 0; i < PdeCount; i++) + { + /* Does the HAL own this mapping? */ + if ((PointerPde->u.Hard.Valid == 1) && + (PointerPde->u.Hard.LargePage == 0)) + { + /* Get the PTE for it and scan each page */ + PointerPte = MiAddressToPte(BaseAddress); + for (j = 0 ; j < PTE_COUNT; j++) + { + /* Does the HAL own this page? */ + if (PointerPte->u.Hard.Valid == 1) + { + /* Is the HAL using it for device or I/O mapped memory? */ + PageFrameIndex = PFN_FROM_PTE(PointerPte); + if (!MiGetPfnEntry(PageFrameIndex)) + { + /* FIXME: For PAT, we need to track I/O cache attributes for coherency */ + DPRINT1("HAL I/O Mapping at %p is unsafe\n", BaseAddress); + } + } + + /* Move to the next page */ + BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PAGE_SIZE); + PointerPte++; + } + } + else + { + /* Move to the next address */ + BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PDE_MAPPED_VA); + } + + /* Move to the next PDE */ + PointerPde++; + } +} + VOID NTAPI MmDumpArmPfnDatabase(VOID) @@ -1813,11 +1882,26 @@ MmArmInitSystem(IN ULONG Phase, } } - // - // Size up paged pool and build the shadow system page directory - // - MiBuildPagedPool(); - + /* Look for large page cache entries that need caching */ + MiSyncCachedRanges(); + + /* Loop for HAL Heap I/O device mappings that need coherency tracking */ + MiAddHalIoMappings(); + + /* Set the initial resident page count */ + MmResidentAvailablePages = MmAvailablePages - 32; + + /* Initialize large page structures on PAE/x64, and MmProcessList on x86 */ + MiInitializeLargePageSupport(); + + /* Check if the registry says any drivers should be loaded with large pages */ + MiInitializeDriverLargePageList(); + + /* Relocate the boot drivers into system PTE space and fixup their PFNs */ + MiReloadBootLoadedDrivers(LoaderBlock); + + /* FIXME: Call out into Driver Verifier for initialization */ + /* Check how many pages the system has */ if (MmNumberOfPhysicalPages <= (13 * _1MB)) { @@ -1826,13 +1910,22 @@ MmArmInitSystem(IN ULONG Phase, } else if (MmNumberOfPhysicalPages <= (19 * _1MB)) { - /* Set small system */ + /* Set small system and add 100 pages for the cache */ MmSystemSize = MmSmallSystem; + MmSystemCacheWsMinimum += 100; } else { - /* Set medium system */ + /* Set medium system and add 400 pages for the cache */ MmSystemSize = MmMediumSystem; + MmSystemCacheWsMinimum += 400; + } + + /* Check for less than 24MB */ + if (MmNumberOfPhysicalPages < ((24 * _1MB) / PAGE_SIZE)) + { + /* No more than 32 pages */ + MmSystemCacheWsMinimum = 32; } /* Check for more than 32MB */ @@ -1854,7 +1947,14 @@ MmArmInitSystem(IN ULONG Phase, } } } - + + /* Check for more than 33 MB */ + if (MmNumberOfPhysicalPages > ((33 * _1MB) / PAGE_SIZE)) + { + /* Add another 500 pages to the cache */ + MmSystemCacheWsMinimum += 500; + } + /* Now setup the shared user data fields */ ASSERT(SharedUserData->NumberOfPhysicalPages == 0); SharedUserData->NumberOfPhysicalPages = MmNumberOfPhysicalPages; @@ -1888,6 +1988,20 @@ MmArmInitSystem(IN ULONG Phase, /* Update working set tuning parameters */ MiAdjustWorkingSetManagerParameters(!MmProductType); + + /* Finetune the page count by removing working set and NP expansion */ + MmResidentAvailablePages -= MiExpansionPoolPagesInitialCharge; + MmResidentAvailablePages -= MmSystemCacheWsMinimum; + MmResidentAvailableAtInit = MmResidentAvailablePages; + if (MmResidentAvailablePages <= 0) + { + /* This should not happen */ + DPRINT1("System cache working set too big\n"); + return FALSE; + } + + /* Size up paged pool and build the shadow system page directory */ + MiBuildPagedPool(); } // diff --git a/reactos/ntoskrnl/mm/ARM3/pfnlist.c b/reactos/ntoskrnl/mm/ARM3/pfnlist.c index 58043400af6..f42abdc82c9 100644 --- a/reactos/ntoskrnl/mm/ARM3/pfnlist.c +++ b/reactos/ntoskrnl/mm/ARM3/pfnlist.c @@ -18,6 +18,9 @@ /* GLOBALS ********************************************************************/ +BOOLEAN MmDynamicPfn; +BOOLEAN MmMirroring; + MMPFNLIST MmZeroedPageListHead = {0, ZeroedPageList, LIST_HEAD, LIST_HEAD}; MMPFNLIST MmFreePageListHead = {0, FreePageList, LIST_HEAD, LIST_HEAD}; MMPFNLIST MmStandbyPageListHead = {0, StandbyPageList, LIST_HEAD, LIST_HEAD}; diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c index bd2f826c6d2..10a585e8912 100644 --- a/reactos/ntoskrnl/mm/ARM3/pool.c +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -26,6 +26,8 @@ KGUARDED_MUTEX MmPagedPoolMutex; MM_PAGED_POOL_INFO MmPagedPoolInfo; SIZE_T MmAllocatedNonPagedPool; ULONG MmSpecialPoolTag; +ULONG MmConsumedPoolPercentage; +BOOLEAN MmProtectFreedNonPagedPool; /* PRIVATE FUNCTIONS **********************************************************/ diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 7f2646f7452..6f5df91a1cc 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -36,8 +36,9 @@ /* The first array contains ReactOS PFNs, the second contains ARM3 PFNs */ PPHYSICAL_PAGE MmPfnDatabase[2]; -ULONG MmAvailablePages; -ULONG MmResidentAvailablePages; +PFN_NUMBER MmAvailablePages; +PFN_NUMBER MmResidentAvailablePages; +PFN_NUMBER MmResidentAvailableAtInit; SIZE_T MmTotalCommitLimit; SIZE_T MmTotalCommittedPages; diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 8a9fd4297c3..a03ce8ed3de 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -398,15 +398,12 @@ MmInitSystem(IN ULONG Phase, /* Initialize paged pool */ MmInitializePagedPool(); + /* Initialize the loaded module list */ + MiInitializeLoadedModuleList(LoaderBlock); + /* Initialize working sets */ MiInitializeUserPfnBitmap(); MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); - - /* Reload boot drivers */ - MiReloadBootLoadedDrivers(LoaderBlock); - - /* Initialize the loaded module list */ - MiInitializeLoadedModuleList(LoaderBlock); } else if (Phase == 1) { diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index 1af2faccaa5..1ea2c41c29f 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.c @@ -86,6 +86,8 @@ ULONG MiFreeSwapPages; /* Number of pages that have been allocated for swapping */ ULONG MiUsedSwapPages; +BOOLEAN MmZeroPageFile; + /* * Number of pages that have been reserved for swapping but not yet allocated */ diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 582af62037d..fc708953a00 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -71,6 +71,8 @@ MM_SECTION_PAGEOUT_CONTEXT; POBJECT_TYPE MmSectionObjectType = NULL; +BOOLEAN MmAllocationFragment; + ULONG_PTR MmSubsectionBase; static GENERIC_MAPPING MmpSectionMapping = { diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 281a3966bb2..36b3ce5a8fc 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -44,6 +44,9 @@ PVOID MmLastUnloadedDrivers; PVOID MmTriageActionTaken; PVOID KernelVerifier; +BOOLEAN MmMakeLowMemory; +BOOLEAN MmEnforceWriteProtection = TRUE; + /* FUNCTIONS ******************************************************************/ PVOID @@ -2040,6 +2043,87 @@ Quickie: return Status; } +PLDR_DATA_TABLE_ENTRY +NTAPI +MiLookupDataTableEntry(IN PVOID Address) +{ + PLDR_DATA_TABLE_ENTRY LdrEntry, FoundEntry = NULL; + PLIST_ENTRY NextEntry; + PAGED_CODE(); + + /* Loop entries */ + NextEntry = PsLoadedModuleList.Flink; + do + { + /* Get the loader entry */ + LdrEntry = CONTAINING_RECORD(NextEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + /* Check if the address matches */ + if ((Address >= LdrEntry->DllBase) && + (Address < (PVOID)((ULONG_PTR)LdrEntry->DllBase + + LdrEntry->SizeOfImage))) + { + /* Found a match */ + FoundEntry = LdrEntry; + break; + } + + /* Move on */ + NextEntry = NextEntry->Flink; + } while(NextEntry != &PsLoadedModuleList); + + /* Return the entry */ + return FoundEntry; +} + +/* + * @implemented + */ +PVOID +NTAPI +MmPageEntireDriver(IN PVOID AddressWithinSection) +{ + PMMPTE StartPte, EndPte; + PLDR_DATA_TABLE_ENTRY LdrEntry; + PAGED_CODE(); + + /* Get the loader entry */ + LdrEntry = MiLookupDataTableEntry(AddressWithinSection); + if (!LdrEntry) return NULL; + + /* Check if paging of kernel mode is disabled or if the driver is mapped as an image */ + if ((MmDisablePagingExecutive) || (LdrEntry->SectionPointer)) + { + /* Don't do anything, just return the base address */ + return LdrEntry->DllBase; + } + + /* Wait for active DPCs to finish before we page out the driver */ + KeFlushQueuedDpcs(); + + /* Get the PTE range for the whole driver image */ + StartPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase); + EndPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage); +#if 0 + /* Enable paging for the PTE range */ + ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(AddressWithinSection) == FALSE); + MiSetPagingOfDriver(StartPte, EndPte); +#endif + /* Return the base address */ + return LdrEntry->DllBase; +} + +/* + * @unimplemented + */ +VOID +NTAPI +MmResetDriverPaging(IN PVOID AddressWithinSection) +{ + UNIMPLEMENTED; +} /* * @implemented */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index a349f887312..da129c385a4 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -394,6 +394,7 @@ expool.c hypermap.c iosup.c + largepag.c mdlsup.c mminit.c mmsup.c From 90b9c29f62498af6e8c63e5b9cd91818e82a9cb0 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Apr 2010 01:12:04 +0000 Subject: [PATCH 168/261] Recommit rest of ntifs.h and wdm.h from header merge revert svn path=/trunk/; revision=46972 --- reactos/include/ddk/ntddk.h | 153 + reactos/include/ddk/ntifs.h | 139 - reactos/include/ddk/wdm.h | 5348 ++++++++++++++++++++++++++++------- 3 files changed, 4516 insertions(+), 1124 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 6d8bacd4ce8..55569692a96 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -2957,6 +2957,159 @@ ZwSetTimer( #endif +typedef struct _QUOTA_LIMITS { + SIZE_T PagedPoolLimit; + SIZE_T NonPagedPoolLimit; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + SIZE_T PagefileLimit; + LARGE_INTEGER TimeLimit; +} QUOTA_LIMITS, *PQUOTA_LIMITS; + +struct _RTL_GENERIC_COMPARE_ROUTINE; +struct _RTL_GENERIC_ALLOCATE_ROUTINE; +struct _RTL_GENERIC_FREE_ROUTINE; + +typedef struct _RTL_GENERIC_TABLE { + PRTL_SPLAY_LINKS TableRoot; + LIST_ENTRY InsertOrderList; + PLIST_ENTRY OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + struct _RTL_GENERIC_COMPARE_ROUTINE *CompareRoutine; + struct _RTL_GENERIC_ALLOCATE_ROUTINE *AllocateRoutine; + struct _RTL_GENERIC_FREE_ROUTINE *FreeRoutine; + PVOID TableContext; +} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; + +typedef enum _TABLE_SEARCH_RESULT { + TableEmptyTree, + TableFoundNode, + TableInsertAsLeft, + TableInsertAsRight +} TABLE_SEARCH_RESULT; + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +#define IO_CHECK_CREATE_PARAMETERS 0x0200 +#define IO_ATTACH_DEVICE 0x0400 +#define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800 + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_OBJECTID_INFORMATION { + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +typedef enum _RTL_GENERIC_COMPARE_RESULTS { + GenericLessThan, + GenericGreaterThan, + GenericEqual +} RTL_GENERIC_COMPARE_RESULTS; + +// Forwarder +struct _RTL_AVL_TABLE; + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID FirstStruct, + IN PVOID SecondStruct); + +typedef PVOID +(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN CLONG ByteSize); + +typedef VOID +(NTAPI *PRTL_AVL_FREE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID Buffer); + +typedef NTSTATUS +(NTAPI *PRTL_AVL_MATCH_FUNCTION) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID UserData, + IN PVOID MatchData); + +typedef struct _RTL_BALANCED_LINKS { + struct _RTL_BALANCED_LINKS *Parent; + struct _RTL_BALANCED_LINKS *LeftChild; + struct _RTL_BALANCED_LINKS *RightChild; + CHAR Balance; + UCHAR Reserved[3]; +} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; + +typedef struct _RTL_AVL_TABLE { + RTL_BALANCED_LINKS BalancedRoot; + PVOID OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + ULONG DepthOfTree; + PRTL_BALANCED_LINKS RestartKey; + ULONG DeleteCount; + PRTL_AVL_COMPARE_ROUTINE CompareRoutine; + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_AVL_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_AVL_TABLE, *PRTL_AVL_TABLE; + +#ifndef RTL_USE_AVL_TABLES + +struct _RTL_GENERIC_TABLE; + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN PVOID FirstStruct, + IN PVOID SecondStruct); + +typedef PVOID +(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN CLONG ByteSize); + +typedef VOID +(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN PVOID Buffer); + +#endif /* !RTL_USE_AVL_TABLES */ + +NTSYSAPI +VOID +NTAPI +RtlInitializeGenericTableAvl( + OUT PRTL_AVL_TABLE Table, + IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + IN PRTL_AVL_FREE_ROUTINE FreeRoutine, + IN PVOID TableContext OPTIONAL); #ifdef __cplusplus } diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 8af993ffd15..15bace86764 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -6750,145 +6750,6 @@ FsRtlDeleteTunnelCache( IN PTUNNEL Cache); NTKERNELAPI -#define IO_ATTACH_DEVICE 0x0400 -struct _RTL_AVL_TABLE; -struct _RTL_GENERIC_TABLE; - -typedef struct _FILE_FS_FULL_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER CallerAvailableAllocationUnits; - LARGE_INTEGER ActualAvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; - -typedef struct _FILE_FS_LABEL_INFORMATION { - ULONG VolumeLabelLength; - WCHAR VolumeLabel[1]; -} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; - -typedef struct _FILE_FS_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER AvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; - -typedef struct _FILE_FS_VOLUME_INFORMATION { - LARGE_INTEGER VolumeCreationTime; - ULONG VolumeSerialNumber; - ULONG VolumeLabelLength; - BOOLEAN SupportsObjects; - WCHAR VolumeLabel[1]; -} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; - -typedef struct _FILE_FS_OBJECTID_INFORMATION -{ - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; - -typedef enum _RTL_GENERIC_COMPARE_RESULTS -{ - GenericLessThan, - GenericGreaterThan, - GenericEqual -} RTL_GENERIC_COMPARE_RESULTS; - -typedef enum _TABLE_SEARCH_RESULT -{ - TableEmptyTree, - TableFoundNode, - TableInsertAsLeft, - TableInsertAsRight -} TABLE_SEARCH_RESULT; - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef PVOID -(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID Buffer -); - -typedef PVOID -(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_AVL_FREE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID Buffer -); - -typedef struct _RTL_BALANCED_LINKS -{ - struct _RTL_BALANCED_LINKS *Parent; - struct _RTL_BALANCED_LINKS *LeftChild; - struct _RTL_BALANCED_LINKS *RightChild; - CHAR Balance; - UCHAR Reserved[3]; -} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; - -typedef struct _RTL_GENERIC_TABLE -{ - PRTL_SPLAY_LINKS TableRoot; - LIST_ENTRY InsertOrderList; - PLIST_ENTRY OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; - PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_GENERIC_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; - -typedef struct _RTL_AVL_TABLE -{ - RTL_BALANCED_LINKS BalancedRoot; - PVOID OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - ULONG DepthOfTree; - PRTL_BALANCED_LINKS RestartKey; - ULONG DeleteCount; - PRTL_AVL_COMPARE_ROUTINE CompareRoutine; - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_AVL_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_AVL_TABLE, *PRTL_AVL_TABLE; - -NTSYSAPI -VOID -NTAPI -RtlInitializeGenericTableAvl( - PRTL_AVL_TABLE Table, - PRTL_AVL_COMPARE_ROUTINE CompareRoutine, - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, - PRTL_AVL_FREE_ROUTINE FreeRoutine, - PVOID TableContext -); - VOID NTAPI FsRtlDissectDbcs( diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 285d2165008..3a523235742 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -38,15 +38,26 @@ #include #include #include +#include #ifndef GUID_DEFINED #include #endif +#ifdef _MAC +#ifndef _INC_STRING +#include +#endif /* _INC_STRING */ +#else +#include +#endif /* _MAC */ + #ifndef _KTMTYPES_ typedef GUID UOW, *PUOW; #endif +typedef GUID *PGUID; + #if (NTDDI_VERSION >= NTDDI_WINXP) #include #endif @@ -133,8 +144,6 @@ struct _IO_RESOURCE_DESCRIPTOR; typedef struct _OBJECT_TYPE *POBJECT_TYPE; typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; -typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; -typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; typedef struct _EPROCESS *PEPROCESS; typedef struct _ETHREAD *PETHREAD; @@ -144,6 +153,42 @@ typedef struct _KPROCESS *PKPROCESS; typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; typedef struct _CONTEXT *PCONTEXT; +#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && ( defined(_NTDDK_) || defined(_NTDRIVER_) || defined(_NTOSP_)) +typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; +#elif defined(_WDM_INCLUDED_) +typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; +#else +typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; +#endif + +#ifndef DEFINE_GUIDEX +#ifdef _MSC_VER +#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name +#else +#define DEFINE_GUIDEX(name) EXTERN_C const GUID name +#endif +#endif /* DEFINE_GUIDEX */ + +#ifndef STATICGUIDOF +#define STATICGUIDOF(guid) STATIC_##guid +#endif + +/* GUID Comparison */ +#ifndef __IID_ALIGNED__ +#define __IID_ALIGNED__ +#ifdef __cplusplus +inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) +{ + return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && + (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); +} +#else +#define IsEqualGUIDAligned(guid1, guid2) \ + ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ + (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) +#endif /* __cplusplus */ +#endif /* !__IID_ALIGNED__ */ + /****************************************************************************** * INTERLOCKED Functions * @@ -482,17 +527,29 @@ typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32; #endif /* _SLIST_HEADER_ */ - -/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */ -#if defined(_NTSYSTEM_) || defined(__GNUC__) +/* MS definition is broken! */ +extern BOOLEAN NTSYSAPI NlsMbCodePageTag; +extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag; #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag -#else -#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag) -#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag) -#endif /* _NT_SYSTEM */ -extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG; -extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG; + +#define SHORT_LEAST_SIGNIFICANT_BIT 0 +#define SHORT_MOST_SIGNIFICANT_BIT 1 + +#define LONG_LEAST_SIGNIFICANT_BIT 0 +#define LONG_3RD_MOST_SIGNIFICANT_BIT 1 +#define LONG_2ND_MOST_SIGNIFICANT_BIT 2 +#define LONG_MOST_SIGNIFICANT_BIT 3 + +#define RTLVERLIB_DDI(x) Wdmlib##x + +typedef BOOLEAN +(*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)( + IN ULONG Version); + +typedef BOOLEAN +(*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)( + IN ULONG Version); /****************************************************************************** @@ -503,14 +560,21 @@ typedef UCHAR KIRQL, *PKIRQL; typedef CCHAR KPROCESSOR_MODE; typedef LONG KPRIORITY; -typedef ULONG EXECUTION_STATE; - typedef enum _MODE { KernelMode, UserMode, MaximumMode } MODE; +#define CACHE_FULLY_ASSOCIATIVE 0xFF +#define MAXIMUM_SUSPEND_COUNT MAXCHAR + +#define EVENT_QUERY_STATE (0x0001) +#define EVENT_MODIFY_STATE (0x0002) +#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define LTP_PC_SMT 0x1 + #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS) #define SINGLE_GROUP_LEGACY_API 1 #endif @@ -543,6 +607,69 @@ typedef struct _CACHE_DESCRIPTOR { PROCESSOR_CACHE_TYPE Type; } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { + ULONG_PTR ProcessorMask; + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + union { + struct { + UCHAR Flags; + } ProcessorCore; + struct { + ULONG NodeNumber; + } NumaNode; + CACHE_DESCRIPTOR Cache; + ULONGLONG Reserved[2]; + } DUMMYUNIONNAME; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; + +typedef struct _PROCESSOR_RELATIONSHIP { + UCHAR Flags; + UCHAR Reserved[21]; + USHORT GroupCount; + GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; +} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; + +typedef struct _NUMA_NODE_RELATIONSHIP { + ULONG NodeNumber; + UCHAR Reserved[20]; + GROUP_AFFINITY GroupMask; +} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; + +typedef struct _CACHE_RELATIONSHIP { + UCHAR Level; + UCHAR Associativity; + USHORT LineSize; + ULONG CacheSize; + PROCESSOR_CACHE_TYPE Type; + UCHAR Reserved[20]; + GROUP_AFFINITY GroupMask; +} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; + +typedef struct _PROCESSOR_GROUP_INFO { + UCHAR MaximumProcessorCount; + UCHAR ActiveProcessorCount; + UCHAR Reserved[38]; + KAFFINITY ActiveProcessorMask; +} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; + +typedef struct _GROUP_RELATIONSHIP { + USHORT MaximumGroupCount; + USHORT ActiveGroupCount; + UCHAR Reserved[20]; + PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY]; +} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; + +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + ULONG Size; + union { + PROCESSOR_RELATIONSHIP Processor; + NUMA_NODE_RELATIONSHIP NumaNode; + CACHE_RELATIONSHIP Cache; + GROUP_RELATIONSHIP Group; + } DUMMYUNIONNAME; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;; + /* Processor features */ #define PF_FLOATING_POINT_PRECISION_ERRATA 0 #define PF_FLOATING_POINT_EMULATED 1 @@ -563,7 +690,6 @@ typedef struct _CACHE_DESCRIPTOR { #define PF_CHANNELS_ENABLED 16 #define PF_XSAVE_ENABLED 17 -#define MAXIMUM_SUPPORTED_EXTENSION 512 #define MAXIMUM_WAIT_OBJECTS 64 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject) @@ -631,6 +757,23 @@ typedef struct _CACHE_DESCRIPTOR { #define EXCEPTION_NONCONTINUABLE 1 #define EXCEPTION_MAXIMUM_PARAMETERS 15 +#define EXCEPTION_DIVIDED_BY_ZERO 0 +#define EXCEPTION_DEBUG 1 +#define EXCEPTION_NMI 2 +#define EXCEPTION_INT3 3 +#define EXCEPTION_BOUND_CHECK 5 +#define EXCEPTION_INVALID_OPCODE 6 +#define EXCEPTION_NPX_NOT_AVAILABLE 7 +#define EXCEPTION_DOUBLE_FAULT 8 +#define EXCEPTION_NPX_OVERRUN 9 +#define EXCEPTION_INVALID_TSS 0x0A +#define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B +#define EXCEPTION_STACK_FAULT 0x0C +#define EXCEPTION_GP_FAULT 0x0D +#define EXCEPTION_RESERVED_TRAP 0x0F +#define EXCEPTION_NPX_ERROR 0x010 +#define EXCEPTION_ALIGNMENT_CHECK 0x011 + typedef struct _EXCEPTION_RECORD { NTSTATUS ExceptionCode; ULONG ExceptionFlags; @@ -682,6 +825,42 @@ typedef VOID IN ULONG ReasonSpecificDataLength); typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE; +typedef struct _KBUGCHECK_ADD_PAGES { + IN OUT PVOID Context; + IN OUT ULONG Flags; + IN ULONG BugCheckCode; + OUT ULONG_PTR Address; + OUT ULONG_PTR Count; +} KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES; + +typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA { + IN PVOID InBuffer; + IN ULONG InBufferLength; + IN ULONG MaximumAllowed; + OUT GUID Guid; + OUT PVOID OutBuffer; + OUT ULONG OutBufferLength; +} KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA; + +typedef enum _KBUGCHECK_DUMP_IO_TYPE { + KbDumpIoInvalid, + KbDumpIoHeader, + KbDumpIoBody, + KbDumpIoSecondaryData, + KbDumpIoComplete +} KBUGCHECK_DUMP_IO_TYPE; + +typedef struct _KBUGCHECK_DUMP_IO { + IN ULONG64 Offset; + IN PVOID Buffer; + IN ULONG BufferLength; + IN KBUGCHECK_DUMP_IO_TYPE Type; +} KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO; + +#define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL +#define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL +#define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL + typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD { LIST_ENTRY Entry; PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine; @@ -721,20 +900,31 @@ typedef BOOLEAN IN BOOLEAN Handled); typedef NMI_CALLBACK *PNMI_CALLBACK; -typedef enum _TRACE_INFORMATION_CLASS { - TraceIdClass, - TraceHandleClass, - TraceEnableFlagsClass, - TraceEnableLevelClass, - GlobalLoggerHandleClass, - EventLoggerHandleClass, - AllLoggerHandlesClass, - TraceHandleByNameClass, - LoggerEventsLostClass, - TraceSessionSettingsClass, - LoggerEventsLoggedClass, - MaxTraceInformationClass -} TRACE_INFORMATION_CLASS; +typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE { + KeProcessorAddStartNotify = 0, + KeProcessorAddCompleteNotify, + KeProcessorAddFailureNotify +} KE_PROCESSOR_CHANGE_NOTIFY_STATE; + +typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT { + KE_PROCESSOR_CHANGE_NOTIFY_STATE State; + ULONG NtNumber; + NTSTATUS Status; +#if (NTDDI_VERSION >= NTDDI_WIN7) + PROCESSOR_NUMBER ProcNumber; +#endif +} KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT; + +typedef VOID +(NTAPI PROCESSOR_CALLBACK_FUNCTION)( + IN PVOID CallbackContext, + IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, + IN OUT PNTSTATUS OperationStatus); +typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION; + +#define KE_PROCESSOR_CHANGE_ADD_EXISTING 1 + +#define INVALID_PROCESSOR_INDEX 0xffffffff typedef enum _KINTERRUPT_POLARITY { InterruptPolarityUnknown, @@ -831,36 +1021,32 @@ typedef enum _KINTERRUPT_MODE { #define THREAD_WAIT_OBJECTS 3 +typedef VOID +(NTAPI KSTART_ROUTINE)( + IN PVOID StartContext); +typedef KSTART_ROUTINE *PKSTART_ROUTINE; + typedef VOID (NTAPI *PKINTERRUPT_ROUTINE)( VOID); +typedef BOOLEAN +(NTAPI KSERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext); +typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; + +typedef BOOLEAN +(NTAPI KMESSAGE_SERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext, + IN ULONG MessageID); +typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE; + typedef enum _KD_OPTION { KD_OPTION_SET_BLOCK_ENABLE, } KD_OPTION; -typedef enum _INTERFACE_TYPE { - InterfaceTypeUndefined = -1, - Internal, - Isa, - Eisa, - MicroChannel, - TurboChannel, - PCIBus, - VMEBus, - NuBus, - PCMCIABus, - CBus, - MPIBus, - MPSABus, - ProcessorInternal, - InternalPowerBus, - PNPISABus, - PNPBus, - Vmcs, - MaximumInterfaceType -} INTERFACE_TYPE, *PINTERFACE_TYPE; - typedef VOID (NTAPI *PKNORMAL_ROUTINE)( IN PVOID NormalContext OPTIONAL, @@ -898,6 +1084,14 @@ typedef struct _KAPC { BOOLEAN Inserted; } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; +#define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0) +#define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1) +#define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0) +#define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1) +#define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2) +#define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex) +#define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN)) + typedef struct _KDEVICE_QUEUE_ENTRY { LIST_ENTRY DeviceListEntry; ULONG SortKey; @@ -914,10 +1108,27 @@ typedef VOID IN PVOID Parameter2 OPTIONAL, IN PVOID Parameter3 OPTIONAL); -typedef -ULONG_PTR -(NTAPI *PKIPI_BROADCAST_WORKER)( +typedef struct _KIPI_COUNTS { + ULONG Freeze; + ULONG Packet; + ULONG DPC; + ULONG APC; + ULONG FlushSingleTb; + ULONG FlushMultipleTb; + ULONG FlushEntireTb; + ULONG GenericCall; + ULONG ChangeColor; + ULONG SweepDcache; + ULONG SweepIcache; + ULONG SweepIcacheRange; + ULONG FlushIoBuffers; + ULONG GratuitousDPC; +} KIPI_COUNTS, *PKIPI_COUNTS; + +typedef ULONG_PTR +(NTAPI KIPI_BROADCAST_WORKER)( IN ULONG_PTR Argument); +typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; @@ -1116,6 +1327,8 @@ typedef struct _KSEMAPHORE { LONG Limit; } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; +#define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG)) + typedef struct _KGATE { DISPATCHER_HEADER Header; } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE; @@ -1156,6 +1369,14 @@ typedef struct _KTIMER { ULONG Period; } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; +typedef enum _LOCK_OPERATION { + IoReadAccess, + IoWriteAccess, + IoModifyAccess +} LOCK_OPERATION; + +#define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)) + typedef BOOLEAN (NTAPI *PKSYNCHRONIZE_ROUTINE)( IN PVOID SynchronizeContext); @@ -1184,19 +1405,32 @@ typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE { EndAlternatives } ALTERNATIVE_ARCHITECTURE_TYPE; -typedef struct _KSYSTEM_TIME -{ +#ifndef _X86_ + +#ifndef IsNEC_98 +#define IsNEC_98 (FALSE) +#endif + +#ifndef IsNotNEC_98 +#define IsNotNEC_98 (TRUE) +#endif + +#ifndef SetNEC_98 +#define SetNEC_98 +#endif + +#ifndef SetNotNEC_98 +#define SetNotNEC_98 +#endif + +#endif + +typedef struct _KSYSTEM_TIME { ULONG LowPart; LONG High1Time; LONG High2Time; } KSYSTEM_TIME, *PKSYSTEM_TIME; -typedef struct _PNP_BUS_INFORMATION { - GUID BusTypeGuid; - INTERFACE_TYPE LegacyBusType; - ULONG BusNumber; -} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; - typedef struct DECLSPEC_ALIGN(16) _M128A { ULONGLONG Low; LONGLONG High; @@ -1228,12 +1462,104 @@ typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { #endif } XSAVE_FORMAT, *PXSAVE_FORMAT; +typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER { + ULONG64 Mask; + ULONG64 Reserved[7]; +} XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER; + +typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA { + XSAVE_FORMAT LegacyState; + XSAVE_AREA_HEADER Header; +} XSAVE_AREA, *PXSAVE_AREA; + +typedef struct _XSTATE_CONTEXT { + ULONG64 Mask; + ULONG Length; + ULONG Reserved1; + PXSAVE_AREA Area; +#if defined(_X86_) + ULONG Reserved2; +#endif + PVOID Buffer; +#if defined(_X86_) + ULONG Reserved3; +#endif +} XSTATE_CONTEXT, *PXSTATE_CONTEXT; + +typedef struct _XSTATE_SAVE { +#if defined(_AMD64_) + struct _XSTATE_SAVE* Prev; + struct _KTHREAD* Thread; + UCHAR Level; + XSTATE_CONTEXT XStateContext; +#elif defined(_IA64_) + ULONG Dummy; +#elif defined(_X86_) + union { + struct { + LONG64 Reserved1; + ULONG Reserved2; + struct _XSTATE_SAVE* Prev; + PXSAVE_AREA Reserved3; + struct _KTHREAD* Thread; + PVOID Reserved4; + UCHAR Level; + }; + XSTATE_CONTEXT XStateContext; + }; +#endif +} XSTATE_SAVE, *PXSTATE_SAVE; + +#ifdef _X86_ + +#define MAXIMUM_SUPPORTED_EXTENSION 512 + +#if !defined(__midl) && !defined(MIDL_PASS) +C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION); +#endif + +#endif /* _X86_ */ + +#define XSAVE_ALIGN 64 +#define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA) + +#if !defined(__midl) && !defined(MIDL_PASS) +C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0); +C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0); +C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64); +#endif + +typedef struct _CONTEXT_CHUNK { + LONG Offset; + ULONG Length; +} CONTEXT_CHUNK, *PCONTEXT_CHUNK; + +typedef struct _CONTEXT_EX { + CONTEXT_CHUNK All; + CONTEXT_CHUNK Legacy; + CONTEXT_CHUNK XState; +} CONTEXT_EX, *PCONTEXT_EX; + +#define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; +#else +extern PCCHAR KeNumberProcessors; +#endif /****************************************************************************** * Memory manager Types * ******************************************************************************/ +#if (NTDDI_VERSION >= NTDDI_WIN2K) +typedef ULONG NODE_REQUIREMENT; +#define MM_ANY_NODE_OK 0x80000000 +#endif + #define MM_DONT_ZERO_ALLOCATION 0x00000001 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004 @@ -1362,12 +1688,6 @@ typedef enum _MM_PAGE_PRIORITY { HighPagePriority = 32 } MM_PAGE_PRIORITY; -typedef enum _LOCK_OPERATION { - IoReadAccess, - IoWriteAccess, - IoModifyAccess -} LOCK_OPERATION; - typedef enum _MM_SYSTEM_SIZE { MmSmallSystem, MmMediumSystem, @@ -1386,12 +1706,6 @@ extern PVOID MmBadPointer; #define EX_RUNDOWN_COUNT_SHIFT 0x1 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT) -#ifdef _WIN64 -#define PORT_MAXIMUM_MESSAGE_LENGTH 512 -#else -#define PORT_MAXIMUM_MESSAGE_LENGTH 256 -#endif - typedef struct _FAST_MUTEX { volatile LONG Count; PKTHREAD Owner; @@ -1563,6 +1877,13 @@ typedef struct _EX_RUNDOWN_REF { typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE; +typedef enum _WORK_QUEUE_TYPE { + CriticalWorkQueue, + DelayedWorkQueue, + HyperCriticalWorkQueue, + MaximumWorkQueue +} WORK_QUEUE_TYPE; + typedef VOID (NTAPI WORKER_THREAD_ROUTINE)( IN PVOID Parameter); @@ -1574,6 +1895,78 @@ typedef struct _WORK_QUEUE_ITEM { volatile PVOID Parameter; } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; +typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; + +typedef struct _OWNER_ENTRY { + ERESOURCE_THREAD OwnerThread; + union { + struct { + ULONG IoPriorityBoosted:1; + ULONG OwnerReferenced:1; + ULONG OwnerCount:30; + }; + ULONG TableSize; + }; +} OWNER_ENTRY, *POWNER_ENTRY; + +typedef struct _ERESOURCE { + LIST_ENTRY SystemResourcesList; + POWNER_ENTRY OwnerTable; + SHORT ActiveCount; + USHORT Flag; + volatile PKSEMAPHORE SharedWaiters; + volatile PKEVENT ExclusiveWaiters; + OWNER_ENTRY OwnerEntry; + ULONG ActiveEntries; + ULONG ContentionCount; + ULONG NumberOfSharedWaiters; + ULONG NumberOfExclusiveWaiters; +#if defined(_WIN64) + PVOID Reserved2; +#endif + __GNU_EXTENSION union { + PVOID Address; + ULONG_PTR CreatorBackTraceIndex; + }; + KSPIN_LOCK SpinLock; +} ERESOURCE, *PERESOURCE; + +/* ERESOURCE.Flag */ +#define ResourceNeverExclusive 0x0010 +#define ResourceReleaseByOtherThread 0x0020 +#define ResourceOwnedExclusive 0x0080 + +#define RESOURCE_HASH_TABLE_SIZE 64 + +typedef struct _RESOURCE_HASH_ENTRY { + LIST_ENTRY ListEntry; + PVOID Address; + ULONG ContentionCount; + ULONG Number; +} RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY; + +typedef struct _RESOURCE_PERFORMANCE_DATA { + ULONG ActiveResourceCount; + ULONG TotalResourceCount; + ULONG ExclusiveAcquire; + ULONG SharedFirstLevel; + ULONG SharedSecondLevel; + ULONG StarveFirstLevel; + ULONG StarveSecondLevel; + ULONG WaitForExclusive; + ULONG OwnerTableExpands; + ULONG MaximumTableExpand; + LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE]; +} RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA; + +/* Global debug flag */ +#if DEVL +extern ULONG NtGlobalFlag; +#define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName)) +#else +#define IF_NTOS_DEBUG(FlagName) if(FALSE) +#endif + /****************************************************************************** * Security Manager Types * @@ -2000,6 +2393,144 @@ typedef enum _POWER_STATE_TYPE { DevicePowerState } POWER_STATE_TYPE, *PPOWER_STATE_TYPE; +#if (NTDDI_VERSION >= NTDDI_VISTA) +typedef struct _SYSTEM_POWER_STATE_CONTEXT { + union { + struct { + ULONG Reserved1:8; + ULONG TargetSystemState:4; + ULONG EffectiveSystemState:4; + ULONG CurrentSystemState:4; + ULONG IgnoreHibernationPath:1; + ULONG PseudoTransition:1; + ULONG Reserved2:10; + } DUMMYSTRUCTNAME; + ULONG ContextAsUlong; + } DUMMYUNIONNAME; +} SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT; +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +typedef struct _COUNTED_REASON_CONTEXT { + ULONG Version; + ULONG Flags; + union { + struct { + UNICODE_STRING ResourceFileName; + USHORT ResourceReasonId; + ULONG StringCount; + PUNICODE_STRING ReasonStrings; + } DUMMYSTRUCTNAME; + UNICODE_STRING SimpleString; + } DUMMYUNIONNAME; +} COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT; +#endif + +#define IOCTL_QUERY_DEVICE_POWER_STATE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_SET_DEVICE_WAKE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_CANCEL_DEVICE_WAKE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define ES_SYSTEM_REQUIRED 0x00000001 +#define ES_DISPLAY_REQUIRED 0x00000002 +#define ES_USER_PRESENT 0x00000004 +#define ES_CONTINUOUS 0x80000000 + +typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE; + +typedef enum { + LT_DONT_CARE, + LT_LOWEST_LATENCY +} LATENCY_TIME; + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) +#define DIAGNOSTIC_REASON_VERSION 0 +#define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001 +#define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002 +#define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000 +#define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003) +#endif + +#define POWER_REQUEST_CONTEXT_VERSION 0 +#define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001 +#define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002 + +#define PowerRequestMaximum 3 + +typedef enum _POWER_REQUEST_TYPE { + PowerRequestDisplayRequired, + PowerRequestSystemRequired, + PowerRequestAwayModeRequired +} POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE; + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +#define PDCAP_D0_SUPPORTED 0x00000001 +#define PDCAP_D1_SUPPORTED 0x00000002 +#define PDCAP_D2_SUPPORTED 0x00000004 +#define PDCAP_D3_SUPPORTED 0x00000008 +#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 +#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 +#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 +#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 +#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 + +typedef struct CM_Power_Data_s { + ULONG PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + ULONG PD_Capabilities; + ULONG PD_D1Latency; + ULONG PD_D2Latency; + ULONG PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; + SYSTEM_POWER_STATE PD_DeepestSystemWake; +} CM_POWER_DATA, *PCM_POWER_DATA; + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +typedef enum _SYSTEM_POWER_CONDITION { + PoAc, + PoDc, + PoHot, + PoConditionMaximum +} SYSTEM_POWER_CONDITION; + +typedef struct _SET_POWER_SETTING_VALUE { + ULONG Version; + GUID Guid; + SYSTEM_POWER_CONDITION PowerCondition; + ULONG DataLength; + UCHAR Data[ANYSIZE_ARRAY]; +} SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE; + +#define POWER_SETTING_VALUE_VERSION (0x1) + +typedef struct _NOTIFY_USER_POWER_SETTING { + GUID Guid; +} NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING; + +typedef struct _APPLICATIONLAUNCH_SETTING_VALUE { + LARGE_INTEGER ActivationTime; + ULONG Flags; + ULONG ButtonInstanceID; +} APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE; + +typedef enum _POWER_PLATFORM_ROLE { + PlatformRoleUnspecified = 0, + PlatformRoleDesktop, + PlatformRoleMobile, + PlatformRoleWorkstation, + PlatformRoleEnterpriseServer, + PlatformRoleSOHOServer, + PlatformRoleAppliancePC, + PlatformRolePerformanceServer, + PlatformRoleMaximum +} POWER_PLATFORM_ROLE; + #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) typedef struct { ULONG Granularity; @@ -2153,12 +2684,6 @@ NTSTATUS IN OUT PVOID Context OPTIONAL); typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; -#define PO_CB_SYSTEM_POWER_POLICY 0 -#define PO_CB_AC_STATUS 1 -#define PO_CB_BUTTON_COLLISION 2 -#define PO_CB_SYSTEM_STATE_LOCK 3 -#define PO_CB_LID_SWITCH_STATE 4 -#define PO_CB_PROCESSOR_POWER_POLICY 5 /****************************************************************************** * Configuration Manager Types * @@ -2250,6 +2775,15 @@ typedef int CM_RESOURCE_TYPE; REG_OPTION_BACKUP_RESTORE |\ REG_OPTION_OPEN_LINK) +#define REG_OPEN_LEGAL_OPTION \ + (REG_OPTION_RESERVED |\ + REG_OPTION_BACKUP_RESTORE |\ + REG_OPTION_OPEN_LINK) + +#define REG_STANDARD_FORMAT 1 +#define REG_LATEST_FORMAT 2 +#define REG_NO_COMPRESSION 4 + /* Key creation/open disposition */ #define REG_CREATED_NEW_KEY (0x00000001L) #define REG_OPENED_EXISTING_KEY (0x00000002L) @@ -2282,27 +2816,6 @@ typedef int CM_RESOURCE_TYPE; REG_NOTIFY_CHANGE_LAST_SET |\ REG_NOTIFY_CHANGE_SECURITY) -typedef struct _CM_FLOPPY_DEVICE_DATA { - USHORT Version; - USHORT Revision; - CHAR Size[8]; - ULONG MaxDensity; - ULONG MountDensity; - UCHAR StepRateHeadUnloadTime; - UCHAR HeadLoadTime; - UCHAR MotorOffTime; - UCHAR SectorLengthCode; - UCHAR SectorPerTrack; - UCHAR ReadWriteGapLength; - UCHAR DataTransferLength; - UCHAR FormatGapLength; - UCHAR FormatFillCharacter; - UCHAR HeadSettleTime; - UCHAR MotorSettleTime; - UCHAR MaximumTrackValue; - UCHAR DataTransferRate; -} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; - #include typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { UCHAR Type; @@ -2469,6 +2982,50 @@ typedef enum _CM_SHARE_DISPOSITION { #define CM_RESOURCE_DMA_TYPE_B 0x0020 #define CM_RESOURCE_DMA_TYPE_F 0x0040 +typedef struct _DEVICE_FLAGS { + ULONG Failed:1; + ULONG ReadOnly:1; + ULONG Removable:1; + ULONG ConsoleIn:1; + ULONG ConsoleOut:1; + ULONG Input:1; + ULONG Output:1; +} DEVICE_FLAGS, *PDEVICE_FLAGS; + +typedef enum _INTERFACE_TYPE { + InterfaceTypeUndefined = -1, + Internal, + Isa, + Eisa, + MicroChannel, + TurboChannel, + PCIBus, + VMEBus, + NuBus, + PCMCIABus, + CBus, + MPIBus, + MPSABus, + ProcessorInternal, + InternalPowerBus, + PNPISABus, + PNPBus, + Vmcs, + MaximumInterfaceType +} INTERFACE_TYPE, *PINTERFACE_TYPE; + +typedef struct _CM_COMPONENT_INFORMATION { + DEVICE_FLAGS Flags; + ULONG Version; + ULONG Key; + KAFFINITY AffinityMask; +} CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION; + +typedef struct _CM_ROM_BLOCK { + ULONG Address; + ULONG Size; +} CM_ROM_BLOCK, *PCM_ROM_BLOCK; + typedef struct _CM_PARTIAL_RESOURCE_LIST { USHORT Version; USHORT Revision; @@ -2487,6 +3044,12 @@ typedef struct _CM_RESOURCE_LIST { CM_FULL_RESOURCE_DESCRIPTOR List[1]; } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; +typedef struct _PNP_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; + #include typedef struct _CM_INT13_DRIVE_PARAMETER { @@ -2497,6 +3060,14 @@ typedef struct _CM_INT13_DRIVE_PARAMETER { USHORT NumberDrives; } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; +typedef struct _CM_MCA_POS_DATA { + USHORT AdapterId; + UCHAR PosData1; + UCHAR PosData2; + UCHAR PosData3; + UCHAR PosData4; +} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; + typedef struct _CM_PNP_BIOS_DEVICE_NODE { USHORT Size; UCHAR Node; @@ -2538,50 +3109,82 @@ typedef struct _CM_KEYBOARD_DEVICE_DATA { USHORT KeyboardFlags; } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; -typedef struct _CM_MCA_POS_DATA { - USHORT AdapterId; - UCHAR PosData1; - UCHAR PosData2; - UCHAR PosData3; - UCHAR PosData4; -} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; - -#if (NTDDI_VERSION >= NTDDI_WINXP) -typedef struct CM_Power_Data_s { - ULONG PD_Size; - DEVICE_POWER_STATE PD_MostRecentPowerState; - ULONG PD_Capabilities; - ULONG PD_D1Latency; - ULONG PD_D2Latency; - ULONG PD_D3Latency; - DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; - SYSTEM_POWER_STATE PD_DeepestSystemWake; -} CM_POWER_DATA, *PCM_POWER_DATA; - -#define PDCAP_D0_SUPPORTED 0x00000001 -#define PDCAP_D1_SUPPORTED 0x00000002 -#define PDCAP_D2_SUPPORTED 0x00000004 -#define PDCAP_D3_SUPPORTED 0x00000008 -#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 -#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 -#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 -#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 -#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - typedef struct _CM_SCSI_DEVICE_DATA { USHORT Version; USHORT Revision; UCHAR HostIdentifier; } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; +typedef struct _CM_VIDEO_DEVICE_DATA { + USHORT Version; + USHORT Revision; + ULONG VideoClock; +} CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA; + +typedef struct _CM_SONIC_DEVICE_DATA { + USHORT Version; + USHORT Revision; + USHORT DataConfigurationRegister; + UCHAR EthernetAddress[8]; +} CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA; + typedef struct _CM_SERIAL_DEVICE_DATA { USHORT Version; USHORT Revision; ULONG BaudClock; } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; +typedef struct _CM_MONITOR_DEVICE_DATA { + USHORT Version; + USHORT Revision; + USHORT HorizontalScreenSize; + USHORT VerticalScreenSize; + USHORT HorizontalResolution; + USHORT VerticalResolution; + USHORT HorizontalDisplayTimeLow; + USHORT HorizontalDisplayTime; + USHORT HorizontalDisplayTimeHigh; + USHORT HorizontalBackPorchLow; + USHORT HorizontalBackPorch; + USHORT HorizontalBackPorchHigh; + USHORT HorizontalFrontPorchLow; + USHORT HorizontalFrontPorch; + USHORT HorizontalFrontPorchHigh; + USHORT HorizontalSyncLow; + USHORT HorizontalSync; + USHORT HorizontalSyncHigh; + USHORT VerticalBackPorchLow; + USHORT VerticalBackPorch; + USHORT VerticalBackPorchHigh; + USHORT VerticalFrontPorchLow; + USHORT VerticalFrontPorch; + USHORT VerticalFrontPorchHigh; + USHORT VerticalSyncLow; + USHORT VerticalSync; + USHORT VerticalSyncHigh; +} CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA; + +typedef struct _CM_FLOPPY_DEVICE_DATA { + USHORT Version; + USHORT Revision; + CHAR Size[8]; + ULONG MaxDensity; + ULONG MountDensity; + UCHAR StepRateHeadUnloadTime; + UCHAR HeadLoadTime; + UCHAR MotorOffTime; + UCHAR SectorLengthCode; + UCHAR SectorPerTrack; + UCHAR ReadWriteGapLength; + UCHAR DataTransferLength; + UCHAR FormatGapLength; + UCHAR FormatFillCharacter; + UCHAR HeadSettleTime; + UCHAR MotorSettleTime; + UCHAR MaximumTrackValue; + UCHAR DataTransferRate; +} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; + typedef enum _KEY_INFORMATION_CLASS { KeyBasicInformation, KeyNodeInformation, @@ -2601,6 +3204,10 @@ typedef struct _KEY_BASIC_INFORMATION { WCHAR Name[1]; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; +typedef struct _KEY_CONTROL_FLAGS_INFORMATION { + ULONG ControlFlags; +} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION; + typedef struct _KEY_FULL_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -2615,6 +3222,10 @@ typedef struct _KEY_FULL_INFORMATION { WCHAR Class[1]; } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; +typedef struct _KEY_HANDLE_TAGS_INFORMATION { + ULONG HandleTags; +} KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION; + typedef struct _KEY_NODE_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -2624,6 +3235,23 @@ typedef struct _KEY_NODE_INFORMATION { WCHAR Name[1]; } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; +typedef enum _KEY_SET_INFORMATION_CLASS { + KeyWriteTimeInformation, + KeyWow64FlagsInformation, + KeyControlFlagsInformation, + KeySetVirtualizationInformation, + KeySetDebugInformation, + KeySetHandleTagsInformation, + MaxKeySetInfoClass +} KEY_SET_INFORMATION_CLASS; + +typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION { + ULONG VirtualTarget:1; + ULONG VirtualStore:1; + ULONG VirtualSource:1; + ULONG Reserved:29; +} KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION; + typedef struct _KEY_VALUE_BASIC_INFORMATION { ULONG TitleIndex; ULONG Type; @@ -2668,20 +3296,14 @@ typedef enum _KEY_VALUE_INFORMATION_CLASS { KeyValuePartialInformationAlign64 } KEY_VALUE_INFORMATION_CLASS; +typedef struct _KEY_WOW64_FLAGS_INFORMATION { + ULONG UserFlags; +} KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION; + typedef struct _KEY_WRITE_TIME_INFORMATION { LARGE_INTEGER LastWriteTime; } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; -typedef enum _KEY_SET_INFORMATION_CLASS { - KeyWriteTimeInformation, - KeyWow64FlagsInformation, - KeyControlFlagsInformation, - KeySetVirtualizationInformation, - KeySetDebugInformation, - KeySetHandleTagsInformation, - MaxKeySetInfoClass -} KEY_SET_INFORMATION_CLASS; - typedef enum _REG_NOTIFY_CLASS { RegNtDeleteKey, RegNtPreDeleteKey = RegNtDeleteKey, @@ -2851,6 +3473,54 @@ typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION { PVOID Reserved; } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION; +typedef struct _REG_RENAME_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING NewName; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION; + +typedef struct _REG_CREATE_KEY_INFORMATION { + PUNICODE_STRING CompleteName; + PVOID RootObject; + PVOID ObjectType; + ULONG CreateOptions; + PUNICODE_STRING Class; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; + ACCESS_MASK DesiredAccess; + ACCESS_MASK GrantedAccess; + PULONG Disposition; + PVOID *ResultObject; + PVOID CallContext; + PVOID RootObjectContext; + PVOID Transaction; + PVOID Reserved; +} REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION; + +typedef struct _REG_CREATE_KEY_INFORMATION_V1 { + PUNICODE_STRING CompleteName; + PVOID RootObject; + PVOID ObjectType; + ULONG Options; + PUNICODE_STRING Class; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; + ACCESS_MASK DesiredAccess; + ACCESS_MASK GrantedAccess; + PULONG Disposition; + PVOID *ResultObject; + PVOID CallContext; + PVOID RootObjectContext; + PVOID Transaction; + ULONG_PTR Version; + PUNICODE_STRING RemainingName; + ULONG Wow64Flags; + ULONG Attributes; + KPROCESSOR_MODE CheckAccessMode; +} REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1; + typedef struct _REG_PRE_CREATE_KEY_INFORMATION { PUNICODE_STRING CompleteName; } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;; @@ -2878,142 +3548,83 @@ typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { PVOID Reserved; } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION; -/****************************************************************************** - * I/O Manager Types * - ******************************************************************************/ +#if (NTDDI_VERSION >= NTDDI_VISTA) - /* PCI_COMMON_CONFIG.Command */ -#define PCI_ENABLE_IO_SPACE 0x0001 -#define PCI_ENABLE_MEMORY_SPACE 0x0002 -#define PCI_ENABLE_BUS_MASTER 0x0004 -#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 -#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 -#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 -#define PCI_ENABLE_PARITY 0x0040 -#define PCI_ENABLE_WAIT_CYCLE 0x0080 -#define PCI_ENABLE_SERR 0x0100 -#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 -#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 +typedef struct _REG_LOAD_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING KeyName; + PUNICODE_STRING SourceFile; + ULONG Flags; + PVOID TrustClassObject; + PVOID UserEvent; + ACCESS_MASK DesiredAccess; + PHANDLE RootHandle; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION; -/* PCI_COMMON_CONFIG.Status */ -#define PCI_STATUS_INTERRUPT_PENDING 0x0008 -#define PCI_STATUS_CAPABILITIES_LIST 0x0010 -#define PCI_STATUS_66MHZ_CAPABLE 0x0020 -#define PCI_STATUS_UDF_SUPPORTED 0x0040 -#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 -#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 -#define PCI_STATUS_DEVSEL 0x0600 -#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 -#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 -#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 -#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 -#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 +typedef struct _REG_UNLOAD_KEY_INFORMATION { + PVOID Object; + PVOID UserEvent; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION; -/* PCI_COMMON_CONFIG.HeaderType */ -#define PCI_MULTIFUNCTION 0x80 -#define PCI_DEVICE_TYPE 0x00 -#define PCI_BRIDGE_TYPE 0x01 -#define PCI_CARDBUS_BRIDGE_TYPE 0x02 +typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION { + PVOID Object; + PVOID ObjectContext; + PVOID Reserved; +} REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION; -#define PCI_CONFIGURATION_TYPE(PciData) \ - (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) +typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION { + PVOID Object; + PSECURITY_INFORMATION SecurityInformation; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PULONG Length; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION; -#define PCI_MULTIFUNCTION_DEVICE(PciData) \ - ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) +typedef struct _REG_SET_KEY_SECURITY_INFORMATION { + PVOID Object; + PSECURITY_INFORMATION SecurityInformation; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION; -/* PCI device classes */ -#define PCI_CLASS_PRE_20 0x00 -#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 -#define PCI_CLASS_NETWORK_CTLR 0x02 -#define PCI_CLASS_DISPLAY_CTLR 0x03 -#define PCI_CLASS_MULTIMEDIA_DEV 0x04 -#define PCI_CLASS_MEMORY_CTLR 0x05 -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 -#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 -#define PCI_CLASS_INPUT_DEV 0x09 -#define PCI_CLASS_DOCKING_STATION 0x0a -#define PCI_CLASS_PROCESSOR 0x0b -#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c -#define PCI_CLASS_WIRELESS_CTLR 0x0d -#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e -#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f -#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 -#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 +typedef struct _REG_RESTORE_KEY_INFORMATION { + PVOID Object; + HANDLE FileHandle; + ULONG Flags; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION; -/* PCI device subclasses for class 0 */ -#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 -#define PCI_SUBCLASS_PRE_20_VGA 0x01 +typedef struct _REG_SAVE_KEY_INFORMATION { + PVOID Object; + HANDLE FileHandle; + ULONG Format; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION; -/* PCI device subclasses for class 1 (mass storage controllers)*/ -#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 -#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 -#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 -#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 -#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 -#define PCI_SUBCLASS_MSC_OTHER 0x80 +typedef struct _REG_REPLACE_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING OldFileName; + PUNICODE_STRING NewFileName; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION; -/* PCI device subclasses for class 2 (network controllers)*/ -#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 -#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 -#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 -#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 -#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 -#define PCI_SUBCLASS_NET_OTHER 0x80 - -/* PCI device subclasses for class 3 (display controllers)*/ -#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 -#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 -#define PCI_SUBCLASS_VID_3D_CTLR 0x02 -#define PCI_SUBCLASS_VID_OTHER 0x80 - -/* PCI device subclasses for class 4 (multimedia device)*/ -#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 -#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 -#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 -#define PCI_SUBCLASS_MM_OTHER 0x80 - -/* PCI device subclasses for class 5 (memory controller)*/ -#define PCI_SUBCLASS_MEM_RAM 0x00 -#define PCI_SUBCLASS_MEM_FLASH 0x01 -#define PCI_SUBCLASS_MEM_OTHER 0x80 - -/* PCI device subclasses for class 6 (bridge device)*/ -#define PCI_SUBCLASS_BR_HOST 0x00 -#define PCI_SUBCLASS_BR_ISA 0x01 -#define PCI_SUBCLASS_BR_EISA 0x02 -#define PCI_SUBCLASS_BR_MCA 0x03 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 -#define PCI_SUBCLASS_BR_PCMCIA 0x05 -#define PCI_SUBCLASS_BR_NUBUS 0x06 -#define PCI_SUBCLASS_BR_CARDBUS 0x07 -#define PCI_SUBCLASS_BR_RACEWAY 0x08 -#define PCI_SUBCLASS_BR_OTHER 0x80 - -/* PCI device subclasses for class C (serial bus controller)*/ -#define PCI_SUBCLASS_SB_IEEE1394 0x00 -#define PCI_SUBCLASS_SB_ACCESS 0x01 -#define PCI_SUBCLASS_SB_SSA 0x02 -#define PCI_SUBCLASS_SB_USB 0x03 -#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 -#define PCI_SUBCLASS_SB_SMBUS 0x05 - -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 -#define PCI_MAX_BRIDGE_NUMBER 0xFF -#define PCI_INVALID_VENDORID 0xFFFF -#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) - -#define PCI_ADDRESS_IO_SPACE 0x00000001 -#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 -#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 -#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc -#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 -#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 - -#define PCI_TYPE_32BIT 0 -#define PCI_TYPE_20BIT 2 -#define PCI_TYPE_64BIT 4 +#endif /* NTDDI_VERSION >= NTDDI_VISTA */ #define SERVICE_KERNEL_DRIVER 0x00000001 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002 @@ -3080,14 +3691,37 @@ typedef enum _CM_ERROR_CONTROL_TYPE { CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \ CM_SERVICE_USB_DISK_BOOT_LOAD) +/****************************************************************************** + * I/O Manager Types * + ******************************************************************************/ + +#define WDM_MAJORVERSION 0x06 +#define WDM_MINORVERSION 0x00 + +#if defined(_WIN64) + +#ifndef USE_DMA_MACROS +#define USE_DMA_MACROS +#endif + +#ifndef NO_LEGACY_DRIVERS +#define NO_LEGACY_DRIVERS +#endif + +#endif /* defined(_WIN64) */ + +#define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS + +#define CONNECT_FULLY_SPECIFIED 0x1 +#define CONNECT_LINE_BASED 0x2 +#define CONNECT_MESSAGE_BASED 0x3 +#define CONNECT_FULLY_SPECIFIED_GROUP 0x4 +#define CONNECT_CURRENT_VERSION 0x4 + #define POOL_COLD_ALLOCATION 256 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16 -#define PCI_TYPE0_ADDRESSES 6 -#define PCI_TYPE1_ADDRESSES 2 -#define PCI_TYPE2_ADDRESSES 5 - #define IO_TYPE_ADAPTER 1 #define IO_TYPE_CONTROLLER 2 #define IO_TYPE_DEVICE 3 @@ -3111,47 +3745,6 @@ typedef enum _CM_ERROR_CONTROL_TYPE { #define IO_RESOURCE_DEFAULT 0x02 #define IO_RESOURCE_ALTERNATIVE 0x08 -/* DEVICE_OBJECT.Flags */ -#define DO_VERIFY_VOLUME 0x00000002 -#define DO_BUFFERED_IO 0x00000004 -#define DO_EXCLUSIVE 0x00000008 -#define DO_DIRECT_IO 0x00000010 -#define DO_MAP_IO_BUFFER 0x00000020 -#define DO_DEVICE_INITIALIZING 0x00000080 -#define DO_SHUTDOWN_REGISTERED 0x00000800 -#define DO_BUS_ENUMERATED_DEVICE 0x00001000 -#define DO_POWER_PAGABLE 0x00002000 -#define DO_POWER_INRUSH 0x00004000 - -/* DEVICE_OBJECT.Characteristics */ -#define FILE_REMOVABLE_MEDIA 0x00000001 -#define FILE_READ_ONLY_DEVICE 0x00000002 -#define FILE_FLOPPY_DISKETTE 0x00000004 -#define FILE_WRITE_ONCE_MEDIA 0x00000008 -#define FILE_REMOTE_DEVICE 0x00000010 -#define FILE_DEVICE_IS_MOUNTED 0x00000020 -#define FILE_VIRTUAL_VOLUME 0x00000040 -#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 -#define FILE_DEVICE_SECURE_OPEN 0x00000100 -#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 -#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 -#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 - -/* DEVICE_OBJECT.AlignmentRequirement */ -#define FILE_BYTE_ALIGNMENT 0x00000000 -#define FILE_WORD_ALIGNMENT 0x00000001 -#define FILE_LONG_ALIGNMENT 0x00000003 -#define FILE_QUAD_ALIGNMENT 0x00000007 -#define FILE_OCTA_ALIGNMENT 0x0000000f -#define FILE_32_BYTE_ALIGNMENT 0x0000001f -#define FILE_64_BYTE_ALIGNMENT 0x0000003f -#define FILE_128_BYTE_ALIGNMENT 0x0000007f -#define FILE_256_BYTE_ALIGNMENT 0x000000ff -#define FILE_512_BYTE_ALIGNMENT 0x000001ff - -/* DEVICE_OBJECT.DeviceType */ -#define DEVICE_TYPE ULONG - #define FILE_DEVICE_BEEP 0x00000001 #define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 @@ -3220,6 +3813,44 @@ typedef enum _CM_ERROR_CONTROL_TYPE { #define FILE_DEVICE_BIOMETRIC 0x00000044 #define FILE_DEVICE_PMI 0x00000045 +#if defined(NT_PROCESSOR_GROUPS) + +typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; + +typedef enum _IRQ_DEVICE_POLICY_USHORT { + IrqPolicyMachineDefault = 0, + IrqPolicyAllCloseProcessors = 1, + IrqPolicyOneCloseProcessor = 2, + IrqPolicyAllProcessorsInMachine = 3, + IrqPolicyAllProcessorsInGroup = 3, + IrqPolicySpecifiedProcessors = 4, + IrqPolicySpreadMessagesAcrossAllProcessors = 5}; + +#else /* defined(NT_PROCESSOR_GROUPS) */ + +typedef enum _IRQ_DEVICE_POLICY { + IrqPolicyMachineDefault = 0, + IrqPolicyAllCloseProcessors, + IrqPolicyOneCloseProcessor, + IrqPolicyAllProcessorsInMachine, + IrqPolicySpecifiedProcessors, + IrqPolicySpreadMessagesAcrossAllProcessors +} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; + +#endif + +typedef enum _IRQ_PRIORITY { + IrqPriorityUndefined = 0, + IrqPriorityLow, + IrqPriorityNormal, + IrqPriorityHigh +} IRQ_PRIORITY, *PIRQ_PRIORITY; + +typedef enum _IRQ_GROUP_POLICY { + GroupAffinityAllGroupZero = 0, + GroupAffinityDontCare +} IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY; + #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) typedef struct _OBJECT_HANDLE_INFORMATION { @@ -3232,10 +3863,6 @@ typedef struct _CLIENT_ID { HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; -typedef VOID -(NTAPI *PKSTART_ROUTINE)( - IN PVOID StartContext); - typedef struct _VPB { CSHORT Type; CSHORT Size; @@ -3272,6 +3899,47 @@ typedef struct _WAIT_CONTEXT_BLOCK { PKDPC BufferChainingDpc; } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; +/* DEVICE_OBJECT.Flags */ +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 + +/* DEVICE_OBJECT.Characteristics */ +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 +#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 +#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 +#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 + +/* DEVICE_OBJECT.AlignmentRequirement */ +#define FILE_BYTE_ALIGNMENT 0x00000000 +#define FILE_WORD_ALIGNMENT 0x00000001 +#define FILE_LONG_ALIGNMENT 0x00000003 +#define FILE_QUAD_ALIGNMENT 0x00000007 +#define FILE_OCTA_ALIGNMENT 0x0000000f +#define FILE_32_BYTE_ALIGNMENT 0x0000001f +#define FILE_64_BYTE_ALIGNMENT 0x0000003f +#define FILE_128_BYTE_ALIGNMENT 0x0000007f +#define FILE_256_BYTE_ALIGNMENT 0x000000ff +#define FILE_512_BYTE_ALIGNMENT 0x000001ff + +/* DEVICE_OBJECT.DeviceType */ +#define DEVICE_TYPE ULONG + typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; @@ -3303,6 +3971,153 @@ typedef struct _DEVICE_OBJECT { PVOID Reserved; } DEVICE_OBJECT, *PDEVICE_OBJECT; +typedef enum _IO_SESSION_STATE { + IoSessionStateCreated = 1, + IoSessionStateInitialized, + IoSessionStateConnected, + IoSessionStateDisconnected, + IoSessionStateDisconnectedLoggedOn, + IoSessionStateLoggedOn, + IoSessionStateLoggedOff, + IoSessionStateTerminated, + IoSessionStateMax +} IO_SESSION_STATE, *PIO_SESSION_STATE; + +typedef enum _IO_COMPLETION_ROUTINE_RESULT { + ContinueCompletion = STATUS_CONTINUE_COMPLETION, + StopCompletion = STATUS_MORE_PROCESSING_REQUIRED +} IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT; + +typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY { + PHYSICAL_ADDRESS MessageAddress; + KAFFINITY TargetProcessorSet; + PKINTERRUPT InterruptObject; + ULONG MessageData; + ULONG Vector; + KIRQL Irql; + KINTERRUPT_MODE Mode; + KINTERRUPT_POLARITY Polarity; +} IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY; + +typedef struct _IO_INTERRUPT_MESSAGE_INFO { + KIRQL UnifiedIrql; + ULONG MessageCount; + IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1]; +} IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO; + +typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + OUT PKINTERRUPT *InterruptObject; + IN PKSERVICE_ROUTINE ServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql; + IN BOOLEAN FloatingSave; + IN BOOLEAN ShareVector; + IN ULONG Vector; + IN KIRQL Irql; + IN KINTERRUPT_MODE InterruptMode; + IN KAFFINITY ProcessorEnableMask; + IN USHORT Group; +} IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + OUT PKINTERRUPT *InterruptObject; + IN PKSERVICE_ROUTINE ServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql OPTIONAL; + IN BOOLEAN FloatingSave; +} IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + union { + OUT PVOID *Generic; + OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable; + OUT PKINTERRUPT *InterruptObject; + } ConnectionContext; + IN PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql OPTIONAL; + IN BOOLEAN FloatingSave; + IN PKSERVICE_ROUTINE FallBackServiceRoutine OPTIONAL; +} IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { + IN OUT ULONG Version; + union { + IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified; + IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased; + IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased; + }; +} IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS; + +typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS { + IN ULONG Version; + union { + IN PVOID Generic; + IN PKINTERRUPT InterruptObject; + IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; + } ConnectionContext; +} IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS; + +typedef enum _IO_ACCESS_TYPE { + ReadAccess, + WriteAccess, + ModifyAccess +} IO_ACCESS_TYPE; + +typedef enum _IO_ACCESS_MODE { + SequentialAccess, + RandomAccess +} IO_ACCESS_MODE; + +typedef enum _IO_CONTAINER_NOTIFICATION_CLASS { + IoSessionStateNotification, + IoMaxContainerNotificationClass +} IO_CONTAINER_NOTIFICATION_CLASS; + +typedef struct _IO_SESSION_STATE_NOTIFICATION { + ULONG Size; + ULONG Flags; + PVOID IoObject; + ULONG EventMask; + PVOID Context; +} IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION; + +typedef enum _IO_CONTAINER_INFORMATION_CLASS { + IoSessionStateInformation, + IoMaxContainerInformationClass +} IO_CONTAINER_INFORMATION_CLASS; + +typedef struct _IO_SESSION_STATE_INFORMATION { + ULONG SessionId; + IO_SESSION_STATE SessionState; + BOOLEAN LocalSession; +} IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION; + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +typedef NTSTATUS +(NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)( + VOID); + +typedef NTSTATUS +(NTAPI IO_SESSION_NOTIFICATION_FUNCTION)( + IN PVOID SessionObject, + IN PVOID IoObject, + IN ULONG Event, + IN PVOID Context, + IN PVOID NotificationPayload, + IN ULONG PayloadLength); + +typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION; + +#endif + typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { @@ -3431,22 +4246,6 @@ typedef struct _SHARE_ACCESS { } type2; \ } u; -typedef struct _PCI_COMMON_HEADER { - PCI_COMMON_HEADER_LAYOUT -} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; - -#ifdef __cplusplus -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER_LAYOUT - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#else -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER DUMMYSTRUCTNAME; - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#endif - typedef enum _CREATE_FILE_TYPE { CreateFileTypeNone, CreateFileTypeNamedPipe, @@ -3467,16 +4266,12 @@ typedef struct _IO_STATUS_BLOCK { ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; -typedef struct _PCI_SLOT_NUMBER { - union { - struct { - ULONG DeviceNumber : 5; - ULONG FunctionNumber : 3; - ULONG Reserved : 24; - } bits; - ULONG AsULONG; - } u; -} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; +#if defined(_WIN64) +typedef struct _IO_STATUS_BLOCK32 { + NTSTATUS Status; + ULONG Information; +} IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32; +#endif typedef VOID (NTAPI *PIO_APC_ROUTINE)( @@ -3484,16 +4279,35 @@ typedef VOID IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved); -typedef VOID -(NTAPI *WMI_NOTIFICATION_CALLBACK)( - PVOID Wnode, - PVOID Context); +#define PIO_APC_ROUTINE_DEFINED -#define WMIREG_ACTION_REGISTER 1 -#define WMIREG_ACTION_DEREGISTER 2 -#define WMIREG_ACTION_REREGISTER 3 -#define WMIREG_ACTION_UPDATE_GUIDS 4 -#define WMIREG_ACTION_BLOCK_IRPS 5 +typedef enum _IO_SESSION_EVENT { + IoSessionEventIgnore = 0, + IoSessionEventCreated, + IoSessionEventTerminated, + IoSessionEventConnected, + IoSessionEventDisconnected, + IoSessionEventLogon, + IoSessionEventLogoff, + IoSessionEventMax +} IO_SESSION_EVENT, *PIO_SESSION_EVENT; + +#define IO_SESSION_STATE_ALL_EVENTS 0xffffffff +#define IO_SESSION_STATE_CREATION_EVENT 0x00000001 +#define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002 +#define IO_SESSION_STATE_CONNECT_EVENT 0x00000004 +#define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008 +#define IO_SESSION_STATE_LOGON_EVENT 0x00000010 +#define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020 + +#define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f + +#define IO_SESSION_MAX_PAYLOAD_SIZE 256L + +typedef struct _IO_SESSION_CONNECT_INFO { + ULONG SessionId; + BOOLEAN LocalSession; +} IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO; #define EVENT_INCREMENT 1 #define IO_NO_INCREMENT 0 @@ -3562,6 +4376,7 @@ typedef struct _BOOTDISK_INFORMATION_LITE { #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ +#include typedef struct _EISA_MEMORY_TYPE { UCHAR ReadWrite : 1; @@ -3573,7 +4388,6 @@ typedef struct _EISA_MEMORY_TYPE { UCHAR MoreEntries : 1; } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; -#include typedef struct _EISA_MEMORY_CONFIGURATION { EISA_MEMORY_TYPE ConfigurationByte; UCHAR DataSize; @@ -3581,7 +4395,6 @@ typedef struct _EISA_MEMORY_CONFIGURATION { UCHAR AddressHighByte; USHORT MemorySize; } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; -#include typedef struct _EISA_IRQ_DESCRIPTOR { UCHAR Interrupt : 4; @@ -3615,7 +4428,6 @@ typedef struct _EISA_DMA_CONFIGURATION { DMA_CONFIGURATION_BYTE1 ConfigurationByte1; } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; -#include typedef struct _EISA_PORT_DESCRIPTOR { UCHAR NumberPorts : 5; UCHAR Reserved : 1; @@ -3627,7 +4439,17 @@ typedef struct _EISA_PORT_CONFIGURATION { EISA_PORT_DESCRIPTOR Configuration; USHORT PortAddress; } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; -#include + +typedef struct _CM_EISA_SLOT_INFORMATION { + UCHAR ReturnCode; + UCHAR ReturnFlags; + UCHAR MajorRevision; + UCHAR MinorRevision; + USHORT Checksum; + UCHAR NumberFunctions; + UCHAR FunctionInformation; + ULONG CompressedId; +} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; typedef struct _CM_EISA_FUNCTION_INFORMATION { ULONG CompressedId; @@ -3645,6 +4467,8 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { UCHAR InitializationData[60]; } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; +#include + /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ #define EISA_FUNCTION_ENABLED 0x80 @@ -3659,16 +4483,9 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) -typedef struct _CM_EISA_SLOT_INFORMATION { - UCHAR ReturnCode; - UCHAR ReturnFlags; - UCHAR MajorRevision; - UCHAR MinorRevision; - USHORT Checksum; - UCHAR NumberFunctions; - UCHAR FunctionInformation; - ULONG CompressedId; -} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; +#define EISA_MORE_ENTRIES 0x80 +#define EISA_SYSTEM_MEMORY 0x00 +#define EISA_MEMORY_TYPE_RAM 0x01 /* CM_EISA_SLOT_INFORMATION.ReturnCode */ @@ -3715,6 +4532,45 @@ typedef ULONG IN ULONG Length); typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA; +typedef enum _DEVICE_INSTALL_STATE { + InstallStateInstalled, + InstallStateNeedsReinstall, + InstallStateFailedInstall, + InstallStateFinishInstall +} DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE; + +typedef struct _LEGACY_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION; + +typedef enum _DEVICE_REMOVAL_POLICY { + RemovalPolicyExpectNoRemoval = 1, + RemovalPolicyExpectOrderlyRemoval = 2, + RemovalPolicyExpectSurpriseRemoval = 3 +} DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY; + +typedef VOID +(NTAPI*PREENUMERATE_SELF)( + IN PVOID Context); + +typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf; +} REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD; + +typedef VOID +(NTAPI *PIO_DEVICE_EJECT_CALLBACK)( + IN NTSTATUS Status, + IN OUT PVOID Context OPTIONAL); + +#define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1 + /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */ #define PCI_USE_SUBSYSTEM_IDS 0x00000001 #define PCI_USE_REVISION 0x00000002 @@ -3775,175 +4631,6 @@ typedef struct _PCI_DEVICE_PRESENT_INTERFACE { PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; -typedef -BOOLEAN -(*PGPE_SERVICE_ROUTINE2)( - PVOID ObjectContext, - PVOID ServiceContext -); - -typedef -NTSTATUS -(*PGPE_CONNECT_VECTOR2)( - PVOID Context, - ULONG GpeNumber, - KINTERRUPT_MODE Mode, - BOOLEAN Shareable, - PGPE_SERVICE_ROUTINE2 ServiceRoutine, - PVOID ServiceContext, - PVOID *ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISCONNECT_VECTOR2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_ENABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_CLEAR_STATUS2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -VOID -(*PDEVICE_NOTIFY_CALLBACK2)( - PVOID NotificationContext, - ULONG NotifyCode -); - -typedef -NTSTATUS -(*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context, - PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, - PVOID NotificationContext -); - -typedef -VOID -(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context -); - -typedef struct -{ - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR2 GpeConnectVector; - PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; - PGPE_ENABLE_EVENT2 GpeEnableEvent; - PGPE_DISABLE_EVENT2 GpeDisableEvent; - PGPE_CLEAR_STATUS2 GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; - -typedef -BOOLEAN -(*PGPE_SERVICE_ROUTINE)( - PDEVICE_OBJECT ObjectContext, - PVOID ServiceContext -); - -typedef -NTSTATUS -(*PGPE_CONNECT_VECTOR)( - PDEVICE_OBJECT Context, - ULONG GpeNumber, - KINTERRUPT_MODE Mode, - BOOLEAN Shareable, - PGPE_SERVICE_ROUTINE ServiceRoutine, - PVOID ServiceContext, - PVOID *ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISCONNECT_VECTOR)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_ENABLE_EVENT)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISABLE_EVENT)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_CLEAR_STATUS)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -VOID -(*PDEVICE_NOTIFY_CALLBACK)( - PVOID NotificationContext, - ULONG NotifyCode -); - -typedef -NTSTATUS -(*PREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT Context, - PDEVICE_NOTIFY_CALLBACK NotificationHandler, - PVOID NotificationContext -); - -typedef -VOID -(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT Context, - PDEVICE_NOTIFY_CALLBACK NotificationHandler -); - -typedef struct -{ - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR GpeConnectVector; - PGPE_DISCONNECT_VECTOR GpeDisconnectVector; - PGPE_ENABLE_EVENT GpeEnableEvent; - PGPE_DISABLE_EVENT GpeDisableEvent; - PGPE_CLEAR_STATUS GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; - typedef struct _DEVICE_CAPABILITIES { USHORT Size; USHORT Version; @@ -4033,6 +4720,139 @@ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { struct _FILE_OBJECT *FileObject; } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; +#if (NTDDI_VERSION >= NTDDI_VISTA) +#include +#define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001 +#endif + +#define PNP_REPLACE_NO_MAP MAXLONGLONG + +typedef NTSTATUS +(NTAPI *PREPLACE_MAP_MEMORY)( + IN PHYSICAL_ADDRESS TargetPhysicalAddress, + IN PHYSICAL_ADDRESS SparePhysicalAddress, + IN OUT PLARGE_INTEGER NumberOfBytes, + OUT PVOID *TargetAddress, + OUT PVOID *SpareAddress); + +typedef struct _PNP_REPLACE_MEMORY_LIST { + ULONG AllocatedCount; + ULONG Count; + ULONGLONG TotalLength; + struct { + PHYSICAL_ADDRESS Address; + ULONGLONG Length; + } Ranges[ANYSIZE_ARRAY]; +} PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST; + +typedef struct _PNP_REPLACE_PROCESSOR_LIST { + PKAFFINITY Affinity; + ULONG GroupCount; + ULONG AllocatedCount; + ULONG Count; + ULONG ApicIds[ANYSIZE_ARRAY]; +} PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST; + +typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 { + KAFFINITY AffinityMask; + ULONG AllocatedCount; + ULONG Count; + ULONG ApicIds[ANYSIZE_ARRAY]; +} PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1; + +#define PNP_REPLACE_PARAMETERS_VERSION 2 + +typedef struct _PNP_REPLACE_PARAMETERS { + ULONG Size; + ULONG Version; + ULONG64 Target; + ULONG64 Spare; + PPNP_REPLACE_PROCESSOR_LIST TargetProcessors; + PPNP_REPLACE_PROCESSOR_LIST SpareProcessors; + PPNP_REPLACE_MEMORY_LIST TargetMemory; + PPNP_REPLACE_MEMORY_LIST SpareMemory; + PREPLACE_MAP_MEMORY MapMemory; +} PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS; + +typedef VOID +(NTAPI *PREPLACE_UNLOAD)( + VOID); + +typedef NTSTATUS +(NTAPI *PREPLACE_BEGIN)( + IN PPNP_REPLACE_PARAMETERS Parameters, + OUT PVOID *Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_END)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)( + IN PVOID Context, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN LARGE_INTEGER ByteCount); + +typedef NTSTATUS +(NTAPI *PREPLACE_SET_PROCESSOR_ID)( + IN PVOID Context, + IN ULONG ApicId, + IN BOOLEAN Target); + +typedef NTSTATUS +(NTAPI *PREPLACE_SWAP)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_GET_MEMORY_DESTINATION)( + IN PVOID Context, + IN PHYSICAL_ADDRESS SourceAddress, + OUT PPHYSICAL_ADDRESS DestinationAddress); + +typedef NTSTATUS +(NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)( + IN PVOID Context, + IN BOOLEAN Enable); + +#define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1 +#define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \ + FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror) + +#define PNP_REPLACE_MEMORY_SUPPORTED 0x0001 +#define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002 +#define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004 +#define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008 +#define PNP_REPLACE_HARDWARE_QUIESCE 0x0010 + +typedef struct _PNP_REPLACE_DRIVER_INTERFACE { + ULONG Size; + ULONG Version; + ULONG Flags; + PREPLACE_UNLOAD Unload; + PREPLACE_BEGIN BeginReplace; + PREPLACE_END EndReplace; + PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory; + PREPLACE_SET_PROCESSOR_ID SetProcessorId; + PREPLACE_SWAP Swap; + PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror; + PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory; + PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination; + PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce; +} PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE; + +typedef NTSTATUS +(NTAPI *PREPLACE_DRIVER_INIT)( + IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface, + IN PVOID Unused); + typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { DeviceUsageTypeUndefined, DeviceUsageTypePaging, @@ -4079,6 +4899,15 @@ typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { EventCategoryTargetDeviceChange } IO_NOTIFICATION_EVENT_CATEGORY; +typedef enum _IO_PRIORITY_HINT { + IoPriorityVeryLow = 0, + IoPriorityLow, + IoPriorityNormal, + IoPriorityHigh, + IoPriorityCritical, + MaxIoPriorityTypes +} IO_PRIORITY_HINT; + #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 typedef NTSTATUS @@ -4155,7 +4984,6 @@ typedef struct _FILE_POSITION_INFORMATION { LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; -#include typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; @@ -4163,7 +4991,32 @@ typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER ChangeTime; ULONG FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; -#include + +typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION { + IO_PRIORITY_HINT PriorityHint; +} FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION; + +typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION { + ULONG Flags; +} FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION; + +typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION { + PUCHAR IoStatusBlockRange; + ULONG Length; +} FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION; + +typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION { + BOOLEAN IsRemote; +} FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION; + +typedef struct _FILE_NUMA_NODE_INFORMATION { + USHORT NodeNumber; +} FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION; + +typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION { + ULONG NumberOfProcessIdsInList; + ULONG_PTR ProcessIdList[1]; +} FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION; typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; @@ -4210,49 +5063,30 @@ typedef struct _FILE_FULL_EA_INFORMATION { CHAR EaName[1]; } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; +typedef struct _FILE_SFIO_RESERVE_INFORMATION { + ULONG RequestsPerPeriod; + ULONG Period; + BOOLEAN RetryFailures; + BOOLEAN Discardable; + ULONG RequestSize; + ULONG NumOutstandingRequests; +} FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION; + +typedef struct _FILE_SFIO_VOLUME_INFORMATION { + ULONG MaximumRequestsPerPeriod; + ULONG MinimumPeriod; + ULONG MinimumTransferSize; +} FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION; + +#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1 +#define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2 +#define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4 + #define FM_LOCK_BIT (0x1) #define FM_LOCK_BIT_V (0x0) #define FM_LOCK_WAITER_WOKEN (0x2) #define FM_LOCK_WAITER_INC (0x4) -typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; - -typedef struct _OWNER_ENTRY { - ERESOURCE_THREAD OwnerThread; - _ANONYMOUS_UNION union { - LONG OwnerCount; - ULONG TableSize; - } DUMMYUNIONNAME; -} OWNER_ENTRY, *POWNER_ENTRY; - -typedef struct _ERESOURCE -{ - LIST_ENTRY SystemResourcesList; - POWNER_ENTRY OwnerTable; - SHORT ActiveCount; - USHORT Flag; - volatile PKSEMAPHORE SharedWaiters; - volatile PKEVENT ExclusiveWaiters; - OWNER_ENTRY OwnerEntry; - ULONG ActiveEntries; - ULONG ContentionCount; - ULONG NumberOfSharedWaiters; - ULONG NumberOfExclusiveWaiters; - __GNU_EXTENSION union - { - PVOID Address; - ULONG_PTR CreatorBackTraceIndex; - }; - KSPIN_LOCK SpinLock; -} ERESOURCE, *PERESOURCE; - -/* ERESOURCE.Flag */ -#define ResourceNeverExclusive 0x0010 -#define ResourceReleaseByOtherThread 0x0020 -#define ResourceOwnedExclusive 0x0080 - -#define RESOURCE_HASH_TABLE_SIZE 64 - typedef BOOLEAN (NTAPI FAST_IO_CHECK_IF_POSSIBLE)( IN struct _FILE_OBJECT *FileObject, @@ -4796,6 +5630,12 @@ typedef struct _IO_ERROR_LOG_MESSAGE { #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \ IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) +#ifdef _WIN64 +#define PORT_MAXIMUM_MESSAGE_LENGTH 512 +#else +#define PORT_MAXIMUM_MESSAGE_LENGTH 256 +#endif + typedef enum _DMA_WIDTH { Width8Bits, Width16Bits, @@ -5252,12 +6092,6 @@ typedef NTSTATUS (NTAPI *PMM_DLL_UNLOAD)( VOID); -typedef BOOLEAN -(NTAPI KSERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext); -typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; - typedef VOID (NTAPI IO_TIMER_ROUTINE)( IN struct _DEVICE_OBJECT *DeviceObject, @@ -5341,12 +6175,135 @@ typedef enum _DEVICE_TEXT_TYPE { DeviceTextLocationInformation } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; -typedef enum _WORK_QUEUE_TYPE { - CriticalWorkQueue, - DelayedWorkQueue, - HyperCriticalWorkQueue, - MaximumWorkQueue -} WORK_QUEUE_TYPE; +typedef BOOLEAN +(NTAPI *PGPE_SERVICE_ROUTINE)( + PVOID, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_CONNECT_VECTOR)( + PDEVICE_OBJECT, + ULONG, + KINTERRUPT_MODE, + BOOLEAN, + PGPE_SERVICE_ROUTINE, + PVOID, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_DISCONNECT_VECTOR)( + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_ENABLE_EVENT)( + PDEVICE_OBJECT, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_DISABLE_EVENT)( + PDEVICE_OBJECT, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_CLEAR_STATUS)( + PDEVICE_OBJECT, + PVOID); + +typedef VOID +(NTAPI *PDEVICE_NOTIFY_CALLBACK)( + PVOID, + ULONG); + +typedef NTSTATUS +(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT, + PDEVICE_NOTIFY_CALLBACK, + PVOID); + +typedef VOID +(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT, + PDEVICE_NOTIFY_CALLBACK); + +typedef struct _ACPI_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR GpeConnectVector; + PGPE_DISCONNECT_VECTOR GpeDisconnectVector; + PGPE_ENABLE_EVENT GpeEnableEvent; + PGPE_DISABLE_EVENT GpeDisableEvent; + PGPE_CLEAR_STATUS GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; + +typedef BOOLEAN +(NTAPI *PGPE_SERVICE_ROUTINE2)( + PVOID ObjectContext, + PVOID ServiceContext); + +typedef NTSTATUS +(NTAPI *PGPE_CONNECT_VECTOR2)( + PVOID Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_DISCONNECT_VECTOR2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_ENABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_DISABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_CLEAR_STATUS2)( + PVOID Context, + PVOID ObjectContext); + +typedef VOID +(NTAPI *PDEVICE_NOTIFY_CALLBACK2)( + PVOID NotificationContext, + ULONG NotifyCode); + +typedef NTSTATUS +(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context, + PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, + PVOID NotificationContext); + +typedef VOID +(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context); + +typedef struct _ACPI_INTERFACE_STANDARD2 { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR2 GpeConnectVector; + PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; + PGPE_ENABLE_EVENT2 GpeEnableEvent; + PGPE_DISABLE_EVENT2 GpeDisableEvent; + PGPE_CLEAR_STATUS2 GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; #if !defined(_AMD64_) && !defined(_IA64_) #include @@ -5546,11 +6503,6 @@ typedef struct _IO_STACK_LOCATION { #define SL_INVOKE_ON_SUCCESS 0x40 #define SL_INVOKE_ON_ERROR 0x80 -/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ - -#define PCI_WHICHSPACE_CONFIG 0x0 -#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ - #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 @@ -5680,10 +6632,920 @@ typedef struct _IO_STACK_LOCATION { /* end winnt.h */ +#define WMIREG_ACTION_REGISTER 1 +#define WMIREG_ACTION_DEREGISTER 2 +#define WMIREG_ACTION_REREGISTER 3 +#define WMIREG_ACTION_UPDATE_GUIDS 4 +#define WMIREG_ACTION_BLOCK_IRPS 5 + +#define WMIREGISTER 0 +#define WMIUPDATE 1 + +typedef VOID +(NTAPI FWMI_NOTIFICATION_CALLBACK)( + PVOID Wnode, + PVOID Context); +typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK; + +#ifndef _PCI_X_ +#define _PCI_X_ + +typedef struct _PCI_SLOT_NUMBER { + union { + struct { + ULONG DeviceNumber:5; + ULONG FunctionNumber:3; + ULONG Reserved:24; + } bits; + ULONG AsULONG; + } u; +} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; + +#define PCI_TYPE0_ADDRESSES 6 +#define PCI_TYPE1_ADDRESSES 2 +#define PCI_TYPE2_ADDRESSES 5 + +typedef struct _PCI_COMMON_HEADER { + PCI_COMMON_HEADER_LAYOUT +} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; + +#ifdef __cplusplus +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER_LAYOUT + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#else +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER DUMMYSTRUCTNAME; + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#endif + +#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) + +#define PCI_EXTENDED_CONFIG_LENGTH 0x1000 + +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 +#define PCI_MAX_BRIDGE_NUMBER 0xFF +#define PCI_INVALID_VENDORID 0xFFFF + +/* PCI_COMMON_CONFIG.HeaderType */ +#define PCI_MULTIFUNCTION 0x80 +#define PCI_DEVICE_TYPE 0x00 +#define PCI_BRIDGE_TYPE 0x01 +#define PCI_CARDBUS_BRIDGE_TYPE 0x02 + +#define PCI_CONFIGURATION_TYPE(PciData) \ + (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) + +#define PCI_MULTIFUNCTION_DEVICE(PciData) \ + ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) + +/* PCI_COMMON_CONFIG.Command */ +#define PCI_ENABLE_IO_SPACE 0x0001 +#define PCI_ENABLE_MEMORY_SPACE 0x0002 +#define PCI_ENABLE_BUS_MASTER 0x0004 +#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 +#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 +#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 +#define PCI_ENABLE_PARITY 0x0040 +#define PCI_ENABLE_WAIT_CYCLE 0x0080 +#define PCI_ENABLE_SERR 0x0100 +#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 +#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 + +/* PCI_COMMON_CONFIG.Status */ +#define PCI_STATUS_INTERRUPT_PENDING 0x0008 +#define PCI_STATUS_CAPABILITIES_LIST 0x0010 +#define PCI_STATUS_66MHZ_CAPABLE 0x0020 +#define PCI_STATUS_UDF_SUPPORTED 0x0040 +#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 +#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 +#define PCI_STATUS_DEVSEL 0x0600 +#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 +#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 +#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 +#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 +#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 + +/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ + +#define PCI_WHICHSPACE_CONFIG 0x0 +#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ + +#define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01 +#define PCI_CAPABILITY_ID_AGP 0x02 +#define PCI_CAPABILITY_ID_VPD 0x03 +#define PCI_CAPABILITY_ID_SLOT_ID 0x04 +#define PCI_CAPABILITY_ID_MSI 0x05 +#define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06 +#define PCI_CAPABILITY_ID_PCIX 0x07 +#define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08 +#define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09 +#define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A +#define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B +#define PCI_CAPABILITY_ID_SHPC 0x0C +#define PCI_CAPABILITY_ID_P2P_SSID 0x0D +#define PCI_CAPABILITY_ID_AGP_TARGET 0x0E +#define PCI_CAPABILITY_ID_SECURE 0x0F +#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 +#define PCI_CAPABILITY_ID_MSIX 0x11 + +typedef struct _PCI_CAPABILITIES_HEADER { + UCHAR CapabilityID; + UCHAR Next; +} PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER; + +typedef struct _PCI_PMC { + UCHAR Version:3; + UCHAR PMEClock:1; + UCHAR Rsvd1:1; + UCHAR DeviceSpecificInitialization:1; + UCHAR Rsvd2:2; + struct _PM_SUPPORT { + UCHAR Rsvd2:1; + UCHAR D1:1; + UCHAR D2:1; + UCHAR PMED0:1; + UCHAR PMED1:1; + UCHAR PMED2:1; + UCHAR PMED3Hot:1; + UCHAR PMED3Cold:1; + } Support; +} PCI_PMC, *PPCI_PMC; + +typedef struct _PCI_PMCSR { + USHORT PowerState:2; + USHORT Rsvd1:6; + USHORT PMEEnable:1; + USHORT DataSelect:4; + USHORT DataScale:2; + USHORT PMEStatus:1; +} PCI_PMCSR, *PPCI_PMCSR; + +typedef struct _PCI_PMCSR_BSE { + UCHAR Rsvd1:6; + UCHAR D3HotSupportsStopClock:1; + UCHAR BusPowerClockControlEnabled:1; +} PCI_PMCSR_BSE, *PPCI_PMCSR_BSE; + +typedef struct _PCI_PM_CAPABILITY { + PCI_CAPABILITIES_HEADER Header; + union { + PCI_PMC Capabilities; + USHORT AsUSHORT; + } PMC; + union { + PCI_PMCSR ControlStatus; + USHORT AsUSHORT; + } PMCSR; + union { + PCI_PMCSR_BSE BridgeSupport; + UCHAR AsUCHAR; + } PMCSR_BSE; + UCHAR Data; +} PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY; + +typedef struct { + PCI_CAPABILITIES_HEADER Header; + union { + struct { + USHORT DataParityErrorRecoveryEnable:1; + USHORT EnableRelaxedOrdering:1; + USHORT MaxMemoryReadByteCount:2; + USHORT MaxOutstandingSplitTransactions:3; + USHORT Reserved:9; + } bits; + USHORT AsUSHORT; + } Command; + union { + struct { + ULONG FunctionNumber:3; + ULONG DeviceNumber:5; + ULONG BusNumber:8; + ULONG Device64Bit:1; + ULONG Capable133MHz:1; + ULONG SplitCompletionDiscarded:1; + ULONG UnexpectedSplitCompletion:1; + ULONG DeviceComplexity:1; + ULONG DesignedMaxMemoryReadByteCount:2; + ULONG DesignedMaxOutstandingSplitTransactions:3; + ULONG DesignedMaxCumulativeReadSize:3; + ULONG ReceivedSplitCompletionErrorMessage:1; + ULONG CapablePCIX266:1; + ULONG CapablePCIX533:1; + } bits; + ULONG AsULONG; + } Status; +} PCI_X_CAPABILITY, *PPCI_X_CAPABILITY; + +#define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001 +#define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002 +#define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003 +#define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004 +#define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005 +#define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006 +#define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007 +#define PCI_EXPRESS_MFVC_CAP_ID 0x0008 +#define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009 +#define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A +#define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010 + +typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER { + USHORT CapabilityID; + USHORT Version:4; + USHORT Next:12; +} PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER; + +typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + ULONG LowSerialNumber; + ULONG HighSerialNumber; +} PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY; + +typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS { + struct { + ULONG ReceiverError:1; + ULONG Reserved1:5; + ULONG BadTLP:1; + ULONG BadDLLP:1; + ULONG ReplayNumRollover:1; + ULONG Reserved2:3; + ULONG ReplayTimerTimeout:1; + ULONG AdvisoryNonFatalError:1; + ULONG Reserved3:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK { + struct { + ULONG ReceiverError:1; + ULONG Reserved1:5; + ULONG BadTLP:1; + ULONG BadDLLP:1; + ULONG ReplayNumRollover:1; + ULONG Reserved2:3; + ULONG ReplayTimerTimeout:1; + ULONG AdvisoryNonFatalError:1; + ULONG Reserved3:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_AER_CAPABILITIES { + struct { + ULONG FirstErrorPointer:5; + ULONG ECRCGenerationCapable:1; + ULONG ECRCGenerationEnable:1; + ULONG ECRCCheckCapable:1; + ULONG ECRCCheckEnable:1; + ULONG Reserved:23; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES; + +typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND { + struct { + ULONG CorrectableErrorReportingEnable:1; + ULONG NonFatalErrorReportingEnable:1; + ULONG FatalErrorReportingEnable:1; + ULONG Reserved:29; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND; + +typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS { + struct { + ULONG CorrectableErrorReceived:1; + ULONG MultipleCorrectableErrorsReceived:1; + ULONG UncorrectableErrorReceived:1; + ULONG MultipleUncorrectableErrorsReceived:1; + ULONG FirstUncorrectableFatal:1; + ULONG NonFatalErrorMessagesReceived:1; + ULONG FatalErrorMessagesReceived:1; + ULONG Reserved:20; + ULONG AdvancedErrorInterruptMessageNumber:5; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS; + +typedef union _PCI_EXPRESS_ERROR_SOURCE_ID { + struct { + USHORT CorrectableSourceIdFun:3; + USHORT CorrectableSourceIdDev:5; + USHORT CorrectableSourceIdBus:8; + USHORT UncorrectableSourceIdFun:3; + USHORT UncorrectableSourceIdDev:5; + USHORT UncorrectableSourceIdBus:8; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY; + +typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES { + struct { + ULONG SecondaryUncorrectableFirstErrorPtr:5; + ULONG Reserved:27; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES; + +#define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001 +#define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002 +#define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004 + +#define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \ + (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \ + ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \ + ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING) + +typedef struct _PCI_EXPRESS_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; + PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; + ULONG SecHeaderLog[4]; +} PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY; + +typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand; + PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus; + PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId; +} PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY; + +typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; + PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; + ULONG SecHeaderLog[4]; +} PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY; + +typedef union _PCI_EXPRESS_SRIOV_CAPS { + struct { + ULONG VFMigrationCapable:1; + ULONG Reserved1:20; + ULONG VFMigrationInterruptNumber:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS; + +typedef union _PCI_EXPRESS_SRIOV_CONTROL { + struct { + USHORT VFEnable:1; + USHORT VFMigrationEnable:1; + USHORT VFMigrationInterruptEnable:1; + USHORT VFMemorySpaceEnable:1; + USHORT ARICapableHierarchy:1; + USHORT Reserved1:11; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL; + +typedef union _PCI_EXPRESS_SRIOV_STATUS { + struct { + USHORT VFMigrationStatus:1; + USHORT Reserved1:15; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS; + +typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY { + struct { + ULONG VFMigrationStateBIR:3; + ULONG VFMigrationStateOffset:29; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY; + +typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities; + PCI_EXPRESS_SRIOV_CONTROL SRIOVControl; + PCI_EXPRESS_SRIOV_STATUS SRIOVStatus; + USHORT InitialVFs; + USHORT TotalVFs; + USHORT NumVFs; + UCHAR FunctionDependencyLink; + UCHAR RsvdP1; + USHORT FirstVFOffset; + USHORT VFStride; + USHORT RsvdP2; + USHORT VFDeviceId; + ULONG SupportedPageSizes; + ULONG SystemPageSize; + ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; + PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset; +} PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY; + +/* PCI device classes */ +#define PCI_CLASS_PRE_20 0x00 +#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 +#define PCI_CLASS_NETWORK_CTLR 0x02 +#define PCI_CLASS_DISPLAY_CTLR 0x03 +#define PCI_CLASS_MULTIMEDIA_DEV 0x04 +#define PCI_CLASS_MEMORY_CTLR 0x05 +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 +#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 +#define PCI_CLASS_INPUT_DEV 0x09 +#define PCI_CLASS_DOCKING_STATION 0x0a +#define PCI_CLASS_PROCESSOR 0x0b +#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c +#define PCI_CLASS_WIRELESS_CTLR 0x0d +#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e +#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f +#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 +#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 +#define PCI_CLASS_NOT_DEFINED 0xff + +/* PCI device subclasses for class 0 */ +#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 +#define PCI_SUBCLASS_PRE_20_VGA 0x01 + +/* PCI device subclasses for class 1 (mass storage controllers)*/ +#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 +#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 +#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 +#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 +#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 +#define PCI_SUBCLASS_MSC_OTHER 0x80 + +/* PCI device subclasses for class 2 (network controllers)*/ +#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 +#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 +#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 +#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 +#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 +#define PCI_SUBCLASS_NET_OTHER 0x80 + +/* PCI device subclasses for class 3 (display controllers)*/ +#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 +#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 +#define PCI_SUBCLASS_VID_3D_CTLR 0x02 +#define PCI_SUBCLASS_VID_OTHER 0x80 + +/* PCI device subclasses for class 4 (multimedia device)*/ +#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 +#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 +#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 +#define PCI_SUBCLASS_MM_OTHER 0x80 + +/* PCI device subclasses for class 5 (memory controller)*/ +#define PCI_SUBCLASS_MEM_RAM 0x00 +#define PCI_SUBCLASS_MEM_FLASH 0x01 +#define PCI_SUBCLASS_MEM_OTHER 0x80 + +/* PCI device subclasses for class 6 (bridge device)*/ +#define PCI_SUBCLASS_BR_HOST 0x00 +#define PCI_SUBCLASS_BR_ISA 0x01 +#define PCI_SUBCLASS_BR_EISA 0x02 +#define PCI_SUBCLASS_BR_MCA 0x03 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 +#define PCI_SUBCLASS_BR_PCMCIA 0x05 +#define PCI_SUBCLASS_BR_NUBUS 0x06 +#define PCI_SUBCLASS_BR_CARDBUS 0x07 +#define PCI_SUBCLASS_BR_RACEWAY 0x08 +#define PCI_SUBCLASS_BR_OTHER 0x80 + +#define PCI_SUBCLASS_COM_SERIAL 0x00 +#define PCI_SUBCLASS_COM_PARALLEL 0x01 +#define PCI_SUBCLASS_COM_MULTIPORT 0x02 +#define PCI_SUBCLASS_COM_MODEM 0x03 +#define PCI_SUBCLASS_COM_OTHER 0x80 + +#define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00 +#define PCI_SUBCLASS_SYS_DMA_CTLR 0x01 +#define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02 +#define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03 +#define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04 +#define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05 +#define PCI_SUBCLASS_SYS_OTHER 0x80 + +#define PCI_SUBCLASS_INP_KEYBOARD 0x00 +#define PCI_SUBCLASS_INP_DIGITIZER 0x01 +#define PCI_SUBCLASS_INP_MOUSE 0x02 +#define PCI_SUBCLASS_INP_SCANNER 0x03 +#define PCI_SUBCLASS_INP_GAMEPORT 0x04 +#define PCI_SUBCLASS_INP_OTHER 0x80 + +#define PCI_SUBCLASS_DOC_GENERIC 0x00 +#define PCI_SUBCLASS_DOC_OTHER 0x80 + +#define PCI_SUBCLASS_PROC_386 0x00 +#define PCI_SUBCLASS_PROC_486 0x01 +#define PCI_SUBCLASS_PROC_PENTIUM 0x02 +#define PCI_SUBCLASS_PROC_ALPHA 0x10 +#define PCI_SUBCLASS_PROC_POWERPC 0x20 +#define PCI_SUBCLASS_PROC_COPROCESSOR 0x40 + +/* PCI device subclasses for class C (serial bus controller)*/ +#define PCI_SUBCLASS_SB_IEEE1394 0x00 +#define PCI_SUBCLASS_SB_ACCESS 0x01 +#define PCI_SUBCLASS_SB_SSA 0x02 +#define PCI_SUBCLASS_SB_USB 0x03 +#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 +#define PCI_SUBCLASS_SB_SMBUS 0x05 + +#define PCI_SUBCLASS_WIRELESS_IRDA 0x00 +#define PCI_SUBCLASS_WIRELESS_CON_IR 0x01 +#define PCI_SUBCLASS_WIRELESS_RF 0x10 +#define PCI_SUBCLASS_WIRELESS_OTHER 0x80 + +#define PCI_SUBCLASS_INTIO_I2O 0x00 + +#define PCI_SUBCLASS_SAT_TV 0x01 +#define PCI_SUBCLASS_SAT_AUDIO 0x02 +#define PCI_SUBCLASS_SAT_VOICE 0x03 +#define PCI_SUBCLASS_SAT_DATA 0x04 + +#define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00 +#define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10 +#define PCI_SUBCLASS_CRYPTO_OTHER 0x80 + +#define PCI_SUBCLASS_DASP_DPIO 0x00 +#define PCI_SUBCLASS_DASP_OTHER 0x80 + +#define PCI_ADDRESS_IO_SPACE 0x00000001 +#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 +#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 +#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc +#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 +#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 + +#define PCI_TYPE_32BIT 0 +#define PCI_TYPE_20BIT 2 +#define PCI_TYPE_64BIT 4 + +#define PCI_ROMADDRESS_ENABLED 0x00000001 + +#endif /* _PCI_X_ */ + +#define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1 + +typedef NTSTATUS +(NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)( + IN OUT PVOID Context); +typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE; + +typedef NTSTATUS +(NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)( + IN OUT PVOID Context); +typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE; + +typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode; + PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode; +} PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE; + +#define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1 + +typedef ULONG +(NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)( + IN PVOID Context, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef ULONG +(NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)( + IN PVOID Context, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace; + PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace; +} PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE; + +#define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1 + +typedef NTSTATUS +(NTAPI PCI_MSIX_SET_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry, + IN ULONG MessageNumber); +typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_MASKUNMASK_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry); +typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_GET_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry, + OUT PULONG MessageNumber, + OUT PBOOLEAN Masked); +typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_GET_TABLE_SIZE)( + IN PVOID Context, + OUT PULONG TableSize); +typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE; + +typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_MSIX_SET_ENTRY SetTableEntry; + PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry; + PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry; + PPCI_MSIX_GET_ENTRY GetTableEntry; + PPCI_MSIX_GET_TABLE_SIZE GetTableSize; +} PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE; + +#define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \ + RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry) + /****************************************************************************** * Object Manager Types * ******************************************************************************/ +#define MAXIMUM_FILENAME_LENGTH 256 +#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') + +#define OBJECT_TYPE_CREATE 0x0001 +#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DIRECTORY_QUERY 0x0001 +#define DIRECTORY_TRAVERSE 0x0002 +#define DIRECTORY_CREATE_OBJECT 0x0004 +#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008 +#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) + +#define SYMBOLIC_LINK_QUERY 0x0001 +#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 + +#define OB_FLT_REGISTRATION_VERSION_0100 0x0100 +#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100 + +typedef ULONG OB_OPERATION; + +#define OB_OPERATION_HANDLE_CREATE 0x00000001 +#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002 + +typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION { + IN OUT ACCESS_MASK DesiredAccess; + IN ACCESS_MASK OriginalDesiredAccess; +} OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION; + +typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION { + IN OUT ACCESS_MASK DesiredAccess; + IN ACCESS_MASK OriginalDesiredAccess; + IN PVOID SourceProcess; + IN PVOID TargetProcess; +} OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION; + +typedef union _OB_PRE_OPERATION_PARAMETERS { + IN OUT OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation; + IN OUT OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; +} OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS; + +typedef struct _OB_PRE_OPERATION_INFORMATION { + IN OB_OPERATION Operation; + union { + IN ULONG Flags; + struct { + IN ULONG KernelHandle:1; + IN ULONG Reserved:31; + }; + }; + IN PVOID Object; + IN POBJECT_TYPE ObjectType; + OUT PVOID CallContext; + IN POB_PRE_OPERATION_PARAMETERS Parameters; +} OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION; + +typedef struct _OB_POST_CREATE_HANDLE_INFORMATION { + IN ACCESS_MASK GrantedAccess; +} OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION; + +typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION { + IN ACCESS_MASK GrantedAccess; +} OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION; + +typedef union _OB_POST_OPERATION_PARAMETERS { + IN OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation; + IN OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; +} OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS; + +typedef struct _OB_POST_OPERATION_INFORMATION { + IN OB_OPERATION Operation; + union { + IN ULONG Flags; + struct { + IN ULONG KernelHandle:1; + IN ULONG Reserved:31; + }; + }; + IN PVOID Object; + IN POBJECT_TYPE ObjectType; + IN PVOID CallContext; + IN NTSTATUS ReturnStatus; + IN POB_POST_OPERATION_PARAMETERS Parameters; +} OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION; + +typedef enum _OB_PREOP_CALLBACK_STATUS { + OB_PREOP_SUCCESS +} OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS; + +typedef OB_PREOP_CALLBACK_STATUS +(NTAPI *POB_PRE_OPERATION_CALLBACK)( + IN PVOID RegistrationContext, + IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation); + +typedef VOID +(NTAPI *POB_POST_OPERATION_CALLBACK)( + IN PVOID RegistrationContext, + IN POB_POST_OPERATION_INFORMATION OperationInformation); + +typedef struct _OB_OPERATION_REGISTRATION { + IN POBJECT_TYPE *ObjectType; + IN OB_OPERATION Operations; + IN POB_PRE_OPERATION_CALLBACK PreOperation; + IN POB_POST_OPERATION_CALLBACK PostOperation; +} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION; + +typedef struct _OB_CALLBACK_REGISTRATION { + IN USHORT Version; + IN USHORT OperationRegistrationCount; + IN UNICODE_STRING Altitude; + IN PVOID RegistrationContext; + IN OB_OPERATION_REGISTRATION *OperationRegistration; +} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION; + typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; @@ -5708,16 +7570,6 @@ extern POBJECT_TYPE NTSYSAPI PsProcessType; #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 -/* Process Qoutas */ -typedef struct _QUOTA_LIMITS { - SIZE_T PagedPoolLimit; - SIZE_T NonPagedPoolLimit; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - SIZE_T PagefileLimit; - LARGE_INTEGER TimeLimit; -} QUOTA_LIMITS, *PQUOTA_LIMITS; - /* Thread Access Rights */ #define THREAD_TERMINATE 0x0001 #define THREAD_SUSPEND_RESUME 0x0002 @@ -5742,18 +7594,76 @@ typedef struct _QUOTA_LIMITS { #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF) #endif -#define ES_SYSTEM_REQUIRED 0x00000001 -#define ES_DISPLAY_REQUIRED 0x00000002 -#define ES_USER_PRESENT 0x00000004 -#define ES_CONTINUOUS 0x80000000 - #define LOW_PRIORITY 0 #define LOW_REALTIME_PRIORITY 16 #define HIGH_PRIORITY 31 #define MAXIMUM_PRIORITY 32 -#ifdef _X86_ +/****************************************************************************** + * WMI Library Support Types * + ******************************************************************************/ + +#ifdef RUN_WPP +#include +#include +#endif + +#ifndef _TRACEHANDLE_DEFINED +#define _TRACEHANDLE_DEFINED +typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; +#endif + +#ifndef TRACE_INFORMATION_CLASS_DEFINE + +typedef struct _ETW_TRACE_SESSION_SETTINGS { + ULONG Version; + ULONG BufferSize; + ULONG MinimumBuffers; + ULONG MaximumBuffers; + ULONG LoggerMode; + ULONG FlushTimer; + ULONG FlushThreshold; + ULONG ClockType; +} ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS; + +typedef enum _TRACE_INFORMATION_CLASS { + TraceIdClass, + TraceHandleClass, + TraceEnableFlagsClass, + TraceEnableLevelClass, + GlobalLoggerHandleClass, + EventLoggerHandleClass, + AllLoggerHandlesClass, + TraceHandleByNameClass, + LoggerEventsLostClass, + TraceSessionSettingsClass, + LoggerEventsLoggedClass, + MaxTraceInformationClass +} TRACE_INFORMATION_CLASS; + +#endif /* TRACE_INFORMATION_CLASS_DEFINE */ + +#ifndef _ETW_KM_ +#define _ETW_KM_ +#endif + +#include + +typedef VOID +(NTAPI *PETWENABLECALLBACK)( + IN LPCGUID SourceId, + IN ULONG ControlCode, + IN UCHAR Level, + IN ULONGLONG MatchAnyKeyword, + IN ULONGLONG MatchAllKeyword, + IN PEVENT_FILTER_DESCRIPTOR FilterData OPTIONAL, + IN OUT PVOID CallbackContext OPTIONAL); + +#define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001 + + +#if defined(_M_IX86) /** Kernel definitions for x86 **/ /* Interrupt request levels */ @@ -5914,11 +7824,346 @@ _KeQueryTickCount( } #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) -#endif /* _X86_ */ +#elif defined(_M_AMD64) +/** Kernel definitions for AMD64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define CLOCK_LEVEL 13 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define POWER_LEVEL 14 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL +#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) +#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) +#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) +#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L + +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) + +#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) + + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; + +#define KeQueryInterruptTime() \ + (*(volatile ULONG64*)SharedInterruptTime) + +#define KeQuerySystemTime(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime + +#define KeQueryTickCount(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount + +#define KeGetDcacheFillSize() 1L + +#define YieldProcessor _mm_pause + +FORCEINLINE +KIRQL +KeGetCurrentIrql(VOID) +{ + return (KIRQL)__readcr8(); +} + +FORCEINLINE +VOID +KeLowerIrql(IN KIRQL NewIrql) +{ + //ASSERT(KeGetCurrentIrql() >= NewIrql); + __writecr8(NewIrql); +} + +FORCEINLINE +KIRQL +KfRaiseIrql(IN KIRQL NewIrql) +{ + KIRQL OldIrql; + + OldIrql = __readcr8(); + //ASSERT(OldIrql <= NewIrql); + __writecr8(NewIrql); + return OldIrql; +} +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +FORCEINLINE +KIRQL +KeRaiseIrqlToDpcLevel(VOID) +{ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +FORCEINLINE +KIRQL +KeRaiseIrqlToSynchLevel(VOID) +{ + return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 + } + +FORCEINLINE +PKTHREAD +KeGetCurrentThread(VOID) +{ + return (struct _KTHREAD *)__readgsqword(0x188); +} + +/* VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +/* x86 and x64 performs a 0x2C interrupt */ +#define DbgRaiseAssertionFailure __int2c + +#elif defined(_M_IA64) +/** Kernel definitions for IA64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMC_LEVEL 3 +#define DEVICE_LEVEL_BASE 4 +#define PC_LEVEL 12 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define CLOCK_LEVEL 13 +#define POWER_LEVEL 15 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) +extern volatile LARGE_INTEGER KeTickCount; + +#define PAUSE_PROCESSOR __yield(); + +FORCEINLINE +VOID +KeFlushWriteBuffer(VOID) +{ + __mf (); + return; +} + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + + +#elif defined(_M_PPC) + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef struct _KPCR_TIB { + PVOID ExceptionList; /* 00 */ + PVOID StackBase; /* 04 */ + PVOID StackLimit; /* 08 */ + PVOID SubSystemTib; /* 0C */ + _ANONYMOUS_UNION union { + PVOID FiberData; /* 10 */ + ULONG Version; /* 10 */ + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; /* 14 */ + struct _KPCR_TIB *Self; /* 18 */ +} KPCR_TIB, *PKPCR_TIB; /* 1C */ + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +typedef struct _KPCR { + KPCR_TIB Tib; /* 00 */ + struct _KPCR *Self; /* 1C */ + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IrrActive; /* 2C */ + ULONG IDR; /* 30 */ + PVOID KdVersionBlock; /* 34 */ + PUSHORT IDT; /* 38 */ + PUSHORT GDT; /* 3C */ + struct _KTSS *TSS; /* 40 */ + USHORT MajorVersion; /* 44 */ + USHORT MinorVersion; /* 46 */ + KAFFINITY SetMember; /* 48 */ + ULONG StallScaleFactor; /* 4C */ + UCHAR SpareUnused; /* 50 */ + UCHAR Number; /* 51 */ +} KPCR, *PKPCR; /* 54 */ + +#define KeGetPcr() PCR + +#define YieldProcessor() __asm__ __volatile__("nop"); + +FORCEINLINE +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + ULONG Number; + __asm__ __volatile__ ( + "lwz %0, %c1(12)\n" + : "=r" (Number) + : "i" (FIELD_OFFSET(KPCR, Number)) + ); + return Number; +} + +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + IN KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + IN KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + + +#elif defined(_M_MIPS) +#error MIPS Headers are totally incorrect + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + +#define PASSIVE_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define IPI_LEVEL 29 +#define HIGH_LEVEL 31 + +typedef struct _KPCR { + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IDR; /* 30 */ +} KPCR, *PKPCR; + +#define KeGetPcr() PCR + +typedef struct _KFLOATING_SAVE { +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +static __inline +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + return 0; +} + +#define YieldProcessor() __asm__ __volatile__("nop"); + +#define KeLowerIrql(a) KfLowerIrql(a) +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTKERNELAPI +VOID +NTAPI +KfLowerIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KfRaiseIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + +#elif defined(_M_ARM) +#include +#else +#error Unknown Architecture +#endif + +/****************************************************************************** + * Runtime Library Functions * + ******************************************************************************/ + + +#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) + +#define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } + FORCEINLINE VOID InitializeListHead( @@ -5927,34 +8172,6 @@ InitializeListHead( ListHead->Flink = ListHead->Blink = ListHead; } -FORCEINLINE -VOID -InsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldFlink; - OldFlink = ListHead->Flink; - Entry->Flink = OldFlink; - Entry->Blink = ListHead; - OldFlink->Blink = Entry; - ListHead->Flink = Entry; -} - -FORCEINLINE -VOID -InsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldBlink; - OldBlink = ListHead->Blink; - Entry->Flink = ListHead; - Entry->Blink = OldBlink; - OldBlink->Flink = Entry; - ListHead->Blink = Entry; -} - BOOLEAN FORCEINLINE IsListEmpty( @@ -5963,29 +8180,6 @@ IsListEmpty( return (BOOLEAN)(ListHead->Flink == ListHead); } -FORCEINLINE -PSINGLE_LIST_ENTRY -PopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead) -{ - PSINGLE_LIST_ENTRY FirstEntry; - FirstEntry = ListHead->Next; - if (FirstEntry != NULL) { - ListHead->Next = FirstEntry->Next; - } - return FirstEntry; -} - -FORCEINLINE -VOID -PushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY Entry) -{ - Entry->Next = ListHead->Next; - ListHead->Next = Entry; -} - FORCEINLINE BOOLEAN RemoveEntryList( @@ -6031,6 +8225,73 @@ RemoveTailList( return Entry; } +FORCEINLINE +VOID +InsertTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldBlink; + OldBlink = ListHead->Blink; + Entry->Flink = ListHead; + Entry->Blink = OldBlink; + OldBlink->Flink = Entry; + ListHead->Blink = Entry; +} + +FORCEINLINE +VOID +InsertHeadList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + OldFlink = ListHead->Flink; + Entry->Flink = OldFlink; + Entry->Blink = ListHead; + OldFlink->Blink = Entry; + ListHead->Flink = Entry; +} + +FORCEINLINE +VOID +AppendTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY ListToAppend) +{ + PLIST_ENTRY ListEnd = ListHead->Blink; + + ListHead->Blink->Flink = ListToAppend; + ListHead->Blink = ListToAppend->Blink; + ListToAppend->Blink->Flink = ListHead; + ListToAppend->Blink = ListEnd; +} + +FORCEINLINE +PSINGLE_LIST_ENTRY +PopEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead) +{ + PSINGLE_LIST_ENTRY FirstEntry; + FirstEntry = ListHead->Next; + if (FirstEntry != NULL) { + ListHead->Next = FirstEntry->Next; + } + return FirstEntry; +} + +FORCEINLINE +VOID +PushEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead, + IN OUT PSINGLE_LIST_ENTRY Entry) +{ + Entry->Next = ListHead->Next; + ListHead->Next = Entry; +} + +#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ + NTSYSAPI VOID NTAPI @@ -6391,15 +8652,6 @@ RtlFindSetBitsAndClear( IN ULONG NumberToFind, IN ULONG HintIndex); -NTSYSAPI -NTSTATUS -NTAPI -RtlHashUnicodeString( - IN CONST UNICODE_STRING *String, - IN BOOLEAN CaseInSensitive, - IN ULONG HashAlgorithm, - OUT PULONG HashValue); - NTSYSAPI VOID NTAPI @@ -6489,49 +8741,10 @@ RtlQueryRegistryValues( #define LONGLONG_MASK (LONGLONG_SIZE - 1) #define LOWBYTE_MASK 0x00FF -/* VOID - * RtlRetrieveUlong( - * PULONG DestinationAddress, - * PULONG SourceAddress); - */ -#if defined(_AMD64_) -#define RtlRetrieveUlong(DestAddress,SrcAddress) \ - *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress) -#else -#define RtlRetrieveUlong(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ - ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ - } \ - else \ - { \ - *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ - } -#endif - -/* VOID - * RtlRetrieveUshort( - * PUSHORT DestinationAddress, - * PUSHORT SourceAddress); - */ -#if defined(_AMD64_) -#define RtlRetrieveUshort(DestAddress,SrcAddress) \ - *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress) -#else -#define RtlRetrieveUshort(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - } \ - else \ - { \ - *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ - } -#endif +#define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK) +#define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK) +#define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK) +#define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK) NTSYSAPI VOID @@ -6610,17 +8823,7 @@ RtlSetDaclSecurityDescriptor( else { \ *((PULONG)(Address)) = (ULONG) (Value); \ } -#endif -/* VOID - * RtlStoreUlonglong( - * IN OUT PULONGLONG Address, - * ULONGLONG Value); - */ -#if defined(_AMD64_) -#define RtlStoreUlonglong(Address,Value) \ - *(ULONGLONG UNALIGNED *)(Address) = (Value) -#else #define RtlStoreUlonglong(Address,Value) \ if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \ RtlStoreUlong((ULONG_PTR)(Address), \ @@ -6630,30 +8833,7 @@ RtlSetDaclSecurityDescriptor( } else { \ *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \ } -#endif -/* VOID - * RtlStoreUlongPtr( - * IN OUT PULONG_PTR Address, - * IN ULONG_PTR Value); - */ -#ifdef _WIN64 -#define RtlStoreUlongPtr(Address,Value) \ - RtlStoreUlonglong(Address,Value) -#else -#define RtlStoreUlongPtr(Address,Value) \ - RtlStoreUlong(Address,Value) -#endif - -/* VOID - * RtlStoreUshort( - * IN PUSHORT Address, - * IN USHORT Value); - */ -#if defined(_AMD64_) -#define RtlStoreUshort(Address,Value) \ - *(USHORT UNALIGNED *)(Address) = (Value) -#else #define RtlStoreUshort(Address,Value) \ if ((ULONG_PTR)(Address) & SHORT_MASK) { \ ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \ @@ -6662,7 +8842,44 @@ RtlSetDaclSecurityDescriptor( else { \ *((PUSHORT) (Address)) = (USHORT)Value; \ } -#endif + +#define RtlRetrieveUshort(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + } \ + else \ + { \ + *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ + } + +#define RtlRetrieveUlong(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ + ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ + } \ + else \ + { \ + *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ + } + +#endif /* defined(_AMD64_) */ + +#ifdef _WIN64 +/* VOID + * RtlStoreUlongPtr( + * IN OUT PULONG_PTR Address, + * IN ULONG_PTR Value); + */ +#define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value) +#else +#define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value) +#endif /* _WIN64 */ + NTSYSAPI BOOLEAN @@ -6928,6 +9145,34 @@ RtlConvertUlongToLargeInteger( return ret; } +//DECLSPEC_DEPRECATED_DDK_WINXP +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerShiftLeft( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount) +{ + LARGE_INTEGER Result; + + Result.QuadPart = LargeInteger.QuadPart << ShiftCount; + return Result; +} + +//DECLSPEC_DEPRECATED_DDK_WINXP +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerShiftRight( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount) +{ + LARGE_INTEGER Result; + + Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount; + return Result; +} + //DECLSPEC_DEPRECATED_DDK static __inline ULONG @@ -6942,6 +9187,33 @@ RtlEnlargedUnsignedDivide( return (ULONG)(Dividend.QuadPart / Divisor); } +//DECLSPEC_DEPRECATED_DDK +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerNegate( + IN LARGE_INTEGER Subtrahend) +{ + LARGE_INTEGER Difference; + + Difference.QuadPart = -Subtrahend.QuadPart; + return Difference; +} + +//DECLSPEC_DEPRECATED_DDK +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerSubtract( + IN LARGE_INTEGER Minuend, + IN LARGE_INTEGER Subtrahend) +{ + LARGE_INTEGER Difference; + + Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart; + return Difference; +} + //DECLSPEC_DEPRECATED_DDK static __inline LARGE_INTEGER @@ -7220,6 +9492,10 @@ RtlCheckBit( (__annotation(L"Debug", L"AssertFail", msg), \ DbgRaiseAssertionFailure(), FALSE) : TRUE) +#define NT_VERIFY NT_ASSERT +#define NT_VERIFYMSG NT_ASSERTMSG +#define NT_VERIFYMSGW NT_ASSERTMSGW + #else /* GCC doesn't support __annotation (nor PDB) */ @@ -7246,8 +9522,8 @@ RtlCheckBit( #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) #define NT_ASSERT(exp) ((VOID)0) -#define NT_ASSERTMSG(exp) ((VOID)0) -#define NT_ASSERTMSGW(exp) ((VOID)0) +#define NT_ASSERTMSG(msg, exp) ((VOID)0) +#define NT_ASSERTMSGW(msg, exp) ((VOID)0) #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE) #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE) @@ -7334,16 +9610,61 @@ InterlockedPushEntrySList( #endif /* !defined(_WINBASE_) */ +#define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset) +#define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length) +#define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \ + ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk))) +#define RTL_CONTEXT_OFFSET(Context, Chunk) \ + RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk) +#define RTL_CONTEXT_LENGTH(Context, Chunk) \ + RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk) +#define RTL_CONTEXT_CHUNK(Context, Chunk) \ + RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \ + (PCONTEXT_EX)(Context + 1), \ + Chunk) + +BOOLEAN +RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)( + IN ULONG Version); + +BOOLEAN +RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( + IN ULONG Version); + +#ifndef RtlIsNtDdiVersionAvailable +#define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable +#endif + +#ifndef RtlIsServicePackVersionInstalled +#define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled +#endif + +#define RtlInterlockedSetBits(Flags, Flag) \ + InterlockedOr((PLONG)(Flags), Flag) + +#define RtlInterlockedAndBits(Flags, Flag) \ + InterlockedAnd((PLONG)(Flags), Flag) + +#define RtlInterlockedClearBits(Flags, Flag) \ + RtlInterlockedAndBits(Flags, ~(Flag)) + +#define RtlInterlockedXorBits(Flags, Flag) \ + InterlockedXor(Flags, Flag) + +#define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \ + (VOID) RtlInterlockedSetBits(Flags, Flag) + +#define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \ + (VOID) RtlInterlockedAndBits(Flags, Flag) + +#define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \ + RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag)) + + /****************************************************************************** * Kernel Functions * ******************************************************************************/ -NTHALAPI -KIRQL -NTAPI -KeGetCurrentIrql( - VOID); - NTKERNELAPI VOID NTAPI @@ -8230,6 +10551,22 @@ KeFlushWriteBuffer(VOID); #define ALIGN_UP_POINTER(ptr, type) \ ALIGN_UP_POINTER_BY(ptr, sizeof(type)) +#ifndef FIELD_OFFSET +#define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field)) +#endif + +#ifndef FIELD_SIZE +#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) +#endif + +#define POOL_TAGGING 1 + +#if DBG +#define IF_DEBUG if (TRUE) +#else +#define IF_DEBUG if (FALSE) +#endif /* DBG */ + /* ULONG * BYTE_OFFSET( * IN PVOID Va) @@ -8242,7 +10579,7 @@ KeFlushWriteBuffer(VOID); * IN ULONG Size) */ #define BYTES_TO_PAGES(Size) \ - (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) + (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT) /* PVOID * PAGE_ALIGN( @@ -8536,7 +10873,16 @@ MmUnmapLockedPages( IN PVOID BaseAddress, IN PMDL MemoryDescriptorList); - +NTKERNELAPI +PVOID +NTAPI +MmAllocateContiguousMemorySpecifyCacheNode( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS LowestAcceptableAddress, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType, + IN NODE_REQUIREMENT PreferredNode); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -8593,6 +10939,22 @@ MmUnmapReservedMapping( IN ULONG PoolTag, IN PMDL MemoryDescriptorList); +NTKERNELAPI +NTSTATUS +NTAPI +MmAddVerifierThunks( + IN PVOID ThunkBuffer, + IN ULONG ThunkBufferSize); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WS03) +NTKERNELAPI +LOGICAL +NTAPI +MmIsIoSpaceActive( + IN PHYSICAL_ADDRESS StartAddress, + IN SIZE_T NumberOfBytes); #endif #if (NTDDI_VERSION >= NTDDI_WS03SP1) @@ -8821,6 +11183,40 @@ CmGetBoundTransaction( * I/O Manager Functions * ******************************************************************************/ + +/* + * NTSTATUS + * IoAcquireRemoveLock( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN OPTIONAL PVOID Tag) + */ +#if DBG +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) +#else +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) +#endif + +/* + * VOID + * IoAdjustPagingPathCount( + * IN PLONG Count, + * IN BOOLEAN Increment) + */ +#define IoAdjustPagingPathCount(_Count, \ + _Increment) \ +{ \ + if (_Increment) \ + { \ + InterlockedIncrement(_Count); \ + } \ + else \ + { \ + InterlockedDecrement(_Count); \ + } \ +} + #if !defined(_M_AMD64) NTHALAPI VOID @@ -9347,43 +11743,6 @@ IoAcquireRemoveLockEx( IN PCSTR File, IN ULONG Line, IN ULONG RemlockSize); -#endif - -/* - * NTSTATUS - * IoAcquireRemoveLock( - * IN PIO_REMOVE_LOCK RemoveLock, - * IN OPTIONAL PVOID Tag) - */ -#if DBG -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) -#else -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) -#endif - -/* - * VOID - * IoAdjustPagingPathCount( - * IN PLONG Count, - * IN BOOLEAN Increment) - */ -#define IoAdjustPagingPathCount(_Count, \ - _Increment) \ -{ \ - if (_Increment) \ - { \ - InterlockedIncrement(_Count); \ - } \ - else \ - { \ - InterlockedDecrement(_Count); \ - } \ -} - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - NTKERNELAPI NTSTATUS NTAPI @@ -10179,9 +12538,237 @@ IoWMISetSingleItem( IN ULONG Version, IN ULONG ValueBufferSize, IN PVOID ValueBuffer); +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ +#if (NTDDI_VERSION >= NTDDI_WINXPSP1) +NTKERNELAPI +NTSTATUS +NTAPI +IoValidateDeviceIoControlAccess( + IN PIRP Irp, + IN ULONG RequiredAccess); #endif +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTKERNELAPI +NTSTATUS +NTAPI +IoCsqInitializeEx( + IN PIO_CSQ Csq, + IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp, + IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp, + IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, + IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, + IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock, + IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCsqInsertIrpEx( + IN PIO_CSQ Csq, + IN PIRP Irp, + IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL, + IN PVOID InsertContext OPTIONAL); +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetBootDiskInformationLite( + OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckShareAccessEx( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess, + IN BOOLEAN Update, + IN PBOOLEAN WritePermission); + +NTKERNELAPI +NTSTATUS +NTAPI +IoConnectInterruptEx( + IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); + +NTKERNELAPI +VOID +NTAPI +IoDisconnectInterruptEx( + IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); + +LOGICAL +NTAPI +IoWithinStackLimits( + IN ULONG_PTR RegionStart, + IN SIZE_T RegionSize); + +NTKERNELAPI +VOID +NTAPI +IoSetShareAccessEx( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + OUT PSHARE_ACCESS ShareAccess, + IN PBOOLEAN WritePermission); + +ULONG +NTAPI +IoSizeofWorkItem(VOID); + +VOID +NTAPI +IoInitializeWorkItem( + IN PVOID IoObject, + IN PIO_WORKITEM IoWorkItem); + +VOID +NTAPI +IoUninitializeWorkItem( + IN PIO_WORKITEM IoWorkItem); + +VOID +NTAPI +IoQueueWorkItemEx( + IN PIO_WORKITEM IoWorkItem, + IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine, + IN WORK_QUEUE_TYPE QueueType, + IN PVOID Context OPTIONAL); + +IO_PRIORITY_HINT +NTAPI +IoGetIoPriorityHint( + IN PIRP Irp); + +NTSTATUS +NTAPI +IoSetIoPriorityHint( + IN PIRP Irp, + IN IO_PRIORITY_HINT PriorityHint); + +NTSTATUS +NTAPI +IoAllocateSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN ULONG Length, + IN PVOID Signature, + OUT PVOID *StreamIdentifier); + +PVOID +NTAPI +IoGetSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN PVOID Signature); + +NTSTATUS +NTAPI +IoFreeSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN PVOID Signature); + +NTKERNELAPI +NTSTATUS +NTAPI +IoRequestDeviceEjectEx( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL, + IN PVOID Context OPTIONAL, + IN PDRIVER_OBJECT DriverObject OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetDevicePropertyData( + IN PDEVICE_OBJECT Pdo, + IN CONST DEVPROPKEY *PropertyKey, + IN LCID Lcid, + IN ULONG Flags, + IN DEVPROPTYPE Type, + IN ULONG Size, + IN PVOID Data OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDevicePropertyData( + PDEVICE_OBJECT Pdo, + CONST DEVPROPKEY *PropertyKey, + LCID Lcid, + ULONG Flags, + ULONG Size, + PVOID Data, + PULONG RequiredSize, + PDEVPROPTYPE Type); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b) + +#if (NTDDI_VERSION >= NTDDI_WS08) +NTKERNELAPI +NTSTATUS +NTAPI +IoReplacePartitionUnit( + IN PDEVICE_OBJECT TargetPdo, + IN PDEVICE_OBJECT SparePdo, + IN ULONG Flags); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetAffinityInterrupt( + IN PKINTERRUPT InterruptObject, + OUT PGROUP_AFFINITY GroupAffinity); + +NTSTATUS +NTAPI +IoGetContainerInformation( + IN IO_CONTAINER_INFORMATION_CLASS InformationClass, + IN PVOID ContainerObject OPTIONAL, + IN OUT PVOID Buffer OPTIONAL, + IN ULONG BufferLength); + +NTSTATUS +NTAPI +IoRegisterContainerNotification( + IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass, + IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction, + IN PVOID NotificationInformation OPTIONAL, + IN ULONG NotificationInformationLength, + OUT PVOID CallbackRegistration); + +VOID +NTAPI +IoUnregisterContainerNotification( + IN PVOID CallbackRegistration); + +NTKERNELAPI +NTSTATUS +NTAPI +IoUnregisterPlugPlayNotificationEx( + IN PVOID NotificationEntry); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDeviceNumaNode( + IN PDEVICE_OBJECT Pdo, + OUT PUSHORT NodeNumber); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + #if defined(_WIN64) NTKERNELAPI ULONG @@ -10602,12 +13189,57 @@ PoCreatePowerRequest( #define ExInitializeSListHead InitializeSListHead -#if defined(_X86_) -#if defined(_NTHAL_) +#if defined(_NTHAL_) && defined(_X86_) + +NTKERNELAPI +VOID +FASTCALL +ExiAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +VOID +FASTCALL +ExiReleaseFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExiTryToAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + #define ExAcquireFastMutex ExiAcquireFastMutex #define ExReleaseFastMutex ExiReleaseFastMutex #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex -#endif + +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +FASTCALL +ExAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExTryToAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#endif /* defined(_NTHAL_) && defined(_X86_) */ + +#if defined(_X86_) #define ExInterlockedAddUlong ExfInterlockedAddUlong #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList #define ExInterlockedInsertTailList ExfInterlockedInsertTailList @@ -10665,6 +13297,8 @@ FASTCALL ExInterlockedFlushSList( IN OUT PSLIST_HEADER ListHead); +#endif /* !defined(_WIN64) */ + #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) NTKERNELAPI @@ -10681,20 +13315,70 @@ ExInterlockedPushEntrySList( IN PSLIST_HEADER ListHead, IN PSINGLE_LIST_ENTRY ListEntry, IN PKSPIN_LOCK Lock); -#else + +NTKERNELAPI +PVOID +NTAPI +ExAllocateFromPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside); + +NTKERNELAPI +VOID +NTAPI +ExFreeToPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry); + +#else /* !_WIN2K_COMPAT_SLIST_USAGE */ + +#if !defined(_WIN64) #define ExInterlockedPopEntrySList(_ListHead, _Lock) \ InterlockedPopEntrySList(_ListHead) #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \ InterlockedPushEntrySList(_ListHead, _ListEntry) -#endif // _WIN2K_COMPAT_SLIST_USAGE +#endif + +static __inline +PVOID +ExAllocateFromPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside) +{ + PVOID Entry; + + Lookaside->L.TotalAllocates++; + Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); + if (Entry == NULL) { + Lookaside->L.AllocateMisses++; + Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, + Lookaside->L.Size, + Lookaside->L.Tag); + } + return Entry; +} + +static __inline +VOID +ExFreeToPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry) +{ + Lookaside->L.TotalFrees++; + if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { + Lookaside->L.FreeMisses++; + (Lookaside->L.Free)(Entry); + } else { + InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); + } +} + +#endif /* _WIN2K_COMPAT_SLIST_USAGE */ -#endif // !defined(_WIN64) /* ERESOURCE_THREAD * ExGetCurrentResourceThread( * VOID); */ -#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread()) +#define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread()) #define ExReleaseResource(R) (ExReleaseResourceLite(R)) @@ -10725,24 +13409,6 @@ ExInitializeFastMutex( #if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -VOID -FASTCALL -ExAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - NTKERNELAPI VOID FASTCALL @@ -10790,10 +13456,6 @@ ExAllocatePool( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); -#ifdef POOL_TAGGING -#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') -#endif /* POOL_TAGGING */ - NTKERNELAPI PVOID NTAPI @@ -10801,10 +13463,6 @@ ExAllocatePoolWithQuota( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); -#ifdef POOL_TAGGING -#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') -#endif /* POOL_TAGGING */ - NTKERNELAPI PVOID NTAPI @@ -10825,6 +13483,10 @@ ExAllocatePoolWithTag( IN SIZE_T NumberOfBytes, IN ULONG Tag); +#ifndef POOL_TAGGING +#define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) +#endif + NTKERNELAPI PVOID NTAPI @@ -10873,10 +13535,6 @@ NTAPI ExFreePool( IN PVOID P); -#ifdef POOL_TAGGING -#define ExFreePool(P) ExFreePoolWithTag(P, 0) -#endif - NTKERNELAPI VOID NTAPI @@ -11304,35 +13962,83 @@ ExInitializeLookasideListEx( IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth); -#endif -#if !defined(MIDL_PASS) +NTKERNELAPI +VOID +NTAPI +ExDeleteLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside); -static __inline PVOID -ExAllocateFromNPagedLookasideList( - IN PNPAGED_LOOKASIDE_LIST Lookaside) +NTKERNELAPI +VOID +NTAPI +ExFlushLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside); + +FORCEINLINE +PVOID +ExAllocateFromLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates += 1; Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); if (Entry == NULL) { - Lookaside->L.AllocateMisses++; - Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, + Lookaside->L.AllocateMisses += 1; + Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type, Lookaside->L.Size, - Lookaside->L.Tag); + Lookaside->L.Tag, + Lookaside); } return Entry; } +FORCEINLINE +VOID +ExFreeToLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside, + IN PVOID Entry) +{ + Lookaside->L.TotalFrees += 1; + if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { + Lookaside->L.FreeMisses += 1; + (Lookaside->L.FreeEx)(Entry, Lookaside); + } else { + InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); + } + return; +} + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +VOID +NTAPI +ExSetResourceOwnerPointerEx( + IN OUT PERESOURCE Resource, + IN PVOID OwnerPointer, + IN ULONG Flags); + +#define FLAG_OWNER_POINTER_IS_THREAD 0x1 + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + static __inline PVOID -ExAllocateFromPagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside) +ExAllocateFromNPagedLookasideList( + IN OUT PNPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates++; +#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) + Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead, + &Lookaside->Lock__ObsoleteButDoNotDelete); +#else Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); +#endif if (Entry == NULL) { Lookaside->L.AllocateMisses++; Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, @@ -11352,25 +14058,16 @@ ExFreeToNPagedLookasideList( Lookaside->L.FreeMisses++; (Lookaside->L.Free)(Entry); } else { +#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) + ExInterlockedPushEntrySList(&Lookaside->L.ListHead, + (PSLIST_ENTRY)Entry, + &Lookaside->Lock__ObsoleteButDoNotDelete); +#else InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); +#endif } } -static __inline VOID -ExFreeToPagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) -{ - Lookaside->L.TotalFrees++; - if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { - Lookaside->L.FreeMisses++; - (Lookaside->L.Free)(Entry); - } else { - InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); - } -} - -#endif // !defined(MIDL_PASS) /****************************************************************************** * Object Manager Functions * @@ -11606,8 +14303,115 @@ WmiTraceMessageVa( IN va_list MessageArgList); #endif +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#ifndef TRACE_INFORMATION_CLASS_DEFINE + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +NTSTATUS +NTAPI +WmiQueryTraceInformation( + IN TRACE_INFORMATION_CLASS TraceInformationClass, + OUT PVOID TraceInformation, + IN ULONG TraceInformationLength, + OUT PULONG RequiredLength OPTIONAL, + IN PVOID Buffer OPTIONAL); #endif +#define TRACE_INFORMATION_CLASS_DEFINE + +#endif /* TRACE_INFOPRMATION_CLASS_DEFINE */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSTATUS +NTKERNELAPI +NTAPI +EtwRegister( + IN LPCGUID ProviderId, + IN PETWENABLECALLBACK EnableCallback OPTIONAL, + IN PVOID CallbackContext OPTIONAL, + OUT PREGHANDLE RegHandle); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwUnregister( + IN REGHANDLE RegHandle); + +BOOLEAN +NTKERNELAPI +NTAPI +EtwEventEnabled( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor); + +BOOLEAN +NTKERNELAPI +NTAPI +EtwProviderEnabled( + IN REGHANDLE RegHandle, + IN UCHAR Level, + IN ULONGLONG Keyword); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwActivityIdControl( + IN ULONG ControlCode, + IN OUT LPGUID ActivityId); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWrite( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN LPCGUID ActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteTransfer( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN LPCGUID ActivityId OPTIONAL, + IN LPCGUID RelatedActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteString( + IN REGHANDLE RegHandle, + IN UCHAR Level, + IN ULONGLONG Keyword, + IN LPCGUID ActivityId OPTIONAL, + IN PCWSTR String); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteEx( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN ULONG64 Filter, + IN ULONG Flags, + IN LPCGUID ActivityId OPTIONAL, + IN LPCGUID RelatedActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); +#endif + + + /****************************************************************************** * Kernel Debugger Functions * ******************************************************************************/ @@ -11619,8 +14423,86 @@ __cdecl DbgPrint( IN PCSTR Format, IN ...); + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +ULONG +__cdecl +DbgPrintReturnControlC( + IN PCCH Format, + IN ...); #endif +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +__cdecl +DbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCSTR Format, + IN ...); + +#ifdef _VA_LIST_DEFINED + +NTSYSAPI +ULONG +NTAPI +vDbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +NTSYSAPI +ULONG +NTAPI +vDbgPrintExWithPrefix( + IN PCCH Prefix, + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +#endif /* _VA_LIST_DEFINED */ + +NTSYSAPI +NTSTATUS +NTAPI +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef VOID +(*PDEBUG_PRINT_CALLBACK)( + IN PSTRING Output, + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugPrintCallback( + IN PDEBUG_PRINT_CALLBACK DebugPrintCallback, + IN BOOLEAN Enable); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#endif /* _DBGNT_ */ + #if DBG #define KdPrint(_x_) DbgPrint _x_ @@ -11664,31 +14546,6 @@ extern BOOLEAN KdDebuggerEnabled; #endif -#ifdef _VA_LIST_DEFINED -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -ULONG -NTAPI -vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -NTSYSAPI -ULONG -NTAPI -vDbgPrintExWithPrefix( - IN PCCH Prefix, - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -#endif -#endif // _VA_LIST_DEFINED - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -11715,42 +14572,7 @@ NTAPI DbgBreakPointWithStatus( IN ULONG Status); -NTSYSAPI -ULONG -_cdecl -DbgPrintReturnControlC( - IN PCCH Format, - IN ...); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -ULONG -_cdecl -DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCSTR Format, - IN ...); - -NTSYSAPI -NTSTATUS -NTAPI -DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level); - -NTSYSAPI -NTSTATUS -NTAPI -DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOLEAN State); - -#endif +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WS03) NTKERNELAPI @@ -11771,6 +14593,9 @@ KdChangeOption( OUT PVOID OutBuffer, OUT PULONG OutBufferNeeded OPTIONAL); #endif +/* Hardware Abstraction Layer Functions */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) @@ -11824,14 +14649,224 @@ HalReadDmaCounter( return counter; } -#endif +FORCEINLINE +ULONG +HalGetDmaAlignment( + IN PDMA_ADAPTER DmaAdapter) +{ + PGET_DMA_ALIGNMENT getDmaAlignment; + ULONG alignment; + getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment; + ASSERT( getDmaAlignment != NULL ); + alignment = getDmaAlignment( DmaAdapter ); + return alignment; +} + +#endif /* USE_DMA_MACROS ... */ +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #ifndef _NTTMAPI_ #define _NTTMAPI_ #include +#define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001) +#define TRANSACTIONMANAGER_SET_INFORMATION (0x0002) +#define TRANSACTIONMANAGER_RECOVER (0x0004) +#define TRANSACTIONMANAGER_RENAME (0x0008) +#define TRANSACTIONMANAGER_CREATE_RM (0x0010) +#define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020) + +#define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ + TRANSACTIONMANAGER_QUERY_INFORMATION) + +#define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + TRANSACTIONMANAGER_SET_INFORMATION |\ + TRANSACTIONMANAGER_RECOVER |\ + TRANSACTIONMANAGER_RENAME |\ + TRANSACTIONMANAGER_CREATE_RM) + +#define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE) + +#define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TRANSACTIONMANAGER_GENERIC_READ |\ + TRANSACTIONMANAGER_GENERIC_WRITE |\ + TRANSACTIONMANAGER_GENERIC_EXECUTE |\ + TRANSACTIONMANAGER_BIND_TRANSACTION) + +#define TRANSACTION_QUERY_INFORMATION (0x0001) +#define TRANSACTION_SET_INFORMATION (0x0002) +#define TRANSACTION_ENLIST (0x0004) +#define TRANSACTION_COMMIT (0x0008) +#define TRANSACTION_ROLLBACK (0x0010) +#define TRANSACTION_PROPAGATE (0x0020) +#define TRANSACTION_RIGHT_RESERVED1 (0x0040) + +#define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\ + TRANSACTION_QUERY_INFORMATION |\ + SYNCHRONIZE) + +#define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + TRANSACTION_SET_INFORMATION |\ + TRANSACTION_COMMIT |\ + TRANSACTION_ENLIST |\ + TRANSACTION_ROLLBACK |\ + TRANSACTION_PROPAGATE |\ + SYNCHRONIZE) + +#define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + TRANSACTION_COMMIT |\ + TRANSACTION_ROLLBACK |\ + SYNCHRONIZE) + +#define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TRANSACTION_GENERIC_READ |\ + TRANSACTION_GENERIC_WRITE |\ + TRANSACTION_GENERIC_EXECUTE) + +#define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\ + STANDARD_RIGHTS_WRITE |\ + TRANSACTION_SET_INFORMATION |\ + TRANSACTION_ENLIST |\ + TRANSACTION_ROLLBACK |\ + TRANSACTION_PROPAGATE |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_QUERY_INFORMATION (0x0001) +#define RESOURCEMANAGER_SET_INFORMATION (0x0002) +#define RESOURCEMANAGER_RECOVER (0x0004) +#define RESOURCEMANAGER_ENLIST (0x0008) +#define RESOURCEMANAGER_GET_NOTIFICATION (0x0010) +#define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020) +#define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040) + +#define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ + RESOURCEMANAGER_QUERY_INFORMATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + RESOURCEMANAGER_SET_INFORMATION |\ + RESOURCEMANAGER_RECOVER |\ + RESOURCEMANAGER_ENLIST |\ + RESOURCEMANAGER_GET_NOTIFICATION |\ + RESOURCEMANAGER_REGISTER_PROTOCOL |\ + RESOURCEMANAGER_COMPLETE_PROPAGATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + RESOURCEMANAGER_RECOVER |\ + RESOURCEMANAGER_ENLIST |\ + RESOURCEMANAGER_GET_NOTIFICATION |\ + RESOURCEMANAGER_COMPLETE_PROPAGATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + RESOURCEMANAGER_GENERIC_READ |\ + RESOURCEMANAGER_GENERIC_WRITE |\ + RESOURCEMANAGER_GENERIC_EXECUTE) + +#define ENLISTMENT_QUERY_INFORMATION (0x0001) +#define ENLISTMENT_SET_INFORMATION (0x0002) +#define ENLISTMENT_RECOVER (0x0004) +#define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008) +#define ENLISTMENT_SUPERIOR_RIGHTS (0x0010) + +#define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\ + ENLISTMENT_QUERY_INFORMATION) + +#define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + ENLISTMENT_SET_INFORMATION |\ + ENLISTMENT_RECOVER |\ + ENLISTMENT_SUBORDINATE_RIGHTS |\ + ENLISTMENT_SUPERIOR_RIGHTS) + +#define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + ENLISTMENT_RECOVER |\ + ENLISTMENT_SUBORDINATE_RIGHTS |\ + ENLISTMENT_SUPERIOR_RIGHTS) + +#define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + ENLISTMENT_GENERIC_READ |\ + ENLISTMENT_GENERIC_WRITE |\ + ENLISTMENT_GENERIC_EXECUTE) + +typedef enum _TRANSACTION_OUTCOME { + TransactionOutcomeUndetermined = 1, + TransactionOutcomeCommitted, + TransactionOutcomeAborted, +} TRANSACTION_OUTCOME; + + +typedef enum _TRANSACTION_STATE { + TransactionStateNormal = 1, + TransactionStateIndoubt, + TransactionStateCommittedNotify, +} TRANSACTION_STATE; + + +typedef struct _TRANSACTION_BASIC_INFORMATION { + GUID TransactionId; + ULONG State; + ULONG Outcome; +} TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION { + GUID TmIdentity; + LARGE_INTEGER VirtualClock; +} TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION { + GUID LogIdentity; +} TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION { + ULONG LogPathLength; + WCHAR LogPath[1]; +} TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION { + ULONGLONG LastRecoveredLsn; +} TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION; + +typedef struct _TRANSACTION_PROPERTIES_INFORMATION { + ULONG IsolationLevel; + ULONG IsolationFlags; + LARGE_INTEGER Timeout; + ULONG Outcome; + ULONG DescriptionLength; + WCHAR Description[1]; +} TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION; + +typedef struct _TRANSACTION_BIND_INFORMATION { + HANDLE TmHandle; +} TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION; + +typedef struct _TRANSACTION_ENLISTMENT_PAIR { + GUID EnlistmentId; + GUID ResourceManagerId; +} TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR; + +typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION { + ULONG NumberOfEnlistments; + TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; +} TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION; + +typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION { + TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair; +} TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION; + +typedef struct _RESOURCEMANAGER_BASIC_INFORMATION { + GUID ResourceManagerId; + ULONG DescriptionLength; + WCHAR Description[1]; +} RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION; + +typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION { + HANDLE IoCompletionPortHandle; + ULONG_PTR CompletionKey; +} RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION; + typedef enum _KTMOBJECT_TYPE { KTMOBJECT_TRANSACTION, KTMOBJECT_TRANSACTION_MANAGER, @@ -11865,12 +14900,421 @@ typedef enum _RESOURCEMANAGER_INFORMATION_CLASS { ResourceManagerCompletionInformation, } RESOURCEMANAGER_INFORMATION_CLASS; +typedef struct _ENLISTMENT_BASIC_INFORMATION { + GUID EnlistmentId; + GUID TransactionId; + GUID ResourceManagerId; +} ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION; + +typedef struct _ENLISTMENT_CRM_INFORMATION { + GUID CrmTransactionManagerId; + GUID CrmResourceManagerId; + GUID CrmEnlistmentId; +} ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION; + typedef enum _ENLISTMENT_INFORMATION_CLASS { EnlistmentBasicInformation, EnlistmentRecoveryInformation, EnlistmentCrmInformation } ENLISTMENT_INFORMATION_CLASS; +typedef struct _TRANSACTION_LIST_ENTRY { +#if defined(__cplusplus) + ::UOW UOW; +#else + UOW UOW; +#endif +} TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY; + +typedef struct _TRANSACTION_LIST_INFORMATION { + ULONG NumberOfTransactions; + TRANSACTION_LIST_ENTRY TransactionInformation[1]; +} TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION; + +typedef NTSTATUS +(NTAPI *PFN_NT_CREATE_TRANSACTION)( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG IsolationLevel OPTIONAL, + IN ULONG IsolationFlags OPTIONAL, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_OPEN_TRANSACTION)( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + OUT PVOID TransactionInformation, + IN ULONG TransactionInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + IN PVOID TransactionInformation, + IN ULONG TransactionInformationLength); + +typedef NTSTATUS +(NTAPI *PFN_NT_COMMIT_TRANSACTION)( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +typedef NTSTATUS +(NTAPI *PFN_NT_ROLLBACK_TRANSACTION)( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateTransactionManager( + OUT PHANDLE TmHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PUNICODE_STRING LogFileName OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG CommitStrength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenTransactionManager( + OUT PHANDLE TmHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PUNICODE_STRING LogFileName OPTIONAL, + IN LPGUID TmIdentity OPTIONAL, + IN ULONG OpenOptions OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRenameTransactionManager( + IN PUNICODE_STRING LogFileName, + IN LPGUID ExistingTransactionManagerGuid); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollforwardTransactionManager( + IN HANDLE TransactionManagerHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverTransactionManager( + IN HANDLE TransactionManagerHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationTransactionManager( + IN HANDLE TransactionManagerHandle, + IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + OUT PVOID TransactionManagerInformation, + IN ULONG TransactionManagerInformationLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationTransactionManager( + IN HANDLE TmHandle OPTIONAL, + IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + IN PVOID TransactionManagerInformation, + IN ULONG TransactionManagerInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtEnumerateTransactionObject( + IN HANDLE RootObjectHandle OPTIONAL, + IN KTMOBJECT_TYPE QueryType, + IN OUT PKTMOBJECT_CURSOR ObjectCursor, + IN ULONG ObjectCursorLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateTransaction( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG IsolationLevel OPTIONAL, + IN ULONG IsolationFlags OPTIONAL, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenTransaction( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN LPGUID Uow, + IN HANDLE TmHandle OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationTransaction( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + OUT PVOID TransactionInformation, + IN ULONG TransactionInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationTransaction( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + IN PVOID TransactionInformation, + IN ULONG TransactionInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitTransaction( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackTransaction( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateEnlistment( + OUT PHANDLE EnlistmentHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE ResourceManagerHandle, + IN HANDLE TransactionHandle, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN NOTIFICATION_MASK NotificationMask, + IN PVOID EnlistmentKey OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenEnlistment( + OUT PHANDLE EnlistmentHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE ResourceManagerHandle, + IN LPGUID EnlistmentGuid, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationEnlistment( + IN HANDLE EnlistmentHandle, + IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + OUT PVOID EnlistmentInformation, + IN ULONG EnlistmentInformationLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationEnlistment( + IN HANDLE EnlistmentHandle OPTIONAL, + IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + IN PVOID EnlistmentInformation, + IN ULONG EnlistmentInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverEnlistment( + IN HANDLE EnlistmentHandle, + IN PVOID EnlistmentKey OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrePrepareEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrepareEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrePrepareComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrepareComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtReadOnlyEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSinglePhaseReject( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateResourceManager( + OUT PHANDLE ResourceManagerHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE TmHandle, + IN LPGUID RmGuid, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenResourceManager( + OUT PHANDLE ResourceManagerHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE TmHandle, + IN LPGUID ResourceManagerGuid OPTIONAL, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverResourceManager( + IN HANDLE ResourceManagerHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtGetNotificationResourceManager( + IN HANDLE ResourceManagerHandle, + OUT PTRANSACTION_NOTIFICATION TransactionNotification, + IN ULONG NotificationLength, + IN PLARGE_INTEGER Timeout OPTIONAL, + OUT PULONG ReturnLength OPTIONAL, + IN ULONG Asynchronous, + IN ULONG_PTR AsynchronousContext OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationResourceManager( + IN HANDLE ResourceManagerHandle, + IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + OUT PVOID ResourceManagerInformation, + IN ULONG ResourceManagerInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationResourceManager( + IN HANDLE ResourceManagerHandle, + IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + IN PVOID ResourceManagerInformation, + IN ULONG ResourceManagerInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRegisterProtocolAddressInformation( + IN HANDLE ResourceManager, + IN PCRM_PROTOCOL_ID ProtocolId, + IN ULONG ProtocolInformationSize, + IN PVOID ProtocolInformation, + IN ULONG CreateOptions OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPropagationComplete( + IN HANDLE ResourceManagerHandle, + IN ULONG RequestCookie, + IN ULONG BufferLength, + IN PVOID Buffer); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPropagationFailed( + IN HANDLE ResourceManagerHandle, + IN ULONG RequestCookie, + IN NTSTATUS PropStatus); + +#endif /* NTDDI_VERSION >= NTDDI_VISTA */ + #endif /* !_NTTMAPI_ */ /****************************************************************************** * ZwXxx Functions * @@ -12562,74 +16006,8 @@ ZwSetInformationKey( IN PVOID KeySetInformation, IN ULONG KeySetInformationLength); -#endif - -/****************************************************************************** - * Unsorted * - ******************************************************************************/ - -/* GUID Comparison */ -#ifndef __IID_ALIGNED__ -#define __IID_ALIGNED__ -#ifdef __cplusplus -inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) -{ - return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && - (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); -} -#else -#define IsEqualGUIDAligned(guid1, guid2) \ - ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ - (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) -#endif /* __cplusplus */ -#endif /* !__IID_ALIGNED__ */ - -typedef enum { - LT_DONT_CARE, - LT_LOWEST_LATENCY -} LATENCY_TIME; - -#define MAXIMUM_SUSPEND_COUNT MAXCHAR - -#define MAXIMUM_FILENAME_LENGTH 256 - -#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') - -#define OBJECT_TYPE_CREATE (0x0001) -#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DIRECTORY_QUERY (0x0001) -#define DIRECTORY_TRAVERSE (0x0002) -#define DIRECTORY_CREATE_OBJECT (0x0004) -#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) -#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) - -#define EVENT_QUERY_STATE (0x0001) -#define EVENT_MODIFY_STATE (0x0002) -#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -#define SYMBOLIC_LINK_QUERY 0x0001 -#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DUPLICATE_CLOSE_SOURCE 0x00000001 -#define DUPLICATE_SAME_ACCESS 0x00000002 -#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 - -/* Global debug flag */ -extern ULONG NtGlobalFlag; - -/* Service Start Types */ -#define SERVICE_BOOT_START 0x00000000 -#define SERVICE_SYSTEM_START 0x00000001 -#define SERVICE_AUTO_START 0x00000002 -#define SERVICE_DEMAND_START 0x00000003 -#define SERVICE_DISABLED 0x00000004 - -#ifndef _TRACEHANDLE_DEFINED -#define _TRACEHANDLE_DEFINED -typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; -#endif +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ #ifdef __cplusplus From 73b2dc431790f3a3064965c3769efab8157a0483 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 21 Apr 2010 14:06:01 +0000 Subject: [PATCH 169/261] [NTOS]: Enable MmPageEntireDriver by implementing MiSetPagingOfDriver. [NTOS]: Call MiEnablePagingOfDriver from MmLoadSystemImage and implement it. All the work is done other than actually enabling paging, which requires system working set support. [NTOS]: Implement MiWriteProtectSystemImage and MiComputeDriverProtection. All the work is done other than actually setting the bits on the pages, since I wanted to avoid too many changes. [NTOS]: MmCheckSystemImage returns STATUS_INVALID_IMAGE_PROTECT, not STATUS_INVALID_IMAGE_FORMAT, so the branch in MmLoadSystemImage needs to check for the correct status code. [NTOS]: Support FLG_SHOW_LDR_SNAPS for the kernel loader. svn path=/trunk/; revision=46977 --- reactos/ntoskrnl/mm/sysldr.c | 425 +++++++++++++++++++++++++++++++++-- 1 file changed, 408 insertions(+), 17 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 36b3ce5a8fc..34a91b4b860 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -39,10 +39,10 @@ ERESOURCE PsLoadedModuleResource; ULONG_PTR PsNtosImageBase; KMUTANT MmSystemLoadLock; +PFN_NUMBER MmTotalSystemDriverPages; + PVOID MmUnloadedDrivers; PVOID MmLastUnloadedDrivers; -PVOID MmTriageActionTaken; -PVOID KernelVerifier; BOOLEAN MmMakeLowMemory; BOOLEAN MmEnforceWriteProtection = TRUE; @@ -1468,6 +1468,374 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) return TRUE; } +ULONG +NTAPI +MiComputeDriverProtection(IN BOOLEAN SessionSpace, + IN ULONG SectionProtection) +{ + ULONG Protection = MM_ZERO_ACCESS; + + /* Check if the caller gave anything */ + if (SectionProtection) + { + /* Always turn on execute access */ + SectionProtection |= IMAGE_SCN_MEM_EXECUTE; + + /* Check if the registry setting is on or not */ + if (!MmEnforceWriteProtection) + { + /* Turn on write access too */ + SectionProtection |= (IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_EXECUTE); + } + } + + /* Convert to internal PTE flags */ + if (SectionProtection & IMAGE_SCN_MEM_EXECUTE) Protection |= MM_EXECUTE; + if (SectionProtection & IMAGE_SCN_MEM_READ) Protection |= MM_READONLY; + + /* Check for write access */ + if (SectionProtection & IMAGE_SCN_MEM_WRITE) + { + /* Session space is not supported */ + if (SessionSpace) + { + DPRINT1("Session drivers not supported\n"); + ASSERT(SessionSpace == FALSE); + } + else + { + /* Convert to internal PTE flag */ + Protection = (Protection & MM_EXECUTE) ? MM_EXECUTE_READWRITE : MM_READWRITE; + } + } + + /* If there's no access at all by now, convert to internal no access flag */ + if (Protection == MM_ZERO_ACCESS) Protection = MM_NOACCESS; + + /* Return the computed PTE protection */ + return Protection; +} + +VOID +NTAPI +MiSetSystemCodeProtection(IN PMMPTE FirstPte, + IN PMMPTE LastPte, + IN ULONG ProtectionMask) +{ + /* I'm afraid to introduce regressions at the moment... */ + return; +} + +VOID +NTAPI +MiWriteProtectSystemImage(IN PVOID ImageBase) +{ + PIMAGE_NT_HEADERS NtHeaders; + PIMAGE_SECTION_HEADER Section; + PFN_NUMBER DriverPages; + ULONG CurrentProtection, SectionProtection, CombinedProtection, ProtectionMask; + ULONG Sections, Size; + ULONG_PTR BaseAddress, CurrentAddress; + PMMPTE PointerPte, StartPte, LastPte, CurrentPte, ComboPte = NULL; + ULONG CurrentMask, CombinedMask = 0; + PAGED_CODE(); + + /* No need to write protect physical memory-backed drivers (large pages) */ + if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; + + /* Get the image headers */ + NtHeaders = RtlImageNtHeader(ImageBase); + if (!NtHeaders) return; + + /* Check if this is a session driver or not */ + if (!MI_IS_SESSION_ADDRESS(ImageBase)) + { + /* Don't touch NT4 drivers */ + if (NtHeaders->OptionalHeader.MajorOperatingSystemVersion < 5) return; + if (NtHeaders->OptionalHeader.MajorImageVersion < 5) return; + } + else + { + /* Not supported */ + DPRINT1("Session drivers not supported\n"); + ASSERT(FALSE); + } + + /* These are the only protection masks we care about */ + ProtectionMask = IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE; + + /* Calculate the number of pages this driver is occupying */ + DriverPages = BYTES_TO_PAGES(NtHeaders->OptionalHeader.SizeOfImage); + + /* Get the number of sections and the first section header */ + Sections = NtHeaders->FileHeader.NumberOfSections; + ASSERT(Sections != 0); + Section = IMAGE_FIRST_SECTION(NtHeaders); + + /* Loop all the sections */ + CurrentAddress = (ULONG_PTR)ImageBase; + while (Sections) + { + /* Get the section size */ + Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); + + /* Get its virtual address */ + BaseAddress = (ULONG_PTR)ImageBase + Section->VirtualAddress; + if (BaseAddress < CurrentAddress) + { + /* Windows doesn't like these */ + DPRINT1("Badly linked image!\n"); + return; + } + + /* Remember the current address */ + CurrentAddress = BaseAddress + Size - 1; + + /* Next */ + Sections--; + Section++; + } + + /* Get the number of sections and the first section header */ + Sections = NtHeaders->FileHeader.NumberOfSections; + ASSERT(Sections != 0); + Section = IMAGE_FIRST_SECTION(NtHeaders); + + /* Set the address at the end to initialize the loop */ + CurrentAddress = (ULONG_PTR)Section + Sections - 1; + CurrentProtection = IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ; + + /* Set the PTE points for the image, and loop its sections */ + StartPte = MiAddressToPte(ImageBase); + LastPte = StartPte + DriverPages; + while (Sections) + { + /* Get the section size */ + Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); + + /* Get its virtual address and PTE */ + BaseAddress = (ULONG_PTR)ImageBase + Section->VirtualAddress; + PointerPte = MiAddressToPte(BaseAddress); + + /* Check if we were already protecting a run, and found a new run */ + if ((ComboPte) && (PointerPte > ComboPte)) + { + /* Compute protection */ + CombinedMask = MiComputeDriverProtection(FALSE, CombinedProtection); + + /* Set it */ + MiSetSystemCodeProtection(ComboPte, ComboPte, CombinedMask); + + /* Check for overlap */ + if (ComboPte == StartPte) StartPte++; + + /* One done, reset variables */ + ComboPte = NULL; + CombinedProtection = 0; + } + + /* Break out when needed */ + if (PointerPte >= LastPte) break; + + /* Get the requested protection from the image header */ + SectionProtection = Section->Characteristics & ProtectionMask; + if (SectionProtection == CurrentProtection) + { + /* Same protection, so merge the request */ + CurrentAddress = BaseAddress + Size - 1; + continue; + } + + /* This is now a new section, so close up the old one */ + CurrentPte = MiAddressToPte(CurrentAddress); + + /* Check for overlap */ + if (CurrentPte == PointerPte) + { + /* Skip the last PTE, since it overlaps with us */ + CurrentPte--; + + /* And set the PTE we will merge with */ + ASSERT((ComboPte == NULL) || (ComboPte == PointerPte)); + ComboPte = PointerPte; + + /* Get the most flexible protection by merging both */ + CombinedMask |= (SectionProtection | CurrentProtection); + } + + /* Loop any PTEs left */ + if (CurrentPte >= StartPte) + { + /* Sanity check */ + ASSERT(StartPte < LastPte); + + /* Make sure we don't overflow past the last PTE in the driver */ + if (CurrentPte >= LastPte) CurrentPte = LastPte - 1; + ASSERT(CurrentPte >= StartPte); + + /* Compute the protection and set it */ + CurrentMask = MiComputeDriverProtection(FALSE, CurrentProtection); + MiSetSystemCodeProtection(StartPte, CurrentPte, CurrentMask); + } + + /* Set new state */ + StartPte = PointerPte; + CurrentAddress = BaseAddress + Size - 1; + CurrentProtection = SectionProtection; + + /* Next */ + Sections--; + Section++; + } + + /* Is there a leftover section to merge? */ + if (ComboPte) + { + /* Compute and set the protection */ + CombinedMask = MiComputeDriverProtection(FALSE, CombinedProtection); + MiSetSystemCodeProtection(ComboPte, ComboPte, CombinedMask); + + /* Handle overlap */ + if (ComboPte == StartPte) StartPte++; + } + + /* Finally, handle the last section */ + CurrentPte = MiPteToAddress(CurrentAddress); + if ((StartPte < LastPte) && (CurrentPte >= StartPte)) + { + /* Handle overlap */ + if (CurrentPte >= LastPte) CurrentPte = LastPte - 1; + ASSERT(CurrentPte >= StartPte); + + /* Compute and set the protection */ + CurrentMask = MiComputeDriverProtection(FALSE, CurrentProtection); + MiSetSystemCodeProtection(StartPte, CurrentPte, CurrentMask); + } +} + +VOID +NTAPI +MiSetPagingOfDriver(IN PMMPTE PointerPte, + IN PMMPTE LastPte) +{ + PVOID ImageBase; + PETHREAD CurrentThread; + PFN_NUMBER PageCount = 0, PageFrameIndex; + PMMPFN Pfn1; + PAGED_CODE(); + + /* Get the driver's base address */ + ImageBase = MiPteToAddress(PointerPte); + ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(ImageBase) == FALSE); + + /* If this is a large page, it's stuck in physical memory */ + if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; + + /* We should lock the system working set -- we don't have one yet, so just be consistent */ + CurrentThread = PsGetCurrentThread(); + KeEnterGuardedRegion(); + ASSERT((CurrentThread->OwnsSystemWorkingSetExclusive == 0) && + (CurrentThread->OwnsSystemWorkingSetShared == 0)); + CurrentThread->OwnsSystemWorkingSetExclusive = 1; + + /* Loop the PTEs */ + while (PointerPte <= LastPte) + { + /* Check for valid PTE */ + if (PointerPte->u.Hard.Valid == 1) + { + PageFrameIndex = PFN_FROM_PTE(PointerPte); + Pfn1 = MiGetPfnEntry(PageFrameIndex); + ASSERT(Pfn1->u2.ShareCount == 1); + + /* No working sets in ReactOS yet */ + PageCount++; + } + + ImageBase = (PVOID)((ULONG_PTR)ImageBase + PAGE_SIZE); + PointerPte++; + } + + /* Release the working set "lock" */ + ASSERT(KeAreAllApcsDisabled() == TRUE); + CurrentThread->OwnsSystemWorkingSetExclusive = 0; + KeLeaveGuardedRegion(); + + /* Do we have any driver pages? */ + if (PageCount) + { + /* Update counters */ + InterlockedExchangeAdd((PLONG)&MmTotalSystemDriverPages, PageCount); + } +} + +VOID +NTAPI +MiEnablePagingOfDriver(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + ULONG_PTR ImageBase; + PIMAGE_NT_HEADERS NtHeaders; + ULONG Sections, Alignment, Size; + PIMAGE_SECTION_HEADER Section; + PMMPTE PointerPte = NULL, LastPte = NULL; + if (MmDisablePagingExecutive) return; + + /* Get the driver base address and its NT header */ + ImageBase = (ULONG_PTR)LdrEntry->DllBase; + NtHeaders = RtlImageNtHeader((PVOID)ImageBase); + if (!NtHeaders) return; + + /* Get the sections and their alignment */ + Sections = NtHeaders->FileHeader.NumberOfSections; + Alignment = NtHeaders->OptionalHeader.SectionAlignment - 1; + + /* Loop each section */ + Section = IMAGE_FIRST_SECTION(NtHeaders); + while (Sections) + { + /* Find PAGE or .edata */ + if ((*(PULONG)Section->Name == 'EGAP') || + (*(PULONG)Section->Name == 'ade.')) + { + /* Had we already done some work? */ + if (!PointerPte) + { + /* Nope, setup the first PTE address */ + PointerPte = MiAddressToPte(ROUND_TO_PAGES(ImageBase + + Section-> + VirtualAddress)); + } + + /* Compute the size */ + Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); + + /* Find the last PTE that maps this section */ + LastPte = MiAddressToPte(ImageBase + + Section->VirtualAddress + + Alignment + + Size - + PAGE_SIZE); + } + else + { + /* Had we found a section before? */ + if (PointerPte) + { + /* Mark it as pageable */ + MiSetPagingOfDriver(PointerPte, LastPte); + PointerPte = NULL; + } + } + + /* Keep searching */ + Sections--; + Section++; + } + + /* Handle the straggler */ + if (PointerPte) MiSetPagingOfDriver(PointerPte, LastPte); +} + BOOLEAN NTAPI MmVerifyImageIsOkForMpUse(IN PVOID BaseAddress) @@ -1590,7 +1958,7 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, UNICODE_STRING BaseName, BaseDirectory, PrefixName, UnicodeTemp; PLDR_DATA_TABLE_ENTRY LdrEntry = NULL; ULONG EntrySize, DriverSize; - PLOAD_IMPORTS LoadedImports = (PVOID)-2; + PLOAD_IMPORTS LoadedImports = MM_SYSLDR_NO_IMPORTS; PCHAR MissingApiName, Buffer; PWCHAR MissingDriverName; HANDLE SectionHandle; @@ -1614,7 +1982,7 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, } /* Allocate a buffer we'll use for names */ - Buffer = ExAllocatePoolWithTag(NonPagedPool, MAX_PATH, TAG_LDR_WSTR); + Buffer = ExAllocatePoolWithTag(NonPagedPool, MAX_PATH, 'nLmM'); if (!Buffer) return STATUS_INSUFFICIENT_RESOURCES; /* Check for a separator */ @@ -1658,6 +2026,14 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, /* Check if we already have a name, use it instead */ if (LoadedName) BaseName = *LoadedName; + + /* Check for loader snap debugging */ + if (NtGlobalFlag & FLG_SHOW_LDR_SNAPS) + { + /* Print out standard string */ + DPRINT1("MM:SYSLDR Loading %wZ (%wZ) %s\n", + &PrefixName, &BaseName, Flags ? "in session space" : ""); + } /* Acquire the load lock */ LoaderScan: @@ -1753,7 +2129,7 @@ LoaderScan: Status = MmCheckSystemImage(FileHandle, FALSE); if ((Status == STATUS_IMAGE_CHECKSUM_MISMATCH) || (Status == STATUS_IMAGE_MP_UP_MISMATCH) || - (Status == STATUS_INVALID_IMAGE_FORMAT)) + (Status == STATUS_INVALID_IMAGE_PROTECT)) { /* Fail loading */ goto Quickie; @@ -1832,16 +2208,22 @@ LoaderScan: /* Check for success */ if (NT_SUCCESS(Status)) { - /* FIXME: Support large pages for drivers */ + #if 0 + /* Support large pages for drivers */ + MiUseLargeDriverPage(DriverSize / PAGE_SIZE, + &ModuleLoadBase, + &BaseName, + TRUE); + #endif } /* Dereference the section */ ObDereferenceObject(Section); Section = NULL; } - - /* Get the NT Header */ - NtHeader = RtlImageNtHeader(ModuleLoadBase); + + /* Check for failure of the load earlier */ + if (!NT_SUCCESS(Status)) goto Quickie; /* Relocate the driver */ Status = LdrRelocateImageWithBias(ModuleLoadBase, @@ -1852,6 +2234,10 @@ LoaderScan: STATUS_INVALID_IMAGE_FORMAT); if (!NT_SUCCESS(Status)) goto Quickie; + + /* Get the NT Header */ + NtHeader = RtlImageNtHeader(ModuleLoadBase); + /* Calculate the size we'll need for the entry and allocate it */ EntrySize = sizeof(LDR_DATA_TABLE_ENTRY) + BaseName.Length + @@ -1959,9 +2345,10 @@ LoaderScan: LdrEntry->Flags &= ~LDRP_LOAD_IN_PROGRESS; LdrEntry->LoadedImports = LoadedImports; - /* FIXME: Apply driver verifier */ + /* FIXME: Call driver verifier's loader function */ - /* FIXME: Write-protect the system image */ + /* Write-protect the system image */ + MiWriteProtectSystemImage(LdrEntry->DllBase); /* Check if notifications are enabled */ if (PsImageNotifyEnabled) @@ -2015,17 +2402,15 @@ LoaderScan: LdrEntry->Flags |= LDRP_DEBUG_SYMBOLS_LOADED; } - /* FIXME: Page the driver */ + /* Page the driver */ ASSERT(Section == NULL); + MiEnablePagingOfDriver(LdrEntry); /* Return pointers */ *ModuleObject = LdrEntry; *ImageBaseAddress = LdrEntry->DllBase; Quickie: - /* If we have a file handle, close it */ - if (FileHandle) ZwClose(FileHandle); - /* Check if we have the lock acquired */ if (LockOwned) { @@ -2035,6 +2420,9 @@ Quickie: LockOwned = FALSE; } + /* If we have a file handle, close it */ + if (FileHandle) ZwClose(FileHandle); + /* Check if we had a prefix */ if (NamePrefix) ExFreePool(PrefixName.Buffer); @@ -2078,6 +2466,8 @@ MiLookupDataTableEntry(IN PVOID Address) return FoundEntry; } +/* PUBLIC FUNCTIONS ***********************************************************/ + /* * @implemented */ @@ -2106,11 +2496,11 @@ MmPageEntireDriver(IN PVOID AddressWithinSection) /* Get the PTE range for the whole driver image */ StartPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase); EndPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage); -#if 0 + /* Enable paging for the PTE range */ ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(AddressWithinSection) == FALSE); MiSetPagingOfDriver(StartPte, EndPte); -#endif + /* Return the base address */ return LdrEntry->DllBase; } @@ -2124,6 +2514,7 @@ MmResetDriverPaging(IN PVOID AddressWithinSection) { UNIMPLEMENTED; } + /* * @implemented */ From 1400882dda593db400d7a16d6df7c9e991d34c8a Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 21 Apr 2010 14:14:45 +0000 Subject: [PATCH 170/261] [NTOS]: Support unload of system modules by parsing the LoadedImports (implement MiDereferenceImports which was just a stub) and calling MiCallDllUnloadAndUnloadDll. [NTOS]: Fix a bug in MiClearImports. svn path=/trunk/; revision=46978 --- reactos/ntoskrnl/mm/sysldr.c | 305 ++++++++++++++++++++++------------- 1 file changed, 191 insertions(+), 114 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 34a91b4b860..1b08c91f28d 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -191,120 +191,6 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr, return Status; } -NTSTATUS -NTAPI -MiDereferenceImports(IN PLOAD_IMPORTS ImportList) -{ - SIZE_T i; - - /* Check if there's no imports or if we're a boot driver */ - if ((ImportList == (PVOID)-1) || - (ImportList == (PVOID)-2) || - (ImportList->Count == 0)) - { - /* Then there's nothing to do */ - return STATUS_SUCCESS; - } - - /* Otherwise, FIXME */ - DPRINT1("%u imports not dereferenced!\n", ImportList->Count); - for (i = 0; i < ImportList->Count; i++) - { - DPRINT1("%wZ <%wZ>\n", &ImportList->Entry[i]->FullDllName, &ImportList->Entry[i]->BaseDllName); - } - return STATUS_UNSUCCESSFUL; -} - -VOID -NTAPI -MiClearImports(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - PAGED_CODE(); - - /* Check if there's no imports or we're a boot driver or only one entry */ - if ((LdrEntry->LoadedImports == (PVOID)-1) || - (LdrEntry->LoadedImports == (PVOID)-2) || - ((ULONG_PTR)LdrEntry->LoadedImports & 1)) - { - /* Nothing to do */ - return; - } - - /* Otherwise, free the import list */ - ExFreePool(LdrEntry->LoadedImports); -} - -PVOID -NTAPI -MiFindExportedRoutineByName(IN PVOID DllBase, - IN PANSI_STRING ExportName) -{ - PULONG NameTable; - PUSHORT OrdinalTable; - PIMAGE_EXPORT_DIRECTORY ExportDirectory; - LONG Low = 0, Mid = 0, High, Ret; - USHORT Ordinal; - PVOID Function; - ULONG ExportSize; - PULONG ExportTable; - PAGED_CODE(); - - /* Get the export directory */ - ExportDirectory = RtlImageDirectoryEntryToData(DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_EXPORT, - &ExportSize); - if (!ExportDirectory) return NULL; - - /* Setup name tables */ - NameTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNames); - OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNameOrdinals); - - /* Do a binary search */ - High = ExportDirectory->NumberOfNames - 1; - while (High >= Low) - { - /* Get new middle value */ - Mid = (Low + High) >> 1; - - /* Compare name */ - Ret = strcmp(ExportName->Buffer, (PCHAR)DllBase + NameTable[Mid]); - if (Ret < 0) - { - /* Update high */ - High = Mid - 1; - } - else if (Ret > 0) - { - /* Update low */ - Low = Mid + 1; - } - else - { - /* We got it */ - break; - } - } - - /* Check if we couldn't find it */ - if (High < Low) return NULL; - - /* Otherwise, this is the ordinal */ - Ordinal = OrdinalTable[Mid]; - - /* Resolve the address and write it */ - ExportTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfFunctions); - Function = (PVOID)((ULONG_PTR)DllBase + ExportTable[Ordinal]); - - /* We found it! */ - ASSERT(!(Function > (PVOID)ExportDirectory) && - (Function < (PVOID)((ULONG_PTR)ExportDirectory + ExportSize))); - return Function; -} - PVOID NTAPI MiLocateExportName(IN PVOID DllBase, @@ -443,6 +329,197 @@ MmCallDllInitialize(IN PLDR_DATA_TABLE_ENTRY LdrEntry, return Status; } +BOOLEAN +NTAPI +MiCallDllUnloadAndUnloadDll(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + NTSTATUS Status; + PMM_DLL_UNLOAD Func; + PAGED_CODE(); + + /* Get the unload routine */ + Func = (PMM_DLL_UNLOAD)MiLocateExportName(LdrEntry->DllBase, "DllUnload"); + if (!Func) return FALSE; + + /* Call it and check for success */ + Status = Func(); + if (!NT_SUCCESS(Status)) return FALSE; + + /* Lie about the load count so we can unload the image */ + ASSERT(LdrEntry->LoadCount == 0); + LdrEntry->LoadCount = 1; + + /* Unload it and return true */ + MmUnloadSystemImage(LdrEntry); + return TRUE; +} + +NTSTATUS +NTAPI +MiDereferenceImports(IN PLOAD_IMPORTS ImportList) +{ + SIZE_T i; + LOAD_IMPORTS SingleEntry; + PLDR_DATA_TABLE_ENTRY LdrEntry; + PVOID CurrentImports; + PAGED_CODE(); + + /* Check if there's no imports or if we're a boot driver */ + if ((ImportList == MM_SYSLDR_NO_IMPORTS) || + (ImportList == MM_SYSLDR_BOOT_LOADED) || + (ImportList->Count == 0)) + { + /* Then there's nothing to do */ + return STATUS_SUCCESS; + } + + /* Check for single-entry */ + if ((ULONG_PTR)ImportList & MM_SYSLDR_SINGLE_ENTRY) + { + /* Set it up */ + SingleEntry.Count = 1; + SingleEntry.Entry[0] = (PVOID)((ULONG_PTR)ImportList &~ MM_SYSLDR_SINGLE_ENTRY); + + /* Use this as the import list */ + ImportList = &SingleEntry; + } + + /* Loop the import list */ + for (i = 0; (i < ImportList->Count) && (ImportList->Entry[i]); i++) + { + /* Get the entry */ + LdrEntry = ImportList->Entry[i]; + DPRINT1("%wZ <%wZ>\n", &LdrEntry->FullDllName, &LdrEntry->BaseDllName); + + /* Skip boot loaded images */ + if (LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) continue; + + /* Dereference the entry */ + ASSERT(LdrEntry->LoadCount >= 1); + if (!--LdrEntry->LoadCount) + { + /* Save the import data in case unload fails */ + CurrentImports = LdrEntry->LoadedImports; + + /* This is the last entry */ + LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; + if (MiCallDllUnloadAndUnloadDll(LdrEntry)) + { + /* Unloading worked, parse this DLL's imports too */ + MiDereferenceImports(CurrentImports); + + /* Check if we had valid imports */ + if ((CurrentImports != MM_SYSLDR_BOOT_LOADED) || + (CurrentImports != MM_SYSLDR_NO_IMPORTS) || + !((ULONG_PTR)LdrEntry->LoadedImports & MM_SYSLDR_SINGLE_ENTRY)) + { + /* Free them */ + ExFreePool(CurrentImports); + } + } + else + { + /* Unload failed, restore imports */ + LdrEntry->LoadedImports = CurrentImports; + } + } + } + + /* Done */ + return STATUS_SUCCESS; +} + +VOID +NTAPI +MiClearImports(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + PAGED_CODE(); + + /* Check if there's no imports or we're a boot driver or only one entry */ + if ((LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) || + (LdrEntry->LoadedImports == MM_SYSLDR_NO_IMPORTS) || + ((ULONG_PTR)LdrEntry->LoadedImports & MM_SYSLDR_SINGLE_ENTRY)) + { + /* Nothing to do */ + return; + } + + /* Otherwise, free the import list */ + ExFreePool(LdrEntry->LoadedImports); + LdrEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; +} + +PVOID +NTAPI +MiFindExportedRoutineByName(IN PVOID DllBase, + IN PANSI_STRING ExportName) +{ + PULONG NameTable; + PUSHORT OrdinalTable; + PIMAGE_EXPORT_DIRECTORY ExportDirectory; + LONG Low = 0, Mid = 0, High, Ret; + USHORT Ordinal; + PVOID Function; + ULONG ExportSize; + PULONG ExportTable; + PAGED_CODE(); + + /* Get the export directory */ + ExportDirectory = RtlImageDirectoryEntryToData(DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_EXPORT, + &ExportSize); + if (!ExportDirectory) return NULL; + + /* Setup name tables */ + NameTable = (PULONG)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfNames); + OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfNameOrdinals); + + /* Do a binary search */ + High = ExportDirectory->NumberOfNames - 1; + while (High >= Low) + { + /* Get new middle value */ + Mid = (Low + High) >> 1; + + /* Compare name */ + Ret = strcmp(ExportName->Buffer, (PCHAR)DllBase + NameTable[Mid]); + if (Ret < 0) + { + /* Update high */ + High = Mid - 1; + } + else if (Ret > 0) + { + /* Update low */ + Low = Mid + 1; + } + else + { + /* We got it */ + break; + } + } + + /* Check if we couldn't find it */ + if (High < Low) return NULL; + + /* Otherwise, this is the ordinal */ + Ordinal = OrdinalTable[Mid]; + + /* Resolve the address and write it */ + ExportTable = (PULONG)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfFunctions); + Function = (PVOID)((ULONG_PTR)DllBase + ExportTable[Ordinal]); + + /* We found it! */ + ASSERT(!(Function > (PVOID)ExportDirectory) && + (Function < (PVOID)((ULONG_PTR)ExportDirectory + ExportSize))); + return Function; +} + VOID NTAPI MiProcessLoaderEntry(IN PLDR_DATA_TABLE_ENTRY LdrEntry, From e20b4df9ef767ba35b0a9af27ed843347c4a4dc3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Apr 2010 15:15:57 +0000 Subject: [PATCH 172/261] [WIN32K] Update text and background brush properly. Fixes wrong colors in radio buttons in Firefox. Fix by Jerome Gardou. See issue #5311 for more details. svn path=/trunk/; revision=46980 --- reactos/subsystems/win32/win32k/objects/dcobjs.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index e35fa717bdd..e18eb61bbc3 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -110,6 +110,9 @@ DC_vUpdateTextBrush(PDC pdc) { PDC_ATTR pdcattr = pdc->pdcattr; + if(pdcattr->ulDirty_ & DIRTY_TEXT) + EBRUSHOBJ_vUpdate(&pdc->eboText, pdc->eboText.pbrush, pdc); + /* Update the eboText's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboText, pdcattr->crForegroundClr); @@ -123,6 +126,9 @@ DC_vUpdateBackgroundBrush(PDC pdc) { PDC_ATTR pdcattr = pdc->pdcattr; + if(pdcattr->ulDirty_ & DIRTY_BACKGROUND) + EBRUSHOBJ_vUpdate(&pdc->eboBackground, pdc->eboBackground.pbrush, pdc); + /* Update the eboBackground's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboBackground, pdcattr->crBackgroundClr); From 577625f6f8dcc2bb20a2e00a24b5ebd3a5a94dea Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 21 Apr 2010 20:35:09 +0000 Subject: [PATCH 173/261] [WINESYNC] - Sync comdlg32, crypt32, gdiplus, inetcomm, jscript, msctf, mshtml, msxml3, rsaenh, schannel, shlwapi, urlmon, usp10, wininet winetests. svn path=/trunk/; revision=46982 --- rostests/winetests/comdlg32/comdlg32.rbuild | 2 + rostests/winetests/comdlg32/filedlg.c | 766 ++++++- rostests/winetests/comdlg32/fontdlg.c | 150 ++ rostests/winetests/comdlg32/printdlg.c | 21 +- rostests/winetests/comdlg32/rsrc.rc | 25 + rostests/winetests/crypt32/chain.c | 22 +- rostests/winetests/crypt32/main.c | 6 +- rostests/winetests/crypt32/msg.c | 2 +- rostests/winetests/gdiplus/brush.c | 56 + rostests/winetests/gdiplus/font.c | 79 +- rostests/winetests/gdiplus/graphics.c | 384 +++- rostests/winetests/gdiplus/image.c | 134 +- rostests/winetests/inetcomm/mimeintl.c | 2 +- rostests/winetests/jscript/regexp.js | 40 + rostests/winetests/msctf/inputprocessor.c | 2125 +++++++++++++------ rostests/winetests/mshtml/dom.c | 14 +- rostests/winetests/mshtml/events.c | 109 +- rostests/winetests/mshtml/jstest.html | 18 + rostests/winetests/mshtml/script.c | 10 + rostests/winetests/msxml3/domdoc.c | 22 + rostests/winetests/rsaenh/rsaenh.c | 242 ++- rostests/winetests/schannel/main.c | 35 +- rostests/winetests/shlwapi/generated.c | 115 +- rostests/winetests/shlwapi/istream.c | 34 +- rostests/winetests/shlwapi/ordinal.c | 1043 ++++++++- rostests/winetests/shlwapi/path.c | 100 +- rostests/winetests/shlwapi/shlwapi.rbuild | 3 +- rostests/winetests/shlwapi/string.c | 27 + rostests/winetests/shlwapi/url.c | 73 +- rostests/winetests/urlmon/generated.c | 322 ++- rostests/winetests/urlmon/misc.c | 18 +- rostests/winetests/urlmon/sec_mgr.c | 48 +- rostests/winetests/urlmon/url.c | 2 +- rostests/winetests/usp10/usp10.c | 543 ++++- rostests/winetests/wininet/ftp.c | 120 +- rostests/winetests/wininet/generated.c | 1373 +++++++++++- rostests/winetests/wininet/http.c | 412 +++- rostests/winetests/wininet/internet.c | 303 ++- rostests/winetests/wininet/url.c | 245 ++- rostests/winetests/wininet/urlcache.c | 95 +- rostests/winetests/wininet/wininet.rbuild | 3 +- 41 files changed, 7905 insertions(+), 1238 deletions(-) create mode 100644 rostests/winetests/comdlg32/fontdlg.c diff --git a/rostests/winetests/comdlg32/comdlg32.rbuild b/rostests/winetests/comdlg32/comdlg32.rbuild index d24dc1bd3c8..2d5dec28046 100644 --- a/rostests/winetests/comdlg32/comdlg32.rbuild +++ b/rostests/winetests/comdlg32/comdlg32.rbuild @@ -5,11 +5,13 @@ . filedlg.c + fontdlg.c printdlg.c testlist.c rsrc.rc wine comdlg32 + winspool user32 gdi32 ntdll diff --git a/rostests/winetests/comdlg32/filedlg.c b/rostests/winetests/comdlg32/filedlg.c index 9714dda1fe3..71f7d2a2595 100644 --- a/rostests/winetests/comdlg32/filedlg.c +++ b/rostests/winetests/comdlg32/filedlg.c @@ -29,6 +29,32 @@ /* ##### */ +static int resizesupported = TRUE; + +static void toolbarcheck( HWND hDlg) +{ + /* test toolbar properties */ + /* bug #10532 */ + int maxtextrows; + HWND ctrl; + DWORD ret; + char classname[20]; + + for( ctrl = GetWindow( hDlg, GW_CHILD); + ctrl ; ctrl = GetWindow( ctrl, GW_HWNDNEXT)) { + GetClassName( ctrl, classname, 10); + classname[7] = '\0'; + if( !strcmp( classname, "Toolbar")) break; + } + ok( ctrl != NULL, "could not get the toolbar control\n"); + ret = SendMessage( ctrl, TB_ADDSTRING, 0, (LPARAM)"winetestwinetest\0\0"); + ok( ret == 0, "addstring returned %d (expected 0)\n", ret); + maxtextrows = SendMessage( ctrl, TB_GETTEXTROWS, 0, 0); + ok( maxtextrows == 0 || broken(maxtextrows == 1), /* Win2k and below */ + "Get(Max)TextRows returned %d (expected 0)\n", maxtextrows); +} + + static UINT_PTR CALLBACK OFNHookProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { LPNMHDR nmh; @@ -49,6 +75,7 @@ static UINT_PTR CALLBACK OFNHookProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM ok(ret > 0, "CMD_GETFOLDERIDLIST not implemented\n"); if (ret > 5) ok(buf[0] == 0x66 && buf[1] == 0x66, "CMD_GETFOLDERIDLIST: The buffer was touched on failure\n"); + toolbarcheck( GetParent(hDlg)); } } @@ -78,26 +105,26 @@ static void test_DialogCancel(void) ofn.lpstrInitialDir = szInitialDir; PrintDlgA(NULL); - ok(CDERR_INITIALIZATION == CommDlgExtendedError(), "expected %d, got %d\n", - CDERR_INITIALIZATION, CommDlgExtendedError()); + ok(CDERR_INITIALIZATION == CommDlgExtendedError(), + "expected CDERR_INITIALIZATION, got %d\n", CommDlgExtendedError()); result = GetOpenFileNameA(&ofn); - ok(0 == result, "expected %d, got %d\n", 0, result); - ok(0 == CommDlgExtendedError(), "expected %d, got %d\n", 0, + ok(0 == result, "expected 0, got %d\n", result); + ok(0 == CommDlgExtendedError(), "expected 0, got %d\n", CommDlgExtendedError()); PrintDlgA(NULL); - ok(CDERR_INITIALIZATION == CommDlgExtendedError(), "expected %d, got %d\n", - CDERR_INITIALIZATION, CommDlgExtendedError()); + ok(CDERR_INITIALIZATION == CommDlgExtendedError(), + "expected CDERR_INITIALIZATION, got %d\n", CommDlgExtendedError()); result = GetSaveFileNameA(&ofn); - ok(0 == result, "expected %d, got %d\n", 0, result); - ok(0 == CommDlgExtendedError(), "expected %d, got %d\n", 0, + ok(0 == result, "expected 0, got %d\n", result); + ok(0 == CommDlgExtendedError(), "expected 0, got %d\n", CommDlgExtendedError()); PrintDlgA(NULL); - ok(CDERR_INITIALIZATION == CommDlgExtendedError(), "expected %d, got %d\n", - CDERR_INITIALIZATION, CommDlgExtendedError()); + ok(CDERR_INITIALIZATION == CommDlgExtendedError(), + "expected CDERR_INITIALIZATION, got %d\n", CommDlgExtendedError()); /* Before passing the ofn to Unicode functions, remove the ANSI strings */ ofn.lpstrFilter = NULL; @@ -105,8 +132,8 @@ static void test_DialogCancel(void) ofn.lpstrDefExt = NULL; PrintDlgA(NULL); - ok(CDERR_INITIALIZATION == CommDlgExtendedError(), "expected %d, got %d\n", - CDERR_INITIALIZATION, CommDlgExtendedError()); + ok(CDERR_INITIALIZATION == CommDlgExtendedError(), + "expected CDERR_INITIALIZATION, got %d\n", CommDlgExtendedError()); SetLastError(0xdeadbeef); result = GetOpenFileNameW((LPOPENFILENAMEW) &ofn); @@ -114,11 +141,10 @@ static void test_DialogCancel(void) win_skip("GetOpenFileNameW is not implemented\n"); else { - ok(0 == result, "expected %d, got %d\n", 0, result); + ok(0 == result, "expected 0, got %d\n", result); ok(0 == CommDlgExtendedError() || - CDERR_INITIALIZATION == CommDlgExtendedError(), /* win9x */ - "expected %d or %d, got %d\n", 0, CDERR_INITIALIZATION, - CommDlgExtendedError()); + broken(CDERR_INITIALIZATION == CommDlgExtendedError()), /* win9x */ + "expected 0, got %d\n", CommDlgExtendedError()); } SetLastError(0xdeadbeef); @@ -127,11 +153,10 @@ static void test_DialogCancel(void) win_skip("GetSaveFileNameW is not implemented\n"); else { - ok(0 == result, "expected %d, got %d\n", 0, result); + ok(0 == result, "expected 0, got %d\n", result); ok(0 == CommDlgExtendedError() || - CDERR_INITIALIZATION == CommDlgExtendedError(), /* win9x */ - "expected %d or %d, got %d\n", 0, CDERR_INITIALIZATION, - CommDlgExtendedError()); + broken(CDERR_INITIALIZATION == CommDlgExtendedError()), /* win9x */ + "expected 0, got %d\n", CommDlgExtendedError()); } } @@ -177,12 +202,19 @@ static UINT_PTR CALLBACK create_view_window2_hook(HWND dlg, UINT msg, WPARAM wPa view_params.hwndView = NULL; hr = IShellView2_CreateViewWindow2(shell_view2, &view_params); + if (hr == E_FAIL) + { + win_skip("CreateViewWindow2 is broken on Vista/W2K8\n"); + goto cleanup; + } ok(SUCCEEDED(hr), "CreateViewWindow2 returned %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = IShellView2_GetCurrentInfo(shell_view2, &folder_settings); ok(SUCCEEDED(hr), "GetCurrentInfo returned %#x\n", hr); - ok(folder_settings.ViewMode == FVM_LIST, "view mode is %d, expected %d\n", folder_settings.ViewMode, FVM_LIST); + ok(folder_settings.ViewMode == FVM_LIST, + "view mode is %d, expected FVM_LIST\n", + folder_settings.ViewMode); hr = IShellView2_DestroyViewWindow(shell_view2); ok(SUCCEEDED(hr), "DestroyViewWindow returned %#x\n", hr); @@ -201,7 +233,8 @@ static UINT_PTR CALLBACK create_view_window2_hook(HWND dlg, UINT msg, WPARAM wPa ok(SUCCEEDED(hr), "GetCurrentInfo returned %#x\n", hr); ok(folder_settings.ViewMode == FVM_DETAILS || broken(folder_settings.ViewMode == FVM_LIST), /* Win9x */ - "view mode is %d, expected %d\n", folder_settings.ViewMode, FVM_DETAILS); + "view mode is %d, expected FVM_DETAILS\n", + folder_settings.ViewMode); cleanup: if (shell_view2) IShellView2_Release(shell_view2); @@ -241,7 +274,7 @@ static void test_create_view_window2(void) ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = filename; - ofn.nMaxFile = 1042; + ofn.nMaxFile = 1024; ofn.lpfnHook = create_view_window2_hook; ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER; ret = GetOpenFileNameA(&ofn); @@ -258,7 +291,7 @@ static void test_create_view_template(void) ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = filename; - ofn.nMaxFile = 1042; + ofn.nMaxFile = 1024; ofn.lpfnHook = (LPOFNHOOKPROC)template_hook; ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE; ofn.hInstance = GetModuleHandleA(NULL); @@ -270,9 +303,694 @@ static void test_create_view_template(void) ok(!ret, "CommDlgExtendedError returned %#x\n", ret); } +/* test cases for resizing of the file dialog */ +struct { + DWORD flags; + int resize_folderchange;/* change in CDN_FOLDERCHANGE handler */ + int resize_timer1; /* change in first WM_TIMER handler */ + int resize_check; /* expected change (in second WM_TIMER handler) */ + BOOL todo; /* mark that test todo_wine */ + BOOL testcontrols; /* test resizing and moving of the controls */ +} resize_testcases[] = { + { 0 , 10, 10, 20,FALSE,FALSE}, /* 0 */ + { 0 ,-10,-10,-20,FALSE,FALSE}, + { OFN_ENABLESIZING , 0, 0, 0,FALSE,FALSE}, + { OFN_ENABLESIZING , 0,-10, 0,FALSE,FALSE}, + { OFN_ENABLESIZING , 0, 10, 10,FALSE, TRUE}, + { OFN_ENABLESIZING ,-10, 0, 10,FALSE,FALSE}, /* 5 */ + { OFN_ENABLESIZING , 10, 0, 10,FALSE,FALSE}, + { OFN_ENABLESIZING , 0, 10, 20,FALSE,FALSE}, + /* mark the end */ + { 0xffffffff } +}; + +static LONG_PTR WINAPI resize_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static RECT initrc, rc; + static int index, count; + static int gotSWP_bottom, gotShowWindow; + HWND parent = GetParent( dlg); + int resize; +#define MAXNRCTRLS 30 + static RECT ctrlrcs[MAXNRCTRLS]; + static int ctrlids[MAXNRCTRLS]; + static HWND ctrls[MAXNRCTRLS]; + static int nrctrls; + + switch( msg) + { + case WM_INITDIALOG: + { + DWORD style; + + index = ((OPENFILENAME*)lParam)->lCustData; + count = 0; + gotSWP_bottom = gotShowWindow = 0; + /* test style */ + style = GetWindowLong( parent, GWL_STYLE); + if( resize_testcases[index].flags & OFN_ENABLESIZING) + if( !(style & WS_SIZEBOX)) { + win_skip( "OFN_ENABLESIZING flag not supported.\n"); + resizesupported = FALSE; + PostMessage( parent, WM_COMMAND, IDCANCEL, 0); + } else + ok( style & WS_SIZEBOX, + "testid %d: dialog should have a WS_SIZEBOX style.\n", index); + else + ok( !(style & WS_SIZEBOX), + "testid %d: dialog should not have a WS_SIZEBOX style.\n", index); + break; + } + case WM_NOTIFY: + { + if(( (LPNMHDR)lParam)->code == CDN_FOLDERCHANGE){ + GetWindowRect( parent, &initrc); + if( (resize = resize_testcases[index].resize_folderchange)){ + MoveWindow( parent, initrc.left,initrc.top, initrc.right - initrc.left + resize, + initrc.bottom - initrc.top + resize, TRUE); + } + SetTimer( dlg, 0, 100, 0); + } + break; + } + case WM_TIMER: + { + if( count == 0){ + /* store the control rectangles */ + if( resize_testcases[index].testcontrols) { + HWND ctrl; + int i; + for( i = 0, ctrl = GetWindow( parent, GW_CHILD); + i < MAXNRCTRLS && ctrl; + i++, ctrl = GetWindow( ctrl, GW_HWNDNEXT)) { + ctrlids[i] = GetDlgCtrlID( ctrl); + GetWindowRect( ctrl, &ctrlrcs[i]); + MapWindowPoints( NULL, parent, (LPPOINT) &ctrlrcs[i], 2); + ctrls[i] = ctrl; + } + nrctrls = i; + } + if( (resize = resize_testcases[index].resize_timer1)){ + GetWindowRect( parent, &rc); + MoveWindow( parent, rc.left,rc.top, rc.right - rc.left + resize, + rc.bottom - rc.top + resize, TRUE); + } + } else if( count == 1){ + resize = resize_testcases[index].resize_check; + GetWindowRect( parent, &rc); + if( resize_testcases[index].todo){ + todo_wine { + ok( resize == rc.right - rc.left - initrc.right + initrc.left, + "testid %d size-x change %d expected %d\n", index, + rc.right - rc.left - initrc.right + initrc.left, resize); + ok( resize == rc.bottom - rc.top - initrc.bottom + initrc.top, + "testid %d size-y change %d expected %d\n", index, + rc.bottom - rc.top - initrc.bottom + initrc.top, resize); + } + }else{ + ok( resize == rc.right - rc.left - initrc.right + initrc.left, + "testid %d size-x change %d expected %d\n", index, + rc.right - rc.left - initrc.right + initrc.left, resize); + ok( resize == rc.bottom - rc.top - initrc.bottom + initrc.top, + "testid %d size-y change %d expected %d\n", index, + rc.bottom - rc.top - initrc.bottom + initrc.top, resize); + } + if( resize_testcases[index].testcontrols) { + int i; + RECT rc; + for( i = 0; i < nrctrls; i++) { + GetWindowRect( ctrls[i], &rc); + MapWindowPoints( NULL, parent, (LPPOINT) &rc, 2); + switch( ctrlids[i]){ + +/* test if RECT R1, moved and sized result in R2 */ +#define TESTRECTS( R1, R2, Mx, My, Sx, Sy) \ + ((R1).left + (Mx) ==(R2).left \ + &&(R1).top + (My) ==(R2).top \ + &&(R1).right + (Mx) + (Sx) == (R2).right \ + &&(R1).bottom + (My) + (Sy) ==(R2).bottom) + + /* sized horizontal and moved vertical */ + case cmb1: + case edt1: + ok( TESTRECTS( ctrlrcs[i], rc, 0, 10, 10, 0) || + broken(TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0)),/*win98*/ + "control id %03x should have sized horizontally and moved vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* sized horizontal and vertical */ + case lst2: + ok( TESTRECTS( ctrlrcs[i], rc, 0, 0, 10, 10), + "control id %03x should have sized horizontally and vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* moved horizontal and vertical */ + case IDCANCEL: + case pshHelp: + ok( TESTRECTS( ctrlrcs[i], rc, 10, 10, 0, 0) || + broken(TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0)),/*win98*/ + "control id %03x should have moved horizontally and vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* moved vertically */ + case chx1: + case stc2: + case stc3: + ok( TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0), + "control id %03x should have moved vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* resized horizontal */ + case cmb2: /* aka IDC_LOOKIN */ + ok( TESTRECTS( ctrlrcs[i], rc, 0, 0, 10, 0)|| + TESTRECTS( ctrlrcs[i], rc, 0, 0, 0, 0), /* Vista and higher */ + "control id %03x should have resized horizontally, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* non moving non sizing controls */ + case stc4: + ok( TESTRECTS( rc, ctrlrcs[i], 0, 0, 0, 0), + "control id %03x was moved/resized, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* todo_wine: non moving non sizing controls */ + case lst1: +todo_wine + ok( TESTRECTS( rc, ctrlrcs[i], 0, 0, 0, 0), + "control id %03x was moved/resized, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* don't test: id is not unique */ + case IDOK: + case stc1: + case 0: + case -1: + break; + default: + trace("untested control id %03x before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); +#undef TESTRECTS +#undef MAXNRCTRLS + } + } + } + KillTimer( dlg, 0); + PostMessage( parent, WM_COMMAND, IDCANCEL, 0); + } + count++; + } + break; + case WM_WINDOWPOSCHANGING: + { + WINDOWPOS *pwp = (WINDOWPOS *)lParam; + if( !index && pwp->hwndInsertAfter == HWND_BOTTOM){ + gotSWP_bottom = 1; + ok( gotShowWindow == 0, "The WM_WINDOWPOSCHANGING message came after a WM_SHOWWINDOW message\n"); + } + } + break; + case WM_SHOWWINDOW: + { + if( !index){ + gotShowWindow = 1; + ok( gotSWP_bottom == 1, "No WM_WINDOWPOSCHANGING message came before a WM_SHOWWINDOW message\n"); + } + } + break; + } + return 0; +} + +static void test_resize(void) +{ + OPENFILENAME ofn = { sizeof(OPENFILENAME)}; + char filename[1024] = {0}; + DWORD ret; + int i; + + ofn.lpstrFile = filename; + ofn.nMaxFile = 1024; + ofn.lpfnHook = (LPOFNHOOKPROC) resize_template_hook; + ofn.hInstance = GetModuleHandle(NULL); + ofn.lpTemplateName = "template_sz"; + for( i = 0; resize_testcases[i].flags != 0xffffffff; i++) { + ofn.lCustData = i; + ofn.Flags = resize_testcases[i].flags | + OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE | OFN_SHOWHELP ; + ret = GetOpenFileName(&ofn); + ok(!ret, "GetOpenFileName returned %#x\n", ret); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + } +} + +/* test cases for control message IDOK */ +/* Show case for bug #19079 */ +static struct { + int retval; /* return code of the message handler */ + BOOL setmsgresult; /* set the result in the DWLP_MSGRESULT */ + BOOL usemsgokstr; /* use the FILEOKSTRING message instead of WM_NOTIFY:CDN_FILEOK */ + BOOL do_subclass; /* subclass the dialog hook procedure */ + BOOL expclose; /* is the dialog expected to close ? */ + BOOL actclose; /* has the dialog actually closed ? */ +} ok_testcases[] = { + { 0, FALSE, FALSE, FALSE, TRUE}, + { 0, TRUE, FALSE, FALSE, TRUE}, + { 0, FALSE, FALSE, TRUE, TRUE}, + { 0, TRUE, FALSE, TRUE, TRUE}, + { 1, FALSE, FALSE, FALSE, TRUE}, + { 1, TRUE, FALSE, FALSE, FALSE}, + { 1, FALSE, FALSE, TRUE, FALSE}, + { 1, TRUE, FALSE, TRUE, FALSE}, + /* FILEOKSTRING tests */ + { 1, TRUE, TRUE, FALSE, FALSE}, + { 1, FALSE, TRUE, TRUE, FALSE}, + /* mark the end */ + { -1 } +}; + +/* test_ok_wndproc can be used as hook procedure or a subclass + * window proc for the file dialog */ +static LONG_PTR WINAPI test_ok_wndproc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HWND parent = GetParent( dlg); + static int index; + static UINT msgFILEOKSTRING; + if (msg == WM_INITDIALOG) + { + index = ((OPENFILENAME*)lParam)->lCustData; + ok_testcases[index].actclose = TRUE; + msgFILEOKSTRING = RegisterWindowMessageA( FILEOKSTRING); + } + if( msg == WM_NOTIFY) { + if(((LPNMHDR)lParam)->code == CDN_FOLDERCHANGE) { + SetTimer( dlg, 0, 100, 0); + PostMessage( parent, WM_COMMAND, IDOK, 0); + return FALSE; + } else if(((LPNMHDR)lParam)->code == CDN_FILEOK) { + if( ok_testcases[index].usemsgokstr) + return FALSE; + if( ok_testcases[index].setmsgresult) + SetWindowLongPtrA( dlg, DWLP_MSGRESULT, ok_testcases[index].retval); + return ok_testcases[index].retval; + } + } + if( msg == msgFILEOKSTRING) { + if( !ok_testcases[index].usemsgokstr) + return FALSE; + if( ok_testcases[index].setmsgresult) + SetWindowLongPtrA( dlg, DWLP_MSGRESULT, ok_testcases[index].retval); + return ok_testcases[index].retval; + } + if( msg == WM_TIMER) { + /* the dialog did not close automatically */ + ok_testcases[index].actclose = FALSE; + KillTimer( dlg, 0); + PostMessage( parent, WM_COMMAND, IDCANCEL, 0); + return FALSE; + } + if( ok_testcases[index].do_subclass) + return DefWindowProc( dlg, msg, wParam, lParam); + return FALSE; +} + +static LONG_PTR WINAPI ok_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (msg == WM_SETFONT) + SetWindowLongPtrA( dlg, GWLP_WNDPROC, (LONG_PTR) test_ok_wndproc); + return FALSE; +} + +static void test_ok(void) +{ + OPENFILENAME ofn = { sizeof(OPENFILENAME)}; + char filename[1024] = {0}; + char tmpfilename[ MAX_PATH]; + char curdir[MAX_PATH]; + int i; + DWORD ret; + + ok(GetCurrentDirectoryA(sizeof(curdir), curdir) != 0, "Failed to get current dir err %d\n", GetLastError()); + if (!GetTempFileNameA(".", "txt", 0, tmpfilename)) { + skip("Failed to create a temporary file name\n"); + return; + } + ofn.lpstrFile = filename; + ofn.nMaxFile = 1024; + ofn.hInstance = GetModuleHandle(NULL); + ofn.lpTemplateName = "template1"; + ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE ; + for( i = 0; ok_testcases[i].retval != -1; i++) { + strcpy( filename, tmpfilename); + ofn.lCustData = i; + ofn.lpfnHook = ok_testcases[i].do_subclass + ? (LPOFNHOOKPROC) ok_template_hook + : (LPOFNHOOKPROC) test_ok_wndproc; + ret = GetOpenFileNameA(&ofn); + ok( ok_testcases[i].expclose == ok_testcases[i].actclose, + "testid %d: Open File dialog should %shave closed.\n", i, + ok_testcases[i].expclose ? "" : "NOT "); + ok(ret == ok_testcases[i].expclose, "testid %d: GetOpenFileName returned %#x\n", i, ret); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + ok(SetCurrentDirectoryA(curdir), "Failed to restore current dir err %d\n", GetLastError()); + } + ret = DeleteFileA( tmpfilename); + ok( ret, "Failed to delete temporary file %s err %d\n", tmpfilename, GetLastError()); +} + +/* test arranging with a custom template */ +typedef struct { + int x, y; /* left, top coordinates */ + int cx, cy; /* width and height */ +} posz; +static struct { + int nrcontrols; /* 0: no controls, 1: just the stc32 control 2: with button */ + posz poszDlg; + posz poszStc32; + posz poszBtn; + DWORD ofnflags; +} arrange_tests[] = { + /* do not change the first two cases: used to get the uncustomized sizes */ + { 0, {0},{0},{0},0 }, + { 0, {0},{0},{0}, OFN_SHOWHELP}, + /* two tests with just a subdialog, no controls */ + { 0, {0, 0, 316, 76},{0},{0},0 }, + { 0, {0, 0, 100, 76},{0},{0}, OFN_SHOWHELP}, + /* now with a control with id stc32 */ + { 1, {0, 0, 316, 76} ,{0, 0, 204, 76,},{0},0 }, /* bug #17748*/ + { 1, {0, 0, 316, 76} ,{0, 0, 204, 76,},{0}, OFN_SHOWHELP}, /* bug #17748*/ + /* tests with size of the stc32 control higher or wider then the standard dialog */ + { 1, {0, 0, 316, 170} ,{0, 0, 204, 170,},{0},0 }, + { 1, {0, 0, 316, 165} ,{0, 0, 411, 165,},{0}, OFN_SHOWHELP }, + /* move the stc32 control around */ + { 1, {0, 0, 300, 100} ,{73, 17, 50, 50,},{0},0 }, + /* add control */ + { 2, {0, 0, 280, 100} ,{0, 0, 50, 50,},{300,20,30,30},0 }, + /* enable resizing should make the dialog bigger */ + { 0, {0},{0},{0}, OFN_SHOWHELP|OFN_ENABLESIZING}, + /* mark the end */ + { -1 } +}; + +static LONG_PTR WINAPI template_hook_arrange(HWND dlgChild, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static int index, fixhelp; + static posz posz0[2]; + static RECT clrcParent, clrcChild, rcStc32; + static HWND hwndStc32; + HWND dlgParent; + + dlgParent = GetParent( dlgChild); + if (msg == WM_INITDIALOG) { + index = ((OPENFILENAME*)lParam)->lCustData; + /* get the positions before rearrangement */ + GetClientRect( dlgParent, &clrcParent); + GetClientRect( dlgChild, &clrcChild); + hwndStc32 = GetDlgItem( dlgChild, stc32); + if( hwndStc32) GetWindowRect( hwndStc32, &rcStc32); + } + if (msg == WM_NOTIFY && ((LPNMHDR)lParam)->code == CDN_FOLDERCHANGE) { + RECT wrcParent; + + GetWindowRect( dlgParent, &wrcParent); + /* the fist two "tests" just save the dialogs position, with and without + * help button */ + if( index == 0) { + posz0[0].x = wrcParent.left; + posz0[0].y = wrcParent.top; + posz0[0].cx = wrcParent.right - wrcParent.left; + posz0[0].cy = wrcParent.bottom - wrcParent.top; + } else if( index == 1) { + posz0[1].x = wrcParent.left; + posz0[1].y = wrcParent.top; + posz0[1].cx = wrcParent.right - wrcParent.left; + posz0[1].cy = wrcParent.bottom - wrcParent.top; + fixhelp = posz0[1].cy - posz0[0].cy; + } else { + /* the real tests */ + int withhelp; + int expectx, expecty; + DWORD style; + + withhelp = (arrange_tests[index].ofnflags & OFN_SHOWHELP) != 0; + GetWindowRect( dlgParent, &wrcParent); + if( !hwndStc32) { + /* case with no custom subitem with stc32: + * default to all custom controls below the standard */ + expecty = posz0[withhelp].cy + clrcChild.bottom; + expectx = posz0[withhelp].cx; + } else { + /* special case: there is a control with id stc32 */ + /* expected height */ + expecty = posz0[withhelp].cy; + if( rcStc32.bottom - rcStc32.top > clrcParent.bottom) { + expecty += clrcChild.bottom - clrcParent.bottom; + if( !withhelp) expecty += fixhelp; + } + else + expecty += clrcChild.bottom - ( rcStc32.bottom - rcStc32.top) ; + /* expected width */ + expectx = posz0[withhelp].cx; + if( rcStc32.right - rcStc32.left > clrcParent.right) { + expectx += clrcChild.right - clrcParent.right; + } + else + expectx += clrcChild.right - ( rcStc32.right - rcStc32.left) ; + } + style = GetWindowLong( dlgParent, GWL_STYLE); + if( !(style & WS_SIZEBOX)) { + /* without the OFN_ENABLESIZING flag */ + ok( wrcParent.bottom - wrcParent.top == expecty, + "Wrong height of dialog %d, expected %d\n", + wrcParent.bottom - wrcParent.top, expecty); + ok( wrcParent.right - wrcParent.left == expectx, + "Wrong width of dialog %d, expected %d\n", + wrcParent.right - wrcParent.left, expectx); + } else todo_wine { + /* with the OFN_ENABLESIZING flag */ + ok( wrcParent.bottom - wrcParent.top > expecty, + "Wrong height of dialog %d, expected more than %d\n", + wrcParent.bottom - wrcParent.top, expecty); + ok( wrcParent.right - wrcParent.left > expectx, + "Wrong width of dialog %d, expected more than %d\n", + wrcParent.right - wrcParent.left, expectx); + } + + } + PostMessage( dlgParent, WM_COMMAND, IDCANCEL, 0); + } + return 0; +} + +static void test_arrange(void) +{ + OPENFILENAMEA ofn = {0}; + char filename[1024] = {0}; + DWORD ret; + HRSRC hRes; + HANDLE hDlgTmpl; + LPBYTE pv; + DLGTEMPLATE *template; + DLGITEMTEMPLATE *itemtemplateStc32, *itemtemplateBtn; + int i; + + /* load subdialog template into memory */ + hRes = FindResource( GetModuleHandle(NULL), "template_stc32", (LPSTR)RT_DIALOG); + hDlgTmpl = LoadResource( GetModuleHandle(NULL), hRes ); + /* get pointers to the structures for the dialog and the controls */ + pv = LockResource( hDlgTmpl ); + template = (DLGTEMPLATE*)pv; + if( template->x != 11111) { + win_skip("could not find the dialog template\n"); + return; + } + /* skip dialog template, menu, class and title */ + pv += sizeof(DLGTEMPLATE); + pv += 3 * sizeof(WORD); + /* skip font info */ + while( *(WORD*)pv) + pv += sizeof(WORD); + pv += sizeof(WORD); + /* align on 32 bit boundaries */ + pv = (LPBYTE)(((UINT_PTR)pv + 3 ) & ~3); + itemtemplateStc32 = (DLGITEMTEMPLATE*)pv; + if( itemtemplateStc32->x != 22222) { + win_skip("could not find the first item template\n"); + return; + } + /* skip itemtemplate, class, title and creation data */ + pv += sizeof(DLGITEMTEMPLATE); + pv += 4 * sizeof(WORD); + /* align on 32 bit boundaries */ + pv = (LPBYTE)(((UINT_PTR)pv + 3 ) & ~3); + itemtemplateBtn = (DLGITEMTEMPLATE*)pv; + if( itemtemplateBtn->x != 12345) { + win_skip("could not find the second item template\n"); + return; + } + + ofn.lStructSize = sizeof(ofn); + ofn.lpstrFile = filename; + ofn.nMaxFile = 1024; + ofn.lpfnHook = (LPOFNHOOKPROC)template_hook_arrange; + ofn.hInstance = hDlgTmpl; + ofn.lpstrFilter="text\0*.txt\0All\0*\0\0"; + for( i = 0; arrange_tests[i].nrcontrols != -1; i++) { + ofn.lCustData = i; + ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATEHANDLE | OFN_HIDEREADONLY | + arrange_tests[i].ofnflags; + template->cdit = arrange_tests[i].nrcontrols; + template->x = arrange_tests[i].poszDlg.x; + template->y = arrange_tests[i].poszDlg.y; + template->cx = arrange_tests[i].poszDlg.cx; + template->cy = arrange_tests[i].poszDlg.cy; + itemtemplateStc32->x = arrange_tests[i].poszStc32.x; + itemtemplateStc32->y = arrange_tests[i].poszStc32.y; + itemtemplateStc32->cx = arrange_tests[i].poszStc32.cx; + itemtemplateStc32->cy = arrange_tests[i].poszStc32.cy; + itemtemplateBtn->x = arrange_tests[i].poszBtn.x; + itemtemplateBtn->y = arrange_tests[i].poszBtn.y; + itemtemplateBtn->cx = arrange_tests[i].poszBtn.cx; + itemtemplateBtn->cy = arrange_tests[i].poszBtn.cy; + ret = GetOpenFileNameA(&ofn); + ok(!ret, "GetOpenFileNameA returned %#x\n", ret); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + } +} + +static CHAR SYSDIR[MAX_PATH]; + +static UINT_PTR CALLBACK path_hook_proc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + LPNMHDR nmh; + + if( msg == WM_NOTIFY) + { + nmh = (LPNMHDR) lParam; + if( nmh->code == CDN_INITDONE) + { + PostMessage( GetParent(hDlg), WM_COMMAND, IDCANCEL, FALSE); + } + else if ( nmh->code == CDN_FOLDERCHANGE) + { + char buf[1024]; + int ret; + + memset(buf, 0x66, sizeof(buf)); + ret = SendMessageA( GetParent(hDlg), CDM_GETFOLDERPATH, sizeof(buf), (LPARAM)buf); + ok(!lstrcmpiA(SYSDIR, buf), "Expected '%s', got '%s'\n", SYSDIR, buf); + ok(lstrlenA(SYSDIR) + 1 == ret, "Expected %d, got %d\n", lstrlenA(SYSDIR) + 1, ret); + } + } + + return 0; +} + +static void test_getfolderpath(void) +{ + OPENFILENAMEA ofn; + BOOL result; + char szFileName[MAX_PATH] = ""; + char szInitialDir[MAX_PATH]; + + /* We need to pick a different directory as the other tests because of new + * Windows 7 behavior. + */ + GetSystemDirectory(szInitialDir, MAX_PATH); + lstrcpyA(SYSDIR, szInitialDir); + + ZeroMemory(&ofn, sizeof(ofn)); + + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = NULL; + ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"; + ofn.lpstrFile = szFileName; + ofn.nMaxFile = MAX_PATH; + ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK; + ofn.lpstrDefExt = "txt"; + ofn.lpfnHook = path_hook_proc; + ofn.lpstrInitialDir = szInitialDir; + + result = GetOpenFileNameA(&ofn); + ok(0 == result, "expected 0, got %d\n", result); + ok(0 == CommDlgExtendedError(), "expected 0, got %d\n", + CommDlgExtendedError()); + + result = GetSaveFileNameA(&ofn); + ok(0 == result, "expected 0, got %d\n", result); + ok(0 == CommDlgExtendedError(), "expected 0, got %d\n", + CommDlgExtendedError()); +} + +static void test_resizable2(void) +{ + OPENFILENAMEA ofn = {0}; + char filename[1024] = "pls press Enter if sizable, Esc otherwise"; + DWORD ret; + + /* interactive because there is no hook function */ + if( !winetest_interactive) { + skip( "some interactive resizable dialog tests (set WINETEST_INTERACTIVE=1)\n"); + return; + } + ofn.lStructSize = sizeof(ofn); + ofn.lpstrFile = filename; + ofn.nMaxFile = 1024; + ofn.lpfnHook = NULL; + ofn.hInstance = GetModuleHandleA(NULL); + ofn.lpTemplateName = "template1"; + ofn.Flags = OFN_EXPLORER; +#define ISSIZABLE 1 + ret = GetOpenFileNameA(&ofn); + ok( ret == ISSIZABLE, "File Dialog should have been sizable\n"); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + ofn.Flags = OFN_EXPLORER | OFN_ENABLETEMPLATE; + ret = GetOpenFileNameA(&ofn); + ok( ret != ISSIZABLE, "File Dialog should NOT have been sizable\n"); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + ofn.Flags = OFN_EXPLORER | OFN_ENABLETEMPLATEHANDLE; + ofn.hInstance = LoadResource( GetModuleHandle(NULL), FindResource( GetModuleHandle(NULL), "template1", (LPSTR)RT_DIALOG)); + ofn.lpTemplateName = NULL; + ret = GetOpenFileNameA(&ofn); + ok( ret != ISSIZABLE, "File Dialog should NOT have been sizable\n"); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + ofn.Flags = OFN_EXPLORER | OFN_ENABLEHOOK; + ret = GetOpenFileNameA(&ofn); + ok( ret != ISSIZABLE, "File Dialog should NOT have been sizable\n"); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); +#undef ISSIZABLE +} + START_TEST(filedlg) { test_DialogCancel(); test_create_view_window2(); test_create_view_template(); + test_arrange(); + test_resize(); + test_ok(); + test_getfolderpath(); + if( resizesupported) test_resizable2(); } diff --git a/rostests/winetests/comdlg32/fontdlg.c b/rostests/winetests/comdlg32/fontdlg.c new file mode 100644 index 00000000000..57c1d908214 --- /dev/null +++ b/rostests/winetests/comdlg32/fontdlg.c @@ -0,0 +1,150 @@ +/* + * Unit test suite for comdlg32 API functions: font dialogs + * + * Copyright 2009 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "wingdi.h" +#include "winspool.h" +#include "winuser.h" +#include "objbase.h" + +#include "commdlg.h" + +#include "wine/test.h" + +static int get_dpiy(void) +{ + HDC hdc; + int result; + + hdc = GetDC(0); + result = GetDeviceCaps(hdc, LOGPIXELSY); + ReleaseDC(0, hdc); + + return result; +} + +static HDC get_printer_ic(void) +{ + PRINTER_INFO_2A *info; + DWORD info_size, num_printers=0; + BOOL ret; + HDC result=NULL; + + EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &info_size, &num_printers); + + if (info_size == 0) + return NULL; + + info = HeapAlloc(GetProcessHeap(), 0, info_size); + + ret = EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)info, info_size, &info_size, &num_printers); + + if (ret) + result = CreateICA(info->pDriverName, info->pPrinterName, NULL, NULL); + + HeapFree(GetProcessHeap(), 0, info); + + return result; +} + +static UINT_PTR CALLBACK CFHookProcOK(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_INITDIALOG: + PostMessageA(hdlg, WM_COMMAND, IDOK, FALSE); + return 0; + default: + return 0; + } +} + +static void test_ChooseFontA(void) +{ + LOGFONTA lfa; + CHOOSEFONTA cfa; + BOOL ret; + int dpiy = get_dpiy(); + int expected_pointsize, expected_lfheight; + HDC printer_ic; + + memset(&lfa, 0, sizeof(LOGFONTA)); + lfa.lfHeight = -16; + lfa.lfWeight = FW_NORMAL; + strcpy(lfa.lfFaceName, "Symbol"); + + memset(&cfa, 0, sizeof(CHOOSEFONTA)); + cfa.lStructSize = sizeof(cfa); + cfa.lpLogFont = &lfa; + cfa.Flags = CF_ENABLEHOOK|CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS; + cfa.lpfnHook = CFHookProcOK; + + ret = ChooseFontA(&cfa); + + expected_pointsize = MulDiv(16, 72, dpiy) * 10; + expected_lfheight = -MulDiv(expected_pointsize, dpiy, 720); + + ok(ret == TRUE, "ChooseFontA returned FALSE\n"); + ok(cfa.iPointSize == expected_pointsize, "Expected %i, got %i\n", expected_pointsize, cfa.iPointSize); + ok(lfa.lfHeight == expected_lfheight, "Expected %i, got %i\n", expected_lfheight, lfa.lfHeight); + ok(lfa.lfWeight == FW_NORMAL, "Expected FW_NORMAL, got %i\n", lfa.lfWeight); + ok(strcmp(lfa.lfFaceName, "Symbol") == 0, "Expected Symbol, got %s\n", lfa.lfFaceName); + + printer_ic = get_printer_ic(); + if (!printer_ic) + skip("can't get a DC for a local printer\n"); + else + { + memset(&lfa, 0, sizeof(LOGFONTA)); + lfa.lfHeight = -16; + lfa.lfWeight = FW_NORMAL; + strcpy(lfa.lfFaceName, "Symbol"); + + memset(&cfa, 0, sizeof(CHOOSEFONTA)); + cfa.lStructSize = sizeof(cfa); + cfa.lpLogFont = &lfa; + cfa.Flags = CF_ENABLEHOOK|CF_INITTOLOGFONTSTRUCT|CF_PRINTERFONTS; + cfa.hDC = printer_ic; + cfa.lpfnHook = CFHookProcOK; + + ret = ChooseFontA(&cfa); + + expected_pointsize = MulDiv(16, 72, dpiy) * 10; + expected_lfheight = -MulDiv(expected_pointsize, dpiy, 720); + + ok(ret == TRUE, "ChooseFontA returned FALSE\n"); + ok(cfa.iPointSize == expected_pointsize, "Expected %i, got %i\n", expected_pointsize, cfa.iPointSize); + ok(lfa.lfHeight == expected_lfheight, "Expected %i, got %i\n", expected_lfheight, lfa.lfHeight); + ok(lfa.lfWeight == FW_NORMAL, "Expected FW_NORMAL, got %i\n", lfa.lfWeight); + ok(strcmp(lfa.lfFaceName, "Symbol") == 0, "Expected Symbol, got %s\n", lfa.lfFaceName); + + DeleteDC(printer_ic); + } +} + +START_TEST(fontdlg) +{ + test_ChooseFontA(); +} diff --git a/rostests/winetests/comdlg32/printdlg.c b/rostests/winetests/comdlg32/printdlg.c index ec63da9a6c7..f021b019299 100644 --- a/rostests/winetests/comdlg32/printdlg.c +++ b/rostests/winetests/comdlg32/printdlg.c @@ -246,6 +246,11 @@ static void test_PrintDlgExW(void) PrintDlg(NULL); SetLastError(0xdeadbeef); res = pPrintDlgExW(NULL); + if(res == E_NOTIMPL) + { + win_skip("PrintDlgExW returns not implemented\n"); + return; + } ok( (res == E_INVALIDARG), "got 0x%x with %u and %u (expected 'E_INVALIDARG')\n", res, GetLastError(), CommDlgExtendedError()); @@ -318,6 +323,8 @@ static void test_abort_proc(void) ok(DeleteFileA(filename), "Failed to delete temporary file\n"); return; } + GlobalFree(pd.hDevMode); + GlobalFree(pd.hDevNames); ok(pd.hDC != NULL, "PrintDlg didn't return a DC.\n"); if (!(print_dc = pd.hDC)) @@ -346,25 +353,19 @@ static void test_abort_proc(void) goto end; } - ok(abort_proc_called, "AbortProc didn't get called by StartDoc.\n"); - abort_proc_called = FALSE; + /* StartDoc may or may not call abort proc */ + abort_proc_called = FALSE; ok(StartPage(print_dc) > 0, "StartPage failed\n"); ok(!abort_proc_called, "AbortProc got called unexpectedly by StartPage.\n"); abort_proc_called = FALSE; + /* following functions sometimes call abort proc too */ ok(FillRect(print_dc, &rect, (HBRUSH)(COLOR_BACKGROUND + 1)), "FillRect failed\n"); - ok(!abort_proc_called, "AbortProc got called unexpectedly by StretchBlt.\n"); - abort_proc_called = FALSE; - ok(EndPage(print_dc) > 0, "EndPage failed\n"); - ok(!abort_proc_called, "AbortProc got called unexpectedly by EndPage.\n"); - abort_proc_called = FALSE; - ok(EndDoc(print_dc) > 0, "EndDoc failed\n"); - ok(!abort_proc_called, "AbortProc got called unexpectedly by EndDoc.\n"); - abort_proc_called = FALSE; + abort_proc_called = FALSE; ok(DeleteDC(print_dc), "DeleteDC failed\n"); ok(!abort_proc_called, "AbortProc got called unexpectedly by DeleteDC.\n"); abort_proc_called = FALSE; diff --git a/rostests/winetests/comdlg32/rsrc.rc b/rostests/winetests/comdlg32/rsrc.rc index 51415fddb26..65e7972ffa4 100644 --- a/rostests/winetests/comdlg32/rsrc.rc +++ b/rostests/winetests/comdlg32/rsrc.rc @@ -32,3 +32,28 @@ FONT 8, "MS Shell Dlg" LTEXT "",-1,28,16,204,31 EDITTEXT 56,65,2,200,12,ES_AUTOHSCROLL } + +/* Used by the resize file dialog tests. + * Keep this template small or get failures + * resizing on small desk tops. + * This will work with 640x480 pixels + */ +TEMPLATE_SZ DIALOG LOADONCALL MOVEABLE DISCARDABLE 5, 43, 300, 40 +STYLE WS_CHILD | WS_CLIPSIBLINGS +FONT 8, "MS Shell Dlg" +{ + LTEXT "Path:",-1,28,4,36,8 + LTEXT "Text1",-1,4,16,20,40 + LTEXT "Text2",-1,232,20,65,8 + LTEXT "",-1,28,16,204,31 + EDITTEXT 56,65,2,200,12,ES_AUTOHSCROLL +} + +/* note: the test program will modify coordinates and nr of controls in this template */ +TEMPLATE_STC32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 11111, 0, 316, 76 +STYLE WS_CHILD | WS_CLIPSIBLINGS +FONT 8, "MS Shell Dlg" +{ + LTEXT "", 1119, 22222, 0, 204, 76 + PUSHBUTTON "TEST", -1, 12345, 0, 20, 20 +} diff --git a/rostests/winetests/crypt32/chain.c b/rostests/winetests/crypt32/chain.c index a626b82c4fe..f9ccaed78b1 100644 --- a/rostests/winetests/crypt32/chain.c +++ b/rostests/winetests/crypt32/chain.c @@ -58,6 +58,8 @@ static VOID (WINAPI *pCertFreeCertificateChain)(PCCERT_CHAIN_CONTEXT); static VOID (WINAPI *pCertFreeCertificateChainEngine)(HCERTCHAINENGINE); static BOOL (WINAPI *pCertVerifyCertificateChainPolicy)(LPCSTR,PCCERT_CHAIN_CONTEXT,PCERT_CHAIN_POLICY_PARA,PCERT_CHAIN_POLICY_STATUS); +#define IS_INTOID(x) (((ULONG_PTR)(x) >> 16) == 0) + static void testCreateCertChainEngine(void) { @@ -3883,19 +3885,19 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, if (check->todo & TODO_POLICY) todo_wine ok(ret, "%s[%d]: CertVerifyCertificateChainPolicy failed: %08x\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, GetLastError()); else { if (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) { skip("%d: missing policy %s, skipping test\n", testIndex, - HIWORD(policy) ? policy : num_to_str(LOWORD(policy))); + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy); pCertFreeCertificateChain(chain); return; } ok(ret, "%s[%d]: CertVerifyCertificateChainPolicy failed: %08x\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), testIndex, + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, GetLastError()); } if (ret) @@ -3906,7 +3908,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.dwError == check->brokenStatus->dwError)), "%s[%d]: expected %08x, got %08x\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.dwError, policyStatus.dwError); else ok(policyStatus.dwError == check->status.dwError || @@ -3914,12 +3916,12 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.dwError == check->brokenStatus->dwError)), "%s[%d]: expected %08x, got %08x\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.dwError, policyStatus.dwError); if (policyStatus.dwError != check->status.dwError) { skip("%s[%d]: error %08x doesn't match expected %08x, not checking indexes\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, policyStatus.dwError, check->status.dwError); pCertFreeCertificateChain(chain); return; @@ -3930,7 +3932,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.lChainIndex == check->brokenStatus->lChainIndex)), "%s[%d]: expected %d, got %d\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.lChainIndex, policyStatus.lChainIndex); else @@ -3938,7 +3940,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.lChainIndex == check->brokenStatus->lChainIndex)), "%s[%d]: expected %d, got %d\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.lChainIndex, policyStatus.lChainIndex); if (check->todo & TODO_ELEMENTS) @@ -3947,7 +3949,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.lElementIndex == check->brokenStatus->lElementIndex)), "%s[%d]: expected %d, got %d\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.lElementIndex, policyStatus.lElementIndex); else @@ -3955,7 +3957,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.lElementIndex == check->brokenStatus->lElementIndex)), "%s[%d]: expected %d, got %d\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.lElementIndex, policyStatus.lElementIndex); } diff --git a/rostests/winetests/crypt32/main.c b/rostests/winetests/crypt32/main.c index 9b622bbbd08..7c11e8e2ee3 100644 --- a/rostests/winetests/crypt32/main.c +++ b/rostests/winetests/crypt32/main.c @@ -254,10 +254,8 @@ static void test_cryptTls(void) ret = pI_CryptFreeTls(index, 0); ok(ret, "I_CryptFreeTls failed: %08x\n", GetLastError()); ret = pI_CryptFreeTls(index, 0); - /* Not sure if this fails because TlsFree should fail, so leave as - * todo for now. - */ - todo_wine ok(!ret && GetLastError() == E_INVALIDARG, + ok(!ret, "I_CryptFreeTls succeeded\n"); + ok(GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", GetLastError()); } /* Similar pass, check I_CryptDetachTls */ diff --git a/rostests/winetests/crypt32/msg.c b/rostests/winetests/crypt32/msg.c index 8ab5625fd8e..39662ebe8f2 100644 --- a/rostests/winetests/crypt32/msg.c +++ b/rostests/winetests/crypt32/msg.c @@ -2572,8 +2572,8 @@ static void test_decode_msg_get_param(void) sizeof(signedKeyIdEmptyContent), TRUE); if (!ret && GetLastError() == OSS_DATA_ERROR) { - /* Subsequent tests crashes on some Win9x, so bail out */ CryptMsgClose(msg); + win_skip("Subsequent tests crash on some Win9x\n"); return; } ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); diff --git a/rostests/winetests/gdiplus/brush.c b/rostests/winetests/gdiplus/brush.c index 0ee4dd485a2..0effcf40fd6 100644 --- a/rostests/winetests/gdiplus/brush.c +++ b/rostests/winetests/gdiplus/brush.c @@ -646,6 +646,61 @@ static void test_linelinearblend(void) expect(Ok, status); } +static void test_gradientsurroundcolorcount(void) +{ + GpStatus status; + GpPathGradient *grad; + ARGB *color; + INT count = 3; + + status = GdipCreatePathGradient(blendcount_ptf, 2, WrapModeClamp, &grad); + expect(Ok, status); + + color = GdipAlloc(sizeof(ARGB[3])); + + status = GdipSetPathGradientSurroundColorsWithCount(grad, color, &count); + expect(InvalidParameter, status); + GdipFree(color); + + count = 2; + + color = GdipAlloc(sizeof(ARGB[2])); + + color[0] = 0x00ff0000; + color[1] = 0x0000ff00; + + status = GdipSetPathGradientSurroundColorsWithCount(NULL, color, &count); + expect(InvalidParameter, status); + + status = GdipSetPathGradientSurroundColorsWithCount(grad, NULL, &count); + expect(InvalidParameter, status); + + /* WinXP crashes on this test */ + if(0) + { + status = GdipSetPathGradientSurroundColorsWithCount(grad, color, NULL); + expect(InvalidParameter, status); + } + + status = GdipSetPathGradientSurroundColorsWithCount(grad, color, &count); + todo_wine expect(Ok, status); + expect(2, count); + + status = GdipGetPathGradientSurroundColorCount(NULL, &count); + expect(InvalidParameter, status); + + status = GdipGetPathGradientSurroundColorCount(grad, NULL); + expect(InvalidParameter, status); + + count = 0; + status = GdipGetPathGradientSurroundColorCount(grad, &count); + todo_wine expect(Ok, status); + todo_wine expect(2, count); + + GdipFree(color); + GdipDeleteBrush((GpBrush*)grad); +} + START_TEST(brush) { struct GdiplusStartupInput gdiplusStartupInput; @@ -669,6 +724,7 @@ START_TEST(brush) test_gradientgetrect(); test_lineblend(); test_linelinearblend(); + test_gradientsurroundcolorcount(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/font.c b/rostests/winetests/gdiplus/font.c index 7b95d4c55ab..80f11bc0032 100644 --- a/rostests/winetests/gdiplus/font.c +++ b/rostests/winetests/gdiplus/font.c @@ -18,11 +18,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include + #include "windows.h" #include "gdiplus.h" #include "wine/test.h" #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got) +#define expectf(expected, got) ok(fabs(expected - got) < 0.0001, "Expected %.2f, got %.2f\n", expected, got) static const WCHAR arial[] = {'A','r','i','a','l','\0'}; static const WCHAR nonexistent[] = {'T','h','i','s','F','o','n','t','s','h','o','u','l','d','N','o','t','E','x','i','s','t','\0'}; @@ -189,12 +192,9 @@ static void test_fontfamily (void) expect (FontFamilyNotFound, stat); /* Bitmap fonts are not found */ -todo_wine -{ stat = GdipCreateFontFamilyFromName (MSSansSerif, NULL, &family); expect (FontFamilyNotFound, stat); if(stat == Ok) GdipDeleteFontFamily(family); -} stat = GdipCreateFontFamilyFromName (arial, NULL, &family); if(stat == FontFamilyNotFound) @@ -345,6 +345,78 @@ static void test_installedfonts (void) ok (collection != NULL, "got NULL font collection\n"); } +static void test_heightgivendpi(void) +{ + GpStatus stat; + GpFont* font = NULL; + GpFontFamily* fontfamily = NULL; + REAL height; + + stat = GdipCreateFontFamilyFromName(arial, NULL, &fontfamily); + if(stat == FontFamilyNotFound) + { + skip("Arial not installed\n"); + return; + } + expect(Ok, stat); + + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitPixel, &font); + expect(Ok, stat); + + stat = GdipGetFontHeightGivenDPI(NULL, 96, &height); + expect(InvalidParameter, stat); + + stat = GdipGetFontHeightGivenDPI(font, 96, NULL); + expect(InvalidParameter, stat); + + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)34.497070, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitWorld, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)34.497070, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitPoint, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)45.996094, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitInch, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)3311.718750, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitDocument, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)11.039062, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitMillimeter, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)130.382614, height); + GdipDeleteFont(font); + + GdipDeleteFontFamily(fontfamily); +} + START_TEST(font) { struct GdiplusStartupInput gdiplusStartupInput; @@ -363,6 +435,7 @@ START_TEST(font) test_fontfamily_properties(); test_getgenerics(); test_installedfonts(); + test_heightgivendpi(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/graphics.c b/rostests/winetests/gdiplus/graphics.c index b2dc9b299fb..57ce638093c 100644 --- a/rostests/winetests/gdiplus/graphics.c +++ b/rostests/winetests/gdiplus/graphics.c @@ -25,14 +25,17 @@ #include #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got) -#define expectf(expected, got) ok(fabs(expected - got) < 0.0001, "Expected %.2f, got %.2f\n", expected, got) +#define expectf_(expected, got, precision) ok(fabs(expected - got) < precision, "Expected %.2f, got %.2f\n", expected, got) +#define expectf(expected, got) expectf_(expected, got, 0.0001) #define TABLE_LEN (23) +static HWND hwnd; + static void test_constructor_destructor(void) { GpStatus stat; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); stat = GdipCreateFromHDC(NULL, &graphics); expect(OutOfMemory, stat); @@ -56,7 +59,7 @@ static void test_constructor_destructor(void) stat = GdipDeleteGraphics(NULL); expect(InvalidParameter, stat); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } typedef struct node{ @@ -115,7 +118,7 @@ static void test_save_restore(void) InterpolationMode mode; GpGraphics *graphics1, *graphics2; node * state_log = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); state_a = state_b = state_c = 0xdeadbeef; /* Invalid saving. */ @@ -224,7 +227,7 @@ static void test_save_restore(void) todo_wine check_no_duplicates(state_log); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawArc(void) @@ -232,7 +235,7 @@ static void test_GdipDrawArc(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -268,7 +271,7 @@ static void test_GdipDrawArc(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawArcI(void) @@ -276,7 +279,7 @@ static void test_GdipDrawArcI(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -312,7 +315,7 @@ static void test_GdipDrawArcI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_BeginContainer2(void) @@ -334,7 +337,7 @@ static void test_BeginContainer2(void) GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -497,7 +500,7 @@ static void test_BeginContainer2(void) expect(Ok, status); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawBezierI(void) @@ -505,7 +508,7 @@ static void test_GdipDrawBezierI(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -535,7 +538,7 @@ static void test_GdipDrawBezierI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve3(void) @@ -543,7 +546,7 @@ static void test_GdipDrawCurve3(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPointF points[3]; points[0].X = 0; @@ -615,7 +618,7 @@ static void test_GdipDrawCurve3(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve3I(void) @@ -623,7 +626,7 @@ static void test_GdipDrawCurve3I(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPoint points[3]; points[0].X = 0; @@ -695,7 +698,7 @@ static void test_GdipDrawCurve3I(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve2(void) @@ -703,7 +706,7 @@ static void test_GdipDrawCurve2(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPointF points[3]; points[0].X = 0; @@ -762,7 +765,7 @@ static void test_GdipDrawCurve2(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve2I(void) @@ -770,7 +773,7 @@ static void test_GdipDrawCurve2I(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPoint points[3]; points[0].X = 0; @@ -829,7 +832,7 @@ static void test_GdipDrawCurve2I(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve(void) @@ -837,7 +840,7 @@ static void test_GdipDrawCurve(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPointF points[3]; points[0].X = 0; @@ -890,7 +893,7 @@ static void test_GdipDrawCurve(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurveI(void) @@ -898,7 +901,7 @@ static void test_GdipDrawCurveI(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPoint points[3]; points[0].X = 0; @@ -951,7 +954,7 @@ static void test_GdipDrawCurveI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawLineI(void) @@ -959,7 +962,7 @@ static void test_GdipDrawLineI(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -989,7 +992,7 @@ static void test_GdipDrawLineI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawLinesI(void) @@ -998,7 +1001,7 @@ static void test_GdipDrawLinesI(void) GpGraphics *graphics = NULL; GpPen *pen = NULL; GpPoint *ptf = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -1041,7 +1044,7 @@ static void test_GdipDrawLinesI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_Get_Release_DC(void) @@ -1051,7 +1054,7 @@ static void test_Get_Release_DC(void) GpPen *pen; GpSolidFill *brush; GpPath *path; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); HDC retdc; REAL r; CompositingQuality quality; @@ -1345,14 +1348,14 @@ static void test_Get_Release_DC(void) GdipDeleteMatrix(m); DeleteObject(hrgn); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_transformpoints(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPointF ptf[2]; GpPoint pt[2]; @@ -1465,14 +1468,14 @@ static void test_transformpoints(void) expect(18, pt[1].Y); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_get_set_clip(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpRegion *clip; GpRectF rect; BOOL res; @@ -1544,14 +1547,14 @@ static void test_get_set_clip(void) GdipDeleteRegion(clip); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_isempty(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpRegion *clip; BOOL res; @@ -1578,7 +1581,7 @@ static void test_isempty(void) GdipDeleteRegion(clip); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_clear(void) @@ -1592,7 +1595,7 @@ static void test_clear(void) static void test_textcontrast(void) { GpStatus status; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpGraphics *graphics; UINT contrast; @@ -1608,7 +1611,7 @@ static void test_textcontrast(void) expect(4, contrast); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawString(void) @@ -1620,7 +1623,7 @@ static void test_GdipDrawString(void) GpStringFormat *format; GpBrush *brush; LOGFONTA logfont; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); static const WCHAR string[] = {'T','e','s','t',0}; memset(&logfont,0,sizeof(logfont)); @@ -1658,7 +1661,7 @@ static void test_GdipDrawString(void) GdipDeleteFont(fnt); GdipDeleteStringFormat(format); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipGetVisibleClipBounds_screen(void) @@ -1758,36 +1761,10 @@ static void test_GdipGetVisibleClipBounds_window(void) GpGraphics *graphics = NULL; GpRectF rectf, window, exp, clipr; GpRect recti; - HWND hwnd; - WNDCLASSA class; HDC hdc; PAINTSTRUCT ps; - HINSTANCE hInstance = GetModuleHandle(NULL); RECT wnd_rect; - window.X = 0; - window.Y = 0; - window.Width = 200; - window.Height = 300; - - class.lpszClassName = "ClipBoundsTestClass"; - class.style = CS_HREDRAW | CS_VREDRAW; - class.lpfnWndProc = DefWindowProcA; - class.hInstance = hInstance; - class.hIcon = LoadIcon(0, IDI_APPLICATION); - class.hCursor = LoadCursor(NULL, IDC_ARROW); - class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - class.lpszMenuName = 0; - class.cbClsExtra = 0; - class.cbWndExtra = 0; - RegisterClass(&class); - - hwnd = CreateWindow(class.lpszClassName, "ClipboundsTest", - WS_OVERLAPPEDWINDOW, window.X, window.Y, window.Width, window.Height, - NULL, NULL, hInstance, NULL); - - ok(hwnd != NULL, "Expected window to be created\n"); - /* get client area size */ ok(GetClientRect(hwnd, &wnd_rect), "GetClientRect should have succeeded\n"); window.X = wnd_rect.left; @@ -1870,7 +1847,6 @@ static void test_GdipGetVisibleClipBounds_window(void) GdipDeleteGraphics(graphics); EndPaint(hwnd, &ps); - DestroyWindow(hwnd); } static void test_GdipGetVisibleClipBounds(void) @@ -1878,7 +1854,7 @@ static void test_GdipGetVisibleClipBounds(void) GpGraphics* graphics = NULL; GpRectF rectf; GpRect rect; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpStatus status; status = GdipCreateFromHDC(hdc, &graphics); @@ -1899,7 +1875,7 @@ static void test_GdipGetVisibleClipBounds(void) expect(InvalidParameter, status); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); test_GdipGetVisibleClipBounds_screen(); test_GdipGetVisibleClipBounds_window(); @@ -1933,7 +1909,7 @@ static void test_GdipIsVisiblePoint(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); REAL x, y; BOOL val; @@ -2105,14 +2081,14 @@ static void test_GdipIsVisiblePoint(void) ok(val == FALSE, "After clipping, expected (%.2f, %.2f) not to be visible\n", x, y); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipIsVisibleRect(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); REAL x, y, width, height; BOOL val; @@ -2267,7 +2243,7 @@ static void test_GdipIsVisibleRect(void) ok(val == TRUE, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x, y, width, height); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipGetNearestColor(void) @@ -2276,7 +2252,7 @@ static void test_GdipGetNearestColor(void) GpGraphics *graphics; GpBitmap *bitmap; ARGB color = 0xdeadbeef; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* create a graphics object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -2415,17 +2391,269 @@ static void test_GdipGetNearestColor(void) expect(Ok, status); status = GdipGetNearestColor(graphics, &color); expect(Ok, status); - todo_wine expect(0xffa8b8e8, color); + todo_wine + ok(color == 0xffa8b8e8 || + broken(color == 0xffa0b8e0), /* Win98/WinMe */ + "Expected ffa8b8e8, got %.8x\n", color); GdipDeleteGraphics(graphics); GdipDisposeImage((GpImage*)bitmap); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); +} + +static void test_string_functions(void) +{ + GpStatus status; + GpGraphics *graphics; + GpFontFamily *family; + GpFont *font; + RectF rc, char_bounds, bounds; + GpBrush *brush; + ARGB color = 0xff000000; + HDC hdc = GetDC( hwnd ); + const WCHAR fontname[] = {'C','o','u','r','i','e','r',' ','N','e','w',0}; + const WCHAR fontname2[] = {'C','o','u','r','i','e','r',0}; + const WCHAR teststring[] = {'o','o',' ','o','\n','o',0}; + REAL char_width, char_height; + INT codepointsfitted, linesfilled; + GpStringFormat *format; + CharacterRange ranges[3] = {{0, 1}, {1, 3}, {5, 1}}; + GpRegion *regions[4] = {0}; + BOOL region_isempty[4]; + int i; + + ok(hdc != NULL, "Expected HDC to be initialized\n"); + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + ok(graphics != NULL, "Expected graphics to be initialized\n"); + + status = GdipCreateFontFamilyFromName(fontname, NULL, &family); + + if (status != Ok) + { + /* Wine doesn't have Courier New? */ + todo_wine expect(Ok, status); + status = GdipCreateFontFamilyFromName(fontname2, NULL, &family); + } + + expect(Ok, status); + + status = GdipCreateFont(family, 10.0, FontStyleRegular, UnitPixel, &font); + expect(Ok, status); + + status = GdipCreateSolidFill(color, (GpSolidFill**)&brush); + expect(Ok, status); + + status = GdipCreateStringFormat(0, LANG_NEUTRAL, &format); + expect(Ok, status); + + rc.X = 0; + rc.Y = 0; + rc.Width = 100.0; + rc.Height = 100.0; + + status = GdipDrawString(NULL, teststring, 6, font, &rc, NULL, brush); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, NULL, 6, font, &rc, NULL, brush); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, teststring, 6, NULL, &rc, NULL, brush); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, teststring, 6, font, NULL, NULL, brush); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, teststring, 6, font, &rc, NULL, NULL); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, teststring, 6, font, &rc, NULL, brush); + expect(Ok, status); + + status = GdipMeasureString(NULL, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, NULL, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, teststring, 6, NULL, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, teststring, 6, font, NULL, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, NULL, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, NULL, &linesfilled); + expect(Ok, status); + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, NULL); + expect(Ok, status); + + status = GdipMeasureString(graphics, teststring, 1, font, &rc, NULL, &char_bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, char_bounds.X); + expectf(0.0, char_bounds.Y); + ok(char_bounds.Width > 0, "got %0.2f\n", bounds.Width); + ok(char_bounds.Height > 0, "got %0.2f\n", bounds.Height); + expect(1, codepointsfitted); + expect(1, linesfilled); + + status = GdipMeasureString(graphics, teststring, 2, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + ok(bounds.Width > char_bounds.Width, "got %0.2f, expected at least %0.2f\n", bounds.Width, char_bounds.Width); + expectf(char_bounds.Height, bounds.Height); + expect(2, codepointsfitted); + expect(1, linesfilled); + char_width = bounds.Width - char_bounds.Width; + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + expectf_(char_bounds.Width + char_width * 3, bounds.Width, 0.01); + ok(bounds.Height > char_bounds.Height, "got %0.2f, expected at least %0.2f\n", bounds.Height, char_bounds.Height); + expect(6, codepointsfitted); + expect(2, linesfilled); + char_height = bounds.Height - char_bounds.Height; + + /* Cut off everything after the first space. */ + rc.Width = char_bounds.Width + char_width * 2.5; + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + expectf_(char_bounds.Width + char_width, bounds.Width, 0.01); + expectf_(char_bounds.Height + char_height * 2, bounds.Height, 0.01); + expect(6, codepointsfitted); + expect(3, linesfilled); + + /* Cut off everything including the first space. */ + rc.Width = char_bounds.Width + char_width * 1.5; + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + expectf_(char_bounds.Width + char_width, bounds.Width, 0.01); + expectf_(char_bounds.Height + char_height * 2, bounds.Height, 0.01); + expect(6, codepointsfitted); + expect(3, linesfilled); + + /* Cut off everything after the first character. */ + rc.Width = char_bounds.Width + char_width * 0.5; + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + expectf_(char_bounds.Width, bounds.Width, 0.01); + todo_wine expectf_(char_bounds.Height + char_height * 3, bounds.Height, 0.05); + expect(6, codepointsfitted); + todo_wine expect(4, linesfilled); + + status = GdipSetStringFormatMeasurableCharacterRanges(format, 3, ranges); + expect(Ok, status); + + rc.Width = 100.0; + + for (i=0; i<4; i++) + { + status = GdipCreateRegion(®ions[i]); + expect(Ok, status); + } + + status = GdipMeasureCharacterRanges(NULL, teststring, 6, font, &rc, format, 3, regions); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, NULL, 6, font, &rc, format, 3, regions); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, NULL, &rc, format, 3, regions); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, NULL, format, 3, regions); + expect(InvalidParameter, status); + + if (0) + { + /* Crashes on Windows XP */ + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, NULL, 3, regions); + expect(InvalidParameter, status); + } + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 3, NULL); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 2, regions); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 4, regions); + expect(Ok, status); + + for (i=0; i<4; i++) + { + status = GdipIsEmptyRegion(regions[i], graphics, ®ion_isempty[i]); + expect(Ok, status); + } + + ok(!region_isempty[0], "region shouldn't be empty\n"); + ok(!region_isempty[1], "region shouldn't be empty\n"); + ok(!region_isempty[2], "region shouldn't be empty\n"); + ok(!region_isempty[3], "region shouldn't be empty\n"); + + /* Cut off everything after the first space, and the second line. */ + rc.Width = char_bounds.Width + char_width * 2.5; + rc.Height = char_bounds.Height + char_height * 0.5; + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 3, regions); + expect(Ok, status); + + for (i=0; i<4; i++) + { + status = GdipIsEmptyRegion(regions[i], graphics, ®ion_isempty[i]); + expect(Ok, status); + } + + ok(!region_isempty[0], "region shouldn't be empty\n"); + ok(!region_isempty[1], "region shouldn't be empty\n"); + ok(region_isempty[2], "region should be empty\n"); + ok(!region_isempty[3], "region shouldn't be empty\n"); + + for (i=0; i<4; i++) + GdipDeleteRegion(regions[i]); + + GdipDeleteStringFormat(format); + GdipDeleteBrush(brush); + GdipDeleteFont(font); + GdipDeleteFontFamily(family); + GdipDeleteGraphics(graphics); + + ReleaseDC(hwnd, hdc); } START_TEST(graphics) { struct GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; + WNDCLASSA class; + + memset( &class, 0, sizeof(class) ); + class.lpszClassName = "gdiplus_test"; + class.style = CS_HREDRAW | CS_VREDRAW; + class.lpfnWndProc = DefWindowProcA; + class.hInstance = GetModuleHandleA(0); + class.hIcon = LoadIcon(0, IDI_APPLICATION); + class.hCursor = LoadCursor(NULL, IDC_ARROW); + class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + RegisterClassA( &class ); + hwnd = CreateWindowA( "gdiplus_test", "graphics test", WS_OVERLAPPEDWINDOW | WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, 0, 0, GetModuleHandleA(0), 0 ); + ok(hwnd != NULL, "Expected window to be created\n"); gdiplusStartupInput.GdiplusVersion = 1; gdiplusStartupInput.DebugEventCallback = NULL; @@ -2460,6 +2688,8 @@ START_TEST(graphics) test_clear(); test_textcontrast(); test_fromMemoryBitmap(); + test_string_functions(); GdiplusShutdown(gdiplusToken); + DestroyWindow( hwnd ); } diff --git a/rostests/winetests/gdiplus/image.c b/rostests/winetests/gdiplus/image.c index 9085ef2cf2d..74e6ee1db23 100644 --- a/rostests/winetests/gdiplus/image.c +++ b/rostests/winetests/gdiplus/image.c @@ -226,10 +226,23 @@ static void test_GdipImageGetFrameDimensionsCount(void) stat = GdipImageGetFrameDimensionsList((GpImage*)bm, &dimension, 0); expect(InvalidParameter, stat); + stat = GdipImageGetFrameCount(NULL, &dimension, &count); + expect(InvalidParameter, stat); + + /* WinXP crashes on this test */ + if(0) + { + stat = GdipImageGetFrameCount((GpImage*)bm, &dimension, NULL); + expect(InvalidParameter, stat); + } + + stat = GdipImageGetFrameCount((GpImage*)bm, NULL, &count); + expect(Ok, stat); + count = 12345; stat = GdipImageGetFrameCount((GpImage*)bm, &dimension, &count); - todo_wine expect(Ok, stat); - todo_wine expect(1, count); + expect(Ok, stat); + expect(1, count); GdipBitmapSetPixel(bm, 0, 0, 0xffffffff); @@ -793,6 +806,26 @@ static const unsigned char jpgimage[285] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xda,0x00,0x0c,0x03,0x01, 0x00,0x02,0x11,0x03,0x11,0x00,0x3f,0x00,0xb2,0xc0,0x07,0xff,0xd9 }; +/* 1x1 pixel tiff */ +static const unsigned char tiffimage[] = { +0x49,0x49,0x2a,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0xfe,0x00, +0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x01,0x00, +0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00, +0x00,0x00,0x02,0x01,0x03,0x00,0x03,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x03,0x01, +0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x01,0x03,0x00,0x01,0x00, +0x00,0x00,0x02,0x00,0x00,0x00,0x0d,0x01,0x02,0x00,0x1b,0x00,0x00,0x00,0xd8,0x00, +0x00,0x00,0x11,0x01,0x04,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x12,0x01, +0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x15,0x01,0x03,0x00,0x01,0x00, +0x00,0x00,0x03,0x00,0x00,0x00,0x16,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x40,0x00, +0x00,0x00,0x17,0x01,0x04,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1a,0x01, +0x05,0x00,0x01,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x1b,0x01,0x05,0x00,0x01,0x00, +0x00,0x00,0xfc,0x00,0x00,0x00,0x1c,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00, +0x00,0x00,0x28,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x2f,0x68,0x6f,0x6d,0x65,0x2f,0x6d,0x65, +0x68,0x2f,0x44,0x65,0x73,0x6b,0x74,0x6f,0x70,0x2f,0x74,0x65,0x73,0x74,0x2e,0x74, +0x69,0x66,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x48, +0x00,0x00,0x00,0x01 +}; /* 320x320 twip wmf */ static const unsigned char wmfimage[180] = { 0xd7,0xcd,0xc6,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x40,0x01,0xa0,0x05, @@ -814,6 +847,7 @@ static void test_getrawformat(void) test_bufferrawformat((void*)gifimage, sizeof(gifimage), &ImageFormatGIF, __LINE__, FALSE); test_bufferrawformat((void*)bmpimage, sizeof(bmpimage), &ImageFormatBMP, __LINE__, FALSE); test_bufferrawformat((void*)jpgimage, sizeof(jpgimage), &ImageFormatJPEG, __LINE__, FALSE); + test_bufferrawformat((void*)tiffimage, sizeof(tiffimage), &ImageFormatTIFF, __LINE__, FALSE); test_bufferrawformat((void*)wmfimage, sizeof(wmfimage), &ImageFormatWMF, __LINE__, FALSE); } @@ -828,6 +862,7 @@ static void test_loadwmf(void) GpRectF bounds; GpUnit unit; REAL res = 12345.0; + MetafileHeader header; hglob = GlobalAlloc (0, sizeof(wmfimage)); data = GlobalLock (hglob); @@ -863,6 +898,27 @@ static void test_loadwmf(void) expect(Ok, stat); todo_wine expectf(1440.0, res); + memset(&header, 0, sizeof(header)); + stat = GdipGetMetafileHeaderFromMetafile((GpMetafile*)img, &header); + expect(Ok, stat); + if (stat == Ok) + { + todo_wine expect(MetafileTypeWmfPlaceable, header.Type); + todo_wine expect(sizeof(wmfimage)-sizeof(WmfPlaceableFileHeader), header.Size); + todo_wine expect(0x300, header.Version); + expect(0, header.EmfPlusFlags); + todo_wine expectf(1440.0, header.DpiX); + todo_wine expectf(1440.0, header.DpiY); + expect(0, header.X); + expect(0, header.Y); + todo_wine expect(320, header.Width); + todo_wine expect(320, header.Height); + todo_wine expect(1, U(header).WmfHeader.mtType); + expect(0, header.EmfPlusHeaderSize); + expect(0, header.LogicalDpiX); + expect(0, header.LogicalDpiY); + } + GdipDisposeImage(img); } @@ -874,6 +930,7 @@ static void test_createfromwmf(void) GpRectF bounds; GpUnit unit; REAL res = 12345.0; + MetafileHeader header; hwmf = SetMetaFileBitsEx(sizeof(wmfimage)-sizeof(WmfPlaceableFileHeader), wmfimage+sizeof(WmfPlaceableFileHeader)); @@ -885,11 +942,11 @@ static void test_createfromwmf(void) stat = GdipGetImageBounds(img, &bounds, &unit); expect(Ok, stat); - todo_wine expect(UnitPixel, unit); + expect(UnitPixel, unit); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); - todo_wine expectf(320.0, bounds.Width); - todo_wine expectf(320.0, bounds.Height); + expectf(320.0, bounds.Width); + expectf(320.0, bounds.Height); stat = GdipGetImageHorizontalResolution(img, &res); expect(Ok, stat); @@ -899,6 +956,27 @@ static void test_createfromwmf(void) expect(Ok, stat); expectf(1440.0, res); + memset(&header, 0, sizeof(header)); + stat = GdipGetMetafileHeaderFromMetafile((GpMetafile*)img, &header); + expect(Ok, stat); + if (stat == Ok) + { + todo_wine expect(MetafileTypeWmfPlaceable, header.Type); + todo_wine expect(sizeof(wmfimage)-sizeof(WmfPlaceableFileHeader), header.Size); + todo_wine expect(0x300, header.Version); + expect(0, header.EmfPlusFlags); + todo_wine expectf(1440.0, header.DpiX); + todo_wine expectf(1440.0, header.DpiY); + expect(0, header.X); + expect(0, header.Y); + todo_wine expect(320, header.Width); + todo_wine expect(320, header.Height); + todo_wine expect(1, U(header).WmfHeader.mtType); + expect(0, header.EmfPlusHeaderSize); + expect(0, header.LogicalDpiX); + expect(0, header.LogicalDpiY); + } + GdipDisposeImage(img); } @@ -1544,7 +1622,7 @@ static void test_multiframegif(void) count = 12345; stat = GdipImageGetFrameCount((GpImage*)bmp, &dimension, &count); - todo_wine expect(Ok, stat); + expect(Ok, stat); todo_wine expect(2, count); /* SelectActiveFrame overwrites our current data */ @@ -1618,8 +1696,8 @@ static void test_multiframegif(void) count = 12345; stat = GdipImageGetFrameCount((GpImage*)bmp, &dimension, &count); - todo_wine expect(Ok, stat); - todo_wine expect(1, count); + expect(Ok, stat); + expect(1, count); GdipDisposeImage((GpImage*)bmp); IStream_Release(stream); @@ -1641,30 +1719,30 @@ static void test_rotateflip(void) expect(Ok, stat); stat = GdipImageRotateFlip(bitmap, Rotate90FlipNone); - todo_wine expect(Ok, stat); + expect(Ok, stat); stat = GdipGetImageWidth(bitmap, &width); expect(Ok, stat); stat = GdipGetImageHeight(bitmap, &height); expect(Ok, stat); - todo_wine expect(2, width); - todo_wine expect(3, height); + expect(2, width); + expect(3, height); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 0, &color); expect(Ok, stat); - todo_wine expect(0xff00ffff, color); + expect(0xff00ffff, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 1, 0, &color); expect(Ok, stat); - todo_wine expect(0xffff0000, color); + expect(0xffff0000, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 2, &color); - todo_wine expect(Ok, stat); - todo_wine expect(0xffffff00, color); + expect(Ok, stat); + expect(0xffffff00, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 1, 2, &color); - todo_wine expect(Ok, stat); - todo_wine expect(0xff0000ff, color); + expect(Ok, stat); + expect(0xff0000ff, color); expect(0, bits[0]); expect(0, bits[1]); @@ -1677,7 +1755,7 @@ static void test_rotateflip(void) expect(Ok, stat); stat = GdipImageRotateFlip(bitmap, RotateNoneFlipX); - todo_wine expect(Ok, stat); + expect(Ok, stat); stat = GdipGetImageWidth(bitmap, &width); expect(Ok, stat); @@ -1688,19 +1766,19 @@ static void test_rotateflip(void) stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 0, &color); expect(Ok, stat); - todo_wine expect(0xff0000ff, color); + expect(0xff0000ff, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 2, 0, &color); expect(Ok, stat); - todo_wine expect(0xffff0000, color); + expect(0xffff0000, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 1, &color); expect(Ok, stat); - todo_wine expect(0xffffff00, color); + expect(0xffffff00, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 2, 1, &color); expect(Ok, stat); - todo_wine expect(0xff00ffff, color); + expect(0xff00ffff, color); expect(0, bits[0]); expect(0, bits[1]); @@ -1713,7 +1791,7 @@ static void test_rotateflip(void) expect(Ok, stat); stat = GdipImageRotateFlip(bitmap, RotateNoneFlipY); - todo_wine expect(Ok, stat); + expect(Ok, stat); stat = GdipGetImageWidth(bitmap, &width); expect(Ok, stat); @@ -1724,19 +1802,19 @@ static void test_rotateflip(void) stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 0, &color); expect(Ok, stat); - todo_wine expect(0xff00ffff, color); + expect(0xff00ffff, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 2, 0, &color); expect(Ok, stat); - todo_wine expect(0xffffff00, color); + expect(0xffffff00, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 1, &color); expect(Ok, stat); - todo_wine expect(0xffff0000, color); + expect(0xffff0000, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 2, 1, &color); expect(Ok, stat); - todo_wine expect(0xff0000ff, color); + expect(0xff0000ff, color); expect(0, bits[0]); expect(0, bits[1]); @@ -1801,7 +1879,7 @@ static void test_remaptable(void) stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color); expect(Ok, stat); - todo_wine ok(color_match(0xffff00ff, color, 1), "Expected ffff00ff, got %.8x\n", color); + ok(color_match(0xffff00ff, color, 1), "Expected ffff00ff, got %.8x\n", color); GdipDeleteGraphics(graphics); GdipDisposeImage((GpImage*)bitmap1); diff --git a/rostests/winetests/inetcomm/mimeintl.c b/rostests/winetests/inetcomm/mimeintl.c index 563943f663b..f64d7d93d23 100644 --- a/rostests/winetests/inetcomm/mimeintl.c +++ b/rostests/winetests/inetcomm/mimeintl.c @@ -156,7 +156,7 @@ static void test_charset(void) hr = MimeOleGetInternat(&internat); ok(hr == S_OK, "ret %08x\n", hr); - hr = IMimeInternational_FindCharset(internat, "non-existent", &hcs); + hr = IMimeInternational_FindCharset(internat, "nonexistent", &hcs); ok(hr == MIME_E_NOT_FOUND, "got %08x\n", hr); hr = IMimeInternational_FindCharset(internat, "windows-1252", &hcs_windows_1252); diff --git a/rostests/winetests/jscript/regexp.js b/rostests/winetests/jscript/regexp.js index fac111227fe..7b74cb11421 100644 --- a/rostests/winetests/jscript/regexp.js +++ b/rostests/winetests/jscript/regexp.js @@ -113,6 +113,7 @@ ok(typeof(m) === "object", "typeof m is not object"); ok(m.length === 2, "m.length is not 2"); ok(m["0"] === "ab", "m[0] is not \"ab\""); ok(m["1"] === "ab", "m[1] is not \"ab\""); +/* ok(m.input === "abcabc", "m.input = " + m.input); */ m = "abcabc".match(/Ab/g); ok(typeof(m) === "object", "typeof m is not object"); @@ -167,6 +168,32 @@ ok(m["0"] === "ab", "m[0] is not \"ab\""); m = "abcabc".match(); ok(m === null, "m is not null"); +m = "abcabc".match(/(a)(b)cabc/); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 3, "m.length is not 3"); +ok(m[0] === "abcabc", "m[0] is not \"abc\""); +ok(m[1] === "a", "m[1] is not \"a\""); +ok(m[2] === "b", "m[2] is not \"b\""); + +re = /(a)bcabc/; +re.lastIndex = -3; +m = "abcabc".match(re); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 2, "m.length = " + m.length + "expected 3"); +ok(m[0] === "abcabc", "m[0] is not \"abc\""); +ok(m[1] === "a", "m[1] is not \"a\""); +ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex); + +re = /(a)bcabc/; +re.lastIndex = 2; +m = "abcabcxxx".match(re); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 2, "m.length = " + m.length + "expected 3"); +ok(m[0] === "abcabc", "m[0] is not \"abc\""); +ok(m[1] === "a", "m[1] is not \"a\""); +ok(m.input === "abcabcxxx", "m.input = " + m.input); +ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex); + r = "- [test] -".replace(re = /\[([^\[]+)\]/g, "success"); ok(r === "- success -", "r = " + r + " expected '- success -'"); ok(re.lastIndex === 8, "re.lastIndex = " + re.lastIndex); @@ -410,6 +437,19 @@ m = re.exec(" "); ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); ok(m === null, "m = " + m + " expected null"); +re = /a/; +re.lastIndex = -3; +ok(re.lastIndex === -3, "re.lastIndex = " + re.lastIndex + " expected -3"); +m = re.exec(" a a "); +ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 0"); +ok(m.index === 1, "m = " + m + " expected 1"); + +re.lastIndex = -1; +ok(re.lastIndex === -1, "re.lastIndex = " + re.lastIndex + " expected -1"); +m = re.exec(" "); +ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); +ok(m === null, "m = " + m + " expected null"); + re = /aa/g; i = 'baacd'.search(re); ok(i === 1, "'baacd'.search(re) = " + i); diff --git a/rostests/winetests/msctf/inputprocessor.c b/rostests/winetests/msctf/inputprocessor.c index 7ba9140573a..c445b41b01e 100644 --- a/rostests/winetests/msctf/inputprocessor.c +++ b/rostests/winetests/msctf/inputprocessor.c @@ -38,15 +38,28 @@ static ITfDocumentMgr *g_dm = NULL; static TfClientId cid = 0; static TfClientId tid = 0; +static ITextStoreACPSink *ACPSink; + #define SINK_UNEXPECTED 0 #define SINK_EXPECTED 1 #define SINK_FIRED 2 +#define SINK_IGNORE 3 +#define SINK_OPTIONAL 4 + +#define SINK_ACTION_MASK 0xff +#define SINK_OPTION_MASK 0xff00 +#define SINK_EXPECTED_COUNT_MASK 0xff0000 + +#define SINK_OPTION_TODO 0x0100 + +#define FOCUS_IGNORE (ITfDocumentMgr*)0xffffffff static BOOL test_ShouldActivate = FALSE; static BOOL test_ShouldDeactivate = FALSE; static DWORD tmSinkCookie; static DWORD tmSinkRefCount; +static DWORD documentStatus; static ITfDocumentMgr *test_CurrentFocus = NULL; static ITfDocumentMgr *test_PrevFocus = NULL; static INT test_OnSetFocus = SINK_UNEXPECTED; @@ -54,671 +67,81 @@ static INT test_OnInitDocumentMgr = SINK_UNEXPECTED; static INT test_OnPushContext = SINK_UNEXPECTED; static INT test_OnPopContext = SINK_UNEXPECTED; static INT test_KEV_OnSetFocus = SINK_UNEXPECTED; - -HRESULT RegisterTextService(REFCLSID rclsid); -HRESULT UnregisterTextService(); -HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut); -HRESULT TextStoreACP_Constructor(IUnknown **ppOut); - -DEFINE_GUID(CLSID_FakeService, 0xEDE1A7AD,0x66DE,0x47E0,0xB6,0x20,0x3E,0x92,0xF8,0x24,0x6B,0xF3); -DEFINE_GUID(CLSID_TF_InputProcessorProfiles, 0x33c53a50,0xf456,0x4884,0xb0,0x49,0x85,0xfd,0x64,0x3e,0xcf,0xed); -DEFINE_GUID(CLSID_TF_CategoryMgr, 0xA4B544A1,0x438D,0x4B41,0x93,0x25,0x86,0x95,0x23,0xE2,0xD6,0xC7); -DEFINE_GUID(GUID_TFCAT_TIP_KEYBOARD, 0x34745c63,0xb2f0,0x4784,0x8b,0x67,0x5e,0x12,0xc8,0x70,0x1a,0x31); -DEFINE_GUID(GUID_TFCAT_TIP_SPEECH, 0xB5A73CD1,0x8355,0x426B,0xA1,0x61,0x25,0x98,0x08,0xF2,0x6B,0x14); -DEFINE_GUID(GUID_TFCAT_TIP_HANDWRITING, 0x246ecb87,0xc2f2,0x4abe,0x90,0x5b,0xc8,0xb3,0x8a,0xdd,0x2c,0x43); -DEFINE_GUID (GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, 0x046B8C80,0x1647,0x40F7,0x9B,0x21,0xB9,0x3B,0x81,0xAA,0xBC,0x1B); -DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); -DEFINE_GUID(CLSID_TF_ThreadMgr, 0x529a9e6b,0x6587,0x4f23,0xab,0x9e,0x9c,0x7d,0x68,0x3e,0x3c,0x50); -DEFINE_GUID(CLSID_PreservedKey, 0xA0ED8E55,0xCD3B,0x4274,0xB2,0x95,0xF6,0xC9,0xBA,0x2B,0x84,0x72); +static INT test_ACP_AdviseSink = SINK_UNEXPECTED; +static INT test_ACP_GetStatus = SINK_UNEXPECTED; +static INT test_ACP_RequestLock = SINK_UNEXPECTED; +static INT test_ACP_GetEndACP = SINK_UNEXPECTED; +static INT test_ACP_GetSelection = SINK_UNEXPECTED; +static INT test_DoEditSession = SINK_UNEXPECTED; +static INT test_ACP_InsertTextAtSelection = SINK_UNEXPECTED; +static INT test_ACP_SetSelection = SINK_UNEXPECTED; +static INT test_OnEndEdit = SINK_UNEXPECTED; -static HRESULT initialize(void) +static inline int expected_count(int *sink) { - HRESULT hr; - CoInitialize(NULL); - hr = CoCreateInstance (&CLSID_TF_InputProcessorProfiles, NULL, - CLSCTX_INPROC_SERVER, &IID_ITfInputProcessorProfiles, (void**)&g_ipp); - if (SUCCEEDED(hr)) - hr = CoCreateInstance (&CLSID_TF_CategoryMgr, NULL, - CLSCTX_INPROC_SERVER, &IID_ITfCategoryMgr, (void**)&g_cm); - if (SUCCEEDED(hr)) - hr = CoCreateInstance (&CLSID_TF_ThreadMgr, NULL, - CLSCTX_INPROC_SERVER, &IID_ITfThreadMgr, (void**)&g_tm); - return hr; + return (*sink & SINK_EXPECTED_COUNT_MASK)>>16; } -static void cleanup(void) +static inline void _sink_fire_ok(INT *sink, const CHAR* name) { - if (g_ipp) - ITfInputProcessorProfiles_Release(g_ipp); - if (g_cm) - ITfCategoryMgr_Release(g_cm); - if (g_tm) - ITfThreadMgr_Release(g_tm); - CoUninitialize(); -} + int count; + int todo = *sink & SINK_OPTION_TODO; + int action = *sink & SINK_ACTION_MASK; -static void test_Register(void) -{ - HRESULT hr; + if (winetest_interactive) + winetest_trace("firing %s\n",name); - static const WCHAR szDesc[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',0}; - static const WCHAR szFile[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',' ','F','i','l','e',0}; - - hr = ITfInputProcessorProfiles_GetCurrentLanguage(g_ipp,&gLangid); - ok(SUCCEEDED(hr),"Unable to get current language id\n"); - trace("Current Language %x\n",gLangid); - - hr = RegisterTextService(&CLSID_FakeService); - ok(SUCCEEDED(hr),"Unable to register COM for TextService\n"); - hr = ITfInputProcessorProfiles_Register(g_ipp, &CLSID_FakeService); - ok(SUCCEEDED(hr),"Unable to register text service(%x)\n",hr); - hr = ITfInputProcessorProfiles_AddLanguageProfile(g_ipp, &CLSID_FakeService, gLangid, &CLSID_FakeService, szDesc, sizeof(szDesc)/sizeof(WCHAR), szFile, sizeof(szFile)/sizeof(WCHAR), 1); - ok(SUCCEEDED(hr),"Unable to add Language Profile (%x)\n",hr); -} - -static void test_Unregister(void) -{ - HRESULT hr; - hr = ITfInputProcessorProfiles_Unregister(g_ipp, &CLSID_FakeService); - ok(SUCCEEDED(hr),"Unable to unregister text service(%x)\n",hr); - UnregisterTextService(); -} - -static void test_EnumInputProcessorInfo(void) -{ - IEnumGUID *ppEnum; - BOOL found = FALSE; - - if (SUCCEEDED(ITfInputProcessorProfiles_EnumInputProcessorInfo(g_ipp, &ppEnum))) + switch (action) { - ULONG fetched; - GUID g; - while (IEnumGUID_Next(ppEnum, 1, &g, &fetched) == S_OK) - { - if(IsEqualGUID(&g,&CLSID_FakeService)) - found = TRUE; - } - } - ok(found,"Did not find registered text service\n"); -} - -static void test_EnumLanguageProfiles(void) -{ - BOOL found = FALSE; - IEnumTfLanguageProfiles *ppEnum; - if (SUCCEEDED(ITfInputProcessorProfiles_EnumLanguageProfiles(g_ipp,gLangid,&ppEnum))) - { - TF_LANGUAGEPROFILE profile; - while (IEnumTfLanguageProfiles_Next(ppEnum,1,&profile,NULL)==S_OK) - { - if (IsEqualGUID(&profile.clsid,&CLSID_FakeService)) + case SINK_OPTIONAL: + case SINK_EXPECTED: + count = expected_count(sink); + if (count > 1) { - found = TRUE; - ok(profile.langid == gLangid, "LangId Incorrect\n"); - ok(IsEqualGUID(&profile.catid,&GUID_TFCAT_TIP_KEYBOARD), "CatId Incorrect\n"); - ok(IsEqualGUID(&profile.guidProfile,&CLSID_FakeService), "guidProfile Incorrect\n"); + count --; + *sink = (*sink & ~SINK_EXPECTED_COUNT_MASK) + (count << 16); + return; } - } + break; + case SINK_IGNORE: + winetest_trace("Ignoring %s\n",name); + return; + default: + if (todo) + todo_wine winetest_ok(0, "Unexpected %s sink\n",name); + else + winetest_ok(0, "Unexpected %s sink\n",name); } - ok(found,"Registered text service not found\n"); + *sink = SINK_FIRED; } -static void test_RegisterCategory(void) +#define sink_fire_ok(a,b) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _sink_fire_ok(a,b) + +static inline void _sink_check_ok(INT *sink, const CHAR* name) { - HRESULT hr; - hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); - ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); - hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); - ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); -} + int action = *sink & SINK_ACTION_MASK; + int todo = *sink & SINK_OPTION_TODO; -static void test_UnregisterCategory(void) -{ - HRESULT hr; - hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); - ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); - hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); - ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); -} - -static void test_FindClosestCategory(void) -{ - GUID output; - HRESULT hr; - const GUID *list[3] = {&GUID_TFCAT_TIP_SPEECH, &GUID_TFCAT_TIP_KEYBOARD, &GUID_TFCAT_TIP_HANDWRITING}; - - hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, NULL, 0); - ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); - ok(IsEqualGUID(&output,&GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER),"Wrong GUID\n"); - - hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 1); - ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); - ok(IsEqualGUID(&output,&GUID_NULL),"Wrong GUID\n"); - - hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 3); - ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); - ok(IsEqualGUID(&output,&GUID_TFCAT_TIP_KEYBOARD),"Wrong GUID\n"); -} - -static void test_Enable(void) -{ - HRESULT hr; - BOOL enabled = FALSE; - - hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, TRUE); - ok(SUCCEEDED(hr),"Failed to enable text service\n"); - hr = ITfInputProcessorProfiles_IsEnabledLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, &enabled); - ok(SUCCEEDED(hr),"Failed to get enabled state\n"); - ok(enabled == TRUE,"enabled state incorrect\n"); -} - -static void test_Disable(void) -{ - HRESULT hr; - - trace("Disabling\n"); - hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, FALSE); - ok(SUCCEEDED(hr),"Failed to disable text service\n"); -} - -static void test_ThreadMgrAdviseSinks(void) -{ - ITfSource *source = NULL; - HRESULT hr; - IUnknown *sink; - - hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); - ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); - if (!source) - return; - - ThreadMgrEventSink_Constructor(&sink); - - tmSinkRefCount = 1; - tmSinkCookie = 0; - hr = ITfSource_AdviseSink(source,&IID_ITfThreadMgrEventSink, sink, &tmSinkCookie); - ok(SUCCEEDED(hr),"Failed to Advise Sink\n"); - ok(tmSinkCookie!=0,"Failed to get sink cookie\n"); - - /* Advising the sink adds a ref, Relesing here lets the object be deleted - when unadvised */ - tmSinkRefCount = 2; - IUnknown_Release(sink); - ITfSource_Release(source); -} - -static void test_ThreadMgrUnadviseSinks(void) -{ - ITfSource *source = NULL; - HRESULT hr; - - hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); - ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); - if (!source) - return; - - tmSinkRefCount = 1; - hr = ITfSource_UnadviseSink(source, tmSinkCookie); - ok(SUCCEEDED(hr),"Failed to unadvise Sink\n"); - ITfSource_Release(source); -} - -/********************************************************************** - * ITfKeyEventSink - **********************************************************************/ -typedef struct tagKeyEventSink -{ - const ITfKeyEventSinkVtbl *KeyEventSinkVtbl; - LONG refCount; -} KeyEventSink; - -static void KeyEventSink_Destructor(KeyEventSink *This) -{ - HeapFree(GetProcessHeap(),0,This); -} - -static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut) -{ - KeyEventSink *This = (KeyEventSink *)iface; - *ppvOut = NULL; - - if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink)) + switch (action) { - *ppvOut = This; + case SINK_OPTIONAL: + if (winetest_interactive) + winetest_trace("optional sink %s not fired\n",name); + case SINK_FIRED: + break; + case SINK_IGNORE: + return; + default: + if (todo) + todo_wine winetest_ok(0, "%s not fired as expected, in state %x\n",name,*sink); + else + winetest_ok(0, "%s not fired as expected, in state %x\n",name,*sink); } - - if (*ppvOut) - { - IUnknown_AddRef(iface); - return S_OK; - } - - return E_NOINTERFACE; + *sink = SINK_UNEXPECTED; } -static ULONG WINAPI KeyEventSink_AddRef(ITfKeyEventSink *iface) -{ - KeyEventSink *This = (KeyEventSink *)iface; - return InterlockedIncrement(&This->refCount); -} - -static ULONG WINAPI KeyEventSink_Release(ITfKeyEventSink *iface) -{ - KeyEventSink *This = (KeyEventSink *)iface; - ULONG ret; - - ret = InterlockedDecrement(&This->refCount); - if (ret == 0) - KeyEventSink_Destructor(This); - return ret; -} - -static HRESULT WINAPI KeyEventSink_OnSetFocus(ITfKeyEventSink *iface, - BOOL fForeground) -{ - ok(test_KEV_OnSetFocus == SINK_EXPECTED,"Unexpected KeyEventSink_OnSetFocus\n"); - test_KEV_OnSetFocus = SINK_FIRED; - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnTestKeyDown(ITfKeyEventSink *iface, - ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnTestKeyUp(ITfKeyEventSink *iface, - ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnKeyDown(ITfKeyEventSink *iface, - ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnKeyUp(ITfKeyEventSink *iface, - ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnPreservedKey(ITfKeyEventSink *iface, - ITfContext *pic, REFGUID rguid, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static const ITfKeyEventSinkVtbl KeyEventSink_KeyEventSinkVtbl = -{ - KeyEventSink_QueryInterface, - KeyEventSink_AddRef, - KeyEventSink_Release, - - KeyEventSink_OnSetFocus, - KeyEventSink_OnTestKeyDown, - KeyEventSink_OnTestKeyUp, - KeyEventSink_OnKeyDown, - KeyEventSink_OnKeyUp, - KeyEventSink_OnPreservedKey -}; - -HRESULT KeyEventSink_Constructor(ITfKeyEventSink **ppOut) -{ - KeyEventSink *This; - - This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(KeyEventSink)); - if (This == NULL) - return E_OUTOFMEMORY; - - This->KeyEventSinkVtbl = &KeyEventSink_KeyEventSinkVtbl; - This->refCount = 1; - - *ppOut = (ITfKeyEventSink*)This; - return S_OK; -} - - -static void test_KeystrokeMgr(void) -{ - ITfKeystrokeMgr *keymgr= NULL; - HRESULT hr; - TF_PRESERVEDKEY tfpk; - BOOL preserved; - ITfKeyEventSink *sink; - - KeyEventSink_Constructor(&sink); - - hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfKeystrokeMgr, (LPVOID*)&keymgr); - ok(SUCCEEDED(hr),"Failed to get IID_ITfKeystrokeMgr for ThreadMgr\n"); - - tfpk.uVKey = 'A'; - tfpk.uModifiers = TF_MOD_SHIFT; - - test_KEV_OnSetFocus = SINK_EXPECTED; - hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,tid,sink,TRUE); - todo_wine ok(SUCCEEDED(hr),"ITfKeystrokeMgr_AdviseKeyEventSink failed\n"); - todo_wine ok(test_KEV_OnSetFocus == SINK_FIRED, "KeyEventSink_OnSetFocus not fired as expected\n"); - - hr =ITfKeystrokeMgr_PreserveKey(keymgr, 0, &CLSID_PreservedKey, &tfpk, NULL, 0); - ok(hr==E_INVALIDARG,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); - - hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); - ok(SUCCEEDED(hr),"ITfKeystrokeMgr_PreserveKey failed\n"); - - hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); - ok(hr == TF_E_ALREADY_EXISTS,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); - - preserved = FALSE; - hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); - ok(hr == S_OK, "ITfKeystrokeMgr_IsPreservedKey failed\n"); - if (hr == S_OK) ok(preserved == TRUE,"misreporting preserved key\n"); - - hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); - ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnpreserveKey failed\n"); - - hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); - ok(hr == S_FALSE, "ITfKeystrokeMgr_IsPreservedKey failed\n"); - if (hr == S_FALSE) ok(preserved == FALSE,"misreporting preserved key\n"); - - hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); - ok(hr==CONNECT_E_NOCONNECTION,"ITfKeystrokeMgr_UnpreserveKey inproperly succeeded\n"); - - hr = ITfKeystrokeMgr_UnadviseKeyEventSink(keymgr,tid); - todo_wine ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnadviseKeyEventSink failed\n"); - - ITfKeystrokeMgr_Release(keymgr); - ITfKeyEventSink_Release(sink); -} - -static void test_Activate(void) -{ - HRESULT hr; - - hr = ITfInputProcessorProfiles_ActivateLanguageProfile(g_ipp,&CLSID_FakeService,gLangid,&CLSID_FakeService); - ok(SUCCEEDED(hr),"Failed to Activate text service\n"); -} - -static inline int check_context_refcount(ITfContext *iface) -{ - IUnknown_AddRef(iface); - return IUnknown_Release(iface); -} - -static void test_startSession(void) -{ - HRESULT hr; - DWORD cnt; - DWORD editCookie; - ITfDocumentMgr *dmtest; - ITfContext *cxt,*cxt2,*cxt3,*cxtTest; - ITextStoreACP *ts; - TfClientId cid2 = 0; - - hr = ITfThreadMgr_Deactivate(g_tm); - ok(hr == E_UNEXPECTED,"Deactivate should have failed with E_UNEXPECTED\n"); - - test_ShouldActivate = TRUE; - hr = ITfThreadMgr_Activate(g_tm,&cid); - ok(SUCCEEDED(hr),"Failed to Activate\n"); - ok(cid != tid,"TextService id mistakenly matches Client id\n"); - - test_ShouldActivate = FALSE; - hr = ITfThreadMgr_Activate(g_tm,&cid2); - ok(SUCCEEDED(hr),"Failed to Activate\n"); - ok (cid == cid2, "Second activate client ID does not match\n"); - - hr = ITfThreadMgr_Deactivate(g_tm); - ok(SUCCEEDED(hr),"Failed to Deactivate\n"); - - hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&g_dm); - ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); - - hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); - ok(SUCCEEDED(hr),"GetFocus Failed\n"); - ok(dmtest == NULL,"Initial focus not null\n"); - - test_CurrentFocus = g_dm; - test_PrevFocus = NULL; - test_OnSetFocus = SINK_EXPECTED; - hr = ITfThreadMgr_SetFocus(g_tm,g_dm); - ok(SUCCEEDED(hr),"SetFocus Failed\n"); - ok(test_OnSetFocus == SINK_FIRED, "OnSetFocus sink not called\n"); - test_OnSetFocus = SINK_UNEXPECTED; - - hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); - ok(SUCCEEDED(hr),"GetFocus Failed\n"); - ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); - - cnt = ITfDocumentMgr_Release(g_dm); - ok(cnt == 2,"DocumentMgr refcount not expected (2 vs %i)\n",cnt); - - hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); - ok(SUCCEEDED(hr),"GetFocus Failed\n"); - ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); - - TextStoreACP_Constructor((IUnknown**)&ts); - - hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, (IUnknown*)ts, &cxt, &editCookie); - ok(SUCCEEDED(hr),"CreateContext Failed\n"); - - hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt2, &editCookie); - ok(SUCCEEDED(hr),"CreateContext Failed\n"); - - hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt3, &editCookie); - ok(SUCCEEDED(hr),"CreateContext Failed\n"); - - cnt = check_context_refcount(cxt); - test_OnPushContext = SINK_EXPECTED; - test_OnInitDocumentMgr = SINK_EXPECTED; - hr = ITfDocumentMgr_Push(g_dm, cxt); - ok(SUCCEEDED(hr),"Push Failed\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - ok(test_OnPushContext == SINK_FIRED, "OnPushContext sink not fired\n"); - ok(test_OnInitDocumentMgr == SINK_FIRED, "OnInitDocumentMgr sink not fired\n"); - - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt, "Wrong context on top\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - cnt = ITfContext_Release(cxtTest); - - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on Base\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - check_context_refcount(cxt2); - test_OnPushContext = SINK_EXPECTED; - hr = ITfDocumentMgr_Push(g_dm, cxt2); - ok(SUCCEEDED(hr),"Push Failed\n"); - ok(test_OnPushContext == SINK_FIRED, "OnPushContext sink not fired\n"); - - cnt = check_context_refcount(cxt2); - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt2, "Wrong context on top\n"); - ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - cnt = check_context_refcount(cxt); - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on Base\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - cnt = check_context_refcount(cxt3); - hr = ITfDocumentMgr_Push(g_dm, cxt3); - ok(!SUCCEEDED(hr),"Push Succeeded\n"); - ok(check_context_refcount(cxt3) == cnt, "Ref changed\n"); - - cnt = check_context_refcount(cxt2); - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt2, "Wrong context on top\n"); - ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - cnt = check_context_refcount(cxt); - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on Base\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - cnt = check_context_refcount(cxt2); - test_OnPopContext = SINK_EXPECTED; - hr = ITfDocumentMgr_Pop(g_dm, 0); - ok(SUCCEEDED(hr),"Pop Failed\n"); - ok(check_context_refcount(cxt2) < cnt, "Ref count did not decrease\n"); - ok(test_OnPopContext == SINK_FIRED, "OnPopContext sink not fired\n"); - - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt, "Wrong context on top\n"); - ITfContext_Release(cxtTest); - - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on base\n"); - ITfContext_Release(cxtTest); - - hr = ITfDocumentMgr_Pop(g_dm, 0); - ok(!SUCCEEDED(hr),"Pop Succeeded\n"); - - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt, "Wrong context on top\n"); - ITfContext_Release(cxtTest); - - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on base\n"); - ITfContext_Release(cxtTest); - - ITfContext_Release(cxt); - ITfContext_Release(cxt2); - ITfContext_Release(cxt3); -} - -static void test_endSession(void) -{ - HRESULT hr; - test_ShouldDeactivate = TRUE; - test_CurrentFocus = NULL; - test_PrevFocus = g_dm; - test_OnSetFocus = SINK_EXPECTED; - hr = ITfThreadMgr_Deactivate(g_tm); - ok(SUCCEEDED(hr),"Failed to Deactivate\n"); - ok(test_OnSetFocus == SINK_FIRED, "OnSetFocus sink not called\n"); - test_OnSetFocus = SINK_UNEXPECTED; -} - -static void test_TfGuidAtom(void) -{ - GUID gtest,g1; - HRESULT hr; - TfGuidAtom atom1,atom2; - BOOL equal; - - CoCreateGuid(>est); - - /* msdn reports this should return E_INVALIDARG. However my test show it crashing (winxp)*/ - /* - hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,NULL); - ok(hr==E_INVALIDARG,"ITfCategoryMgr_RegisterGUID should have failed\n"); - */ - hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom1); - ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); - hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom2); - ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); - ok(atom1 == atom2,"atoms do not match\n"); - hr = ITfCategoryMgr_GetGUID(g_cm,atom2,NULL); - ok(hr==E_INVALIDARG,"ITfCategoryMgr_GetGUID should have failed\n"); - hr = ITfCategoryMgr_GetGUID(g_cm,atom2,&g1); - ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); - ok(IsEqualGUID(&g1,>est),"guids do not match\n"); - hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,NULL); - ok(hr==E_INVALIDARG,"ITfCategoryMgr_IsEqualTfGuidAtom should have failed\n"); - hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,&equal); - ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); - ok(equal == TRUE,"Equal value invalid\n"); - - /* show that cid and tid TfClientIds are also TfGuidAtoms */ - hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,tid,&CLSID_FakeService,&equal); - ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); - ok(equal == TRUE,"Equal value invalid\n"); - hr = ITfCategoryMgr_GetGUID(g_cm,cid,&g1); - ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); - ok(!IsEqualGUID(&g1,&GUID_NULL),"guid should not be NULL\n"); -} - -static void test_ClientId(void) -{ - ITfClientId *pcid; - TfClientId id1,id2; - HRESULT hr; - GUID g2; - - hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfClientId, (LPVOID*)&pcid); - ok(SUCCEEDED(hr),"Unable to aquire ITfClientId interface\n"); - - CoCreateGuid(&g2); - - hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id1); - ok(SUCCEEDED(hr),"GetClientId failed\n"); - hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id2); - ok(SUCCEEDED(hr),"GetClientId failed\n"); - ok(id1==id2,"Id's for GUID_NULL do not match\n"); - hr = ITfClientId_GetClientId(pcid,&CLSID_FakeService,&id2); - ok(SUCCEEDED(hr),"GetClientId failed\n"); - ok(id2!=id1,"Id matches GUID_NULL\n"); - ok(id2==tid,"Id for CLSID_FakeService not matching tid\n"); - ok(id2!=cid,"Id for CLSID_FakeService matching cid\n"); - hr = ITfClientId_GetClientId(pcid,&g2,&id2); - ok(SUCCEEDED(hr),"GetClientId failed\n"); - ok(id2!=id1,"Id matches GUID_NULL\n"); - ok(id2!=tid,"Id for random guid matching tid\n"); - ok(id2!=cid,"Id for random guid matching cid\n"); - ITfClientId_Release(pcid); -} - -START_TEST(inputprocessor) -{ - if (SUCCEEDED(initialize())) - { - test_Register(); - test_RegisterCategory(); - test_EnumInputProcessorInfo(); - test_Enable(); - test_ThreadMgrAdviseSinks(); - test_Activate(); - test_startSession(); - test_TfGuidAtom(); - test_ClientId(); - test_KeystrokeMgr(); - test_endSession(); - test_EnumLanguageProfiles(); - test_FindClosestCategory(); - test_Disable(); - test_ThreadMgrUnadviseSinks(); - test_UnregisterCategory(); - test_Unregister(); - } - else - skip("Unable to create InputProcessor\n"); - cleanup(); -} +#define sink_check_ok(a,b) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _sink_check_ok(a,b) /********************************************************************** * ITextStoreACP @@ -727,6 +150,7 @@ typedef struct tagTextStoreACP { const ITextStoreACPVtbl *TextStoreACPVtbl; LONG refCount; + } TextStoreACP; static void TextStoreACP_Destructor(TextStoreACP *This) @@ -773,7 +197,12 @@ static ULONG WINAPI TextStoreACP_Release(ITextStoreACP *iface) static HRESULT WINAPI TextStoreACP_AdviseSink(ITextStoreACP *iface, REFIID riid, IUnknown *punk, DWORD dwMask) { - trace("\n"); + HRESULT hr; + + sink_fire_ok(&test_ACP_AdviseSink,"TextStoreACP_AdviseSink"); + + hr = IUnknown_QueryInterface(punk, &IID_ITextStoreACPSink,(LPVOID*)(&ACPSink)); + ok(SUCCEEDED(hr),"Unable to QueryInterface on sink\n"); return S_OK; } @@ -783,16 +212,19 @@ static HRESULT WINAPI TextStoreACP_UnadviseSink(ITextStoreACP *iface, trace("\n"); return S_OK; } + static HRESULT WINAPI TextStoreACP_RequestLock(ITextStoreACP *iface, DWORD dwLockFlags, HRESULT *phrSession) { - trace("\n"); + sink_fire_ok(&test_ACP_RequestLock,"TextStoreACP_RequestLock"); + *phrSession = ITextStoreACPSink_OnLockGranted(ACPSink, dwLockFlags); return S_OK; } static HRESULT WINAPI TextStoreACP_GetStatus(ITextStoreACP *iface, TS_STATUS *pdcs) { - trace("\n"); + sink_fire_ok(&test_ACP_GetStatus,"TextStoreACP_GetStatus"); + pdcs->dwDynamicFlags = documentStatus; return S_OK; } static HRESULT WINAPI TextStoreACP_QueryInsert(ITextStoreACP *iface, @@ -805,13 +237,20 @@ static HRESULT WINAPI TextStoreACP_QueryInsert(ITextStoreACP *iface, static HRESULT WINAPI TextStoreACP_GetSelection(ITextStoreACP *iface, ULONG ulIndex, ULONG ulCount, TS_SELECTION_ACP *pSelection, ULONG *pcFetched) { - trace("\n"); + sink_fire_ok(&test_ACP_GetSelection,"TextStoreACP_GetSelection"); + + pSelection->acpStart = 10; + pSelection->acpEnd = 20; + pSelection->style.fInterimChar = 0; + pSelection->style.ase = TS_AE_NONE; + *pcFetched = 1; + return S_OK; } static HRESULT WINAPI TextStoreACP_SetSelection(ITextStoreACP *iface, ULONG ulCount, const TS_SELECTION_ACP *pSelection) { - trace("\n"); + sink_fire_ok(&test_ACP_SetSelection,"TextStoreACP_SetSelection"); return S_OK; } static HRESULT WINAPI TextStoreACP_GetText(ITextStoreACP *iface, @@ -858,7 +297,7 @@ static HRESULT WINAPI TextStoreACP_InsertTextAtSelection(ITextStoreACP *iface, DWORD dwFlags, const WCHAR *pchText, ULONG cch, LONG *pacpStart, LONG *pacpEnd, TS_TEXTCHANGE *pChange) { - trace("\n"); + sink_fire_ok(&test_ACP_InsertTextAtSelection,"TextStoreACP_InsertTextAtSelection"); return S_OK; } static HRESULT WINAPI TextStoreACP_InsertEmbeddedAtSelection(ITextStoreACP *iface, @@ -904,7 +343,7 @@ static HRESULT WINAPI TextStoreACP_RetrieveRequestedAttrs(ITextStoreACP *iface, static HRESULT WINAPI TextStoreACP_GetEndACP(ITextStoreACP *iface, LONG *pacp) { - trace("\n"); + sink_fire_ok(&test_ACP_GetEndACP,"TextStoreACP_GetEndACP"); return S_OK; } static HRESULT WINAPI TextStoreACP_GetActiveView(ITextStoreACP *iface, @@ -974,7 +413,7 @@ static const ITextStoreACPVtbl TextStoreACP_TextStoreACPVtbl = TextStoreACP_GetWnd }; -HRESULT TextStoreACP_Constructor(IUnknown **ppOut) +static HRESULT TextStoreACP_Constructor(IUnknown **ppOut) { TextStoreACP *This; @@ -1044,8 +483,7 @@ static ULONG WINAPI ThreadMgrEventSink_Release(ITfThreadMgrEventSink *iface) static HRESULT WINAPI ThreadMgrEventSink_OnInitDocumentMgr(ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdim) { - ok(test_OnInitDocumentMgr == SINK_EXPECTED, "Unexpected OnInitDocumentMgr sink\n"); - test_OnInitDocumentMgr = SINK_FIRED; + sink_fire_ok(&test_OnInitDocumentMgr,"ThreadMgrEventSink_OnInitDocumentMgr"); return S_OK; } @@ -1059,26 +497,53 @@ ITfDocumentMgr *pdim) static HRESULT WINAPI ThreadMgrEventSink_OnSetFocus(ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdimFocus, ITfDocumentMgr *pdimPrevFocus) { - ok(test_OnSetFocus == SINK_EXPECTED, "Unexpected OnSetFocus sink\n"); - ok(pdimFocus == test_CurrentFocus,"Sink reports wrong focus\n"); - ok(pdimPrevFocus == test_PrevFocus,"Sink reports wrong previous focus\n"); - test_OnSetFocus = SINK_FIRED; + sink_fire_ok(&test_OnSetFocus,"ThreadMgrEventSink_OnSetFocus"); + if (test_CurrentFocus != FOCUS_IGNORE) + ok(pdimFocus == test_CurrentFocus,"Sink reports wrong focus\n"); + if (test_PrevFocus != FOCUS_IGNORE) + ok(pdimPrevFocus == test_PrevFocus,"Sink reports wrong previous focus\n"); return S_OK; } static HRESULT WINAPI ThreadMgrEventSink_OnPushContext(ITfThreadMgrEventSink *iface, ITfContext *pic) { - ok(test_OnPushContext == SINK_EXPECTED, "Unexpected OnPushContext sink\n"); - test_OnPushContext = SINK_FIRED; + HRESULT hr; + ITfDocumentMgr *docmgr; + ITfContext *test; + + hr = ITfContext_GetDocumentMgr(pic,&docmgr); + ok(SUCCEEDED(hr),"GetDocumenMgr failed\n"); + test = (ITfContext*)0xdeadbeef; + ITfDocumentMgr_Release(docmgr); + hr = ITfDocumentMgr_GetTop(docmgr,&test); + ok(SUCCEEDED(hr),"GetTop failed\n"); + ok(test == pic, "Wrong context is on top\n"); + if (test) + ITfContext_Release(test); + + sink_fire_ok(&test_OnPushContext,"ThreadMgrEventSink_OnPushContext"); return S_OK; } static HRESULT WINAPI ThreadMgrEventSink_OnPopContext(ITfThreadMgrEventSink *iface, ITfContext *pic) { - ok(test_OnPopContext == SINK_EXPECTED, "Unexpected OnPopContext sink\n"); - test_OnPopContext = SINK_FIRED; + HRESULT hr; + ITfDocumentMgr *docmgr; + ITfContext *test; + + hr = ITfContext_GetDocumentMgr(pic,&docmgr); + ok(SUCCEEDED(hr),"GetDocumenMgr failed\n"); + ITfDocumentMgr_Release(docmgr); + test = (ITfContext*)0xdeadbeef; + hr = ITfDocumentMgr_GetTop(docmgr,&test); + ok(SUCCEEDED(hr),"GetTop failed\n"); + ok(test == pic, "Wrong context is on top\n"); + if (test) + ITfContext_Release(test); + + sink_fire_ok(&test_OnPopContext,"ThreadMgrEventSink_OnPopContext"); return S_OK; } @@ -1095,7 +560,7 @@ static const ITfThreadMgrEventSinkVtbl ThreadMgrEventSink_ThreadMgrEventSinkVtbl ThreadMgrEventSink_OnPopContext }; -HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut) +static HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut) { ThreadMgrEventSink *This; @@ -1282,7 +747,7 @@ static const ITfTextInputProcessorVtbl TextService_TextInputProcessorVtbl= TextService_Deactivate }; -HRESULT TextService_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +static HRESULT TextService_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) { TextService *This; if (pUnkOuter) @@ -1299,13 +764,1339 @@ HRESULT TextService_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) return S_OK; } -HRESULT RegisterTextService(REFCLSID rclsid) +static HRESULT RegisterTextService(REFCLSID rclsid) { ClassFactory_Constructor( TextService_Constructor ,(LPVOID*)&cf); return CoRegisterClassObject(rclsid, (IUnknown*) cf, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®id); } -HRESULT UnregisterTextService() +static HRESULT UnregisterTextService(void) { return CoRevokeClassObject(regid); } + +/* + * The tests + */ + +DEFINE_GUID(CLSID_FakeService, 0xEDE1A7AD,0x66DE,0x47E0,0xB6,0x20,0x3E,0x92,0xF8,0x24,0x6B,0xF3); +DEFINE_GUID(CLSID_TF_InputProcessorProfiles, 0x33c53a50,0xf456,0x4884,0xb0,0x49,0x85,0xfd,0x64,0x3e,0xcf,0xed); +DEFINE_GUID(CLSID_TF_CategoryMgr, 0xA4B544A1,0x438D,0x4B41,0x93,0x25,0x86,0x95,0x23,0xE2,0xD6,0xC7); +DEFINE_GUID(GUID_TFCAT_TIP_KEYBOARD, 0x34745c63,0xb2f0,0x4784,0x8b,0x67,0x5e,0x12,0xc8,0x70,0x1a,0x31); +DEFINE_GUID(GUID_TFCAT_TIP_SPEECH, 0xB5A73CD1,0x8355,0x426B,0xA1,0x61,0x25,0x98,0x08,0xF2,0x6B,0x14); +DEFINE_GUID(GUID_TFCAT_TIP_HANDWRITING, 0x246ecb87,0xc2f2,0x4abe,0x90,0x5b,0xc8,0xb3,0x8a,0xdd,0x2c,0x43); +DEFINE_GUID (GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, 0x046B8C80,0x1647,0x40F7,0x9B,0x21,0xB9,0x3B,0x81,0xAA,0xBC,0x1B); +DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); +DEFINE_GUID(CLSID_TF_ThreadMgr, 0x529a9e6b,0x6587,0x4f23,0xab,0x9e,0x9c,0x7d,0x68,0x3e,0x3c,0x50); +DEFINE_GUID(CLSID_PreservedKey, 0xA0ED8E55,0xCD3B,0x4274,0xB2,0x95,0xF6,0xC9,0xBA,0x2B,0x84,0x72); +DEFINE_GUID(GUID_COMPARTMENT_KEYBOARD_DISABLED, 0x71a5b253,0x1951,0x466b,0x9f,0xbc,0x9c,0x88,0x08,0xfa,0x84,0xf2); +DEFINE_GUID(GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, 0x58273aad,0x01bb,0x4164,0x95,0xc6,0x75,0x5b,0xa0,0xb5,0x16,0x2d); +DEFINE_GUID(GUID_COMPARTMENT_HANDWRITING_OPENCLOSE, 0xf9ae2c6b,0x1866,0x4361,0xaf,0x72,0x7a,0xa3,0x09,0x48,0x89,0x0e); +DEFINE_GUID(GUID_COMPARTMENT_SPEECH_DISABLED, 0x56c5c607,0x0703,0x4e59,0x8e,0x52,0xcb,0xc8,0x4e,0x8b,0xbe,0x35); +DEFINE_GUID(GUID_COMPARTMENT_SPEECH_OPENCLOSE, 0x544d6a63,0xe2e8,0x4752,0xbb,0xd1,0x00,0x09,0x60,0xbc,0xa0,0x83); +DEFINE_GUID(GUID_COMPARTMENT_SPEECH_GLOBALSTATE, 0x2a54fe8e,0x0d08,0x460c,0xa7,0x5d,0x87,0x03,0x5f,0xf4,0x36,0xc5); +DEFINE_GUID(GUID_COMPARTMENT_PERSISTMENUENABLED, 0x575f3783,0x70c8,0x47c8,0xae,0x5d,0x91,0xa0,0x1a,0x1f,0x75,0x92); +DEFINE_GUID(GUID_COMPARTMENT_EMPTYCONTEXT, 0xd7487dbf,0x804e,0x41c5,0x89,0x4d,0xad,0x96,0xfd,0x4e,0xea,0x13); +DEFINE_GUID(GUID_COMPARTMENT_TIPUISTATUS, 0x148ca3ec,0x0366,0x401c,0x8d,0x75,0xed,0x97,0x8d,0x85,0xfb,0xc9); + +static HRESULT initialize(void) +{ + HRESULT hr; + CoInitialize(NULL); + hr = CoCreateInstance (&CLSID_TF_InputProcessorProfiles, NULL, + CLSCTX_INPROC_SERVER, &IID_ITfInputProcessorProfiles, (void**)&g_ipp); + if (SUCCEEDED(hr)) + hr = CoCreateInstance (&CLSID_TF_CategoryMgr, NULL, + CLSCTX_INPROC_SERVER, &IID_ITfCategoryMgr, (void**)&g_cm); + if (SUCCEEDED(hr)) + hr = CoCreateInstance (&CLSID_TF_ThreadMgr, NULL, + CLSCTX_INPROC_SERVER, &IID_ITfThreadMgr, (void**)&g_tm); + return hr; +} + +static void cleanup(void) +{ + if (g_ipp) + ITfInputProcessorProfiles_Release(g_ipp); + if (g_cm) + ITfCategoryMgr_Release(g_cm); + if (g_tm) + ITfThreadMgr_Release(g_tm); + CoUninitialize(); +} + +static void test_Register(void) +{ + HRESULT hr; + + static const WCHAR szDesc[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',0}; + static const WCHAR szFile[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',' ','F','i','l','e',0}; + + hr = ITfInputProcessorProfiles_GetCurrentLanguage(g_ipp,&gLangid); + ok(SUCCEEDED(hr),"Unable to get current language id\n"); + trace("Current Language %x\n",gLangid); + + hr = RegisterTextService(&CLSID_FakeService); + ok(SUCCEEDED(hr),"Unable to register COM for TextService\n"); + hr = ITfInputProcessorProfiles_Register(g_ipp, &CLSID_FakeService); + ok(SUCCEEDED(hr),"Unable to register text service(%x)\n",hr); + hr = ITfInputProcessorProfiles_AddLanguageProfile(g_ipp, &CLSID_FakeService, gLangid, &CLSID_FakeService, szDesc, sizeof(szDesc)/sizeof(WCHAR), szFile, sizeof(szFile)/sizeof(WCHAR), 1); + ok(SUCCEEDED(hr),"Unable to add Language Profile (%x)\n",hr); +} + +static void test_Unregister(void) +{ + HRESULT hr; + hr = ITfInputProcessorProfiles_Unregister(g_ipp, &CLSID_FakeService); + ok(SUCCEEDED(hr),"Unable to unregister text service(%x)\n",hr); + UnregisterTextService(); +} + +static void test_EnumInputProcessorInfo(void) +{ + IEnumGUID *ppEnum; + BOOL found = FALSE; + + if (SUCCEEDED(ITfInputProcessorProfiles_EnumInputProcessorInfo(g_ipp, &ppEnum))) + { + ULONG fetched; + GUID g; + while (IEnumGUID_Next(ppEnum, 1, &g, &fetched) == S_OK) + { + if(IsEqualGUID(&g,&CLSID_FakeService)) + found = TRUE; + } + } + ok(found,"Did not find registered text service\n"); +} + +static void test_EnumLanguageProfiles(void) +{ + BOOL found = FALSE; + IEnumTfLanguageProfiles *ppEnum; + if (SUCCEEDED(ITfInputProcessorProfiles_EnumLanguageProfiles(g_ipp,gLangid,&ppEnum))) + { + TF_LANGUAGEPROFILE profile; + while (IEnumTfLanguageProfiles_Next(ppEnum,1,&profile,NULL)==S_OK) + { + if (IsEqualGUID(&profile.clsid,&CLSID_FakeService)) + { + found = TRUE; + ok(profile.langid == gLangid, "LangId Incorrect\n"); + ok(IsEqualGUID(&profile.catid,&GUID_TFCAT_TIP_KEYBOARD), "CatId Incorrect\n"); + ok(IsEqualGUID(&profile.guidProfile,&CLSID_FakeService), "guidProfile Incorrect\n"); + } + } + } + ok(found,"Registered text service not found\n"); +} + +static void test_RegisterCategory(void) +{ + HRESULT hr; + hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); + hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); +} + +static void test_UnregisterCategory(void) +{ + HRESULT hr; + hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); + hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); +} + +static void test_FindClosestCategory(void) +{ + GUID output; + HRESULT hr; + const GUID *list[3] = {&GUID_TFCAT_TIP_SPEECH, &GUID_TFCAT_TIP_KEYBOARD, &GUID_TFCAT_TIP_HANDWRITING}; + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, NULL, 0); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER),"Wrong GUID\n"); + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_NULL),"Wrong GUID\n"); + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 3); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_TFCAT_TIP_KEYBOARD),"Wrong GUID\n"); +} + +static void test_Enable(void) +{ + HRESULT hr; + BOOL enabled = FALSE; + + hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, TRUE); + ok(SUCCEEDED(hr),"Failed to enable text service\n"); + hr = ITfInputProcessorProfiles_IsEnabledLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, &enabled); + ok(SUCCEEDED(hr),"Failed to get enabled state\n"); + ok(enabled == TRUE,"enabled state incorrect\n"); +} + +static void test_Disable(void) +{ + HRESULT hr; + + trace("Disabling\n"); + hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, FALSE); + ok(SUCCEEDED(hr),"Failed to disable text service\n"); +} + +static void test_ThreadMgrAdviseSinks(void) +{ + ITfSource *source = NULL; + HRESULT hr; + IUnknown *sink; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); + ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); + if (!source) + return; + + hr = ThreadMgrEventSink_Constructor(&sink); + ok(hr == S_OK, "got %08x\n", hr); + if(FAILED(hr)) return; + + tmSinkRefCount = 1; + tmSinkCookie = 0; + hr = ITfSource_AdviseSink(source,&IID_ITfThreadMgrEventSink, sink, &tmSinkCookie); + ok(SUCCEEDED(hr),"Failed to Advise Sink\n"); + ok(tmSinkCookie!=0,"Failed to get sink cookie\n"); + + /* Advising the sink adds a ref, Relesing here lets the object be deleted + when unadvised */ + tmSinkRefCount = 2; + IUnknown_Release(sink); + ITfSource_Release(source); +} + +static void test_ThreadMgrUnadviseSinks(void) +{ + ITfSource *source = NULL; + HRESULT hr; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); + ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); + if (!source) + return; + + tmSinkRefCount = 1; + hr = ITfSource_UnadviseSink(source, tmSinkCookie); + ok(SUCCEEDED(hr),"Failed to unadvise Sink\n"); + ITfSource_Release(source); +} + +/********************************************************************** + * ITfKeyEventSink + **********************************************************************/ +typedef struct tagKeyEventSink +{ + const ITfKeyEventSinkVtbl *KeyEventSinkVtbl; + LONG refCount; +} KeyEventSink; + +static void KeyEventSink_Destructor(KeyEventSink *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut) +{ + KeyEventSink *This = (KeyEventSink *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI KeyEventSink_AddRef(ITfKeyEventSink *iface) +{ + KeyEventSink *This = (KeyEventSink *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI KeyEventSink_Release(ITfKeyEventSink *iface) +{ + KeyEventSink *This = (KeyEventSink *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + KeyEventSink_Destructor(This); + return ret; +} + +static HRESULT WINAPI KeyEventSink_OnSetFocus(ITfKeyEventSink *iface, + BOOL fForeground) +{ + sink_fire_ok(&test_KEV_OnSetFocus,"KeyEventSink_OnSetFocus"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnTestKeyDown(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnTestKeyUp(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnKeyDown(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnKeyUp(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnPreservedKey(ITfKeyEventSink *iface, + ITfContext *pic, REFGUID rguid, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static const ITfKeyEventSinkVtbl KeyEventSink_KeyEventSinkVtbl = +{ + KeyEventSink_QueryInterface, + KeyEventSink_AddRef, + KeyEventSink_Release, + + KeyEventSink_OnSetFocus, + KeyEventSink_OnTestKeyDown, + KeyEventSink_OnTestKeyUp, + KeyEventSink_OnKeyDown, + KeyEventSink_OnKeyUp, + KeyEventSink_OnPreservedKey +}; + +static HRESULT KeyEventSink_Constructor(ITfKeyEventSink **ppOut) +{ + KeyEventSink *This; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(KeyEventSink)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->KeyEventSinkVtbl = &KeyEventSink_KeyEventSinkVtbl; + This->refCount = 1; + + *ppOut = (ITfKeyEventSink*)This; + return S_OK; +} + + +static void test_KeystrokeMgr(void) +{ + ITfKeystrokeMgr *keymgr= NULL; + HRESULT hr; + TF_PRESERVEDKEY tfpk; + BOOL preserved; + ITfKeyEventSink *sink = NULL; + + KeyEventSink_Constructor(&sink); + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfKeystrokeMgr, (LPVOID*)&keymgr); + ok(SUCCEEDED(hr),"Failed to get IID_ITfKeystrokeMgr for ThreadMgr\n"); + + tfpk.uVKey = 'A'; + tfpk.uModifiers = TF_MOD_SHIFT; + + test_KEV_OnSetFocus = SINK_EXPECTED; + hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,tid,sink,TRUE); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_AdviseKeyEventSink failed\n"); + sink_check_ok(&test_KEV_OnSetFocus,"KeyEventSink_OnSetFocus"); + hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,tid,sink,TRUE); + ok(hr == CONNECT_E_ADVISELIMIT,"Wrong return, expected CONNECT_E_ADVISELIMIT\n"); + hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,cid,sink,TRUE); + ok(hr == E_INVALIDARG,"Wrong return, expected E_INVALIDARG\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, 0, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(hr==E_INVALIDARG,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_PreserveKey failed\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(hr == TF_E_ALREADY_EXISTS,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); + + preserved = FALSE; + hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); + ok(hr == S_OK, "ITfKeystrokeMgr_IsPreservedKey failed\n"); + if (hr == S_OK) ok(preserved == TRUE,"misreporting preserved key\n"); + + hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnpreserveKey failed\n"); + + hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); + ok(hr == S_FALSE, "ITfKeystrokeMgr_IsPreservedKey failed\n"); + if (hr == S_FALSE) ok(preserved == FALSE,"misreporting preserved key\n"); + + hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); + ok(hr==CONNECT_E_NOCONNECTION,"ITfKeystrokeMgr_UnpreserveKey inproperly succeeded\n"); + + hr = ITfKeystrokeMgr_UnadviseKeyEventSink(keymgr,tid); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnadviseKeyEventSink failed\n"); + + ITfKeystrokeMgr_Release(keymgr); + ITfKeyEventSink_Release(sink); +} + +static void test_Activate(void) +{ + HRESULT hr; + + hr = ITfInputProcessorProfiles_ActivateLanguageProfile(g_ipp,&CLSID_FakeService,gLangid,&CLSID_FakeService); + ok(SUCCEEDED(hr),"Failed to Activate text service\n"); +} + + +static void test_EnumContexts(ITfDocumentMgr *dm, ITfContext *search) +{ + HRESULT hr; + IEnumTfContexts* pEnum; + BOOL found = FALSE; + + hr = ITfDocumentMgr_EnumContexts(dm,&pEnum); + ok(SUCCEEDED(hr),"EnumContexts failed\n"); + if (SUCCEEDED(hr)) + { + ULONG fetched; + ITfContext *cxt; + while (IEnumTfContexts_Next(pEnum, 1, &cxt, &fetched) == S_OK) + { + if (!search) + found = TRUE; + else if (search == cxt) + found = TRUE; + ITfContext_Release(cxt); + } + IEnumTfContexts_Release(pEnum); + } + if (search) + ok(found,"Did not find proper ITfContext\n"); + else + ok(!found,"Found an ITfContext we should should not have\n"); +} + +static void test_EnumDocumentMgr(ITfThreadMgr *tm, ITfDocumentMgr *search, ITfDocumentMgr *absent) +{ + HRESULT hr; + IEnumTfDocumentMgrs* pEnum; + BOOL found = FALSE; + BOOL notfound = TRUE; + + hr = ITfThreadMgr_EnumDocumentMgrs(tm,&pEnum); + ok(SUCCEEDED(hr),"EnumDocumentMgrs failed\n"); + if (SUCCEEDED(hr)) + { + ULONG fetched; + ITfDocumentMgr *dm; + while (IEnumTfDocumentMgrs_Next(pEnum, 1, &dm, &fetched) == S_OK) + { + if (!search) + found = TRUE; + else if (search == dm) + found = TRUE; + if (absent && dm == absent) + notfound = FALSE; + ITfDocumentMgr_Release(dm); + } + IEnumTfDocumentMgrs_Release(pEnum); + } + if (search) + ok(found,"Did not find proper ITfDocumentMgr\n"); + else + ok(!found,"Found an ITfDocumentMgr we should should not have\n"); + if (absent) + ok(notfound,"Found an ITfDocumentMgr we believe should be absent\n"); +} + +static inline int check_context_refcount(ITfContext *iface) +{ + IUnknown_AddRef(iface); + return IUnknown_Release(iface); +} + + +/********************************************************************** + * ITfTextEditSink + **********************************************************************/ +typedef struct tagTextEditSink +{ + const ITfTextEditSinkVtbl *TextEditSinkVtbl; + LONG refCount; +} TextEditSink; + +static void TextEditSink_Destructor(TextEditSink *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI TextEditSink_QueryInterface(ITfTextEditSink *iface, REFIID iid, LPVOID *ppvOut) +{ + TextEditSink *This = (TextEditSink *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextEditSink)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI TextEditSink_AddRef(ITfTextEditSink *iface) +{ + TextEditSink *This = (TextEditSink *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI TextEditSink_Release(ITfTextEditSink *iface) +{ + TextEditSink *This = (TextEditSink *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + TextEditSink_Destructor(This); + return ret; +} + +static HRESULT WINAPI TextEditSink_OnEndEdit(ITfTextEditSink *iface, + ITfContext *pic, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord) +{ + sink_fire_ok(&test_OnEndEdit,"TextEditSink_OnEndEdit"); + return S_OK; +} + +static const ITfTextEditSinkVtbl TextEditSink_TextEditSinkVtbl = +{ + TextEditSink_QueryInterface, + TextEditSink_AddRef, + TextEditSink_Release, + + TextEditSink_OnEndEdit +}; + +static HRESULT TextEditSink_Constructor(ITfTextEditSink **ppOut) +{ + TextEditSink *This; + + *ppOut = NULL; + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(TextEditSink)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->TextEditSinkVtbl = &TextEditSink_TextEditSinkVtbl; + This->refCount = 1; + + *ppOut = (ITfTextEditSink*)This; + return S_OK; +} + +static void test_startSession(void) +{ + HRESULT hr; + DWORD cnt; + DWORD editCookie; + ITfDocumentMgr *dmtest; + ITfContext *cxt,*cxt2,*cxt3,*cxtTest; + ITextStoreACP *ts; + TfClientId cid2 = 0; + + hr = ITfThreadMgr_Deactivate(g_tm); + ok(hr == E_UNEXPECTED,"Deactivate should have failed with E_UNEXPECTED\n"); + + test_ShouldActivate = TRUE; + hr = ITfThreadMgr_Activate(g_tm,&cid); + ok(SUCCEEDED(hr),"Failed to Activate\n"); + ok(cid != tid,"TextService id mistakenly matches Client id\n"); + + test_ShouldActivate = FALSE; + hr = ITfThreadMgr_Activate(g_tm,&cid2); + ok(SUCCEEDED(hr),"Failed to Activate\n"); + ok (cid == cid2, "Second activate client ID does not match\n"); + + hr = ITfThreadMgr_Deactivate(g_tm); + ok(SUCCEEDED(hr),"Failed to Deactivate\n"); + + test_EnumDocumentMgr(g_tm,NULL,NULL); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&g_dm); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + test_EnumDocumentMgr(g_tm,g_dm,NULL); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&dmtest); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + test_EnumDocumentMgr(g_tm,dmtest,NULL); + + ITfDocumentMgr_Release(dmtest); + test_EnumDocumentMgr(g_tm,g_dm,dmtest); + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(dmtest == NULL,"Initial focus not null\n"); + + test_CurrentFocus = g_dm; + test_PrevFocus = NULL; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_SetFocus(g_tm,g_dm); + ok(SUCCEEDED(hr),"SetFocus Failed\n"); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); + + cnt = ITfDocumentMgr_Release(g_dm); + ok(cnt == 2,"DocumentMgr refcount not expected (2 vs %i)\n",cnt); + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmtest); + + TextStoreACP_Constructor((IUnknown**)&ts); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, (IUnknown*)ts, &cxt, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt2, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt3, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + test_EnumContexts(g_dm, NULL); + + hr = ITfContext_GetDocumentMgr(cxt,&dmtest); + ok(hr == S_OK, "ITfContext_GetDocumentMgr failed with %x\n",hr); + ok(dmtest == g_dm, "Wrong documentmgr\n"); + ITfDocumentMgr_Release(dmtest); + + cnt = check_context_refcount(cxt); + test_OnPushContext = SINK_EXPECTED; + test_ACP_AdviseSink = SINK_EXPECTED; + test_OnInitDocumentMgr = SINK_EXPECTED; + hr = ITfDocumentMgr_Push(g_dm, cxt); + ok(SUCCEEDED(hr),"Push Failed\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + sink_check_ok(&test_OnPushContext,"OnPushContext"); + sink_check_ok(&test_OnInitDocumentMgr,"OnInitDocumentMgr"); + sink_check_ok(&test_ACP_AdviseSink,"TextStoreACP_AdviseSink"); + + test_EnumContexts(g_dm, cxt); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + cnt = ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + check_context_refcount(cxt2); + test_OnPushContext = SINK_EXPECTED; + hr = ITfDocumentMgr_Push(g_dm, cxt2); + ok(SUCCEEDED(hr),"Push Failed\n"); + sink_check_ok(&test_OnPushContext,"OnPushContext"); + + cnt = check_context_refcount(cxt2); + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt2, "Wrong context on top\n"); + ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt); + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt3); + hr = ITfDocumentMgr_Push(g_dm, cxt3); + ok(FAILED(hr),"Push Succeeded\n"); + ok(check_context_refcount(cxt3) == cnt, "Ref changed\n"); + + cnt = check_context_refcount(cxt2); + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt2, "Wrong context on top\n"); + ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt); + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt2); + test_OnPopContext = SINK_EXPECTED; + hr = ITfDocumentMgr_Pop(g_dm, 0); + ok(SUCCEEDED(hr),"Pop Failed\n"); + ok(check_context_refcount(cxt2) < cnt, "Ref count did not decrease\n"); + sink_check_ok(&test_OnPopContext,"OnPopContext"); + + dmtest = (void *)0xfeedface; + hr = ITfContext_GetDocumentMgr(cxt2,&dmtest); + ok(hr == S_FALSE, "ITfContext_GetDocumentMgr wrong rc %x\n",hr); + ok(dmtest == NULL,"returned documentmgr should be null\n"); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on base\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_Pop(g_dm, 0); + ok(FAILED(hr),"Pop Succeeded\n"); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on base\n"); + ITfContext_Release(cxtTest); + + ITfContext_Release(cxt); + ITfContext_Release(cxt2); + ITfContext_Release(cxt3); +} + +static void test_endSession(void) +{ + HRESULT hr; + test_ShouldDeactivate = TRUE; + test_CurrentFocus = NULL; + test_PrevFocus = g_dm; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_Deactivate(g_tm); + ok(SUCCEEDED(hr),"Failed to Deactivate\n"); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_OnSetFocus = SINK_UNEXPECTED; +} + +static void test_TfGuidAtom(void) +{ + GUID gtest,g1; + HRESULT hr; + TfGuidAtom atom1,atom2; + BOOL equal; + + CoCreateGuid(>est); + + /* msdn reports this should return E_INVALIDARG. However my test show it crashing (winxp)*/ + /* + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_RegisterGUID should have failed\n"); + */ + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom2); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); + ok(atom1 == atom2,"atoms do not match\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,atom2,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_GetGUID should have failed\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,atom2,&g1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); + ok(IsEqualGUID(&g1,>est),"guids do not match\n"); + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_IsEqualTfGuidAtom should have failed\n"); + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,&equal); + ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); + ok(equal == TRUE,"Equal value invalid\n"); + + /* show that cid and tid TfClientIds are also TfGuidAtoms */ + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,tid,&CLSID_FakeService,&equal); + ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); + ok(equal == TRUE,"Equal value invalid\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,cid,&g1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); + ok(!IsEqualGUID(&g1,&GUID_NULL),"guid should not be NULL\n"); +} + +static void test_ClientId(void) +{ + ITfClientId *pcid; + TfClientId id1,id2; + HRESULT hr; + GUID g2; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfClientId, (LPVOID*)&pcid); + ok(SUCCEEDED(hr),"Unable to acquire ITfClientId interface\n"); + + CoCreateGuid(&g2); + + hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id1); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id1==id2,"Id's for GUID_NULL do not match\n"); + hr = ITfClientId_GetClientId(pcid,&CLSID_FakeService,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id2!=id1,"Id matches GUID_NULL\n"); + ok(id2==tid,"Id for CLSID_FakeService not matching tid\n"); + ok(id2!=cid,"Id for CLSID_FakeService matching cid\n"); + hr = ITfClientId_GetClientId(pcid,&g2,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id2!=id1,"Id matches GUID_NULL\n"); + ok(id2!=tid,"Id for random guid matching tid\n"); + ok(id2!=cid,"Id for random guid matching cid\n"); + ITfClientId_Release(pcid); +} + +/********************************************************************** + * ITfEditSession + **********************************************************************/ +typedef struct tagEditSession +{ + const ITfEditSessionVtbl *EditSessionVtbl; + LONG refCount; +} EditSession; + +static void EditSession_Destructor(EditSession *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI EditSession_QueryInterface(ITfEditSession *iface, REFIID iid, LPVOID *ppvOut) +{ + EditSession *This = (EditSession *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfEditSession)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI EditSession_AddRef(ITfEditSession *iface) +{ + EditSession *This = (EditSession *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI EditSession_Release(ITfEditSession *iface) +{ + EditSession *This = (EditSession *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + EditSession_Destructor(This); + return ret; +} + +static void test_InsertAtSelection(TfEditCookie ec, ITfContext *cxt) +{ + HRESULT hr; + ITfInsertAtSelection *iis; + ITfRange *range=NULL; + static const WCHAR txt[] = {'H','e','l','l','o',' ','W','o','r','l','d',0}; + + hr = ITfContext_QueryInterface(cxt, &IID_ITfInsertAtSelection , (LPVOID*)&iis); + ok(SUCCEEDED(hr),"Failed to get ITfInsertAtSelection interface\n"); + test_ACP_InsertTextAtSelection = SINK_EXPECTED; + hr = ITfInsertAtSelection_InsertTextAtSelection(iis, ec, 0, txt, 11, &range); + ok(SUCCEEDED(hr),"ITfInsertAtSelection_InsertTextAtSelection failed %x\n",hr); + sink_check_ok(&test_ACP_InsertTextAtSelection,"InsertTextAtSelection"); + ok(range != NULL,"No range returned\n"); + ITfRange_Release(range); + ITfInsertAtSelection_Release(iis); +} + +static HRESULT WINAPI EditSession_DoEditSession(ITfEditSession *iface, +TfEditCookie ec) +{ + ITfContext *cxt; + ITfDocumentMgr *dm; + ITfRange *range; + TF_SELECTION selection; + ULONG fetched; + HRESULT hr; + + sink_fire_ok(&test_DoEditSession,"EditSession_DoEditSession"); + sink_check_ok(&test_ACP_RequestLock,"RequestLock"); + + ITfThreadMgr_GetFocus(g_tm, &dm); + ITfDocumentMgr_GetTop(dm,&cxt); + + hr = ITfContext_GetStart(cxt,ec,NULL); + ok(hr == E_INVALIDARG,"Unexpected return code %x\n",hr); + + range = (ITfRange*)0xdeaddead; + hr = ITfContext_GetStart(cxt,0xdeadcafe,&range); + ok(hr == TF_E_NOLOCK,"Unexpected return code %x\n",hr); + ok(range == NULL,"Range not set to NULL\n"); + + hr = ITfContext_GetStart(cxt,ec,&range); + ok(SUCCEEDED(hr),"Unexpected return code %x\n",hr); + ok(range != NULL,"Range set to NULL\n"); + + ITfRange_Release(range); + + hr = ITfContext_GetEnd(cxt,ec,NULL); + ok(hr == E_INVALIDARG,"Unexpected return code %x\n",hr); + + range = (ITfRange*)0xdeaddead; + hr = ITfContext_GetEnd(cxt,0xdeadcafe,&range); + ok(hr == TF_E_NOLOCK,"Unexpected return code %x\n",hr); + ok(range == NULL,"Range not set to NULL\n"); + + test_ACP_GetEndACP = SINK_EXPECTED; + hr = ITfContext_GetEnd(cxt,ec,&range); + ok(SUCCEEDED(hr),"Unexpected return code %x\n",hr); + ok(range != NULL,"Range set to NULL\n"); + sink_check_ok(&test_ACP_GetEndACP,"GetEndACP"); + + ITfRange_Release(range); + + selection.range = NULL; + test_ACP_GetSelection = SINK_EXPECTED; + hr = ITfContext_GetSelection(cxt, ec, TF_DEFAULT_SELECTION, 1, &selection, &fetched); + ok(SUCCEEDED(hr),"ITfContext_GetSelection failed\n"); + ok(fetched == 1,"fetched incorrect\n"); + ok(selection.range != NULL,"NULL range\n"); + sink_check_ok(&test_ACP_GetSelection,"ACP_GetSepection"); + ITfRange_Release(selection.range); + + test_InsertAtSelection(ec, cxt); + + test_ACP_GetEndACP = SINK_EXPECTED; + hr = ITfContext_GetEnd(cxt,ec,&range); + ok(SUCCEEDED(hr),"Unexpected return code %x\n",hr); + ok(range != NULL,"Range set to NULL\n"); + sink_check_ok(&test_ACP_GetEndACP,"GetEndACP"); + + selection.range = range; + selection.style.ase = TF_AE_NONE; + selection.style.fInterimChar = FALSE; + test_ACP_SetSelection = SINK_EXPECTED; + hr = ITfContext_SetSelection(cxt, ec, 1, &selection); + sink_check_ok(&test_ACP_SetSelection,"SetSelection"); + ITfRange_Release(range); + + ITfContext_Release(cxt); + ITfDocumentMgr_Release(dm); + return 0xdeadcafe; +} + +static const ITfEditSessionVtbl EditSession_EditSessionVtbl = +{ + EditSession_QueryInterface, + EditSession_AddRef, + EditSession_Release, + + EditSession_DoEditSession +}; + +static HRESULT EditSession_Constructor(ITfEditSession **ppOut) +{ + EditSession *This; + + *ppOut = NULL; + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(EditSession)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->EditSessionVtbl = &EditSession_EditSessionVtbl; + This->refCount = 1; + + *ppOut = (ITfEditSession*)This; + return S_OK; +} + +static void test_TStoApplicationText(void) +{ + HRESULT hr, hrSession; + ITfEditSession *es; + ITfContext *cxt; + ITfDocumentMgr *dm; + ITfTextEditSink *sink; + ITfSource *source = NULL; + DWORD editSinkCookie = -1; + + ITfThreadMgr_GetFocus(g_tm, &dm); + EditSession_Constructor(&es); + ITfDocumentMgr_GetTop(dm,&cxt); + + TextEditSink_Constructor(&sink); + hr = ITfContext_QueryInterface(cxt,&IID_ITfSource,(LPVOID*)&source); + ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for Context\n"); + if (source) + { + hr = ITfSource_AdviseSink(source, &IID_ITfTextEditSink, (LPVOID)sink, &editSinkCookie); + ok(SUCCEEDED(hr),"Failed to advise Sink\n"); + ok(editSinkCookie != -1,"Failed to get sink cookie\n"); + } + + hrSession = 0xfeedface; + /* Test no premissions flags */ + hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC, &hrSession); + ok(hr == E_INVALIDARG,"RequestEditSession should have failed with %x not %x\n",E_INVALIDARG,hr); + ok(hrSession == E_FAIL,"hrSession should be %x not %x\n",E_FAIL,hrSession); + + documentStatus = TS_SD_READONLY; + hrSession = 0xfeedface; + test_ACP_GetStatus = SINK_EXPECTED; + hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC|TF_ES_READWRITE, &hrSession); + ok(SUCCEEDED(hr),"ITfContext_RequestEditSession failed\n"); + ok(hrSession == TS_E_READONLY,"Unexpected hrSession (%x)\n",hrSession); + sink_check_ok(&test_ACP_GetStatus,"GetStatus"); + + /* signal a change to allow readwrite sessions */ + documentStatus = 0; + test_ACP_RequestLock = SINK_EXPECTED; + ITextStoreACPSink_OnStatusChange(ACPSink,documentStatus); + sink_check_ok(&test_ACP_RequestLock,"RequestLock"); + + test_ACP_GetStatus = SINK_EXPECTED; + test_ACP_RequestLock = SINK_EXPECTED; + test_DoEditSession = SINK_EXPECTED; + hrSession = 0xfeedface; + test_OnEndEdit = SINK_EXPECTED; + hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC|TF_ES_READWRITE, &hrSession); + ok(SUCCEEDED(hr),"ITfContext_RequestEditSession failed\n"); + sink_check_ok(&test_OnEndEdit,"OnEndEdit"); + sink_check_ok(&test_DoEditSession,"DoEditSession"); + sink_check_ok(&test_ACP_GetStatus,"GetStatus"); + ok(hrSession == 0xdeadcafe,"Unexpected hrSession (%x)\n",hrSession); + + if (source) + { + hr = ITfSource_UnadviseSink(source, editSinkCookie); + ok(SUCCEEDED(hr),"Failed to unadvise Sink\n"); + ITfTextEditSink_Release(sink); + ITfSource_Release(source); + } + + ITfContext_Release(cxt); + ITfDocumentMgr_Release(dm); + ITfEditSession_Release(es); +} + +static void enum_compartments(ITfCompartmentMgr *cmpmgr, REFGUID present, REFGUID absent) +{ + BOOL found,found2; + IEnumGUID *ppEnum; + found = FALSE; + found2 = FALSE; + if (SUCCEEDED(ITfCompartmentMgr_EnumCompartments(cmpmgr, &ppEnum))) + { + ULONG fetched; + GUID g; + while (IEnumGUID_Next(ppEnum, 1, &g, &fetched) == S_OK) + { + WCHAR str[50]; + CHAR strA[50]; + StringFromGUID2(&g,str,sizeof(str)/sizeof(str[0])); + WideCharToMultiByte(CP_ACP,0,str,-1,strA,sizeof(strA),0,0); + trace("found %s\n",strA); + if (present && IsEqualGUID(present,&g)) + found = TRUE; + if (absent && IsEqualGUID(absent, &g)) + found2 = TRUE; + } + IEnumGUID_Release(ppEnum); + } + if (present) + ok(found,"Did not find compartment\n"); + if (absent) + ok(!found2,"Found compartment that should be absent\n"); +} + +static void test_Compartments(void) +{ + ITfContext *cxt; + ITfDocumentMgr *dm; + ITfCompartmentMgr *cmpmgr; + ITfCompartment *cmp; + HRESULT hr; + + ITfThreadMgr_GetFocus(g_tm, &dm); + ITfDocumentMgr_GetTop(dm,&cxt); + + /* Global */ + hr = ITfThreadMgr_GetGlobalCompartment(g_tm, &cmpmgr); + ok(SUCCEEDED(hr),"GetGlobalCompartment failed\n"); + hr = ITfCompartmentMgr_GetCompartment(cmpmgr, &GUID_COMPARTMENT_SPEECH_OPENCLOSE, &cmp); + ok(SUCCEEDED(hr),"GetCompartment failed\n"); + ITfCompartment_Release(cmp); + enum_compartments(cmpmgr,&GUID_COMPARTMENT_SPEECH_OPENCLOSE,NULL); + ITfCompartmentMgr_Release(cmpmgr); + + /* Thread */ + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfCompartmentMgr, (LPVOID*)&cmpmgr); + ok(SUCCEEDED(hr),"ThreadMgr QI for IID_ITfCompartmentMgr failed\n"); + hr = ITfCompartmentMgr_GetCompartment(cmpmgr, &CLSID_FakeService, &cmp); + ok(SUCCEEDED(hr),"GetCompartment failed\n"); + enum_compartments(cmpmgr,&CLSID_FakeService,&GUID_COMPARTMENT_SPEECH_OPENCLOSE); + ITfCompartmentMgr_ClearCompartment(cmpmgr,tid,&CLSID_FakeService); + enum_compartments(cmpmgr,NULL,&CLSID_FakeService); + ITfCompartmentMgr_Release(cmpmgr); + ITfCompartment_Release(cmp); + + /* DocumentMgr */ + hr = ITfDocumentMgr_QueryInterface(dm, &IID_ITfCompartmentMgr, (LPVOID*)&cmpmgr); + ok(SUCCEEDED(hr),"DocumentMgr QI for IID_ITfCompartmentMgr failed\n"); + + hr = ITfCompartmentMgr_GetCompartment(cmpmgr, &GUID_COMPARTMENT_PERSISTMENUENABLED, &cmp); + ok(SUCCEEDED(hr),"GetCompartment failed\n"); + enum_compartments(cmpmgr,&GUID_COMPARTMENT_PERSISTMENUENABLED,&GUID_COMPARTMENT_SPEECH_OPENCLOSE); + ITfCompartmentMgr_Release(cmpmgr); + + /* Context */ + hr = ITfContext_QueryInterface(cxt, &IID_ITfCompartmentMgr, (LPVOID*)&cmpmgr); + ok(SUCCEEDED(hr),"Context QI for IID_ITfCompartmentMgr failed\n"); + enum_compartments(cmpmgr,NULL,&GUID_COMPARTMENT_PERSISTMENUENABLED); + ITfCompartmentMgr_Release(cmpmgr); + + ITfContext_Release(cxt); + ITfDocumentMgr_Release(dm); +} + +static void processPendingMessages(void) +{ + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +static void test_AssociateFocus(void) +{ + ITfDocumentMgr *dm1, *dm2, *olddm, *dmcheck, *dmorig; + HWND wnd1, wnd2, wnd3; + HRESULT hr; + + ITfThreadMgr_GetFocus(g_tm, &dmorig); + test_CurrentFocus = NULL; + test_PrevFocus = dmorig; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_SetFocus(g_tm,NULL); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + ITfDocumentMgr_Release(dmorig); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&dm1); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&dm2); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + wnd1 = CreateWindow("edit",NULL,WS_POPUP,0,0,200,60,NULL,NULL,NULL,NULL); + ok(wnd1!=NULL,"Unable to create window 1\n"); + wnd2 = CreateWindow("edit",NULL,WS_POPUP,0,65,200,60,NULL,NULL,NULL,NULL); + ok(wnd2!=NULL,"Unable to create window 2\n"); + wnd3 = CreateWindow("edit",NULL,WS_POPUP,0,130,200,60,NULL,NULL,NULL,NULL); + ok(wnd3!=NULL,"Unable to create window 3\n"); + + processPendingMessages(); + + test_OnInitDocumentMgr = SINK_OPTIONAL; /* Vista and greater */ + test_OnPushContext = SINK_OPTIONAL; /* Vista and greater */ + + ShowWindow(wnd1,SW_SHOWNORMAL); + SetFocus(wnd1); + sink_check_ok(&test_OnInitDocumentMgr,"OnInitDocumentMgr"); + sink_check_ok(&test_OnPushContext,"OnPushContext"); + + test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */ + ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus); + test_CurrentFocus = FOCUS_IGNORE; /* This is a default system context */ + processPendingMessages(); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + test_CurrentFocus = dm1; + test_PrevFocus = FOCUS_IGNORE; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd1,dm1,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + processPendingMessages(); + + ITfThreadMgr_GetFocus(g_tm, &dmcheck); + ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmcheck); + + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd2,dm2,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + processPendingMessages(); + ITfThreadMgr_GetFocus(g_tm, &dmcheck); + ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmcheck); + + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd3,dm2,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + processPendingMessages(); + ITfThreadMgr_GetFocus(g_tm, &dmcheck); + ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmcheck); + + test_CurrentFocus = dm2; + test_PrevFocus = dm1; + test_OnSetFocus = SINK_OPTIONAL; /* wine and Winxp */ + ShowWindow(wnd2,SW_SHOWNORMAL); + SetFocus(wnd2); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_CurrentFocus = FOCUS_IGNORE; /* occasional wine race */ + test_PrevFocus = FOCUS_IGNORE; /* occasional wine race */ + test_OnSetFocus = SINK_IGNORE; /* occasional wine race */ + processPendingMessages(); + + ShowWindow(wnd3,SW_SHOWNORMAL); + SetFocus(wnd3); + processPendingMessages(); + + test_CurrentFocus = dm1; + test_PrevFocus = dm2; + test_OnSetFocus = SINK_EXPECTED; + SetFocus(wnd1); + processPendingMessages(); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd3,NULL,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + ok(olddm == dm2, "incorrect old DocumentMgr returned\n"); + ITfDocumentMgr_Release(olddm); + + test_CurrentFocus = dmorig; + test_PrevFocus = dm1; + test_OnSetFocus = SINK_EXPECTED; + test_ACP_GetStatus = SINK_EXPECTED; + ITfThreadMgr_SetFocus(g_tm,dmorig); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + test_CurrentFocus = FOCUS_IGNORE; /* NULL on XP, system default on Vista */ + test_PrevFocus = dmorig; + test_OnSetFocus = SINK_EXPECTED; + SetFocus(wnd3); + processPendingMessages(); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd2,NULL,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + ok(olddm == dm2, "incorrect old DocumentMgr returned\n"); + ITfDocumentMgr_Release(olddm); + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd1,NULL,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + ok(olddm == dm1, "incorrect old DocumentMgr returned\n"); + ITfDocumentMgr_Release(olddm); + + SetFocus(wnd2); + processPendingMessages(); + SetFocus(wnd1); + processPendingMessages(); + + ITfDocumentMgr_Release(dm1); + ITfDocumentMgr_Release(dm2); + + test_CurrentFocus = dmorig; + test_PrevFocus = FOCUS_IGNORE; + test_OnSetFocus = SINK_EXPECTED; + test_ACP_GetStatus = SINK_IGNORE; + ITfThreadMgr_SetFocus(g_tm,dmorig); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + DestroyWindow(wnd1); + DestroyWindow(wnd2); + test_OnPopContext = SINK_OPTIONAL; /* Vista and greater */ + test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */ + ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus); + test_CurrentFocus = NULL; + DestroyWindow(wnd3); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + sink_check_ok(&test_OnPopContext,"OnPopContext"); +} + +START_TEST(inputprocessor) +{ + if (SUCCEEDED(initialize())) + { + test_Register(); + test_RegisterCategory(); + test_EnumLanguageProfiles(); + test_EnumInputProcessorInfo(); + test_Enable(); + test_ThreadMgrAdviseSinks(); + test_Activate(); + test_startSession(); + test_TfGuidAtom(); + test_ClientId(); + test_KeystrokeMgr(); + test_TStoApplicationText(); + test_Compartments(); + test_AssociateFocus(); + test_endSession(); + test_FindClosestCategory(); + test_Disable(); + test_ThreadMgrUnadviseSinks(); + test_UnregisterCategory(); + test_Unregister(); + } + else + skip("Unable to create InputProcessor\n"); + cleanup(); +} diff --git a/rostests/winetests/mshtml/dom.c b/rostests/winetests/mshtml/dom.c index 25bf7641eb1..c6f54793ce5 100644 --- a/rostests/winetests/mshtml/dom.c +++ b/rostests/winetests/mshtml/dom.c @@ -3173,6 +3173,16 @@ static void test_navigator(IHTMLDocument2 *doc) ok(!strcmp_wa(bstr, buf), "userAgent returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf); SysFreeString(bstr); + if(!strncmp(buf, "Mozilla/", 8)) { + bstr = NULL; + hres = IOmNavigator_get_appVersion(navigator, &bstr); + ok(hres == S_OK, "get_appVersion failed: %08x\n", hres); + ok(!strcmp_wa(bstr, buf+8), "appVersion returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf+8); + SysFreeString(bstr); + }else { + skip("nonstandard user agent\n"); + } + ref = IOmNavigator_Release(navigator); ok(!ref, "navigator should be destroyed here\n"); } @@ -3185,8 +3195,6 @@ static void test_screen(IHTMLWindow2 *window) HDC hdc; HRESULT hres; - static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0}; - screen = NULL; hres = IHTMLWindow2_get_screen(window, &screen); ok(hres == S_OK, "get_screen failed: %08x\n", hres); @@ -3206,7 +3214,7 @@ static void test_screen(IHTMLWindow2 *window) IDispatchEx_Release(dispex); } - hdc = CreateICW(displayW, NULL, NULL, NULL); + hdc = CreateICA("DISPLAY", NULL, NULL, NULL); exl = GetDeviceCaps(hdc, HORZRES); l = 0xdeadbeef; diff --git a/rostests/winetests/mshtml/events.c b/rostests/winetests/mshtml/events.c index 16f727fdec7..d62df7a3b0b 100644 --- a/rostests/winetests/mshtml/events.c +++ b/rostests/winetests/mshtml/events.c @@ -67,6 +67,8 @@ DEFINE_EXPECT(div_onclick_disp); DEFINE_EXPECT(iframe_onreadystatechange_loading); DEFINE_EXPECT(iframe_onreadystatechange_interactive); DEFINE_EXPECT(iframe_onreadystatechange_complete); +DEFINE_EXPECT(iframedoc_onreadystatechange); +DEFINE_EXPECT(img_onload); static HWND container_hwnd = NULL; static IHTMLWindow2 *window; @@ -92,7 +94,10 @@ static const char click_doc_str[] = ""; static const char readystate_doc_str[] = - "<"; + ""; + +static const char img_doc_str[] = + ""; static const char *debugstr_guid(REFIID riid) { @@ -879,14 +884,46 @@ static HRESULT WINAPI body_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WOR EVENT_HANDLER_FUNC_OBJ(body_onclick); +static HRESULT WINAPI img_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + CHECK_EXPECT(img_onload); + test_event_args(&DIID_DispHTMLImg, id, wFlags, pdp, pvarRes, pei, pspCaller); + test_event_src("IMG"); + return S_OK; +} + +EVENT_HANDLER_FUNC_OBJ(img_onload); + +static HRESULT WINAPI iframedoc_onreadystatechange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + IHTMLEventObj *event = NULL; + HRESULT hres; + + CHECK_EXPECT2(iframedoc_onreadystatechange); + test_event_args(&DIID_DispHTMLDocument, id, wFlags, pdp, pvarRes, pei, pspCaller); + + event = (void*)0xdeadbeef; + hres = IHTMLWindow2_get_event(window, &event); + ok(hres == S_OK, "get_event failed: %08x\n", hres); + ok(!event, "event = %p\n", event); + + return S_OK; +} + +EVENT_HANDLER_FUNC_OBJ(iframedoc_onreadystatechange); + static HRESULT WINAPI iframe_onreadystatechange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { + IHTMLWindow2 *iframe_window; + IHTMLDocument2 *iframe_doc; IHTMLFrameBase2 *iframe; IHTMLElement2 *elem2; IHTMLElement *elem; VARIANT v; - BSTR str; + BSTR str, str2; HRESULT hres; test_event_args(&DIID_DispHTMLIFrame, id, wFlags, pdp, pvarRes, pei, pspCaller); @@ -913,15 +950,33 @@ static HRESULT WINAPI iframe_onreadystatechange(IDispatchEx *iface, DISPID id, L ok(!lstrcmpW(str, V_BSTR(&v)), "ready states differ\n"); VariantClear(&v); - if(!strcmp_wa(str, "loading")) + hres = IHTMLFrameBase2_get_contentWindow(iframe, &iframe_window); + ok(hres == S_OK, "get_contentDocument failed: %08x\n", hres); + + hres = IHTMLWindow2_get_document(iframe_window, &iframe_doc); + IHTMLWindow2_Release(iframe_window); + ok(hres == S_OK, "get_document failed: %08x\n", hres); + + hres = IHTMLDocument2_get_readyState(iframe_doc, &str2); + ok(!lstrcmpW(str, str2), "unexpected document readyState %s\n", wine_dbgstr_w(str2)); + SysFreeString(str2); + + if(!strcmp_wa(str, "loading")) { CHECK_EXPECT(iframe_onreadystatechange_loading); - else if(!strcmp_wa(str, "interactive")) + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch*)&iframedoc_onreadystatechange_obj; + hres = IHTMLDocument2_put_onreadystatechange(iframe_doc, v); + ok(hres == S_OK, "put_onreadystatechange: %08x\n", hres); + }else if(!strcmp_wa(str, "interactive")) CHECK_EXPECT(iframe_onreadystatechange_interactive); else if(!strcmp_wa(str, "complete")) CHECK_EXPECT(iframe_onreadystatechange_complete); else ok(0, "unexpected state %s\n", wine_dbgstr_w(str)); + IHTMLDocument2_Release(iframe_doc); + IHTMLFrameBase2_Release(iframe); return S_OK; } @@ -1307,17 +1362,60 @@ static void test_onreadystatechange(IHTMLDocument2 *doc) ok(hres == S_OK, "put_src failed: %08x\n", hres); SET_EXPECT(iframe_onreadystatechange_loading); + SET_EXPECT(iframedoc_onreadystatechange); SET_EXPECT(iframe_onreadystatechange_interactive); SET_EXPECT(iframe_onreadystatechange_complete); pump_msgs(&called_iframe_onreadystatechange_complete); - todo_wine CHECK_CALLED(iframe_onreadystatechange_loading); + CHECK_CALLED(iframedoc_onreadystatechange); CHECK_CALLED(iframe_onreadystatechange_interactive); CHECK_CALLED(iframe_onreadystatechange_complete); IHTMLFrameBase_Release(iframe); } +static void test_imgload(IHTMLDocument2 *doc) +{ + IHTMLImgElement *img; + IHTMLElement *elem; + VARIANT v; + BSTR str; + HRESULT hres; + + elem = get_elem_id(doc, "imgid"); + hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLImgElement, (void**)&img); + IHTMLElement_Release(elem); + ok(hres == S_OK, "Could not get IHTMLImgElement iface: %08x\n", hres); + + V_VT(&v) = VT_EMPTY; + hres = IHTMLImgElement_get_onload(img, &v); + ok(hres == S_OK, "get_onload failed: %08x\n", hres); + ok(V_VT(&v) == VT_NULL, "V_VT(onload) = %d\n", V_VT(&v)); + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch*)&img_onload_obj; + hres = IHTMLImgElement_put_onload(img, v); + ok(hres == S_OK, "put_onload failed: %08x\n", hres); + + V_VT(&v) = VT_EMPTY; + hres = IHTMLImgElement_get_onload(img, &v); + ok(hres == S_OK, "get_onload failed: %08x\n", hres); + ok(V_VT(&v) == VT_DISPATCH, "V_VT(onload) = %d\n", V_VT(&v)); + ok(V_DISPATCH(&v) == (IDispatch*)&img_onload_obj, "V_DISPATCH(onload) != onloadkFunc\n"); + VariantClear(&v); + + str = a2bstr("http://www.winehq.org/images/winehq_logo_text.png"); + hres = IHTMLImgElement_put_src(img, str); + ok(hres == S_OK, "put_src failed: %08x\n", hres); + SysFreeString(str); + + SET_EXPECT(img_onload); + pump_msgs(&called_img_onload); + CHECK_CALLED(img_onload); + + IHTMLImgElement_Release(img); +} + static void test_timeout(IHTMLDocument2 *doc) { IHTMLWindow3 *win3; @@ -1957,6 +2055,7 @@ START_TEST(events) run_test(empty_doc_str, test_timeout); run_test(click_doc_str, test_onclick); run_test(readystate_doc_str, test_onreadystatechange); + run_test(img_doc_str, test_imgload); DestroyWindow(container_hwnd); CoUninitialize(); diff --git a/rostests/winetests/mshtml/jstest.html b/rostests/winetests/mshtml/jstest.html index 72ef427485a..6192f815af3 100644 --- a/rostests/winetests/mshtml/jstest.html +++ b/rostests/winetests/mshtml/jstest.html @@ -5,12 +5,30 @@ function ok(b,m) { return external.ok(b, m); } +function test_removeAttribute(e) { + ok(e.removeAttribute('nonexisting') === false, "removeAttribute('nonexisting') didn't return false"); + + e.title = "title"; + ok(e.removeAttribute('title') === true, "removeAttribute('title') didn't return true"); + ok(e.title === "", "e.title = " + e.title); + ok(("title" in e) === true, "title is not in e"); + + e["myattr"] = "test"; + ok(e.removeAttribute('myattr') === true, "removeAttribute('myattr') didn't return true"); + ok(e["myattr"] === undefined, "e['myattr'] = " + e['myattr']); + ok(("myattr" in e) === false, "myattr is in e"); + +} + function runTest() { obj = new Object(); ok(obj === window.obj, "obj !== window.obj"); ok(typeof(divid) === "object", "typeof(divid) = " + typeof(divid)); + test_removeAttribute(document.getElementById("divid")); + test_removeAttribute(document.body); + external.reportSuccess(); } diff --git a/rostests/winetests/mshtml/script.c b/rostests/winetests/mshtml/script.c index 6a0cbe36906..56d83efa696 100644 --- a/rostests/winetests/mshtml/script.c +++ b/rostests/winetests/mshtml/script.c @@ -1050,12 +1050,22 @@ static HRESULT QueryInterface(REFIID riid, void **ppv) static IHTMLDocument2 *create_document(void) { IHTMLDocument2 *doc; + IHTMLDocument5 *doc5; HRESULT hres; hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2, (void**)&doc); ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); + if (hres != S_OK) return NULL; + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); + if(FAILED(hres)) { + win_skip("Could not get IHTMLDocument5, probably too old IE\n"); + IHTMLDocument2_Release(doc); + return NULL; + } + + IHTMLDocument5_Release(doc5); return doc; } diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index 5f06d93f381..a743e51d391 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -535,6 +535,7 @@ static void test_domdoc( void ) BSTR str; LONG code; LONG nLength = 0; + WCHAR buff[100]; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -543,6 +544,12 @@ static void test_domdoc( void ) test_disp((IUnknown*)doc); +if (0) +{ + /* crashes on native */ + r = IXMLDOMDocument_loadXML( doc, (BSTR)0x1, NULL ); +} + /* try some stupid things */ r = IXMLDOMDocument_loadXML( doc, NULL, NULL ); ok( r == S_FALSE, "loadXML failed\n"); @@ -601,6 +608,15 @@ static void test_domdoc( void ) ok( r == S_FALSE, "should be no document element\n"); ok( element == NULL, "Element should be NULL\n"); + /* test for BSTR handling, pass broken BSTR */ + memcpy(&buff[2], szComplete1, sizeof(szComplete1)); + /* just a big length */ + *(DWORD*)buff = 0xf0f0; + b = VARIANT_FALSE; + r = IXMLDOMDocument_loadXML( doc, &buff[2], &b ); + ok( r == S_OK, "loadXML failed\n"); + ok( b == VARIANT_TRUE, "failed to load XML string\n"); + /* try to load something valid */ b = VARIANT_FALSE; str = SysAllocString( szComplete1 ); @@ -2734,6 +2750,12 @@ static void test_XMLHTTP(void) SysFreeString(str2); hr = IXMLHttpRequest_send(pXMLHttpRequest, varbody); + if (hr == INET_E_RESOURCE_NOT_FOUND) + { + skip("No connection could be made with crossover.codeweavers.com\n"); + IXMLHttpRequest_Release(pXMLHttpRequest); + return; + } todo_wine ok(hr == S_OK, "IXMLHttpRequest_send should have succeeded instead of failing with 0x%08x\n", hr); VariantClear(&varbody); diff --git a/rostests/winetests/rsaenh/rsaenh.c b/rostests/winetests/rsaenh/rsaenh.c index 83ec87252c1..cb560f21e0e 100644 --- a/rostests/winetests/rsaenh/rsaenh.c +++ b/rostests/winetests/rsaenh/rsaenh.c @@ -128,16 +128,28 @@ static int init_base_environment(DWORD dwKeyFlags) hProv = (HCRYPTPROV)INVALID_HANDLE_VALUE; result = CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); - ok(!result && GetLastError()==NTE_BAD_FLAGS, "%d, %08x\n", result, GetLastError()); + ok(!result && (GetLastError()==NTE_BAD_FLAGS || + broken(GetLastError() == NTE_KEYSET_NOT_DEF /* Win9x/NT4 */)), + "%d, %08x\n", result, GetLastError()); if (!CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, 0)) { - ok(GetLastError()==NTE_BAD_KEYSET, "%08x\n", GetLastError()); - if (GetLastError()!=NTE_BAD_KEYSET) return 0; + ok(GetLastError()==NTE_BAD_KEYSET || + broken(GetLastError() == NTE_KEYSET_NOT_DEF /* Win9x/NT4 */), + "%08x\n", GetLastError()); + if (GetLastError()!=NTE_BAD_KEYSET) + { + win_skip("RSA full provider not available\n"); + return 0; + } result = CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET); ok(result, "%08x\n", GetLastError()); - if (!result) return 0; + if (!result) + { + win_skip("Couldn't create crypto provider\n"); + return 0; + } result = CryptGenKey(hProv, AT_KEYEXCHANGE, dwKeyFlags, &hKey); ok(result, "%08x\n", GetLastError()); if (result) CryptDestroyKey(hKey); @@ -275,7 +287,6 @@ static BOOL derive_key(ALG_ID aiAlgid, HCRYPTKEY *phKey, DWORD len) return FALSE; } ok(result, "%08x\n", GetLastError()); - if (!result) return FALSE; result = CryptHashData(hHash, pbData, sizeof(pbData), 0); ok(result, "%08x\n", GetLastError()); if (!result) return FALSE; @@ -309,8 +320,9 @@ static void test_hashes(void) unsigned char pbData[2048]; BOOL result; HCRYPTHASH hHash, hHashClone; + HCRYPTPROV prov; BYTE pbHashValue[36]; - DWORD hashlen, len; + DWORD hashlen, len, error; int i; for (i=0; i<2048; i++) pbData[i] = (unsigned char)i; @@ -441,6 +453,74 @@ static void test_hashes(void) result = CryptDestroyHash(hHash); ok(result, "%08x\n", GetLastError()); + + /* The SHA-2 variants aren't supported in the RSA full provider */ + result = CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash); + ok(!result && GetLastError() == NTE_BAD_ALGID, + "expected NTE_BAD_ALGID, got %08x\n", GetLastError()); + result = CryptCreateHash(hProv, CALG_SHA_384, 0, 0, &hHash); + ok(!result && GetLastError() == NTE_BAD_ALGID, + "expected NTE_BAD_ALGID, got %08x\n", GetLastError()); + result = CryptCreateHash(hProv, CALG_SHA_512, 0, 0, &hHash); + ok(!result && GetLastError() == NTE_BAD_ALGID, + "expected NTE_BAD_ALGID, got %08x\n", GetLastError()); + + result = CryptAcquireContextA(&prov, NULL, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + ok(result, "CryptAcquireContext failed 0x%08x\n", GetLastError()); + + result = CryptCreateHash(prov, CALG_SHA1, 0, 0, &hHash); + ok(result, "CryptCreateHash failed 0x%08x\n", GetLastError()); + + /* release provider before using the hash */ + result = CryptReleaseContext(prov, 0); + ok(result, "CryptReleaseContext failed 0x%08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + result = CryptHashData(hHash, (const BYTE *)"data", sizeof("data"), 0); + error = GetLastError(); + ok(!result, "CryptHashData succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error); + + SetLastError(0xdeadbeef); + result = CryptDestroyHash(hHash); + error = GetLastError(); + ok(!result, "CryptDestroyHash succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error); + + if (!pCryptDuplicateHash) + { + win_skip("CryptDuplicateHash is not available\n"); + return; + } + + result = CryptAcquireContextA(&prov, NULL, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + ok(result, "CryptAcquireContext failed 0x%08x\n", GetLastError()); + + result = CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash); + ok(result, "CryptCreateHash failed 0x%08x\n", GetLastError()); + + result = CryptHashData(hHash, (const BYTE *)"data", sizeof("data"), 0); + ok(result, "CryptHashData failed 0x%08x\n", GetLastError()); + + result = pCryptDuplicateHash(hHash, NULL, 0, &hHashClone); + ok(result, "CryptDuplicateHash failed 0x%08x\n", GetLastError()); + + len = 20; + result = CryptGetHashParam(hHashClone, HP_HASHVAL, pbHashValue, &len, 0); + ok(result, "CryptGetHashParam failed 0x%08x\n", GetLastError()); + + /* add data after duplicating the hash */ + result = CryptHashData(hHash, (const BYTE *)"more data", sizeof("more data"), 0); + ok(result, "CryptHashData failed 0x%08x\n", GetLastError()); + + result = CryptDestroyHash(hHash); + ok(result, "CryptDestroyHash failed 0x%08x\n", GetLastError()); + + result = CryptDestroyHash(hHashClone); + ok(result, "CryptDestroyHash failed 0x%08x\n", GetLastError()); + + result = CryptReleaseContext(prov, 0); + ok(result, "CryptReleaseContext failed 0x%08x\n", GetLastError()); } static void test_block_cipher_modes(void) @@ -471,6 +551,10 @@ static void test_block_cipher_modes(void) result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0); ok(result, "%08x\n", GetLastError()); + result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwLen == 11 || broken(dwLen == 0 /* Win9x/NT4 */), "unexpected salt length %d\n", dwLen); + dwLen = 23; result = CryptEncrypt(hKey, 0, TRUE, 0, NULL, &dwLen, 24); ok(result, "CryptEncrypt failed: %08x\n", GetLastError()); @@ -716,6 +800,11 @@ static void test_aes(int keylen) for (i=0; iInitialize == (void *) pNextTable->FreeCredentialsHandle && + pNextTable->FreeCredentialsHandle != NULL)) + { + win_skip("Invalid function pointers for next package\n"); + return NULL; + } + + return pNextTable; } static void testGetInfo(void) @@ -181,7 +208,9 @@ static void testGetInfo(void) PackageInfo.fCapabilities); ok(PackageInfo.wVersion == 1, "wVersion: %d\n", PackageInfo.wVersion); ok(PackageInfo.wRPCID == 14, "wRPCID: %d\n", PackageInfo.wRPCID); - ok(PackageInfo.cbMaxToken == 0x4000, "cbMaxToken: 0x%x\n", + ok(PackageInfo.cbMaxToken == 0x4000 || + PackageInfo.cbMaxToken == 0x6000, /* Win7 */ + "cbMaxToken: 0x%x\n", PackageInfo.cbMaxToken); } } diff --git a/rostests/winetests/shlwapi/generated.c b/rostests/winetests/shlwapi/generated.c index db44d275994..e5e0896af8f 100755 --- a/rostests/winetests/shlwapi/generated.c +++ b/rostests/winetests/shlwapi/generated.c @@ -56,42 +56,103 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + +static void test_pack_ASSOCF(void) +{ + /* ASSOCF */ + TEST_TYPE_SIZE (ASSOCF, 4) + TEST_TYPE_ALIGN (ASSOCF, 4) + TEST_TYPE_UNSIGNED(ASSOCF) +} + +static void test_pack_DLLGETVERSIONPROC(void) +{ + /* DLLGETVERSIONPROC */ + TEST_TYPE_SIZE (DLLGETVERSIONPROC, 8) + TEST_TYPE_ALIGN (DLLGETVERSIONPROC, 8) +} + +static void test_pack_DLLVERSIONINFO(void) +{ + /* DLLVERSIONINFO (pack 8) */ + TEST_TYPE_SIZE (DLLVERSIONINFO, 20) + TEST_TYPE_ALIGN (DLLVERSIONINFO, 4) + TEST_FIELD_SIZE (DLLVERSIONINFO, cbSize, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, cbSize, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, cbSize, 0) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwMinorVersion, 8) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwBuildNumber, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwBuildNumber, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwBuildNumber, 12) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwPlatformID, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwPlatformID, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwPlatformID, 16) +} + +static void test_pack_DLLVERSIONINFO2(void) +{ + /* DLLVERSIONINFO2 (pack 8) */ + TEST_TYPE_SIZE (DLLVERSIONINFO2, 32) + TEST_TYPE_ALIGN (DLLVERSIONINFO2, 8) + TEST_FIELD_SIZE (DLLVERSIONINFO2, info1, 20) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, info1, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, info1, 0) + TEST_FIELD_SIZE (DLLVERSIONINFO2, dwFlags, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, dwFlags, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, dwFlags, 20) + TEST_FIELD_SIZE (DLLVERSIONINFO2, ullVersion, 8) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, ullVersion, 8) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, ullVersion, 24) +} + +static void test_pack_HUSKEY(void) +{ + /* HUSKEY */ + TEST_TYPE_SIZE (HUSKEY, 8) + TEST_TYPE_ALIGN (HUSKEY, 8) +} + +static void test_pack_PHUSKEY(void) +{ + /* PHUSKEY */ + TEST_TYPE_SIZE (PHUSKEY, 8) + TEST_TYPE_ALIGN (PHUSKEY, 8) + TEST_TARGET_SIZE (PHUSKEY, 8) + TEST_TARGET_ALIGN(PHUSKEY, 8) +} + +#else /* _WIN64 */ + static void test_pack_ASSOCF(void) { /* ASSOCF */ @@ -161,6 +222,8 @@ static void test_pack_PHUSKEY(void) TEST_TARGET_ALIGN(PHUSKEY, 4) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_ASSOCF(); @@ -173,9 +236,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/shlwapi/istream.c b/rostests/winetests/shlwapi/istream.c index 67d1fe25182..4a36b3ab0ba 100644 --- a/rostests/winetests/shlwapi/istream.c +++ b/rostests/winetests/shlwapi/istream.c @@ -208,12 +208,16 @@ static void test_SHCreateStreamOnFileA(DWORD mode, DWORD stgm) /* invalid arguments */ stream = NULL; - /* NT: ERROR_PATH_NOT_FOUND, 9x: ERROR_BAD_PATHNAME */ ret = (*pSHCreateStreamOnFileA)(NULL, mode | stgm, &stream); - ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || - ret == HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), - "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)" - "or HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), got 0x%08x\n", ret); + if (ret == E_INVALIDARG) /* Win98 SE */ { + win_skip("Not supported\n"); + return; + } + + ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) /* NT */ || + ret == HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME) /* 9x */, + "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) " + "or HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), got 0x%08x\n", ret); ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream); #if 0 /* This test crashes on WinXP SP2 */ @@ -342,6 +346,11 @@ static void test_SHCreateStreamOnFileW(DWORD mode, DWORD stgm) stream = NULL; ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_FAILIFTHERE | stgm, &stream); + if (ret == E_INVALIDARG) /* Win98 SE */ { + win_skip("Not supported\n"); + return; + } + ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileW: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); @@ -423,6 +432,11 @@ static void test_SHCreateStreamOnFileEx(DWORD mode, DWORD stgm) stream = NULL; ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, template, &stream); + if (ret == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) { + win_skip("File probably locked by Anti-Virus/Spam software, trying again\n"); + Sleep(1000); + ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, template, &stream); + } ok( ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || ret == HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) or " @@ -482,6 +496,11 @@ static void test_SHCreateStreamOnFileEx(DWORD mode, DWORD stgm) stream = NULL; ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, FALSE, NULL, &stream); + if (ret == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) { + win_skip("File probably locked by Anti-Virus/Spam software, trying again\n"); + Sleep(1000); + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, FALSE, NULL, &stream); + } ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); @@ -498,6 +517,11 @@ static void test_SHCreateStreamOnFileEx(DWORD mode, DWORD stgm) stream = NULL; ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, TRUE, NULL, &stream); + if (ret == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) { + win_skip("File probably locked by Anti-Virus/Spam software, trying again\n"); + Sleep(1000); + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, TRUE, NULL, &stream); + } ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); diff --git a/rostests/winetests/shlwapi/ordinal.c b/rostests/winetests/shlwapi/ordinal.c index 22437e2b17a..cfc25e116c7 100755 --- a/rostests/winetests/shlwapi/ordinal.c +++ b/rostests/winetests/shlwapi/ordinal.c @@ -28,9 +28,14 @@ #include "oaidl.h" #include "ocidl.h" #include "mlang.h" +#include "shlwapi.h" +#include "docobj.h" +#include "shobjidl.h" /* Function ptrs for ordinal calls */ static HMODULE hShlwapi; +static BOOL is_win2k_and_lower; + static int (WINAPI *pSHSearchMapInt)(const int*,const int*,int,int); static HRESULT (WINAPI *pGetAcceptLanguagesA)(LPSTR,LPDWORD); @@ -43,6 +48,14 @@ static HRESULT(WINAPI *pIConnectionPoint_SimpleInvoke)(IConnectionPoint*,DISPID, static HRESULT(WINAPI *pIConnectionPoint_InvokeWithCancel)(IConnectionPoint*,DISPID,DISPPARAMS*,DWORD,DWORD); static HRESULT(WINAPI *pConnectToConnectionPoint)(IUnknown*,REFIID,BOOL,IUnknown*, LPDWORD,IConnectionPoint **); static HRESULT(WINAPI *pSHPropertyBag_ReadLONG)(IPropertyBag *,LPCWSTR,LPLONG); +static LONG (WINAPI *pSHSetWindowBits)(HWND, INT, UINT, UINT); +static INT (WINAPI *pSHFormatDateTimeA)(const FILETIME UNALIGNED*, DWORD*, LPSTR, UINT); +static INT (WINAPI *pSHFormatDateTimeW)(const FILETIME UNALIGNED*, DWORD*, LPWSTR, UINT); +static DWORD (WINAPI *pSHGetObjectCompatFlags)(IUnknown*, const CLSID*); +static BOOL (WINAPI *pGUIDFromStringA)(LPSTR, CLSID *); +static HRESULT (WINAPI *pIUnknown_QueryServiceExec)(IUnknown*, REFIID, const GUID*, DWORD, DWORD, VARIANT*, VARIANT*); +static HRESULT (WINAPI *pIUnknown_ProfferService)(IUnknown*, REFGUID, IServiceProvider*, DWORD*); +static HWND (WINAPI *pSHCreateWorkerWindowA)(LONG, HWND, DWORD, DWORD, HMENU, LONG_PTR); static HMODULE hmlang; static HRESULT (WINAPI *pLcidToRfc1766A)(LCID, LPSTR, INT); @@ -55,6 +68,79 @@ static const CHAR ie_international[] = { static const CHAR acceptlanguage[] = { 'A','c','c','e','p','t','L','a','n','g','u','a','g','e',0}; +typedef struct { + int id; + const void *args[5]; +} call_entry_t; + +typedef struct { + call_entry_t *calls; + int count; + int alloc; +} call_trace_t; + +static void init_call_trace(call_trace_t *ctrace) +{ + ctrace->alloc = 10; + ctrace->count = 0; + ctrace->calls = HeapAlloc(GetProcessHeap(), 0, sizeof(call_entry_t) * ctrace->alloc); +} + +static void free_call_trace(const call_trace_t *ctrace) +{ + HeapFree(GetProcessHeap(), 0, ctrace->calls); +} + +static void add_call(call_trace_t *ctrace, int id, const void *arg0, + const void *arg1, const void *arg2, const void *arg3, const void *arg4) +{ + call_entry_t call; + + call.id = id; + call.args[0] = arg0; + call.args[1] = arg1; + call.args[2] = arg2; + call.args[3] = arg3; + call.args[4] = arg4; + + if (ctrace->count == ctrace->alloc) + { + ctrace->alloc *= 2; + ctrace->calls = HeapReAlloc(GetProcessHeap(),0, ctrace->calls, ctrace->alloc*sizeof(call_entry_t)); + } + + ctrace->calls[ctrace->count++] = call; +} + +static void ok_trace_(call_trace_t *texpected, call_trace_t *tgot, int line) +{ + if (texpected->count == tgot->count) + { + INT i; + /* compare */ + for (i = 0; i < texpected->count; i++) + { + call_entry_t *expected = &texpected->calls[i]; + call_entry_t *got = &tgot->calls[i]; + INT j; + + ok_(__FILE__, line)(expected->id == got->id, "got different ids %d: %d, %d\n", i+1, expected->id, got->id); + + for (j = 0; j < 5; j++) + { + ok_(__FILE__, line)(expected->args[j] == got->args[j], "got different args[%d] for %d: %p, %p\n", j, i+1, + expected->args[j], got->args[j]); + } + } + } + else + ok_(__FILE__, line)(0, "traces length mismatch\n"); +} + +#define ok_trace(a, b) ok_trace_(a, b, __LINE__) + +/* trace of actually made calls */ +static call_trace_t trace_got; static void test_GetAcceptLanguagesA(void) { @@ -180,7 +266,7 @@ static void test_GetAcceptLanguagesA(void) /* There is no space for the string in the registry. When the buffer is large enough, the default language is returned - When the buffer is to small for that fallback, win7_32 and w2k8_64 + When the buffer is too small for that fallback, win7_32 and w2k8_64 and above fail with HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), but recent os succeed and return a partial result while older os succeed and overflow the buffer */ @@ -248,7 +334,7 @@ static void test_GetAcceptLanguagesA(void) memset(buffer, '#', maxlen); buffer[maxlen] = 0; hr = pGetAcceptLanguagesA( buffer, &len); - /* When the buffer is to small, win7_32 and w2k8_64 and above fail with + /* When the buffer is too small, win7_32 and w2k8_64 and above fail with HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), other versions suceed and return a partial 0 terminated result while other versions fail with E_INVALIDARG and return a partial unterminated result */ @@ -1397,31 +1483,940 @@ static void test_SHPropertyBag_ReadLONG(void) IUnknown_Release((IUnknown*)pb); } + + +static void test_SHSetWindowBits(void) +{ + HWND hwnd; + DWORD style, styleold; + WNDCLASSA clsA; + + if(!pSHSetWindowBits) + { + win_skip("SHSetWindowBits is not available\n"); + return; + } + + clsA.style = 0; + clsA.lpfnWndProc = DefWindowProcA; + clsA.cbClsExtra = 0; + clsA.cbWndExtra = 0; + clsA.hInstance = GetModuleHandleA(NULL); + clsA.hIcon = 0; + clsA.hCursor = LoadCursorA(0, IDC_ARROW); + clsA.hbrBackground = NULL; + clsA.lpszMenuName = NULL; + clsA.lpszClassName = "Shlwapi test class"; + RegisterClassA(&clsA); + + hwnd = CreateWindowA("Shlwapi test class", "Test", WS_VISIBLE, 0, 0, 100, 100, + NULL, NULL, GetModuleHandle(NULL), 0); + ok(IsWindow(hwnd), "failed to create window\n"); + + /* null window */ + SetLastError(0xdeadbeef); + style = pSHSetWindowBits(NULL, GWL_STYLE, 0, 0); + ok(style == 0, "expected 0 retval, got %d\n", style); + ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE || + broken(GetLastError() == 0xdeadbeef), /* Win9x/WinMe */ + "expected ERROR_INVALID_WINDOW_HANDLE, got %d\n", GetLastError()); + + /* zero mask, zero flags */ + styleold = GetWindowLongA(hwnd, GWL_STYLE); + style = pSHSetWindowBits(hwnd, GWL_STYLE, 0, 0); + ok(styleold == style, "expected old style\n"); + ok(styleold == GetWindowLongA(hwnd, GWL_STYLE), "expected to keep old style\n"); + + /* test mask */ + styleold = GetWindowLongA(hwnd, GWL_STYLE); + ok(styleold & WS_VISIBLE, "expected WS_VISIBLE\n"); + style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0); + + ok(style == styleold, "expected previous style, got %x\n", style); + ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n"); + + /* test mask, unset style bit used */ + styleold = GetWindowLongA(hwnd, GWL_STYLE); + style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0); + ok(style == styleold, "expected previous style, got %x\n", style); + ok(styleold == GetWindowLongA(hwnd, GWL_STYLE), "expected to keep old style\n"); + + /* set back with flags */ + styleold = GetWindowLongA(hwnd, GWL_STYLE); + style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, WS_VISIBLE); + ok(style == styleold, "expected previous style, got %x\n", style); + ok(GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE, "expected updated style\n"); + + /* reset and try to set without a mask */ + pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0); + ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n"); + styleold = GetWindowLongA(hwnd, GWL_STYLE); + style = pSHSetWindowBits(hwnd, GWL_STYLE, 0, WS_VISIBLE); + ok(style == styleold, "expected previous style, got %x\n", style); + ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n"); + + DestroyWindow(hwnd); + + UnregisterClassA("Shlwapi test class", GetModuleHandleA(NULL)); +} + +static void test_SHFormatDateTimeA(void) +{ + FILETIME UNALIGNED filetime; + CHAR buff[100], buff2[100], buff3[100]; + SYSTEMTIME st; + DWORD flags; + INT ret; + + if(!pSHFormatDateTimeA) + { + win_skip("pSHFormatDateTimeA isn't available\n"); + return; + } + +if (0) +{ + /* crashes on native */ + ret = pSHFormatDateTimeA(NULL, NULL, NULL, 0); +} + + GetLocalTime(&st); + SystemTimeToFileTime(&st, &filetime); + /* SHFormatDateTime expects input as utc */ + LocalFileTimeToFileTime(&filetime, &filetime); + + /* no way to get required buffer length here */ + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeA(&filetime, NULL, NULL, 0); + ok(ret == 0, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + buff[0] = 'a'; buff[1] = 0; + ret = pSHFormatDateTimeA(&filetime, NULL, buff, 0); + ok(ret == 0, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + ok(buff[0] == 'a', "expected same string, got %s\n", buff); + + /* flags needs to have FDTF_NOAUTOREADINGORDER for these tests to succeed on Vista+ */ + + /* all combinations documented as invalid succeeded */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTTIME | FDTF_LONGTIME; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTDATE | FDTF_LONGDATE; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + flags = FDTF_SHORTDATE | FDTF_LTRDATE | FDTF_RTLDATE; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef || + broken(GetLastError() == ERROR_INVALID_FLAGS), /* Win9x/WinMe */ + "expected 0xdeadbeef, got %d\n", GetLastError()); + + /* now check returned strings */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + /* both time flags */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGTIME | FDTF_SHORTTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTDATE; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGDATE; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + /* both date flags */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGDATE | FDTF_SHORTDATE; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + /* various combinations of date/time flags */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGDATE | FDTF_SHORTTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d, length %d\n", ret, lstrlenA(buff)+1); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + strcat(buff2, ", "); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)); + ok(ret == lstrlenA(buff3)+1, "got %d\n", ret); + strcat(buff2, buff3); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGDATE | FDTF_LONGTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + strcat(buff2, ", "); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)); + ok(ret == lstrlenA(buff3)+1, "got %d\n", ret); + strcat(buff2, buff3); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTDATE | FDTF_SHORTTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + strcat(buff2, " "); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)); + ok(ret == lstrlenA(buff3)+1, "got %d\n", ret); + strcat(buff2, buff3); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTDATE | FDTF_LONGTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + strcat(buff2, " "); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)); + ok(ret == lstrlenA(buff3)+1, "got %d\n", ret); + strcat(buff2, buff3); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); +} + +static void test_SHFormatDateTimeW(void) +{ + FILETIME UNALIGNED filetime; + WCHAR buff[100], buff2[100], buff3[100]; + SYSTEMTIME st; + DWORD flags; + INT ret; + static const WCHAR spaceW[] = {' ',0}; + static const WCHAR commaW[] = {',',' ',0}; + + if(!pSHFormatDateTimeW) + { + win_skip("pSHFormatDateTimeW isn't available\n"); + return; + } + +if (0) +{ + /* crashes on native */ + ret = pSHFormatDateTimeW(NULL, NULL, NULL, 0); +} + + GetLocalTime(&st); + SystemTimeToFileTime(&st, &filetime); + /* SHFormatDateTime expects input as utc */ + LocalFileTimeToFileTime(&filetime, &filetime); + + /* no way to get required buffer length here */ + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeW(&filetime, NULL, NULL, 0); + ok(ret == 0, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + buff[0] = 'a'; buff[1] = 0; + ret = pSHFormatDateTimeW(&filetime, NULL, buff, 0); + ok(ret == 0, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + ok(buff[0] == 'a', "expected same string\n"); + + /* all combinations documented as invalid succeeded */ + flags = FDTF_SHORTTIME | FDTF_LONGTIME; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + flags = FDTF_SHORTDATE | FDTF_LONGDATE; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + flags = FDTF_SHORTDATE | FDTF_LTRDATE | FDTF_RTLDATE; + SetLastError(0xdeadbeef); + buff[0] = 0; /* NT4 doesn't clear the buffer on failure */ + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef || + broken(GetLastError() == ERROR_INVALID_FLAGS), /* Win9x/WinMe/NT4 */ + "expected 0xdeadbeef, got %d\n", GetLastError()); + + /* now check returned strings */ + flags = FDTF_SHORTTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + SetLastError(0xdeadbeef); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + if (ret == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("Needed W-functions are not implemented\n"); + return; + } + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_LONGTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + /* both time flags */ + flags = FDTF_LONGTIME | FDTF_SHORTTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal string\n"); + + flags = FDTF_SHORTDATE; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_LONGDATE; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + /* both date flags */ + flags = FDTF_LONGDATE | FDTF_SHORTDATE; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + /* various combinations of date/time flags */ + flags = FDTF_LONGDATE | FDTF_SHORTTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d, length %d\n", ret, lstrlenW(buff)+1); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + lstrcatW(buff2, commaW); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff3)+1, "got %d\n", ret); + lstrcatW(buff2, buff3); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_LONGDATE | FDTF_LONGTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + lstrcatW(buff2, commaW); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff3)+1, "got %d\n", ret); + lstrcatW(buff2, buff3); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_SHORTDATE | FDTF_SHORTTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + lstrcatW(buff2, spaceW); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff3)+1, "got %d\n", ret); + lstrcatW(buff2, buff3); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_SHORTDATE | FDTF_LONGTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + lstrcatW(buff2, spaceW); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff3)+1, "got %d\n", ret); + lstrcatW(buff2, buff3); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); +} + +static void test_SHGetObjectCompatFlags(void) +{ + struct compat_value { + CHAR nameA[30]; + DWORD value; + }; + + struct compat_value values[] = { + { "OTNEEDSSFCACHE", 0x1 }, + { "NO_WEBVIEW", 0x2 }, + { "UNBINDABLE", 0x4 }, + { "PINDLL", 0x8 }, + { "NEEDSFILESYSANCESTOR", 0x10 }, + { "NOTAFILESYSTEM", 0x20 }, + { "CTXMENU_NOVERBS", 0x40 }, + { "CTXMENU_LIMITEDQI", 0x80 }, + { "COCREATESHELLFOLDERONLY", 0x100 }, + { "NEEDSSTORAGEANCESTOR", 0x200 }, + { "NOLEGACYWEBVIEW", 0x400 }, + { "CTXMENU_XPQCMFLAGS", 0x1000 }, + { "NOIPROPERTYSTORE", 0x2000 } + }; + + static const char compat_path[] = "Software\\Microsoft\\Windows\\CurrentVersion\\ShellCompatibility\\Objects"; + CHAR keyA[39]; /* {CLSID} */ + HKEY root; + DWORD ret; + int i; + + if (!pSHGetObjectCompatFlags) + { + win_skip("SHGetObjectCompatFlags isn't available\n"); + return; + } + + /* null args */ + ret = pSHGetObjectCompatFlags(NULL, NULL); + ok(ret == 0, "got %d\n", ret); + + ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, compat_path, &root); + if (ret != ERROR_SUCCESS) + { + skip("No compatibility class data found\n"); + return; + } + + for (i = 0; RegEnumKeyA(root, i, keyA, sizeof(keyA)) == ERROR_SUCCESS; i++) + { + HKEY clsid_key; + + if (RegOpenKeyA(root, keyA, &clsid_key) == ERROR_SUCCESS) + { + CHAR valueA[30]; + DWORD expected = 0, got, length = sizeof(valueA); + CLSID clsid; + int v; + + for (v = 0; RegEnumValueA(clsid_key, v, valueA, &length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; v++) + { + int j; + + for (j = 0; j < sizeof(values)/sizeof(struct compat_value); j++) + if (lstrcmpA(values[j].nameA, valueA) == 0) + { + expected |= values[j].value; + break; + } + + length = sizeof(valueA); + } + + pGUIDFromStringA(keyA, &clsid); + got = pSHGetObjectCompatFlags(NULL, &clsid); + ok(got == expected, "got 0x%08x, expected 0x%08x. Key %s\n", got, expected, keyA); + + RegCloseKey(clsid_key); + } + } + + RegCloseKey(root); +} + +typedef struct { + const IOleCommandTargetVtbl *lpVtbl; + LONG ref; +} IOleCommandTargetImpl; + +static const IOleCommandTargetVtbl IOleCommandTargetImpl_Vtbl; + +IOleCommandTarget* IOleCommandTargetImpl_Construct(void) +{ + IOleCommandTargetImpl *obj; + + obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); + obj->lpVtbl = &IOleCommandTargetImpl_Vtbl; + obj->ref = 1; + + return (IOleCommandTarget*)obj; +} + +static HRESULT WINAPI IOleCommandTargetImpl_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppvObj) +{ + IOleCommandTargetImpl *This = (IOleCommandTargetImpl *)iface; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IOleCommandTarget)) + { + *ppvObj = This; + } + + if(*ppvObj) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IOleCommandTargetImpl_AddRef(IOleCommandTarget *iface) +{ + IOleCommandTargetImpl *This = (IOleCommandTargetImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IOleCommandTargetImpl_Release(IOleCommandTarget *iface) +{ + IOleCommandTargetImpl *This = (IOleCommandTargetImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return ref; +} + +static HRESULT WINAPI IOleCommandTargetImpl_QueryStatus( + IOleCommandTarget *iface, const GUID *group, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IOleCommandTargetImpl_Exec( + IOleCommandTarget *iface, + const GUID *CmdGroup, + DWORD nCmdID, + DWORD nCmdexecopt, + VARIANT *pvaIn, + VARIANT *pvaOut) +{ + add_call(&trace_got, 3, CmdGroup, (void*)(DWORD_PTR)nCmdID, (void*)(DWORD_PTR)nCmdexecopt, pvaIn, pvaOut); + return S_OK; +} + +static const IOleCommandTargetVtbl IOleCommandTargetImpl_Vtbl = +{ + IOleCommandTargetImpl_QueryInterface, + IOleCommandTargetImpl_AddRef, + IOleCommandTargetImpl_Release, + IOleCommandTargetImpl_QueryStatus, + IOleCommandTargetImpl_Exec +}; + +typedef struct { + const IServiceProviderVtbl *lpVtbl; + LONG ref; +} IServiceProviderImpl; + +typedef struct { + const IProfferServiceVtbl *lpVtbl; + LONG ref; +} IProfferServiceImpl; + + +static const IServiceProviderVtbl IServiceProviderImpl_Vtbl; +static const IProfferServiceVtbl IProfferServiceImpl_Vtbl; + +IServiceProvider* IServiceProviderImpl_Construct(void) +{ + IServiceProviderImpl *obj; + + obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); + obj->lpVtbl = &IServiceProviderImpl_Vtbl; + obj->ref = 1; + + return (IServiceProvider*)obj; +} + +IProfferService* IProfferServiceImpl_Construct(void) +{ + IProfferServiceImpl *obj; + + obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); + obj->lpVtbl = &IProfferServiceImpl_Vtbl; + obj->ref = 1; + + return (IProfferService*)obj; +} + +static HRESULT WINAPI IServiceProviderImpl_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppvObj) +{ + IServiceProviderImpl *This = (IServiceProviderImpl *)iface; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IServiceProvider)) + { + *ppvObj = This; + } + + if(*ppvObj) + { + IUnknown_AddRef(iface); + /* native uses redefined IID_IServiceProvider symbol, so we can't compare pointers */ + if (IsEqualIID(riid, &IID_IServiceProvider)) + add_call(&trace_got, 1, iface, &IID_IServiceProvider, 0, 0, 0); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IServiceProviderImpl_AddRef(IServiceProvider *iface) +{ + IServiceProviderImpl *This = (IServiceProviderImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IServiceProviderImpl_Release(IServiceProvider *iface) +{ + IServiceProviderImpl *This = (IServiceProviderImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return ref; +} + +static HRESULT WINAPI IServiceProviderImpl_QueryService( + IServiceProvider *iface, REFGUID service, REFIID riid, void **ppv) +{ + /* native uses redefined pointer for IID_IOleCommandTarget, not one from uuid.lib */ + if (IsEqualIID(riid, &IID_IOleCommandTarget)) + { + add_call(&trace_got, 2, iface, service, &IID_IOleCommandTarget, 0, 0); + *ppv = IOleCommandTargetImpl_Construct(); + } + if (IsEqualIID(riid, &IID_IProfferService)) + { + if (IsEqualIID(service, &IID_IProfferService)) + add_call(&trace_got, 2, &IID_IProfferService, &IID_IProfferService, 0, 0, 0); + *ppv = IProfferServiceImpl_Construct(); + } + return S_OK; +} + +static const IServiceProviderVtbl IServiceProviderImpl_Vtbl = +{ + IServiceProviderImpl_QueryInterface, + IServiceProviderImpl_AddRef, + IServiceProviderImpl_Release, + IServiceProviderImpl_QueryService +}; + +static void test_IUnknown_QueryServiceExec(void) +{ + IServiceProvider *provider = IServiceProviderImpl_Construct(); + static const GUID dummy_serviceid = { 0xdeadbeef }; + static const GUID dummy_groupid = { 0xbeefbeef }; + call_trace_t trace_expected; + HRESULT hr; + + /* on <=W2K platforms same ordinal used for another export with different + prototype, so skipping using this indirect condition */ + if (is_win2k_and_lower) + { + win_skip("IUnknown_QueryServiceExec is not available\n"); + return; + } + + /* null source pointer */ + hr = pIUnknown_QueryServiceExec(NULL, &dummy_serviceid, &dummy_groupid, 0, 0, 0, 0); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + + /* expected trace: + IUnknown_QueryServiceExec( ptr1, serviceid, groupid, arg1, arg2, arg3, arg4); + -> IUnknown_QueryInterface( ptr1, &IID_IServiceProvider, &prov ); + -> IServiceProvider_QueryService( prov, serviceid, &IID_IOleCommandTarget, &obj ); + -> IOleCommandTarget_Exec( obj, groupid, arg1, arg2, arg3, arg4 ); + */ + init_call_trace(&trace_expected); + + add_call(&trace_expected, 1, provider, &IID_IServiceProvider, 0, 0, 0); + add_call(&trace_expected, 2, provider, &dummy_serviceid, &IID_IOleCommandTarget, 0, 0); + add_call(&trace_expected, 3, &dummy_groupid, (void*)0x1, (void*)0x2, (void*)0x3, (void*)0x4); + + init_call_trace(&trace_got); + hr = pIUnknown_QueryServiceExec((IUnknown*)provider, &dummy_serviceid, &dummy_groupid, 0x1, 0x2, (void*)0x3, (void*)0x4); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ok_trace(&trace_expected, &trace_got); + + free_call_trace(&trace_expected); + free_call_trace(&trace_got); + + IServiceProvider_Release(provider); +} + + +static HRESULT WINAPI IProfferServiceImpl_QueryInterface(IProfferService *iface, REFIID riid, void **ppvObj) +{ + IProfferServiceImpl *This = (IProfferServiceImpl *)iface; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IProfferService)) + { + *ppvObj = This; + } + else if (IsEqualIID(riid, &IID_IServiceProvider)) + { + *ppvObj = IServiceProviderImpl_Construct(); + add_call(&trace_got, 1, iface, &IID_IServiceProvider, 0, 0, 0); + return S_OK; + } + + if(*ppvObj) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IProfferServiceImpl_AddRef(IProfferService *iface) +{ + IProfferServiceImpl *This = (IProfferServiceImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IProfferServiceImpl_Release(IProfferService *iface) +{ + IProfferServiceImpl *This = (IProfferServiceImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return ref; +} + +static HRESULT WINAPI IProfferServiceImpl_ProfferService(IProfferService *iface, + REFGUID service, IServiceProvider *pService, DWORD *pCookie) +{ + add_call(&trace_got, 3, service, pService, pCookie, 0, 0); + return S_OK; +} + +static HRESULT WINAPI IProfferServiceImpl_RevokeService(IProfferService *iface, DWORD cookie) +{ + add_call(&trace_got, 4, (void*)(DWORD_PTR)cookie, 0, 0, 0, 0); + return S_OK; +} + +static const IProfferServiceVtbl IProfferServiceImpl_Vtbl = +{ + IProfferServiceImpl_QueryInterface, + IProfferServiceImpl_AddRef, + IProfferServiceImpl_Release, + IProfferServiceImpl_ProfferService, + IProfferServiceImpl_RevokeService +}; + +static void test_IUnknown_ProfferService(void) +{ + IServiceProvider *provider = IServiceProviderImpl_Construct(); + IProfferService *proff = IProfferServiceImpl_Construct(); + static const GUID dummy_serviceid = { 0xdeadbeef }; + call_trace_t trace_expected; + HRESULT hr; + DWORD cookie; + + /* on <=W2K platforms same ordinal used for another export with different + prototype, so skipping using this indirect condition */ + if (is_win2k_and_lower) + { + win_skip("IUnknown_ProfferService is not available\n"); + return; + } + + /* null source pointer */ + hr = pIUnknown_ProfferService(NULL, &dummy_serviceid, 0, 0); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + + /* expected trace: + IUnknown_ProfferService( ptr1, serviceid, arg1, arg2); + -> IUnknown_QueryInterface( ptr1, &IID_IServiceProvider, &provider ); + -> IServiceProvider_QueryService( provider, &IID_IProfferService, &IID_IProfferService, &proffer ); + + if (service pointer not null): + -> IProfferService_ProfferService( proffer, serviceid, arg1, arg2 ); + else + -> IProfferService_RevokeService( proffer, *arg2 ); + */ + init_call_trace(&trace_expected); + + add_call(&trace_expected, 1, proff, &IID_IServiceProvider, 0, 0, 0); + add_call(&trace_expected, 2, &IID_IProfferService, &IID_IProfferService, 0, 0, 0); + add_call(&trace_expected, 3, &dummy_serviceid, provider, &cookie, 0, 0); + + init_call_trace(&trace_got); + hr = pIUnknown_ProfferService((IUnknown*)proff, &dummy_serviceid, provider, &cookie); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ok_trace(&trace_expected, &trace_got); + free_call_trace(&trace_got); + free_call_trace(&trace_expected); + + /* same with ::Revoke path */ + init_call_trace(&trace_expected); + + add_call(&trace_expected, 1, proff, &IID_IServiceProvider, 0, 0, 0); + add_call(&trace_expected, 2, &IID_IProfferService, &IID_IProfferService, 0, 0, 0); + add_call(&trace_expected, 4, (void*)(DWORD_PTR)cookie, 0, 0, 0, 0); + + init_call_trace(&trace_got); + hr = pIUnknown_ProfferService((IUnknown*)proff, &dummy_serviceid, 0, &cookie); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok_trace(&trace_expected, &trace_got); + free_call_trace(&trace_got); + free_call_trace(&trace_expected); + + IServiceProvider_Release(provider); + IProfferService_Release(proff); +} + +static void test_SHCreateWorkerWindowA(void) +{ + WNDCLASSA cliA; + char classA[20]; + HWND hwnd; + LONG_PTR ret; + BOOL res; + + if (is_win2k_and_lower) + { + win_skip("SHCreateWorkerWindowA not available\n"); + return; + } + + hwnd = pSHCreateWorkerWindowA(0, NULL, 0, 0, 0, 0); + ok(hwnd != 0, "expected window\n"); + + GetClassName(hwnd, classA, 20); + ok(lstrcmpA(classA, "WorkerA") == 0, "expected WorkerA class, got %s\n", classA); + + ret = GetWindowLongPtrA(hwnd, 0); + ok(ret == 0, "got %ld\n", ret); + + /* class info */ + memset(&cliA, 0, sizeof(cliA)); + res = GetClassInfoA(GetModuleHandle("shlwapi.dll"), "WorkerA", &cliA); + ok(res, "failed to get class info\n"); + ok(cliA.style == 0, "got 0x%08x\n", cliA.style); + ok(cliA.cbClsExtra == 0, "got %d\n", cliA.cbClsExtra); + ok(cliA.cbWndExtra == sizeof(LONG_PTR), "got %d\n", cliA.cbWndExtra); + ok(cliA.lpszMenuName == 0, "got %s\n", cliA.lpszMenuName); + + DestroyWindow(hwnd); + + /* set extra bytes */ + hwnd = pSHCreateWorkerWindowA(0, NULL, 0, 0, 0, 0xdeadbeef); + ok(hwnd != 0, "expected window\n"); + + GetClassName(hwnd, classA, 20); + ok(lstrcmpA(classA, "WorkerA") == 0, "expected WorkerA class, got %s\n", classA); + + ret = GetWindowLongPtrA(hwnd, 0); + ok(ret == 0xdeadbeef, "got %ld\n", ret); + + /* test exstyle */ + ret = GetWindowLongA(hwnd, GWL_EXSTYLE); + ok(ret == WS_EX_WINDOWEDGE, "0x%08lx\n", ret); + + DestroyWindow(hwnd); + + hwnd = pSHCreateWorkerWindowA(0, NULL, WS_EX_TOOLWINDOW, 0, 0, 0); + ret = GetWindowLongA(hwnd, GWL_EXSTYLE); + ok(ret == (WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW), "0x%08lx\n", ret); + DestroyWindow(hwnd); +} + +static void init_pointers(void) +{ +#define MAKEFUNC(f, ord) (p##f = (void*)GetProcAddress(hShlwapi, (LPSTR)(ord))) + MAKEFUNC(SHAllocShared, 7); + MAKEFUNC(SHLockShared, 8); + MAKEFUNC(SHUnlockShared, 9); + MAKEFUNC(SHFreeShared, 10); + MAKEFUNC(GetAcceptLanguagesA, 14); + MAKEFUNC(SHSetWindowBits, 165); + MAKEFUNC(ConnectToConnectionPoint, 168); + MAKEFUNC(SHSearchMapInt, 198); + MAKEFUNC(SHCreateWorkerWindowA, 257); + MAKEFUNC(GUIDFromStringA, 269); + MAKEFUNC(SHPackDispParams, 282); + MAKEFUNC(IConnectionPoint_InvokeWithCancel, 283); + MAKEFUNC(IConnectionPoint_SimpleInvoke, 284); + MAKEFUNC(SHFormatDateTimeA, 353); + MAKEFUNC(SHFormatDateTimeW, 354); + MAKEFUNC(SHGetObjectCompatFlags, 476); + MAKEFUNC(IUnknown_QueryServiceExec, 484); + MAKEFUNC(SHPropertyBag_ReadLONG, 496); + MAKEFUNC(IUnknown_ProfferService, 514); +#undef MAKEFUNC +} + START_TEST(ordinal) { - hShlwapi = GetModuleHandleA("shlwapi.dll"); + hShlwapi = GetModuleHandleA("shlwapi.dll"); + is_win2k_and_lower = GetProcAddress(hShlwapi, "StrChrNW") == 0; - pGetAcceptLanguagesA = (void*)GetProcAddress(hShlwapi, (LPSTR)14); - pSHSearchMapInt = (void*)GetProcAddress(hShlwapi, (LPSTR)198); - pSHAllocShared=(void*)GetProcAddress(hShlwapi,(char*)7); - pSHLockShared=(void*)GetProcAddress(hShlwapi,(char*)8); - pSHUnlockShared=(void*)GetProcAddress(hShlwapi,(char*)9); - pSHFreeShared=(void*)GetProcAddress(hShlwapi,(char*)10); - pSHPackDispParams=(void*)GetProcAddress(hShlwapi,(char*)282); - pIConnectionPoint_SimpleInvoke=(void*)GetProcAddress(hShlwapi,(char*)284); - pIConnectionPoint_InvokeWithCancel=(void*)GetProcAddress(hShlwapi,(char*)283); - pConnectToConnectionPoint=(void*)GetProcAddress(hShlwapi,(char*)168); - pSHPropertyBag_ReadLONG=(void*)GetProcAddress(hShlwapi,(char*)496); + init_pointers(); - hmlang = LoadLibraryA("mlang.dll"); - pLcidToRfc1766A = (void *)GetProcAddress(hmlang, "LcidToRfc1766A"); + hmlang = LoadLibraryA("mlang.dll"); + pLcidToRfc1766A = (void *)GetProcAddress(hmlang, "LcidToRfc1766A"); - test_GetAcceptLanguagesA(); - test_SHSearchMapInt(); - test_alloc_shared(); - test_fdsa(); - test_GetShellSecurityDescriptor(); - test_SHPackDispParams(); - test_IConnectionPoint(); - test_SHPropertyBag_ReadLONG(); + test_GetAcceptLanguagesA(); + test_SHSearchMapInt(); + test_alloc_shared(); + test_fdsa(); + test_GetShellSecurityDescriptor(); + test_SHPackDispParams(); + test_IConnectionPoint(); + test_SHPropertyBag_ReadLONG(); + test_SHSetWindowBits(); + test_SHFormatDateTimeA(); + test_SHFormatDateTimeW(); + test_SHGetObjectCompatFlags(); + test_IUnknown_QueryServiceExec(); + test_IUnknown_ProfferService(); + test_SHCreateWorkerWindowA(); } diff --git a/rostests/winetests/shlwapi/path.c b/rostests/winetests/shlwapi/path.c index e52502fdf58..3e83a4556c6 100755 --- a/rostests/winetests/shlwapi/path.c +++ b/rostests/winetests/shlwapi/path.c @@ -28,12 +28,12 @@ #include "shlwapi.h" #include "wininet.h" -static HMODULE hShlwapi; static HRESULT (WINAPI *pPathIsValidCharA)(char,DWORD); static HRESULT (WINAPI *pPathIsValidCharW)(WCHAR,DWORD); static LPWSTR (WINAPI *pPathCombineW)(LPWSTR, LPCWSTR, LPCWSTR); static HRESULT (WINAPI *pPathCreateFromUrlA)(LPCSTR, LPSTR, LPDWORD, DWORD); static HRESULT (WINAPI *pPathCreateFromUrlW)(LPCWSTR, LPWSTR, LPDWORD, DWORD); +static BOOL (WINAPI *pPathAppendA)(LPSTR, LPCSTR); /* ################ */ @@ -300,6 +300,15 @@ static void test_PathIsValidCharA(void) BOOL ret; unsigned int c; + /* For whatever reason, PathIsValidCharA and PathAppendA share the same + * ordinal number in some native versions. Check this to prevent a crash. + */ + if (!pPathIsValidCharA || pPathIsValidCharA == (void*)pPathAppendA) + { + win_skip("PathIsValidCharA isn't available\n"); + return; + } + for (c = 0; c < 0x7f; c++) { ret = pPathIsValidCharA( c, ~0U ); @@ -318,6 +327,12 @@ static void test_PathIsValidCharW(void) BOOL ret; unsigned int c; + if (!pPathIsValidCharW) + { + win_skip("PathIsValidCharW isn't available\n"); + return; + } + for (c = 0; c < 0x7f; c++) { ret = pPathIsValidCharW( c, ~0U ); @@ -392,7 +407,13 @@ static void test_PathCombineW(void) WCHAR wbuf[MAX_PATH+1], wstr1[MAX_PATH] = {'C',':','\\',0}, wstr2[MAX_PATH]; static const WCHAR expout[] = {'C',':','\\','A','A',0}; int i; - + + if (!pPathCombineW) + { + win_skip("PathCombineW isn't available\n"); + return; + } + wszString2 = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); /* NULL test */ @@ -1312,43 +1333,60 @@ static void test_PathUnquoteSpaces(void) } } +static void test_PathGetDriveNumber(void) +{ + static const CHAR test1A[] = "a:\\test.file"; + static const CHAR test2A[] = "file:////b:\\test.file"; + static const CHAR test3A[] = "file:///c:\\test.file"; + static const CHAR test4A[] = "file:\\\\c:\\test.file"; + int ret; + + SetLastError(0xdeadbeef); + ret = PathGetDriveNumberA(NULL); + ok(ret == -1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "got %d\n", GetLastError()); + + ret = PathGetDriveNumberA(test1A); + ok(ret == 0, "got %d\n", ret); + ret = PathGetDriveNumberA(test2A); + ok(ret == -1, "got %d\n", ret); + ret = PathGetDriveNumberA(test3A); + ok(ret == -1, "got %d\n", ret); + ret = PathGetDriveNumberA(test4A); + ok(ret == -1, "got %d\n", ret); +} + /* ################ */ START_TEST(path) { - hShlwapi = GetModuleHandleA("shlwapi.dll"); - pPathCreateFromUrlA = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlA"); - pPathCreateFromUrlW = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlW"); + HMODULE hShlwapi = GetModuleHandleA("shlwapi.dll"); - test_PathSearchAndQualify(); - test_PathCreateFromUrl(); - test_PathIsUrl(); + pPathCreateFromUrlA = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlA"); + pPathCreateFromUrlW = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlW"); + pPathCombineW = (void*)GetProcAddress(hShlwapi, "PathCombineW"); + pPathIsValidCharA = (void*)GetProcAddress(hShlwapi, (LPSTR)455); + pPathIsValidCharW = (void*)GetProcAddress(hShlwapi, (LPSTR)456); + pPathAppendA = (void*)GetProcAddress(hShlwapi, "PathAppendA"); - test_PathAddBackslash(); - test_PathMakePretty(); - test_PathMatchSpec(); + test_PathSearchAndQualify(); + test_PathCreateFromUrl(); + test_PathIsUrl(); + + test_PathAddBackslash(); + test_PathMakePretty(); + test_PathMatchSpec(); - /* For whatever reason, PathIsValidCharA and PathAppendA share the same - * ordinal number in some native versions. Check this to prevent a crash. - */ - pPathIsValidCharA = (void*)GetProcAddress(hShlwapi, (LPSTR)455); - if (pPathIsValidCharA && pPathIsValidCharA != (void*)GetProcAddress(hShlwapi, "PathAppendA")) - { test_PathIsValidCharA(); + test_PathIsValidCharW(); - pPathIsValidCharW = (void*)GetProcAddress(hShlwapi, (LPSTR)456); - if (pPathIsValidCharW) test_PathIsValidCharW(); - } - - pPathCombineW = (void*)GetProcAddress(hShlwapi, "PathCombineW"); - if (pPathCombineW) test_PathCombineW(); - - test_PathCombineA(); - test_PathAppendA(); - test_PathCanonicalizeA(); - test_PathFindExtensionA(); - test_PathBuildRootA(); - test_PathCommonPrefixA(); - test_PathUnquoteSpaces(); + test_PathCombineA(); + test_PathAppendA(); + test_PathCanonicalizeA(); + test_PathFindExtensionA(); + test_PathBuildRootA(); + test_PathCommonPrefixA(); + test_PathUnquoteSpaces(); + test_PathGetDriveNumber(); } diff --git a/rostests/winetests/shlwapi/shlwapi.rbuild b/rostests/winetests/shlwapi/shlwapi.rbuild index cd5cffd19a3..0fe700994c5 100644 --- a/rostests/winetests/shlwapi/shlwapi.rbuild +++ b/rostests/winetests/shlwapi/shlwapi.rbuild @@ -3,7 +3,7 @@ . - + assoc.c clist.c clsid.c @@ -21,6 +21,7 @@ advapi32 ole32 oleaut32 + user32 ntdll diff --git a/rostests/winetests/shlwapi/string.c b/rostests/winetests/shlwapi/string.c index 00f0b023046..17c652de411 100755 --- a/rostests/winetests/shlwapi/string.c +++ b/rostests/winetests/shlwapi/string.c @@ -863,6 +863,33 @@ static void test_StrXXX_overflows(void) else win_skip("StrCatBuffA() is not available\n"); +if (0) +{ + /* crashes on XP */ + StrCpyNW(wbuf, (LPCWSTR)0x1, 10); + StrCpyNW((LPWSTR)0x1, wstr1, 10); +} + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, (LPCWSTR)0x1, 1), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], 0, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, 0, 10), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], 0, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, 0, 0), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], (WCHAR)0xbfbf, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, wstr1, 0), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], (WCHAR)0xbfbf, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + memset(wbuf, 0xbf, sizeof(wbuf)); expect_eq(StrCpyNW(wbuf, wstr1, 10), wbuf, PWCHAR, "%p"); expect_eq(wbuf[9], 0, WCHAR, "%x"); diff --git a/rostests/winetests/shlwapi/url.c b/rostests/winetests/shlwapi/url.c index 3d86ae7c5e1..0dd96431811 100644 --- a/rostests/winetests/shlwapi/url.c +++ b/rostests/winetests/shlwapi/url.c @@ -160,6 +160,7 @@ static const TEST_URL_CANONICALIZE TEST_CANONICALIZE[] = { {"A", 0, S_OK, "A", FALSE}, {"/uri-res/N2R?urn:sha1:B3K", URL_DONT_ESCAPE_EXTRA_INFO | URL_WININET_COMPATIBILITY /*0x82000000*/, S_OK, "/uri-res/N2R?urn:sha1:B3K", FALSE} /*LimeWire online installer calls this*/, {"http:www.winehq.org/dir/../index.html", 0, S_OK, "http:www.winehq.org/index.html"}, + {"http://localhost/test.html", URL_FILE_USE_PATHURL, S_OK, "http://localhost/test.html"} }; /* ################ */ @@ -278,6 +279,11 @@ static const TEST_URL_COMBINE TEST_COMBINE[] = { {"http://www.winehq.org/tests/../tests/", "/tests10/..", URL_DONT_SIMPLIFY, S_OK, "http://www.winehq.org/tests10/.."}, {"http://www.winehq.org/tests/../", "tests11", URL_DONT_SIMPLIFY, S_OK, "http://www.winehq.org/tests/../tests11"}, {"file:///C:\\dir\\file.txt", "test.txt", 0, S_OK, "file:///C:/dir/test.txt"}, + {"file:///C:\\dir\\file.txt#hash\\hash", "test.txt", 0, S_OK, "file:///C:/dir/file.txt#hash/test.txt"}, + {"file:///C:\\dir\\file.html#hash\\hash", "test.html", 0, S_OK, "file:///C:/dir/test.html"}, + {"file:///C:\\dir\\file.htm#hash\\hash", "test.htm", 0, S_OK, "file:///C:/dir/test.htm"}, + {"file:///C:\\dir\\file.hTmL#hash\\hash", "test.hTmL", 0, S_OK, "file:///C:/dir/test.hTmL"}, + {"file:///C:\\dir.html\\file.txt#hash\\hash", "test.txt", 0, S_OK, "file:///C:/dir.html/file.txt#hash/test.txt"}, {"C:\\winehq\\winehq.txt", "C:\\Test\\test.txt", 0, S_OK, "file:///C:/Test/test.txt"}, {"http://www.winehq.org/test/", "test%20file.txt", 0, S_OK, "http://www.winehq.org/test/test%20file.txt"}, {"http://www.winehq.org/test/", "test%20file.txt", URL_FILE_USE_PATHURL, S_OK, "http://www.winehq.org/test/test%20file.txt"}, @@ -537,6 +543,13 @@ static void test_url_part(const char* szUrl, DWORD dwPart, DWORD dwFlags, const HRESULT res; DWORD dwSize; + dwSize = 1; + res = pUrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags); + ok(res == E_POINTER, "UrlGetPart for \"%s\" gave: 0x%08x\n", szUrl, res); + ok(dwSize == strlen(szExpected)+1 || + (*szExpected == '?' && dwSize == strlen(szExpected)), + "UrlGetPart for \"%s\" gave size: %u\n", szUrl, dwSize); + dwSize = INTERNET_MAX_URL_LENGTH; res = pUrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags); ok(res == S_OK, @@ -570,6 +583,7 @@ static void test_UrlGetPart(void) { const char* file_url = "file://h o s t/c:/windows/file"; const char* http_url = "http://user:pass 123@www.wine hq.org"; + const char* res_url = "res://some.dll/find.dlg"; const char* about_url = "about:blank"; CHAR szPart[INTERNET_MAX_URL_LENGTH]; @@ -581,20 +595,38 @@ static void test_UrlGetPart(void) return; } + res = pUrlGetPartA(NULL, NULL, NULL, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "null params gave: 0x%08x\n", res); + + res = pUrlGetPartA(NULL, szPart, &dwSize, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "null URL gave: 0x%08x\n", res); + + res = pUrlGetPartA(res_url, NULL, &dwSize, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "null szPart gave: 0x%08x\n", res); + + res = pUrlGetPartA(res_url, szPart, NULL, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "null URL gave: 0x%08x\n", res); + + dwSize = 0; + szPart[0]='x'; szPart[1]=0; + res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "UrlGetPartA(*pcchOut = 0) returned %08X\n", res); + ok(szPart[0] == 'x' && szPart[1] == 0, "UrlGetPartA(*pcchOut = 0) modified szPart: \"%s\"\n", szPart); + ok(dwSize == 0, "dwSize = %d\n", dwSize); + dwSize = sizeof szPart; szPart[0]='x'; szPart[1]=0; res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0); - todo_wine { ok (res==S_FALSE, "UrlGetPartA(\"hi\") returned %08X\n", res); ok(szPart[0]==0, "UrlGetPartA(\"hi\") return \"%s\" instead of \"\"\n", szPart); - } + ok(dwSize == 0, "dwSize = %d\n", dwSize); + dwSize = sizeof szPart; szPart[0]='x'; szPart[1]=0; res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_QUERY, 0); - todo_wine { ok (res==S_FALSE, "UrlGetPartA(\"hi\") returned %08X\n", res); ok(szPart[0]==0, "UrlGetPartA(\"hi\") return \"%s\" instead of \"\"\n", szPart); - } + ok(dwSize == 0, "dwSize = %d\n", dwSize); test_url_part(TEST_URL_3, URL_PART_HOSTNAME, 0, "localhost"); test_url_part(TEST_URL_3, URL_PART_PORT, 0, "21"); @@ -614,9 +646,20 @@ static void test_UrlGetPart(void) res = pUrlGetPartA(about_url, szPart, &dwSize, URL_PART_HOSTNAME, 0); ok(res==E_FAIL, "returned %08x\n", res); + test_url_part(res_url, URL_PART_SCHEME, 0, "res"); + test_url_part("http://www.winehq.org", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, "http:www.winehq.org"); + + dwSize = sizeof szPart; + szPart[0]='x'; szPart[1]=0; + res = pUrlGetPartA(res_url, szPart, &dwSize, URL_PART_QUERY, 0); + ok(res==S_FALSE, "UrlGetPartA returned %08X\n", res); + ok(szPart[0]==0, "UrlGetPartA gave \"%s\" instead of \"\"\n", szPart); + ok(dwSize == 0, "dwSize = %d\n", dwSize); + dwSize = sizeof(szPart); res = pUrlGetPartA("file://c:\\index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0); ok(res==S_FALSE, "returned %08x\n", res); + ok(dwSize == 0, "dwSize = %d\n", dwSize); dwSize = sizeof(szPart); szPart[0] = 'x'; szPart[1] = '\0'; @@ -624,6 +667,11 @@ static void test_UrlGetPart(void) ok(res==S_FALSE, "returned %08x\n", res); ok(szPart[0] == '\0', "szPart[0] = %c\n", szPart[0]); ok(dwSize == 0, "dwSize = %d\n", dwSize); + + dwSize = sizeof(szPart); + szPart[0] = 'x'; szPart[1] = '\0'; + res = pUrlGetPartA("index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0); + ok(res==E_FAIL, "returned %08x\n", res); } /* ########################### */ @@ -1000,6 +1048,15 @@ static void test_UrlCreateFromPath(void) /* ########################### */ +static void test_UrlIs_null(DWORD flag) +{ + BOOL ret; + ret = pUrlIsA(NULL, flag); + ok(ret == FALSE, "pUrlIsA(NULL, %d) failed\n", flag); + ret = pUrlIsW(NULL, flag); + ok(ret == FALSE, "pUrlIsW(NULL, %d) failed\n", flag); +} + static void test_UrlIs(void) { BOOL ret; @@ -1011,6 +1068,14 @@ static void test_UrlIs(void) return; } + test_UrlIs_null(URLIS_APPLIABLE); + test_UrlIs_null(URLIS_DIRECTORY); + test_UrlIs_null(URLIS_FILEURL); + test_UrlIs_null(URLIS_HASQUERY); + test_UrlIs_null(URLIS_NOHISTORY); + test_UrlIs_null(URLIS_OPAQUE); + test_UrlIs_null(URLIS_URL); + for(i = 0; i < sizeof(TEST_PATH_IS_URL) / sizeof(TEST_PATH_IS_URL[0]); i++) { MultiByteToWideChar(CP_ACP, 0, TEST_PATH_IS_URL[i].path, -1, wurl, 80); diff --git a/rostests/winetests/urlmon/generated.c b/rostests/winetests/urlmon/generated.c index 8a2f353b043..63e892bc543 100644 --- a/rostests/winetests/urlmon/generated.c +++ b/rostests/winetests/urlmon/generated.c @@ -54,45 +54,289 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_BINDINFO(void) { - /* BINDINFO (pack 4) */ + /* BINDINFO */ + TEST_FIELD_SIZE (BINDINFO, cbSize, 4) + TEST_FIELD_ALIGN (BINDINFO, cbSize, 4) + TEST_FIELD_OFFSET(BINDINFO, cbSize, 0) + TEST_FIELD_SIZE (BINDINFO, szExtraInfo, 8) + TEST_FIELD_ALIGN (BINDINFO, szExtraInfo, 8) + TEST_FIELD_OFFSET(BINDINFO, szExtraInfo, 8) +} + +static void test_pack_IBindHost(void) +{ + /* IBindHost */ +} + +static void test_pack_IBindHostVtbl(void) +{ + /* IBindHostVtbl */ +} + +static void test_pack_IBindStatusCallback(void) +{ + /* IBindStatusCallback */ +} + +static void test_pack_IBindStatusCallbackVtbl(void) +{ + /* IBindStatusCallbackVtbl */ +} + +static void test_pack_IBinding(void) +{ + /* IBinding */ +} + +static void test_pack_IBindingVtbl(void) +{ + /* IBindingVtbl */ +} + +static void test_pack_IInternetProtocolInfo(void) +{ + /* IInternetProtocolInfo */ +} + +static void test_pack_IInternetProtocolInfoVtbl(void) +{ + /* IInternetProtocolInfoVtbl */ +} + +static void test_pack_IInternetSession(void) +{ + /* IInternetSession */ +} + +static void test_pack_IInternetSessionVtbl(void) +{ + /* IInternetSessionVtbl */ +} + +static void test_pack_IPersistMoniker(void) +{ + /* IPersistMoniker */ +} + +static void test_pack_IPersistMonikerVtbl(void) +{ + /* IPersistMonikerVtbl */ +} + +static void test_pack_IWinInetHttpInfo(void) +{ + /* IWinInetHttpInfo */ +} + +static void test_pack_IWinInetHttpInfoVtbl(void) +{ + /* IWinInetHttpInfoVtbl */ +} + +static void test_pack_IWinInetInfo(void) +{ + /* IWinInetInfo */ +} + +static void test_pack_IWinInetInfoVtbl(void) +{ + /* IWinInetInfoVtbl */ +} + +static void test_pack_LPBINDHOST(void) +{ + /* LPBINDHOST */ + TEST_TYPE_SIZE (LPBINDHOST, 8) + TEST_TYPE_ALIGN (LPBINDHOST, 8) +} + +static void test_pack_LPBINDING(void) +{ + /* LPBINDING */ + TEST_TYPE_SIZE (LPBINDING, 8) + TEST_TYPE_ALIGN (LPBINDING, 8) +} + +static void test_pack_LPBINDSTATUSCALLBACK(void) +{ + /* LPBINDSTATUSCALLBACK */ + TEST_TYPE_SIZE (LPBINDSTATUSCALLBACK, 8) + TEST_TYPE_ALIGN (LPBINDSTATUSCALLBACK, 8) +} + +static void test_pack_LPIINTERNETPROTOCOLINFO(void) +{ + /* LPIINTERNETPROTOCOLINFO */ + TEST_TYPE_SIZE (LPIINTERNETPROTOCOLINFO, 8) + TEST_TYPE_ALIGN (LPIINTERNETPROTOCOLINFO, 8) +} + +static void test_pack_LPIINTERNETSESSION(void) +{ + /* LPIINTERNETSESSION */ + TEST_TYPE_SIZE (LPIINTERNETSESSION, 8) + TEST_TYPE_ALIGN (LPIINTERNETSESSION, 8) +} + +static void test_pack_LPPERSISTMONIKER(void) +{ + /* LPPERSISTMONIKER */ + TEST_TYPE_SIZE (LPPERSISTMONIKER, 8) + TEST_TYPE_ALIGN (LPPERSISTMONIKER, 8) +} + +static void test_pack_LPREMFORMATETC(void) +{ + /* LPREMFORMATETC */ + TEST_TYPE_SIZE (LPREMFORMATETC, 8) + TEST_TYPE_ALIGN (LPREMFORMATETC, 8) +} + +static void test_pack_LPREMSECURITY_ATTRIBUTES(void) +{ + /* LPREMSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (LPREMSECURITY_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (LPREMSECURITY_ATTRIBUTES, 8) +} + +static void test_pack_LPWININETHTTPINFO(void) +{ + /* LPWININETHTTPINFO */ + TEST_TYPE_SIZE (LPWININETHTTPINFO, 8) + TEST_TYPE_ALIGN (LPWININETHTTPINFO, 8) +} + +static void test_pack_LPWININETINFO(void) +{ + /* LPWININETINFO */ + TEST_TYPE_SIZE (LPWININETINFO, 8) + TEST_TYPE_ALIGN (LPWININETINFO, 8) +} + +static void test_pack_PREMSECURITY_ATTRIBUTES(void) +{ + /* PREMSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (PREMSECURITY_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (PREMSECURITY_ATTRIBUTES, 8) +} + +static void test_pack_REMSECURITY_ATTRIBUTES(void) +{ + /* REMSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (REMSECURITY_ATTRIBUTES, 12) + TEST_TYPE_ALIGN (REMSECURITY_ATTRIBUTES, 4) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, nLength, 0) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, bInheritHandle, 8) +} + +static void test_pack_RemBINDINFO(void) +{ + /* RemBINDINFO */ + TEST_TYPE_SIZE (RemBINDINFO, 96) + TEST_TYPE_ALIGN (RemBINDINFO, 8) + TEST_FIELD_SIZE (RemBINDINFO, cbSize, 4) + TEST_FIELD_ALIGN (RemBINDINFO, cbSize, 4) + TEST_FIELD_OFFSET(RemBINDINFO, cbSize, 0) + TEST_FIELD_SIZE (RemBINDINFO, szExtraInfo, 8) + TEST_FIELD_ALIGN (RemBINDINFO, szExtraInfo, 8) + TEST_FIELD_OFFSET(RemBINDINFO, szExtraInfo, 8) + TEST_FIELD_SIZE (RemBINDINFO, grfBindInfoF, 4) + TEST_FIELD_ALIGN (RemBINDINFO, grfBindInfoF, 4) + TEST_FIELD_OFFSET(RemBINDINFO, grfBindInfoF, 16) + TEST_FIELD_SIZE (RemBINDINFO, dwBindVerb, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwBindVerb, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwBindVerb, 20) + TEST_FIELD_SIZE (RemBINDINFO, szCustomVerb, 8) + TEST_FIELD_ALIGN (RemBINDINFO, szCustomVerb, 8) + TEST_FIELD_OFFSET(RemBINDINFO, szCustomVerb, 24) + TEST_FIELD_SIZE (RemBINDINFO, cbstgmedData, 4) + TEST_FIELD_ALIGN (RemBINDINFO, cbstgmedData, 4) + TEST_FIELD_OFFSET(RemBINDINFO, cbstgmedData, 32) + TEST_FIELD_SIZE (RemBINDINFO, dwOptions, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwOptions, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwOptions, 36) + TEST_FIELD_SIZE (RemBINDINFO, dwOptionsFlags, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwOptionsFlags, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwOptionsFlags, 40) + TEST_FIELD_SIZE (RemBINDINFO, dwCodePage, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwCodePage, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwCodePage, 44) + TEST_FIELD_SIZE (RemBINDINFO, securityAttributes, 12) + TEST_FIELD_ALIGN (RemBINDINFO, securityAttributes, 4) + TEST_FIELD_OFFSET(RemBINDINFO, securityAttributes, 48) + TEST_FIELD_SIZE (RemBINDINFO, iid, 16) + TEST_FIELD_ALIGN (RemBINDINFO, iid, 4) + TEST_FIELD_OFFSET(RemBINDINFO, iid, 60) + TEST_FIELD_SIZE (RemBINDINFO, pUnk, 8) + TEST_FIELD_ALIGN (RemBINDINFO, pUnk, 8) + TEST_FIELD_OFFSET(RemBINDINFO, pUnk, 80) + TEST_FIELD_SIZE (RemBINDINFO, dwReserved, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwReserved, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwReserved, 88) +} + +static void test_pack_RemFORMATETC(void) +{ + /* RemFORMATETC */ + TEST_TYPE_SIZE (RemFORMATETC, 20) + TEST_TYPE_ALIGN (RemFORMATETC, 4) + TEST_FIELD_SIZE (RemFORMATETC, cfFormat, 4) + TEST_FIELD_ALIGN (RemFORMATETC, cfFormat, 4) + TEST_FIELD_OFFSET(RemFORMATETC, cfFormat, 0) + TEST_FIELD_SIZE (RemFORMATETC, ptd, 4) + TEST_FIELD_ALIGN (RemFORMATETC, ptd, 4) + TEST_FIELD_OFFSET(RemFORMATETC, ptd, 4) + TEST_FIELD_SIZE (RemFORMATETC, dwAspect, 4) + TEST_FIELD_ALIGN (RemFORMATETC, dwAspect, 4) + TEST_FIELD_OFFSET(RemFORMATETC, dwAspect, 8) + TEST_FIELD_SIZE (RemFORMATETC, lindex, 4) + TEST_FIELD_ALIGN (RemFORMATETC, lindex, 4) + TEST_FIELD_OFFSET(RemFORMATETC, lindex, 12) + TEST_FIELD_SIZE (RemFORMATETC, tymed, 4) + TEST_FIELD_ALIGN (RemFORMATETC, tymed, 4) + TEST_FIELD_OFFSET(RemFORMATETC, tymed, 16) +} + +#else /* _WIN64 */ + +static void test_pack_BINDINFO(void) +{ + /* BINDINFO */ TEST_FIELD_SIZE (BINDINFO, cbSize, 4) TEST_FIELD_ALIGN (BINDINFO, cbSize, 4) TEST_FIELD_OFFSET(BINDINFO, cbSize, 0) @@ -108,7 +352,7 @@ static void test_pack_IBindHost(void) static void test_pack_IBindHostVtbl(void) { - /* IBindHostVtbl (pack 4) */ + /* IBindHostVtbl */ } static void test_pack_IBindStatusCallback(void) @@ -118,7 +362,7 @@ static void test_pack_IBindStatusCallback(void) static void test_pack_IBindStatusCallbackVtbl(void) { - /* IBindStatusCallbackVtbl (pack 4) */ + /* IBindStatusCallbackVtbl */ } static void test_pack_IBinding(void) @@ -128,7 +372,7 @@ static void test_pack_IBinding(void) static void test_pack_IBindingVtbl(void) { - /* IBindingVtbl (pack 4) */ + /* IBindingVtbl */ } static void test_pack_IInternetProtocolInfo(void) @@ -138,7 +382,7 @@ static void test_pack_IInternetProtocolInfo(void) static void test_pack_IInternetProtocolInfoVtbl(void) { - /* IInternetProtocolInfoVtbl (pack 4) */ + /* IInternetProtocolInfoVtbl */ } static void test_pack_IInternetSession(void) @@ -148,7 +392,7 @@ static void test_pack_IInternetSession(void) static void test_pack_IInternetSessionVtbl(void) { - /* IInternetSessionVtbl (pack 4) */ + /* IInternetSessionVtbl */ } static void test_pack_IPersistMoniker(void) @@ -158,7 +402,7 @@ static void test_pack_IPersistMoniker(void) static void test_pack_IPersistMonikerVtbl(void) { - /* IPersistMonikerVtbl (pack 4) */ + /* IPersistMonikerVtbl */ } static void test_pack_IWinInetHttpInfo(void) @@ -168,7 +412,7 @@ static void test_pack_IWinInetHttpInfo(void) static void test_pack_IWinInetHttpInfoVtbl(void) { - /* IWinInetHttpInfoVtbl (pack 4) */ + /* IWinInetHttpInfoVtbl */ } static void test_pack_IWinInetInfo(void) @@ -178,7 +422,7 @@ static void test_pack_IWinInetInfo(void) static void test_pack_IWinInetInfoVtbl(void) { - /* IWinInetInfoVtbl (pack 4) */ + /* IWinInetInfoVtbl */ } static void test_pack_LPBINDHOST(void) @@ -260,7 +504,7 @@ static void test_pack_PREMSECURITY_ATTRIBUTES(void) static void test_pack_REMSECURITY_ATTRIBUTES(void) { - /* REMSECURITY_ATTRIBUTES (pack 4) */ + /* REMSECURITY_ATTRIBUTES */ TEST_TYPE_SIZE (REMSECURITY_ATTRIBUTES, 12) TEST_TYPE_ALIGN (REMSECURITY_ATTRIBUTES, 4) TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, nLength, 4) @@ -276,7 +520,7 @@ static void test_pack_REMSECURITY_ATTRIBUTES(void) static void test_pack_RemBINDINFO(void) { - /* RemBINDINFO (pack 4) */ + /* RemBINDINFO */ TEST_TYPE_SIZE (RemBINDINFO, 72) TEST_TYPE_ALIGN (RemBINDINFO, 4) TEST_FIELD_SIZE (RemBINDINFO, cbSize, 4) @@ -322,7 +566,7 @@ static void test_pack_RemBINDINFO(void) static void test_pack_RemFORMATETC(void) { - /* RemFORMATETC (pack 4) */ + /* RemFORMATETC */ TEST_TYPE_SIZE (RemFORMATETC, 20) TEST_TYPE_ALIGN (RemFORMATETC, 4) TEST_FIELD_SIZE (RemFORMATETC, cfFormat, 4) @@ -342,6 +586,8 @@ static void test_pack_RemFORMATETC(void) TEST_FIELD_OFFSET(RemFORMATETC, tymed, 16) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_BINDINFO(); @@ -379,9 +625,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/urlmon/misc.c b/rostests/winetests/urlmon/misc.c index 2e77c1bc237..259c5a0399a 100644 --- a/rostests/winetests/urlmon/misc.c +++ b/rostests/winetests/urlmon/misc.c @@ -63,6 +63,8 @@ DEFINE_EXPECT(QI_IInternetProtocolInfo); DEFINE_EXPECT(CreateInstance); DEFINE_EXPECT(unk_Release); +static HRESULT (WINAPI *pCoInternetCompareUrl)(LPCWSTR, LPCWSTR, DWORD); + static void test_CreateFormatEnum(void) { IEnumFORMATETC *fenum = NULL, *fenum2 = NULL; @@ -363,13 +365,18 @@ static void test_CoInternetCompareUrl(void) { HRESULT hres; - hres = CoInternetCompareUrl(url1, url1, 0); + if (!pCoInternetCompareUrl) { + win_skip("CoInternetCompareUrl not found\n"); + return; + } + + hres = pCoInternetCompareUrl(url1, url1, 0); ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres); - hres = CoInternetCompareUrl(url1, url3, 0); + hres = pCoInternetCompareUrl(url1, url3, 0); ok(hres == S_FALSE, "CoInternetParseUrl failed: %08x\n", hres); - hres = CoInternetCompareUrl(url3, url1, 0); + hres = pCoInternetCompareUrl(url3, url1, 0); ok(hres == S_FALSE, "CoInternetParseUrl failed: %08x\n", hres); } @@ -1402,10 +1409,15 @@ static void test_IsValidURL(void) START_TEST(misc) { + HMODULE hurlmon; + OleInitialize(NULL); register_protocols(); + hurlmon = GetModuleHandle("urlmon.dll"); + pCoInternetCompareUrl = (void *) GetProcAddress(hurlmon, "CoInternetCompareUrl"); + test_CreateFormatEnum(); test_RegisterFormatEnumerator(); test_CoInternetParseUrl(); diff --git a/rostests/winetests/urlmon/sec_mgr.c b/rostests/winetests/urlmon/sec_mgr.c index e4416981dac..239da6c697c 100644 --- a/rostests/winetests/urlmon/sec_mgr.c +++ b/rostests/winetests/urlmon/sec_mgr.c @@ -1,6 +1,6 @@ /* * Copyright 2005-2006 Jacek Caban for CodeWeavers - * Copyright 2009 Detlef Riekenberg + * Copyright 2009-2010 Detlef Riekenberg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -35,21 +35,22 @@ #include "initguid.h" +static HRESULT (WINAPI *pCoInternetGetSecurityUrl)(LPCWSTR, LPWSTR*, PSUACTION, DWORD); + static const WCHAR url1[] = {'r','e','s',':','/','/','m','s','h','t','m','l','.','d','l','l', '/','b','l','a','n','k','.','h','t','m',0}; static const WCHAR url2[] = {'i','n','d','e','x','.','h','t','m',0}; static const WCHAR url3[] = {'f','i','l','e',':','/','/','c',':','\\','I','n','d','e','x','.','h','t','m',0}; static const WCHAR url4[] = {'f','i','l','e',':','s','o','m','e','%','2','0','f','i','l','e', '%','2','e','j','p','g',0}; -static const WCHAR url5[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q', - '.','o','r','g',0}; +static const WCHAR url5[] = {'h','t','t','p',':','/','/','w','w','w','.','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t',0}; static const WCHAR url6[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; -static const WCHAR url7[] = {'f','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g','/', - 'f','i','l','e','.','t','e','s','t',0}; +static const WCHAR url7[] = {'f','t','p',':','/','/','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t','/','f','i','l','e','.','t','e','s','t',0}; static const WCHAR url8[] = {'t','e','s','t',':','1','2','3','a','b','c',0}; -static const WCHAR url9[] = - {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g', - '/','s','i','t','e','/','a','b','o','u','t',0}; +static const WCHAR url9[] = {'h','t','t','p',':','/','/','w','w','w','.','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t', '/','s','i','t','e','/','a','b','o','u','t',0}; static const WCHAR url10[] = {'f','i','l','e',':','/','/','s','o','m','e','%','2','0','f','i','l','e', '.','j','p','g',0}; @@ -58,11 +59,11 @@ static const WCHAR url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l static const BYTE secid1[] = {'f','i','l','e',':',0,0,0,0}; -static const BYTE secid5[] = {'h','t','t','p',':','w','w','w','.','w','i','n','e','h','q', - '.','o','r','g',3,0,0,0}; +static const BYTE secid5[] = {'h','t','t','p',':','w','w','w','.','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t',3,0,0,0}; static const BYTE secid6[] = {'a','b','o','u','t',':','b','l','a','n','k',3,0,0,0}; -static const BYTE secid7[] = {'f','t','p',':','w','i','n','e','h','q','.','o','r','g', - 3,0,0,0}; +static const BYTE secid7[] = {'f','t','p',':','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t',3,0,0,0}; static const BYTE secid10[] = {'f','i','l','e',':','s','o','m','e','%','2','0','f','i','l','e','.','j','p','g',3,0,0,0}; static const BYTE secid10_2[] = @@ -632,7 +633,9 @@ static void test_InternetSecurityMarshalling(void) ok(hres == S_OK, "CreateStreamOnHGlobal returned: %08x\n", hres); hres = CoMarshalInterface(stream, &IID_IInternetSecurityManager, unk, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); - ok(hres == S_OK, "CoMarshalInterface returned: %08x\n", hres); + /* Not supported in W98 */ + ok(hres == S_OK || broken(hres == REGDB_E_IIDNOTREG), + "CoMarshalInterface returned: %08x\n", hres); IStream_Release(stream); IUnknown_Release(unk); @@ -641,8 +644,9 @@ static void test_InternetSecurityMarshalling(void) static void test_InternetGetSecurityUrl(void) { - const WCHAR url5_out[] = {'h','t','t','p',':','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; - const WCHAR url7_out[] = {'f','t','p',':','w','i','n','e','h','q','.','o','r','g',0}; + const WCHAR url5_out[] = {'h','t','t','p',':','w','w','w','.','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t',0}; + const WCHAR url7_out[] = {'f','t','p',':','z','o','n','e','3','.','w','i','n','e','t','e','s','t',0}; const WCHAR *in[] = {url2, url3, url4, url5, url7, url8, url9, url10}; const WCHAR *out_default[] = {url2, url3, url4, url5_out, url7_out, url8, url5_out, url10}; @@ -652,8 +656,13 @@ static void test_InternetGetSecurityUrl(void) DWORD i; HRESULT hres; + if (!pCoInternetGetSecurityUrl) { + win_skip("CoInternetGetSecurityUrl not found\n"); + return; + } + for(i=0; i #include -static void test_ScriptShape(HDC hdc) +static void test_ScriptItemize( void ) { static const WCHAR test1[] = {'t', 'e', 's', 't',0}; - BOOL ret; + static const WCHAR test2[] = {'1','2','3','-','5','2',0x064a,0x064f,0x0633,0x0627,0x0648,0x0650,0x064a,'7','1','.',0}; + static const WCHAR test3[] = +{0x0e04,0x0e27,0x0e32,0x0e21,0x0e1e,0x0e22,0x0e32,0x0e22,0x0e32, 0x0e21 +,0x0e2d,0x0e22,0x0e39,0x0e48,0x0e17,0x0e35,0x0e48,0x0e44,0x0e2b,0x0e19 +,0x0e04,0x0e27,0x0e32,0x0e21,0x0e2a, 0x0e33,0x0e40,0x0e23,0x0e47,0x0e08, + 0x0e2d,0x0e22,0x0e39,0x0e48,0x0e17,0x0e35,0x0e48,0x0e19,0x0e31,0x0e48,0x0e19,0}; + static const WCHAR test4[] = {'1','2','3','-','5','2',' ','i','s',' ','7','1','.',0}; + static const WCHAR test5[] = +{0x0627,0x0644,0x0635,0x0651,0x0650,0x062d,0x0629,0x064f,' ',0x062a,0x064e, +0x0627,0x062c,0x064c,' ',0x0639,0x064e,0x0644,0x0649,' ', +0x0631,0x064f,0x0624,0x0648,0x0633,0x0650,' ',0x0627,0x0644 +,0x0623,0x0635,0x0650,0x062d,0x0651,0x064e,0x0627,0x0621,0x0650,0}; + SCRIPT_ITEM items[10]; + SCRIPT_CONTROL Control; + SCRIPT_STATE State; + HRESULT hr; + int nItems; + + memset(&Control, 0, sizeof(Control)); + memset(&State, 0, sizeof(State)); + + hr = ScriptItemize(NULL, 4, 10, &Control, &State, items, NULL); + ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pwcInChars is NULL\n"); + + hr = ScriptItemize(test1, 4, 10, &Control, &State, NULL, NULL); + ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pItems is NULL\n"); + + hr = ScriptItemize(test1, 4, 1, &Control, &State, items, NULL); + ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cMaxItems < 2."); + + hr = ScriptItemize(test1, 0, 10, NULL, NULL, items, &nItems); + ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cInChars is 0\n"); + + hr = ScriptItemize(test1, 4, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test1, 4, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test1, 4, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + + hr = ScriptItemize(test2, 16, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 6, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 3, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 4, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 6, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + ok(items[4].iCharPos == 13, "Wrong CharPos \n"); + ok(items[4].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[5].iCharPos == 15, "Wrong CharPos \n"); + ok(items[5].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[5].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[5].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test2, 16, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 4, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 6, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 13, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + todo_wine ok(items[2].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 15, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test2, 16, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 4, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + todo_wine ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 6, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 13, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + todo_wine ok(items[2].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 15, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + + hr = ScriptItemize(test3, 41, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test3, 41, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test3, 41, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + + hr = ScriptItemize(test4, 12, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 5, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 3, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 4, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 7, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[4].iCharPos == 10, "Wrong CharPos \n"); + ok(items[4].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test4, 12, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 5, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 3, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 4, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 7, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[4].iCharPos == 10, "Wrong CharPos \n"); + ok(items[4].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test4, 12, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + todo_wine ok(nItems == 4, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + todo_wine ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 6, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 7, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + todo_wine ok(items[3].iCharPos == 10, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + todo_wine ok(items[3].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + + hr = ScriptItemize(test5, 38, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test5, 38, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test5, 38, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); +} + + +static void test_ScriptShape(HDC hdc) +{ + static const WCHAR test1[] = {'w', 'i', 'n', 'e',0}; + static const WCHAR test2[] = {0x202B, 'i', 'n', 0x202C,0}; HRESULT hr; SCRIPT_CACHE sc = NULL; - WORD glyphs[4], logclust[4]; + WORD glyphs[4], glyphs2[4], logclust[4]; SCRIPT_VISATTR attrs[4]; SCRIPT_ITEM items[2]; - int nb, widths[4]; - GOFFSET offset[4]; - ABC abc[4]; - - hr = ScriptItemize(NULL, 4, 2, NULL, NULL, items, NULL); - ok(hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG not %08x\n", hr); - - hr = ScriptItemize(test1, 4, 2, NULL, NULL, NULL, NULL); - ok(hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG not %08x\n", hr); + int nb; hr = ScriptItemize(test1, 4, 2, NULL, NULL, items, NULL); ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); @@ -73,8 +322,122 @@ static void test_ScriptShape(HDC hdc) ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); + + memset(glyphs,-1,sizeof(glyphs)); + memset(logclust,-1,sizeof(logclust)); + memset(attrs,-1,sizeof(attrs)); hr = ScriptShape(NULL, &sc, test1, 4, 4, &items[0].a, glyphs, logclust, attrs, &nb); ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); + ok(nb == 4, "Wrong number of items\n"); + ok(logclust[0] == 0, "clusters out of order\n"); + ok(logclust[1] == 1, "clusters out of order\n"); + ok(logclust[2] == 2, "clusters out of order\n"); + ok(logclust[3] == 3, "clusters out of order\n"); + ok(attrs[0].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[1].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[2].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[3].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[0].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[1].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[2].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[3].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[0].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[1].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[2].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[3].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[0].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[1].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[2].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[3].fZeroWidth == 0, "fZeroWidth incorrect\n"); + + ScriptFreeCache(&sc); + sc = NULL; + + memset(glyphs2,-1,sizeof(glyphs2)); + memset(logclust,-1,sizeof(logclust)); + memset(attrs,-1,sizeof(attrs)); + hr = ScriptShape(hdc, &sc, test2, 4, 4, &items[0].a, glyphs2, logclust, attrs, &nb); + ok(hr == S_OK, "ScriptShape should return S_OK not %08x\n", hr); + ok(nb == 4, "Wrong number of items\n"); + ok(glyphs2[0] == 0, "Incorrect glyph for 0x202B\n"); + ok(glyphs2[3] == 0, "Incorrect glyph for 0x202C\n"); + ok(logclust[0] == 0, "clusters out of order\n"); + ok(logclust[1] == 1, "clusters out of order\n"); + ok(logclust[2] == 2, "clusters out of order\n"); + ok(logclust[3] == 3, "clusters out of order\n"); + ok(attrs[0].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[1].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[2].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[3].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[0].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[1].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[2].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[3].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[0].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[1].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[2].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[3].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[0].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[1].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[2].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[3].fZeroWidth == 0, "fZeroWidth incorrect\n"); + + /* modify LTR to RTL */ + items[0].a.fRTL = 1; + memset(glyphs2,-1,sizeof(glyphs2)); + memset(logclust,-1,sizeof(logclust)); + memset(attrs,-1,sizeof(attrs)); + hr = ScriptShape(hdc, &sc, test1, 4, 4, &items[0].a, glyphs2, logclust, attrs, &nb); + ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); + ok(nb == 4, "Wrong number of items\n"); + ok(glyphs2[0] == glyphs[3], "Glyphs not reordered properly\n"); + ok(glyphs2[1] == glyphs[2], "Glyphs not reordered properly\n"); + ok(glyphs2[2] == glyphs[1], "Glyphs not reordered properly\n"); + ok(glyphs2[3] == glyphs[0], "Glyphs not reordered properly\n"); + ok(logclust[0] == 3, "clusters out of order\n"); + ok(logclust[1] == 2, "clusters out of order\n"); + ok(logclust[2] == 1, "clusters out of order\n"); + ok(logclust[3] == 0, "clusters out of order\n"); + ok(attrs[0].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[1].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[2].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[3].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[0].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[1].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[2].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[3].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[0].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[1].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[2].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[3].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[0].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[1].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[2].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[3].fZeroWidth == 0, "fZeroWidth incorrect\n"); + + ScriptFreeCache(&sc); +} + +static void test_ScriptPlace(HDC hdc) +{ + static const WCHAR test1[] = {'t', 'e', 's', 't',0}; + BOOL ret; + HRESULT hr; + SCRIPT_CACHE sc = NULL; + WORD glyphs[4], logclust[4]; + SCRIPT_VISATTR attrs[4]; + SCRIPT_ITEM items[2]; + int nb, widths[4]; + GOFFSET offset[4]; + ABC abc[4]; + + hr = ScriptItemize(test1, 4, 2, NULL, NULL, items, NULL); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); + + hr = ScriptShape(hdc, &sc, test1, 4, 4, &items[0].a, glyphs, logclust, attrs, &nb); + ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); + ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); hr = ScriptPlace(hdc, &sc, glyphs, 4, NULL, &items[0].a, widths, NULL, NULL); ok(hr == E_INVALIDARG, "ScriptPlace should return E_INVALIDARG not %08x\n", hr); @@ -143,28 +506,6 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256 ok( ppSp[5]->langid == 9, "Langid[5] not = to 9\n"); /* Check a known value to ensure */ /* ptrs work */ - - /* This set of tests are to check that the various edits in ScriptIemize work */ - cInChars = 5; /* Length of test without NULL */ - cMaxItems = 1; /* Check threshold value */ - hr = ScriptItemize(TestItem1, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems); - ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cMaxItems < 2. Was %d\n", - cMaxItems); - cInChars = 5; - cMaxItems = 255; - hr = ScriptItemize(NULL, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems); - ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pwcInChars is NULL\n"); - - cInChars = 5; - cMaxItems = 255; - hr = ScriptItemize(TestItem1, 0, cMaxItems, NULL, NULL, pItem, &pcItems); - ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cInChars is 0\n"); - - cInChars = 5; - cMaxItems = 255; - hr = ScriptItemize(TestItem1, cInChars, cMaxItems, NULL, NULL, NULL, &pcItems); - ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pItems is NULL\n"); - /* This is a valid test that will cause parsing to take place */ cInChars = 5; cMaxItems = 255; @@ -636,6 +977,78 @@ static void test_ScriptTextOut2(HDC hdc) } } +static void test_ScriptTextOut3(HDC hdc) +{ + HRESULT hr; + + int cInChars; + int cMaxItems; + SCRIPT_ITEM pItem[255]; + int pcItems; + WCHAR TestItem1[] = {' ','\r', 0}; + + SCRIPT_CACHE psc; + int cChars; + int cMaxGlyphs; + unsigned short pwOutGlyphs1[256]; + WORD pwLogClust[256]; + SCRIPT_VISATTR psva[256]; + int pcGlyphs; + int piAdvance[256]; + GOFFSET pGoffset[256]; + ABC pABC[256]; + RECT rect; + + /* This is to ensure that non exisiting glyphs are translated into a valid glyph number */ + cInChars = 2; + cMaxItems = 255; + hr = ScriptItemize(TestItem1, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems); + ok (hr == 0, "ScriptItemize should return 0, returned %08x\n", hr); + /* This test is for the interim operation of ScriptItemize where only one SCRIPT_ITEM is * + * returned. */ + ok (pcItems > 0, "The number of SCRIPT_ITEMS should be greater than 0\n"); + if (pcItems > 0) + ok (pItem[0].iCharPos == 0 && pItem[2].iCharPos == cInChars, + "Start pos not = 0 (%d) or end pos not = %d (%d)\n", + pItem[0].iCharPos, cInChars, pItem[2].iCharPos); + + /* It would appear that we have a valid SCRIPT_ANALYSIS and can continue + * ie. ScriptItemize has succeeded and that pItem has been set */ + cInChars = 2; + cMaxItems = 255; + if (hr == 0) { + psc = NULL; /* must be null on first call */ + cChars = cInChars; + cMaxGlyphs = cInChars; + cMaxGlyphs = 256; + hr = ScriptShape(hdc, &psc, TestItem1, cChars, + cMaxGlyphs, &pItem[0].a, + pwOutGlyphs1, pwLogClust, psva, &pcGlyphs); + ok (hr == 0, "ScriptShape should return 0 not (%08x)\n", hr); + ok (psc != NULL, "psc should not be null and have SCRIPT_CACHE buffer address\n"); + ok (pcGlyphs == cChars, "Chars in (%d) should equal Glyphs out (%d)\n", cChars, pcGlyphs); + if (hr ==0) { + /* Note hdc is needed as glyph info is not yet in psc */ + hr = ScriptPlace(hdc, &psc, pwOutGlyphs1, pcGlyphs, psva, &pItem[0].a, piAdvance, + pGoffset, pABC); + ok (hr == 0, "Should return 0 not (%08x)\n", hr); + + /* Test Rect Rgn is acceptable */ + rect.top = 10; + rect.bottom = 20; + rect.left = 10; + rect.right = 40; + hr = ScriptTextOut(hdc, &psc, 0, 0, 0, &rect, &pItem[0].a, NULL, 0, pwOutGlyphs1, pcGlyphs, + piAdvance, NULL, pGoffset); + ok (hr == 0, "ScriptTextOut should return 0 not (%08x)\n", hr); + + } + /* Clean up and go */ + ScriptFreeCache(&psc); + ok( psc == NULL, "Expected psc to be NULL, got %p\n", psc); + } +} + static void test_ScriptXtoX(void) /**************************************************************************************** * This routine tests the ScriptXtoCP and ScriptCPtoX functions using static variables * @@ -1078,20 +1491,55 @@ static void test_ScriptGetGlyphABCWidth(HDC hdc) static void test_ScriptLayout(void) { HRESULT hr; - static const BYTE levels[][5] = + static const BYTE levels[][10] = { - { 0, 0, 0, 0, 0 }, - { 1, 1, 1, 1, 1 }, - { 2, 2, 2, 2, 2 }, - { 3, 3, 3, 3, 3 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, + { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, + + { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}, + { 1, 1, 1, 2, 2, 2, 1, 1, 1, 1 }, + { 2, 2, 2, 1, 1, 1, 2, 2, 2, 2 }, + { 0, 0, 1, 1, 2, 2, 1, 1, 0, 0 }, + { 1, 1, 2, 2, 3, 3, 2, 2, 1, 1 }, + + { 0, 0, 1, 1, 2, 2, 1, 1, 0, 1 }, + { 1, 0, 1, 2, 2, 1, 2, 1, 0, 1 }, }; - static const int expect[][5] = + static const int expect_l2v[][10] = { - { 0, 1, 2, 3, 4 }, - { 4, 3, 2, 1, 0 }, - { 0, 1, 2, 3, 4 }, - { 4, 3, 2, 1, 0 } + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + + { 0, 1, 2, 3, 4, 9, 8 ,7 ,6, 5}, +/**/ { 9, 8, 7, 4, 5, 6, 3 ,2 ,1, 0}, +/**/ { 7, 8, 9, 6, 5, 4, 0 ,1 ,2, 3}, + { 0, 1, 7, 6, 4, 5, 3 ,2 ,8, 9}, + { 9, 8, 2, 3, 5, 4, 6 ,7 ,1, 0}, + + { 0, 1, 7, 6, 4, 5, 3 ,2 ,8, 9}, +/**/ { 0, 1, 7, 5, 6, 4, 3 ,2 ,8, 9}, }; + static const int expect_v2l[][10] = + { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + + { 0, 1, 2, 3, 4, 9, 8 ,7 ,6, 5}, + { 9, 8, 7, 6, 3, 4, 5 ,2 ,1, 0}, + { 6, 7, 8, 9, 5, 4, 3 ,0 ,1, 2}, + { 0, 1, 7, 6, 4, 5, 3 ,2 ,8, 9}, + { 9, 8, 2, 3, 5, 4, 6 ,7 ,1, 0}, + + { 0, 1, 7, 6, 4, 5, 3 ,2 ,8, 9}, + { 0, 1, 7, 6, 5, 3, 4 ,2 ,8, 9}, + }; + int i, j, vistolog[sizeof(levels[0])], logtovis[sizeof(levels[0])]; hr = ScriptLayout(sizeof(levels[0]), NULL, vistolog, logtovis); @@ -1107,14 +1555,14 @@ static void test_ScriptLayout(void) for (j = 0; j < sizeof(levels[i]); j++) { - ok(expect[i][j] == vistolog[j], + ok(expect_v2l[i][j] == vistolog[j], "failure: levels[%d][%d] = %d, vistolog[%d] = %d\n", i, j, levels[i][j], j, vistolog[j] ); } for (j = 0; j < sizeof(levels[i]); j++) { - ok(expect[i][j] == logtovis[j], + ok(expect_l2v[i][j] == logtovis[j], "failure: levels[%d][%d] = %d, logtovis[%d] = %d\n", i, j, levels[i][j], j, logtovis[j] ); } @@ -1325,15 +1773,18 @@ START_TEST(usp10) hfont = SelectObject(hdc, CreateFontIndirectA(&lf)); + test_ScriptItemize(); test_ScriptItemIzeShapePlace(hdc,pwOutGlyphs); test_ScriptGetCMap(hdc, pwOutGlyphs); test_ScriptCacheGetHeight(hdc); test_ScriptGetGlyphABCWidth(hdc); test_ScriptShape(hdc); + test_ScriptPlace(hdc); test_ScriptGetFontProperties(hdc); test_ScriptTextOut(hdc); test_ScriptTextOut2(hdc); + test_ScriptTextOut3(hdc); test_ScriptXtoX(); test_ScriptString(hdc); test_ScriptStringXtoCP_CPtoX(hdc); diff --git a/rostests/winetests/wininet/ftp.c b/rostests/winetests/wininet/ftp.c index b4de4e184b6..df9c34753d6 100644 --- a/rostests/winetests/wininet/ftp.c +++ b/rostests/winetests/wininet/ftp.c @@ -42,6 +42,7 @@ static BOOL (WINAPI *pFtpCommandA)(HINTERNET,BOOL,DWORD,LPCSTR,DWORD_PTR,HINTERNET*); +static INTERNET_STATUS_CALLBACK (WINAPI *pInternetSetStatusCallbackA)(HINTERNET,INTERNET_STATUS_CALLBACK); static void test_getfile_no_open(void) @@ -360,6 +361,20 @@ static void test_getfile(HINTERNET hFtp, HINTERNET hConnect) "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError()); } +static void trace_extended_error(DWORD error) +{ + DWORD code, buflen = 0; + + if (error != ERROR_INTERNET_EXTENDED_ERROR) return; + if (!InternetGetLastResponseInfoA(&code, NULL, &buflen) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + char *text = HeapAlloc(GetProcessHeap(), 0, ++buflen); + InternetGetLastResponseInfoA(&code, text, &buflen); + trace("%u %s\n", code, text); + HeapFree(GetProcessHeap(), 0, text); + } +} + static void test_openfile(HINTERNET hFtp, HINTERNET hConnect) { HINTERNET hOpenFile; @@ -414,34 +429,41 @@ static void test_openfile(HINTERNET hFtp, HINTERNET hConnect) if (hOpenFile) { BOOL bRet; + DWORD error; HINTERNET hOpenFile2; HANDLE hFile; /* We have a handle so all ftp calls should fail (TODO: Put all ftp-calls in here) */ SetLastError(0xdeadbeef); bRet = FtpCreateDirectoryA(hFtp, "new_directory_deadbeef"); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); + trace_extended_error(error); SetLastError(0xdeadbeef); bRet = FtpDeleteFileA(hFtp, "non_existent_file_deadbeef"); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); + trace_extended_error(error); SetLastError(0xdeadbeef); bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0); - ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + error = GetLastError(); + ok ( bRet == FALSE || broken(bRet == TRUE), "Expected FtpGetFileA to fail\n"); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_SUCCESS), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); DeleteFileA("should_be_non_existing_deadbeef"); /* Just in case */ SetLastError(0xdeadbeef); hOpenFile2 = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); - ok ( bRet == FALSE, "Expected FtpOpenFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + error = GetLastError(); + ok ( bRet == FALSE || broken(bRet == TRUE), "Expected FtpOpenFileA to fail\n"); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_SUCCESS), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); InternetCloseHandle(hOpenFile2); /* Just in case */ /* Create a temporary local file */ @@ -451,22 +473,25 @@ static void test_openfile(HINTERNET hFtp, HINTERNET hConnect) CloseHandle(hFile); SetLastError(0xdeadbeef); bRet = FtpPutFileA(hFtp, "now_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); DeleteFileA("now_existing_local"); SetLastError(0xdeadbeef); bRet = FtpRemoveDirectoryA(hFtp, "should_be_non_existing_deadbeef_dir"); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); SetLastError(0xdeadbeef); bRet = FtpRenameFileA(hFtp , "should_be_non_existing_deadbeef", "new"); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); } InternetCloseHandle(hOpenFile); @@ -728,6 +753,7 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect) HINTERNET hSearch; HINTERNET hSearch2; HINTERNET hOpenFile; + DWORD error; /* NULL as the search file ought to return the first file in the directory */ SetLastError(0xdeadbeef); @@ -773,10 +799,17 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect) /* This should fail as the OpenFile handle wasn't closed */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, "welcome.msg", &findData, 0, 0); - ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError() ); - InternetCloseHandle(hSearch); /* Just in case */ + error = GetLastError(); + ok ( hSearch == NULL || broken(hSearch != NULL), /* win2k */ + "Expected FtpFindFirstFileA to fail\n" ); + if (!hSearch) + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error ); + else + { + ok( error == ERROR_SUCCESS, "wrong error %u on success\n", GetLastError() ); + InternetCloseHandle(hSearch); + } InternetCloseHandle(hOpenFile); @@ -889,6 +922,51 @@ static void test_get_current_dir(HINTERNET hFtp, HINTERNET hConnect) ok ( GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got: %d\n", GetLastError()); } +static void WINAPI status_callback(HINTERNET handle, DWORD_PTR ctx, DWORD status, LPVOID info, DWORD info_len) +{ + switch (status) + { + case INTERNET_STATUS_RESOLVING_NAME: + case INTERNET_STATUS_NAME_RESOLVED: + case INTERNET_STATUS_CONNECTING_TO_SERVER: + case INTERNET_STATUS_CONNECTED_TO_SERVER: + trace("%p %lx %u %s %u\n", handle, ctx, status, (char *)info, info_len); + break; + default: + break; + } +} + +static void test_status_callbacks(HINTERNET hInternet) +{ + INTERNET_STATUS_CALLBACK cb; + HINTERNET hFtp; + BOOL ret; + + if (!pInternetSetStatusCallbackA) + { + win_skip("InternetSetStatusCallbackA() is not available, skipping test\n"); + return; + } + + cb = pInternetSetStatusCallbackA(hInternet, status_callback); + ok(cb == NULL, "expected NULL got %p\n", cb); + + hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, "anonymous", NULL, + INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 1); + if (!hFtp) + { + skip("No ftp connection could be made to ftp.winehq.org %u\n", GetLastError()); + return; + } + + ret = InternetCloseHandle(hFtp); + ok(ret, "InternetCloseHandle failed %u\n", GetLastError()); + + cb = pInternetSetStatusCallbackA(hInternet, NULL); + ok(cb == status_callback, "expected check_status got %p\n", cb); +} + START_TEST(ftp) { HMODULE hWininet; @@ -896,6 +974,7 @@ START_TEST(ftp) hWininet = GetModuleHandleA("wininet.dll"); pFtpCommandA = (void*)GetProcAddress(hWininet, "FtpCommandA"); + pInternetSetStatusCallbackA = (void*)GetProcAddress(hWininet, "InternetSetStatusCallbackA"); SetLastError(0xdeadbeef); hInternet = InternetOpen("winetest", 0, NULL, NULL, 0); @@ -937,6 +1016,7 @@ START_TEST(ftp) test_command(hFtp, hHttp); test_find_first_file(hFtp, hHttp); test_get_current_dir(hFtp, hHttp); + test_status_callbacks(hInternet); InternetCloseHandle(hHttp); InternetCloseHandle(hFtp); diff --git a/rostests/winetests/wininet/generated.c b/rostests/winetests/wininet/generated.c index ceb21deb869..1282b6fda5e 100644 --- a/rostests/winetests/wininet/generated.c +++ b/rostests/winetests/wininet/generated.c @@ -55,45 +55,1272 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 16) + TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 8) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 8) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 0) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 8) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 8) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 8) +} + +static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 16) + TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 8) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 8) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 0) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 8) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 8) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 8) +} + +static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ADMIN_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 16) + TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 8) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 8) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 0) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 8) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 8) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 8) +} + +static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ADMIN_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 16) + TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 8) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 8) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 0) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 8) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 8) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 8) +} + +static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ASK_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, 16) + TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 8) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 8) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 0) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 8) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 8) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 8) +} + +static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ASK_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, 16) + TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 8) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 8) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 0) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 8) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 8) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 8) +} + +static void test_pack_GOPHER_ATTRIBUTE_ENUMERATORA(void) +{ + /* GOPHER_ATTRIBUTE_ENUMERATORA */ + TEST_TYPE_SIZE (GOPHER_ATTRIBUTE_ENUMERATORA, 8) + TEST_TYPE_ALIGN (GOPHER_ATTRIBUTE_ENUMERATORA, 8) +} + +static void test_pack_GOPHER_ATTRIBUTE_ENUMERATORW(void) +{ + /* GOPHER_ATTRIBUTE_ENUMERATORW */ + TEST_TYPE_SIZE (GOPHER_ATTRIBUTE_ENUMERATORW, 8) + TEST_TYPE_ALIGN (GOPHER_ATTRIBUTE_ENUMERATORW, 8) +} + +static void test_pack_GOPHER_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ATTRIBUTE_TYPEA */ + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEA, CategoryId, 0) + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) +} + +static void test_pack_GOPHER_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ATTRIBUTE_TYPEW */ + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEW, CategoryId, 0) + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) +} + +static void test_pack_GOPHER_FIND_DATAA(void) +{ + /* GOPHER_FIND_DATAA */ + TEST_TYPE_SIZE (GOPHER_FIND_DATAA, 808) + TEST_TYPE_ALIGN (GOPHER_FIND_DATAA, 4) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, DisplayString, 129) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, DisplayString, 1) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, DisplayString, 0) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, GopherType, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, GopherType, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, GopherType, 132) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, SizeLow, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, SizeLow, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, SizeLow, 136) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, SizeHigh, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, SizeHigh, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, SizeHigh, 140) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, LastModificationTime, 8) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, LastModificationTime, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, LastModificationTime, 144) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, Locator, 654) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, Locator, 1) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, Locator, 152) +} + +static void test_pack_GOPHER_FIND_DATAW(void) +{ + /* GOPHER_FIND_DATAW */ + TEST_TYPE_SIZE (GOPHER_FIND_DATAW, 1588) + TEST_TYPE_ALIGN (GOPHER_FIND_DATAW, 4) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, DisplayString, 258) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, DisplayString, 2) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, DisplayString, 0) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, GopherType, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, GopherType, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, GopherType, 260) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, SizeLow, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, SizeLow, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, SizeLow, 264) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, SizeHigh, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, SizeHigh, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, SizeHigh, 268) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, LastModificationTime, 8) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, LastModificationTime, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, LastModificationTime, 272) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, Locator, 1308) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, Locator, 2) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, Locator, 280) +} + +static void test_pack_GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24) + TEST_TYPE_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 0) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 8) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 12) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 16) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 20) +} + +static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_LOCATION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 8) + TEST_FIELD_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 8) + TEST_FIELD_OFFSET(GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 0) +} + +static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_LOCATION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 8) + TEST_FIELD_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 8) + TEST_FIELD_OFFSET(GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 0) +} + +static void test_pack_GOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_MOD_DATE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 8) + TEST_FIELD_ALIGN (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 4) + TEST_FIELD_OFFSET(GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 0) +} + +static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 8) + TEST_FIELD_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 8) + TEST_FIELD_OFFSET(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 0) +} + +static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 8) + TEST_FIELD_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 8) + TEST_FIELD_OFFSET(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 0) +} + +static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_PROVIDER_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 8) + TEST_FIELD_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 8) + TEST_FIELD_OFFSET(GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 0) +} + +static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_PROVIDER_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 8) + TEST_FIELD_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 8) + TEST_FIELD_OFFSET(GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 0) +} + +static void test_pack_GOPHER_SCORE_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_SCORE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 0) +} + +static void test_pack_GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 0) + TEST_FIELD_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) +} + +static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_SITE_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 8) + TEST_FIELD_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 8) + TEST_FIELD_OFFSET(GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 0) +} + +static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_SITE_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 8) + TEST_FIELD_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 8) + TEST_FIELD_OFFSET(GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 0) +} + +static void test_pack_GOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_TIMEZONE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 4) + TEST_FIELD_ALIGN (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 4) + TEST_FIELD_OFFSET(GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 0) +} + +static void test_pack_GOPHER_TTL_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_TTL_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 4) + TEST_FIELD_ALIGN (GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 4) + TEST_FIELD_OFFSET(GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 0) +} + +static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 8) + TEST_FIELD_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 8) + TEST_FIELD_OFFSET(GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 0) +} + +static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 8) + TEST_FIELD_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 8) + TEST_FIELD_OFFSET(GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 0) +} + +static void test_pack_GOPHER_VERONICA_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_VERONICA_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 4) + TEST_FIELD_ALIGN (GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 4) + TEST_FIELD_OFFSET(GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 0) +} + +static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_VERSION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 8) + TEST_FIELD_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 8) + TEST_FIELD_OFFSET(GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 0) +} + +static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_VERSION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 8) + TEST_FIELD_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 8) + TEST_FIELD_OFFSET(GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 0) +} + +static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_VIEW_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, 24) + TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 8) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 8) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 0) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 8) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 8) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 8) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 16) +} + +static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_VIEW_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, 24) + TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 8) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 8) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 0) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 8) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 8) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 8) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 16) +} + +static void test_pack_GROUPID(void) +{ + /* GROUPID */ + TEST_TYPE_SIZE (GROUPID, 8) + TEST_TYPE_ALIGN (GROUPID, 8) + TEST_TYPE_SIGNED(GROUPID) +} + +static void test_pack_HINTERNET(void) +{ + /* HINTERNET */ + TEST_TYPE_SIZE (HINTERNET, 8) + TEST_TYPE_ALIGN (HINTERNET, 8) +} + +static void test_pack_HTTP_VERSION_INFO(void) +{ + /* HTTP_VERSION_INFO */ + TEST_TYPE_SIZE (HTTP_VERSION_INFO, 8) + TEST_TYPE_ALIGN (HTTP_VERSION_INFO, 4) + TEST_FIELD_SIZE (HTTP_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (HTTP_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(HTTP_VERSION_INFO, dwMajorVersion, 0) + TEST_FIELD_SIZE (HTTP_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (HTTP_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(HTTP_VERSION_INFO, dwMinorVersion, 4) +} + +static void test_pack_INTERNET_ASYNC_RESULT(void) +{ + /* INTERNET_ASYNC_RESULT */ + TEST_TYPE_SIZE (INTERNET_ASYNC_RESULT, 16) + TEST_TYPE_ALIGN (INTERNET_ASYNC_RESULT, 8) + TEST_FIELD_SIZE (INTERNET_ASYNC_RESULT, dwResult, 8) + TEST_FIELD_ALIGN (INTERNET_ASYNC_RESULT, dwResult, 8) + TEST_FIELD_OFFSET(INTERNET_ASYNC_RESULT, dwResult, 0) + TEST_FIELD_SIZE (INTERNET_ASYNC_RESULT, dwError, 4) + TEST_FIELD_ALIGN (INTERNET_ASYNC_RESULT, dwError, 4) + TEST_FIELD_OFFSET(INTERNET_ASYNC_RESULT, dwError, 8) +} + +static void test_pack_INTERNET_AUTH_NOTIFY_DATA(void) +{ + /* INTERNET_AUTH_NOTIFY_DATA */ + TEST_TYPE_SIZE (INTERNET_AUTH_NOTIFY_DATA, 24) + TEST_TYPE_ALIGN (INTERNET_AUTH_NOTIFY_DATA, 8) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, cbStruct, 4) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, cbStruct, 4) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, cbStruct, 0) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 8) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 8) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 8) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, dwContext, 8) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, dwContext, 8) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, dwContext, 16) +} + +static void test_pack_INTERNET_BUFFERSA(void) +{ + /* INTERNET_BUFFERSA */ + TEST_TYPE_SIZE (INTERNET_BUFFERSA, 56) + TEST_TYPE_ALIGN (INTERNET_BUFFERSA, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, Next, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, Next, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, Next, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, lpcszHeader, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, lpcszHeader, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, lpcszHeader, 16) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwHeadersLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwHeadersLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwHeadersLength, 24) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwHeadersTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwHeadersTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwHeadersTotal, 28) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, lpvBuffer, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, lpvBuffer, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, lpvBuffer, 32) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwBufferLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwBufferLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwBufferLength, 40) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwBufferTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwBufferTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwBufferTotal, 44) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwOffsetLow, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwOffsetLow, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwOffsetLow, 48) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwOffsetHigh, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwOffsetHigh, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwOffsetHigh, 52) +} + +static void test_pack_INTERNET_BUFFERSW(void) +{ + /* INTERNET_BUFFERSW */ + TEST_TYPE_SIZE (INTERNET_BUFFERSW, 56) + TEST_TYPE_ALIGN (INTERNET_BUFFERSW, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, Next, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, Next, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, Next, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, lpcszHeader, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, lpcszHeader, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, lpcszHeader, 16) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwHeadersLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwHeadersLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwHeadersLength, 24) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwHeadersTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwHeadersTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwHeadersTotal, 28) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, lpvBuffer, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, lpvBuffer, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, lpvBuffer, 32) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwBufferLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwBufferLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwBufferLength, 40) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwBufferTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwBufferTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwBufferTotal, 44) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwOffsetLow, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwOffsetLow, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwOffsetLow, 48) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwOffsetHigh, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwOffsetHigh, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwOffsetHigh, 52) +} + +static void test_pack_INTERNET_CACHE_ENTRY_INFOA(void) +{ + /* INTERNET_CACHE_ENTRY_INFOA */ + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 8) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 16) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 24) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 28) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 32) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 36) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 40) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 44) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 52) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 60) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 68) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 80) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 88) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 96) +} + +static void test_pack_INTERNET_CACHE_ENTRY_INFOW(void) +{ + /* INTERNET_CACHE_ENTRY_INFOW */ + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 8) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 16) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 24) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 28) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 32) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 36) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 40) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 44) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 52) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 60) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 68) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 80) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 88) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 96) +} + +static void test_pack_INTERNET_CERTIFICATE_INFOA(void) +{ + /* INTERNET_CERTIFICATE_INFOA */ + TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOA, 64) + TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOA, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, ftExpiry, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, ftExpiry, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, ftExpiry, 0) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, ftStart, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, ftStart, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, ftStart, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 16) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 24) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 32) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 40) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 48) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, dwKeySize, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, dwKeySize, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, dwKeySize, 56) +} + +static void test_pack_INTERNET_CERTIFICATE_INFOW(void) +{ + /* INTERNET_CERTIFICATE_INFOW */ + TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOW, 64) + TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOW, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, ftExpiry, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, ftExpiry, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, ftExpiry, 0) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, ftStart, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, ftStart, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, ftStart, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 16) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 24) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 32) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 40) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 48) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, dwKeySize, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, dwKeySize, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, dwKeySize, 56) +} + +static void test_pack_INTERNET_CONNECTED_INFO(void) +{ + /* INTERNET_CONNECTED_INFO */ + TEST_TYPE_SIZE (INTERNET_CONNECTED_INFO, 8) + TEST_TYPE_ALIGN (INTERNET_CONNECTED_INFO, 4) + TEST_FIELD_SIZE (INTERNET_CONNECTED_INFO, dwConnectedState, 4) + TEST_FIELD_ALIGN (INTERNET_CONNECTED_INFO, dwConnectedState, 4) + TEST_FIELD_OFFSET(INTERNET_CONNECTED_INFO, dwConnectedState, 0) + TEST_FIELD_SIZE (INTERNET_CONNECTED_INFO, dwFlags, 4) + TEST_FIELD_ALIGN (INTERNET_CONNECTED_INFO, dwFlags, 4) + TEST_FIELD_OFFSET(INTERNET_CONNECTED_INFO, dwFlags, 4) +} + +static void test_pack_INTERNET_PORT(void) +{ + /* INTERNET_PORT */ + TEST_TYPE_SIZE (INTERNET_PORT, 2) + TEST_TYPE_ALIGN (INTERNET_PORT, 2) + TEST_TYPE_UNSIGNED(INTERNET_PORT) +} + +static void test_pack_INTERNET_PROXY_INFOA(void) +{ + /* INTERNET_PROXY_INFOA */ + TEST_TYPE_SIZE (INTERNET_PROXY_INFOA, 24) + TEST_TYPE_ALIGN (INTERNET_PROXY_INFOA, 8) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, dwAccessType, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, dwAccessType, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, dwAccessType, 0) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, lpszProxy, 8) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, lpszProxy, 8) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, lpszProxy, 8) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, lpszProxyBypass, 8) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, lpszProxyBypass, 8) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, lpszProxyBypass, 16) +} + +static void test_pack_INTERNET_PROXY_INFOW(void) +{ + /* INTERNET_PROXY_INFOW */ + TEST_TYPE_SIZE (INTERNET_PROXY_INFOW, 24) + TEST_TYPE_ALIGN (INTERNET_PROXY_INFOW, 8) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, dwAccessType, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, dwAccessType, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, dwAccessType, 0) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, lpszProxy, 8) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, lpszProxy, 8) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, lpszProxy, 8) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, lpszProxyBypass, 8) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, lpszProxyBypass, 8) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, lpszProxyBypass, 16) +} + +static void test_pack_INTERNET_STATUS_CALLBACK(void) +{ + /* INTERNET_STATUS_CALLBACK */ + TEST_TYPE_SIZE (INTERNET_STATUS_CALLBACK, 8) + TEST_TYPE_ALIGN (INTERNET_STATUS_CALLBACK, 8) +} + +static void test_pack_INTERNET_VERSION_INFO(void) +{ + /* INTERNET_VERSION_INFO */ + TEST_TYPE_SIZE (INTERNET_VERSION_INFO, 8) + TEST_TYPE_ALIGN (INTERNET_VERSION_INFO, 4) + TEST_FIELD_SIZE (INTERNET_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (INTERNET_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(INTERNET_VERSION_INFO, dwMajorVersion, 0) + TEST_FIELD_SIZE (INTERNET_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (INTERNET_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(INTERNET_VERSION_INFO, dwMinorVersion, 4) +} + +static void test_pack_LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 16) + TEST_TARGET_ALIGN(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 16) + TEST_TARGET_ALIGN(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_ADMIN_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ADMIN_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 16) + TEST_TARGET_ALIGN(LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ADMIN_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ADMIN_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 16) + TEST_TARGET_ALIGN(LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_ASK_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ASK_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 16) + TEST_TARGET_ALIGN(LPGOPHER_ASK_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ASK_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ASK_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 16) + TEST_TARGET_ALIGN(LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_FIND_DATAA(void) +{ + /* LPGOPHER_FIND_DATAA */ + TEST_TYPE_SIZE (LPGOPHER_FIND_DATAA, 8) + TEST_TYPE_ALIGN (LPGOPHER_FIND_DATAA, 8) + TEST_TARGET_SIZE (LPGOPHER_FIND_DATAA, 808) + TEST_TARGET_ALIGN(LPGOPHER_FIND_DATAA, 4) +} + +static void test_pack_LPGOPHER_FIND_DATAW(void) +{ + /* LPGOPHER_FIND_DATAW */ + TEST_TYPE_SIZE (LPGOPHER_FIND_DATAW, 8) + TEST_TYPE_ALIGN (LPGOPHER_FIND_DATAW, 8) + TEST_TARGET_SIZE (LPGOPHER_FIND_DATAW, 1588) + TEST_TARGET_ALIGN(LPGOPHER_FIND_DATAW, 4) +} + +static void test_pack_LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24) + TEST_TARGET_ALIGN(LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_LOCATION_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_LOCATION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_LOCATION_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_LOCATION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_ALIGN(LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_SCORE_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_SCORE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_ALIGN(LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_SITE_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_SITE_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_SITE_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_SITE_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_SITE_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_SITE_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_TTL_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_TTL_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_TTL_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_TTL_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_TTL_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_VERONICA_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_VERONICA_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_VERSION_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_VERSION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_VERSION_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_VERSION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_VIEW_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_VIEW_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 24) + TEST_TARGET_ALIGN(LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_VIEW_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_VIEW_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 24) + TEST_TARGET_ALIGN(LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPHINTERNET(void) +{ + /* LPHINTERNET */ + TEST_TYPE_SIZE (LPHINTERNET, 8) + TEST_TYPE_ALIGN (LPHINTERNET, 8) + TEST_TARGET_SIZE (LPHINTERNET, 8) + TEST_TARGET_ALIGN(LPHINTERNET, 8) +} + +static void test_pack_LPHTTP_VERSION_INFO(void) +{ + /* LPHTTP_VERSION_INFO */ + TEST_TYPE_SIZE (LPHTTP_VERSION_INFO, 8) + TEST_TYPE_ALIGN (LPHTTP_VERSION_INFO, 8) + TEST_TARGET_SIZE (LPHTTP_VERSION_INFO, 8) + TEST_TARGET_ALIGN(LPHTTP_VERSION_INFO, 4) +} + +static void test_pack_LPINTERNET_ASYNC_RESULT(void) +{ + /* LPINTERNET_ASYNC_RESULT */ + TEST_TYPE_SIZE (LPINTERNET_ASYNC_RESULT, 8) + TEST_TYPE_ALIGN (LPINTERNET_ASYNC_RESULT, 8) + TEST_TARGET_SIZE (LPINTERNET_ASYNC_RESULT, 16) + TEST_TARGET_ALIGN(LPINTERNET_ASYNC_RESULT, 8) +} + +static void test_pack_LPINTERNET_BUFFERSA(void) +{ + /* LPINTERNET_BUFFERSA */ + TEST_TYPE_SIZE (LPINTERNET_BUFFERSA, 8) + TEST_TYPE_ALIGN (LPINTERNET_BUFFERSA, 8) + TEST_TARGET_SIZE (LPINTERNET_BUFFERSA, 56) + TEST_TARGET_ALIGN(LPINTERNET_BUFFERSA, 8) +} + +static void test_pack_LPINTERNET_BUFFERSW(void) +{ + /* LPINTERNET_BUFFERSW */ + TEST_TYPE_SIZE (LPINTERNET_BUFFERSW, 8) + TEST_TYPE_ALIGN (LPINTERNET_BUFFERSW, 8) + TEST_TARGET_SIZE (LPINTERNET_BUFFERSW, 56) + TEST_TARGET_ALIGN(LPINTERNET_BUFFERSW, 8) +} + +static void test_pack_LPINTERNET_CACHE_ENTRY_INFOA(void) +{ + /* LPINTERNET_CACHE_ENTRY_INFOA */ + TEST_TYPE_SIZE (LPINTERNET_CACHE_ENTRY_INFOA, 8) + TEST_TYPE_ALIGN (LPINTERNET_CACHE_ENTRY_INFOA, 8) +} + +static void test_pack_LPINTERNET_CACHE_ENTRY_INFOW(void) +{ + /* LPINTERNET_CACHE_ENTRY_INFOW */ + TEST_TYPE_SIZE (LPINTERNET_CACHE_ENTRY_INFOW, 8) + TEST_TYPE_ALIGN (LPINTERNET_CACHE_ENTRY_INFOW, 8) +} + +static void test_pack_LPINTERNET_CERTIFICATE_INFOA(void) +{ + /* LPINTERNET_CERTIFICATE_INFOA */ + TEST_TYPE_SIZE (LPINTERNET_CERTIFICATE_INFOA, 8) + TEST_TYPE_ALIGN (LPINTERNET_CERTIFICATE_INFOA, 8) + TEST_TARGET_SIZE (LPINTERNET_CERTIFICATE_INFOA, 64) + TEST_TARGET_ALIGN(LPINTERNET_CERTIFICATE_INFOA, 8) +} + +static void test_pack_LPINTERNET_CERTIFICATE_INFOW(void) +{ + /* LPINTERNET_CERTIFICATE_INFOW */ + TEST_TYPE_SIZE (LPINTERNET_CERTIFICATE_INFOW, 8) + TEST_TYPE_ALIGN (LPINTERNET_CERTIFICATE_INFOW, 8) + TEST_TARGET_SIZE (LPINTERNET_CERTIFICATE_INFOW, 64) + TEST_TARGET_ALIGN(LPINTERNET_CERTIFICATE_INFOW, 8) +} + +static void test_pack_LPINTERNET_CONNECTED_INFO(void) +{ + /* LPINTERNET_CONNECTED_INFO */ + TEST_TYPE_SIZE (LPINTERNET_CONNECTED_INFO, 8) + TEST_TYPE_ALIGN (LPINTERNET_CONNECTED_INFO, 8) + TEST_TARGET_SIZE (LPINTERNET_CONNECTED_INFO, 8) + TEST_TARGET_ALIGN(LPINTERNET_CONNECTED_INFO, 4) +} + +static void test_pack_LPINTERNET_PORT(void) +{ + /* LPINTERNET_PORT */ + TEST_TYPE_SIZE (LPINTERNET_PORT, 8) + TEST_TYPE_ALIGN (LPINTERNET_PORT, 8) + TEST_TARGET_SIZE (LPINTERNET_PORT, 2) + TEST_TARGET_ALIGN(LPINTERNET_PORT, 2) +} + +static void test_pack_LPINTERNET_PROXY_INFOA(void) +{ + /* LPINTERNET_PROXY_INFOA */ + TEST_TYPE_SIZE (LPINTERNET_PROXY_INFOA, 8) + TEST_TYPE_ALIGN (LPINTERNET_PROXY_INFOA, 8) + TEST_TARGET_SIZE (LPINTERNET_PROXY_INFOA, 24) + TEST_TARGET_ALIGN(LPINTERNET_PROXY_INFOA, 8) +} + +static void test_pack_LPINTERNET_PROXY_INFOW(void) +{ + /* LPINTERNET_PROXY_INFOW */ + TEST_TYPE_SIZE (LPINTERNET_PROXY_INFOW, 8) + TEST_TYPE_ALIGN (LPINTERNET_PROXY_INFOW, 8) + TEST_TARGET_SIZE (LPINTERNET_PROXY_INFOW, 24) + TEST_TARGET_ALIGN(LPINTERNET_PROXY_INFOW, 8) +} + +static void test_pack_LPINTERNET_STATUS_CALLBACK(void) +{ + /* LPINTERNET_STATUS_CALLBACK */ + TEST_TYPE_SIZE (LPINTERNET_STATUS_CALLBACK, 8) + TEST_TYPE_ALIGN (LPINTERNET_STATUS_CALLBACK, 8) + TEST_TARGET_SIZE (LPINTERNET_STATUS_CALLBACK, 8) + TEST_TARGET_ALIGN(LPINTERNET_STATUS_CALLBACK, 8) +} + +static void test_pack_LPINTERNET_VERSION_INFO(void) +{ + /* LPINTERNET_VERSION_INFO */ + TEST_TYPE_SIZE (LPINTERNET_VERSION_INFO, 8) + TEST_TYPE_ALIGN (LPINTERNET_VERSION_INFO, 8) + TEST_TARGET_SIZE (LPINTERNET_VERSION_INFO, 8) + TEST_TARGET_ALIGN(LPINTERNET_VERSION_INFO, 4) +} + +static void test_pack_LPURL_COMPONENTSA(void) +{ + /* LPURL_COMPONENTSA */ + TEST_TYPE_SIZE (LPURL_COMPONENTSA, 8) + TEST_TYPE_ALIGN (LPURL_COMPONENTSA, 8) +} + +static void test_pack_LPURL_COMPONENTSW(void) +{ + /* LPURL_COMPONENTSW */ + TEST_TYPE_SIZE (LPURL_COMPONENTSW, 8) + TEST_TYPE_ALIGN (LPURL_COMPONENTSW, 8) +} + +static void test_pack_PFN_AUTH_NOTIFY(void) +{ + /* PFN_AUTH_NOTIFY */ + TEST_TYPE_SIZE (PFN_AUTH_NOTIFY, 8) + TEST_TYPE_ALIGN (PFN_AUTH_NOTIFY, 8) +} + +static void test_pack_PFN_DIAL_HANDLER(void) +{ + /* PFN_DIAL_HANDLER */ + TEST_TYPE_SIZE (PFN_DIAL_HANDLER, 8) + TEST_TYPE_ALIGN (PFN_DIAL_HANDLER, 8) +} + +static void test_pack_URL_COMPONENTSA(void) +{ + /* URL_COMPONENTSA */ + TEST_FIELD_SIZE (URL_COMPONENTSA, dwStructSize, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSA, dwStructSize, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSA, dwStructSize, 0) + TEST_FIELD_SIZE (URL_COMPONENTSA, lpszScheme, 8) + TEST_FIELD_ALIGN (URL_COMPONENTSA, lpszScheme, 8) + TEST_FIELD_OFFSET(URL_COMPONENTSA, lpszScheme, 8) + TEST_FIELD_SIZE (URL_COMPONENTSA, dwSchemeLength, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSA, dwSchemeLength, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSA, dwSchemeLength, 16) +} + +static void test_pack_URL_COMPONENTSW(void) +{ + /* URL_COMPONENTSW */ + TEST_FIELD_SIZE (URL_COMPONENTSW, dwStructSize, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSW, dwStructSize, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSW, dwStructSize, 0) + TEST_FIELD_SIZE (URL_COMPONENTSW, lpszScheme, 8) + TEST_FIELD_ALIGN (URL_COMPONENTSW, lpszScheme, 8) + TEST_FIELD_OFFSET(URL_COMPONENTSW, lpszScheme, 8) + TEST_FIELD_SIZE (URL_COMPONENTSW, dwSchemeLength, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSW, dwSchemeLength, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSW, dwSchemeLength, 16) +} + +#else /* _WIN64 */ + +static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 4) @@ -106,7 +1333,7 @@ static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 4) @@ -119,7 +1346,7 @@ static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ADMIN_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ADMIN_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 4) @@ -132,7 +1359,7 @@ static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ADMIN_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ADMIN_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 4) @@ -145,7 +1372,7 @@ static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ASK_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ASK_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, 8) TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 4) @@ -158,7 +1385,7 @@ static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ASK_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ASK_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, 8) TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 4) @@ -185,7 +1412,7 @@ static void test_pack_GOPHER_ATTRIBUTE_ENUMERATORW(void) static void test_pack_GOPHER_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ATTRIBUTE_TYPEA */ TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEA, CategoryId, 0) @@ -196,7 +1423,7 @@ static void test_pack_GOPHER_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ATTRIBUTE_TYPEW */ TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEW, CategoryId, 0) @@ -207,7 +1434,7 @@ static void test_pack_GOPHER_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_FIND_DATAA(void) { - /* GOPHER_FIND_DATAA (pack 4) */ + /* GOPHER_FIND_DATAA */ TEST_TYPE_SIZE (GOPHER_FIND_DATAA, 808) TEST_TYPE_ALIGN (GOPHER_FIND_DATAA, 4) TEST_FIELD_SIZE (GOPHER_FIND_DATAA, DisplayString, 129) @@ -232,7 +1459,7 @@ static void test_pack_GOPHER_FIND_DATAA(void) static void test_pack_GOPHER_FIND_DATAW(void) { - /* GOPHER_FIND_DATAW (pack 4) */ + /* GOPHER_FIND_DATAW */ TEST_TYPE_SIZE (GOPHER_FIND_DATAW, 1588) TEST_TYPE_ALIGN (GOPHER_FIND_DATAW, 4) TEST_FIELD_SIZE (GOPHER_FIND_DATAW, DisplayString, 258) @@ -257,7 +1484,7 @@ static void test_pack_GOPHER_FIND_DATAW(void) static void test_pack_GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) { - /* GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24) TEST_TYPE_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 4) @@ -282,7 +1509,7 @@ static void test_pack_GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEA(void) { - /* GOPHER_LOCATION_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_LOCATION_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 4) @@ -292,7 +1519,7 @@ static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEW(void) { - /* GOPHER_LOCATION_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_LOCATION_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 4) @@ -302,7 +1529,7 @@ static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) { - /* GOPHER_MOD_DATE_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_MOD_DATE_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) TEST_TYPE_ALIGN (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 8) @@ -312,7 +1539,7 @@ static void test_pack_GOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 4) @@ -322,7 +1549,7 @@ static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 4) @@ -332,7 +1559,7 @@ static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) { - /* GOPHER_PROVIDER_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_PROVIDER_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 4) @@ -342,7 +1569,7 @@ static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) { - /* GOPHER_PROVIDER_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_PROVIDER_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 4) @@ -352,7 +1579,7 @@ static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_SCORE_ATTRIBUTE_TYPE(void) { - /* GOPHER_SCORE_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_SCORE_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) TEST_TYPE_ALIGN (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 4) @@ -362,7 +1589,7 @@ static void test_pack_GOPHER_SCORE_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) { - /* GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) TEST_TYPE_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 4) @@ -375,7 +1602,7 @@ static void test_pack_GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEA(void) { - /* GOPHER_SITE_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_SITE_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 4) @@ -385,7 +1612,7 @@ static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEW(void) { - /* GOPHER_SITE_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_SITE_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 4) @@ -395,7 +1622,7 @@ static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) { - /* GOPHER_TIMEZONE_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_TIMEZONE_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) TEST_TYPE_ALIGN (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 4) @@ -405,7 +1632,7 @@ static void test_pack_GOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_TTL_ATTRIBUTE_TYPE(void) { - /* GOPHER_TTL_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_TTL_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, 4) TEST_TYPE_ALIGN (GOPHER_TTL_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 4) @@ -415,7 +1642,7 @@ static void test_pack_GOPHER_TTL_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) { - /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 4) @@ -425,7 +1652,7 @@ static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) { - /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 4) @@ -435,7 +1662,7 @@ static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_VERONICA_ATTRIBUTE_TYPE(void) { - /* GOPHER_VERONICA_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_VERONICA_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) TEST_TYPE_ALIGN (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 4) @@ -445,7 +1672,7 @@ static void test_pack_GOPHER_VERONICA_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEA(void) { - /* GOPHER_VERSION_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_VERSION_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 4) @@ -455,7 +1682,7 @@ static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEW(void) { - /* GOPHER_VERSION_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_VERSION_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 4) @@ -465,7 +1692,7 @@ static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEA(void) { - /* GOPHER_VIEW_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_VIEW_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, 12) TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 4) @@ -481,7 +1708,7 @@ static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEW(void) { - /* GOPHER_VIEW_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_VIEW_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, 12) TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 4) @@ -512,7 +1739,7 @@ static void test_pack_HINTERNET(void) static void test_pack_HTTP_VERSION_INFO(void) { - /* HTTP_VERSION_INFO (pack 4) */ + /* HTTP_VERSION_INFO */ TEST_TYPE_SIZE (HTTP_VERSION_INFO, 8) TEST_TYPE_ALIGN (HTTP_VERSION_INFO, 4) TEST_FIELD_SIZE (HTTP_VERSION_INFO, dwMajorVersion, 4) @@ -525,7 +1752,7 @@ static void test_pack_HTTP_VERSION_INFO(void) static void test_pack_INTERNET_ASYNC_RESULT(void) { - /* INTERNET_ASYNC_RESULT (pack 4) */ + /* INTERNET_ASYNC_RESULT */ TEST_TYPE_SIZE (INTERNET_ASYNC_RESULT, 8) TEST_TYPE_ALIGN (INTERNET_ASYNC_RESULT, 4) TEST_FIELD_SIZE (INTERNET_ASYNC_RESULT, dwResult, 4) @@ -538,7 +1765,7 @@ static void test_pack_INTERNET_ASYNC_RESULT(void) static void test_pack_INTERNET_AUTH_NOTIFY_DATA(void) { - /* INTERNET_AUTH_NOTIFY_DATA (pack 4) */ + /* INTERNET_AUTH_NOTIFY_DATA */ TEST_TYPE_SIZE (INTERNET_AUTH_NOTIFY_DATA, 16) TEST_TYPE_ALIGN (INTERNET_AUTH_NOTIFY_DATA, 4) TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, cbStruct, 4) @@ -557,7 +1784,7 @@ static void test_pack_INTERNET_AUTH_NOTIFY_DATA(void) static void test_pack_INTERNET_BUFFERSA(void) { - /* INTERNET_BUFFERSA (pack 4) */ + /* INTERNET_BUFFERSA */ TEST_TYPE_SIZE (INTERNET_BUFFERSA, 40) TEST_TYPE_ALIGN (INTERNET_BUFFERSA, 4) TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwStructSize, 4) @@ -594,7 +1821,7 @@ static void test_pack_INTERNET_BUFFERSA(void) static void test_pack_INTERNET_BUFFERSW(void) { - /* INTERNET_BUFFERSW (pack 4) */ + /* INTERNET_BUFFERSW */ TEST_TYPE_SIZE (INTERNET_BUFFERSW, 40) TEST_TYPE_ALIGN (INTERNET_BUFFERSW, 4) TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwStructSize, 4) @@ -631,7 +1858,7 @@ static void test_pack_INTERNET_BUFFERSW(void) static void test_pack_INTERNET_CACHE_ENTRY_INFOA(void) { - /* INTERNET_CACHE_ENTRY_INFOA (pack 4) */ + /* INTERNET_CACHE_ENTRY_INFOA */ TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 0) @@ -681,7 +1908,7 @@ static void test_pack_INTERNET_CACHE_ENTRY_INFOA(void) static void test_pack_INTERNET_CACHE_ENTRY_INFOW(void) { - /* INTERNET_CACHE_ENTRY_INFOW (pack 4) */ + /* INTERNET_CACHE_ENTRY_INFOW */ TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 0) @@ -731,7 +1958,7 @@ static void test_pack_INTERNET_CACHE_ENTRY_INFOW(void) static void test_pack_INTERNET_CERTIFICATE_INFOA(void) { - /* INTERNET_CERTIFICATE_INFOA (pack 4) */ + /* INTERNET_CERTIFICATE_INFOA */ TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOA, 40) TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOA, 4) TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, ftExpiry, 8) @@ -762,7 +1989,7 @@ static void test_pack_INTERNET_CERTIFICATE_INFOA(void) static void test_pack_INTERNET_CERTIFICATE_INFOW(void) { - /* INTERNET_CERTIFICATE_INFOW (pack 4) */ + /* INTERNET_CERTIFICATE_INFOW */ TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOW, 40) TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOW, 4) TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, ftExpiry, 8) @@ -793,7 +2020,7 @@ static void test_pack_INTERNET_CERTIFICATE_INFOW(void) static void test_pack_INTERNET_CONNECTED_INFO(void) { - /* INTERNET_CONNECTED_INFO (pack 4) */ + /* INTERNET_CONNECTED_INFO */ TEST_TYPE_SIZE (INTERNET_CONNECTED_INFO, 8) TEST_TYPE_ALIGN (INTERNET_CONNECTED_INFO, 4) TEST_FIELD_SIZE (INTERNET_CONNECTED_INFO, dwConnectedState, 4) @@ -814,7 +2041,7 @@ static void test_pack_INTERNET_PORT(void) static void test_pack_INTERNET_PROXY_INFOA(void) { - /* INTERNET_PROXY_INFOA (pack 4) */ + /* INTERNET_PROXY_INFOA */ TEST_TYPE_SIZE (INTERNET_PROXY_INFOA, 12) TEST_TYPE_ALIGN (INTERNET_PROXY_INFOA, 4) TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, dwAccessType, 4) @@ -830,7 +2057,7 @@ static void test_pack_INTERNET_PROXY_INFOA(void) static void test_pack_INTERNET_PROXY_INFOW(void) { - /* INTERNET_PROXY_INFOW (pack 4) */ + /* INTERNET_PROXY_INFOW */ TEST_TYPE_SIZE (INTERNET_PROXY_INFOW, 12) TEST_TYPE_ALIGN (INTERNET_PROXY_INFOW, 4) TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, dwAccessType, 4) @@ -853,7 +2080,7 @@ static void test_pack_INTERNET_STATUS_CALLBACK(void) static void test_pack_INTERNET_VERSION_INFO(void) { - /* INTERNET_VERSION_INFO (pack 4) */ + /* INTERNET_VERSION_INFO */ TEST_TYPE_SIZE (INTERNET_VERSION_INFO, 8) TEST_TYPE_ALIGN (INTERNET_VERSION_INFO, 4) TEST_FIELD_SIZE (INTERNET_VERSION_INFO, dwMajorVersion, 4) @@ -1300,7 +2527,7 @@ static void test_pack_PFN_DIAL_HANDLER(void) static void test_pack_URL_COMPONENTSA(void) { - /* URL_COMPONENTSA (pack 4) */ + /* URL_COMPONENTSA */ TEST_FIELD_SIZE (URL_COMPONENTSA, dwStructSize, 4) TEST_FIELD_ALIGN (URL_COMPONENTSA, dwStructSize, 4) TEST_FIELD_OFFSET(URL_COMPONENTSA, dwStructSize, 0) @@ -1314,7 +2541,7 @@ static void test_pack_URL_COMPONENTSA(void) static void test_pack_URL_COMPONENTSW(void) { - /* URL_COMPONENTSW (pack 4) */ + /* URL_COMPONENTSW */ TEST_FIELD_SIZE (URL_COMPONENTSW, dwStructSize, 4) TEST_FIELD_ALIGN (URL_COMPONENTSW, dwStructSize, 4) TEST_FIELD_OFFSET(URL_COMPONENTSW, dwStructSize, 0) @@ -1326,6 +2553,8 @@ static void test_pack_URL_COMPONENTSW(void) TEST_FIELD_OFFSET(URL_COMPONENTSW, dwSchemeLength, 8) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(); @@ -1434,9 +2663,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/wininet/http.c b/rostests/winetests/wininet/http.c index e3c33bd8748..0faeb54dc8a 100644 --- a/rostests/winetests/wininet/http.c +++ b/rostests/winetests/wininet/http.c @@ -105,6 +105,35 @@ static CHAR status_string[MAX_INTERNET_STATUS][MAX_STATUS_NAME]; static HANDLE hCompleteEvent; +#define TESTF_REDIRECT 0x01 +#define TESTF_COMPRESSED 0x02 +#define TESTF_ALLOW_COOKIE 0x04 + +typedef struct { + const char *url; + const char *redirected_url; + const char *host; + const char *path; + DWORD flags; +} test_data_t; + +static const test_data_t test_data[] = { + { + "http://test.winehq.org/testredirect", + "http://test.winehq.org/hello.html", + "test.winehq.org", + "/testredirect", + TESTF_REDIRECT + }, + { + "http://www.codeweavers.com/", + "http://www.codeweavers.com/", + "www.codeweavers.com", + "", + TESTF_COMPRESSED|TESTF_ALLOW_COOKIE + } +}; + static INTERNET_STATUS_CALLBACK (WINAPI *pInternetSetStatusCallbackA)(HINTERNET ,INTERNET_STATUS_CALLBACK); @@ -239,7 +268,7 @@ static VOID WINAPI callback( } } -static void InternetReadFile_test(int flags) +static void InternetReadFile_test(int flags, const test_data_t *test) { BOOL res; CHAR buffer[4000]; @@ -250,10 +279,11 @@ static void InternetReadFile_test(int flags) hCompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - trace("Starting InternetReadFile test with flags 0x%x\n",flags); + trace("Starting InternetReadFile test with flags 0x%x on url %s\n",flags,test->url); trace("InternetOpenA <--\n"); - hi = InternetOpenA("", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, flags); + hi = InternetOpenA((test->flags & TESTF_COMPRESSED) ? "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" : "", + INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, flags); ok((hi != 0x0),"InternetOpen failed with error %u\n", GetLastError()); trace("InternetOpenA -->\n"); @@ -264,7 +294,7 @@ static void InternetReadFile_test(int flags) SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); trace("InternetConnectA <--\n"); - hic=InternetConnectA(hi, "test.winehq.org", INTERNET_INVALID_PORT_NUMBER, + hic=InternetConnectA(hi, test->host, INTERNET_INVALID_PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, 0x0, 0xdeadbeef); ok((hic != 0x0),"InternetConnect failed with error %u\n", GetLastError()); trace("InternetConnectA -->\n"); @@ -275,7 +305,7 @@ static void InternetReadFile_test(int flags) SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); trace("HttpOpenRequestA <--\n"); - hor = HttpOpenRequestA(hic, "GET", "/testredirect", NULL, NULL, types, + hor = HttpOpenRequestA(hic, "GET", test->path, NULL, NULL, types, INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_RESYNCHRONIZE, 0xdeadbead); if (hor == 0x0 && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { @@ -295,7 +325,7 @@ static void InternetReadFile_test(int flags) length = sizeof(buffer); res = InternetQueryOptionA(hor, INTERNET_OPTION_URL, buffer, &length); ok(res, "InternetQueryOptionA(INTERNET_OPTION_URL) failed: %u\n", GetLastError()); - ok(!strcmp(buffer, "http://test.winehq.org/testredirect"), "Wrong URL %s\n", buffer); + ok(!strcmp(buffer, test->url), "Wrong URL %s, expected %s\n", buffer, test->url); length = sizeof(buffer); res = HttpQueryInfoA(hor, HTTP_QUERY_RAW_HEADERS, buffer, &length, 0x0); @@ -306,6 +336,10 @@ static void InternetReadFile_test(int flags) CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); + if(test->flags & TESTF_ALLOW_COOKIE) { + SET_OPTIONAL(INTERNET_STATUS_COOKIE_SENT); + SET_OPTIONAL(INTERNET_STATUS_COOKIE_RECEIVED); + } if (first_connection_to_test_url) { SET_EXPECT(INTERNET_STATUS_RESOLVING_NAME); @@ -322,12 +356,14 @@ static void InternetReadFile_test(int flags) SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER); SET_WINE_ALLOW(INTERNET_STATUS_CONNECTED_TO_SERVER); SET_EXPECT(INTERNET_STATUS_CONNECTED_TO_SERVER); - SET_EXPECT2(INTERNET_STATUS_SENDING_REQUEST, 2); - SET_EXPECT2(INTERNET_STATUS_REQUEST_SENT, 2); - SET_EXPECT2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); - SET_EXPECT2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); - SET_OPTIONAL2(INTERNET_STATUS_CLOSING_CONNECTION, 2); - SET_OPTIONAL2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + SET_EXPECT2(INTERNET_STATUS_SENDING_REQUEST, (test->flags & TESTF_REDIRECT) ? 2 : 1); + SET_EXPECT2(INTERNET_STATUS_REQUEST_SENT, (test->flags & TESTF_REDIRECT) ? 2 : 1); + SET_EXPECT2(INTERNET_STATUS_RECEIVING_RESPONSE, (test->flags & TESTF_REDIRECT) ? 2 : 1); + SET_EXPECT2(INTERNET_STATUS_RESPONSE_RECEIVED, (test->flags & TESTF_REDIRECT) ? 2 : 1); + if(test->flags & TESTF_REDIRECT) { + SET_OPTIONAL2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + SET_OPTIONAL2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + } SET_EXPECT(INTERNET_STATUS_REDIRECT); SET_OPTIONAL(INTERNET_STATUS_CONNECTING_TO_SERVER); SET_OPTIONAL(INTERNET_STATUS_CONNECTED_TO_SERVER); @@ -336,9 +372,19 @@ static void InternetReadFile_test(int flags) else SET_WINE_ALLOW(INTERNET_STATUS_REQUEST_COMPLETE); + if(test->flags & TESTF_COMPRESSED) { + BOOL b = TRUE; + + res = InternetSetOption(hor, INTERNET_OPTION_HTTP_DECODING, &b, sizeof(b)); + ok(res || broken(!res && GetLastError() == ERROR_INTERNET_INVALID_OPTION), + "InternetSetOption failed: %u\n", GetLastError()); + if(!res) + goto abort; + } + trace("HttpSendRequestA -->\n"); SetLastError(0xdeadbeef); - res = HttpSendRequestA(hor, "", -1, NULL, 0); + res = HttpSendRequestA(hor, (test->flags & TESTF_COMPRESSED) ? "Accept-Encoding: gzip, deflate" : "", -1, NULL, 0); if (flags & INTERNET_FLAG_ASYNC) ok(!res && (GetLastError() == ERROR_IO_PENDING), "Asynchronous HttpSendRequest NOT returning 0 with error ERROR_IO_PENDING\n"); @@ -350,6 +396,10 @@ static void InternetReadFile_test(int flags) if (flags & INTERNET_FLAG_ASYNC) WaitForSingleObject(hCompleteEvent, INFINITE); + if(test->flags & TESTF_ALLOW_COOKIE) { + CLEAR_NOTIFIED(INTERNET_STATUS_COOKIE_SENT); + CLEAR_NOTIFIED(INTERNET_STATUS_COOKIE_RECEIVED); + } if (first_connection_to_test_url) { CHECK_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); @@ -360,11 +410,12 @@ static void InternetReadFile_test(int flags) CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); } - CHECK_NOTIFIED2(INTERNET_STATUS_SENDING_REQUEST, 2); - CHECK_NOTIFIED2(INTERNET_STATUS_REQUEST_SENT, 2); - CHECK_NOTIFIED2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); - CHECK_NOTIFIED2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); - CHECK_NOTIFIED(INTERNET_STATUS_REDIRECT); + CHECK_NOTIFIED2(INTERNET_STATUS_SENDING_REQUEST, (test->flags & TESTF_REDIRECT) ? 2 : 1); + CHECK_NOTIFIED2(INTERNET_STATUS_REQUEST_SENT, (test->flags & TESTF_REDIRECT) ? 2 : 1); + CHECK_NOTIFIED2(INTERNET_STATUS_RECEIVING_RESPONSE, (test->flags & TESTF_REDIRECT) ? 2 : 1); + CHECK_NOTIFIED2(INTERNET_STATUS_RESPONSE_RECEIVED, (test->flags & TESTF_REDIRECT) ? 2 : 1); + if(test->flags & TESTF_REDIRECT) + CHECK_NOTIFIED(INTERNET_STATUS_REDIRECT); if (flags & INTERNET_FLAG_ASYNC) CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); else @@ -389,16 +440,24 @@ static void InternetReadFile_test(int flags) length = sizeof(buffer); res = InternetQueryOptionA(hor, INTERNET_OPTION_URL, buffer, &length); ok(res, "InternetQueryOptionA(INTERNET_OPTION_URL) failed: %u\n", GetLastError()); - ok(!strcmp(buffer, "http://test.winehq.org/hello.html"), "Wrong URL %s\n", buffer); + ok(!strcmp(buffer, test->redirected_url), "Wrong URL %s\n", buffer); length = 16; res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_LENGTH,&buffer,&length,0x0); - trace("Option 0x5 -> %i %s (%u)\n",res,buffer,GetLastError()); + trace("Option HTTP_QUERY_CONTENT_LENGTH -> %i %s (%u)\n",res,buffer,GetLastError()); + if(test->flags & TESTF_COMPRESSED) + ok(!res && GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, + "expected ERROR_HTTP_HEADER_NOT_FOUND, got %x (%u)\n", res, GetLastError()); length = 100; res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_TYPE,buffer,&length,0x0); buffer[length]=0; - trace("Option 0x1 -> %i %s\n",res,buffer); + trace("Option HTTP_QUERY_CONTENT_TYPE -> %i %s\n",res,buffer); + + length = 100; + res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_ENCODING,buffer,&length,0x0); + buffer[length]=0; + trace("Option HTTP_QUERY_CONTENT_ENCODING -> %i %s\n",res,buffer); SetLastError(0xdeadbeef); res = InternetReadFile(NULL, buffer, 100, &length); @@ -447,8 +506,10 @@ static void InternetReadFile_test(int flags) if (length == 0) break; } - CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); - CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + if(test->flags & TESTF_REDIRECT) { + CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + } abort: trace("aborting\n"); SET_EXPECT2(INTERNET_STATUS_HANDLE_CLOSING, (hor != 0x0) + (hic != 0x0)); @@ -493,6 +554,114 @@ abort: first_connection_to_test_url = FALSE; } +static void InternetReadFile_chunked_test(void) +{ + BOOL res; + CHAR buffer[4000]; + DWORD length; + const char *types[2] = { "*", NULL }; + HINTERNET hi, hic = 0, hor = 0; + + trace("Starting InternetReadFile chunked test\n"); + + trace("InternetOpenA <--\n"); + hi = InternetOpenA("", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); + ok((hi != 0x0),"InternetOpen failed with error %u\n", GetLastError()); + trace("InternetOpenA -->\n"); + + if (hi == 0x0) goto abort; + + trace("InternetConnectA <--\n"); + hic=InternetConnectA(hi, "test.winehq.org", INTERNET_INVALID_PORT_NUMBER, + NULL, NULL, INTERNET_SERVICE_HTTP, 0x0, 0xdeadbeef); + ok((hic != 0x0),"InternetConnect failed with error %u\n", GetLastError()); + trace("InternetConnectA -->\n"); + + if (hic == 0x0) goto abort; + + trace("HttpOpenRequestA <--\n"); + hor = HttpOpenRequestA(hic, "GET", "/testchunked", NULL, NULL, types, + INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_RESYNCHRONIZE, + 0xdeadbead); + if (hor == 0x0 && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { + /* + * If the internet name can't be resolved we are probably behind + * a firewall or in some other way not directly connected to the + * Internet. Not enough reason to fail the test. Just ignore and + * abort. + */ + } else { + ok((hor != 0x0),"HttpOpenRequest failed with error %u\n", GetLastError()); + } + trace("HttpOpenRequestA -->\n"); + + if (hor == 0x0) goto abort; + + trace("HttpSendRequestA -->\n"); + SetLastError(0xdeadbeef); + res = HttpSendRequestA(hor, "", -1, NULL, 0); + ok(res || (GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED), + "Synchronous HttpSendRequest returning 0, error %u\n", GetLastError()); + trace("HttpSendRequestA <--\n"); + + length = 100; + res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_TYPE,buffer,&length,0x0); + buffer[length]=0; + trace("Option CONTENT_TYPE -> %i %s\n",res,buffer); + + SetLastError( 0xdeadbeef ); + length = 100; + res = HttpQueryInfoA(hor,HTTP_QUERY_TRANSFER_ENCODING,buffer,&length,0x0); + buffer[length]=0; + trace("Option TRANSFER_ENCODING -> %i %s\n",res,buffer); + ok( res, "Failed to get TRANSFER_ENCODING option, error %u\n", GetLastError() ); + ok( !strcmp( buffer, "chunked" ), "Wrong transfer encoding '%s'\n", buffer ); + + SetLastError( 0xdeadbeef ); + length = 16; + res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_LENGTH,&buffer,&length,0x0); + ok( !res, "Found CONTENT_LENGTH option '%s'\n", buffer ); + ok( GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "Wrong error %u\n", GetLastError() ); + + length = 100; + trace("Entering Query loop\n"); + + while (TRUE) + { + res = InternetQueryDataAvailable(hor,&length,0x0,0x0); + ok(!(!res && length != 0),"InternetQueryDataAvailable failed with non-zero length\n"); + ok(res, "InternetQueryDataAvailable failed, error %d\n", GetLastError()); + trace("got %u available\n",length); + if (length) + { + DWORD got; + char *buffer = HeapAlloc(GetProcessHeap(),0,length+1); + + res = InternetReadFile(hor,buffer,length,&got); + + buffer[got]=0; + trace("ReadFile -> %i %i\n",res,got); + ok( length == got, "only got %u of %u available\n", got, length ); + ok( buffer[got-1] == '\n', "received partial line '%s'\n", buffer ); + + HeapFree(GetProcessHeap(),0,buffer); + if (!got) break; + } + if (length == 0) + break; + } +abort: + trace("aborting\n"); + if (hor != 0x0) { + res = InternetCloseHandle(hor); + ok (res, "InternetCloseHandle of handle opened by HttpOpenRequestA failed\n"); + } + if (hi != 0x0) { + res = InternetCloseHandle(hi); + ok (res, "InternetCloseHandle of handle opened by InternetOpenA failed\n"); + } +} + static void InternetReadFileExA_test(int flags) { DWORD rc; @@ -802,8 +971,7 @@ static void HttpSendRequestEx_test(void) HINTERNET hRequest; INTERNET_BUFFERS BufferIn; - DWORD dwBytesWritten; - DWORD dwBytesRead; + DWORD dwBytesWritten, dwBytesRead, error; CHAR szBuffer[256]; int i; BOOL ret; @@ -839,8 +1007,11 @@ static void HttpSendRequestEx_test(void) BufferIn.dwOffsetLow = 0; BufferIn.dwOffsetHigh = 0; + SetLastError(0xdeadbeef); ret = HttpSendRequestEx(hRequest, &BufferIn, NULL, 0 ,0); - ok(ret, "HttpSendRequestEx Failed with error %u\n", GetLastError()); + error = GetLastError(); + ok(ret, "HttpSendRequestEx Failed with error %u\n", error); + ok(error == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", error); for (i = 3; szPostData[i]; i++) ok(InternetWriteFile(hRequest, &szPostData[i], 1, &dwBytesWritten), @@ -942,7 +1113,7 @@ static void test_http_cache(void) size = sizeof(url); ret = InternetQueryOptionA(request, INTERNET_OPTION_URL, url, &size); - ok(ret, "InternetQueryOptionA(INTERNET_OPTION_url) failed: %u\n", GetLastError()); + ok(ret, "InternetQueryOptionA(INTERNET_OPTION_URL) failed: %u\n", GetLastError()); ok(!strcmp(url, "http://test.winehq.org/hello.html"), "Wrong URL %s\n", url); size = sizeof(file_name); @@ -977,7 +1148,7 @@ static void test_http_cache(void) file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - todo_wine ok(file != INVALID_HANDLE_VALUE, "CreateFile succeeded\n"); + ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); CloseHandle(file); request = HttpOpenRequestA(connect, NULL, "/", NULL, NULL, types, INTERNET_FLAG_NO_CACHE_WRITE, 0); @@ -993,13 +1164,20 @@ static void test_http_cache(void) ok(ret, "HttpSendRequest failed: %u\n", GetLastError()); size = sizeof(file_name); + file_name[0] = 0; ret = InternetQueryOptionA(request, INTERNET_OPTION_DATAFILE_NAME, file_name, &size); - todo_wine ok(ret, "InternetQueryOptionA(INTERNET_OPTION_DATAFILE_NAME) failed %u\n", GetLastError()); - - file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + if (ret) + { + file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - todo_wine ok(file != INVALID_HANDLE_VALUE, "CreateFile succeeded\n"); - CloseHandle(file); + ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); + CloseHandle(file); + } + else + { + /* < IE8 */ + ok(file_name[0] == 0, "Didn't expect a file name\n"); + } ok(InternetCloseHandle(request), "Close request handle failed\n"); ok(InternetCloseHandle(connect), "Close connect handle failed\n"); @@ -1284,15 +1462,47 @@ static void HttpHeaders_test(void) ok(index == 1, "Index was not incremented\n"); ok(strcmp(buffer,"value")==0, "incorrect string was returned(%s)\n",buffer); + /* Ensure that malformed header separators are ignored and don't cause a failure */ + ok(HttpAddRequestHeaders(hRequest,"\r\rMalformedTest:value\n\nMalformedTestTwo: value2\rMalformedTestThree: value3\n\n\r\r\n",-1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE), + "Failed to add header with malformed entries in list\n"); + + index = 0; + len = sizeof(buffer); + strcpy(buffer,"MalformedTest"); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index),"Unable to query header\n"); + ok(index == 1, "Index was not incremented\n"); + ok(strcmp(buffer,"value")==0, "incorrect string was returned(%s)\n",buffer); + index = 0; + len = sizeof(buffer); + strcpy(buffer,"MalformedTestTwo"); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index),"Unable to query header\n"); + ok(index == 1, "Index was not incremented\n"); + ok(strcmp(buffer,"value2")==0, "incorrect string was returned(%s)\n",buffer); + index = 0; + len = sizeof(buffer); + strcpy(buffer,"MalformedTestThree"); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index),"Unable to query header\n"); + ok(index == 1, "Index was not incremented\n"); + ok(strcmp(buffer,"value3")==0, "incorrect string was returned(%s)\n",buffer); + ok(InternetCloseHandle(hRequest), "Close request handle failed\n"); done: ok(InternetCloseHandle(hConnect), "Close connect handle failed\n"); ok(InternetCloseHandle(hSession), "Close session handle failed\n"); } +static const char garbagemsg[] = +"Garbage: Header\r\n"; + static const char contmsg[] = "HTTP/1.1 100 Continue\r\n"; +static const char expandcontmsg[] = +"HTTP/1.1 100 Continue\r\n" +"Server: winecontinue\r\n" +"Tag: something witty\r\n" +"\r\n"; + static const char okmsg[] = "HTTP/1.1 200 OK\r\n" "Server: winetest\r\n" @@ -1518,6 +1728,19 @@ static DWORD CALLBACK server_thread(LPVOID param) send(c, page1, sizeof page1-1, 0); last_request = 1; } + if (strstr(buffer, "GET /testF")) + { + send(c, expandcontmsg, sizeof expandcontmsg-1, 0); + send(c, garbagemsg, sizeof garbagemsg-1, 0); + send(c, contmsg, sizeof contmsg-1, 0); + send(c, garbagemsg, sizeof garbagemsg-1, 0); + send(c, okmsg, sizeof okmsg-1, 0); + send(c, page1, sizeof page1-1, 0); + } + if (strstr(buffer, "GET /testG")) + { + send(c, page1, sizeof page1-1, 0); + } shutdown(c, 2); closesocket(c); @@ -1558,6 +1781,32 @@ static void test_basic_request(int port, const char *verb, const char *url) InternetCloseHandle(hi); } +static void test_last_error(int port) +{ + HINTERNET hi, hc, hr; + DWORD error; + BOOL r; + + hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(hi != NULL, "open failed\n"); + + hc = InternetConnect(hi, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(hc != NULL, "connect failed\n"); + + hr = HttpOpenRequest(hc, NULL, "/test1", NULL, NULL, NULL, 0, 0); + ok(hr != NULL, "HttpOpenRequest failed\n"); + + SetLastError(0xdeadbeef); + r = HttpSendRequest(hr, NULL, 0, NULL, 0); + error = GetLastError(); + ok(r, "HttpSendRequest failed\n"); + ok(error == ERROR_SUCCESS || broken(error != ERROR_SUCCESS), "expected ERROR_SUCCESS, got %u\n", error); + + InternetCloseHandle(hr); + InternetCloseHandle(hc); + InternetCloseHandle(hi); +} + static void test_proxy_indirect(int port) { HINTERNET hi, hc, hr; @@ -1578,7 +1827,12 @@ static void test_proxy_indirect(int port) sz = sizeof buffer; r = HttpQueryInfo(hr, HTTP_QUERY_PROXY_AUTHENTICATE, buffer, &sz, NULL); - ok(r, "HttpQueryInfo failed\n"); + ok(r || GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "HttpQueryInfo failed: %d\n", GetLastError()); + if (!r) + { + skip("missing proxy header, not testing remaining proxy headers\n"); + goto out; + } ok(!strcmp(buffer, "Basic realm=\"placebo\""), "proxy auth info wrong\n"); sz = sizeof buffer; @@ -1611,6 +1865,7 @@ static void test_proxy_indirect(int port) ok(GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "HttpQueryInfo should fail\n"); ok(r == FALSE, "HttpQueryInfo failed\n"); +out: InternetCloseHandle(hr); InternetCloseHandle(hc); InternetCloseHandle(hi); @@ -1829,7 +2084,6 @@ static void test_http1_1(int port) ok(req != NULL, "HttpOpenRequest failed\n"); ret = HttpSendRequest(req, NULL, 0, NULL, 0); - todo_wine ok(ret, "HttpSendRequest failed\n"); } @@ -1995,6 +2249,69 @@ static void test_invalid_response_headers(int port) InternetCloseHandle(session); } +static void test_response_without_headers(int port) +{ + HINTERNET hi, hc, hr; + DWORD r, count, size, status; + char buffer[1024]; + + SetLastError(0xdeadbeef); + hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(hi != NULL, "open failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + hc = InternetConnect(hi, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(hc != NULL, "connect failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + hr = HttpOpenRequest(hc, NULL, "/testG", NULL, NULL, NULL, 0, 0); + ok(hr != NULL, "HttpOpenRequest failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + r = HttpSendRequest(hr, NULL, 0, NULL, 0); + ok(r, "HttpSendRequest failed %u\n", GetLastError()); + + count = 0; + memset(buffer, 0, sizeof buffer); + SetLastError(0xdeadbeef); + r = InternetReadFile(hr, buffer, sizeof buffer, &count); + ok(r, "InternetReadFile failed %u\n", GetLastError()); + todo_wine ok(count == sizeof page1 - 1, "count was wrong\n"); + todo_wine ok(!memcmp(buffer, page1, sizeof page1), "http data wrong\n"); + + status = 0; + size = sizeof(status); + SetLastError(0xdeadbeef); + r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL ); + todo_wine ok(r, "HttpQueryInfo failed %u\n", GetLastError()); + todo_wine ok(status == 200, "expected status 200 got %u\n", status); + + buffer[0] = 0; + size = sizeof(buffer); + SetLastError(0xdeadbeef); + r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_TEXT, buffer, &size, NULL ); + ok(r, "HttpQueryInfo failed %u\n", GetLastError()); + ok(!strcmp(buffer, "OK"), "expected OK got: \"%s\"\n", buffer); + + buffer[0] = 0; + size = sizeof(buffer); + SetLastError(0xdeadbeef); + r = HttpQueryInfo(hr, HTTP_QUERY_VERSION, buffer, &size, NULL); + ok(r, "HttpQueryInfo failed %u\n", GetLastError()); + ok(!strcmp(buffer, "HTTP/1.0"), "expected HTTP/1.0 got: \"%s\"\n", buffer); + + buffer[0] = 0; + size = sizeof(buffer); + SetLastError(0xdeadbeef); + r = HttpQueryInfo(hr, HTTP_QUERY_RAW_HEADERS, buffer, &size, NULL); + ok(r, "HttpQueryInfo failed %u\n", GetLastError()); + ok(!strcmp(buffer, "HTTP/1.0 200 OK"), "raw headers wrong: \"%s\"\n", buffer); + + InternetCloseHandle(hr); + InternetCloseHandle(hc); + InternetCloseHandle(hi); +} + static void test_HttpQueryInfo(int port) { HINTERNET hi, hc, hr; @@ -2124,13 +2441,16 @@ static void test_http_connection(void) test_basic_request(si.port, "RPC_IN_DATA", "/test5"); test_basic_request(si.port, "RPC_OUT_DATA", "/test5"); test_basic_request(si.port, "GET", "/test6"); + test_basic_request(si.port, "GET", "/testF"); test_connection_header(si.port); test_http1_1(si.port); test_cookie_header(si.port); test_basic_authentication(si.port); test_invalid_response_headers(si.port); + test_response_without_headers(si.port); test_HttpQueryInfo(si.port); test_HttpSendRequestW(si.port); + test_last_error(si.port); /* send the basic request again to shutdown the server thread */ test_basic_request(si.port, "GET", "/quit"); @@ -2321,6 +2641,7 @@ struct notification unsigned int status; /* status received */ int async; /* delivered from another thread? */ int todo; + int optional; }; struct info @@ -2356,6 +2677,13 @@ static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DW return; } + while (info->test[i].status != status && info->test[i].optional && + i < info->count - 1 && + info->test[i].function == info->test[i + 1].function) + { + i++; + } + status_ok = (info->test[i].status == status); function_ok = (info->test[i].function == info->function); @@ -2375,7 +2703,7 @@ static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DW todo_wine ok( function_ok, "%u: expected function %u got %u\n", info->line, info->test[i].function, info->function ); } if (i == info->count - 1 || info->test[i].function != info->test[i + 1].function) SetEvent( info->wait ); - info->index++; + info->index = i+1; LeaveCriticalSection( ¬ification_cs ); } @@ -2390,6 +2718,7 @@ static const struct notification async_send_request_ex_test[] = { { internet_connect, INTERNET_STATUS_HANDLE_CREATED, 0 }, { http_open_request, INTERNET_STATUS_HANDLE_CREATED, 0 }, + { http_send_request_ex, INTERNET_STATUS_DETECTING_PROXY, 1, 0, 1 }, { http_send_request_ex, INTERNET_STATUS_RESOLVING_NAME, 1 }, { http_send_request_ex, INTERNET_STATUS_NAME_RESOLVED, 1 }, { http_send_request_ex, INTERNET_STATUS_CONNECTING_TO_SERVER, 1 }, @@ -2493,6 +2822,7 @@ static void test_async_HttpSendRequestEx(void) InternetCloseHandle( ses ); WaitForSingleObject( info.wait, 10000 ); + Sleep(100); CloseHandle( info.wait ); } @@ -2548,8 +2878,11 @@ START_TEST(http) else { init_status_tests(); - InternetReadFile_test(INTERNET_FLAG_ASYNC); - InternetReadFile_test(0); + InternetReadFile_test(INTERNET_FLAG_ASYNC, &test_data[0]); + InternetReadFile_test(0, &test_data[0]); + first_connection_to_test_url = TRUE; + InternetReadFile_test(INTERNET_FLAG_ASYNC, &test_data[1]); + InternetReadFile_test(0, &test_data[1]); InternetReadFileExA_test(INTERNET_FLAG_ASYNC); test_open_url_async(); test_async_HttpSendRequestEx(); @@ -2557,9 +2890,10 @@ START_TEST(http) InternetOpenRequest_test(); test_http_cache(); InternetOpenUrlA_test(); - HttpSendRequestEx_test(); HttpHeaders_test(); test_http_connection(); test_user_agent_header(); test_bogus_accept_types_array(); + InternetReadFile_chunked_test(); + HttpSendRequestEx_test(); } diff --git a/rostests/winetests/wininet/internet.c b/rostests/winetests/wininet/internet.c index 176f3d8f648..fa28b0cbbb4 100644 --- a/rostests/winetests/wininet/internet.c +++ b/rostests/winetests/wininet/internet.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "wininet.h" #include "winerror.h" +#include "winreg.h" #include "wine/test.h" @@ -36,6 +37,18 @@ static BOOL (WINAPI *pInternetTimeFromSystemTimeW)(CONST SYSTEMTIME *,DWORD ,LPW static BOOL (WINAPI *pInternetTimeToSystemTimeA)(LPCSTR ,SYSTEMTIME *,DWORD); static BOOL (WINAPI *pInternetTimeToSystemTimeW)(LPCWSTR ,SYSTEMTIME *,DWORD); static BOOL (WINAPI *pIsDomainLegalCookieDomainW)(LPCWSTR, LPCWSTR); +static DWORD (WINAPI *pPrivacyGetZonePreferenceW)(DWORD, DWORD, LPDWORD, LPWSTR, LPDWORD); +static DWORD (WINAPI *pPrivacySetZonePreferenceW)(DWORD, DWORD, DWORD, LPCWSTR); + +/* Win9x and WinMe don't have lstrcmpW */ +static int strcmp_ww(const WCHAR *str1, const WCHAR *str2) +{ + DWORD len1 = lstrlenW(str1); + DWORD len2 = lstrlenW(str2); + + if (len1 != len2) return 1; + return memcmp(str1, str2, len1 * sizeof(WCHAR)); +} /* ############################### */ @@ -182,7 +195,7 @@ static void test_InternetQueryOptionA(void) if (retval) { ok(!strcmp(useragent,buffer),"Got wrong user agent string %s instead of %s\n",buffer,useragent); - todo_wine ok(len == strlen(useragent),"Got wrong user agent length %d instead of %d\n",len,lstrlenA(useragent)); + ok(len == strlen(useragent),"Got wrong user agent length %d instead of %d\n",len,lstrlenA(useragent)); } ok(err == 0xdeadbeef, "Got wrong error code %d\n",err); HeapFree(GetProcessHeap(),0,buffer); @@ -229,7 +242,7 @@ static void test_InternetQueryOptionA(void) len=0; retval=InternetQueryOptionA(hinet,INTERNET_OPTION_USER_AGENT,NULL,&len); err=GetLastError(); - todo_wine ok(len == 1,"Got wrong user agent length %d instead of %d\n",len,1); + ok(len == 1,"Got wrong user agent length %d instead of %d\n",len,1); ok(retval == 0,"Got wrong return value %d\n",retval); ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code%d\n",err); @@ -463,7 +476,7 @@ static void test_null(void) ok( sz == 1 + lstrlenW(buffer) || sz == lstrlenW(buffer), "sz wrong %d\n", sz); /* before XP SP2, buffer is "server; server" */ - ok( !lstrcmpW(szExpect, buffer) || !lstrcmpW(szServer, buffer), "cookie data wrong\n"); + ok( !strcmp_ww(szExpect, buffer) || !strcmp_ww(szServer, buffer), "cookie data wrong\n"); sz = sizeof(buffer); r = InternetQueryOptionA(NULL, INTERNET_OPTION_CONNECTED_STATE, buffer, &sz); @@ -742,8 +755,9 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_SXS_KEY_NOT_FOUND || + error == ERROR_SUCCESS || /* IE8 on W2K3 */ error == 0xdeadbeef, /* up to IE7 */ - "got %u expected ERROR_SXS_KEY_NOT_FOUND or 0xdeadbeef\n", error); + "unexpected error: %u\n", error); ret = pIsDomainLegalCookieDomainW(gmail_com, gmail_com); ok(ret, "IsDomainLegalCookieDomainW failed\n"); @@ -754,9 +768,9 @@ static void test_IsDomainLegalCookieDomainW(void) ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_SXS_KEY_NOT_FOUND || /* IE8 on XP */ error == ERROR_FILE_NOT_FOUND || /* IE8 on Vista */ + error == ERROR_SUCCESS || /* IE8 on W2K3 */ error == 0xdeadbeef, /* up to IE7 */ - "got %u expected ERROR_SXS_KEY_NOT_FOUND, ERROR_FILE_NOT_FOUND or " - "0xdeadbeef\n", error); + "unexpected error: %u\n", error); ret = pIsDomainLegalCookieDomainW(uk, co_uk); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); @@ -794,6 +808,273 @@ static void test_IsDomainLegalCookieDomainW(void) ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); } +static void test_PrivacyGetSetZonePreferenceW(void) +{ + DWORD ret, zone, type, template, old_template; + + zone = 3; + type = 0; + ret = pPrivacyGetZonePreferenceW(zone, type, NULL, NULL, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); + + old_template = 0; + ret = pPrivacyGetZonePreferenceW(zone, type, &old_template, NULL, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); + + template = 5; + ret = pPrivacySetZonePreferenceW(zone, type, template, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); + + template = 0; + ret = pPrivacyGetZonePreferenceW(zone, type, &template, NULL, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); + ok(template == 5, "expected template == 5, got %u\n", template); + + template = 5; + ret = pPrivacySetZonePreferenceW(zone, type, old_template, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); +} + +static void test_Option_Policy(void) +{ + HINTERNET hinet; + BOOL ret; + + hinet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(hinet != 0, "InternetOpen failed: 0x%08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = InternetSetOptionW(hinet, INTERNET_OPTION_POLICY, NULL, 0); + ok(ret == FALSE, "InternetSetOption should've failed\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError should've " + "given ERROR_INVALID_PARAMETER, gave: 0x%08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = InternetQueryOptionW(hinet, INTERNET_OPTION_POLICY, NULL, 0); + ok(ret == FALSE, "InternetQueryOption should've failed\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError should've " + "given ERROR_INVALID_PARAMETER, gave: 0x%08x\n", GetLastError()); + + ret = InternetCloseHandle(hinet); + ok(ret == TRUE, "InternetCloseHandle failed: 0x%08x\n", GetLastError()); +} + +#define verifyProxyEnable(e) r_verifyProxyEnable(__LINE__, e) +static void r_verifyProxyEnable(LONG l, DWORD exp) +{ + HKEY hkey; + DWORD type, val, size = sizeof(DWORD); + LONG ret; + static const CHAR szInternetSettings[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; + static const CHAR szProxyEnable[] = "ProxyEnable"; + + ret = RegOpenKeyA(HKEY_CURRENT_USER, szInternetSettings, &hkey); + ok_(__FILE__,l) (!ret, "RegOpenKeyA failed: 0x%08x\n", ret); + + ret = RegQueryValueExA(hkey, szProxyEnable, 0, &type, (BYTE*)&val, &size); + ok_(__FILE__,l) (!ret, "RegQueryValueExA failed: 0x%08x\n", ret); + ok_(__FILE__,l) (type == REG_DWORD, "Expected regtype to be REG_DWORD, was: %d\n", type); + ok_(__FILE__,l) (val == exp, "Expected ProxyEnabled to be %d, got: %d\n", exp, val); + + ret = RegCloseKey(hkey); + ok_(__FILE__,l) (!ret, "RegCloseKey failed: 0x%08x\n", ret); +} + +static void test_Option_PerConnectionOption(void) +{ + BOOL ret; + DWORD size = sizeof(INTERNET_PER_CONN_OPTION_LISTW); + INTERNET_PER_CONN_OPTION_LISTW list = {size}; + INTERNET_PER_CONN_OPTIONW *orig_settings; + static WCHAR proxy_srvW[] = {'p','r','o','x','y','.','e','x','a','m','p','l','e',0}; + + /* get the global IE proxy server info, to restore later */ + list.dwOptionCount = 2; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + orig_settings = list.pOptions; + + /* set the global IE proxy server */ + list.dwOptionCount = 2; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[0].Value.pszValue = proxy_srvW; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + list.pOptions[1].Value.dwValue = PROXY_TYPE_PROXY; + + ret = InternetSetOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* get & verify the global IE proxy server */ + list.dwOptionCount = 2; + list.dwOptionError = 0; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + ok(!strcmp_ww(list.pOptions[0].Value.pszValue, proxy_srvW), + "Retrieved proxy server should've been %s, was: %s\n", + wine_dbgstr_w(proxy_srvW), wine_dbgstr_w(list.pOptions[0].Value.pszValue)); + ok(list.pOptions[1].Value.dwValue == PROXY_TYPE_PROXY, + "Retrieved flags should've been PROXY_TYPE_PROXY, was: %d\n", + list.pOptions[1].Value.dwValue); + verifyProxyEnable(1); + + HeapFree(GetProcessHeap(), 0, list.pOptions[0].Value.pszValue); + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* disable the proxy server */ + list.dwOptionCount = 1; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; + list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT; + + ret = InternetSetOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* verify that the proxy is disabled */ + list.dwOptionCount = 1; + list.dwOptionError = 0; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + ok(list.pOptions[0].Value.dwValue == PROXY_TYPE_DIRECT, + "Retrieved flags should've been PROXY_TYPE_DIRECT, was: %d\n", + list.pOptions[0].Value.dwValue); + verifyProxyEnable(0); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* set the proxy flags to 'invalid' value */ + list.dwOptionCount = 1; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; + list.pOptions[0].Value.dwValue = PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT; + + ret = InternetSetOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* verify that the proxy is enabled */ + list.dwOptionCount = 1; + list.dwOptionError = 0; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + todo_wine ok(list.pOptions[0].Value.dwValue == (PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT), + "Retrieved flags should've been PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT, was: %d\n", + list.pOptions[0].Value.dwValue); + verifyProxyEnable(1); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* restore original settings */ + list.dwOptionCount = 2; + list.pOptions = orig_settings; + + ret = InternetSetOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); +} + +static void test_Option_PerConnectionOptionA(void) +{ + BOOL ret; + DWORD size = sizeof(INTERNET_PER_CONN_OPTION_LISTA); + INTERNET_PER_CONN_OPTION_LISTA list = {size}; + INTERNET_PER_CONN_OPTIONA *orig_settings; + char proxy_srv[] = "proxy.example"; + + /* get the global IE proxy server info, to restore later */ + list.dwOptionCount = 2; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONA)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + orig_settings = list.pOptions; + + /* set the global IE proxy server */ + list.dwOptionCount = 2; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONA)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[0].Value.pszValue = proxy_srv; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + list.pOptions[1].Value.dwValue = PROXY_TYPE_PROXY; + + ret = InternetSetOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* get & verify the global IE proxy server */ + list.dwOptionCount = 2; + list.dwOptionError = 0; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONA)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + ok(!lstrcmpA(list.pOptions[0].Value.pszValue, "proxy.example"), + "Retrieved proxy server should've been \"%s\", was: \"%s\"\n", + proxy_srv, list.pOptions[0].Value.pszValue); + ok(list.pOptions[1].Value.dwValue == PROXY_TYPE_PROXY, + "Retrieved flags should've been PROXY_TYPE_PROXY, was: %d\n", + list.pOptions[1].Value.dwValue); + + HeapFree(GetProcessHeap(), 0, list.pOptions[0].Value.pszValue); + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* restore original settings */ + list.dwOptionCount = 2; + list.pOptions = orig_settings; + + ret = InternetSetOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); +} + /* ############################### */ START_TEST(internet) @@ -807,6 +1088,8 @@ START_TEST(internet) pInternetTimeToSystemTimeA = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeA"); pInternetTimeToSystemTimeW = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeW"); pIsDomainLegalCookieDomainW = (void*)GetProcAddress(hdll, (LPCSTR)117); + pPrivacyGetZonePreferenceW = (void*)GetProcAddress(hdll, "PrivacyGetZonePreferenceW"); + pPrivacySetZonePreferenceW = (void*)GetProcAddress(hdll, "PrivacySetZonePreferenceW"); test_InternetCanonicalizeUrlA(); test_InternetQueryOptionA(); @@ -814,6 +1097,9 @@ START_TEST(internet) test_complicated_cookie(); test_version(); test_null(); + test_Option_Policy(); + test_Option_PerConnectionOption(); + test_Option_PerConnectionOptionA(); if (!pInternetTimeFromSystemTimeA) win_skip("skipping the InternetTime tests\n"); @@ -832,4 +1118,9 @@ START_TEST(internet) win_skip("IsDomainLegalCookieDomainW (or ordinal 117) is not available\n"); else test_IsDomainLegalCookieDomainW(); + + if (pPrivacyGetZonePreferenceW && pPrivacySetZonePreferenceW) + test_PrivacyGetSetZonePreferenceW(); + else + win_skip("Privacy[SG]etZonePreferenceW are not available\n"); } diff --git a/rostests/winetests/wininet/url.c b/rostests/winetests/wininet/url.c index 39c02863351..1f012f01422 100644 --- a/rostests/winetests/wininet/url.c +++ b/rostests/winetests/wininet/url.c @@ -23,21 +23,16 @@ #include #include #include +#include #include "windef.h" #include "winbase.h" +#include "winnls.h" #include "wininet.h" #include "wine/test.h" -#define TEST_URL "http://www.winehq.org/site/about" -#define TEST_URL_HOST "www.winehq.org" -#define TEST_URL_PATH "/site/about" -#define TEST_URL2 "http://www.myserver.com/myscript.php?arg=1" -#define TEST_URL2_SERVER "www.myserver.com" -#define TEST_URL2_PATH "/myscript.php" -#define TEST_URL2_PATHEXTRA "/myscript.php?arg=1" -#define TEST_URL2_EXTRA "?arg=1" +#define TEST_URL "http://www.winehq.org/site/about#hi" #define TEST_URL3 "file:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml" #define CREATE_URL1 "http://username:password@www.winehq.org/site/about" @@ -94,6 +89,190 @@ static void zero_compsA( SetLastError(0xfaceabad); } +typedef struct { + const char *url; + int scheme_off; + int scheme_len; + INTERNET_SCHEME scheme; + int host_off; + int host_len; + int host_skip_broken; + INTERNET_PORT port; + int user_off; + int user_len; + int pass_off; + int pass_len; + int path_off; + int path_len; + int extra_off; + int extra_len; +} crack_url_test_t; + +static const crack_url_test_t crack_url_tests[] = { + {"http://www.winehq.org/site/about#hi", + 0, 4, INTERNET_SCHEME_HTTP, 7, 14, -1, 80, -1, 0, -1, 0, 21, 11, 32, 3}, + {"http://www.myserver.com/myscript.php?arg=1", + 0, 4, INTERNET_SCHEME_HTTP, 7, 16, -1, 80, -1, 0, -1, 0, 23, 13, 36, 6}, + {"http://www.winehq.org?test=123", + 0, 4, INTERNET_SCHEME_HTTP, 7, 14, 23, 80, -1, 0, -1, 0, 21, 0, 21, 9}, + {"file:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", + 0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 55, -1, 0}, + {"fide:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", + 0, 4, INTERNET_SCHEME_UNKNOWN, 7, 0, -1, 0, -1, 0, -1, 0, 7, 55, -1, 0}, + {"file://C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", + 0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 54, -1, 0}, +}; + +static void test_crack_url(const crack_url_test_t *test) +{ + WCHAR buf[INTERNET_MAX_URL_LENGTH]; + URL_COMPONENTSW urlw; + URL_COMPONENTSA url; + BOOL b; + + zero_compsA(&url, 1, 1, 1, 1, 1, 1); + + b = InternetCrackUrlA(test->url, strlen(test->url), 0, &url); + ok(b, "InternetCrackUrl failed with error %d\n", GetLastError()); + + if(test->scheme_off == -1) + ok(!url.lpszScheme, "[%s] url.lpszScheme = %p, expected NULL\n", test->url, url.lpszScheme); + else + ok(url.lpszScheme == test->url+test->scheme_off, "[%s] url.lpszScheme = %p, expected %p\n", + test->url, url.lpszScheme, test->url+test->scheme_off); + ok(url.dwSchemeLength == test->scheme_len, "[%s] url.lpszSchemeLength = %d, expected %d\n", + test->url, url.dwSchemeLength, test->scheme_len); + + ok(url.nScheme == test->scheme, "[%s] url.nScheme = %d, expected %d\n", test->url, url.nScheme, test->scheme); + + if(test->host_off == -1) + ok(!url.lpszHostName, "[%s] url.lpszHostName = %p, expected NULL\n", test->url, url.lpszHostName); + else + ok(url.lpszHostName == test->url+test->host_off, "[%s] url.lpszHostName = %p, expected %p\n", + test->url, url.lpszHostName, test->url+test->host_off); + if(test->host_skip_broken != -1 && url.dwHostNameLength == test->host_skip_broken) { + win_skip("skipping broken dwHostNameLength result\n"); + return; + } + ok(url.dwHostNameLength == test->host_len, "[%s] url.lpszHostNameLength = %d, expected %d\n", + test->url, url.dwHostNameLength, test->host_len); + + ok(url.nPort == test->port, "[%s] nPort = %d, expected %d\n", test->url, url.nPort, test->port); + + if(test->user_off == -1) + ok(!url.lpszUserName, "[%s] url.lpszUserName = %p\n", test->url, url.lpszUserName); + else + ok(url.lpszUserName == test->url+test->user_off, "[%s] url.lpszUserName = %p, expected %p\n", + test->url, url.lpszUserName, test->url+test->user_off); + ok(url.dwUserNameLength == test->user_len, "[%s] url.lpszUserNameLength = %d, expected %d\n", + test->url, url.dwUserNameLength, test->user_len); + + if(test->pass_off == -1) + ok(!url.lpszPassword, "[%s] url.lpszPassword = %p\n", test->url, url.lpszPassword); + else + ok(url.lpszPassword == test->url+test->pass_off, "[%s] url.lpszPassword = %p, expected %p\n", + test->url, url.lpszPassword, test->url+test->pass_off); + ok(url.dwPasswordLength == test->pass_len, "[%s] url.lpszPasswordLength = %d, expected %d\n", + test->url, url.dwPasswordLength, test->pass_len); + + if(test->path_off == -1) + ok(!url.lpszUrlPath, "[%s] url.lpszPath = %p, expected NULL\n", test->url, url.lpszUrlPath); + else + ok(url.lpszUrlPath == test->url+test->path_off, "[%s] url.lpszPath = %p, expected %p\n", + test->url, url.lpszUrlPath, test->url+test->path_off); + ok(url.dwUrlPathLength == test->path_len, "[%s] url.lpszUrlPathLength = %d, expected %d\n", + test->url, url.dwUrlPathLength, test->path_len); + + if(test->extra_off == -1) + ok(!url.lpszExtraInfo, "[%s] url.lpszExtraInfo = %p, expected NULL\n", test->url, url.lpszExtraInfo); + else + ok(url.lpszExtraInfo == test->url+test->extra_off, "[%s] url.lpszExtraInfo = %p, expected %p\n", + test->url, url.lpszExtraInfo, test->url+test->extra_off); + ok(url.dwExtraInfoLength == test->extra_len, "[%s] url.lpszExtraInfoLength = %d, expected %d\n", + test->url, url.dwExtraInfoLength, test->extra_len); + + memset(&urlw, 0, sizeof(URL_COMPONENTSW)); + urlw.dwStructSize = sizeof(URL_COMPONENTSW); + urlw.dwSchemeLength = 1; + urlw.dwHostNameLength = 1; + urlw.dwUserNameLength = 1; + urlw.dwPasswordLength = 1; + urlw.dwUrlPathLength = 1; + urlw.dwExtraInfoLength = 1; + + MultiByteToWideChar(CP_ACP, 0, test->url, -1, buf, sizeof(buf)); + b = InternetCrackUrlW(buf, lstrlenW(buf), 0, &urlw); + if(!b && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + win_skip("InternetCrackUrlW is not implemented\n"); + return; + } + ok(b, "InternetCrackUrl failed with error %d\n", GetLastError()); + + if(test->scheme_off == -1) + ok(!urlw.lpszScheme, "[%s] urlw.lpszScheme = %p, expected NULL\n", test->url, urlw.lpszScheme); + else + ok(urlw.lpszScheme == buf+test->scheme_off, "[%s] urlw.lpszScheme = %p, expected %p\n", + test->url, urlw.lpszScheme, buf+test->scheme_off); + ok(urlw.dwSchemeLength == test->scheme_len, "[%s] urlw.lpszSchemeLength = %d, expected %d\n", + test->url, urlw.dwSchemeLength, test->scheme_len); + + ok(urlw.nScheme == test->scheme, "[%s] urlw.nScheme = %d, expected %d\n", test->url, urlw.nScheme, test->scheme); + + if(test->host_off == -1) { + ok(!urlw.lpszHostName, "[%s] urlw.lpszHostName = %p, expected NULL\n", test->url, urlw.lpszHostName); + ok(urlw.dwHostNameLength == 0 || broken(urlw.dwHostNameLength == 1), "[%s] urlw.lpszHostNameLength = %d, expected %d\n", + test->url, urlw.dwHostNameLength, test->host_len); + }else { + ok(urlw.lpszHostName == buf+test->host_off, "[%s] urlw.lpszHostName = %p, expected %p\n", + test->url, urlw.lpszHostName, test->url+test->host_off); + ok(urlw.dwHostNameLength == test->host_len, "[%s] urlw.lpszHostNameLength = %d, expected %d\n", + test->url, urlw.dwHostNameLength, test->host_len); + } + + ok(urlw.nPort == test->port, "[%s] nPort = %d, expected %d\n", test->url, urlw.nPort, test->port); + + if(test->user_off == -1) { + ok(!urlw.lpszUserName, "[%s] urlw.lpszUserName = %p\n", test->url, urlw.lpszUserName); + ok(urlw.dwUserNameLength == 0 || broken(urlw.dwUserNameLength == 1), "[%s] urlw.lpszUserNameLength = %d, expected %d\n", + test->url, urlw.dwUserNameLength, test->user_len); + }else { + ok(urlw.lpszUserName == buf+test->user_off, "[%s] urlw.lpszUserName = %p, expected %p\n", + test->url, urlw.lpszUserName, buf+test->user_off); + ok(urlw.dwUserNameLength == test->user_len, "[%s] urlw.lpszUserNameLength = %d, expected %d\n", + test->url, urlw.dwUserNameLength, test->user_len); + } + + if(test->pass_off == -1) { + ok(!urlw.lpszPassword, "[%s] urlw.lpszPassword = %p\n", test->url, urlw.lpszPassword); + ok(urlw.dwPasswordLength == 0 || broken(urlw.dwPasswordLength), "[%s] urlw.lpszPasswordLength = %d, expected %d\n", + test->url, urlw.dwPasswordLength, test->pass_len); + }else { + ok(urlw.lpszPassword == buf+test->pass_off, "[%s] urlw.lpszPassword = %p, expected %p\n", + test->url, urlw.lpszPassword, buf+test->pass_off); + ok(urlw.dwPasswordLength == test->pass_len, "[%s] urlw.lpszPasswordLength = %d, expected %d\n", + test->url, urlw.dwPasswordLength, test->pass_len); + } + + if(test->path_off == -1) + ok(!urlw.lpszUrlPath, "[%s] urlw.lpszPath = %p, expected NULL\n", test->url, urlw.lpszUrlPath); + else + ok(urlw.lpszUrlPath == buf+test->path_off, "[%s] urlw.lpszPath = %p, expected %p\n", + test->url, urlw.lpszUrlPath, buf+test->path_off); + ok(urlw.dwUrlPathLength == test->path_len, "[%s] urlw.lpszUrlPathLength = %d, expected %d\n", + test->url, urlw.dwUrlPathLength, test->path_len); + + if(test->extra_off == -1) { + ok(!urlw.lpszExtraInfo, "[%s] url.lpszExtraInfo = %p, expected NULL\n", test->url, urlw.lpszExtraInfo); + ok(urlw.dwExtraInfoLength == 0 || broken(urlw.dwExtraInfoLength == 1), "[%s] urlw.lpszExtraInfoLength = %d, expected %d\n", + test->url, urlw.dwExtraInfoLength, test->extra_len); + }else { + ok(urlw.lpszExtraInfo == buf+test->extra_off, "[%s] urlw.lpszExtraInfo = %p, expected %p\n", + test->url, urlw.lpszExtraInfo, buf+test->extra_off); + ok(urlw.dwExtraInfoLength == test->extra_len, "[%s] urlw.lpszExtraInfoLength = %d, expected %d\n", + test->url, urlw.dwExtraInfoLength, test->extra_len); + } +} + static void InternetCrackUrl_test(void) { URL_COMPONENTSA urlSrc, urlComponents; @@ -111,51 +290,6 @@ static void InternetCrackUrl_test(void) urlSrc.lpszUrlPath = path; urlSrc.lpszExtraInfo = extra; - copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 2048, 1024); - ret = InternetCrackUrl(TEST_URL, 0,0,&urlComponents); - ok( ret, "InternetCrackUrl failed, error %d\n",GetLastError()); - ok((strcmp(TEST_URL_PATH,path) == 0),"path cracked wrong\n"); - - /* Bug 1805: Confirm the returned lengths are correct: */ - /* 1. When extra info split out explicitly */ - zero_compsA(&urlComponents, 0, 1, 0, 0, 1, 1); - ok(InternetCrackUrlA(TEST_URL2, 0, 0, &urlComponents),"InternetCrackUrl failed, error %d\n", GetLastError()); - ok(urlComponents.dwUrlPathLength == strlen(TEST_URL2_PATH),".dwUrlPathLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_PATH), urlComponents.dwUrlPathLength); - ok(!strncmp(urlComponents.lpszUrlPath,TEST_URL2_PATH,strlen(TEST_URL2_PATH)),"lpszUrlPath should be %s but is %s\n", TEST_URL2_PATH, urlComponents.lpszUrlPath); - ok(urlComponents.dwHostNameLength == strlen(TEST_URL2_SERVER),".dwHostNameLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_SERVER), urlComponents.dwHostNameLength); - ok(!strncmp(urlComponents.lpszHostName,TEST_URL2_SERVER,strlen(TEST_URL2_SERVER)),"lpszHostName should be %s but is %s\n", TEST_URL2_SERVER, urlComponents.lpszHostName); - ok(urlComponents.dwExtraInfoLength == strlen(TEST_URL2_EXTRA),".dwExtraInfoLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_EXTRA), urlComponents.dwExtraInfoLength); - ok(!strncmp(urlComponents.lpszExtraInfo,TEST_URL2_EXTRA,strlen(TEST_URL2_EXTRA)),"lpszExtraInfo should be %s but is %s\n", TEST_URL2_EXTRA, urlComponents.lpszHostName); - - /* 2. When extra info is not split out explicitly and is in url path */ - zero_compsA(&urlComponents, 0, 1, 0, 0, 1, 0); - ok(InternetCrackUrlA(TEST_URL2, 0, 0, &urlComponents),"InternetCrackUrl failed with GLE %d\n",GetLastError()); - ok(urlComponents.dwUrlPathLength == strlen(TEST_URL2_PATHEXTRA),".dwUrlPathLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_PATHEXTRA), urlComponents.dwUrlPathLength); - ok(!strncmp(urlComponents.lpszUrlPath,TEST_URL2_PATHEXTRA,strlen(TEST_URL2_PATHEXTRA)),"lpszUrlPath should be %s but is %s\n", TEST_URL2_PATHEXTRA, urlComponents.lpszUrlPath); - ok(urlComponents.dwHostNameLength == strlen(TEST_URL2_SERVER),".dwHostNameLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_SERVER), urlComponents.dwHostNameLength); - ok(!strncmp(urlComponents.lpszHostName,TEST_URL2_SERVER,strlen(TEST_URL2_SERVER)),"lpszHostName should be %s but is %s\n", TEST_URL2_SERVER, urlComponents.lpszHostName); - ok(urlComponents.nPort == INTERNET_DEFAULT_HTTP_PORT,"urlComponents->nPort should have been 80 instead of %d\n", urlComponents.nPort); - ok(urlComponents.nScheme == INTERNET_SCHEME_HTTP,"urlComponents->nScheme should have been INTERNET_SCHEME_HTTP instead of %d\n", urlComponents.nScheme); - - zero_compsA(&urlComponents, 1, 1, 1, 1, 1, 1); - ok(InternetCrackUrlA(TEST_URL, strlen(TEST_URL), 0, &urlComponents),"InternetCrackUrl failed with GLE %d\n",GetLastError()); - ok(urlComponents.dwUrlPathLength == strlen(TEST_URL_PATH),".dwUrlPathLength should be %d, but is %d\n", lstrlenA(TEST_URL_PATH), urlComponents.dwUrlPathLength); - ok(!strncmp(urlComponents.lpszUrlPath,TEST_URL_PATH,strlen(TEST_URL_PATH)),"lpszUrlPath should be %s but is %s\n", TEST_URL_PATH, urlComponents.lpszUrlPath); - ok(urlComponents.dwHostNameLength == strlen(TEST_URL_HOST),".dwHostNameLength should be %d, but is %d\n", lstrlenA(TEST_URL_HOST), urlComponents.dwHostNameLength); - ok(!strncmp(urlComponents.lpszHostName,TEST_URL_HOST,strlen(TEST_URL_HOST)),"lpszHostName should be %s but is %s\n", TEST_URL_HOST, urlComponents.lpszHostName); - ok(urlComponents.nPort == INTERNET_DEFAULT_HTTP_PORT,"urlComponents->nPort should have been 80 instead of %d\n", urlComponents.nPort); - ok(urlComponents.nScheme == INTERNET_SCHEME_HTTP,"urlComponents->nScheme should have been INTERNET_SCHEME_HTTP instead of %d\n", urlComponents.nScheme); - ok(!urlComponents.lpszUserName, ".lpszUserName should have been set to NULL\n"); - ok(!urlComponents.lpszPassword, ".lpszPassword should have been set to NULL\n"); - ok(!urlComponents.lpszExtraInfo, ".lpszExtraInfo should have been set to NULL\n"); - ok(!urlComponents.dwUserNameLength,".dwUserNameLength should be 0, but is %d\n", urlComponents.dwUserNameLength); - ok(!urlComponents.dwPasswordLength,".dwPasswordLength should be 0, but is %d\n", urlComponents.dwPasswordLength); - ok(!urlComponents.dwExtraInfoLength,".dwExtraInfoLength should be 0, but is %d\n", urlComponents.dwExtraInfoLength); - - /*3. Check for %20 */ - copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 2048, 1024); - ok(InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents),"InternetCrackUrl failed with GLE %d\n",GetLastError()); - /* Tests for lpsz* members pointing to real strings while * some corresponding length members are set to zero. * As of IE7 (wininet 7.0*?) all members are checked. So we @@ -810,6 +944,11 @@ static void InternetCreateUrlA_test(void) START_TEST(url) { + int i; + + for(i=0; i < sizeof(crack_url_tests)/sizeof(*crack_url_tests); i++) + test_crack_url(crack_url_tests+i); + InternetCrackUrl_test(); InternetCrackUrlW_test(); InternetCreateUrlA_test(); diff --git a/rostests/winetests/wininet/urlcache.c b/rostests/winetests/wininet/urlcache.c index d13597626de..65e433c69de 100644 --- a/rostests/winetests/wininet/urlcache.c +++ b/rostests/winetests/wininet/urlcache.c @@ -25,15 +25,18 @@ #include "windef.h" #include "winbase.h" #include "wininet.h" +#include "winineti.h" #include "wine/test.h" #define TEST_URL "http://urlcachetest.winehq.org/index.html" +#define TEST_URL1 "Visited: user@http://urlcachetest.winehq.org/index.html" static BOOL (WINAPI *pDeleteUrlCacheEntryA)(LPCSTR); static BOOL (WINAPI *pUnlockUrlCacheEntryFileA)(LPCSTR,DWORD); static char filenameA[MAX_PATH + 1]; +static char filenameA1[MAX_PATH + 1]; static void check_cache_entry_infoA(const char *returnedfrom, LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo) { @@ -53,6 +56,7 @@ static void test_find_url_cache_entriesA(void) LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo; cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); hEnumHandle = FindFirstUrlCacheEntry(NULL, NULL, &cbCacheEntryInfo); ok(!hEnumHandle, "FindFirstUrlCacheEntry should have failed\n"); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "FindFirstUrlCacheEntry should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); @@ -67,6 +71,7 @@ static void test_find_url_cache_entriesA(void) found = TRUE; break; } + SetLastError(0xdeadbeef); cbCacheEntryInfo = cbCacheEntryInfoSaved; ret = FindNextUrlCacheEntry(hEnumHandle, lpCacheEntryInfo, &cbCacheEntryInfo); if (!ret) @@ -94,19 +99,37 @@ static void test_GetUrlCacheEntryInfoExA(void) DWORD cbCacheEntryInfo; LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo; + SetLastError(0xdeadbeef); ret = GetUrlCacheEntryInfoEx(NULL, NULL, NULL, NULL, NULL, NULL, 0); ok(!ret, "GetUrlCacheEntryInfoEx with NULL URL and NULL args should have failed\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetUrlCacheEntryInfoEx with NULL URL and NULL args should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "GetUrlCacheEntryInfoEx with NULL URL and NULL args should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); + + cbCacheEntryInfo = sizeof(INTERNET_CACHE_ENTRY_INFO); + SetLastError(0xdeadbeef); + ret = GetUrlCacheEntryInfoEx("", NULL, &cbCacheEntryInfo, NULL, NULL, NULL, 0); + ok(!ret, "GetUrlCacheEntryInfoEx with zero-length buffer should fail\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "GetUrlCacheEntryInfoEx should have set last error to ERROR_FILE_NOT_FOUND instead of %d\n", GetLastError()); ret = GetUrlCacheEntryInfoEx(TEST_URL, NULL, NULL, NULL, NULL, NULL, 0); ok(ret, "GetUrlCacheEntryInfoEx with NULL args failed with error %d\n", GetLastError()); cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); ret = GetUrlCacheEntryInfoEx(TEST_URL, NULL, &cbCacheEntryInfo, NULL, NULL, NULL, 0); ok(!ret, "GetUrlCacheEntryInfoEx with zero-length buffer should fail\n"); - ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetUrlCacheEntryInfoEx should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "GetUrlCacheEntryInfoEx should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); lpCacheEntryInfo = HeapAlloc(GetProcessHeap(), 0, cbCacheEntryInfo); + + SetLastError(0xdeadbeef); + ret = GetUrlCacheEntryInfoEx(TEST_URL, lpCacheEntryInfo, &cbCacheEntryInfo, NULL, NULL, NULL, 0x200); + ok(!ret, "GetUrlCacheEntryInfoEx succeeded\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "GetUrlCacheEntryInfoEx should have set last error to ERROR_FILE_NOT_FOUND instead of %d\n", GetLastError()); + ret = GetUrlCacheEntryInfoEx(TEST_URL, lpCacheEntryInfo, &cbCacheEntryInfo, NULL, NULL, NULL, 0); ok(ret, "GetUrlCacheEntryInfoEx failed with error %d\n", GetLastError()); @@ -161,6 +184,11 @@ static void test_urlcacheA(void) ret = CreateUrlCacheEntry(TEST_URL, 0, "html", filenameA, 0); ok(ret, "CreateUrlCacheEntry failed with error %d\n", GetLastError()); + ret = CreateUrlCacheEntry(TEST_URL, 0, "html", filenameA1, 0); + ok(ret, "CreateUrlCacheEntry failed with error %d\n", GetLastError()); + + ok(lstrcmpiA(filenameA, filenameA1), "expected a different file name\n"); + hFile = CreateFileA(filenameA, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA failed with error %d\n", GetLastError()); @@ -170,13 +198,21 @@ static void test_urlcacheA(void) CloseHandle(hFile); + ret = CommitUrlCacheEntry(TEST_URL1, NULL, filetime_zero, filetime_zero, NORMAL_CACHE_ENTRY|URLHISTORY_CACHE_ENTRY, NULL, 0, NULL, NULL); + ok(ret, "CommitUrlCacheEntry failed with error %d\n", GetLastError()); + + ret = CommitUrlCacheEntry(TEST_URL1, NULL, filetime_zero, filetime_zero, NORMAL_CACHE_ENTRY|URLHISTORY_CACHE_ENTRY, NULL, 0, NULL, NULL); + ok(ret, "CommitUrlCacheEntry failed with error %d\n", GetLastError()); + ret = CommitUrlCacheEntry(TEST_URL, filenameA, filetime_zero, filetime_zero, NORMAL_CACHE_ENTRY, NULL, 0, "html", NULL); ok(ret, "CommitUrlCacheEntry failed with error %d\n", GetLastError()); cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); ret = RetrieveUrlCacheEntryFile(TEST_URL, NULL, &cbCacheEntryInfo, 0); ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n"); - ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "RetrieveUrlCacheEntryFile should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "RetrieveUrlCacheEntryFile should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); lpCacheEntryInfo = HeapAlloc(GetProcessHeap(), 0, cbCacheEntryInfo); ret = RetrieveUrlCacheEntryFile(TEST_URL, lpCacheEntryInfo, &cbCacheEntryInfo, 0); @@ -186,6 +222,13 @@ static void test_urlcacheA(void) HeapFree(GetProcessHeap(), 0, lpCacheEntryInfo); + cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); + ret = RetrieveUrlCacheEntryFile(TEST_URL1, NULL, &cbCacheEntryInfo, 0); + ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n"); + ok(GetLastError() == ERROR_INVALID_DATA, + "RetrieveUrlCacheEntryFile should have set last error to ERROR_INVALID_DATA instead of %d\n", GetLastError()); + if (pUnlockUrlCacheEntryFileA) { ret = pUnlockUrlCacheEntryFileA(TEST_URL, 0); @@ -202,8 +245,11 @@ static void test_urlcacheA(void) { ret = pDeleteUrlCacheEntryA(TEST_URL); ok(ret, "DeleteUrlCacheEntryA failed with error %d\n", GetLastError()); + ret = pDeleteUrlCacheEntryA(TEST_URL1); + ok(ret, "DeleteUrlCacheEntryA failed with error %d\n", GetLastError()); } + SetLastError(0xdeadbeef); ret = DeleteFile(filenameA); todo_wine ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, "local file should no longer exist\n"); @@ -213,12 +259,54 @@ static void test_FindCloseUrlCache(void) { BOOL r; DWORD err; + + SetLastError(0xdeadbeef); r = FindCloseUrlCache(NULL); err = GetLastError(); ok(0 == r, "expected 0, got %d\n", r); ok(ERROR_INVALID_HANDLE == err, "expected %d, got %d\n", ERROR_INVALID_HANDLE, err); } +static void test_GetDiskInfoA(void) +{ + BOOL ret; + DWORD error, cluster_size; + DWORDLONG free, total; + char path[MAX_PATH], *p; + + GetSystemDirectoryA(path, MAX_PATH); + if ((p = strchr(path, '\\'))) *++p = 0; + + ret = GetDiskInfoA(path, &cluster_size, &free, &total); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, &cluster_size, &free, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, &cluster_size, NULL, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, NULL, NULL, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + strcpy(p, "\\non\\existing\\path"); + ret = GetDiskInfoA(path, NULL, NULL, NULL); + error = GetLastError(); + ok(!ret || + broken(ret), /* < IE7 */ + "GetDiskInfoA succeeded\n"); + ok(error == ERROR_PATH_NOT_FOUND || + broken(error == 0xdeadbeef), /* < IE7 */ + "got %u expected ERROR_PATH_NOT_FOUND\n", error); + + SetLastError(0xdeadbeef); + ret = GetDiskInfoA(NULL, NULL, NULL, NULL); + error = GetLastError(); + ok(!ret, "GetDiskInfoA succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error); +} + START_TEST(urlcache) { HMODULE hdll; @@ -227,4 +315,5 @@ START_TEST(urlcache) pUnlockUrlCacheEntryFileA = (void*)GetProcAddress(hdll, "UnlockUrlCacheEntryFileA"); test_urlcacheA(); test_FindCloseUrlCache(); + test_GetDiskInfoA(); } diff --git a/rostests/winetests/wininet/wininet.rbuild b/rostests/winetests/wininet/wininet.rbuild index 4edfeed88fd..f1ce89a34a3 100644 --- a/rostests/winetests/wininet/wininet.rbuild +++ b/rostests/winetests/wininet/wininet.rbuild @@ -3,10 +3,11 @@ . - + wine wininet ws2_32 + advapi32 ntdll ftp.c generated.c From a31725e572e775f05e811aa9f6744e8f6021d010 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 21 Apr 2010 22:33:11 +0000 Subject: [PATCH 174/261] [NTOSKRNL] - Replace the broken CM_RESOURCE_LIST_SIZE with a better function that actually works with resource lists that have device-specific data in them (fixes missing device specific data when resources are retrieved with IoGetDeviceProperty) - Separate the resource code out of pnpmgr.c and into pnpres.c - Simplify resource assigning to simply calling one function, IopAssignDeviceResources, which takes care of the registry configuration, translation, etc. - Set the DNF_NEED_ENUMERATION_ONLY flag only AFTER the device is actually started not before - Set DNF_START_FAILED if IRP_MN_START_DEVICE fails - Fix a bug in IoReportDetectedDevice that wrote the AllocConfig value to wrong place svn path=/trunk/; revision=46983 --- reactos/ntoskrnl/include/internal/io.h | 30 +- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 1149 +-------------------- reactos/ntoskrnl/io/pnpmgr/pnpreport.c | 45 +- reactos/ntoskrnl/io/pnpmgr/pnpres.c | 1158 ++++++++++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 5 files changed, 1209 insertions(+), 1174 deletions(-) create mode 100644 reactos/ntoskrnl/io/pnpmgr/pnpres.c diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 1faff6bfcea..9398ef1d7ff 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -88,21 +88,6 @@ #define IopFreeMdlFromLookaside \ ObpFreeCapturedAttributes -// -// Returns the size of a CM_RESOURCE_LIST -// -#define CM_RESOURCE_LIST_SIZE(ResList) \ - (ResList->Count == 1) ? \ - FIELD_OFFSET( \ - CM_RESOURCE_LIST, \ - List[0].PartialResourceList. \ - PartialDescriptors[(ResList)-> \ - List[0]. \ - PartialResourceList. \ - Count]) \ - : \ - FIELD_OFFSET(CM_RESOURCE_LIST, List) - // // Determines if the IRP is Synchronous // @@ -506,6 +491,21 @@ typedef struct _DEVICETREE_TRAVERSE_CONTEXT PVOID Context; } DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT; +// +// Resource code +// +ULONG +NTAPI +IopCalculateResourceListSize( + IN PCM_RESOURCE_LIST ResourceList +); + +NTSTATUS +NTAPI +IopAssignDeviceResources( + IN PDEVICE_NODE DeviceNode +); + // // PNP Routines // diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 35c7447dc41..dbfada18ed9 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -44,21 +44,6 @@ typedef struct _INVALIDATE_DEVICE_RELATION_DATA } INVALIDATE_DEVICE_RELATION_DATA, *PINVALIDATE_DEVICE_RELATION_DATA; /* FUNCTIONS *****************************************************************/ - -NTSTATUS -IopAssignDeviceResources( - IN PDEVICE_NODE DeviceNode, - OUT ULONG *pRequiredSize); - -NTSTATUS -IopTranslateDeviceResources( - IN PDEVICE_NODE DeviceNode, - IN ULONG RequiredSize); - -NTSTATUS -IopUpdateResourceMapForPnPDevice( - IN PDEVICE_NODE DeviceNode); - NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, @@ -133,7 +118,6 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, ObDereferenceObject(Fdo); IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); - IopDeviceNodeSetFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); return STATUS_SUCCESS; } @@ -156,13 +140,9 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) Stack.MinorFunction = IRP_MN_START_DEVICE; /* Check if we didn't already report the resources */ - // if (!DeviceNode->Flags & DNF_RESOURCE_REPORTED) + if (!(DeviceNode->Flags & DNF_RESOURCE_REPORTED)) { /* Report them */ - if (DeviceNode->Flags & DNF_RESOURCE_REPORTED) - { - DPRINT1("Warning: Setting resource pointers even though DNF_RESOURCE_REPORTED is set\n"); - } Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->ResourceList; Stack.Parameters.StartDevice.AllocatedResourcesTranslated = @@ -176,15 +156,21 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) Status = IopSynchronousCall(DeviceObject, &Stack, &Dummy); if (!NT_SUCCESS(Status)) { - /* FIXME: TODO */ - DPRINT1("Warning: PnP Start failed\n"); - //ASSERT(FALSE); + /* We failed start */ + DeviceNode->Flags |= DNF_START_FAILED; + + /* TODO: Undo all the stuff we did up to this point */ + + DPRINT1("Warning: PnP Start failed (%wZ)\n", &DeviceNode->InstancePath); return; } /* Otherwise, mark us as started */ DeviceNode->Flags |= DNF_STARTED; - + + /* We reported the resources */ + DeviceNode->Flags |= DNF_RESOURCE_REPORTED; + /* We now need enumeration */ DeviceNode->Flags |= DNF_NEED_ENUMERATION_ONLY; } @@ -198,11 +184,12 @@ IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode) PAGED_CODE(); /* Sanity check */ - // ASSERT((DeviceNode->Flags & DNF_ADDED)); - if (!(DeviceNode->Flags & DNF_ADDED)) DPRINT1("Warning: Starting a device node without DNF_ADDED\n"); + // ASSERT((DeviceNode->Flags & DNF_ADDED) || (DeviceNode->Flags & DNF_ENUMERATED)); + if (!(DeviceNode->Flags & DNF_ADDED) && !(DeviceNode->Flags & DNF_ENUMERATED)) + DPRINT1("Warning: Starting a device node without DNF_ADDED or DNF_ENUMERATED (%wZ)\n", + &DeviceNode->InstancePath); ASSERT((DeviceNode->Flags & (DNF_RESOURCE_ASSIGNED | DNF_RESOURCE_REPORTED | - DNF_NO_RESOURCE_REQUIRED | DNF_NO_RESOURCE_REQUIRED))); ASSERT((!(DeviceNode->Flags & (DNF_HAS_PROBLEM | DNF_STARTED | @@ -212,26 +199,27 @@ IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode) DeviceObject = DeviceNode->PhysicalDeviceObject; /* Check if we're not started yet */ - //if (!DeviceNode->Flags & DNF_STARTED) + if (!(DeviceNode->Flags & DNF_STARTED)) { /* Start us */ IopStartDevice2(DeviceObject); } /* Do we need to query IDs? This happens in the case of manual reporting */ - //if (DeviceNode->Flags & DNF_NEED_QUERY_IDS) - //{ - // DPRINT1("Warning: Device node has DNF_NEED_QUERY_IDS\n"); +#if 0 + if (DeviceNode->Flags & DNF_NEED_QUERY_IDS) + { + DPRINT1("Warning: Device node has DNF_NEED_QUERY_IDS\n"); /* And that case shouldn't happen yet */ - // ASSERT(FALSE); - //} + ASSERT(FALSE); + } +#endif /* Make sure we're started, and check if we need enumeration */ if ((DeviceNode->Flags & DNF_STARTED) && (DeviceNode->Flags & DNF_NEED_ENUMERATION_ONLY)) { /* Enumerate us */ - //Status = IopEnumerateDevice(DeviceObject); IoSynchronousInvalidateDeviceRelations(DeviceObject, BusRelations); IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); Status = STATUS_SUCCESS; @@ -250,56 +238,12 @@ NTSTATUS IopStartDevice( PDEVICE_NODE DeviceNode) { - IO_STATUS_BLOCK IoStatusBlock; - IO_STACK_LOCATION Stack; - ULONG RequiredLength; NTSTATUS Status; HANDLE InstanceHandle = INVALID_HANDLE_VALUE, ControlHandle = INVALID_HANDLE_VALUE; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; - IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n"); - Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements; - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_FILTER_RESOURCE_REQUIREMENTS, - &Stack); - if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED) - { - DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); - IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - return Status; - } - else if (NT_SUCCESS(Status)) - { - DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; - } - - Status = IopAssignDeviceResources(DeviceNode, &RequiredLength); - if (NT_SUCCESS(Status)) - { - Status = IopTranslateDeviceResources(DeviceNode, RequiredLength); - if (NT_SUCCESS(Status)) - { - Status = IopUpdateResourceMapForPnPDevice(DeviceNode); - if (!NT_SUCCESS(Status)) - { - DPRINT("IopUpdateResourceMap() failed (Status 0x%08lx)\n", Status); - } - } - else - { - DPRINT("IopTranslateDeviceResources() failed (Status 0x%08lx)\n", Status); - } - } - else - { - DPRINT("IopAssignDeviceResources() failed (Status 0x%08lx)\n", Status); - } - IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - + Status = IopAssignDeviceResources(DeviceNode); if (!NT_SUCCESS(Status)) goto ByeBye; @@ -326,21 +270,8 @@ IopStartDevice( RtlInitUnicodeString(&KeyName, L"ActiveService"); Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_SZ, DeviceNode->ServiceName.Buffer, DeviceNode->ServiceName.Length); // } - - /* FIX: Should be done somewhere in resoure code? */ - if (NT_SUCCESS(Status) && DeviceNode->ResourceList) - { - RtlInitUnicodeString(&KeyName, L"AllocConfig"); - Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_RESOURCE_LIST, - DeviceNode->ResourceList, CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); - } ByeBye: - if (NT_SUCCESS(Status)) - IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); - else - IopDeviceNodeSetFlag(DeviceNode, DNF_START_FAILED); - if (ControlHandle != INVALID_HANDLE_VALUE) ZwClose(ControlHandle); @@ -957,135 +888,6 @@ IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, return STATUS_UNSUCCESSFUL; } -NTSTATUS -IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2Key) -{ - NTSTATUS Status; - ULONG Disposition; - HANDLE PnpMgrLevel1, PnpMgrLevel2, ResourceMapKey; - UNICODE_STRING KeyName; - OBJECT_ATTRIBUTES ObjectAttributes; - - RtlInitUnicodeString(&KeyName, - L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - 0, - NULL); - Status = ZwCreateKey(&ResourceMapKey, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - if (!NT_SUCCESS(Status)) - return Status; - - RtlInitUnicodeString(&KeyName, Level1Key); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - ResourceMapKey, - NULL); - Status = ZwCreateKey(&PnpMgrLevel1, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - ZwClose(ResourceMapKey); - if (!NT_SUCCESS(Status)) - return Status; - - RtlInitUnicodeString(&KeyName, Level2Key); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - PnpMgrLevel1, - NULL); - Status = ZwCreateKey(&PnpMgrLevel2, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - ZwClose(PnpMgrLevel1); - if (!NT_SUCCESS(Status)) - return Status; - - if (DeviceNode->ResourceList) - { - WCHAR NameBuff[256]; - UNICODE_STRING NameU; - UNICODE_STRING Suffix; - ULONG OldLength; - - ASSERT(DeviceNode->ResourceListTranslated); - - NameU.Buffer = NameBuff; - NameU.Length = 0; - NameU.MaximumLength = 256 * sizeof(WCHAR); - - Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, - DevicePropertyPhysicalDeviceObjectName, - NameU.MaximumLength, - NameU.Buffer, - &OldLength); - ASSERT(Status == STATUS_SUCCESS); - - NameU.Length = (USHORT)OldLength; - - RtlInitUnicodeString(&Suffix, L".Raw"); - RtlAppendUnicodeStringToString(&NameU, &Suffix); - - Status = ZwSetValueKey(PnpMgrLevel2, - &NameU, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceList, - CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); - if (!NT_SUCCESS(Status)) - { - ZwClose(PnpMgrLevel2); - return Status; - } - - /* "Remove" the suffix by setting the length back to what it used to be */ - NameU.Length = (USHORT)OldLength; - - RtlInitUnicodeString(&Suffix, L".Translated"); - RtlAppendUnicodeStringToString(&NameU, &Suffix); - - Status = ZwSetValueKey(PnpMgrLevel2, - &NameU, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceListTranslated, - CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceListTranslated)); - ZwClose(PnpMgrLevel2); - if (!NT_SUCCESS(Status)) - return Status; - } - else - { - ZwClose(PnpMgrLevel2); - } - - IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED); - - return STATUS_SUCCESS; -} - -NTSTATUS -IopUpdateResourceMapForPnPDevice(IN PDEVICE_NODE DeviceNode) -{ - return IopUpdateResourceMap(DeviceNode, L"PnP Manager", L"PnpManager"); -} - NTSTATUS IopSetDeviceInstanceData(HANDLE InstanceKey, PDEVICE_NODE DeviceNode) @@ -1094,7 +896,7 @@ IopSetDeviceInstanceData(HANDLE InstanceKey, UNICODE_STRING KeyName; HANDLE LogConfKey; ULONG ResCount; - ULONG ListSize, ResultLength; + ULONG ResultLength; NTSTATUS Status; HANDLE ControlHandle; @@ -1122,15 +924,13 @@ IopSetDeviceInstanceData(HANDLE InstanceKey, ResCount = DeviceNode->BootResources->Count; if (ResCount != 0) { - ListSize = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); - RtlInitUnicodeString(&KeyName, L"BootConfig"); Status = ZwSetValueKey(LogConfKey, &KeyName, 0, REG_RESOURCE_LIST, DeviceNode->BootResources, - ListSize); + IopCalculateResourceListSize(DeviceNode->BootResources)); } } @@ -1187,894 +987,6 @@ IopSetDeviceInstanceData(HANDLE InstanceKey, return Status; } -BOOLEAN -IopCheckResourceDescriptor( - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc, - IN PCM_RESOURCE_LIST ResourceList, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - ULONG i, ii; - BOOLEAN Result = FALSE; - - if (ResDesc->ShareDisposition == CmResourceShareShared) - return FALSE; - - for (i = 0; i < ResourceList->Count; i++) - { - PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList; - for (ii = 0; ii < ResList->Count; ii++) - { - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList->PartialDescriptors[ii]; - - /* We don't care about shared resources */ - if (ResDesc->ShareDisposition == CmResourceShareShared && - ResDesc2->ShareDisposition == CmResourceShareShared) - continue; - - /* Make sure we're comparing the same types */ - if (ResDesc->Type != ResDesc2->Type) - continue; - - switch (ResDesc->Type) - { - case CmResourceTypeMemory: - if ((ResDesc->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && - ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length > - ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < - ResDesc->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + - ResDesc2->u.Memory.Length > ResDesc->u.Memory.Start.QuadPart)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Memory (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.Memory.Start.QuadPart, ResDesc->u.Memory.Start.QuadPart + - ResDesc->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart, - ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypePort: - if ((ResDesc->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && - ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length > - ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < - ResDesc->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + - ResDesc2->u.Port.Length > ResDesc->u.Port.Start.QuadPart)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Port (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.Port.Start.QuadPart, ResDesc->u.Port.Start.QuadPart + - ResDesc->u.Port.Length, ResDesc2->u.Port.Start.QuadPart, - ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeInterrupt: - if (ResDesc->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector) - { - if (!Silent) - { - DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n", - ResDesc->u.Interrupt.Vector, ResDesc->u.Interrupt.Level, - ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeBusNumber: - if ((ResDesc->u.BusNumber.Start < ResDesc2->u.BusNumber.Start && - ResDesc->u.BusNumber.Start + ResDesc->u.BusNumber.Length > - ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start < - ResDesc->u.BusNumber.Start && ResDesc2->u.BusNumber.Start + - ResDesc2->u.BusNumber.Length > ResDesc->u.BusNumber.Start)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.BusNumber.Start, ResDesc->u.BusNumber.Start + - ResDesc->u.BusNumber.Length, ResDesc2->u.BusNumber.Start, - ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeDma: - if (ResDesc->u.Dma.Channel == ResDesc2->u.Dma.Channel) - { - if (!Silent) - { - DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n", - ResDesc->u.Dma.Channel, ResDesc->u.Dma.Port, - ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port); - } - - Result = TRUE; - - goto ByeBye; - } - break; - } - } - } - -ByeBye: - - if (Result && ConflictingDescriptor) - { - RtlCopyMemory(ConflictingDescriptor, - ResDesc, - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); - } - - return Result; -} - - -BOOLEAN -IopCheckForResourceConflict( - IN PCM_RESOURCE_LIST ResourceList1, - IN PCM_RESOURCE_LIST ResourceList2, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - ULONG i, ii; - BOOLEAN Result = FALSE; - - for (i = 0; i < ResourceList1->Count; i++) - { - PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList1->List[i].PartialResourceList; - for (ii = 0; ii < ResList->Count; ii++) - { - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc = &ResList->PartialDescriptors[ii]; - - Result = IopCheckResourceDescriptor(ResDesc, - ResourceList2, - Silent, - ConflictingDescriptor); - if (Result) goto ByeBye; - } - } - - -ByeBye: - - return Result; -} - -NTSTATUS -IopDetectResourceConflict( - IN PCM_RESOURCE_LIST ResourceList, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName; - HANDLE ResourceMapKey = INVALID_HANDLE_VALUE, ChildKey2 = INVALID_HANDLE_VALUE, ChildKey3 = INVALID_HANDLE_VALUE; - ULONG KeyInformationLength, RequiredLength, KeyValueInformationLength, KeyNameInformationLength; - PKEY_BASIC_INFORMATION KeyInformation; - PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; - PKEY_VALUE_BASIC_INFORMATION KeyNameInformation; - ULONG ChildKeyIndex1 = 0, ChildKeyIndex2 = 0, ChildKeyIndex3 = 0; - NTSTATUS Status; - - RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); - InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, 0, NULL); - Status = ZwOpenKey(&ResourceMapKey, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - /* The key is missing which means we are the first device */ - return STATUS_SUCCESS; - } - - while (TRUE) - { - Status = ZwEnumerateKey(ResourceMapKey, - ChildKeyIndex1, - KeyBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) - { - KeyInformationLength = RequiredLength; - KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); - if (!KeyInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateKey(ResourceMapKey, - ChildKeyIndex1, - KeyBasicInformation, - KeyInformation, - KeyInformationLength, - &RequiredLength); - } - else - goto cleanup; - ChildKeyIndex1++; - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyName.Buffer = KeyInformation->Name; - KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - ResourceMapKey, - NULL); - Status = ZwOpenKey(&ChildKey2, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); - ExFreePool(KeyInformation); - if (!NT_SUCCESS(Status)) - goto cleanup; - - while (TRUE) - { - Status = ZwEnumerateKey(ChildKey2, - ChildKeyIndex2, - KeyBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyInformationLength = RequiredLength; - KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); - if (!KeyInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateKey(ChildKey2, - ChildKeyIndex2, - KeyBasicInformation, - KeyInformation, - KeyInformationLength, - &RequiredLength); - } - else - goto cleanup; - ChildKeyIndex2++; - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyName.Buffer = KeyInformation->Name; - KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - ChildKey2, - NULL); - Status = ZwOpenKey(&ChildKey3, KEY_QUERY_VALUE, &ObjectAttributes); - ExFreePool(KeyInformation); - if (!NT_SUCCESS(Status)) - goto cleanup; - - while (TRUE) - { - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValuePartialInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyValueInformationLength = RequiredLength; - KeyValueInformation = ExAllocatePool(PagedPool, KeyValueInformationLength); - if (!KeyValueInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValuePartialInformation, - KeyValueInformation, - KeyValueInformationLength, - &RequiredLength); - } - else - goto cleanup; - if (!NT_SUCCESS(Status)) - goto cleanup; - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValueBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyNameInformationLength = RequiredLength; - KeyNameInformation = ExAllocatePool(PagedPool, KeyNameInformationLength + sizeof(WCHAR)); - if (!KeyNameInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValueBasicInformation, - KeyNameInformation, - KeyNameInformationLength, - &RequiredLength); - } - else - goto cleanup; - - ChildKeyIndex3++; - - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyNameInformation->Name[KeyNameInformation->NameLength / sizeof(WCHAR)] = UNICODE_NULL; - - /* Skip translated entries */ - if (wcsstr(KeyNameInformation->Name, L".Translated")) - { - ExFreePool(KeyNameInformation); - continue; - } - - ExFreePool(KeyNameInformation); - - if (IopCheckForResourceConflict(ResourceList, - (PCM_RESOURCE_LIST)KeyValueInformation->Data, - Silent, - ConflictingDescriptor)) - { - ExFreePool(KeyValueInformation); - Status = STATUS_CONFLICTING_ADDRESSES; - goto cleanup; - } - - ExFreePool(KeyValueInformation); - } - } - } - -cleanup: - if (ResourceMapKey != INVALID_HANDLE_VALUE) - ZwClose(ResourceMapKey); - if (ChildKey2 != INVALID_HANDLE_VALUE) - ZwClose(ChildKey2); - if (ChildKey3 != INVALID_HANDLE_VALUE) - ZwClose(ChildKey3); - - if (Status == STATUS_NO_MORE_ENTRIES) - Status = STATUS_SUCCESS; - - return Status; -} - -BOOLEAN -IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - CM_RESOURCE_LIST CmList; - NTSTATUS Status; - - CmList.Count = 1; - CmList.List[0].InterfaceType = InterfaceTypeUndefined; - CmList.List[0].BusNumber = 0; - CmList.List[0].PartialResourceList.Version = 1; - CmList.List[0].PartialResourceList.Revision = 1; - CmList.List[0].PartialResourceList.Count = 1; - CmList.List[0].PartialResourceList.PartialDescriptors[0] = *CmDesc; - - Status = IopDetectResourceConflict(&CmList, TRUE, ConflictingDescriptor); - if (Status == STATUS_CONFLICTING_ADDRESSES) - return TRUE; - - return FALSE; -} - -BOOLEAN -IopFindBusNumberResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeBusNumber); - - for (Start = IoDesc->u.BusNumber.MinBusNumber; - Start < IoDesc->u.BusNumber.MaxBusNumber; - Start++) - { - CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length; - CmDesc->u.BusNumber.Start = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.BusNumber.Start + ConflictingDesc.u.BusNumber.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -BOOLEAN -IopFindMemoryResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONGLONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeMemory); - - for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart; - Start < IoDesc->u.Memory.MaximumAddress.QuadPart; - Start++) - { - CmDesc->u.Memory.Length = IoDesc->u.Memory.Length; - CmDesc->u.Memory.Start.QuadPart = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.Memory.Start.QuadPart + ConflictingDesc.u.Memory.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -BOOLEAN -IopFindPortResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONGLONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypePort); - - for (Start = IoDesc->u.Port.MinimumAddress.QuadPart; - Start < IoDesc->u.Port.MaximumAddress.QuadPart; - Start++) - { - CmDesc->u.Port.Length = IoDesc->u.Port.Length; - CmDesc->u.Port.Start.QuadPart = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.Port.Start.QuadPart + ConflictingDesc.u.Port.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -BOOLEAN -IopFindDmaResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Channel; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeDma); - - for (Channel = IoDesc->u.Dma.MinimumChannel; - Channel < IoDesc->u.Dma.MaximumChannel; - Channel++) - { - CmDesc->u.Dma.Channel = Channel; - CmDesc->u.Dma.Port = 0; - - if (!IopCheckDescriptorForConflict(CmDesc, NULL)) - return TRUE; - } - - return FALSE; -} - -BOOLEAN -IopFindInterruptResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Vector; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeInterrupt); - - for (Vector = IoDesc->u.Interrupt.MinimumVector; - Vector < IoDesc->u.Interrupt.MaximumVector; - Vector++) - { - CmDesc->u.Interrupt.Vector = Vector; - CmDesc->u.Interrupt.Level = Vector; - CmDesc->u.Interrupt.Affinity = (KAFFINITY)-1; - - if (!IopCheckDescriptorForConflict(CmDesc, NULL)) - return TRUE; - } - - return FALSE; -} - -NTSTATUS -IopCreateResourceListFromRequirements( - IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, - OUT PCM_RESOURCE_LIST *ResourceList) -{ - ULONG i, ii, Size; - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc; - - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < RequirementsList->AlternativeLists; i++) - { - PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - } - - *ResourceList = ExAllocatePool(PagedPool, Size); - if (!*ResourceList) - return STATUS_INSUFFICIENT_RESOURCES; - - (*ResourceList)->Count = 1; - (*ResourceList)->List[0].BusNumber = RequirementsList->BusNumber; - (*ResourceList)->List[0].InterfaceType = RequirementsList->InterfaceType; - (*ResourceList)->List[0].PartialResourceList.Version = 1; - (*ResourceList)->List[0].PartialResourceList.Revision = 1; - (*ResourceList)->List[0].PartialResourceList.Count = 0; - - ResDesc = &(*ResourceList)->List[0].PartialResourceList.PartialDescriptors[0]; - - for (i = 0; i < RequirementsList->AlternativeLists; i++) - { - PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; - for (ii = 0; ii < ResList->Count; ii++) - { - PIO_RESOURCE_DESCRIPTOR ReqDesc = &ResList->Descriptors[ii]; - - /* FIXME: Handle alternate ranges */ - if (ReqDesc->Option == IO_RESOURCE_ALTERNATIVE) - continue; - - ResDesc->Type = ReqDesc->Type; - ResDesc->Flags = ReqDesc->Flags; - ResDesc->ShareDisposition = ReqDesc->ShareDisposition; - - switch (ReqDesc->Type) - { - case CmResourceTypeInterrupt: - if (!IopFindInterruptResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available interrupt resource (0x%x to 0x%x)\n", - ReqDesc->u.Interrupt.MinimumVector, ReqDesc->u.Interrupt.MaximumVector); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypePort: - if (!IopFindPortResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available port resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.Port.MinimumAddress.QuadPart, ReqDesc->u.Port.MaximumAddress.QuadPart, - ReqDesc->u.Port.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeMemory: - if (!IopFindMemoryResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available memory resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.Memory.MinimumAddress.QuadPart, ReqDesc->u.Memory.MaximumAddress.QuadPart, - ReqDesc->u.Memory.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeBusNumber: - if (!IopFindBusNumberResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available bus number resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.BusNumber.MinBusNumber, ReqDesc->u.BusNumber.MaxBusNumber, - ReqDesc->u.BusNumber.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeDma: - if (!IopFindDmaResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available dma resource (0x%x to 0x%x)\n", - ReqDesc->u.Dma.MinimumChannel, ReqDesc->u.Dma.MaximumChannel); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - default: - DPRINT1("Unsupported resource type: %x\n", ReqDesc->Type); - break; - } - - (*ResourceList)->List[0].PartialResourceList.Count++; - ResDesc++; - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS -IopAssignDeviceResources( - IN PDEVICE_NODE DeviceNode, - OUT ULONG *pRequiredSize) -{ - PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; - ULONG Size; - ULONG i; - ULONG j; - NTSTATUS Status; - - if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) - { - /* No resource needed for this device */ - DeviceNode->ResourceList = NULL; - *pRequiredSize = 0; - return STATUS_SUCCESS; - } - - /* Fill DeviceNode->ResourceList - * FIXME: the PnP arbiter should go there! - * Actually, use the BootResources if provided, else the resource requirements - */ - - if (DeviceNode->BootResources) - { - /* Browse the boot resources to know if we have some custom structures */ - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < DeviceNode->BootResources->Count; i++) - { - pPartialResourceList = &DeviceNode->BootResources->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + - pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - for (j = 0; j < pPartialResourceList->Count; j++) - { - if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) - Size += pPartialResourceList->PartialDescriptors[j].u.DeviceSpecificData.DataSize; - } - } - - DeviceNode->ResourceList = ExAllocatePool(PagedPool, Size); - if (!DeviceNode->ResourceList) - { - Status = STATUS_NO_MEMORY; - goto ByeBye; - } - RtlCopyMemory(DeviceNode->ResourceList, DeviceNode->BootResources, Size); - - Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); - if (NT_SUCCESS(Status) || !DeviceNode->ResourceRequirements) - { - if (!NT_SUCCESS(Status) && !DeviceNode->ResourceRequirements) - { - DPRINT1("Using conflicting boot resources because no requirements were supplied!\n"); - } - - *pRequiredSize = Size; - return STATUS_SUCCESS; - } - else - { - DPRINT1("Boot resources for %wZ cause a resource conflict!\n", &DeviceNode->InstancePath); - ExFreePool(DeviceNode->ResourceList); - } - } - - Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements, - &DeviceNode->ResourceList); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < DeviceNode->ResourceList->Count; i++) - { - pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + - pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - } - - Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - *pRequiredSize = Size; - return STATUS_SUCCESS; - -ByeBye: - if (DeviceNode->ResourceList) - { - ExFreePool(DeviceNode->ResourceList); - DeviceNode->ResourceList = NULL; - } - *pRequiredSize = 0; - return Status; -} - - -NTSTATUS -IopTranslateDeviceResources( - IN PDEVICE_NODE DeviceNode, - IN ULONG RequiredSize) -{ - PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw, DescriptorTranslated; - ULONG i, j; - NTSTATUS Status; - - if (!DeviceNode->ResourceList) - { - DeviceNode->ResourceListTranslated = NULL; - return STATUS_SUCCESS; - } - - /* That's easy to translate a resource list. Just copy the - * untranslated one and change few fields in the copy - */ - DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, RequiredSize); - if (!DeviceNode->ResourceListTranslated) - { - Status =STATUS_NO_MEMORY; - goto cleanup; - } - RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, RequiredSize); - - for (i = 0; i < DeviceNode->ResourceList->Count; i++) - { - pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; - for (j = 0; j < pPartialResourceList->Count; j++) - { - DescriptorRaw = &pPartialResourceList->PartialDescriptors[j]; - DescriptorTranslated = &DeviceNode->ResourceListTranslated->List[i].PartialResourceList.PartialDescriptors[j]; - switch (DescriptorRaw->Type) - { - case CmResourceTypePort: - { - ULONG AddressSpace = 1; /* IO space */ - if (!HalTranslateBusAddress( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Port.Start, - &AddressSpace, - &DescriptorTranslated->u.Port.Start)) - { - Status = STATUS_UNSUCCESSFUL; - goto cleanup; - } - break; - } - case CmResourceTypeInterrupt: - { - DescriptorTranslated->u.Interrupt.Vector = HalGetInterruptVector( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Interrupt.Level, - DescriptorRaw->u.Interrupt.Vector, - (PKIRQL)&DescriptorTranslated->u.Interrupt.Level, - &DescriptorRaw->u.Interrupt.Affinity); - break; - } - case CmResourceTypeMemory: - { - ULONG AddressSpace = 0; /* Memory space */ - if (!HalTranslateBusAddress( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Memory.Start, - &AddressSpace, - &DescriptorTranslated->u.Memory.Start)) - { - Status = STATUS_UNSUCCESSFUL; - goto cleanup; - } - } - - case CmResourceTypeDma: - case CmResourceTypeBusNumber: - case CmResourceTypeDeviceSpecific: - /* Nothing to do */ - break; - default: - DPRINT1("Unknown resource descriptor type 0x%x\n", DescriptorRaw->Type); - Status = STATUS_NOT_IMPLEMENTED; - goto cleanup; - } - } - } - return STATUS_SUCCESS; - -cleanup: - /* Yes! Also delete ResourceList because ResourceList and - * ResourceListTranslated should be a pair! */ - ExFreePool(DeviceNode->ResourceList); - DeviceNode->ResourceList = NULL; - if (DeviceNode->ResourceListTranslated) - { - ExFreePool(DeviceNode->ResourceListTranslated); - DeviceNode->ResourceList = NULL; - } - return Status; -} - - /* * IopGetParentIdPrefix * @@ -2608,10 +1520,6 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, { DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; - if (IoStatusBlock.Information) - IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_REPORTED); - else - IopDeviceNodeSetFlag(DeviceNode, DNF_NO_RESOURCE_REQUIRED); } else { @@ -2619,7 +1527,6 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, DeviceNode->ResourceRequirements = NULL; } - if (InstanceKey != NULL) { IopSetDeviceInstanceData(InstanceKey, DeviceNode); @@ -4285,7 +3192,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, Length = 0; if (DeviceNode->BootResources->Count != 0) { - Length = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); + Length = IopCalculateResourceListSize(DeviceNode->BootResources); } Data = DeviceNode->BootResources; break; @@ -4295,7 +3202,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, Length = 0; if (DeviceNode->BootResources->Count != 0) { - Length = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); + Length = IopCalculateResourceListSize(DeviceNode->BootResources); } Data = DeviceNode->BootResources; break; diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpreport.c b/reactos/ntoskrnl/io/pnpmgr/pnpreport.c index 4995b16fd65..f69bce02721 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpreport.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpreport.c @@ -18,28 +18,14 @@ IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, IN ULONG CreateOptions, OUT PHANDLE Handle); -NTSTATUS -IopAssignDeviceResources( - IN PDEVICE_NODE DeviceNode, - OUT ULONG *pRequiredSize); - NTSTATUS IopSetDeviceInstanceData(HANDLE InstanceKey, PDEVICE_NODE DeviceNode); -NTSTATUS -IopTranslateDeviceResources( - IN PDEVICE_NODE DeviceNode, - IN ULONG RequiredSize); - NTSTATUS IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, PVOID Context); -NTSTATUS -IopUpdateResourceMapForPnPDevice( - IN PDEVICE_NODE DeviceNode); - NTSTATUS IopDetectResourceConflict( IN PCM_RESOURCE_LIST ResourceList); @@ -189,6 +175,11 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, /* We don't send IRP_MN_START_DEVICE */ IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + /* We need to get device IDs */ +#if 0 + IopDeviceNodeSetFlag(DeviceNode, DNF_NEED_QUERY_IDS); +#endif + /* This is a legacy driver for this device */ IopDeviceNodeSetFlag(DeviceNode, DNF_LEGACY_DRIVER); @@ -258,9 +249,7 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, if (DeviceNode->BootResources) IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); - if (DeviceNode->ResourceRequirements) - IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_REPORTED); - else + if (!DeviceNode->ResourceRequirements && !DeviceNode->BootResources) IopDeviceNodeSetFlag(DeviceNode, DNF_NO_RESOURCE_REQUIRED); /* Write the resource information to the registry */ @@ -269,27 +258,7 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, /* If the caller didn't get the resources assigned for us, do it now */ if (!ResourceAssigned) { - IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - Status = IopAssignDeviceResources(DeviceNode, &RequiredLength); - if (NT_SUCCESS(Status)) - { - Status = IopTranslateDeviceResources(DeviceNode, RequiredLength); - if (NT_SUCCESS(Status)) - { - Status = IopUpdateResourceMapForPnPDevice(DeviceNode); - if (NT_SUCCESS(Status) && DeviceNode->ResourceList) - { - RtlInitUnicodeString(&ValueName, L"AllocConfig"); - Status = ZwSetValueKey(InstanceKey, - &ValueName, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceList, - CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); - } - } - } - IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + Status = IopAssignDeviceResources(DeviceNode); /* See if we failed */ if (!NT_SUCCESS(Status)) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpres.c b/reactos/ntoskrnl/io/pnpmgr/pnpres.c new file mode 100644 index 00000000000..32a746ee26f --- /dev/null +++ b/reactos/ntoskrnl/io/pnpmgr/pnpres.c @@ -0,0 +1,1158 @@ +/* + * PROJECT: ReactOS Kernel + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/io/pnpmgr/pnpres.c + * PURPOSE: Resource handling code + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + * ReactOS Portable Systems Group + */ + +#include + +#define NDEBUG +#include + +NTSTATUS +IopDetectResourceConflict( + IN PCM_RESOURCE_LIST ResourceList, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor); + +ULONG +NTAPI +IopCalculateResourceListSize( + IN PCM_RESOURCE_LIST ResourceList) +{ + ULONG Size, i, j; + PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; + + Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); + for (i = 0; i < ResourceList->Count; i++) + { + pPartialResourceList = &ResourceList->List[i].PartialResourceList; + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + for (j = 0; j < pPartialResourceList->Count; j++) + { + if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) + Size += pPartialResourceList->PartialDescriptors[j].u.DeviceSpecificData.DataSize; + } + } + + return Size; +} + +static +BOOLEAN +IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + CM_RESOURCE_LIST CmList; + NTSTATUS Status; + + CmList.Count = 1; + CmList.List[0].InterfaceType = InterfaceTypeUndefined; + CmList.List[0].BusNumber = 0; + CmList.List[0].PartialResourceList.Version = 1; + CmList.List[0].PartialResourceList.Revision = 1; + CmList.List[0].PartialResourceList.Count = 1; + CmList.List[0].PartialResourceList.PartialDescriptors[0] = *CmDesc; + + Status = IopDetectResourceConflict(&CmList, TRUE, ConflictingDescriptor); + if (Status == STATUS_CONFLICTING_ADDRESSES) + return TRUE; + + return FALSE; +} + +static +BOOLEAN +IopFindBusNumberResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeBusNumber); + + for (Start = IoDesc->u.BusNumber.MinBusNumber; + Start < IoDesc->u.BusNumber.MaxBusNumber; + Start++) + { + CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length; + CmDesc->u.BusNumber.Start = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.BusNumber.Start + ConflictingDesc.u.BusNumber.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +static +BOOLEAN +IopFindMemoryResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONGLONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeMemory); + + for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart; + Start < IoDesc->u.Memory.MaximumAddress.QuadPart; + Start++) + { + CmDesc->u.Memory.Length = IoDesc->u.Memory.Length; + CmDesc->u.Memory.Start.QuadPart = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.Memory.Start.QuadPart + ConflictingDesc.u.Memory.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +static +BOOLEAN +IopFindPortResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONGLONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypePort); + + for (Start = IoDesc->u.Port.MinimumAddress.QuadPart; + Start < IoDesc->u.Port.MaximumAddress.QuadPart; + Start++) + { + CmDesc->u.Port.Length = IoDesc->u.Port.Length; + CmDesc->u.Port.Start.QuadPart = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.Port.Start.QuadPart + ConflictingDesc.u.Port.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +static +BOOLEAN +IopFindDmaResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Channel; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeDma); + + for (Channel = IoDesc->u.Dma.MinimumChannel; + Channel < IoDesc->u.Dma.MaximumChannel; + Channel++) + { + CmDesc->u.Dma.Channel = Channel; + CmDesc->u.Dma.Port = 0; + + if (!IopCheckDescriptorForConflict(CmDesc, NULL)) + return TRUE; + } + + return FALSE; +} + +static +BOOLEAN +IopFindInterruptResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Vector; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeInterrupt); + + for (Vector = IoDesc->u.Interrupt.MinimumVector; + Vector < IoDesc->u.Interrupt.MaximumVector; + Vector++) + { + CmDesc->u.Interrupt.Vector = Vector; + CmDesc->u.Interrupt.Level = Vector; + CmDesc->u.Interrupt.Affinity = (KAFFINITY)-1; + + if (!IopCheckDescriptorForConflict(CmDesc, NULL)) + return TRUE; + } + + return FALSE; +} + +static +NTSTATUS +IopCreateResourceListFromRequirements( + IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, + OUT PCM_RESOURCE_LIST *ResourceList) +{ + ULONG i, ii, Size; + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc; + + Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); + for (i = 0; i < RequirementsList->AlternativeLists; i++) + { + PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + } + + *ResourceList = ExAllocatePool(PagedPool, Size); + if (!*ResourceList) + return STATUS_INSUFFICIENT_RESOURCES; + + (*ResourceList)->Count = 1; + (*ResourceList)->List[0].BusNumber = RequirementsList->BusNumber; + (*ResourceList)->List[0].InterfaceType = RequirementsList->InterfaceType; + (*ResourceList)->List[0].PartialResourceList.Version = 1; + (*ResourceList)->List[0].PartialResourceList.Revision = 1; + (*ResourceList)->List[0].PartialResourceList.Count = 0; + + ResDesc = &(*ResourceList)->List[0].PartialResourceList.PartialDescriptors[0]; + + for (i = 0; i < RequirementsList->AlternativeLists; i++) + { + PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; + for (ii = 0; ii < ResList->Count; ii++) + { + PIO_RESOURCE_DESCRIPTOR ReqDesc = &ResList->Descriptors[ii]; + + /* FIXME: Handle alternate ranges */ + if (ReqDesc->Option == IO_RESOURCE_ALTERNATIVE) + continue; + + ResDesc->Type = ReqDesc->Type; + ResDesc->Flags = ReqDesc->Flags; + ResDesc->ShareDisposition = ReqDesc->ShareDisposition; + + switch (ReqDesc->Type) + { + case CmResourceTypeInterrupt: + if (!IopFindInterruptResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available interrupt resource (0x%x to 0x%x)\n", + ReqDesc->u.Interrupt.MinimumVector, ReqDesc->u.Interrupt.MaximumVector); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypePort: + if (!IopFindPortResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available port resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.Port.MinimumAddress.QuadPart, ReqDesc->u.Port.MaximumAddress.QuadPart, + ReqDesc->u.Port.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeMemory: + if (!IopFindMemoryResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available memory resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.Memory.MinimumAddress.QuadPart, ReqDesc->u.Memory.MaximumAddress.QuadPart, + ReqDesc->u.Memory.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeBusNumber: + if (!IopFindBusNumberResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available bus number resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.BusNumber.MinBusNumber, ReqDesc->u.BusNumber.MaxBusNumber, + ReqDesc->u.BusNumber.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeDma: + if (!IopFindDmaResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available dma resource (0x%x to 0x%x)\n", + ReqDesc->u.Dma.MinimumChannel, ReqDesc->u.Dma.MaximumChannel); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + default: + DPRINT1("Unsupported resource type: %x\n", ReqDesc->Type); + break; + } + + (*ResourceList)->List[0].PartialResourceList.Count++; + ResDesc++; + } + } + + return STATUS_SUCCESS; +} + +static +BOOLEAN +IopCheckResourceDescriptor( + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc, + IN PCM_RESOURCE_LIST ResourceList, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + ULONG i, ii; + BOOLEAN Result = FALSE; + + if (ResDesc->ShareDisposition == CmResourceShareShared) + return FALSE; + + for (i = 0; i < ResourceList->Count; i++) + { + PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList; + for (ii = 0; ii < ResList->Count; ii++) + { + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList->PartialDescriptors[ii]; + + /* We don't care about shared resources */ + if (ResDesc->ShareDisposition == CmResourceShareShared && + ResDesc2->ShareDisposition == CmResourceShareShared) + continue; + + /* Make sure we're comparing the same types */ + if (ResDesc->Type != ResDesc2->Type) + continue; + + switch (ResDesc->Type) + { + case CmResourceTypeMemory: + if ((ResDesc->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && + ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length > + ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < + ResDesc->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + + ResDesc2->u.Memory.Length > ResDesc->u.Memory.Start.QuadPart)) + { + if (!Silent) + { + DPRINT1("Resource conflict: Memory (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc->u.Memory.Start.QuadPart, ResDesc->u.Memory.Start.QuadPart + + ResDesc->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart, + ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length); + } + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypePort: + if ((ResDesc->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && + ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length > + ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < + ResDesc->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + + ResDesc2->u.Port.Length > ResDesc->u.Port.Start.QuadPart)) + { + if (!Silent) + { + DPRINT1("Resource conflict: Port (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc->u.Port.Start.QuadPart, ResDesc->u.Port.Start.QuadPart + + ResDesc->u.Port.Length, ResDesc2->u.Port.Start.QuadPart, + ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length); + } + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeInterrupt: + if (ResDesc->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector) + { + if (!Silent) + { + DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n", + ResDesc->u.Interrupt.Vector, ResDesc->u.Interrupt.Level, + ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level); + } + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeBusNumber: + if ((ResDesc->u.BusNumber.Start < ResDesc2->u.BusNumber.Start && + ResDesc->u.BusNumber.Start + ResDesc->u.BusNumber.Length > + ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start < + ResDesc->u.BusNumber.Start && ResDesc2->u.BusNumber.Start + + ResDesc2->u.BusNumber.Length > ResDesc->u.BusNumber.Start)) + { + if (!Silent) + { + DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc->u.BusNumber.Start, ResDesc->u.BusNumber.Start + + ResDesc->u.BusNumber.Length, ResDesc2->u.BusNumber.Start, + ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length); + } + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeDma: + if (ResDesc->u.Dma.Channel == ResDesc2->u.Dma.Channel) + { + if (!Silent) + { + DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n", + ResDesc->u.Dma.Channel, ResDesc->u.Dma.Port, + ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port); + } + + Result = TRUE; + + goto ByeBye; + } + break; + } + } + } + +ByeBye: + + if (Result && ConflictingDescriptor) + { + RtlCopyMemory(ConflictingDescriptor, + ResDesc, + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); + } + + return Result; +} + +static +NTSTATUS +IopUpdateControlKeyWithResources(IN PDEVICE_NODE DeviceNode) +{ + UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT); + UNICODE_STRING Control = RTL_CONSTANT_STRING(L"Control"); + UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"AllocConfig"); + HANDLE EnumKey, InstanceKey, ControlKey; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + + /* Open the Enum key */ + Status = IopOpenRegistryKeyEx(&EnumKey, NULL, &EnumRoot, KEY_ENUMERATE_SUB_KEYS); + if (!NT_SUCCESS(Status)) + return Status; + + /* Open the instance key (eg. Root\PNP0A03) */ + Status = IopOpenRegistryKeyEx(&InstanceKey, EnumKey, &DeviceNode->InstancePath, KEY_ENUMERATE_SUB_KEYS); + ZwClose(EnumKey); + + if (!NT_SUCCESS(Status)) + return Status; + + /* Create/Open the Control key */ + InitializeObjectAttributes(&ObjectAttributes, + &Control, + OBJ_CASE_INSENSITIVE, + InstanceKey, + NULL); + Status = ZwCreateKey(&ControlKey, + KEY_SET_VALUE, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + NULL); + ZwClose(InstanceKey); + + if (!NT_SUCCESS(Status)) + return Status; + + /* Write the resource list */ + Status = ZwSetValueKey(ControlKey, + &ValueName, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceList, + IopCalculateResourceListSize(DeviceNode->ResourceList)); + ZwClose(ControlKey); + + if (!NT_SUCCESS(Status)) + return Status; + + return STATUS_SUCCESS; +} + +static +NTSTATUS +IopFilterResourceRequirements(IN PDEVICE_NODE DeviceNode) +{ + IO_STACK_LOCATION Stack; + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS Status; + + DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n"); + + Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements; + Status = IopInitiatePnpIrp( + DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_FILTER_RESOURCE_REQUIREMENTS, + &Stack); + if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED) + { + DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); + return Status; + } + else if (NT_SUCCESS(Status)) + { + DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; + } + + return STATUS_SUCCESS; +} + + +NTSTATUS +IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2Key) +{ + NTSTATUS Status; + ULONG Disposition; + HANDLE PnpMgrLevel1, PnpMgrLevel2, ResourceMapKey; + UNICODE_STRING KeyName; + OBJECT_ATTRIBUTES ObjectAttributes; + + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + 0, + NULL); + Status = ZwCreateKey(&ResourceMapKey, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, Level1Key); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + ResourceMapKey, + NULL); + Status = ZwCreateKey(&PnpMgrLevel1, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + ZwClose(ResourceMapKey); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, Level2Key); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + PnpMgrLevel1, + NULL); + Status = ZwCreateKey(&PnpMgrLevel2, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + ZwClose(PnpMgrLevel1); + if (!NT_SUCCESS(Status)) + return Status; + + if (DeviceNode->ResourceList) + { + WCHAR NameBuff[256]; + UNICODE_STRING NameU; + UNICODE_STRING Suffix; + ULONG OldLength; + + ASSERT(DeviceNode->ResourceListTranslated); + + NameU.Buffer = NameBuff; + NameU.Length = 0; + NameU.MaximumLength = 256 * sizeof(WCHAR); + + Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, + DevicePropertyPhysicalDeviceObjectName, + NameU.MaximumLength, + NameU.Buffer, + &OldLength); + ASSERT(Status == STATUS_SUCCESS); + + NameU.Length = (USHORT)OldLength; + + RtlInitUnicodeString(&Suffix, L".Raw"); + RtlAppendUnicodeStringToString(&NameU, &Suffix); + + Status = ZwSetValueKey(PnpMgrLevel2, + &NameU, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceList, + IopCalculateResourceListSize(DeviceNode->ResourceList)); + if (!NT_SUCCESS(Status)) + { + ZwClose(PnpMgrLevel2); + return Status; + } + + /* "Remove" the suffix by setting the length back to what it used to be */ + NameU.Length = (USHORT)OldLength; + + RtlInitUnicodeString(&Suffix, L".Translated"); + RtlAppendUnicodeStringToString(&NameU, &Suffix); + + Status = ZwSetValueKey(PnpMgrLevel2, + &NameU, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceListTranslated, + IopCalculateResourceListSize(DeviceNode->ResourceListTranslated)); + ZwClose(PnpMgrLevel2); + if (!NT_SUCCESS(Status)) + return Status; + } + else + { + ZwClose(PnpMgrLevel2); + } + + return STATUS_SUCCESS; +} + +NTSTATUS +IopUpdateResourceMapForPnPDevice(IN PDEVICE_NODE DeviceNode) +{ + return IopUpdateResourceMap(DeviceNode, L"PnP Manager", L"PnpManager"); +} + +static +NTSTATUS +IopTranslateDeviceResources( + IN PDEVICE_NODE DeviceNode) +{ + PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; + PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw, DescriptorTranslated; + ULONG i, j, ListSize; + NTSTATUS Status; + + if (!DeviceNode->ResourceList) + { + DeviceNode->ResourceListTranslated = NULL; + return STATUS_SUCCESS; + } + + /* That's easy to translate a resource list. Just copy the + * untranslated one and change few fields in the copy + */ + ListSize = IopCalculateResourceListSize(DeviceNode->ResourceList); + + DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, ListSize); + if (!DeviceNode->ResourceListTranslated) + { + Status =STATUS_NO_MEMORY; + goto cleanup; + } + RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, ListSize); + + for (i = 0; i < DeviceNode->ResourceList->Count; i++) + { + pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; + for (j = 0; j < pPartialResourceList->Count; j++) + { + DescriptorRaw = &pPartialResourceList->PartialDescriptors[j]; + DescriptorTranslated = &DeviceNode->ResourceListTranslated->List[i].PartialResourceList.PartialDescriptors[j]; + switch (DescriptorRaw->Type) + { + case CmResourceTypePort: + { + ULONG AddressSpace = 1; /* IO space */ + if (!HalTranslateBusAddress( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Port.Start, + &AddressSpace, + &DescriptorTranslated->u.Port.Start)) + { + Status = STATUS_UNSUCCESSFUL; + goto cleanup; + } + break; + } + case CmResourceTypeInterrupt: + { + DescriptorTranslated->u.Interrupt.Vector = HalGetInterruptVector( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Interrupt.Level, + DescriptorRaw->u.Interrupt.Vector, + (PKIRQL)&DescriptorTranslated->u.Interrupt.Level, + &DescriptorRaw->u.Interrupt.Affinity); + break; + } + case CmResourceTypeMemory: + { + ULONG AddressSpace = 0; /* Memory space */ + if (!HalTranslateBusAddress( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Memory.Start, + &AddressSpace, + &DescriptorTranslated->u.Memory.Start)) + { + Status = STATUS_UNSUCCESSFUL; + goto cleanup; + } + } + + case CmResourceTypeDma: + case CmResourceTypeBusNumber: + case CmResourceTypeDeviceSpecific: + /* Nothing to do */ + break; + default: + DPRINT1("Unknown resource descriptor type 0x%x\n", DescriptorRaw->Type); + Status = STATUS_NOT_IMPLEMENTED; + goto cleanup; + } + } + } + return STATUS_SUCCESS; + +cleanup: + /* Yes! Also delete ResourceList because ResourceList and + * ResourceListTranslated should be a pair! */ + ExFreePool(DeviceNode->ResourceList); + DeviceNode->ResourceList = NULL; + if (DeviceNode->ResourceListTranslated) + { + ExFreePool(DeviceNode->ResourceListTranslated); + DeviceNode->ResourceList = NULL; + } + return Status; +} + +NTSTATUS +NTAPI +IopAssignDeviceResources( + IN PDEVICE_NODE DeviceNode) +{ + NTSTATUS Status; + ULONG ListSize; + + IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + + Status = IopFilterResourceRequirements(DeviceNode); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) + { + DeviceNode->Flags |= DNF_NO_RESOURCE_REQUIRED; + + /* No resource needed for this device */ + DeviceNode->ResourceList = NULL; + DeviceNode->ResourceListTranslated = NULL; + + return STATUS_SUCCESS; + } + + /* Fill DeviceNode->ResourceList + * FIXME: the PnP arbiter should go there! + * Actually, use the BootResources if provided, else the resource requirements + */ + + if (DeviceNode->BootResources) + { + ListSize = IopCalculateResourceListSize(DeviceNode->BootResources); + + DeviceNode->ResourceList = ExAllocatePool(PagedPool, ListSize); + if (!DeviceNode->ResourceList) + { + Status = STATUS_NO_MEMORY; + goto ByeBye; + } + RtlCopyMemory(DeviceNode->ResourceList, DeviceNode->BootResources, ListSize); + + Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); + if (NT_SUCCESS(Status) || !DeviceNode->ResourceRequirements) + { + if (!NT_SUCCESS(Status) && !DeviceNode->ResourceRequirements) + { + DPRINT1("Using conflicting boot resources because no requirements were supplied!\n"); + } + + goto Finish; + } + else + { + DPRINT1("Boot resources for %wZ cause a resource conflict!\n", &DeviceNode->InstancePath); + ExFreePool(DeviceNode->ResourceList); + } + } + + Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements, + &DeviceNode->ResourceList); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); + if (!NT_SUCCESS(Status)) + goto ByeBye; + +Finish: + Status = IopTranslateDeviceResources(DeviceNode); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + Status = IopUpdateResourceMapForPnPDevice(DeviceNode); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + Status = IopUpdateControlKeyWithResources(DeviceNode); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED); + + IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + + return STATUS_SUCCESS; + +ByeBye: + if (DeviceNode->ResourceList) + { + ExFreePool(DeviceNode->ResourceList); + DeviceNode->ResourceList = NULL; + } + + DeviceNode->ResourceListTranslated = NULL; + + IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + + return Status; +} + +static +BOOLEAN +IopCheckForResourceConflict( + IN PCM_RESOURCE_LIST ResourceList1, + IN PCM_RESOURCE_LIST ResourceList2, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + ULONG i, ii; + BOOLEAN Result = FALSE; + + for (i = 0; i < ResourceList1->Count; i++) + { + PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList1->List[i].PartialResourceList; + for (ii = 0; ii < ResList->Count; ii++) + { + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc = &ResList->PartialDescriptors[ii]; + + Result = IopCheckResourceDescriptor(ResDesc, + ResourceList2, + Silent, + ConflictingDescriptor); + if (Result) goto ByeBye; + } + } + + +ByeBye: + + return Result; +} + +NTSTATUS +IopDetectResourceConflict( + IN PCM_RESOURCE_LIST ResourceList, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + HANDLE ResourceMapKey = INVALID_HANDLE_VALUE, ChildKey2 = INVALID_HANDLE_VALUE, ChildKey3 = INVALID_HANDLE_VALUE; + ULONG KeyInformationLength, RequiredLength, KeyValueInformationLength, KeyNameInformationLength; + PKEY_BASIC_INFORMATION KeyInformation; + PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; + PKEY_VALUE_BASIC_INFORMATION KeyNameInformation; + ULONG ChildKeyIndex1 = 0, ChildKeyIndex2 = 0, ChildKeyIndex3 = 0; + NTSTATUS Status; + + RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); + InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, 0, NULL); + Status = ZwOpenKey(&ResourceMapKey, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + /* The key is missing which means we are the first device */ + return STATUS_SUCCESS; + } + + while (TRUE) + { + Status = ZwEnumerateKey(ResourceMapKey, + ChildKeyIndex1, + KeyBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) + { + KeyInformationLength = RequiredLength; + KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); + if (!KeyInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateKey(ResourceMapKey, + ChildKeyIndex1, + KeyBasicInformation, + KeyInformation, + KeyInformationLength, + &RequiredLength); + } + else + goto cleanup; + ChildKeyIndex1++; + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyName.Buffer = KeyInformation->Name; + KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ResourceMapKey, + NULL); + Status = ZwOpenKey(&ChildKey2, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); + ExFreePool(KeyInformation); + if (!NT_SUCCESS(Status)) + goto cleanup; + + while (TRUE) + { + Status = ZwEnumerateKey(ChildKey2, + ChildKeyIndex2, + KeyBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyInformationLength = RequiredLength; + KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); + if (!KeyInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateKey(ChildKey2, + ChildKeyIndex2, + KeyBasicInformation, + KeyInformation, + KeyInformationLength, + &RequiredLength); + } + else + goto cleanup; + ChildKeyIndex2++; + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyName.Buffer = KeyInformation->Name; + KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ChildKey2, + NULL); + Status = ZwOpenKey(&ChildKey3, KEY_QUERY_VALUE, &ObjectAttributes); + ExFreePool(KeyInformation); + if (!NT_SUCCESS(Status)) + goto cleanup; + + while (TRUE) + { + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValuePartialInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyValueInformationLength = RequiredLength; + KeyValueInformation = ExAllocatePool(PagedPool, KeyValueInformationLength); + if (!KeyValueInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValuePartialInformation, + KeyValueInformation, + KeyValueInformationLength, + &RequiredLength); + } + else + goto cleanup; + if (!NT_SUCCESS(Status)) + goto cleanup; + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValueBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyNameInformationLength = RequiredLength; + KeyNameInformation = ExAllocatePool(PagedPool, KeyNameInformationLength + sizeof(WCHAR)); + if (!KeyNameInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValueBasicInformation, + KeyNameInformation, + KeyNameInformationLength, + &RequiredLength); + } + else + goto cleanup; + + ChildKeyIndex3++; + + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyNameInformation->Name[KeyNameInformation->NameLength / sizeof(WCHAR)] = UNICODE_NULL; + + /* Skip translated entries */ + if (wcsstr(KeyNameInformation->Name, L".Translated")) + { + ExFreePool(KeyNameInformation); + continue; + } + + ExFreePool(KeyNameInformation); + + if (IopCheckForResourceConflict(ResourceList, + (PCM_RESOURCE_LIST)KeyValueInformation->Data, + Silent, + ConflictingDescriptor)) + { + ExFreePool(KeyValueInformation); + Status = STATUS_CONFLICTING_ADDRESSES; + goto cleanup; + } + + ExFreePool(KeyValueInformation); + } + } + } + +cleanup: + if (ResourceMapKey != INVALID_HANDLE_VALUE) + ZwClose(ResourceMapKey); + if (ChildKey2 != INVALID_HANDLE_VALUE) + ZwClose(ChildKey2); + if (ChildKey3 != INVALID_HANDLE_VALUE) + ZwClose(ChildKey3); + + if (Status == STATUS_NO_MORE_ENTRIES) + Status = STATUS_SUCCESS; + + return Status; +} + diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index da129c385a4..5dc63c62e56 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -270,6 +270,7 @@ pnpmgr.c pnpnotify.c pnpreport.c + pnpres.c pnproot.c pnputil.c From 2fa4179cf2cb20537ff7af0b27f2e58e26d9c60d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 21 Apr 2010 22:42:21 +0000 Subject: [PATCH 175/261] - Missed this from my last commit svn path=/trunk/; revision=46984 --- reactos/ntoskrnl/io/pnpmgr/pnpres.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpres.c b/reactos/ntoskrnl/io/pnpmgr/pnpres.c index 32a746ee26f..88148901112 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpres.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpres.c @@ -822,6 +822,7 @@ IopAssignDeviceResources( if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) { DeviceNode->Flags |= DNF_NO_RESOURCE_REQUIRED; + DeviceNode->Flags &= ~DNF_ASSIGNING_RESOURCES; /* No resource needed for this device */ DeviceNode->ResourceList = NULL; From 6463764d6615045481d9ce398318674f5838c0d2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 21 Apr 2010 23:19:12 +0000 Subject: [PATCH 176/261] [PCI] - Don't set DO_BUS_ENUMERATED_DEVICE on child PDOs because the PnP manager does it for us svn path=/trunk/; revision=46985 --- reactos/drivers/bus/pci/fdo.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/drivers/bus/pci/fdo.c b/reactos/drivers/bus/pci/fdo.c index 35fd12536c7..8072a89b455 100644 --- a/reactos/drivers/bus/pci/fdo.c +++ b/reactos/drivers/bus/pci/fdo.c @@ -239,8 +239,6 @@ FdoQueryBusRelations( break; } - Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; - Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING; //Device->Pdo->Flags |= DO_POWER_PAGABLE; From 0f570fe34cf652edba54d3224fd58dd7d68fbe40 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Apr 2010 03:54:09 +0000 Subject: [PATCH 177/261] [NTOS]: MiFindExportedRoutineByName should validate the ordinal to make sure it's not higher than the function count. [NTOS]: Use MM_SYSLDR_ defines instead of magic pointer casts. Use appropriate pool tags. [NTOS]: Set the LoadedImport count early-on during image referencing, so that failure will correctly de-reference the imports. By setting it to zero, failures would've leaked driver-dependent DLLs already loaded but now useless. [NTOS]: Do the same checks as Windows to avoid drivers linked with user-mode DLLs. [NTOS]: Allow "coverage" and "irt" to be linked with Win32K drivers as well. [NTOS]: When the linker is fixed not to generate corrupt drivers, add the appropriate code to scan IMAGE_DIRECTORY_ENTRY_IAT for updating thunks. A hack exists in ReactOS now to permit loading these hacked drivers, but Windows is not so generous and will crash with a ReactOS driver. svn path=/trunk/; revision=46987 --- reactos/ntoskrnl/mm/sysldr.c | 77 ++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 1b08c91f28d..a142516b9a9 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -509,6 +509,9 @@ MiFindExportedRoutineByName(IN PVOID DllBase, /* Otherwise, this is the ordinal */ Ordinal = OrdinalTable[Mid]; + /* Validate the ordinal */ + if (Ordinal >= ExportDirectory->NumberOfFunctions) return NULL; + /* Resolve the address and write it */ ExportTable = (PULONG)((ULONG_PTR)DllBase + ExportDirectory->AddressOfFunctions); @@ -554,9 +557,9 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, ULONG_PTR OldBaseTop, Delta; PLDR_DATA_TABLE_ENTRY LdrEntry; PLIST_ENTRY NextEntry; - ULONG ImportSize; + ULONG ImportSize, i; + PULONG_PTR ImageThunk; PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor; - PULONG ImageThunk; /* Calculate the top and delta */ OldBaseTop = (ULONG_PTR)OldBase + Size - 1; @@ -571,8 +574,30 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, LdrEntry = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); +#ifdef _WORKING_LINKER_ + /* Get the IAT */ + ImageThunk = RtlImageDirectoryEntryToData(LdrEntry->DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_IAT, + &ImportSize); + if (!ImageThunk) continue; + /* Make sure we have an IAT */ + DPRINT("[Mm0]: Updating thunks in: %wZ\n", &LdrEntry->BaseDllName); + for (i = 0; i < ImportSize; i++, ImageThunk++) + { + /* Check if it's within this module */ + if ((*ImageThunk >= (ULONG_PTR)OldBase) && (*ImageThunk <= OldBaseTop)) + { + /* Relocate it */ + DPRINT("[Mm0]: Updating IAT at: %p. Old Entry: %p. New Entry: %p.\n", + ImageThunk, *ImageThunk, *ImageThunk + Delta); + *ImageThunk += Delta; + } + } +#else /* Get the import table */ + i = ImportSize; ImportDescriptor = RtlImageDirectoryEntryToData(LdrEntry->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, @@ -605,6 +630,7 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, /* Go to the next import */ ImportDescriptor++; } +#endif } } @@ -672,7 +698,7 @@ MiSnapThunk(IN PVOID DllBase, /* Get the hint and check if it's valid */ Hint = NameImport->Hint; if ((Hint < ExportDirectory->NumberOfNames) && - !(strcmp((PCHAR) NameImport->Name, (PCHAR)DllBase + NameTable[Hint]))) + !(strcmp((PCHAR)NameImport->Name, (PCHAR)DllBase + NameTable[Hint]))) { /* We have a match, get the ordinal number from here */ Ordinal = OrdinalTable[Hint]; @@ -843,7 +869,7 @@ MmUnloadSystemImage(IN PVOID ImageHandle) NULL); /* Check if this driver was loaded at boot and didn't get imports parsed */ - if (LdrEntry->LoadedImports == (PVOID)-1) goto Done; + if (LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) goto Done; /* We should still be alive */ ASSERT(LdrEntry->LoadCount != 0); @@ -870,6 +896,7 @@ MmUnloadSystemImage(IN PVOID ImageHandle) } /* FIXME: Free the driver */ + DPRINT1("Leaking driver: %wZ\n", &LdrEntry->BaseDllName); //MmFreeSection(LdrEntry->DllBase); /* Check if we're linked in */ @@ -940,7 +967,7 @@ MiResolveImageReferences(IN PVOID ImageBase, __FUNCTION__, ImageBase, ImageFileDirectory); /* Assume no imports */ - *LoadImports = (PVOID)-2; + *LoadImports = MM_SYSLDR_NO_IMPORTS; /* Get the import descriptor */ ImportDescriptor = RtlImageDirectoryEntryToData(ImageBase, @@ -965,11 +992,12 @@ MiResolveImageReferences(IN PVOID ImageBase, LoadedImportsSize = ImportCount * sizeof(PVOID) + sizeof(SIZE_T); LoadedImports = ExAllocatePoolWithTag(PagedPool, LoadedImportsSize, - TAG_LDR_WSTR); + 'TDmM'); if (LoadedImports) { /* Zero it */ RtlZeroMemory(LoadedImports, LoadedImportsSize); + LoadedImports->Count = ImportCount; } } else @@ -989,10 +1017,12 @@ MiResolveImageReferences(IN PVOID ImageBase, GdiLink = GdiLink | !(_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)); - /* We can also allow dxapi */ + /* We can also allow dxapi (for Windows compat, allow IRT and coverage )*/ NormalLink = NormalLink | ((_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)) && - (_strnicmp(ImportName, "dxapi", sizeof("dxapi") - 1))); + (_strnicmp(ImportName, "dxapi", sizeof("dxapi") - 1)) && + (_strnicmp(ImportName, "coverage", sizeof("coverage") - 1)) && + (_strnicmp(ImportName, "irt", sizeof("irt") - 1))); /* Check if this is a valid GDI driver */ if ((GdiLink) && (NormalLink)) @@ -1003,6 +1033,20 @@ MiResolveImageReferences(IN PVOID ImageBase, return STATUS_PROCEDURE_NOT_FOUND; } + /* Check for user-mode printer or video card drivers, which don't belong */ + if (!(_strnicmp(ImportName, "ntdll", sizeof("ntdll") - 1)) || + !(_strnicmp(ImportName, "winsrv", sizeof("winsrv") - 1)) || + !(_strnicmp(ImportName, "advapi32", sizeof("advapi32") - 1)) || + !(_strnicmp(ImportName, "kernel32", sizeof("kernel32") - 1)) || + !(_strnicmp(ImportName, "user32", sizeof("user32") - 1)) || + !(_strnicmp(ImportName, "gdi32", sizeof("gdi32") - 1))) + { + /* This is not kernel code */ + MiDereferenceImports(LoadedImports); + if (LoadedImports) ExFreePool(LoadedImports); + return STATUS_PROCEDURE_NOT_FOUND; + } + /* Check if this is a "core" import, which doesn't get referenced */ if (!(_strnicmp(ImportName, "ntoskrnl", sizeof("ntoskrnl") - 1)) || !(_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)) || @@ -1079,7 +1123,7 @@ CheckDllState: sizeof(UNICODE_NULL); DllName.Buffer = ExAllocatePoolWithTag(NonPagedPool, DllName.MaximumLength, - TAG_LDR_WSTR); + 'TDmM'); if (DllName.Buffer) { /* Setup the base length and copy it */ @@ -1091,13 +1135,13 @@ CheckDllState: /* Now add the import name and null-terminate it */ RtlAppendStringToString((PSTRING)&DllName, (PSTRING)&NameString); - DllName.Buffer[(DllName.MaximumLength - 1) / sizeof(WCHAR)] = UNICODE_NULL; + DllName.Buffer[(DllName.MaximumLength - 1) / sizeof(WCHAR)] = UNICODE_NULL; /* Load the image */ Status = MmLoadSystemImage(&DllName, NamePrefix, NULL, - 0, + FALSE, (PVOID)&DllEntry, &DllBase); if (NT_SUCCESS(Status)) @@ -1160,8 +1204,8 @@ CheckDllState: if (!(LdrEntry->Flags & LDRP_LOAD_IN_PROGRESS)) { /* Add the entry */ - LoadedImports->Entry[LoadedImports->Count] = LdrEntry; - LoadedImports->Count++; + LoadedImports->Entry[ImportCount] = LdrEntry; + ImportCount++; } } @@ -1230,7 +1274,8 @@ CheckDllState: if (LoadedImports->Entry[i]) { /* Got an entry, OR it with 1 in case it's the single entry */ - ImportEntry = (PVOID)((ULONG_PTR)LoadedImports->Entry[i] | 1); + ImportEntry = (PVOID)((ULONG_PTR)LoadedImports->Entry[i] | + MM_SYSLDR_SINGLE_ENTRY); ImportCount++; } } @@ -1240,7 +1285,7 @@ CheckDllState: { /* Free the list and set it to no imports */ ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - LoadedImports = (PVOID)-2; + LoadedImports = MM_SYSLDR_NO_IMPORTS; } else if (ImportCount == 1) { @@ -1254,7 +1299,7 @@ CheckDllState: LoadedImportsSize = ImportCount * sizeof(PVOID) + sizeof(SIZE_T); NewImports = ExAllocatePoolWithTag(PagedPool, LoadedImportsSize, - TAG_LDR_WSTR); + 'TDmM'); if (NewImports) { /* Set count */ From 0e419c8771cdfc7e0f8261b3587858b477372133 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Apr 2010 08:04:57 +0000 Subject: [PATCH 178/261] [NTOS]: Implement and call MiUseLargeDriverPage. [NTOS]: MmCheckSystemImage: Check for 32-bit/64-bit image/OS mismatch. [NTOS]: MmCheckSystemImage: Return invalid checksum if couldn't get the NT header from the image. [NTOS]: MmCheckSystemImage: Map images as SEC_IMAGE instead of SEC_COMMIT, and simply read the size off that way. svn path=/trunk/; revision=46988 --- reactos/ntoskrnl/mm/sysldr.c | 97 +++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index a142516b9a9..27dcee3219c 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -1590,6 +1590,63 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) return TRUE; } +LOGICAL +NTAPI +MiUseLargeDriverPage(IN ULONG NumberOfPtes, + IN OUT PVOID *ImageBaseAddress, + IN PUNICODE_STRING BaseImageName, + IN BOOLEAN BootDriver) +{ + PLIST_ENTRY NextEntry; + BOOLEAN DriverFound = FALSE; + PMI_LARGE_PAGE_DRIVER_ENTRY LargePageDriverEntry; + ASSERT(KeGetCurrentIrql () <= APC_LEVEL); + ASSERT(*ImageBaseAddress >= MmSystemRangeStart); + +#ifdef _X86_ + if (!(KeFeatureBits & KF_LARGE_PAGE)) return FALSE; + if (!(__readcr4() & CR4_PSE)) return FALSE; +#endif + + /* Make sure there's enough system PTEs for a large page driver */ + if (MmTotalFreeSystemPtes[SystemPteSpace] < (16 * (PDE_MAPPED_VA >> PAGE_SHIFT))) + { + return FALSE; + } + + /* This happens if the registry key had a "*" (wildcard) in it */ + if (MiLargePageAllDrivers == 0) + { + /* It didn't, so scan the list */ + NextEntry = MiLargePageDriverList.Flink; + while (NextEntry != &MiLargePageDriverList) + { + /* Check if the driver name matches */ + LargePageDriverEntry = CONTAINING_RECORD(NextEntry, + MI_LARGE_PAGE_DRIVER_ENTRY, + Links); + if (RtlEqualUnicodeString(BaseImageName, + &LargePageDriverEntry->BaseName, + TRUE)) + { + /* Enable large pages for this driver */ + DriverFound = TRUE; + break; + } + + /* Keep trying */ + NextEntry = NextEntry->Flink; + } + + /* If we didn't find the driver, it doesn't need large pages */ + if (DriverFound == FALSE) return FALSE; + } + + /* Nothing to do yet */ + DPRINT1("Large pages not supported!\n"); + return FALSE; +} + ULONG NTAPI MiComputeDriverProtection(IN BOOLEAN SessionSpace, @@ -1994,15 +2051,24 @@ MmCheckSystemImage(IN HANDLE ImageHandle, IO_STATUS_BLOCK IoStatusBlock; FILE_STANDARD_INFORMATION FileStandardInfo; KAPC_STATE ApcState; + PIMAGE_NT_HEADERS NtHeaders; + OBJECT_ATTRIBUTES ObjectAttributes; PAGED_CODE(); + + /* Setup the object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + NULL, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); /* Create a section for the DLL */ Status = ZwCreateSection(&SectionHandle, SECTION_MAP_EXECUTE, - NULL, + &ObjectAttributes, NULL, PAGE_EXECUTE, - SEC_COMMIT, + SEC_IMAGE, ImageHandle); if (!NT_SUCCESS(Status)) return Status; @@ -2034,17 +2100,35 @@ MmCheckSystemImage(IN HANDLE ImageHandle, &FileStandardInfo, sizeof(FileStandardInfo), FileStandardInformation); - if ( NT_SUCCESS(Status) ) + if (NT_SUCCESS(Status)) { /* First, verify the checksum */ if (!LdrVerifyMappedImageMatchesChecksum(ViewBase, - FileStandardInfo. - EndOfFile.LowPart, + ViewSize, FileStandardInfo. EndOfFile.LowPart)) { /* Set checksum failure */ Status = STATUS_IMAGE_CHECKSUM_MISMATCH; + goto Fail; + } + + /* Make sure it's a real image */ + NtHeaders = RtlImageNtHeader(ViewBase); + if (!NtHeaders) + { + /* Set checksum failure */ + Status = STATUS_IMAGE_CHECKSUM_MISMATCH; + goto Fail; + } + + /* Make sure it's for the correct architecture */ + if ((NtHeaders->FileHeader.Machine != IMAGE_FILE_MACHINE_NATIVE) || + (NtHeaders->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)) + { + /* Set protection failure */ + Status = STATUS_INVALID_IMAGE_PROTECT; + goto Fail; } /* Check that it's a valid SMP image if we have more then one CPU */ @@ -2056,6 +2140,7 @@ MmCheckSystemImage(IN HANDLE ImageHandle, } /* Unmap the section, close the handle, and return status */ +Fail: ZwUnmapViewOfSection(NtCurrentProcess(), ViewBase); KeUnstackDetachProcess(&ApcState); ZwClose(SectionHandle); @@ -2330,13 +2415,11 @@ LoaderScan: /* Check for success */ if (NT_SUCCESS(Status)) { - #if 0 /* Support large pages for drivers */ MiUseLargeDriverPage(DriverSize / PAGE_SIZE, &ModuleLoadBase, &BaseName, TRUE); - #endif } /* Dereference the section */ From 2c0c247cc759b84d503fd9671e03ba5bb9426af1 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Apr 2010 08:13:56 +0000 Subject: [PATCH 179/261] [NTOS]: Implement and call MiBuildImportsForBootDrivers. We now have full dependency tracking for correct unloading. [NTOS]: Implement and call MiLocateKernelSections. Pool code and paging paths will require this information later. Loader work done for now. svn path=/trunk/; revision=46989 --- reactos/ntoskrnl/mm/sysldr.c | 336 ++++++++++++++++++++++++++++++++++- 1 file changed, 334 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 27dcee3219c..1fb86f95d01 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -47,6 +47,10 @@ PVOID MmLastUnloadedDrivers; BOOLEAN MmMakeLowMemory; BOOLEAN MmEnforceWriteProtection = TRUE; +PMMPTE MiKernelResourceStartPte, MiKernelResourceEndPte; +ULONG_PTR ExPoolCodeStart, ExPoolCodeEnd, MmPoolCodeStart, MmPoolCodeEnd; +ULONG_PTR MmPteCodeStart, MmPteCodeEnd; + /* FUNCTIONS ******************************************************************/ PVOID @@ -1508,6 +1512,331 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } } +NTSTATUS +NTAPI +MiBuildImportsForBootDrivers(VOID) +{ + PLIST_ENTRY NextEntry, NextEntry2; + PLDR_DATA_TABLE_ENTRY LdrEntry, KernelEntry, HalEntry, LdrEntry2, LastEntry; + PLDR_DATA_TABLE_ENTRY* EntryArray; + UNICODE_STRING KernelName = RTL_CONSTANT_STRING(L"ntoskrnl.exe"); + UNICODE_STRING HalName = RTL_CONSTANT_STRING(L"hal.dll"); + PLOAD_IMPORTS LoadedImports; + ULONG LoadedImportsSize, ImportSize; + PULONG_PTR ImageThunk; + ULONG_PTR DllBase, DllEnd; + ULONG Modules = 0, i, j = 0; + PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor; + + /* Initialize variables */ + KernelEntry = HalEntry = LastEntry = NULL; + + /* Loop the loaded module list... we are early enough that no lock is needed */ + NextEntry = PsLoadedModuleList.Flink; + while (NextEntry != &PsLoadedModuleList) + { + /* Get the entry */ + LdrEntry = CONTAINING_RECORD(NextEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + /* Check if it's the kernel or HAL */ + if (RtlEqualUnicodeString(&KernelName, &LdrEntry->BaseDllName, TRUE)) + { + /* Found it */ + KernelEntry = LdrEntry; + } + else if (RtlEqualUnicodeString(&HalName, &LdrEntry->BaseDllName, TRUE)) + { + /* Found it */ + HalEntry = LdrEntry; + } + + /* Check if this is a driver DLL */ + if (LdrEntry->Flags & LDRP_DRIVER_DEPENDENT_DLL) + { + /* Check if this is the HAL or kernel */ + if ((LdrEntry == HalEntry) || (LdrEntry == KernelEntry)) + { + /* Add a reference */ + LdrEntry->LoadCount = 1; + } + else + { + /* No referencing needed */ + LdrEntry->LoadCount = 0; + } + } + else + { + /* No referencing needed */ + LdrEntry->LoadCount = 0; + } + + /* Remember this came from the loader */ + LdrEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; + + /* Keep looping */ + NextEntry = NextEntry->Flink; + Modules++; + } + + /* We must have at least found the kernel and HAL */ + if (!(HalEntry) || (!KernelEntry)) return STATUS_NOT_FOUND; + + /* Allocate the list */ + EntryArray = ExAllocatePoolWithTag(PagedPool, Modules * sizeof(PVOID), 'TDmM'); + if (!EntryArray) return STATUS_INSUFFICIENT_RESOURCES; + + /* Loop the loaded module list again */ + NextEntry = PsLoadedModuleList.Flink; + while (NextEntry != &PsLoadedModuleList) + { + /* Get the entry */ + LdrEntry = CONTAINING_RECORD(NextEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); +#ifdef _WORKING_LOADER_ + /* Get its imports */ + ImageThunk = RtlImageDirectoryEntryToData(LdrEntry->DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_IAT, + &ImportSize); + if (!ImageThunk) +#else + /* Get its imports */ + ImportDescriptor = RtlImageDirectoryEntryToData(LdrEntry->DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, + &ImportSize); + if (!ImportDescriptor) +#endif + { + /* None present */ + LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; + NextEntry = NextEntry->Flink; + continue; + } + + /* Clear the list and count the number of IAT thunks */ + RtlZeroMemory(EntryArray, Modules * sizeof(PVOID)); +#ifdef _WORKING_LOADER_ + ImportSize /= sizeof(ULONG_PTR); + + /* Scan the thunks */ + for (i = 0, DllBase = 0, DllEnd = 0; i < ImportSize; i++, ImageThunk++) +#else + i = DllBase = DllEnd = 0; + while ((ImportDescriptor->Name) && + (ImportDescriptor->OriginalFirstThunk)) + { + /* Get the image thunk */ + ImageThunk = (PVOID)((ULONG_PTR)LdrEntry->DllBase + + ImportDescriptor->FirstThunk); + while (*ImageThunk) +#endif + { + /* Do we already have an address? */ + if (DllBase) + { + /* Is the thunk in the same address? */ + if ((*ImageThunk >= DllBase) && (*ImageThunk < DllEnd)) + { + /* Skip it, we already have a reference for it */ + ASSERT(EntryArray[j]); + ImageThunk++; + continue; + } + } + + /* Loop the loaded module list to locate this address owner */ + j = 0; + NextEntry2 = PsLoadedModuleList.Flink; + while (NextEntry2 != &PsLoadedModuleList) + { + /* Get the entry */ + LdrEntry2 = CONTAINING_RECORD(NextEntry2, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + /* Get the address range for this module */ + DllBase = (ULONG_PTR)LdrEntry2->DllBase; + DllEnd = DllBase + LdrEntry2->SizeOfImage; + + /* Check if this IAT entry matches it */ + if ((*ImageThunk >= DllBase) && (*ImageThunk < DllEnd)) + { + /* Save it */ + //DPRINT1("Found imported dll: %wZ\n", &LdrEntry2->BaseDllName); + EntryArray[j] = LdrEntry2; + break; + } + + /* Keep searching */ + NextEntry2 = NextEntry2->Flink; + j++; + } + + /* Do we have a thunk outside the range? */ + if ((*ImageThunk < DllBase) || (*ImageThunk >= DllEnd)) + { + /* Could be 0... */ + if (*ImageThunk) + { + /* Should not be happening */ + DPRINT1("Broken IAT entry for %p at %p (%lx)\n", + LdrEntry, ImageThunk, *ImageThunk); + ASSERT(FALSE); + } + + /* Reset if we hit this */ + DllBase = 0; + } +#ifndef _WORKING_LOADER_ + ImageThunk++; + } + + i++; + ImportDescriptor++; +#endif + } + + /* Now scan how many imports we really have */ + for (i = 0, ImportSize = 0; i < Modules; i++) + { + /* Skip HAL and kernel */ + if ((EntryArray[i]) && + (EntryArray[i] != HalEntry) && + (EntryArray[i] != KernelEntry)) + { + /* A valid reference */ + LastEntry = EntryArray[i]; + ImportSize++; + } + } + + /* Do we have any imports after all? */ + if (!ImportSize) + { + /* No */ + LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; + } + else if (ImportSize == 1) + { + /* A single entry import */ + LdrEntry->LoadedImports = (PVOID)((ULONG_PTR)LastEntry | MM_SYSLDR_SINGLE_ENTRY); + LastEntry->LoadCount++; + } + else + { + /* We need an import table */ + LoadedImportsSize = ImportSize * sizeof(PVOID) + sizeof(SIZE_T); + LoadedImports = ExAllocatePoolWithTag(PagedPool, + LoadedImportsSize, + 'TDmM'); + ASSERT(LoadedImports); + + /* Save the count */ + LoadedImports->Count = ImportSize; + + /* Now copy all imports */ + for (i = 0, j = 0; i < Modules; i++) + { + /* Skip HAL and kernel */ + if ((EntryArray[i]) && + (EntryArray[i] != HalEntry) && + (EntryArray[i] != KernelEntry)) + { + /* A valid reference */ + //DPRINT1("Found valid entry: %p\n", EntryArray[i]); + LoadedImports->Entry[j] = EntryArray[i]; + EntryArray[i]->LoadCount++; + j++; + } + } + + /* Should had as many entries as we expected */ + ASSERT(j == ImportSize); + LdrEntry->LoadedImports = LoadedImports; + } + + /* Next */ + NextEntry = NextEntry->Flink; + } + + /* Free the initial array */ + ExFreePool(EntryArray); + + /* FIXME: Might not need to keep the HAL/Kernel imports around */ + + /* Kernel and HAL are loaded at boot */ + KernelEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; + HalEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; + + /* All worked well */ + return STATUS_SUCCESS; +} + +VOID +NTAPI +MiLocateKernelSections(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + ULONG_PTR DllBase; + PIMAGE_NT_HEADERS NtHeaders; + PIMAGE_SECTION_HEADER SectionHeader; + ULONG Sections, Size; + + /* Get the kernel section header */ + DllBase = (ULONG_PTR)LdrEntry->DllBase; + NtHeaders = RtlImageNtHeader((PVOID)DllBase); + SectionHeader = IMAGE_FIRST_SECTION(NtHeaders); + + /* Loop all the sections */ + Sections = NtHeaders->FileHeader.NumberOfSections; + while (Sections) + { + /* Grab the size of the section */ + Size = max(SectionHeader->SizeOfRawData, SectionHeader->Misc.VirtualSize); + + /* Check for .RSRC section */ + if (*(PULONG)SectionHeader->Name == 'rsr.') + { + /* Remember the PTEs so we can modify them later */ + MiKernelResourceStartPte = MiAddressToPte(DllBase + + SectionHeader->VirtualAddress); + MiKernelResourceEndPte = MiKernelResourceStartPte + + BYTES_TO_PAGES(SectionHeader->VirtualAddress + Size); + } + else if (*(PULONG)SectionHeader->Name == 'LOOP') + { + /* POOLCODE vs. POOLMI */ + if (*(PULONG)&SectionHeader->Name[4] == 'EDOC') + { + /* Found Ex* Pool code */ + ExPoolCodeStart = DllBase + SectionHeader->VirtualAddress; + ExPoolCodeEnd = ExPoolCodeStart + Size; + } + else if (*(PUSHORT)&SectionHeader->Name[4] == 'MI') + { + /* Found Mm* Pool code */ + MmPoolCodeStart = DllBase + SectionHeader->VirtualAddress; + MmPoolCodeEnd = ExPoolCodeStart + Size; + } + } + else if ((*(PULONG)SectionHeader->Name == 'YSIM') && + (*(PULONG)&SectionHeader->Name[4] == 'ETPS')) + { + /* Found MISYSPTE (Mm System PTE code)*/ + MmPteCodeStart = DllBase + SectionHeader->VirtualAddress; + MmPteCodeEnd = ExPoolCodeStart + Size; + } + + /* Keep going */ + Sections--; + SectionHeader++; + } +} + BOOLEAN NTAPI MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -1528,6 +1857,9 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); PsNtosImageBase = (ULONG_PTR)LdrEntry->DllBase; + + /* Locate resource section, pool code, and system pte code */ + MiLocateKernelSections(LdrEntry); /* Loop the loader block */ while (NextEntry != ListHead) @@ -1541,7 +1873,7 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (!RtlImageNtHeader(LdrEntry->DllBase)) { /* Skip this entry */ - NextEntry= NextEntry->Flink; + NextEntry = NextEntry->Flink; continue; } @@ -1584,7 +1916,7 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } /* Build the import lists for the boot drivers */ - //MiBuildImportsForBootDrivers(); + MiBuildImportsForBootDrivers(); /* We're done */ return TRUE; From 2ea442a9df32289bd812714e08392290d4c876ce Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 22 Apr 2010 08:47:47 +0000 Subject: [PATCH 180/261] [KERNEL32] - Update kernel32_winetests to Wine-1.1.43. svn path=/trunk/; revision=46990 --- rostests/winetests/kernel32/comm.c | 170 +- rostests/winetests/kernel32/console.c | 96 ++ rostests/winetests/kernel32/debugger.c | 49 +- rostests/winetests/kernel32/generated.c | 2001 ++++++++++++++++++++++- rostests/winetests/kernel32/heap.c | 3 +- rostests/winetests/kernel32/path.c | 2 +- rostests/winetests/kernel32/thread.c | 12 +- 7 files changed, 2164 insertions(+), 169 deletions(-) diff --git a/rostests/winetests/kernel32/comm.c b/rostests/winetests/kernel32/comm.c index 8cb010c3da5..8ce6cccfcc2 100755 --- a/rostests/winetests/kernel32/comm.c +++ b/rostests/winetests/kernel32/comm.c @@ -56,336 +56,336 @@ static TEST test[] = { "baud=9600 parity=e data=5 stop=1 xon=on odsr=off octs=off dtr=on rts=on idsr=on", TRUE, FALSE, - { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "baud=0 parity=M data=6 stop=1.5 xon=off odsr=on octs=ON dtr=off rts=off idsr=OFF", TRUE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00000000, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00000000, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "BAUD=4000000000 parity=n data=7 stop=2 to=off", TRUE, FALSE, - { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xee6b2800, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x00, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xee6b2800, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { "Baud=115200 Parity=O Data=8 To=On", TRUE, FALSE, - { 0x00000000, 0x0001c200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x01, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0001c200, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x01, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0001c200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0001c200, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 } }, { "PaRiTy=s Data=7 DTR=on", TRUE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x04, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x04, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "data=4", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "data=9", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "parity=no", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "stop=0", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "stop=1.501", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "stop=3", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "to=foobar", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { " baud=9600", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "baud= 9600", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "baud=9600,data=8", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "11,n,8,1", TRUE, TRUE, - { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "30 ,E, 5,1.5", TRUE, TRUE, - { 0x00000000, 0x0000012c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0000012c, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0000012c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0000012c, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "60, m, 6, 2 ", TRUE, TRUE, - { 0x00000000, 0x00000258, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00000258, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000258, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00000258, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "12 , o , 7 , 1", TRUE, TRUE, - { 0x00000000, 0x000004b0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x000004b0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x000004b0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x000004b0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "24,s,8,1.5", TRUE, TRUE, - { 0x00000000, 0x00000960, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x04, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00000960, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x04, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000960, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00000960, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x04, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "48,n,8,1,p", TRUE, TRUE, - { 0x00000000, 0x000012c0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x000012c0, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x000012c0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x000012c0, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,1 , x ", TRUE, TRUE, - { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "19, e, 7, 1, x", TRUE, TRUE, - { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "0,M,7,1,P", TRUE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x03, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00000000, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x03, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00000000, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "4000000000,O,7,1.5,X", TRUE, TRUE, - { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xee6b2800, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xee6b2800, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,1 to=on", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,NO,8,1", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,4,1", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,9,1", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,0", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,3", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,1,K", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COM0:baud=115200", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx:baud=38400 data=8", TRUE, FALSE, - { 0x00000000, 0x00009600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00009600, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00009600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00009600, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx :to=on stop=1.5", TRUE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 } }, { "COMx: baud=12345 data=7", TRUE, FALSE, - { 0x00000000, 0x00003039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00003039, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00003039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00003039, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx : xon=on odsr=off", TRUE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COM0:9600,N,8,1", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx:9600,N,8,1", TRUE, TRUE, - { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx: 11,E,7,2", TRUE, TRUE, - { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx :19,M,5,1", TRUE, TRUE, - { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x03, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x03, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx : 57600,S,6,2,x", TRUE, TRUE, - { 0x00000000, 0x0000e100, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x04, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0000e100, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x04, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0000e100, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0000e100, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x04, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, @@ -397,7 +397,7 @@ static TEST test[] = output the contents of a DCB structure. */ /*static print_dcb(DCB *pdcb) { - printf("0x%08x, 0x%08x, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, 0x%05x, 0x%04x, 0x%04x, 0x%04x, 0x%02x, 0x%02x, 0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, 0x%04x\n", + printf("0x%08x, 0x%08x, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, 0x%05x, 0x%04x, 0x%04x, 0x%04x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%04x\n", pdcb->DCBlength, pdcb->BaudRate, pdcb->fBinary, diff --git a/rostests/winetests/kernel32/console.c b/rostests/winetests/kernel32/console.c index ace4744067d..3d8ae9387d8 100755 --- a/rostests/winetests/kernel32/console.c +++ b/rostests/winetests/kernel32/console.c @@ -25,6 +25,7 @@ static BOOL (WINAPI *pGetConsoleInputExeNameA)(DWORD, LPSTR); static DWORD (WINAPI *pGetConsoleProcessList)(LPDWORD, DWORD); +static HANDLE (WINAPI *pOpenConsoleW)(LPCWSTR,DWORD,BOOL,DWORD); static BOOL (WINAPI *pSetConsoleInputExeNameA)(LPCSTR); /* DEFAULT_ATTRIB is used for all initial filling of the console. @@ -65,6 +66,7 @@ static void init_function_pointers(void) hKernel32 = GetModuleHandleA("kernel32.dll"); KERNEL32_GET_PROC(GetConsoleInputExeNameA); KERNEL32_GET_PROC(GetConsoleProcessList); + KERNEL32_GET_PROC(OpenConsoleW); KERNEL32_GET_PROC(SetConsoleInputExeNameA); #undef KERNEL32_GET_PROC @@ -988,6 +990,99 @@ static void test_GetConsoleProcessList(void) HeapFree(GetProcessHeap(), 0, list); } +static void test_OpenConsoleW(void) +{ + static const WCHAR coninW[] = {'C','O','N','I','N','$',0}; + static const WCHAR conoutW[] = {'C','O','N','O','U','T','$',0}; + static const WCHAR emptyW[] = {0}; + static const WCHAR invalidW[] = {'I','N','V','A','L','I','D',0}; + + static const struct + { + LPCWSTR name; + DWORD access; + BOOL inherit; + DWORD creation; + DWORD gle; + } invalid_table[] = { + {NULL, 0, FALSE, 0, ERROR_INVALID_PARAMETER}, + {NULL, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {NULL, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER}, + {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER}, + {emptyW, 0, FALSE, 0, ERROR_INVALID_PARAMETER}, + {emptyW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {emptyW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER}, + {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER}, + {invalidW, 0, FALSE, 0, ERROR_INVALID_PARAMETER}, + {invalidW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {invalidW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER}, + {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER}, + {coninW, 0, FALSE, 0, ERROR_SHARING_VIOLATION}, + {coninW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {coninW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_SHARING_VIOLATION}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_NEW, ERROR_SHARING_VIOLATION}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_ALWAYS, ERROR_SHARING_VIOLATION}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, TRUNCATE_EXISTING, ERROR_INVALID_PARAMETER}, + {conoutW, 0, FALSE, 0, ERROR_SHARING_VIOLATION}, + {conoutW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {conoutW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_SHARING_VIOLATION}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_NEW, ERROR_SHARING_VIOLATION}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_ALWAYS, ERROR_SHARING_VIOLATION}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, TRUNCATE_EXISTING, ERROR_INVALID_PARAMETER}, + }; + + int index; + HANDLE ret; + + if (!pOpenConsoleW) + { + win_skip("OpenConsoleW is not available\n"); + return; + } + + for (index = 0; index < sizeof(invalid_table)/sizeof(invalid_table[0]); index++) + { + SetLastError(0xdeadbeef); + ret = pOpenConsoleW(invalid_table[index].name, invalid_table[index].access, + invalid_table[index].inherit, invalid_table[index].creation); + ok(ret == INVALID_HANDLE_VALUE, + "Expected OpenConsoleW to return INVALID_HANDLE_VALUE for index %d, got %p\n", + index, ret); + ok(GetLastError() == invalid_table[index].gle, + "Expected GetLastError() to return %u for index %d, got %u\n", + invalid_table[index].gle, index, GetLastError()); + } + + /* OpenConsoleW should not touch the last error on success. */ + SetLastError(0xdeadbeef); + ret = pOpenConsoleW(coninW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING); + ok(ret != INVALID_HANDLE_VALUE, + "Expected OpenConsoleW to return a valid handle\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected the last error to be untouched, got %u\n", GetLastError()); + if (ret != INVALID_HANDLE_VALUE) + CloseHandle(ret); + + SetLastError(0xdeadbeef); + ret = pOpenConsoleW(conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING); + ok(ret != INVALID_HANDLE_VALUE, + "Expected OpenConsoleW to return a valid handle\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected the last error to be untouched, got %u\n", GetLastError()); + if (ret != INVALID_HANDLE_VALUE) + CloseHandle(ret); +} + START_TEST(console) { HANDLE hConIn, hConOut; @@ -1038,4 +1133,5 @@ START_TEST(console) test_GetSetConsoleInputExeName(); test_GetConsoleProcessList(); + test_OpenConsoleW(); } diff --git a/rostests/winetests/kernel32/debugger.c b/rostests/winetests/kernel32/debugger.c index 98d0e123848..ff091e939ef 100644 --- a/rostests/winetests/kernel32/debugger.c +++ b/rostests/winetests/kernel32/debugger.c @@ -45,6 +45,8 @@ static char** myARGV; static BOOL (WINAPI *pCheckRemoteDebuggerPresent)(HANDLE,PBOOL); static BOOL (WINAPI *pDebugActiveProcessStop)(DWORD); static BOOL (WINAPI *pDebugSetProcessKillOnExit)(BOOL); +static BOOL (WINAPI *pIsDebuggerPresent)(void); +static struct _TEB * (WINAPI *pNtCurrentTeb)(void); static LONG child_failures; @@ -499,6 +501,7 @@ static void doChild(int argc, char **argv) const char *blackbox_file; HANDLE parent; DWORD ppid; + BOOL debug; BOOL ret; blackbox_file = argv[4]; @@ -507,15 +510,46 @@ static void doChild(int argc, char **argv) parent = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ppid); child_ok(!!parent, "OpenProcess failed, last error %#x.\n", GetLastError()); + ret = pCheckRemoteDebuggerPresent(parent, &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(!debug, "Expected debug == 0, got %#x.\n", debug); + ret = DebugActiveProcess(ppid); child_ok(ret, "DebugActiveProcess failed, last error %#x.\n", GetLastError()); + ret = pCheckRemoteDebuggerPresent(parent, &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(debug, "Expected debug != 0, got %#x.\n", debug); + ret = pDebugActiveProcessStop(ppid); child_ok(ret, "DebugActiveProcessStop failed, last error %#x.\n", GetLastError()); + ret = pCheckRemoteDebuggerPresent(parent, &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(!debug, "Expected debug == 0, got %#x.\n", debug); + ret = CloseHandle(parent); child_ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); + ret = pIsDebuggerPresent(); + child_ok(ret, "Expected ret != 0, got %#x.\n", ret); + ret = pCheckRemoteDebuggerPresent(GetCurrentProcess(), &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(debug, "Expected debug != 0, got %#x.\n", debug); + + if (pNtCurrentTeb) + { + pNtCurrentTeb()->ProcessEnvironmentBlock->BeingDebugged = FALSE; + + ret = pIsDebuggerPresent(); + child_ok(!ret, "Expected ret != 0, got %#x.\n", ret); + ret = pCheckRemoteDebuggerPresent(GetCurrentProcess(), &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(debug, "Expected debug != 0, got %#x.\n", debug); + + pNtCurrentTeb()->ProcessEnvironmentBlock->BeingDebugged = TRUE; + } + blackbox.failures = child_failures; save_blackbox(blackbox_file, &blackbox, sizeof(blackbox)); } @@ -527,17 +561,21 @@ static void test_debug_loop(int argc, char **argv) char blackbox_file[MAX_PATH]; PROCESS_INFORMATION pi; STARTUPINFOA si; + BOOL debug; DWORD pid; char *cmd; BOOL ret; - if (!pDebugActiveProcessStop) + if (!pDebugActiveProcessStop || !pCheckRemoteDebuggerPresent) { - win_skip("DebugActiveProcessStop not available, skipping test.\n"); + win_skip("DebugActiveProcessStop or CheckRemoteDebuggerPresent not available, skipping test.\n"); return; } pid = GetCurrentProcessId(); + ret = DebugActiveProcess(pid); + ok(!ret, "DebugActiveProcess() succeeded on own process.\n"); + get_file_name(blackbox_file); cmd = HeapAlloc(GetProcessHeap(), 0, strlen(argv[0]) + strlen(arguments) + strlen(blackbox_file) + 10); sprintf(cmd, "%s%s%08x %s", argv[0], arguments, pid, blackbox_file); @@ -549,6 +587,10 @@ static void test_debug_loop(int argc, char **argv) HeapFree(GetProcessHeap(), 0, cmd); + ret = pCheckRemoteDebuggerPresent(pi.hProcess, &debug); + ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + ok(debug, "Expected debug != 0, got %#x.\n", debug); + for (;;) { DEBUG_EVENT ev; @@ -584,6 +626,9 @@ START_TEST(debugger) pCheckRemoteDebuggerPresent=(void*)GetProcAddress(hdll, "CheckRemoteDebuggerPresent"); pDebugActiveProcessStop=(void*)GetProcAddress(hdll, "DebugActiveProcessStop"); pDebugSetProcessKillOnExit=(void*)GetProcAddress(hdll, "DebugSetProcessKillOnExit"); + pIsDebuggerPresent=(void*)GetProcAddress(hdll, "IsDebuggerPresent"); + hdll=GetModuleHandle("ntdll.dll"); + if (hdll) pNtCurrentTeb = (void*)GetProcAddress(hdll, "NtCurrentTeb"); myARGC=winetest_get_mainargs(&myARGV); if (myARGC >= 3 && strcmp(myARGV[2], "crash") == 0) diff --git a/rostests/winetests/kernel32/generated.c b/rostests/winetests/kernel32/generated.c index be68a085936..36053b84916 100644 --- a/rostests/winetests/kernel32/generated.c +++ b/rostests/winetests/kernel32/generated.c @@ -51,47 +51,37 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_LPOSVERSIONINFOA(void) { /* LPOSVERSIONINFOA */ - TEST_TYPE_SIZE (LPOSVERSIONINFOA, 4) - TEST_TYPE_ALIGN (LPOSVERSIONINFOA, 4) + TEST_TYPE_SIZE (LPOSVERSIONINFOA, 8) + TEST_TYPE_ALIGN (LPOSVERSIONINFOA, 8) TEST_TARGET_SIZE (LPOSVERSIONINFOA, 148) TEST_TARGET_ALIGN(LPOSVERSIONINFOA, 4) } @@ -99,8 +89,8 @@ static void test_pack_LPOSVERSIONINFOA(void) static void test_pack_LPOSVERSIONINFOEXA(void) { /* LPOSVERSIONINFOEXA */ - TEST_TYPE_SIZE (LPOSVERSIONINFOEXA, 4) - TEST_TYPE_ALIGN (LPOSVERSIONINFOEXA, 4) + TEST_TYPE_SIZE (LPOSVERSIONINFOEXA, 8) + TEST_TYPE_ALIGN (LPOSVERSIONINFOEXA, 8) TEST_TARGET_SIZE (LPOSVERSIONINFOEXA, 156) TEST_TARGET_ALIGN(LPOSVERSIONINFOEXA, 4) } @@ -108,8 +98,8 @@ static void test_pack_LPOSVERSIONINFOEXA(void) static void test_pack_LPOSVERSIONINFOEXW(void) { /* LPOSVERSIONINFOEXW */ - TEST_TYPE_SIZE (LPOSVERSIONINFOEXW, 4) - TEST_TYPE_ALIGN (LPOSVERSIONINFOEXW, 4) + TEST_TYPE_SIZE (LPOSVERSIONINFOEXW, 8) + TEST_TYPE_ALIGN (LPOSVERSIONINFOEXW, 8) TEST_TARGET_SIZE (LPOSVERSIONINFOEXW, 284) TEST_TARGET_ALIGN(LPOSVERSIONINFOEXW, 4) } @@ -117,15 +107,15 @@ static void test_pack_LPOSVERSIONINFOEXW(void) static void test_pack_LPOSVERSIONINFOW(void) { /* LPOSVERSIONINFOW */ - TEST_TYPE_SIZE (LPOSVERSIONINFOW, 4) - TEST_TYPE_ALIGN (LPOSVERSIONINFOW, 4) + TEST_TYPE_SIZE (LPOSVERSIONINFOW, 8) + TEST_TYPE_ALIGN (LPOSVERSIONINFOW, 8) TEST_TARGET_SIZE (LPOSVERSIONINFOW, 276) TEST_TARGET_ALIGN(LPOSVERSIONINFOW, 4) } static void test_pack_OSVERSIONINFOA(void) { - /* OSVERSIONINFOA (pack 4) */ + /* OSVERSIONINFOA */ TEST_TYPE_SIZE (OSVERSIONINFOA, 148) TEST_TYPE_ALIGN (OSVERSIONINFOA, 4) TEST_FIELD_SIZE (OSVERSIONINFOA, dwOSVersionInfoSize, 4) @@ -150,7 +140,7 @@ static void test_pack_OSVERSIONINFOA(void) static void test_pack_OSVERSIONINFOEXA(void) { - /* OSVERSIONINFOEXA (pack 4) */ + /* OSVERSIONINFOEXA */ TEST_TYPE_SIZE (OSVERSIONINFOEXA, 156) TEST_TYPE_ALIGN (OSVERSIONINFOEXA, 4) TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwOSVersionInfoSize, 4) @@ -190,7 +180,7 @@ static void test_pack_OSVERSIONINFOEXA(void) static void test_pack_OSVERSIONINFOEXW(void) { - /* OSVERSIONINFOEXW (pack 4) */ + /* OSVERSIONINFOEXW */ TEST_TYPE_SIZE (OSVERSIONINFOEXW, 284) TEST_TYPE_ALIGN (OSVERSIONINFOEXW, 4) TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) @@ -230,7 +220,1864 @@ static void test_pack_OSVERSIONINFOEXW(void) static void test_pack_OSVERSIONINFOW(void) { - /* OSVERSIONINFOW (pack 4) */ + /* OSVERSIONINFOW */ + TEST_TYPE_SIZE (OSVERSIONINFOW, 276) + TEST_TYPE_ALIGN (OSVERSIONINFOW, 4) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwMinorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwMinorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwMinorVersion, 8) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwBuildNumber, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwBuildNumber, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwBuildNumber, 12) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwPlatformId, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwPlatformId, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwPlatformId, 16) + TEST_FIELD_SIZE (OSVERSIONINFOW, szCSDVersion, 256) + TEST_FIELD_ALIGN (OSVERSIONINFOW, szCSDVersion, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOW, szCSDVersion, 20) +} + +static void test_pack_POSVERSIONINFOA(void) +{ + /* POSVERSIONINFOA */ + TEST_TYPE_SIZE (POSVERSIONINFOA, 8) + TEST_TYPE_ALIGN (POSVERSIONINFOA, 8) + TEST_TARGET_SIZE (POSVERSIONINFOA, 148) + TEST_TARGET_ALIGN(POSVERSIONINFOA, 4) +} + +static void test_pack_POSVERSIONINFOEXA(void) +{ + /* POSVERSIONINFOEXA */ + TEST_TYPE_SIZE (POSVERSIONINFOEXA, 8) + TEST_TYPE_ALIGN (POSVERSIONINFOEXA, 8) + TEST_TARGET_SIZE (POSVERSIONINFOEXA, 156) + TEST_TARGET_ALIGN(POSVERSIONINFOEXA, 4) +} + +static void test_pack_POSVERSIONINFOEXW(void) +{ + /* POSVERSIONINFOEXW */ + TEST_TYPE_SIZE (POSVERSIONINFOEXW, 8) + TEST_TYPE_ALIGN (POSVERSIONINFOEXW, 8) + TEST_TARGET_SIZE (POSVERSIONINFOEXW, 284) + TEST_TARGET_ALIGN(POSVERSIONINFOEXW, 4) +} + +static void test_pack_POSVERSIONINFOW(void) +{ + /* POSVERSIONINFOW */ + TEST_TYPE_SIZE (POSVERSIONINFOW, 8) + TEST_TYPE_ALIGN (POSVERSIONINFOW, 8) + TEST_TARGET_SIZE (POSVERSIONINFOW, 276) + TEST_TARGET_ALIGN(POSVERSIONINFOW, 4) +} + +static void test_pack_LPLONG(void) +{ + /* LPLONG */ + TEST_TYPE_SIZE (LPLONG, 8) + TEST_TYPE_ALIGN (LPLONG, 8) +} + +static void test_pack_LPVOID(void) +{ + /* LPVOID */ + TEST_TYPE_SIZE (LPVOID, 8) + TEST_TYPE_ALIGN (LPVOID, 8) +} + +static void test_pack_PHKEY(void) +{ + /* PHKEY */ + TEST_TYPE_SIZE (PHKEY, 8) + TEST_TYPE_ALIGN (PHKEY, 8) +} + +static void test_pack_ACTCTXA(void) +{ + /* ACTCTXA */ + TEST_TYPE_SIZE (ACTCTXA, 56) + TEST_TYPE_ALIGN (ACTCTXA, 8) + TEST_FIELD_SIZE (ACTCTXA, cbSize, 4) + TEST_FIELD_ALIGN (ACTCTXA, cbSize, 4) + TEST_FIELD_OFFSET(ACTCTXA, cbSize, 0) + TEST_FIELD_SIZE (ACTCTXA, dwFlags, 4) + TEST_FIELD_ALIGN (ACTCTXA, dwFlags, 4) + TEST_FIELD_OFFSET(ACTCTXA, dwFlags, 4) + TEST_FIELD_SIZE (ACTCTXA, lpSource, 8) + TEST_FIELD_ALIGN (ACTCTXA, lpSource, 8) + TEST_FIELD_OFFSET(ACTCTXA, lpSource, 8) + TEST_FIELD_SIZE (ACTCTXA, wProcessorArchitecture, 2) + TEST_FIELD_ALIGN (ACTCTXA, wProcessorArchitecture, 2) + TEST_FIELD_OFFSET(ACTCTXA, wProcessorArchitecture, 16) + TEST_FIELD_SIZE (ACTCTXA, wLangId, 2) + TEST_FIELD_ALIGN (ACTCTXA, wLangId, 2) + TEST_FIELD_OFFSET(ACTCTXA, wLangId, 18) + TEST_FIELD_SIZE (ACTCTXA, lpAssemblyDirectory, 8) + TEST_FIELD_ALIGN (ACTCTXA, lpAssemblyDirectory, 8) + TEST_FIELD_OFFSET(ACTCTXA, lpAssemblyDirectory, 24) + TEST_FIELD_SIZE (ACTCTXA, lpResourceName, 8) + TEST_FIELD_ALIGN (ACTCTXA, lpResourceName, 8) + TEST_FIELD_OFFSET(ACTCTXA, lpResourceName, 32) + TEST_FIELD_SIZE (ACTCTXA, lpApplicationName, 8) + TEST_FIELD_ALIGN (ACTCTXA, lpApplicationName, 8) + TEST_FIELD_OFFSET(ACTCTXA, lpApplicationName, 40) + TEST_FIELD_SIZE (ACTCTXA, hModule, 8) + TEST_FIELD_ALIGN (ACTCTXA, hModule, 8) + TEST_FIELD_OFFSET(ACTCTXA, hModule, 48) +} + +static void test_pack_ACTCTXW(void) +{ + /* ACTCTXW */ + TEST_TYPE_SIZE (ACTCTXW, 56) + TEST_TYPE_ALIGN (ACTCTXW, 8) + TEST_FIELD_SIZE (ACTCTXW, cbSize, 4) + TEST_FIELD_ALIGN (ACTCTXW, cbSize, 4) + TEST_FIELD_OFFSET(ACTCTXW, cbSize, 0) + TEST_FIELD_SIZE (ACTCTXW, dwFlags, 4) + TEST_FIELD_ALIGN (ACTCTXW, dwFlags, 4) + TEST_FIELD_OFFSET(ACTCTXW, dwFlags, 4) + TEST_FIELD_SIZE (ACTCTXW, lpSource, 8) + TEST_FIELD_ALIGN (ACTCTXW, lpSource, 8) + TEST_FIELD_OFFSET(ACTCTXW, lpSource, 8) + TEST_FIELD_SIZE (ACTCTXW, wProcessorArchitecture, 2) + TEST_FIELD_ALIGN (ACTCTXW, wProcessorArchitecture, 2) + TEST_FIELD_OFFSET(ACTCTXW, wProcessorArchitecture, 16) + TEST_FIELD_SIZE (ACTCTXW, wLangId, 2) + TEST_FIELD_ALIGN (ACTCTXW, wLangId, 2) + TEST_FIELD_OFFSET(ACTCTXW, wLangId, 18) + TEST_FIELD_SIZE (ACTCTXW, lpAssemblyDirectory, 8) + TEST_FIELD_ALIGN (ACTCTXW, lpAssemblyDirectory, 8) + TEST_FIELD_OFFSET(ACTCTXW, lpAssemblyDirectory, 24) + TEST_FIELD_SIZE (ACTCTXW, lpResourceName, 8) + TEST_FIELD_ALIGN (ACTCTXW, lpResourceName, 8) + TEST_FIELD_OFFSET(ACTCTXW, lpResourceName, 32) + TEST_FIELD_SIZE (ACTCTXW, lpApplicationName, 8) + TEST_FIELD_ALIGN (ACTCTXW, lpApplicationName, 8) + TEST_FIELD_OFFSET(ACTCTXW, lpApplicationName, 40) + TEST_FIELD_SIZE (ACTCTXW, hModule, 8) + TEST_FIELD_ALIGN (ACTCTXW, hModule, 8) + TEST_FIELD_OFFSET(ACTCTXW, hModule, 48) +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA(void) +{ + /* ACTCTX_SECTION_KEYED_DATA */ + TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA, 112) + TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, cbSize, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, cbSize, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, cbSize, 0) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulDataFormatVersion, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulDataFormatVersion, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulDataFormatVersion, 4) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, lpData, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, lpData, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, lpData, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulLength, 16) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, lpSectionGlobalData, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, lpSectionGlobalData, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, lpSectionGlobalData, 24) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulSectionGlobalDataLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulSectionGlobalDataLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulSectionGlobalDataLength, 32) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, lpSectionBase, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, lpSectionBase, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, lpSectionBase, 40) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulSectionTotalLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulSectionTotalLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulSectionTotalLength, 48) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, hActCtx, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, hActCtx, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, hActCtx, 56) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex, 64) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulFlags, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulFlags, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulFlags, 68) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, AssemblyMetadata, 40) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, AssemblyMetadata, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, AssemblyMetadata, 72) +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* ACTCTX_SECTION_KEYED_DATA_2600 */ + TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, 72) + TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, cbSize, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, cbSize, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, cbSize, 0) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulDataFormatVersion, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulDataFormatVersion, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulDataFormatVersion, 4) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, lpData, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, lpData, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, lpData, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulLength, 16) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, lpSectionGlobalData, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, lpSectionGlobalData, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, lpSectionGlobalData, 24) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulSectionGlobalDataLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulSectionGlobalDataLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulSectionGlobalDataLength, 32) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, lpSectionBase, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, lpSectionBase, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, lpSectionBase, 40) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulSectionTotalLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulSectionTotalLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulSectionTotalLength, 48) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, hActCtx, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, hActCtx, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, hActCtx, 56) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulAssemblyRosterIndex, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulAssemblyRosterIndex, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulAssemblyRosterIndex, 64) +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ + TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 40) + TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpInformation, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpInformation, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpInformation, 0) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionBase, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionBase, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionBase, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionLength, 16) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionGlobalDataBase, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionGlobalDataBase, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionGlobalDataBase, 24) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionGlobalDataLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionGlobalDataLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionGlobalDataLength, 32) +} + +static void test_pack_ACTIVATION_CONTEXT_BASIC_INFORMATION(void) +{ + /* ACTIVATION_CONTEXT_BASIC_INFORMATION */ + TEST_TYPE_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, 16) + TEST_TYPE_ALIGN (ACTIVATION_CONTEXT_BASIC_INFORMATION, 8) + TEST_FIELD_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, hActCtx, 8) + TEST_FIELD_ALIGN (ACTIVATION_CONTEXT_BASIC_INFORMATION, hActCtx, 8) + TEST_FIELD_OFFSET(ACTIVATION_CONTEXT_BASIC_INFORMATION, hActCtx, 0) + TEST_FIELD_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, dwFlags, 4) + TEST_FIELD_ALIGN (ACTIVATION_CONTEXT_BASIC_INFORMATION, dwFlags, 4) + TEST_FIELD_OFFSET(ACTIVATION_CONTEXT_BASIC_INFORMATION, dwFlags, 8) +} + +static void test_pack_BY_HANDLE_FILE_INFORMATION(void) +{ + /* BY_HANDLE_FILE_INFORMATION */ + TEST_TYPE_SIZE (BY_HANDLE_FILE_INFORMATION, 52) + TEST_TYPE_ALIGN (BY_HANDLE_FILE_INFORMATION, 4) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, dwFileAttributes, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, dwFileAttributes, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, dwFileAttributes, 0) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, ftCreationTime, 8) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, ftCreationTime, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, ftCreationTime, 4) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, ftLastAccessTime, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, ftLastAccessTime, 12) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, ftLastWriteTime, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, ftLastWriteTime, 20) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, dwVolumeSerialNumber, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, dwVolumeSerialNumber, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, dwVolumeSerialNumber, 28) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nFileSizeHigh, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nFileSizeHigh, 32) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nFileSizeLow, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nFileSizeLow, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nFileSizeLow, 36) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nNumberOfLinks, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nNumberOfLinks, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nNumberOfLinks, 40) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nFileIndexHigh, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nFileIndexHigh, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nFileIndexHigh, 44) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nFileIndexLow, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nFileIndexLow, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nFileIndexLow, 48) +} + +static void test_pack_COMMCONFIG(void) +{ + /* COMMCONFIG */ + TEST_TYPE_SIZE (COMMCONFIG, 52) + TEST_TYPE_ALIGN (COMMCONFIG, 4) + TEST_FIELD_SIZE (COMMCONFIG, dwSize, 4) + TEST_FIELD_ALIGN (COMMCONFIG, dwSize, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dwSize, 0) + TEST_FIELD_SIZE (COMMCONFIG, wVersion, 2) + TEST_FIELD_ALIGN (COMMCONFIG, wVersion, 2) + TEST_FIELD_OFFSET(COMMCONFIG, wVersion, 4) + TEST_FIELD_SIZE (COMMCONFIG, wReserved, 2) + TEST_FIELD_ALIGN (COMMCONFIG, wReserved, 2) + TEST_FIELD_OFFSET(COMMCONFIG, wReserved, 6) + TEST_FIELD_SIZE (COMMCONFIG, dcb, 28) + TEST_FIELD_ALIGN (COMMCONFIG, dcb, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dcb, 8) + TEST_FIELD_SIZE (COMMCONFIG, dwProviderSubType, 4) + TEST_FIELD_ALIGN (COMMCONFIG, dwProviderSubType, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dwProviderSubType, 36) + TEST_FIELD_SIZE (COMMCONFIG, dwProviderOffset, 4) + TEST_FIELD_ALIGN (COMMCONFIG, dwProviderOffset, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dwProviderOffset, 40) + TEST_FIELD_SIZE (COMMCONFIG, dwProviderSize, 4) + TEST_FIELD_ALIGN (COMMCONFIG, dwProviderSize, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dwProviderSize, 44) + TEST_FIELD_SIZE (COMMCONFIG, wcProviderData, 4) + TEST_FIELD_ALIGN (COMMCONFIG, wcProviderData, 4) + TEST_FIELD_OFFSET(COMMCONFIG, wcProviderData, 48) +} + +static void test_pack_COMMPROP(void) +{ + /* COMMPROP */ + TEST_TYPE_SIZE (COMMPROP, 64) + TEST_TYPE_ALIGN (COMMPROP, 4) + TEST_FIELD_SIZE (COMMPROP, wPacketLength, 2) + TEST_FIELD_ALIGN (COMMPROP, wPacketLength, 2) + TEST_FIELD_OFFSET(COMMPROP, wPacketLength, 0) + TEST_FIELD_SIZE (COMMPROP, wPacketVersion, 2) + TEST_FIELD_ALIGN (COMMPROP, wPacketVersion, 2) + TEST_FIELD_OFFSET(COMMPROP, wPacketVersion, 2) + TEST_FIELD_SIZE (COMMPROP, dwServiceMask, 4) + TEST_FIELD_ALIGN (COMMPROP, dwServiceMask, 4) + TEST_FIELD_OFFSET(COMMPROP, dwServiceMask, 4) + TEST_FIELD_SIZE (COMMPROP, dwReserved1, 4) + TEST_FIELD_ALIGN (COMMPROP, dwReserved1, 4) + TEST_FIELD_OFFSET(COMMPROP, dwReserved1, 8) + TEST_FIELD_SIZE (COMMPROP, dwMaxTxQueue, 4) + TEST_FIELD_ALIGN (COMMPROP, dwMaxTxQueue, 4) + TEST_FIELD_OFFSET(COMMPROP, dwMaxTxQueue, 12) + TEST_FIELD_SIZE (COMMPROP, dwMaxRxQueue, 4) + TEST_FIELD_ALIGN (COMMPROP, dwMaxRxQueue, 4) + TEST_FIELD_OFFSET(COMMPROP, dwMaxRxQueue, 16) + TEST_FIELD_SIZE (COMMPROP, dwMaxBaud, 4) + TEST_FIELD_ALIGN (COMMPROP, dwMaxBaud, 4) + TEST_FIELD_OFFSET(COMMPROP, dwMaxBaud, 20) + TEST_FIELD_SIZE (COMMPROP, dwProvSubType, 4) + TEST_FIELD_ALIGN (COMMPROP, dwProvSubType, 4) + TEST_FIELD_OFFSET(COMMPROP, dwProvSubType, 24) + TEST_FIELD_SIZE (COMMPROP, dwProvCapabilities, 4) + TEST_FIELD_ALIGN (COMMPROP, dwProvCapabilities, 4) + TEST_FIELD_OFFSET(COMMPROP, dwProvCapabilities, 28) + TEST_FIELD_SIZE (COMMPROP, dwSettableParams, 4) + TEST_FIELD_ALIGN (COMMPROP, dwSettableParams, 4) + TEST_FIELD_OFFSET(COMMPROP, dwSettableParams, 32) + TEST_FIELD_SIZE (COMMPROP, dwSettableBaud, 4) + TEST_FIELD_ALIGN (COMMPROP, dwSettableBaud, 4) + TEST_FIELD_OFFSET(COMMPROP, dwSettableBaud, 36) + TEST_FIELD_SIZE (COMMPROP, wSettableData, 2) + TEST_FIELD_ALIGN (COMMPROP, wSettableData, 2) + TEST_FIELD_OFFSET(COMMPROP, wSettableData, 40) + TEST_FIELD_SIZE (COMMPROP, wSettableStopParity, 2) + TEST_FIELD_ALIGN (COMMPROP, wSettableStopParity, 2) + TEST_FIELD_OFFSET(COMMPROP, wSettableStopParity, 42) + TEST_FIELD_SIZE (COMMPROP, dwCurrentTxQueue, 4) + TEST_FIELD_ALIGN (COMMPROP, dwCurrentTxQueue, 4) + TEST_FIELD_OFFSET(COMMPROP, dwCurrentTxQueue, 44) + TEST_FIELD_SIZE (COMMPROP, dwCurrentRxQueue, 4) + TEST_FIELD_ALIGN (COMMPROP, dwCurrentRxQueue, 4) + TEST_FIELD_OFFSET(COMMPROP, dwCurrentRxQueue, 48) + TEST_FIELD_SIZE (COMMPROP, dwProvSpec1, 4) + TEST_FIELD_ALIGN (COMMPROP, dwProvSpec1, 4) + TEST_FIELD_OFFSET(COMMPROP, dwProvSpec1, 52) + TEST_FIELD_SIZE (COMMPROP, dwProvSpec2, 4) + TEST_FIELD_ALIGN (COMMPROP, dwProvSpec2, 4) + TEST_FIELD_OFFSET(COMMPROP, dwProvSpec2, 56) + TEST_FIELD_SIZE (COMMPROP, wcProvChar, 2) + TEST_FIELD_ALIGN (COMMPROP, wcProvChar, 2) + TEST_FIELD_OFFSET(COMMPROP, wcProvChar, 60) +} + +static void test_pack_COMMTIMEOUTS(void) +{ + /* COMMTIMEOUTS */ + TEST_TYPE_SIZE (COMMTIMEOUTS, 20) + TEST_TYPE_ALIGN (COMMTIMEOUTS, 4) + TEST_FIELD_SIZE (COMMTIMEOUTS, ReadIntervalTimeout, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, ReadIntervalTimeout, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, ReadIntervalTimeout, 0) + TEST_FIELD_SIZE (COMMTIMEOUTS, ReadTotalTimeoutMultiplier, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, ReadTotalTimeoutMultiplier, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, ReadTotalTimeoutMultiplier, 4) + TEST_FIELD_SIZE (COMMTIMEOUTS, ReadTotalTimeoutConstant, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, ReadTotalTimeoutConstant, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, ReadTotalTimeoutConstant, 8) + TEST_FIELD_SIZE (COMMTIMEOUTS, WriteTotalTimeoutMultiplier, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, WriteTotalTimeoutMultiplier, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, WriteTotalTimeoutMultiplier, 12) + TEST_FIELD_SIZE (COMMTIMEOUTS, WriteTotalTimeoutConstant, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, WriteTotalTimeoutConstant, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, WriteTotalTimeoutConstant, 16) +} + +static void test_pack_COMSTAT(void) +{ + /* COMSTAT */ + TEST_TYPE_SIZE (COMSTAT, 12) + TEST_TYPE_ALIGN (COMSTAT, 4) + TEST_FIELD_SIZE (COMSTAT, cbInQue, 4) + TEST_FIELD_ALIGN (COMSTAT, cbInQue, 4) + TEST_FIELD_OFFSET(COMSTAT, cbInQue, 4) + TEST_FIELD_SIZE (COMSTAT, cbOutQue, 4) + TEST_FIELD_ALIGN (COMSTAT, cbOutQue, 4) + TEST_FIELD_OFFSET(COMSTAT, cbOutQue, 8) +} + +static void test_pack_CREATE_PROCESS_DEBUG_INFO(void) +{ + /* CREATE_PROCESS_DEBUG_INFO */ + TEST_TYPE_SIZE (CREATE_PROCESS_DEBUG_INFO, 72) + TEST_TYPE_ALIGN (CREATE_PROCESS_DEBUG_INFO, 8) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, hFile, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, hFile, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, hFile, 0) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, hProcess, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, hProcess, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, hProcess, 8) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, hThread, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, hThread, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, hThread, 16) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, lpBaseOfImage, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, lpBaseOfImage, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, lpBaseOfImage, 24) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, dwDebugInfoFileOffset, 4) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, dwDebugInfoFileOffset, 4) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, dwDebugInfoFileOffset, 32) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, nDebugInfoSize, 4) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, nDebugInfoSize, 4) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, nDebugInfoSize, 36) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, lpThreadLocalBase, 40) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, lpStartAddress, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, lpStartAddress, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, lpStartAddress, 48) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, lpImageName, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, lpImageName, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, lpImageName, 56) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, fUnicode, 2) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, fUnicode, 2) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, fUnicode, 64) +} + +static void test_pack_CREATE_THREAD_DEBUG_INFO(void) +{ + /* CREATE_THREAD_DEBUG_INFO */ + TEST_TYPE_SIZE (CREATE_THREAD_DEBUG_INFO, 24) + TEST_TYPE_ALIGN (CREATE_THREAD_DEBUG_INFO, 8) + TEST_FIELD_SIZE (CREATE_THREAD_DEBUG_INFO, hThread, 8) + TEST_FIELD_ALIGN (CREATE_THREAD_DEBUG_INFO, hThread, 8) + TEST_FIELD_OFFSET(CREATE_THREAD_DEBUG_INFO, hThread, 0) + TEST_FIELD_SIZE (CREATE_THREAD_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_ALIGN (CREATE_THREAD_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_OFFSET(CREATE_THREAD_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_SIZE (CREATE_THREAD_DEBUG_INFO, lpStartAddress, 8) + TEST_FIELD_ALIGN (CREATE_THREAD_DEBUG_INFO, lpStartAddress, 8) + TEST_FIELD_OFFSET(CREATE_THREAD_DEBUG_INFO, lpStartAddress, 16) +} + +static void test_pack_CRITICAL_SECTION(void) +{ + /* CRITICAL_SECTION */ + TEST_TYPE_SIZE (CRITICAL_SECTION, 40) + TEST_TYPE_ALIGN (CRITICAL_SECTION, 8) +} + +static void test_pack_CRITICAL_SECTION_DEBUG(void) +{ + /* CRITICAL_SECTION_DEBUG */ +} + +static void test_pack_DCB(void) +{ + /* DCB */ + TEST_TYPE_SIZE (DCB, 28) + TEST_TYPE_ALIGN (DCB, 4) + TEST_FIELD_SIZE (DCB, DCBlength, 4) + TEST_FIELD_ALIGN (DCB, DCBlength, 4) + TEST_FIELD_OFFSET(DCB, DCBlength, 0) + TEST_FIELD_SIZE (DCB, BaudRate, 4) + TEST_FIELD_ALIGN (DCB, BaudRate, 4) + TEST_FIELD_OFFSET(DCB, BaudRate, 4) + TEST_FIELD_SIZE (DCB, wReserved, 2) + TEST_FIELD_ALIGN (DCB, wReserved, 2) + TEST_FIELD_OFFSET(DCB, wReserved, 12) + TEST_FIELD_SIZE (DCB, XonLim, 2) + TEST_FIELD_ALIGN (DCB, XonLim, 2) + TEST_FIELD_OFFSET(DCB, XonLim, 14) + TEST_FIELD_SIZE (DCB, XoffLim, 2) + TEST_FIELD_ALIGN (DCB, XoffLim, 2) + TEST_FIELD_OFFSET(DCB, XoffLim, 16) + TEST_FIELD_SIZE (DCB, ByteSize, 1) + TEST_FIELD_ALIGN (DCB, ByteSize, 1) + TEST_FIELD_OFFSET(DCB, ByteSize, 18) + TEST_FIELD_SIZE (DCB, Parity, 1) + TEST_FIELD_ALIGN (DCB, Parity, 1) + TEST_FIELD_OFFSET(DCB, Parity, 19) + TEST_FIELD_SIZE (DCB, StopBits, 1) + TEST_FIELD_ALIGN (DCB, StopBits, 1) + TEST_FIELD_OFFSET(DCB, StopBits, 20) + TEST_FIELD_SIZE (DCB, XonChar, 1) + TEST_FIELD_ALIGN (DCB, XonChar, 1) + TEST_FIELD_OFFSET(DCB, XonChar, 21) + TEST_FIELD_SIZE (DCB, XoffChar, 1) + TEST_FIELD_ALIGN (DCB, XoffChar, 1) + TEST_FIELD_OFFSET(DCB, XoffChar, 22) + TEST_FIELD_SIZE (DCB, ErrorChar, 1) + TEST_FIELD_ALIGN (DCB, ErrorChar, 1) + TEST_FIELD_OFFSET(DCB, ErrorChar, 23) + TEST_FIELD_SIZE (DCB, EofChar, 1) + TEST_FIELD_ALIGN (DCB, EofChar, 1) + TEST_FIELD_OFFSET(DCB, EofChar, 24) + TEST_FIELD_SIZE (DCB, EvtChar, 1) + TEST_FIELD_ALIGN (DCB, EvtChar, 1) + TEST_FIELD_OFFSET(DCB, EvtChar, 25) + TEST_FIELD_SIZE (DCB, wReserved1, 2) + TEST_FIELD_ALIGN (DCB, wReserved1, 2) + TEST_FIELD_OFFSET(DCB, wReserved1, 26) +} + +static void test_pack_DEBUG_EVENT(void) +{ + /* DEBUG_EVENT */ + TEST_FIELD_SIZE (DEBUG_EVENT, dwDebugEventCode, 4) + TEST_FIELD_ALIGN (DEBUG_EVENT, dwDebugEventCode, 4) + TEST_FIELD_OFFSET(DEBUG_EVENT, dwDebugEventCode, 0) + TEST_FIELD_SIZE (DEBUG_EVENT, dwProcessId, 4) + TEST_FIELD_ALIGN (DEBUG_EVENT, dwProcessId, 4) + TEST_FIELD_OFFSET(DEBUG_EVENT, dwProcessId, 4) + TEST_FIELD_SIZE (DEBUG_EVENT, dwThreadId, 4) + TEST_FIELD_ALIGN (DEBUG_EVENT, dwThreadId, 4) + TEST_FIELD_OFFSET(DEBUG_EVENT, dwThreadId, 8) +} + +static void test_pack_ENUMRESLANGPROCA(void) +{ + /* ENUMRESLANGPROCA */ + TEST_TYPE_SIZE (ENUMRESLANGPROCA, 8) + TEST_TYPE_ALIGN (ENUMRESLANGPROCA, 8) +} + +static void test_pack_ENUMRESLANGPROCW(void) +{ + /* ENUMRESLANGPROCW */ + TEST_TYPE_SIZE (ENUMRESLANGPROCW, 8) + TEST_TYPE_ALIGN (ENUMRESLANGPROCW, 8) +} + +static void test_pack_ENUMRESNAMEPROCA(void) +{ + /* ENUMRESNAMEPROCA */ + TEST_TYPE_SIZE (ENUMRESNAMEPROCA, 8) + TEST_TYPE_ALIGN (ENUMRESNAMEPROCA, 8) +} + +static void test_pack_ENUMRESNAMEPROCW(void) +{ + /* ENUMRESNAMEPROCW */ + TEST_TYPE_SIZE (ENUMRESNAMEPROCW, 8) + TEST_TYPE_ALIGN (ENUMRESNAMEPROCW, 8) +} + +static void test_pack_ENUMRESTYPEPROCA(void) +{ + /* ENUMRESTYPEPROCA */ + TEST_TYPE_SIZE (ENUMRESTYPEPROCA, 8) + TEST_TYPE_ALIGN (ENUMRESTYPEPROCA, 8) +} + +static void test_pack_ENUMRESTYPEPROCW(void) +{ + /* ENUMRESTYPEPROCW */ + TEST_TYPE_SIZE (ENUMRESTYPEPROCW, 8) + TEST_TYPE_ALIGN (ENUMRESTYPEPROCW, 8) +} + +static void test_pack_EXCEPTION_DEBUG_INFO(void) +{ + /* EXCEPTION_DEBUG_INFO */ + TEST_TYPE_SIZE (EXCEPTION_DEBUG_INFO, 160) + TEST_TYPE_ALIGN (EXCEPTION_DEBUG_INFO, 8) + TEST_FIELD_SIZE (EXCEPTION_DEBUG_INFO, ExceptionRecord, 152) + TEST_FIELD_ALIGN (EXCEPTION_DEBUG_INFO, ExceptionRecord, 8) + TEST_FIELD_OFFSET(EXCEPTION_DEBUG_INFO, ExceptionRecord, 0) + TEST_FIELD_SIZE (EXCEPTION_DEBUG_INFO, dwFirstChance, 4) + TEST_FIELD_ALIGN (EXCEPTION_DEBUG_INFO, dwFirstChance, 4) + TEST_FIELD_OFFSET(EXCEPTION_DEBUG_INFO, dwFirstChance, 152) +} + +static void test_pack_EXIT_PROCESS_DEBUG_INFO(void) +{ + /* EXIT_PROCESS_DEBUG_INFO */ + TEST_TYPE_SIZE (EXIT_PROCESS_DEBUG_INFO, 4) + TEST_TYPE_ALIGN (EXIT_PROCESS_DEBUG_INFO, 4) + TEST_FIELD_SIZE (EXIT_PROCESS_DEBUG_INFO, dwExitCode, 4) + TEST_FIELD_ALIGN (EXIT_PROCESS_DEBUG_INFO, dwExitCode, 4) + TEST_FIELD_OFFSET(EXIT_PROCESS_DEBUG_INFO, dwExitCode, 0) +} + +static void test_pack_EXIT_THREAD_DEBUG_INFO(void) +{ + /* EXIT_THREAD_DEBUG_INFO */ + TEST_TYPE_SIZE (EXIT_THREAD_DEBUG_INFO, 4) + TEST_TYPE_ALIGN (EXIT_THREAD_DEBUG_INFO, 4) + TEST_FIELD_SIZE (EXIT_THREAD_DEBUG_INFO, dwExitCode, 4) + TEST_FIELD_ALIGN (EXIT_THREAD_DEBUG_INFO, dwExitCode, 4) + TEST_FIELD_OFFSET(EXIT_THREAD_DEBUG_INFO, dwExitCode, 0) +} + +static void test_pack_HW_PROFILE_INFOA(void) +{ + /* HW_PROFILE_INFOA */ + TEST_TYPE_SIZE (HW_PROFILE_INFOA, 124) + TEST_TYPE_ALIGN (HW_PROFILE_INFOA, 4) + TEST_FIELD_SIZE (HW_PROFILE_INFOA, dwDockInfo, 4) + TEST_FIELD_ALIGN (HW_PROFILE_INFOA, dwDockInfo, 4) + TEST_FIELD_OFFSET(HW_PROFILE_INFOA, dwDockInfo, 0) + TEST_FIELD_SIZE (HW_PROFILE_INFOA, szHwProfileGuid, 39) + TEST_FIELD_ALIGN (HW_PROFILE_INFOA, szHwProfileGuid, 1) + TEST_FIELD_OFFSET(HW_PROFILE_INFOA, szHwProfileGuid, 4) + TEST_FIELD_SIZE (HW_PROFILE_INFOA, szHwProfileName, 80) + TEST_FIELD_ALIGN (HW_PROFILE_INFOA, szHwProfileName, 1) + TEST_FIELD_OFFSET(HW_PROFILE_INFOA, szHwProfileName, 43) +} + +static void test_pack_HW_PROFILE_INFOW(void) +{ + /* HW_PROFILE_INFOW */ + TEST_TYPE_SIZE (HW_PROFILE_INFOW, 244) + TEST_TYPE_ALIGN (HW_PROFILE_INFOW, 4) + TEST_FIELD_SIZE (HW_PROFILE_INFOW, dwDockInfo, 4) + TEST_FIELD_ALIGN (HW_PROFILE_INFOW, dwDockInfo, 4) + TEST_FIELD_OFFSET(HW_PROFILE_INFOW, dwDockInfo, 0) + TEST_FIELD_SIZE (HW_PROFILE_INFOW, szHwProfileGuid, 78) + TEST_FIELD_ALIGN (HW_PROFILE_INFOW, szHwProfileGuid, 2) + TEST_FIELD_OFFSET(HW_PROFILE_INFOW, szHwProfileGuid, 4) + TEST_FIELD_SIZE (HW_PROFILE_INFOW, szHwProfileName, 160) + TEST_FIELD_ALIGN (HW_PROFILE_INFOW, szHwProfileName, 2) + TEST_FIELD_OFFSET(HW_PROFILE_INFOW, szHwProfileName, 82) +} + +static void test_pack_LOAD_DLL_DEBUG_INFO(void) +{ + /* LOAD_DLL_DEBUG_INFO */ + TEST_TYPE_SIZE (LOAD_DLL_DEBUG_INFO, 40) + TEST_TYPE_ALIGN (LOAD_DLL_DEBUG_INFO, 8) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, hFile, 8) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, hFile, 8) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, hFile, 0) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, dwDebugInfoFileOffset, 4) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, dwDebugInfoFileOffset, 4) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, dwDebugInfoFileOffset, 16) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, nDebugInfoSize, 4) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, nDebugInfoSize, 4) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, nDebugInfoSize, 20) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, lpImageName, 8) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, lpImageName, 8) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, lpImageName, 24) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, fUnicode, 2) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, fUnicode, 2) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, fUnicode, 32) +} + +static void test_pack_LPBY_HANDLE_FILE_INFORMATION(void) +{ + /* LPBY_HANDLE_FILE_INFORMATION */ + TEST_TYPE_SIZE (LPBY_HANDLE_FILE_INFORMATION, 8) + TEST_TYPE_ALIGN (LPBY_HANDLE_FILE_INFORMATION, 8) + TEST_TARGET_SIZE (LPBY_HANDLE_FILE_INFORMATION, 52) + TEST_TARGET_ALIGN(LPBY_HANDLE_FILE_INFORMATION, 4) +} + +static void test_pack_LPCOMMCONFIG(void) +{ + /* LPCOMMCONFIG */ + TEST_TYPE_SIZE (LPCOMMCONFIG, 8) + TEST_TYPE_ALIGN (LPCOMMCONFIG, 8) + TEST_TARGET_SIZE (LPCOMMCONFIG, 52) + TEST_TARGET_ALIGN(LPCOMMCONFIG, 4) +} + +static void test_pack_LPCOMMPROP(void) +{ + /* LPCOMMPROP */ + TEST_TYPE_SIZE (LPCOMMPROP, 8) + TEST_TYPE_ALIGN (LPCOMMPROP, 8) + TEST_TARGET_SIZE (LPCOMMPROP, 64) + TEST_TARGET_ALIGN(LPCOMMPROP, 4) +} + +static void test_pack_LPCOMMTIMEOUTS(void) +{ + /* LPCOMMTIMEOUTS */ + TEST_TYPE_SIZE (LPCOMMTIMEOUTS, 8) + TEST_TYPE_ALIGN (LPCOMMTIMEOUTS, 8) + TEST_TARGET_SIZE (LPCOMMTIMEOUTS, 20) + TEST_TARGET_ALIGN(LPCOMMTIMEOUTS, 4) +} + +static void test_pack_LPCOMSTAT(void) +{ + /* LPCOMSTAT */ + TEST_TYPE_SIZE (LPCOMSTAT, 8) + TEST_TYPE_ALIGN (LPCOMSTAT, 8) + TEST_TARGET_SIZE (LPCOMSTAT, 12) + TEST_TARGET_ALIGN(LPCOMSTAT, 4) +} + +static void test_pack_LPCRITICAL_SECTION(void) +{ + /* LPCRITICAL_SECTION */ + TEST_TYPE_SIZE (LPCRITICAL_SECTION, 8) + TEST_TYPE_ALIGN (LPCRITICAL_SECTION, 8) +} + +static void test_pack_LPCRITICAL_SECTION_DEBUG(void) +{ + /* LPCRITICAL_SECTION_DEBUG */ + TEST_TYPE_SIZE (LPCRITICAL_SECTION_DEBUG, 8) + TEST_TYPE_ALIGN (LPCRITICAL_SECTION_DEBUG, 8) +} + +static void test_pack_LPDCB(void) +{ + /* LPDCB */ + TEST_TYPE_SIZE (LPDCB, 8) + TEST_TYPE_ALIGN (LPDCB, 8) + TEST_TARGET_SIZE (LPDCB, 28) + TEST_TARGET_ALIGN(LPDCB, 4) +} + +static void test_pack_LPDEBUG_EVENT(void) +{ + /* LPDEBUG_EVENT */ + TEST_TYPE_SIZE (LPDEBUG_EVENT, 8) + TEST_TYPE_ALIGN (LPDEBUG_EVENT, 8) +} + +static void test_pack_LPEXCEPTION_POINTERS(void) +{ + /* LPEXCEPTION_POINTERS */ + TEST_TYPE_SIZE (LPEXCEPTION_POINTERS, 8) + TEST_TYPE_ALIGN (LPEXCEPTION_POINTERS, 8) +} + +static void test_pack_LPEXCEPTION_RECORD(void) +{ + /* LPEXCEPTION_RECORD */ + TEST_TYPE_SIZE (LPEXCEPTION_RECORD, 8) + TEST_TYPE_ALIGN (LPEXCEPTION_RECORD, 8) +} + +static void test_pack_LPFIBER_START_ROUTINE(void) +{ + /* LPFIBER_START_ROUTINE */ + TEST_TYPE_SIZE (LPFIBER_START_ROUTINE, 8) + TEST_TYPE_ALIGN (LPFIBER_START_ROUTINE, 8) +} + +static void test_pack_LPHW_PROFILE_INFOA(void) +{ + /* LPHW_PROFILE_INFOA */ + TEST_TYPE_SIZE (LPHW_PROFILE_INFOA, 8) + TEST_TYPE_ALIGN (LPHW_PROFILE_INFOA, 8) + TEST_TARGET_SIZE (LPHW_PROFILE_INFOA, 124) + TEST_TARGET_ALIGN(LPHW_PROFILE_INFOA, 4) +} + +static void test_pack_LPHW_PROFILE_INFOW(void) +{ + /* LPHW_PROFILE_INFOW */ + TEST_TYPE_SIZE (LPHW_PROFILE_INFOW, 8) + TEST_TYPE_ALIGN (LPHW_PROFILE_INFOW, 8) + TEST_TARGET_SIZE (LPHW_PROFILE_INFOW, 244) + TEST_TARGET_ALIGN(LPHW_PROFILE_INFOW, 4) +} + +static void test_pack_LPMEMORYSTATUS(void) +{ + /* LPMEMORYSTATUS */ + TEST_TYPE_SIZE (LPMEMORYSTATUS, 8) + TEST_TYPE_ALIGN (LPMEMORYSTATUS, 8) + TEST_TARGET_SIZE (LPMEMORYSTATUS, 56) + TEST_TARGET_ALIGN(LPMEMORYSTATUS, 8) +} + +static void test_pack_LPMEMORYSTATUSEX(void) +{ + /* LPMEMORYSTATUSEX */ + TEST_TYPE_SIZE (LPMEMORYSTATUSEX, 8) + TEST_TYPE_ALIGN (LPMEMORYSTATUSEX, 8) + TEST_TARGET_SIZE (LPMEMORYSTATUSEX, 64) + TEST_TARGET_ALIGN(LPMEMORYSTATUSEX, 8) +} + +static void test_pack_LPOFSTRUCT(void) +{ + /* LPOFSTRUCT */ + TEST_TYPE_SIZE (LPOFSTRUCT, 8) + TEST_TYPE_ALIGN (LPOFSTRUCT, 8) + TEST_TARGET_SIZE (LPOFSTRUCT, 136) + TEST_TARGET_ALIGN(LPOFSTRUCT, 2) +} + +static void test_pack_LPOVERLAPPED(void) +{ + /* LPOVERLAPPED */ + TEST_TYPE_SIZE (LPOVERLAPPED, 8) + TEST_TYPE_ALIGN (LPOVERLAPPED, 8) +} + +static void test_pack_LPOVERLAPPED_COMPLETION_ROUTINE(void) +{ + /* LPOVERLAPPED_COMPLETION_ROUTINE */ + TEST_TYPE_SIZE (LPOVERLAPPED_COMPLETION_ROUTINE, 8) + TEST_TYPE_ALIGN (LPOVERLAPPED_COMPLETION_ROUTINE, 8) +} + +static void test_pack_LPPROCESS_HEAP_ENTRY(void) +{ + /* LPPROCESS_HEAP_ENTRY */ + TEST_TYPE_SIZE (LPPROCESS_HEAP_ENTRY, 8) + TEST_TYPE_ALIGN (LPPROCESS_HEAP_ENTRY, 8) +} + +static void test_pack_LPPROCESS_INFORMATION(void) +{ + /* LPPROCESS_INFORMATION */ + TEST_TYPE_SIZE (LPPROCESS_INFORMATION, 8) + TEST_TYPE_ALIGN (LPPROCESS_INFORMATION, 8) + TEST_TARGET_SIZE (LPPROCESS_INFORMATION, 24) + TEST_TARGET_ALIGN(LPPROCESS_INFORMATION, 8) +} + +static void test_pack_LPPROGRESS_ROUTINE(void) +{ + /* LPPROGRESS_ROUTINE */ + TEST_TYPE_SIZE (LPPROGRESS_ROUTINE, 8) + TEST_TYPE_ALIGN (LPPROGRESS_ROUTINE, 8) +} + +static void test_pack_LPSECURITY_ATTRIBUTES(void) +{ + /* LPSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (LPSECURITY_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (LPSECURITY_ATTRIBUTES, 8) + TEST_TARGET_SIZE (LPSECURITY_ATTRIBUTES, 24) + TEST_TARGET_ALIGN(LPSECURITY_ATTRIBUTES, 8) +} + +static void test_pack_LPSTARTUPINFOA(void) +{ + /* LPSTARTUPINFOA */ + TEST_TYPE_SIZE (LPSTARTUPINFOA, 8) + TEST_TYPE_ALIGN (LPSTARTUPINFOA, 8) + TEST_TARGET_SIZE (LPSTARTUPINFOA, 104) + TEST_TARGET_ALIGN(LPSTARTUPINFOA, 8) +} + +static void test_pack_LPSTARTUPINFOW(void) +{ + /* LPSTARTUPINFOW */ + TEST_TYPE_SIZE (LPSTARTUPINFOW, 8) + TEST_TYPE_ALIGN (LPSTARTUPINFOW, 8) + TEST_TARGET_SIZE (LPSTARTUPINFOW, 104) + TEST_TARGET_ALIGN(LPSTARTUPINFOW, 8) +} + +static void test_pack_LPSYSTEMTIME(void) +{ + /* LPSYSTEMTIME */ + TEST_TYPE_SIZE (LPSYSTEMTIME, 8) + TEST_TYPE_ALIGN (LPSYSTEMTIME, 8) + TEST_TARGET_SIZE (LPSYSTEMTIME, 16) + TEST_TARGET_ALIGN(LPSYSTEMTIME, 2) +} + +static void test_pack_LPSYSTEM_INFO(void) +{ + /* LPSYSTEM_INFO */ + TEST_TYPE_SIZE (LPSYSTEM_INFO, 8) + TEST_TYPE_ALIGN (LPSYSTEM_INFO, 8) +} + +static void test_pack_LPSYSTEM_POWER_STATUS(void) +{ + /* LPSYSTEM_POWER_STATUS */ + TEST_TYPE_SIZE (LPSYSTEM_POWER_STATUS, 8) + TEST_TYPE_ALIGN (LPSYSTEM_POWER_STATUS, 8) + TEST_TARGET_SIZE (LPSYSTEM_POWER_STATUS, 12) + TEST_TARGET_ALIGN(LPSYSTEM_POWER_STATUS, 4) +} + +static void test_pack_LPTHREAD_START_ROUTINE(void) +{ + /* LPTHREAD_START_ROUTINE */ + TEST_TYPE_SIZE (LPTHREAD_START_ROUTINE, 8) + TEST_TYPE_ALIGN (LPTHREAD_START_ROUTINE, 8) +} + +static void test_pack_LPTIME_ZONE_INFORMATION(void) +{ + /* LPTIME_ZONE_INFORMATION */ + TEST_TYPE_SIZE (LPTIME_ZONE_INFORMATION, 8) + TEST_TYPE_ALIGN (LPTIME_ZONE_INFORMATION, 8) + TEST_TARGET_SIZE (LPTIME_ZONE_INFORMATION, 172) + TEST_TARGET_ALIGN(LPTIME_ZONE_INFORMATION, 4) +} + +static void test_pack_LPWIN32_FILE_ATTRIBUTE_DATA(void) +{ + /* LPWIN32_FILE_ATTRIBUTE_DATA */ + TEST_TYPE_SIZE (LPWIN32_FILE_ATTRIBUTE_DATA, 8) + TEST_TYPE_ALIGN (LPWIN32_FILE_ATTRIBUTE_DATA, 8) + TEST_TARGET_SIZE (LPWIN32_FILE_ATTRIBUTE_DATA, 36) + TEST_TARGET_ALIGN(LPWIN32_FILE_ATTRIBUTE_DATA, 4) +} + +static void test_pack_LPWIN32_FIND_DATAA(void) +{ + /* LPWIN32_FIND_DATAA */ + TEST_TYPE_SIZE (LPWIN32_FIND_DATAA, 8) + TEST_TYPE_ALIGN (LPWIN32_FIND_DATAA, 8) + TEST_TARGET_SIZE (LPWIN32_FIND_DATAA, 320) + TEST_TARGET_ALIGN(LPWIN32_FIND_DATAA, 4) +} + +static void test_pack_LPWIN32_FIND_DATAW(void) +{ + /* LPWIN32_FIND_DATAW */ + TEST_TYPE_SIZE (LPWIN32_FIND_DATAW, 8) + TEST_TYPE_ALIGN (LPWIN32_FIND_DATAW, 8) + TEST_TARGET_SIZE (LPWIN32_FIND_DATAW, 592) + TEST_TARGET_ALIGN(LPWIN32_FIND_DATAW, 4) +} + +static void test_pack_LPWIN32_STREAM_ID(void) +{ + /* LPWIN32_STREAM_ID */ + TEST_TYPE_SIZE (LPWIN32_STREAM_ID, 8) + TEST_TYPE_ALIGN (LPWIN32_STREAM_ID, 8) + TEST_TARGET_SIZE (LPWIN32_STREAM_ID, 24) + TEST_TARGET_ALIGN(LPWIN32_STREAM_ID, 8) +} + +static void test_pack_MEMORYSTATUS(void) +{ + /* MEMORYSTATUS */ + TEST_TYPE_SIZE (MEMORYSTATUS, 56) + TEST_TYPE_ALIGN (MEMORYSTATUS, 8) + TEST_FIELD_SIZE (MEMORYSTATUS, dwLength, 4) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwLength, 4) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwLength, 0) + TEST_FIELD_SIZE (MEMORYSTATUS, dwMemoryLoad, 4) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwMemoryLoad, 4) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwMemoryLoad, 4) + TEST_FIELD_SIZE (MEMORYSTATUS, dwTotalPhys, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwTotalPhys, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwTotalPhys, 8) + TEST_FIELD_SIZE (MEMORYSTATUS, dwAvailPhys, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwAvailPhys, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwAvailPhys, 16) + TEST_FIELD_SIZE (MEMORYSTATUS, dwTotalPageFile, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwTotalPageFile, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwTotalPageFile, 24) + TEST_FIELD_SIZE (MEMORYSTATUS, dwAvailPageFile, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwAvailPageFile, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwAvailPageFile, 32) + TEST_FIELD_SIZE (MEMORYSTATUS, dwTotalVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwTotalVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwTotalVirtual, 40) + TEST_FIELD_SIZE (MEMORYSTATUS, dwAvailVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwAvailVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwAvailVirtual, 48) +} + +static void test_pack_MEMORYSTATUSEX(void) +{ + /* MEMORYSTATUSEX (pack 8) */ + TEST_TYPE_SIZE (MEMORYSTATUSEX, 64) + TEST_TYPE_ALIGN (MEMORYSTATUSEX, 8) + TEST_FIELD_SIZE (MEMORYSTATUSEX, dwLength, 4) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, dwLength, 4) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, dwLength, 0) + TEST_FIELD_SIZE (MEMORYSTATUSEX, dwMemoryLoad, 4) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, dwMemoryLoad, 4) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, dwMemoryLoad, 4) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullTotalPhys, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullTotalPhys, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullTotalPhys, 8) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullAvailPhys, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullAvailPhys, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullAvailPhys, 16) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullTotalPageFile, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullTotalPageFile, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullTotalPageFile, 24) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullAvailPageFile, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullAvailPageFile, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullAvailPageFile, 32) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullTotalVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullTotalVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullTotalVirtual, 40) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullAvailVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullAvailVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullAvailVirtual, 48) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullAvailExtendedVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullAvailExtendedVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullAvailExtendedVirtual, 56) +} + +static void test_pack_OFSTRUCT(void) +{ + /* OFSTRUCT */ + TEST_TYPE_SIZE (OFSTRUCT, 136) + TEST_TYPE_ALIGN (OFSTRUCT, 2) + TEST_FIELD_SIZE (OFSTRUCT, cBytes, 1) + TEST_FIELD_ALIGN (OFSTRUCT, cBytes, 1) + TEST_FIELD_OFFSET(OFSTRUCT, cBytes, 0) + TEST_FIELD_SIZE (OFSTRUCT, fFixedDisk, 1) + TEST_FIELD_ALIGN (OFSTRUCT, fFixedDisk, 1) + TEST_FIELD_OFFSET(OFSTRUCT, fFixedDisk, 1) + TEST_FIELD_SIZE (OFSTRUCT, nErrCode, 2) + TEST_FIELD_ALIGN (OFSTRUCT, nErrCode, 2) + TEST_FIELD_OFFSET(OFSTRUCT, nErrCode, 2) + TEST_FIELD_SIZE (OFSTRUCT, Reserved1, 2) + TEST_FIELD_ALIGN (OFSTRUCT, Reserved1, 2) + TEST_FIELD_OFFSET(OFSTRUCT, Reserved1, 4) + TEST_FIELD_SIZE (OFSTRUCT, Reserved2, 2) + TEST_FIELD_ALIGN (OFSTRUCT, Reserved2, 2) + TEST_FIELD_OFFSET(OFSTRUCT, Reserved2, 6) + TEST_FIELD_SIZE (OFSTRUCT, szPathName, 128) + TEST_FIELD_ALIGN (OFSTRUCT, szPathName, 1) + TEST_FIELD_OFFSET(OFSTRUCT, szPathName, 8) +} + +static void test_pack_OUTPUT_DEBUG_STRING_INFO(void) +{ + /* OUTPUT_DEBUG_STRING_INFO */ + TEST_TYPE_SIZE (OUTPUT_DEBUG_STRING_INFO, 16) + TEST_TYPE_ALIGN (OUTPUT_DEBUG_STRING_INFO, 8) + TEST_FIELD_SIZE (OUTPUT_DEBUG_STRING_INFO, lpDebugStringData, 8) + TEST_FIELD_ALIGN (OUTPUT_DEBUG_STRING_INFO, lpDebugStringData, 8) + TEST_FIELD_OFFSET(OUTPUT_DEBUG_STRING_INFO, lpDebugStringData, 0) + TEST_FIELD_SIZE (OUTPUT_DEBUG_STRING_INFO, fUnicode, 2) + TEST_FIELD_ALIGN (OUTPUT_DEBUG_STRING_INFO, fUnicode, 2) + TEST_FIELD_OFFSET(OUTPUT_DEBUG_STRING_INFO, fUnicode, 8) + TEST_FIELD_SIZE (OUTPUT_DEBUG_STRING_INFO, nDebugStringLength, 2) + TEST_FIELD_ALIGN (OUTPUT_DEBUG_STRING_INFO, nDebugStringLength, 2) + TEST_FIELD_OFFSET(OUTPUT_DEBUG_STRING_INFO, nDebugStringLength, 10) +} + +static void test_pack_PACTCTXA(void) +{ + /* PACTCTXA */ + TEST_TYPE_SIZE (PACTCTXA, 8) + TEST_TYPE_ALIGN (PACTCTXA, 8) + TEST_TARGET_SIZE (PACTCTXA, 56) + TEST_TARGET_ALIGN(PACTCTXA, 8) +} + +static void test_pack_PACTCTXW(void) +{ + /* PACTCTXW */ + TEST_TYPE_SIZE (PACTCTXW, 8) + TEST_TYPE_ALIGN (PACTCTXW, 8) + TEST_TARGET_SIZE (PACTCTXW, 56) + TEST_TARGET_ALIGN(PACTCTXW, 8) +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA(void) +{ + /* PACTCTX_SECTION_KEYED_DATA */ + TEST_TYPE_SIZE (PACTCTX_SECTION_KEYED_DATA, 8) + TEST_TYPE_ALIGN (PACTCTX_SECTION_KEYED_DATA, 8) + TEST_TARGET_SIZE (PACTCTX_SECTION_KEYED_DATA, 112) + TEST_TARGET_ALIGN(PACTCTX_SECTION_KEYED_DATA, 8) +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* PACTCTX_SECTION_KEYED_DATA_2600 */ + TEST_TYPE_SIZE (PACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_TYPE_ALIGN (PACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_TARGET_SIZE (PACTCTX_SECTION_KEYED_DATA_2600, 72) + TEST_TARGET_ALIGN(PACTCTX_SECTION_KEYED_DATA_2600, 8) +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ + TEST_TYPE_SIZE (PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_TYPE_ALIGN (PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_TARGET_SIZE (PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 40) + TEST_TARGET_ALIGN(PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) +} + +static void test_pack_PACTIVATION_CONTEXT_BASIC_INFORMATION(void) +{ + /* PACTIVATION_CONTEXT_BASIC_INFORMATION */ + TEST_TYPE_SIZE (PACTIVATION_CONTEXT_BASIC_INFORMATION, 8) + TEST_TYPE_ALIGN (PACTIVATION_CONTEXT_BASIC_INFORMATION, 8) + TEST_TARGET_SIZE (PACTIVATION_CONTEXT_BASIC_INFORMATION, 16) + TEST_TARGET_ALIGN(PACTIVATION_CONTEXT_BASIC_INFORMATION, 8) +} + +static void test_pack_PAPCFUNC(void) +{ + /* PAPCFUNC */ + TEST_TYPE_SIZE (PAPCFUNC, 8) + TEST_TYPE_ALIGN (PAPCFUNC, 8) +} + +static void test_pack_PBY_HANDLE_FILE_INFORMATION(void) +{ + /* PBY_HANDLE_FILE_INFORMATION */ + TEST_TYPE_SIZE (PBY_HANDLE_FILE_INFORMATION, 8) + TEST_TYPE_ALIGN (PBY_HANDLE_FILE_INFORMATION, 8) + TEST_TARGET_SIZE (PBY_HANDLE_FILE_INFORMATION, 52) + TEST_TARGET_ALIGN(PBY_HANDLE_FILE_INFORMATION, 4) +} + +static void test_pack_PCACTCTXA(void) +{ + /* PCACTCTXA */ + TEST_TYPE_SIZE (PCACTCTXA, 8) + TEST_TYPE_ALIGN (PCACTCTXA, 8) + TEST_TARGET_SIZE (PCACTCTXA, 56) + TEST_TARGET_ALIGN(PCACTCTXA, 8) +} + +static void test_pack_PCACTCTXW(void) +{ + /* PCACTCTXW */ + TEST_TYPE_SIZE (PCACTCTXW, 8) + TEST_TYPE_ALIGN (PCACTCTXW, 8) + TEST_TARGET_SIZE (PCACTCTXW, 56) + TEST_TARGET_ALIGN(PCACTCTXW, 8) +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA */ + TEST_TYPE_SIZE (PCACTCTX_SECTION_KEYED_DATA, 8) + TEST_TYPE_ALIGN (PCACTCTX_SECTION_KEYED_DATA, 8) + TEST_TARGET_SIZE (PCACTCTX_SECTION_KEYED_DATA, 112) + TEST_TARGET_ALIGN(PCACTCTX_SECTION_KEYED_DATA, 8) +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA_2600 */ + TEST_TYPE_SIZE (PCACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_TYPE_ALIGN (PCACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_TARGET_SIZE (PCACTCTX_SECTION_KEYED_DATA_2600, 72) + TEST_TARGET_ALIGN(PCACTCTX_SECTION_KEYED_DATA_2600, 8) +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ + TEST_TYPE_SIZE (PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_TYPE_ALIGN (PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_TARGET_SIZE (PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 40) + TEST_TARGET_ALIGN(PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) +} + +static void test_pack_PCRITICAL_SECTION(void) +{ + /* PCRITICAL_SECTION */ + TEST_TYPE_SIZE (PCRITICAL_SECTION, 8) + TEST_TYPE_ALIGN (PCRITICAL_SECTION, 8) +} + +static void test_pack_PCRITICAL_SECTION_DEBUG(void) +{ + /* PCRITICAL_SECTION_DEBUG */ + TEST_TYPE_SIZE (PCRITICAL_SECTION_DEBUG, 8) + TEST_TYPE_ALIGN (PCRITICAL_SECTION_DEBUG, 8) +} + +static void test_pack_PFIBER_START_ROUTINE(void) +{ + /* PFIBER_START_ROUTINE */ + TEST_TYPE_SIZE (PFIBER_START_ROUTINE, 8) + TEST_TYPE_ALIGN (PFIBER_START_ROUTINE, 8) +} + +static void test_pack_POFSTRUCT(void) +{ + /* POFSTRUCT */ + TEST_TYPE_SIZE (POFSTRUCT, 8) + TEST_TYPE_ALIGN (POFSTRUCT, 8) + TEST_TARGET_SIZE (POFSTRUCT, 136) + TEST_TARGET_ALIGN(POFSTRUCT, 2) +} + +static void test_pack_PPROCESS_HEAP_ENTRY(void) +{ + /* PPROCESS_HEAP_ENTRY */ + TEST_TYPE_SIZE (PPROCESS_HEAP_ENTRY, 8) + TEST_TYPE_ALIGN (PPROCESS_HEAP_ENTRY, 8) +} + +static void test_pack_PPROCESS_INFORMATION(void) +{ + /* PPROCESS_INFORMATION */ + TEST_TYPE_SIZE (PPROCESS_INFORMATION, 8) + TEST_TYPE_ALIGN (PPROCESS_INFORMATION, 8) + TEST_TARGET_SIZE (PPROCESS_INFORMATION, 24) + TEST_TARGET_ALIGN(PPROCESS_INFORMATION, 8) +} + +static void test_pack_PQUERYACTCTXW_FUNC(void) +{ + /* PQUERYACTCTXW_FUNC */ + TEST_TYPE_SIZE (PQUERYACTCTXW_FUNC, 8) + TEST_TYPE_ALIGN (PQUERYACTCTXW_FUNC, 8) +} + +static void test_pack_PROCESS_HEAP_ENTRY(void) +{ + /* PROCESS_HEAP_ENTRY */ + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, lpData, 8) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, lpData, 8) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, lpData, 0) + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, cbData, 4) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, cbData, 4) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, cbData, 8) + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, cbOverhead, 1) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, cbOverhead, 1) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, cbOverhead, 12) + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, iRegionIndex, 1) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, iRegionIndex, 1) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, iRegionIndex, 13) + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, wFlags, 2) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, wFlags, 2) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, wFlags, 14) +} + +static void test_pack_PROCESS_INFORMATION(void) +{ + /* PROCESS_INFORMATION */ + TEST_TYPE_SIZE (PROCESS_INFORMATION, 24) + TEST_TYPE_ALIGN (PROCESS_INFORMATION, 8) + TEST_FIELD_SIZE (PROCESS_INFORMATION, hProcess, 8) + TEST_FIELD_ALIGN (PROCESS_INFORMATION, hProcess, 8) + TEST_FIELD_OFFSET(PROCESS_INFORMATION, hProcess, 0) + TEST_FIELD_SIZE (PROCESS_INFORMATION, hThread, 8) + TEST_FIELD_ALIGN (PROCESS_INFORMATION, hThread, 8) + TEST_FIELD_OFFSET(PROCESS_INFORMATION, hThread, 8) + TEST_FIELD_SIZE (PROCESS_INFORMATION, dwProcessId, 4) + TEST_FIELD_ALIGN (PROCESS_INFORMATION, dwProcessId, 4) + TEST_FIELD_OFFSET(PROCESS_INFORMATION, dwProcessId, 16) + TEST_FIELD_SIZE (PROCESS_INFORMATION, dwThreadId, 4) + TEST_FIELD_ALIGN (PROCESS_INFORMATION, dwThreadId, 4) + TEST_FIELD_OFFSET(PROCESS_INFORMATION, dwThreadId, 20) +} + +static void test_pack_PSECURITY_ATTRIBUTES(void) +{ + /* PSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (PSECURITY_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (PSECURITY_ATTRIBUTES, 8) + TEST_TARGET_SIZE (PSECURITY_ATTRIBUTES, 24) + TEST_TARGET_ALIGN(PSECURITY_ATTRIBUTES, 8) +} + +static void test_pack_PSYSTEMTIME(void) +{ + /* PSYSTEMTIME */ + TEST_TYPE_SIZE (PSYSTEMTIME, 8) + TEST_TYPE_ALIGN (PSYSTEMTIME, 8) + TEST_TARGET_SIZE (PSYSTEMTIME, 16) + TEST_TARGET_ALIGN(PSYSTEMTIME, 2) +} + +static void test_pack_PTIMERAPCROUTINE(void) +{ + /* PTIMERAPCROUTINE */ + TEST_TYPE_SIZE (PTIMERAPCROUTINE, 8) + TEST_TYPE_ALIGN (PTIMERAPCROUTINE, 8) +} + +static void test_pack_PTIME_ZONE_INFORMATION(void) +{ + /* PTIME_ZONE_INFORMATION */ + TEST_TYPE_SIZE (PTIME_ZONE_INFORMATION, 8) + TEST_TYPE_ALIGN (PTIME_ZONE_INFORMATION, 8) + TEST_TARGET_SIZE (PTIME_ZONE_INFORMATION, 172) + TEST_TARGET_ALIGN(PTIME_ZONE_INFORMATION, 4) +} + +static void test_pack_PWIN32_FIND_DATAA(void) +{ + /* PWIN32_FIND_DATAA */ + TEST_TYPE_SIZE (PWIN32_FIND_DATAA, 8) + TEST_TYPE_ALIGN (PWIN32_FIND_DATAA, 8) + TEST_TARGET_SIZE (PWIN32_FIND_DATAA, 320) + TEST_TARGET_ALIGN(PWIN32_FIND_DATAA, 4) +} + +static void test_pack_PWIN32_FIND_DATAW(void) +{ + /* PWIN32_FIND_DATAW */ + TEST_TYPE_SIZE (PWIN32_FIND_DATAW, 8) + TEST_TYPE_ALIGN (PWIN32_FIND_DATAW, 8) + TEST_TARGET_SIZE (PWIN32_FIND_DATAW, 592) + TEST_TARGET_ALIGN(PWIN32_FIND_DATAW, 4) +} + +static void test_pack_RIP_INFO(void) +{ + /* RIP_INFO */ + TEST_TYPE_SIZE (RIP_INFO, 8) + TEST_TYPE_ALIGN (RIP_INFO, 4) + TEST_FIELD_SIZE (RIP_INFO, dwError, 4) + TEST_FIELD_ALIGN (RIP_INFO, dwError, 4) + TEST_FIELD_OFFSET(RIP_INFO, dwError, 0) + TEST_FIELD_SIZE (RIP_INFO, dwType, 4) + TEST_FIELD_ALIGN (RIP_INFO, dwType, 4) + TEST_FIELD_OFFSET(RIP_INFO, dwType, 4) +} + +static void test_pack_SECURITY_ATTRIBUTES(void) +{ + /* SECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (SECURITY_ATTRIBUTES, 24) + TEST_TYPE_ALIGN (SECURITY_ATTRIBUTES, 8) + TEST_FIELD_SIZE (SECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_ALIGN (SECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_OFFSET(SECURITY_ATTRIBUTES, nLength, 0) + TEST_FIELD_SIZE (SECURITY_ATTRIBUTES, lpSecurityDescriptor, 8) + TEST_FIELD_ALIGN (SECURITY_ATTRIBUTES, lpSecurityDescriptor, 8) + TEST_FIELD_OFFSET(SECURITY_ATTRIBUTES, lpSecurityDescriptor, 8) + TEST_FIELD_SIZE (SECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_ALIGN (SECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_OFFSET(SECURITY_ATTRIBUTES, bInheritHandle, 16) +} + +static void test_pack_STARTUPINFOA(void) +{ + /* STARTUPINFOA */ + TEST_TYPE_SIZE (STARTUPINFOA, 104) + TEST_TYPE_ALIGN (STARTUPINFOA, 8) + TEST_FIELD_SIZE (STARTUPINFOA, cb, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, cb, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, cb, 0) + TEST_FIELD_SIZE (STARTUPINFOA, lpReserved, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, lpReserved, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, lpReserved, 8) + TEST_FIELD_SIZE (STARTUPINFOA, lpDesktop, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, lpDesktop, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, lpDesktop, 16) + TEST_FIELD_SIZE (STARTUPINFOA, lpTitle, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, lpTitle, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, lpTitle, 24) + TEST_FIELD_SIZE (STARTUPINFOA, dwX, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwX, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwX, 32) + TEST_FIELD_SIZE (STARTUPINFOA, dwY, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwY, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwY, 36) + TEST_FIELD_SIZE (STARTUPINFOA, dwXSize, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwXSize, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwXSize, 40) + TEST_FIELD_SIZE (STARTUPINFOA, dwYSize, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwYSize, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwYSize, 44) + TEST_FIELD_SIZE (STARTUPINFOA, dwXCountChars, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwXCountChars, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwXCountChars, 48) + TEST_FIELD_SIZE (STARTUPINFOA, dwYCountChars, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwYCountChars, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwYCountChars, 52) + TEST_FIELD_SIZE (STARTUPINFOA, dwFillAttribute, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwFillAttribute, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwFillAttribute, 56) + TEST_FIELD_SIZE (STARTUPINFOA, dwFlags, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwFlags, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwFlags, 60) + TEST_FIELD_SIZE (STARTUPINFOA, wShowWindow, 2) + TEST_FIELD_ALIGN (STARTUPINFOA, wShowWindow, 2) + TEST_FIELD_OFFSET(STARTUPINFOA, wShowWindow, 64) + TEST_FIELD_SIZE (STARTUPINFOA, cbReserved2, 2) + TEST_FIELD_ALIGN (STARTUPINFOA, cbReserved2, 2) + TEST_FIELD_OFFSET(STARTUPINFOA, cbReserved2, 66) + TEST_FIELD_SIZE (STARTUPINFOA, lpReserved2, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, lpReserved2, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, lpReserved2, 72) + TEST_FIELD_SIZE (STARTUPINFOA, hStdInput, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, hStdInput, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, hStdInput, 80) + TEST_FIELD_SIZE (STARTUPINFOA, hStdOutput, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, hStdOutput, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, hStdOutput, 88) + TEST_FIELD_SIZE (STARTUPINFOA, hStdError, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, hStdError, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, hStdError, 96) +} + +static void test_pack_STARTUPINFOW(void) +{ + /* STARTUPINFOW */ + TEST_TYPE_SIZE (STARTUPINFOW, 104) + TEST_TYPE_ALIGN (STARTUPINFOW, 8) + TEST_FIELD_SIZE (STARTUPINFOW, cb, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, cb, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, cb, 0) + TEST_FIELD_SIZE (STARTUPINFOW, lpReserved, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, lpReserved, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, lpReserved, 8) + TEST_FIELD_SIZE (STARTUPINFOW, lpDesktop, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, lpDesktop, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, lpDesktop, 16) + TEST_FIELD_SIZE (STARTUPINFOW, lpTitle, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, lpTitle, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, lpTitle, 24) + TEST_FIELD_SIZE (STARTUPINFOW, dwX, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwX, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwX, 32) + TEST_FIELD_SIZE (STARTUPINFOW, dwY, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwY, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwY, 36) + TEST_FIELD_SIZE (STARTUPINFOW, dwXSize, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwXSize, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwXSize, 40) + TEST_FIELD_SIZE (STARTUPINFOW, dwYSize, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwYSize, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwYSize, 44) + TEST_FIELD_SIZE (STARTUPINFOW, dwXCountChars, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwXCountChars, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwXCountChars, 48) + TEST_FIELD_SIZE (STARTUPINFOW, dwYCountChars, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwYCountChars, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwYCountChars, 52) + TEST_FIELD_SIZE (STARTUPINFOW, dwFillAttribute, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwFillAttribute, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwFillAttribute, 56) + TEST_FIELD_SIZE (STARTUPINFOW, dwFlags, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwFlags, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwFlags, 60) + TEST_FIELD_SIZE (STARTUPINFOW, wShowWindow, 2) + TEST_FIELD_ALIGN (STARTUPINFOW, wShowWindow, 2) + TEST_FIELD_OFFSET(STARTUPINFOW, wShowWindow, 64) + TEST_FIELD_SIZE (STARTUPINFOW, cbReserved2, 2) + TEST_FIELD_ALIGN (STARTUPINFOW, cbReserved2, 2) + TEST_FIELD_OFFSET(STARTUPINFOW, cbReserved2, 66) + TEST_FIELD_SIZE (STARTUPINFOW, lpReserved2, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, lpReserved2, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, lpReserved2, 72) + TEST_FIELD_SIZE (STARTUPINFOW, hStdInput, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, hStdInput, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, hStdInput, 80) + TEST_FIELD_SIZE (STARTUPINFOW, hStdOutput, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, hStdOutput, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, hStdOutput, 88) + TEST_FIELD_SIZE (STARTUPINFOW, hStdError, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, hStdError, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, hStdError, 96) +} + +static void test_pack_SYSTEMTIME(void) +{ + /* SYSTEMTIME */ + TEST_TYPE_SIZE (SYSTEMTIME, 16) + TEST_TYPE_ALIGN (SYSTEMTIME, 2) + TEST_FIELD_SIZE (SYSTEMTIME, wYear, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wYear, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wYear, 0) + TEST_FIELD_SIZE (SYSTEMTIME, wMonth, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wMonth, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wMonth, 2) + TEST_FIELD_SIZE (SYSTEMTIME, wDayOfWeek, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wDayOfWeek, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wDayOfWeek, 4) + TEST_FIELD_SIZE (SYSTEMTIME, wDay, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wDay, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wDay, 6) + TEST_FIELD_SIZE (SYSTEMTIME, wHour, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wHour, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wHour, 8) + TEST_FIELD_SIZE (SYSTEMTIME, wMinute, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wMinute, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wMinute, 10) + TEST_FIELD_SIZE (SYSTEMTIME, wSecond, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wSecond, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wSecond, 12) + TEST_FIELD_SIZE (SYSTEMTIME, wMilliseconds, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wMilliseconds, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wMilliseconds, 14) +} + +static void test_pack_SYSTEM_INFO(void) +{ + /* SYSTEM_INFO */ +} + +static void test_pack_SYSTEM_POWER_STATUS(void) +{ + /* SYSTEM_POWER_STATUS */ + TEST_TYPE_SIZE (SYSTEM_POWER_STATUS, 12) + TEST_TYPE_ALIGN (SYSTEM_POWER_STATUS, 4) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, ACLineStatus, 1) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, ACLineStatus, 1) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, ACLineStatus, 0) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, BatteryFlag, 1) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, BatteryFlag, 1) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, BatteryFlag, 1) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, BatteryLifePercent, 1) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, BatteryLifePercent, 1) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, BatteryLifePercent, 2) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, Reserved1, 1) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, Reserved1, 1) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, Reserved1, 3) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, BatteryLifeTime, 4) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, BatteryLifeTime, 4) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, BatteryLifeTime, 4) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, BatteryFullLifeTime, 4) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, BatteryFullLifeTime, 4) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, BatteryFullLifeTime, 8) +} + +static void test_pack_TIME_ZONE_INFORMATION(void) +{ + /* TIME_ZONE_INFORMATION */ + TEST_TYPE_SIZE (TIME_ZONE_INFORMATION, 172) + TEST_TYPE_ALIGN (TIME_ZONE_INFORMATION, 4) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, Bias, 4) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, Bias, 4) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, Bias, 0) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, StandardName, 64) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, StandardName, 2) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, StandardName, 4) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, StandardDate, 16) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, StandardDate, 2) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, StandardDate, 68) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, StandardBias, 4) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, StandardBias, 4) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, StandardBias, 84) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, DaylightName, 64) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, DaylightName, 2) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, DaylightName, 88) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, DaylightDate, 16) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, DaylightDate, 2) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, DaylightDate, 152) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, DaylightBias, 4) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, DaylightBias, 4) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, DaylightBias, 168) +} + +static void test_pack_UNLOAD_DLL_DEBUG_INFO(void) +{ + /* UNLOAD_DLL_DEBUG_INFO */ + TEST_TYPE_SIZE (UNLOAD_DLL_DEBUG_INFO, 8) + TEST_TYPE_ALIGN (UNLOAD_DLL_DEBUG_INFO, 8) + TEST_FIELD_SIZE (UNLOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_ALIGN (UNLOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_OFFSET(UNLOAD_DLL_DEBUG_INFO, lpBaseOfDll, 0) +} + +static void test_pack_WAITORTIMERCALLBACK(void) +{ + /* WAITORTIMERCALLBACK */ + TEST_TYPE_SIZE (WAITORTIMERCALLBACK, 8) + TEST_TYPE_ALIGN (WAITORTIMERCALLBACK, 8) +} + +static void test_pack_WIN32_FILE_ATTRIBUTE_DATA(void) +{ + /* WIN32_FILE_ATTRIBUTE_DATA */ + TEST_TYPE_SIZE (WIN32_FILE_ATTRIBUTE_DATA, 36) + TEST_TYPE_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, 4) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, dwFileAttributes, 4) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, dwFileAttributes, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, dwFileAttributes, 0) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, ftCreationTime, 8) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, ftCreationTime, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, ftCreationTime, 4) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, ftLastAccessTime, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, ftLastAccessTime, 12) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, ftLastWriteTime, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, ftLastWriteTime, 20) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, nFileSizeHigh, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, nFileSizeHigh, 28) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, nFileSizeLow, 4) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, nFileSizeLow, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, nFileSizeLow, 32) +} + +static void test_pack_WIN32_FIND_DATAA(void) +{ + /* WIN32_FIND_DATAA */ + TEST_TYPE_SIZE (WIN32_FIND_DATAA, 320) + TEST_TYPE_ALIGN (WIN32_FIND_DATAA, 4) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, dwFileAttributes, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, dwFileAttributes, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, dwFileAttributes, 0) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, ftCreationTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, ftCreationTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, ftCreationTime, 4) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, ftLastAccessTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, ftLastAccessTime, 12) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, ftLastWriteTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, ftLastWriteTime, 20) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, nFileSizeHigh, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, nFileSizeHigh, 28) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, nFileSizeLow, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, nFileSizeLow, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, nFileSizeLow, 32) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, dwReserved0, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, dwReserved0, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, dwReserved0, 36) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, dwReserved1, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, dwReserved1, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, dwReserved1, 40) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, cFileName, 260) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, cFileName, 1) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, cFileName, 44) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, cAlternateFileName, 14) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, cAlternateFileName, 1) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, cAlternateFileName, 304) +} + +static void test_pack_WIN32_FIND_DATAW(void) +{ + /* WIN32_FIND_DATAW */ + TEST_TYPE_SIZE (WIN32_FIND_DATAW, 592) + TEST_TYPE_ALIGN (WIN32_FIND_DATAW, 4) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, dwFileAttributes, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, dwFileAttributes, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, dwFileAttributes, 0) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, ftCreationTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, ftCreationTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, ftCreationTime, 4) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, ftLastAccessTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, ftLastAccessTime, 12) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, ftLastWriteTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, ftLastWriteTime, 20) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, nFileSizeHigh, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, nFileSizeHigh, 28) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, nFileSizeLow, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, nFileSizeLow, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, nFileSizeLow, 32) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, dwReserved0, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, dwReserved0, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, dwReserved0, 36) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, dwReserved1, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, dwReserved1, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, dwReserved1, 40) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, cFileName, 520) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, cFileName, 2) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, cFileName, 44) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, cAlternateFileName, 28) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, cAlternateFileName, 2) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, cAlternateFileName, 564) +} + +static void test_pack_WIN32_STREAM_ID(void) +{ + /* WIN32_STREAM_ID (pack 8) */ + TEST_TYPE_SIZE (WIN32_STREAM_ID, 24) + TEST_TYPE_ALIGN (WIN32_STREAM_ID, 8) + TEST_FIELD_SIZE (WIN32_STREAM_ID, dwStreamId, 4) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, dwStreamId, 4) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, dwStreamId, 0) + TEST_FIELD_SIZE (WIN32_STREAM_ID, dwStreamAttributes, 4) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, dwStreamAttributes, 4) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, dwStreamAttributes, 4) + TEST_FIELD_SIZE (WIN32_STREAM_ID, Size, 8) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, Size, 8) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, Size, 8) + TEST_FIELD_SIZE (WIN32_STREAM_ID, dwStreamNameSize, 4) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, dwStreamNameSize, 4) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, dwStreamNameSize, 16) + TEST_FIELD_SIZE (WIN32_STREAM_ID, cStreamName, 2) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, cStreamName, 2) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, cStreamName, 20) +} + +#else /* _WIN64 */ + +static void test_pack_LPOSVERSIONINFOA(void) +{ + /* LPOSVERSIONINFOA */ + TEST_TYPE_SIZE (LPOSVERSIONINFOA, 4) + TEST_TYPE_ALIGN (LPOSVERSIONINFOA, 4) + TEST_TARGET_SIZE (LPOSVERSIONINFOA, 148) + TEST_TARGET_ALIGN(LPOSVERSIONINFOA, 4) +} + +static void test_pack_LPOSVERSIONINFOEXA(void) +{ + /* LPOSVERSIONINFOEXA */ + TEST_TYPE_SIZE (LPOSVERSIONINFOEXA, 4) + TEST_TYPE_ALIGN (LPOSVERSIONINFOEXA, 4) + TEST_TARGET_SIZE (LPOSVERSIONINFOEXA, 156) + TEST_TARGET_ALIGN(LPOSVERSIONINFOEXA, 4) +} + +static void test_pack_LPOSVERSIONINFOEXW(void) +{ + /* LPOSVERSIONINFOEXW */ + TEST_TYPE_SIZE (LPOSVERSIONINFOEXW, 4) + TEST_TYPE_ALIGN (LPOSVERSIONINFOEXW, 4) + TEST_TARGET_SIZE (LPOSVERSIONINFOEXW, 284) + TEST_TARGET_ALIGN(LPOSVERSIONINFOEXW, 4) +} + +static void test_pack_LPOSVERSIONINFOW(void) +{ + /* LPOSVERSIONINFOW */ + TEST_TYPE_SIZE (LPOSVERSIONINFOW, 4) + TEST_TYPE_ALIGN (LPOSVERSIONINFOW, 4) + TEST_TARGET_SIZE (LPOSVERSIONINFOW, 276) + TEST_TARGET_ALIGN(LPOSVERSIONINFOW, 4) +} + +static void test_pack_OSVERSIONINFOA(void) +{ + /* OSVERSIONINFOA */ + TEST_TYPE_SIZE (OSVERSIONINFOA, 148) + TEST_TYPE_ALIGN (OSVERSIONINFOA, 4) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwMajorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwMajorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwMajorVersion, 4) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwMinorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwMinorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwMinorVersion, 8) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwBuildNumber, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwBuildNumber, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwBuildNumber, 12) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwPlatformId, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwPlatformId, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwPlatformId, 16) + TEST_FIELD_SIZE (OSVERSIONINFOA, szCSDVersion, 128) + TEST_FIELD_ALIGN (OSVERSIONINFOA, szCSDVersion, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOA, szCSDVersion, 20) +} + +static void test_pack_OSVERSIONINFOEXA(void) +{ + /* OSVERSIONINFOEXA */ + TEST_TYPE_SIZE (OSVERSIONINFOEXA, 156) + TEST_TYPE_ALIGN (OSVERSIONINFOEXA, 4) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwMajorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwMajorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwMajorVersion, 4) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwMinorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwMinorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwMinorVersion, 8) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwBuildNumber, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwBuildNumber, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwBuildNumber, 12) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwPlatformId, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwPlatformId, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwPlatformId, 16) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, szCSDVersion, 128) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, szCSDVersion, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, szCSDVersion, 20) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wServicePackMajor, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wServicePackMajor, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wServicePackMajor, 148) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wServicePackMinor, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wServicePackMinor, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wServicePackMinor, 150) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wSuiteMask, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wSuiteMask, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wSuiteMask, 152) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wProductType, 1) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wProductType, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wProductType, 154) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wReserved, 1) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wReserved, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wReserved, 155) +} + +static void test_pack_OSVERSIONINFOEXW(void) +{ + /* OSVERSIONINFOEXW */ + TEST_TYPE_SIZE (OSVERSIONINFOEXW, 284) + TEST_TYPE_ALIGN (OSVERSIONINFOEXW, 4) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwMinorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwMinorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwMinorVersion, 8) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwBuildNumber, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwBuildNumber, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwBuildNumber, 12) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwPlatformId, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwPlatformId, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwPlatformId, 16) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, szCSDVersion, 256) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, szCSDVersion, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, szCSDVersion, 20) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wServicePackMajor, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wServicePackMajor, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wServicePackMajor, 276) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wServicePackMinor, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wServicePackMinor, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wServicePackMinor, 278) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wSuiteMask, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wSuiteMask, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wSuiteMask, 280) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wProductType, 1) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wProductType, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wProductType, 282) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wReserved, 1) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wReserved, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wReserved, 283) +} + +static void test_pack_OSVERSIONINFOW(void) +{ + /* OSVERSIONINFOW */ TEST_TYPE_SIZE (OSVERSIONINFOW, 276) TEST_TYPE_ALIGN (OSVERSIONINFOW, 4) TEST_FIELD_SIZE (OSVERSIONINFOW, dwOSVersionInfoSize, 4) @@ -312,7 +2159,7 @@ static void test_pack_PHKEY(void) static void test_pack_ACTCTXA(void) { - /* ACTCTXA (pack 4) */ + /* ACTCTXA */ TEST_TYPE_SIZE (ACTCTXA, 32) TEST_TYPE_ALIGN (ACTCTXA, 4) TEST_FIELD_SIZE (ACTCTXA, cbSize, 4) @@ -346,7 +2193,7 @@ static void test_pack_ACTCTXA(void) static void test_pack_ACTCTXW(void) { - /* ACTCTXW (pack 4) */ + /* ACTCTXW */ TEST_TYPE_SIZE (ACTCTXW, 32) TEST_TYPE_ALIGN (ACTCTXW, 4) TEST_FIELD_SIZE (ACTCTXW, cbSize, 4) @@ -380,7 +2227,7 @@ static void test_pack_ACTCTXW(void) static void test_pack_ACTCTX_SECTION_KEYED_DATA(void) { - /* ACTCTX_SECTION_KEYED_DATA (pack 4) */ + /* ACTCTX_SECTION_KEYED_DATA */ TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA, 64) TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA, 4) TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, cbSize, 4) @@ -423,7 +2270,7 @@ static void test_pack_ACTCTX_SECTION_KEYED_DATA(void) static void test_pack_ACTCTX_SECTION_KEYED_DATA_2600(void) { - /* ACTCTX_SECTION_KEYED_DATA_2600 (pack 4) */ + /* ACTCTX_SECTION_KEYED_DATA_2600 */ TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, 40) TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, 4) TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, cbSize, 4) @@ -460,7 +2307,7 @@ static void test_pack_ACTCTX_SECTION_KEYED_DATA_2600(void) static void test_pack_ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) { - /* ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA (pack 4) */ + /* ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 20) TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 4) TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpInformation, 4) @@ -482,7 +2329,7 @@ static void test_pack_ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) static void test_pack_ACTIVATION_CONTEXT_BASIC_INFORMATION(void) { - /* ACTIVATION_CONTEXT_BASIC_INFORMATION (pack 4) */ + /* ACTIVATION_CONTEXT_BASIC_INFORMATION */ TEST_TYPE_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, 8) TEST_TYPE_ALIGN (ACTIVATION_CONTEXT_BASIC_INFORMATION, 4) TEST_FIELD_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, hActCtx, 4) @@ -495,7 +2342,7 @@ static void test_pack_ACTIVATION_CONTEXT_BASIC_INFORMATION(void) static void test_pack_BY_HANDLE_FILE_INFORMATION(void) { - /* BY_HANDLE_FILE_INFORMATION (pack 4) */ + /* BY_HANDLE_FILE_INFORMATION */ TEST_TYPE_SIZE (BY_HANDLE_FILE_INFORMATION, 52) TEST_TYPE_ALIGN (BY_HANDLE_FILE_INFORMATION, 4) TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, dwFileAttributes, 4) @@ -532,7 +2379,7 @@ static void test_pack_BY_HANDLE_FILE_INFORMATION(void) static void test_pack_COMMCONFIG(void) { - /* COMMCONFIG (pack 4) */ + /* COMMCONFIG */ TEST_TYPE_SIZE (COMMCONFIG, 52) TEST_TYPE_ALIGN (COMMCONFIG, 4) TEST_FIELD_SIZE (COMMCONFIG, dwSize, 4) @@ -563,7 +2410,7 @@ static void test_pack_COMMCONFIG(void) static void test_pack_COMMPROP(void) { - /* COMMPROP (pack 4) */ + /* COMMPROP */ TEST_TYPE_SIZE (COMMPROP, 64) TEST_TYPE_ALIGN (COMMPROP, 4) TEST_FIELD_SIZE (COMMPROP, wPacketLength, 2) @@ -624,7 +2471,7 @@ static void test_pack_COMMPROP(void) static void test_pack_COMMTIMEOUTS(void) { - /* COMMTIMEOUTS (pack 4) */ + /* COMMTIMEOUTS */ TEST_TYPE_SIZE (COMMTIMEOUTS, 20) TEST_TYPE_ALIGN (COMMTIMEOUTS, 4) TEST_FIELD_SIZE (COMMTIMEOUTS, ReadIntervalTimeout, 4) @@ -646,7 +2493,7 @@ static void test_pack_COMMTIMEOUTS(void) static void test_pack_COMSTAT(void) { - /* COMSTAT (pack 4) */ + /* COMSTAT */ TEST_TYPE_SIZE (COMSTAT, 12) TEST_TYPE_ALIGN (COMSTAT, 4) TEST_FIELD_SIZE (COMSTAT, cbInQue, 4) @@ -659,7 +2506,7 @@ static void test_pack_COMSTAT(void) static void test_pack_CREATE_PROCESS_DEBUG_INFO(void) { - /* CREATE_PROCESS_DEBUG_INFO (pack 4) */ + /* CREATE_PROCESS_DEBUG_INFO */ TEST_TYPE_SIZE (CREATE_PROCESS_DEBUG_INFO, 40) TEST_TYPE_ALIGN (CREATE_PROCESS_DEBUG_INFO, 4) TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, hFile, 4) @@ -696,7 +2543,7 @@ static void test_pack_CREATE_PROCESS_DEBUG_INFO(void) static void test_pack_CREATE_THREAD_DEBUG_INFO(void) { - /* CREATE_THREAD_DEBUG_INFO (pack 4) */ + /* CREATE_THREAD_DEBUG_INFO */ TEST_TYPE_SIZE (CREATE_THREAD_DEBUG_INFO, 12) TEST_TYPE_ALIGN (CREATE_THREAD_DEBUG_INFO, 4) TEST_FIELD_SIZE (CREATE_THREAD_DEBUG_INFO, hThread, 4) @@ -724,7 +2571,7 @@ static void test_pack_CRITICAL_SECTION_DEBUG(void) static void test_pack_DCB(void) { - /* DCB (pack 4) */ + /* DCB */ TEST_TYPE_SIZE (DCB, 28) TEST_TYPE_ALIGN (DCB, 4) TEST_FIELD_SIZE (DCB, DCBlength, 4) @@ -773,7 +2620,7 @@ static void test_pack_DCB(void) static void test_pack_DEBUG_EVENT(void) { - /* DEBUG_EVENT (pack 4) */ + /* DEBUG_EVENT */ TEST_FIELD_SIZE (DEBUG_EVENT, dwDebugEventCode, 4) TEST_FIELD_ALIGN (DEBUG_EVENT, dwDebugEventCode, 4) TEST_FIELD_OFFSET(DEBUG_EVENT, dwDebugEventCode, 0) @@ -829,7 +2676,7 @@ static void test_pack_ENUMRESTYPEPROCW(void) static void test_pack_EXCEPTION_DEBUG_INFO(void) { - /* EXCEPTION_DEBUG_INFO (pack 4) */ + /* EXCEPTION_DEBUG_INFO */ TEST_TYPE_SIZE (EXCEPTION_DEBUG_INFO, 84) TEST_TYPE_ALIGN (EXCEPTION_DEBUG_INFO, 4) TEST_FIELD_SIZE (EXCEPTION_DEBUG_INFO, ExceptionRecord, 80) @@ -842,7 +2689,7 @@ static void test_pack_EXCEPTION_DEBUG_INFO(void) static void test_pack_EXIT_PROCESS_DEBUG_INFO(void) { - /* EXIT_PROCESS_DEBUG_INFO (pack 4) */ + /* EXIT_PROCESS_DEBUG_INFO */ TEST_TYPE_SIZE (EXIT_PROCESS_DEBUG_INFO, 4) TEST_TYPE_ALIGN (EXIT_PROCESS_DEBUG_INFO, 4) TEST_FIELD_SIZE (EXIT_PROCESS_DEBUG_INFO, dwExitCode, 4) @@ -852,7 +2699,7 @@ static void test_pack_EXIT_PROCESS_DEBUG_INFO(void) static void test_pack_EXIT_THREAD_DEBUG_INFO(void) { - /* EXIT_THREAD_DEBUG_INFO (pack 4) */ + /* EXIT_THREAD_DEBUG_INFO */ TEST_TYPE_SIZE (EXIT_THREAD_DEBUG_INFO, 4) TEST_TYPE_ALIGN (EXIT_THREAD_DEBUG_INFO, 4) TEST_FIELD_SIZE (EXIT_THREAD_DEBUG_INFO, dwExitCode, 4) @@ -862,7 +2709,7 @@ static void test_pack_EXIT_THREAD_DEBUG_INFO(void) static void test_pack_HW_PROFILE_INFOA(void) { - /* HW_PROFILE_INFOA (pack 4) */ + /* HW_PROFILE_INFOA */ TEST_TYPE_SIZE (HW_PROFILE_INFOA, 124) TEST_TYPE_ALIGN (HW_PROFILE_INFOA, 4) TEST_FIELD_SIZE (HW_PROFILE_INFOA, dwDockInfo, 4) @@ -878,7 +2725,7 @@ static void test_pack_HW_PROFILE_INFOA(void) static void test_pack_HW_PROFILE_INFOW(void) { - /* HW_PROFILE_INFOW (pack 4) */ + /* HW_PROFILE_INFOW */ TEST_TYPE_SIZE (HW_PROFILE_INFOW, 244) TEST_TYPE_ALIGN (HW_PROFILE_INFOW, 4) TEST_FIELD_SIZE (HW_PROFILE_INFOW, dwDockInfo, 4) @@ -894,7 +2741,7 @@ static void test_pack_HW_PROFILE_INFOW(void) static void test_pack_LOAD_DLL_DEBUG_INFO(void) { - /* LOAD_DLL_DEBUG_INFO (pack 4) */ + /* LOAD_DLL_DEBUG_INFO */ TEST_TYPE_SIZE (LOAD_DLL_DEBUG_INFO, 24) TEST_TYPE_ALIGN (LOAD_DLL_DEBUG_INFO, 4) TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, hFile, 4) @@ -1201,7 +3048,7 @@ static void test_pack_LPWIN32_STREAM_ID(void) static void test_pack_MEMORYSTATUS(void) { - /* MEMORYSTATUS (pack 4) */ + /* MEMORYSTATUS */ TEST_TYPE_SIZE (MEMORYSTATUS, 32) TEST_TYPE_ALIGN (MEMORYSTATUS, 4) TEST_FIELD_SIZE (MEMORYSTATUS, dwLength, 4) @@ -1266,7 +3113,7 @@ static void test_pack_MEMORYSTATUSEX(void) static void test_pack_OFSTRUCT(void) { - /* OFSTRUCT (pack 4) */ + /* OFSTRUCT */ TEST_TYPE_SIZE (OFSTRUCT, 136) TEST_TYPE_ALIGN (OFSTRUCT, 2) TEST_FIELD_SIZE (OFSTRUCT, cBytes, 1) @@ -1291,7 +3138,7 @@ static void test_pack_OFSTRUCT(void) static void test_pack_OUTPUT_DEBUG_STRING_INFO(void) { - /* OUTPUT_DEBUG_STRING_INFO (pack 4) */ + /* OUTPUT_DEBUG_STRING_INFO */ TEST_TYPE_SIZE (OUTPUT_DEBUG_STRING_INFO, 8) TEST_TYPE_ALIGN (OUTPUT_DEBUG_STRING_INFO, 4) TEST_FIELD_SIZE (OUTPUT_DEBUG_STRING_INFO, lpDebugStringData, 4) @@ -1475,7 +3322,7 @@ static void test_pack_PQUERYACTCTXW_FUNC(void) static void test_pack_PROCESS_HEAP_ENTRY(void) { - /* PROCESS_HEAP_ENTRY (pack 4) */ + /* PROCESS_HEAP_ENTRY */ TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, lpData, 4) TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, lpData, 4) TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, lpData, 0) @@ -1495,7 +3342,7 @@ static void test_pack_PROCESS_HEAP_ENTRY(void) static void test_pack_PROCESS_INFORMATION(void) { - /* PROCESS_INFORMATION (pack 4) */ + /* PROCESS_INFORMATION */ TEST_TYPE_SIZE (PROCESS_INFORMATION, 16) TEST_TYPE_ALIGN (PROCESS_INFORMATION, 4) TEST_FIELD_SIZE (PROCESS_INFORMATION, hProcess, 4) @@ -1566,7 +3413,7 @@ static void test_pack_PWIN32_FIND_DATAW(void) static void test_pack_RIP_INFO(void) { - /* RIP_INFO (pack 4) */ + /* RIP_INFO */ TEST_TYPE_SIZE (RIP_INFO, 8) TEST_TYPE_ALIGN (RIP_INFO, 4) TEST_FIELD_SIZE (RIP_INFO, dwError, 4) @@ -1579,7 +3426,7 @@ static void test_pack_RIP_INFO(void) static void test_pack_SECURITY_ATTRIBUTES(void) { - /* SECURITY_ATTRIBUTES (pack 4) */ + /* SECURITY_ATTRIBUTES */ TEST_TYPE_SIZE (SECURITY_ATTRIBUTES, 12) TEST_TYPE_ALIGN (SECURITY_ATTRIBUTES, 4) TEST_FIELD_SIZE (SECURITY_ATTRIBUTES, nLength, 4) @@ -1595,7 +3442,7 @@ static void test_pack_SECURITY_ATTRIBUTES(void) static void test_pack_STARTUPINFOA(void) { - /* STARTUPINFOA (pack 4) */ + /* STARTUPINFOA */ TEST_TYPE_SIZE (STARTUPINFOA, 68) TEST_TYPE_ALIGN (STARTUPINFOA, 4) TEST_FIELD_SIZE (STARTUPINFOA, cb, 4) @@ -1656,7 +3503,7 @@ static void test_pack_STARTUPINFOA(void) static void test_pack_STARTUPINFOW(void) { - /* STARTUPINFOW (pack 4) */ + /* STARTUPINFOW */ TEST_TYPE_SIZE (STARTUPINFOW, 68) TEST_TYPE_ALIGN (STARTUPINFOW, 4) TEST_FIELD_SIZE (STARTUPINFOW, cb, 4) @@ -1717,7 +3564,7 @@ static void test_pack_STARTUPINFOW(void) static void test_pack_SYSTEMTIME(void) { - /* SYSTEMTIME (pack 4) */ + /* SYSTEMTIME */ TEST_TYPE_SIZE (SYSTEMTIME, 16) TEST_TYPE_ALIGN (SYSTEMTIME, 2) TEST_FIELD_SIZE (SYSTEMTIME, wYear, 2) @@ -1748,12 +3595,12 @@ static void test_pack_SYSTEMTIME(void) static void test_pack_SYSTEM_INFO(void) { - /* SYSTEM_INFO (pack 4) */ + /* SYSTEM_INFO */ } static void test_pack_SYSTEM_POWER_STATUS(void) { - /* SYSTEM_POWER_STATUS (pack 4) */ + /* SYSTEM_POWER_STATUS */ TEST_TYPE_SIZE (SYSTEM_POWER_STATUS, 12) TEST_TYPE_ALIGN (SYSTEM_POWER_STATUS, 4) TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, ACLineStatus, 1) @@ -1778,7 +3625,7 @@ static void test_pack_SYSTEM_POWER_STATUS(void) static void test_pack_TIME_ZONE_INFORMATION(void) { - /* TIME_ZONE_INFORMATION (pack 4) */ + /* TIME_ZONE_INFORMATION */ TEST_TYPE_SIZE (TIME_ZONE_INFORMATION, 172) TEST_TYPE_ALIGN (TIME_ZONE_INFORMATION, 4) TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, Bias, 4) @@ -1806,7 +3653,7 @@ static void test_pack_TIME_ZONE_INFORMATION(void) static void test_pack_UNLOAD_DLL_DEBUG_INFO(void) { - /* UNLOAD_DLL_DEBUG_INFO (pack 4) */ + /* UNLOAD_DLL_DEBUG_INFO */ TEST_TYPE_SIZE (UNLOAD_DLL_DEBUG_INFO, 4) TEST_TYPE_ALIGN (UNLOAD_DLL_DEBUG_INFO, 4) TEST_FIELD_SIZE (UNLOAD_DLL_DEBUG_INFO, lpBaseOfDll, 4) @@ -1823,7 +3670,7 @@ static void test_pack_WAITORTIMERCALLBACK(void) static void test_pack_WIN32_FILE_ATTRIBUTE_DATA(void) { - /* WIN32_FILE_ATTRIBUTE_DATA (pack 4) */ + /* WIN32_FILE_ATTRIBUTE_DATA */ TEST_TYPE_SIZE (WIN32_FILE_ATTRIBUTE_DATA, 36) TEST_TYPE_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, 4) TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, dwFileAttributes, 4) @@ -1848,7 +3695,7 @@ static void test_pack_WIN32_FILE_ATTRIBUTE_DATA(void) static void test_pack_WIN32_FIND_DATAA(void) { - /* WIN32_FIND_DATAA (pack 4) */ + /* WIN32_FIND_DATAA */ TEST_TYPE_SIZE (WIN32_FIND_DATAA, 320) TEST_TYPE_ALIGN (WIN32_FIND_DATAA, 4) TEST_FIELD_SIZE (WIN32_FIND_DATAA, dwFileAttributes, 4) @@ -1885,7 +3732,7 @@ static void test_pack_WIN32_FIND_DATAA(void) static void test_pack_WIN32_FIND_DATAW(void) { - /* WIN32_FIND_DATAW (pack 4) */ + /* WIN32_FIND_DATAW */ TEST_TYPE_SIZE (WIN32_FIND_DATAW, 592) TEST_TYPE_ALIGN (WIN32_FIND_DATAW, 4) TEST_FIELD_SIZE (WIN32_FIND_DATAW, dwFileAttributes, 4) @@ -1942,6 +3789,8 @@ static void test_pack_WIN32_STREAM_ID(void) TEST_FIELD_OFFSET(WIN32_STREAM_ID, cStreamName, 20) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_ACTCTXA(); @@ -2072,9 +3921,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/kernel32/heap.c b/rostests/winetests/kernel32/heap.c index 7c755b9d509..1d49def44d8 100755 --- a/rostests/winetests/kernel32/heap.c +++ b/rostests/winetests/kernel32/heap.c @@ -30,7 +30,6 @@ #include "wine/test.h" - #define MAGIC_DEAD 0xdeadbeef /* some undocumented flags (names are made up) */ @@ -531,7 +530,7 @@ static void test_heap_checks( DWORD flags ) ok( p[15] == 0, "wrong padding %x\n", p[15] ); } } - else skip( "realloc in place failed\n "); + else skip( "realloc in place failed\n"); ret = HeapFree( GetProcessHeap(), 0, p ); ok( ret, "HeapFree failed\n" ); diff --git a/rostests/winetests/kernel32/path.c b/rostests/winetests/kernel32/path.c index be019483d57..8232fdfaaa7 100755 --- a/rostests/winetests/kernel32/path.c +++ b/rostests/winetests/kernel32/path.c @@ -1017,7 +1017,7 @@ static void test_GetLongPathNameA(void) /* Test a normal path with a small buffer size */ memset(temppath, 0, MAX_PATH); length = pGetLongPathNameA(tempfile, temppath, 4); - /* We have a failure so length should be the minumum plus the terminating '0' */ + /* We have a failure so length should be the minimum plus the terminating '0' */ ok(length >= lstrlen(tempfile) + 1, "Wrong length\n"); ok(temppath[0] == 0, "Buffer should not have been touched\n"); diff --git a/rostests/winetests/kernel32/thread.c b/rostests/winetests/kernel32/thread.c index afa67592a4a..4c4e764939d 100755 --- a/rostests/winetests/kernel32/thread.c +++ b/rostests/winetests/kernel32/thread.c @@ -814,9 +814,19 @@ static VOID test_thread_processor(void) ok(SetThreadAffinityMask(curthread,processMask+1)==0, "SetThreadAffinityMask passed for an illegal processor\n"); /* NOTE: Pre-Vista does not recognize the "all processors" flag (all bits set) */ - retMask = SetThreadAffinityMask(curthread,~0UL); + retMask = SetThreadAffinityMask(curthread,~0); ok(broken(retMask==0) || retMask==processMask, "SetThreadAffinityMask(thread,-1) failed to request all processors.\n"); + if (retMask == processMask && sizeof(ULONG_PTR) > sizeof(ULONG)) + { + /* only the low 32-bits matter */ + retMask = SetThreadAffinityMask(curthread,~(ULONG_PTR)0); + ok(retMask == processMask, "SetThreadAffinityMask failed\n"); + retMask = SetThreadAffinityMask(curthread,~(ULONG_PTR)0 >> 3); + ok(retMask == processMask, "SetThreadAffinityMask failed\n"); + retMask = SetThreadAffinityMask(curthread,~(ULONG_PTR)1); + ok(retMask == 0, "SetThreadAffinityMask succeeded\n"); + } /* NOTE: This only works on WinNT/2000/XP) */ if (pSetThreadIdealProcessor) { SetLastError(0xdeadbeef); From 07d8f76a27ec0a57e9b72e5d3ce9cd65227b1f53 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 22 Apr 2010 11:25:56 +0000 Subject: [PATCH 181/261] [REGEDIT] Only set a registry path if the root node is not selected, adjust checks See issue #5297 for more details. svn path=/trunk/; revision=46991 --- reactos/base/applications/regedit/framewnd.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/regedit/framewnd.c b/reactos/base/applications/regedit/framewnd.c index 6a90cc3edd2..9f42346e550 100644 --- a/reactos/base/applications/regedit/framewnd.c +++ b/reactos/base/applications/regedit/framewnd.c @@ -356,11 +356,11 @@ static UINT_PTR CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, W hwndExportAll = GetDlgItem(hdlg, IDC_EXPORT_ALL); if (hwndExportAll) - SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey[0] ? BST_UNCHECKED : BST_CHECKED, 0); + SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey ? BST_UNCHECKED : BST_CHECKED, 0); hwndExportBranch = GetDlgItem(hdlg, IDC_EXPORT_BRANCH); if (hwndExportBranch) - SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey[0] ? BST_CHECKED : BST_UNCHECKED, 0); + SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey ? BST_CHECKED : BST_UNCHECKED, 0); hwndExportBranchText = GetDlgItem(hdlg, IDC_EXPORT_BRANCH_TEXT); if (hwndExportBranchText) @@ -406,7 +406,12 @@ BOOL ExportRegistryFile(HWND hWnd) InitOpenFileName(hWnd, &ofn); LoadString(hInst, IDS_EXPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR)); ofn.lpstrTitle = Caption; - ofn.lCustData = (LPARAM) ExportKeyPath; + + /* Only set the path if a key (not the root node) is selected */ + if (hKeyRoot != 0) + { + ofn.lCustData = (LPARAM) ExportKeyPath; + } ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK; ofn.lpfnHook = ExportRegistryFile_OFNHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORTRANGE); From af6172876cb5f7eb84980f5f0b45bf4141fd7ece Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 22 Apr 2010 12:49:20 +0000 Subject: [PATCH 182/261] [REGEDIT] - Don't assign an uninitialized custom filter buffer to the OPENFILENAME structure, clean up commented out code - Allows standard file type filters to show up See issue #5307 for more details. svn path=/trunk/; revision=46992 --- reactos/base/applications/regedit/framewnd.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/reactos/base/applications/regedit/framewnd.c b/reactos/base/applications/regedit/framewnd.c index 9f42346e550..a6b4144bcef 100644 --- a/reactos/base/applications/regedit/framewnd.c +++ b/reactos/base/applications/regedit/framewnd.c @@ -228,8 +228,6 @@ static BOOL CheckCommDlgError(HWND hWnd) return TRUE; } -#define MAX_CUSTOM_FILTER_SIZE 50 -TCHAR CustomFilterBuffer[MAX_CUSTOM_FILTER_SIZE]; TCHAR FileNameBuffer[_MAX_PATH]; TCHAR FileTitleBuffer[_MAX_PATH]; @@ -275,25 +273,11 @@ static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn) BuildFilterStrings(Filter, FilterPairs, sizeof(FilterPairs) / sizeof(FILTERPAIR)); pofn->lpstrFilter = Filter; - pofn->lpstrCustomFilter = CustomFilterBuffer; - pofn->nMaxCustFilter = MAX_CUSTOM_FILTER_SIZE; - pofn->nFilterIndex = 0; pofn->lpstrFile = FileNameBuffer; pofn->nMaxFile = _MAX_PATH; pofn->lpstrFileTitle = FileTitleBuffer; pofn->nMaxFileTitle = _MAX_PATH; - /* pofn->lpstrInitialDir = _T("");*/ - /* pofn->lpstrTitle = _T("Import Registry File");*/ - /* pofn->Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER + OFN_ENABLESIZING;*/ pofn->Flags = OFN_HIDEREADONLY; - /* pofn->nFileOffset = ;*/ - /* pofn->nFileExtension = ;*/ - /* pofn->lpstrDefExt = _T("");*/ - /* pofn->lCustData = ;*/ - /* pofn->lpfnHook = ImportRegistryFile_OFNHookProc;*/ - /* pofn->lpTemplateName = _T("ID_DLG_IMPORT_REGFILE");*/ - /* pofn->lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);*/ - /* pofn->FlagsEx = ;*/ return TRUE; } From c0d168b15aeb3a5de1d71bc39d3f523fd71b18b7 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 22 Apr 2010 20:35:58 +0000 Subject: [PATCH 183/261] [PCI] - Forward IRPs to our PDO instead of just completing them - Handle IRP_MN_START_DEVICE on the way back up the stack (allows the PDO code to assign resources to the bus) - Add some synchronous IRP forwarding copied from i8042prt svn path=/trunk/; revision=46996 --- reactos/drivers/bus/pci/fdo.c | 86 ++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 21 deletions(-) diff --git a/reactos/drivers/bus/pci/fdo.c b/reactos/drivers/bus/pci/fdo.c index 8072a89b455..b6753e10a5e 100644 --- a/reactos/drivers/bus/pci/fdo.c +++ b/reactos/drivers/bus/pci/fdo.c @@ -16,6 +16,46 @@ /*** PRIVATE *****************************************************************/ +static IO_COMPLETION_ROUTINE ForwardIrpAndWaitCompletion; + +static NTSTATUS NTAPI +ForwardIrpAndWaitCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context) +{ + UNREFERENCED_PARAMETER(DeviceObject); + if (Irp->PendingReturned) + KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); + return STATUS_MORE_PROCESSING_REQUIRED; +} + +NTSTATUS NTAPI +ForwardIrpAndWait( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + KEVENT Event; + NTSTATUS Status; + PDEVICE_OBJECT LowerDevice = ((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Ldo; + ASSERT(LowerDevice); + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + IoCopyCurrentIrpStackLocationToNext(Irp); + + IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE, TRUE); + + Status = IoCallDriver(LowerDevice, Irp); + if (Status == STATUS_PENDING) + { + Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); + if (NT_SUCCESS(Status)) + Status = Irp->IoStatus.Status; + } + + return Status; +} + static NTSTATUS FdoLocateChildDevice( PPCI_DEVICE *Device, @@ -466,7 +506,7 @@ FdoPnpControl( { PFDO_DEVICE_EXTENSION DeviceExtension; PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; + NTSTATUS Status = Irp->IoStatus.Status; DPRINT("Called\n"); @@ -492,8 +532,13 @@ FdoPnpControl( break; #endif case IRP_MN_QUERY_DEVICE_RELATIONS: + if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations) + break; + Status = FdoQueryBusRelations(DeviceObject, Irp, IrpSp); - break; + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; #if 0 case IRP_MN_QUERY_PNP_DEVICE_STATE: Status = STATUS_NOT_IMPLEMENTED; @@ -513,38 +558,37 @@ FdoPnpControl( #endif case IRP_MN_START_DEVICE: DPRINT("IRP_MN_START_DEVICE received\n"); - Status = FdoStartDevice(DeviceObject, Irp); - break; + Status = ForwardIrpAndWait(DeviceObject, Irp); + if (NT_SUCCESS(Status)) + Status = FdoStartDevice(DeviceObject, Irp); + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; case IRP_MN_STOP_DEVICE: /* Currently not supported */ Status = STATUS_UNSUCCESSFUL; - break; + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; #if 0 case IRP_MN_SURPRISE_REMOVAL: Status = STATUS_NOT_IMPLEMENTED; break; #endif + case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: + break; + case IRP_MN_REMOVE_DEVICE: + DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n"); + break; default: DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction); - /* fall through */ - - case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - /* - * Do NOT complete the IRP as it will be processed by the lower - * device object, which will complete the IRP - */ - IoSkipCurrentIrpStackLocation(Irp); - Status = IoCallDriver(DeviceExtension->Ldo, Irp); - return Status; break; } - - if (Status != STATUS_PENDING) { - if (Status != STATUS_NOT_IMPLEMENTED) - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } + Irp->IoStatus.Status = Status; + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(DeviceExtension->Ldo, Irp); DPRINT("Leaving. Status 0x%X\n", Status); From 1e1d4a34ac9f9127b79b1110d55f0df4413a0e82 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 22 Apr 2010 21:07:46 +0000 Subject: [PATCH 184/261] [NTOSKRNL] - Add a stub for IRP_MN_REMOVE_DEVICE in PnpRoot - Revert 2 incorrect changes from r46983 (DNF_ENUMERATED added to the DNF_ADDED assertion and setting the DNF_RESOURCE_REPORTED flag in IopStartDevice2) - Set the DNF_LEGACY_DRIVER flag if the AddDevice handler is missing - Add a helper function called IopSendRemoveDevice which sends IRP_MN_REMOVE_DEVICE to a device object - Call IopSendRemoveDevice if IRP_MN_START_DEVICE fails - Set the DNF_STARTED and DNF_ADDED flags for legacy drivers - Enable the DNF_ADDED assertion in IopStartDevice2 svn path=/trunk/; revision=46997 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 54 ++++++++++++++++++---------- reactos/ntoskrnl/io/pnpmgr/pnproot.c | 5 +++ 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index dbfada18ed9..645b837de81 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -66,19 +66,20 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, NTSTATUS Status; if (!DriverObject->DriverExtension->AddDevice) + { + DeviceNode->Flags |= DNF_LEGACY_DRIVER; + } + + if (DeviceNode->Flags & DNF_LEGACY_DRIVER) + { + DeviceNode->Flags |= DNF_ADDED + DNF_STARTED; return STATUS_SUCCESS; + } /* This is a Plug and Play driver */ DPRINT("Plug and Play driver found\n"); ASSERT(DeviceNode->PhysicalDeviceObject); - /* Check if this plug-and-play driver is used as a legacy one for this device node */ - if (IopDeviceNodeHasFlag(DeviceNode, DNF_LEGACY_DRIVER)) - { - IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); - return STATUS_SUCCESS; - } - DPRINT("Calling %wZ->AddDevice(%wZ)\n", &DriverObject->DriverName, &DeviceNode->InstancePath); @@ -122,6 +123,21 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, return STATUS_SUCCESS; } +VOID +NTAPI +IopSendRemoveDevice(IN PDEVICE_OBJECT DeviceObject) +{ + IO_STACK_LOCATION Stack; + PVOID Dummy; + + RtlZeroMemory(&Stack, sizeof(IO_STACK_LOCATION)); + Stack.MajorFunction = IRP_MJ_PNP; + Stack.MinorFunction = IRP_MN_REMOVE_DEVICE; + + /* Drivers should never fail a IRP_MN_REMOVE_DEVICE request */ + IopSynchronousCall(DeviceObject, &Stack, &Dummy); +} + VOID NTAPI IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) @@ -156,10 +172,11 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) Status = IopSynchronousCall(DeviceObject, &Stack, &Dummy); if (!NT_SUCCESS(Status)) { - /* We failed start */ - DeviceNode->Flags |= DNF_START_FAILED; + /* Send an IRP_MN_REMOVE_DEVICE request */ + IopSendRemoveDevice(DeviceObject); - /* TODO: Undo all the stuff we did up to this point */ + /* Set the appropriate flag */ + DeviceNode->Flags |= DNF_START_FAILED; DPRINT1("Warning: PnP Start failed (%wZ)\n", &DeviceNode->InstancePath); return; @@ -168,9 +185,6 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) /* Otherwise, mark us as started */ DeviceNode->Flags |= DNF_STARTED; - /* We reported the resources */ - DeviceNode->Flags |= DNF_RESOURCE_REPORTED; - /* We now need enumeration */ DeviceNode->Flags |= DNF_NEED_ENUMERATION_ONLY; } @@ -184,10 +198,7 @@ IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode) PAGED_CODE(); /* Sanity check */ - // ASSERT((DeviceNode->Flags & DNF_ADDED) || (DeviceNode->Flags & DNF_ENUMERATED)); - if (!(DeviceNode->Flags & DNF_ADDED) && !(DeviceNode->Flags & DNF_ENUMERATED)) - DPRINT1("Warning: Starting a device node without DNF_ADDED or DNF_ENUMERATED (%wZ)\n", - &DeviceNode->InstancePath); + ASSERT((DeviceNode->Flags & DNF_ADDED)); ASSERT((DeviceNode->Flags & (DNF_RESOURCE_ASSIGNED | DNF_RESOURCE_REPORTED | DNF_NO_RESOURCE_REQUIRED))); @@ -243,6 +254,12 @@ IopStartDevice( UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; + if (DeviceNode->Flags & (DNF_STARTED | DNF_START_REQUEST_PENDING)) + { + /* Nothing to do here */ + return STATUS_SUCCESS; + } + Status = IopAssignDeviceResources(DeviceNode); if (!NT_SUCCESS(Status)) goto ByeBye; @@ -542,8 +559,9 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, return Status; } - /* This is for drivers passed on the command line to ntoskrnl.exe */ IopDeviceNodeSetFlag(Node, DNF_LEGACY_DRIVER); + IopDeviceNodeSetFlag(Node, DNF_ADDED); + IopDeviceNodeSetFlag(Node, DNF_STARTED); } Node->PhysicalDeviceObject = PhysicalDeviceObject; diff --git a/reactos/ntoskrnl/io/pnpmgr/pnproot.c b/reactos/ntoskrnl/io/pnpmgr/pnproot.c index 30c612f1fc3..6f1834e5298 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnproot.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnproot.c @@ -1069,6 +1069,11 @@ PnpRootPdoPnpControl( DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); break; + case IRP_MN_REMOVE_DEVICE: + DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n"); + Status = STATUS_SUCCESS; + break; + case IRP_MN_QUERY_ID: /* 0x13 */ Status = PdoQueryId(DeviceObject, Irp, IrpSp); break; From 14347c75ad50fead45b67b447b8bfadfe8d92f9e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Apr 2010 22:28:49 +0000 Subject: [PATCH 185/261] Disable gdi batch for SelectObject with fonts. Fixes font regression. svn path=/trunk/; revision=46998 --- reactos/dll/win32/gdi32/objects/dc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index 34c31148bb3..2d90f60cdac 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -1540,7 +1540,7 @@ SelectObject(HDC hDC, PDC_ATTR pDc_Attr; HGDIOBJ hOldObj = NULL; UINT uType; - PTEB pTeb; +// PTEB pTeb; if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) { @@ -1582,6 +1582,7 @@ SelectObject(HDC hDC, case GDI_OBJECT_TYPE_FONT: hOldObj = pDc_Attr->hlfntNew; if (hOldObj == hGdiObj) return hOldObj; +#if 0 pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS; pDc_Attr->ulDirty_ |= DIRTY_CHARSET; pDc_Attr->hlfntNew = hGdiObj; @@ -1603,6 +1604,7 @@ SelectObject(HDC hDC, if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); return hOldObj; } +#endif // default for select object font return NtGdiSelectFont(hDC, hGdiObj); From ee1d26e73c541c33561522dfead0f6e01a7917d3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 23 Apr 2010 22:16:59 +0000 Subject: [PATCH 186/261] [FORMATTING] - Apply consistent indentation svn path=/trunk/; revision=47003 --- reactos/lib/rtl/message.c | 198 ++++++++++++++++++++------------------ 1 file changed, 102 insertions(+), 96 deletions(-) diff --git a/reactos/lib/rtl/message.c b/reactos/lib/rtl/message.c index a2b17839324..065e260bf0b 100644 --- a/reactos/lib/rtl/message.c +++ b/reactos/lib/rtl/message.c @@ -17,105 +17,109 @@ /* * @implemented */ -NTSTATUS NTAPI -RtlFindMessage(PVOID BaseAddress, - ULONG Type, - ULONG Language, - ULONG MessageId, - PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry) +NTSTATUS +NTAPI +RtlFindMessage( + PVOID BaseAddress, + ULONG Type, + ULONG Language, + ULONG MessageId, + PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry) { - LDR_RESOURCE_INFO ResourceInfo; - PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; - PRTL_MESSAGE_RESOURCE_DATA MessageTable; - NTSTATUS Status; - ULONG EntryOffset = 0, IdOffset = 0; - PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry; - ULONG i; + LDR_RESOURCE_INFO ResourceInfo; + PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; + PRTL_MESSAGE_RESOURCE_DATA MessageTable; + NTSTATUS Status; + ULONG EntryOffset = 0, IdOffset = 0; + PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry; + ULONG i; - DPRINT("RtlFindMessage()\n"); + DPRINT("RtlFindMessage()\n"); - ResourceInfo.Type = Type; - ResourceInfo.Name = 1; - ResourceInfo.Language = Language; + ResourceInfo.Type = Type; + ResourceInfo.Name = 1; + ResourceInfo.Language = Language; - Status = LdrFindResource_U(BaseAddress, - &ResourceInfo, - RESOURCE_DATA_LEVEL, - &ResourceDataEntry); - if (!NT_SUCCESS(Status)) - { - return Status; - } + Status = LdrFindResource_U(BaseAddress, + &ResourceInfo, + RESOURCE_DATA_LEVEL, + &ResourceDataEntry); + if (!NT_SUCCESS(Status)) + { + return Status; + } - DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry); + DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry); - Status = LdrAccessResource(BaseAddress, - ResourceDataEntry, - (PVOID*)&MessageTable, - NULL); - if (!NT_SUCCESS(Status)) - { - return Status; - } + Status = LdrAccessResource(BaseAddress, + ResourceDataEntry, + (PVOID*)&MessageTable, + NULL); + if (!NT_SUCCESS(Status)) + { + return Status; + } - DPRINT("MessageTable: %p\n", MessageTable); + DPRINT("MessageTable: %p\n", MessageTable); - DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks); - for (i = 0; i < MessageTable->NumberOfBlocks; i++) - { - DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n", - MessageTable->Blocks[i].LowId, - MessageTable->Blocks[i].HighId, - MessageTable->Blocks[i].OffsetToEntries); - } + DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks); + for (i = 0; i < MessageTable->NumberOfBlocks; i++) + { + DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n", + MessageTable->Blocks[i].LowId, + MessageTable->Blocks[i].HighId, + MessageTable->Blocks[i].OffsetToEntries); + } - for (i = 0; i < MessageTable->NumberOfBlocks; i++) - { - if ((MessageId >= MessageTable->Blocks[i].LowId) && - (MessageId <= MessageTable->Blocks[i].HighId)) - { - EntryOffset = MessageTable->Blocks[i].OffsetToEntries; - IdOffset = MessageId - MessageTable->Blocks[i].LowId; - break; - } + for (i = 0; i < MessageTable->NumberOfBlocks; i++) + { + if ((MessageId >= MessageTable->Blocks[i].LowId) && + (MessageId <= MessageTable->Blocks[i].HighId)) + { + EntryOffset = MessageTable->Blocks[i].OffsetToEntries; + IdOffset = MessageId - MessageTable->Blocks[i].LowId; + break; + } - if (MessageId < MessageTable->Blocks[i].LowId) - { - return STATUS_MESSAGE_NOT_FOUND; - } - } + if (MessageId < MessageTable->Blocks[i].LowId) + { + return STATUS_MESSAGE_NOT_FOUND; + } + } - if (MessageTable->NumberOfBlocks <= i) - { - return STATUS_MESSAGE_NOT_FOUND; - } + if (MessageTable->NumberOfBlocks <= i) + { + return STATUS_MESSAGE_NOT_FOUND; + } - MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries); + MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY) + ((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries); - DPRINT("EntryOffset 0x%08lx\n", EntryOffset); - DPRINT("IdOffset 0x%08lx\n", IdOffset); + DPRINT("EntryOffset 0x%08lx\n", EntryOffset); + DPRINT("IdOffset 0x%08lx\n", IdOffset); - DPRINT("MessageEntry: %p\n", MessageEntry); - for (i = 0; i < IdOffset; i++) - { - MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length); - } + DPRINT("MessageEntry: %p\n", MessageEntry); + for (i = 0; i < IdOffset; i++) + { + MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY) + ((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length); + } - if (MessageEntry->Flags == 0) - { - DPRINT("AnsiText: %s\n", MessageEntry->Text); - } - else - { - DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text); - } + if (MessageEntry->Flags == 0) + { + DPRINT("AnsiText: %s\n", MessageEntry->Text); + } + else + { + DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text); + } - if (MessageResourceEntry != NULL) - { - *MessageResourceEntry = MessageEntry; - } + if (MessageResourceEntry != NULL) + { + *MessageResourceEntry = MessageEntry; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } @@ -139,22 +143,24 @@ RtlFindMessage(PVOID BaseAddress, * * @unimplemented */ -NTSTATUS NTAPI -RtlFormatMessage(PWSTR Message, - UCHAR MaxWidth, - BOOLEAN IgnoreInserts, - BOOLEAN Ansi, - BOOLEAN ArgumentIsArray, - va_list *Arguments, - PWSTR Buffer, - ULONG BufferSize) +NTSTATUS +NTAPI +RtlFormatMessage( + PWSTR Message, + UCHAR MaxWidth, + BOOLEAN IgnoreInserts, + BOOLEAN Ansi, + BOOLEAN ArgumentIsArray, + va_list *Arguments, + PWSTR Buffer, + ULONG BufferSize) { - DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n", - Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", Ansi ? "TRUE" : "FALSE", - ArgumentIsArray ? "TRUE" : "FALSE", (PSTR)Arguments, Buffer, BufferSize); + DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n", + Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", Ansi ? "TRUE" : "FALSE", + ArgumentIsArray ? "TRUE" : "FALSE", (PSTR)Arguments, Buffer, BufferSize); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* EOF */ From 16910e9140b3586fadc3033c7fed47af9825cd6f Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 24 Apr 2010 08:51:07 +0000 Subject: [PATCH 187/261] [RBUILD] - Fix cleaning of msvc 10 project files svn path=/trunk/; revision=47004 --- reactos/tools/rbuild/backend/msvc/msvc.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/tools/rbuild/backend/msvc/msvc.cpp b/reactos/tools/rbuild/backend/msvc/msvc.cpp index 8991147a61a..688758c44a3 100644 --- a/reactos/tools/rbuild/backend/msvc/msvc.cpp +++ b/reactos/tools/rbuild/backend/msvc/msvc.cpp @@ -420,7 +420,11 @@ MSVCBackend::_clean_project_files ( void ) remove ( NcbFileName ( module ).c_str () ); remove ( SlnFileName ( module ).c_str () ); remove ( SuoFileName ( module ).c_str () ); - remove ( VcprojFileName ( module ).c_str () ); + + if ( configuration.VSProjectVersion == "10.00" ) + remove ( VcxprojFileName ( module ).c_str () ); + else + remove ( VcprojFileName ( module ).c_str () ); string username = getenv ( "USERNAME" ); string computername = getenv ( "COMPUTERNAME" ); From 9986cfddd8b28543825cd2708236b711e5feabf7 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 24 Apr 2010 18:08:11 +0000 Subject: [PATCH 188/261] [NETSHELL] Fix some German resources: - Use BS_MULTILINE instead of embedding newline characters into text - Make groupboxes and text fit into the window svn path=/trunk/; revision=47005 --- reactos/dll/win32/netshell/lang/de-DE.rc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/netshell/lang/de-DE.rc b/reactos/dll/win32/netshell/lang/de-DE.rc index 3192b29f977..de2c06bb65b 100644 --- a/reactos/dll/win32/netshell/lang/de-DE.rc +++ b/reactos/dll/win32/netshell/lang/de-DE.rc @@ -16,7 +16,7 @@ BEGIN GROUPBOX "Beschreibung", -1, 9, 153, 230, 46, BS_GROUPBOX LTEXT "Hier wird die Beschreibung des Elementes stehen....", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP CHECKBOX "&Symbol bei Verbindung im Infobereich anzeigen", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "&Benachrichtigen, wenn diese Verbindung eingeschränkte oder\nkeine Konnektivität besitzt", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Benachrichtigen, wenn diese Verbindung eingeschränkte oder keine Konnektivität besitzt", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP END IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280 @@ -54,16 +54,16 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Netzwerkunterstützung" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Verbindungsstatus", -1, 9, 8, 200, 88, BS_GROUPBOX + GROUPBOX "Verbindungsstatus", -1, 9, 8, 182, 88, BS_GROUPBOX LTEXT "Adresstyp:", -1, 22, 20, 80, 8 LTEXT "IP-Adresse:", -1, 22, 34, 80, 8 LTEXT "Subnetzmaske:", -1, 22, 48, 80, 8 LTEXT "Standardgateway:", -1, 22, 62, 80, 8 - RTEXT "Nicht verfügbar", IDC_DETAILSTYPE, 122, 20, 80, 8 - RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8 - RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8 - RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8 + RTEXT "Nicht verfügbar", IDC_DETAILSTYPE, 100, 20, 80, 8 + RTEXT "000.000.000.000", IDC_DETAILSIP, 100, 34, 80, 8 + RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 100, 48, 80, 8 + RTEXT "", IDC_DETAILSGATEWAY, 100, 62, 80, 8 PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14 END From d35aa9621809528df2928592fa497eef3829ad5e Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 24 Apr 2010 18:12:31 +0000 Subject: [PATCH 189/261] [NETSHELL] - Load all LAN status icons with the same size - Only set the status icon if the icon occurred, don't set NULL icons (properties of LAN adapter window) See issue #3813 for more details. svn path=/trunk/; revision=47006 --- reactos/dll/win32/netshell/lanstatusui.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/netshell/lanstatusui.c b/reactos/dll/win32/netshell/lanstatusui.c index 3691289caac..1292ef1a843 100644 --- a/reactos/dll/win32/netshell/lanstatusui.c +++ b/reactos/dll/win32/netshell/lanstatusui.c @@ -165,8 +165,8 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status != 1) { + hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 1; - hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->Status != 2) { @@ -196,7 +196,7 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) } } - if (hwndDlg) + if (hwndDlg && hIcon) { hOldIcon = (HICON)SendDlgItemMessageW(hwndDlg, IDC_NETSTAT, STM_SETICON, (WPARAM)hIcon, 0); if (hOldIcon) From 740cd5ef909856eaa6d3978ca4d818f37157d112 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 24 Apr 2010 22:37:45 +0000 Subject: [PATCH 190/261] [IP] - Don't try to close the connection again if it has already been terminated by the remote peer svn path=/trunk/; revision=47007 --- reactos/lib/drivers/ip/transport/tcp/tcp.c | 26 ++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index ae02e4a2d05..187c9a56cc7 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -735,16 +735,24 @@ NTSTATUS TCPClose Socket = Connection->SocketContext; Connection->SocketContext = NULL; - /* We need to close here otherwise oskit will never indicate - * SEL_FIN and we will never fully close the connection - */ - Status = TCPTranslateError( OskitTCPClose( Socket ) ); - - if (!NT_SUCCESS(Status)) + /* Don't try to close again if the other side closed us already */ + if (Connection->SignalState != SEL_FIN) { - Connection->SocketContext = Socket; - UnlockObject(Connection, OldIrql); - return Status; + /* We need to close here otherwise oskit will never indicate + * SEL_FIN and we will never fully close the connection */ + Status = TCPTranslateError( OskitTCPClose( Socket ) ); + + if (!NT_SUCCESS(Status)) + { + Connection->SocketContext = Socket; + UnlockObject(Connection, OldIrql); + return Status; + } + } + else + { + /* We are already closed by the other end so return success */ + Status = STATUS_SUCCESS; } if (Connection->AddressFile) From 8ba6c78a50195a63aaa4b8a35baec13c5d19b32c Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 25 Apr 2010 10:45:06 +0000 Subject: [PATCH 191/261] [NETCFGX] - Improve the DNS data exchange between the basic IP settings and the advanced DNS panel - Simplify LaunchAdvancedTcpipSettings svn path=/trunk/; revision=47009 --- reactos/dll/win32/netcfgx/tcpipconf_notify.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/netcfgx/tcpipconf_notify.c b/reactos/dll/win32/netcfgx/tcpipconf_notify.c index 91c57ec1a2e..e582da43f96 100644 --- a/reactos/dll/win32/netcfgx/tcpipconf_notify.c +++ b/reactos/dll/win32/netcfgx/tcpipconf_notify.c @@ -1762,6 +1762,7 @@ StoreDNSSettings( pLast = pCur; pCur = pCur->Next; } + This->pCurrentConfig->AutoconfigActive = FALSE; } INT_PTR @@ -2046,7 +2047,6 @@ TcpipAdvancedDnsDlg( VOID LaunchAdvancedTcpipSettings( - HWND hDlg, HWND hwndDlg, TcpipConfNotifyImpl * This) { @@ -2069,14 +2069,14 @@ LaunchAdvancedTcpipSettings( pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; pinfo.u3.phpage = hppages; pinfo.nPages = 3; - pinfo.hwndParent = hDlg; + pinfo.hwndParent = hwndDlg; pinfo.pszCaption = szBuffer; StoreTcpipBasicSettings(hwndDlg, This, FALSE); PropertySheetW(&pinfo); InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig); - PropSheet_Changed(hDlg, hwndDlg); + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); } INT_PTR @@ -2328,6 +2328,8 @@ InitializeTcpipBasicDlgCtrls( else { SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0); + EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE); if (pCurSettings->Ns) { SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->IpAddress); @@ -2521,7 +2523,7 @@ TcpipBasicDlg( } break; case IDC_ADVANCED: - LaunchAdvancedTcpipSettings(GetParent(hwndDlg), hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER)); + LaunchAdvancedTcpipSettings(hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER)); break; } break; From b8998128ea920d321c78a447601184d918923623 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 25 Apr 2010 10:47:10 +0000 Subject: [PATCH 192/261] [NETCFGX] - Save DHCP and DNS settings from the basic TCP/IP panel independently of each other See issue #5193 for more details. svn path=/trunk/; revision=47010 --- reactos/dll/win32/netcfgx/tcpipconf_notify.c | 34 +++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/reactos/dll/win32/netcfgx/tcpipconf_notify.c b/reactos/dll/win32/netcfgx/tcpipconf_notify.c index e582da43f96..14b9a4ab2f4 100644 --- a/reactos/dll/win32/netcfgx/tcpipconf_notify.c +++ b/reactos/dll/win32/netcfgx/tcpipconf_notify.c @@ -3280,23 +3280,25 @@ INetCfgComponentControl_fnApplyRegistryChanges( RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", sizeof(WCHAR) * 2); } - - if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive) - { - RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); - } - else - { - pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE); - if(pStr) - { - RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize); - RegDeleteValueW(hKey, L"DhcpNameServer"); - CoTaskMemFree(pStr); - } - } - RegCloseKey(hKey); } + + if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive) + { + RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); + } + else + { + pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE); + if(pStr) + { + + RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize); + RegDeleteValueW(hKey, L"DhcpNameServer"); + CoTaskMemFree(pStr); + } + } + + RegCloseKey(hKey); } return S_OK; } From 49496ddec65489aaf0bc692533892f5aaa5e131b Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 25 Apr 2010 12:13:01 +0000 Subject: [PATCH 193/261] [SYSSETUP] - Create a modeless syssetup dialog so we can explicitly ignore intermediate WM_CLOSE messages (modal property sheets handle them automatically) See issue #4960 for more details. svn path=/trunk/; revision=47011 --- reactos/dll/win32/syssetup/wizard.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/syssetup/wizard.c b/reactos/dll/win32/syssetup/wizard.c index 7a084f56c26..63d6bc2ed88 100644 --- a/reactos/dll/win32/syssetup/wizard.c +++ b/reactos/dll/win32/syssetup/wizard.c @@ -1960,6 +1960,7 @@ FinishDlgProc(HWND hwndDlg, case WM_DESTROY: { SetupIsActive(0); + PostQuitMessage(0); return TRUE; } @@ -1999,7 +2000,7 @@ FinishDlgProc(HWND hwndDlg, break; case PSN_WIZFINISH: - /* Handle a Finish button click, if necessary */ + DestroyWindow(GetParent(hwndDlg)); break; default: @@ -2269,6 +2270,8 @@ InstallWizard(VOID) HPROPSHEETPAGE ahpsp[8]; PROPSHEETPAGE psp = {0}; UINT nPages = 0; + HWND hWnd; + MSG msg; /* Clear setup data */ ZeroMemory(&SetupData, sizeof(SETUPDATA)); @@ -2345,7 +2348,7 @@ InstallWizard(VOID) /* Create the property sheet */ psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER; + psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER | PSH_MODELESS; psh.hInstance = hDllInstance; psh.hwndParent = NULL; psh.nPages = nPages; @@ -2358,7 +2361,17 @@ InstallWizard(VOID) SetupData.hTitleFont = CreateTitleFont(); /* Display the wizard */ - PropertySheet(&psh); + hWnd = (HWND)PropertySheet(&psh); + ShowWindow(hWnd, SW_SHOW); + + while (GetMessage(&msg, NULL, 0, 0)) + { + if(!IsDialogMessage(hWnd, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } DeleteObject(SetupData.hTitleFont); } From 0225b59c2d856b63ddb95401a437d9788a35bd66 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 25 Apr 2010 15:58:34 +0000 Subject: [PATCH 194/261] [NEWINFLIB] Add a UNICODE-aware version of the inflib library. It is not used by other components yet but usetup and mkhive will use it in the future. ATTENTION: This commit might break the build bot because I could not test a build on a Linux system. svn path=/trunk/; revision=47016 --- reactos/lib/lib.rbuild | 3 + reactos/lib/newinflib/README.txt | 16 + reactos/lib/newinflib/builddep.h | 98 ++++ reactos/lib/newinflib/infcommon.h | 16 + reactos/lib/newinflib/infcore.c | 831 ++++++++++++++++++++++++++++ reactos/lib/newinflib/infget.c | 668 ++++++++++++++++++++++ reactos/lib/newinflib/infhost.h | 86 +++ reactos/lib/newinflib/infhostgen.c | 316 +++++++++++ reactos/lib/newinflib/infhostget.c | 249 +++++++++ reactos/lib/newinflib/infhostput.c | 115 ++++ reactos/lib/newinflib/infhostrtl.c | 151 +++++ reactos/lib/newinflib/inflib.h | 15 + reactos/lib/newinflib/inflib.mak | 76 +++ reactos/lib/newinflib/inflib.rbuild | 31 ++ reactos/lib/newinflib/infpriv.h | 145 +++++ reactos/lib/newinflib/infput.c | 264 +++++++++ reactos/lib/newinflib/infros.h | 81 +++ reactos/lib/newinflib/infrosgen.c | 370 +++++++++++++ reactos/lib/newinflib/infrosget.c | 140 +++++ reactos/lib/newinflib/infrosput.c | 132 +++++ 20 files changed, 3803 insertions(+) create mode 100644 reactos/lib/newinflib/README.txt create mode 100644 reactos/lib/newinflib/builddep.h create mode 100644 reactos/lib/newinflib/infcommon.h create mode 100644 reactos/lib/newinflib/infcore.c create mode 100644 reactos/lib/newinflib/infget.c create mode 100644 reactos/lib/newinflib/infhost.h create mode 100644 reactos/lib/newinflib/infhostgen.c create mode 100644 reactos/lib/newinflib/infhostget.c create mode 100644 reactos/lib/newinflib/infhostput.c create mode 100644 reactos/lib/newinflib/infhostrtl.c create mode 100644 reactos/lib/newinflib/inflib.h create mode 100644 reactos/lib/newinflib/inflib.mak create mode 100644 reactos/lib/newinflib/inflib.rbuild create mode 100644 reactos/lib/newinflib/infpriv.h create mode 100644 reactos/lib/newinflib/infput.c create mode 100644 reactos/lib/newinflib/infros.h create mode 100644 reactos/lib/newinflib/infrosgen.c create mode 100644 reactos/lib/newinflib/infrosget.c create mode 100644 reactos/lib/newinflib/infrosput.c diff --git a/reactos/lib/lib.rbuild b/reactos/lib/lib.rbuild index 42e49d6ab2f..fe9cf995715 100644 --- a/reactos/lib/lib.rbuild +++ b/reactos/lib/lib.rbuild @@ -37,6 +37,9 @@ + + + diff --git a/reactos/lib/newinflib/README.txt b/reactos/lib/newinflib/README.txt new file mode 100644 index 00000000000..5e27e2b0d5e --- /dev/null +++ b/reactos/lib/newinflib/README.txt @@ -0,0 +1,16 @@ +Routines to handle .inf files. + +This is the UNICODE-enabled version of inflib. It will be used by usetup and mkhive. + +This library is used to share .inf handling code between build tools and +ReactOS code. Two versions are built, "inflib_host" (for use by build tools) +and "inflib" (for use by ReactOS code). Both depend on the same core source, +with a wrapper for the appropriate interface. +Most of the differences between the host and the ReactOS environment are +abstracted away in builddep.h. Of particular note is that the host version +uses Ansi characters while the ReactOS version uses Unicode. So, the core +source uses TCHARs. builddep.h depends on a preprocessor variable INFLIB_HOST +which is defined when building the host version (inflib.mak) but not defined +when building the ReactOS version (inflib.xml). +The wrappers have "host" or "ros" in their filename. The library interface is +"infhost.h" for the host version, "infros.h" for the ReactOS version. diff --git a/reactos/lib/newinflib/builddep.h b/reactos/lib/newinflib/builddep.h new file mode 100644 index 00000000000..c768a2ca88b --- /dev/null +++ b/reactos/lib/newinflib/builddep.h @@ -0,0 +1,98 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +#ifdef INFLIB_HOST + +/* Definitions native to the host on which we're building */ + +#include + +#include +#include +#include +#include + +#define FREE(Area) free(Area) +#define MALLOC(Size) malloc((size_t)(Size)) +#define ZEROMEMORY(Area, Size) memset((Area), '\0', (size_t)(Size)) +#define MEMCPY(Dest, Src, Size) memcpy((Dest), (Src), (size_t)(Size)) + +#define STATUS_SUCCESS 0 +#define INF_STATUS_SUCCESS 0 +#define INF_STATUS_NO_MEMORY ENOMEM +#define INF_STATUS_INVALID_PARAMETER EINVAL +#define INF_STATUS_NOT_FOUND ENOENT +#define INF_STATUS_BUFFER_OVERFLOW E2BIG +#define INF_SUCCESS(x) (0 == (x)) + +typedef char TCHAR, *PTCHAR, *PTSTR; +typedef const TCHAR *PCTSTR; +typedef WORD LCID; + +#define _T(x) x +#define _tcsicmp strcasecmp +#define _tcslen strlen +#define _tcscpy strcpy +#define _tcstoul strtoul +#define _tcstol strtol +#define STRFMT "%s" + +#ifdef _MSC_VER +#define strcasecmp _stricmp +#endif + +#define IS_TEXT_UNICODE_ASCII16 1 +#define IS_TEXT_UNICODE_REVERSE_ASCII16 16 +#define IS_TEXT_UNICODE_STATISTICS 2 +#define IS_TEXT_UNICODE_REVERSE_STATISTICS 32 +#define IS_TEXT_UNICODE_CONTROLS 4 +#define IS_TEXT_UNICODE_REVERSE_CONTROLS 64 +#define IS_TEXT_UNICODE_SIGNATURE 8 +#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 128 +#define IS_TEXT_UNICODE_ILLEGAL_CHARS 256 +#define IS_TEXT_UNICODE_ODD_LENGTH 512 +#define IS_TEXT_UNICODE_NULL_BYTES 4096 +#define IS_TEXT_UNICODE_UNICODE_MASK 15 +#define IS_TEXT_UNICODE_REVERSE_MASK 240 +#define IS_TEXT_UNICODE_NOT_UNICODE_MASK 3840 +#define IS_TEXT_UNICODE_NOT_ASCII_MASK 61440 + +#define SUBLANG_NEUTRAL 0 +#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff) +#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD)(p)) + + +#else /* ! defined(INFLIB_HOST) */ + +/* ReactOS definitions */ + +#define UNICODE +#define _UNICODE +#define WIN32_NO_STATUS +#include +#define NTOS_MODE_USER +#include +#include + +extern PVOID InfpHeap; + +#define FREE(Area) RtlFreeHeap(InfpHeap, 0, (Area)) +#define MALLOC(Size) RtlAllocateHeap(InfpHeap, 0, (Size)) +#define ZEROMEMORY(Area, Size) RtlZeroMemory((Area), (Size)) +#define MEMCPY(Dest, Src, Size) RtlCopyMemory((Dest), (Src), (Size)) + +#define INF_STATUS_SUCCESS STATUS_SUCCESS +#define INF_STATUS_NO_MEMORY STATUS_NO_MEMORY +#define INF_STATUS_INVALID_PARAMETER STATUS_INVALID_PARAMETER +#define INF_STATUS_NOT_FOUND STATUS_NOT_FOUND +#define INF_STATUS_BUFFER_OVERFLOW STATUS_BUFFER_OVERFLOW +#define INF_SUCCESS(x) (0 <= (x)) + +#define STRFMT "%S" + +#endif /* INFLIB_HOST */ + +/* EOF */ diff --git a/reactos/lib/newinflib/infcommon.h b/reactos/lib/newinflib/infcommon.h new file mode 100644 index 00000000000..a80f2029078 --- /dev/null +++ b/reactos/lib/newinflib/infcommon.h @@ -0,0 +1,16 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +#pragma once + +#define MAX_INF_STRING_LENGTH 512 + +typedef void *HINF, **PHINF; +typedef struct _INFCONTEXT *PINFCONTEXT; + +/* EOF */ diff --git a/reactos/lib/newinflib/infcore.c b/reactos/lib/newinflib/infcore.c new file mode 100644 index 00000000000..3582ec56787 --- /dev/null +++ b/reactos/lib/newinflib/infcore.c @@ -0,0 +1,831 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" + +#define NDEBUG +#include + +#define CONTROL_Z '\x1a' +#define MAX_SECTION_NAME_LEN 255 +#define MAX_FIELD_LEN 511 /* larger fields get silently truncated */ +/* actual string limit is MAX_INF_STRING_LENGTH+1 (plus terminating null) under Windows */ +#define MAX_STRING_LEN (MAX_INF_STRING_LENGTH+1) + + +/* parser definitions */ + +enum parser_state +{ + LINE_START, /* at beginning of a line */ + SECTION_NAME, /* parsing a section name */ + KEY_NAME, /* parsing a key name */ + VALUE_NAME, /* parsing a value name */ + EOL_BACKSLASH, /* backslash at end of line */ + QUOTES, /* inside quotes */ + LEADING_SPACES, /* leading spaces */ + TRAILING_SPACES, /* trailing spaces */ + COMMENT, /* inside a comment */ + NB_PARSER_STATES +}; + +struct parser +{ + const WCHAR *start; /* start position of item being parsed */ + const WCHAR *end; /* end of buffer */ + PINFCACHE file; /* file being built */ + enum parser_state state; /* current parser state */ + enum parser_state stack[4]; /* state stack */ + int stack_pos; /* current pos in stack */ + + PINFCACHESECTION cur_section; /* pointer to the section being parsed*/ + PINFCACHELINE line; /* current line */ + unsigned int line_pos; /* current line position in file */ + INFSTATUS error; /* error code */ + unsigned int token_len; /* current token len */ + WCHAR token[MAX_FIELD_LEN+1]; /* current token */ +}; + +typedef const WCHAR * (*parser_state_func)( struct parser *parser, const WCHAR *pos ); + +/* parser state machine functions */ +static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *section_name_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *comment_state( struct parser *parser, const WCHAR *pos ); + +static const parser_state_func parser_funcs[NB_PARSER_STATES] = +{ + line_start_state, /* LINE_START */ + section_name_state, /* SECTION_NAME */ + key_name_state, /* KEY_NAME */ + value_name_state, /* VALUE_NAME */ + eol_backslash_state, /* EOL_BACKSLASH */ + quotes_state, /* QUOTES */ + leading_spaces_state, /* LEADING_SPACES */ + trailing_spaces_state, /* TRAILING_SPACES */ + comment_state /* COMMENT */ +}; + + +/* PRIVATE FUNCTIONS ********************************************************/ + +static PINFCACHELINE +InfpFreeLine (PINFCACHELINE Line) +{ + PINFCACHELINE Next; + PINFCACHEFIELD Field; + + if (Line == NULL) + { + return NULL; + } + + Next = Line->Next; + if (Line->Key != NULL) + { + FREE (Line->Key); + Line->Key = NULL; + } + + /* Remove data fields */ + while (Line->FirstField != NULL) + { + Field = Line->FirstField->Next; + FREE (Line->FirstField); + Line->FirstField = Field; + } + Line->LastField = NULL; + + FREE (Line); + + return Next; +} + + +PINFCACHESECTION +InfpFreeSection (PINFCACHESECTION Section) +{ + PINFCACHESECTION Next; + + if (Section == NULL) + { + return NULL; + } + + /* Release all keys */ + Next = Section->Next; + while (Section->FirstLine != NULL) + { + Section->FirstLine = InfpFreeLine (Section->FirstLine); + } + Section->LastLine = NULL; + + FREE (Section); + + return Next; +} + + +PINFCACHESECTION +InfpFindSection(PINFCACHE Cache, + PCWSTR Name) +{ + PINFCACHESECTION Section = NULL; + + if (Cache == NULL || Name == NULL) + { + return NULL; + } + + /* iterate through list of sections */ + Section = Cache->FirstSection; + while (Section != NULL) + { + if (_wcsicmp (Section->Name, Name) == 0) + { + return Section; + } + + /* get the next section*/ + Section = Section->Next; + } + + return NULL; +} + + +PINFCACHESECTION +InfpAddSection(PINFCACHE Cache, + PCWSTR Name) +{ + PINFCACHESECTION Section = NULL; + ULONG Size; + + if (Cache == NULL || Name == NULL) + { + DPRINT("Invalid parameter\n"); + return NULL; + } + + /* Allocate and initialize the new section */ + Size = (ULONG)FIELD_OFFSET(INFCACHESECTION, + Name[wcslen (Name) + 1]); + Section = (PINFCACHESECTION)MALLOC(Size); + if (Section == NULL) + { + DPRINT("MALLOC() failed\n"); + return NULL; + } + ZEROMEMORY (Section, + Size); + + /* Copy section name */ + wcscpy (Section->Name, Name); + + /* Append section */ + if (Cache->FirstSection == NULL) + { + Cache->FirstSection = Section; + Cache->LastSection = Section; + } + else + { + Cache->LastSection->Next = Section; + Section->Prev = Cache->LastSection; + Cache->LastSection = Section; + } + + return Section; +} + + +PINFCACHELINE +InfpAddLine(PINFCACHESECTION Section) +{ + PINFCACHELINE Line; + + if (Section == NULL) + { + DPRINT("Invalid parameter\n"); + return NULL; + } + + Line = (PINFCACHELINE)MALLOC(sizeof(INFCACHELINE)); + if (Line == NULL) + { + DPRINT("MALLOC() failed\n"); + return NULL; + } + ZEROMEMORY(Line, + sizeof(INFCACHELINE)); + + /* Append line */ + if (Section->FirstLine == NULL) + { + Section->FirstLine = Line; + Section->LastLine = Line; + } + else + { + Section->LastLine->Next = Line; + Line->Prev = Section->LastLine; + Section->LastLine = Line; + } + Section->LineCount++; + + return Line; +} + + +PVOID +InfpAddKeyToLine(PINFCACHELINE Line, + PCWSTR Key) +{ + if (Line == NULL) + { + DPRINT1("Invalid Line\n"); + return NULL; + } + + if (Line->Key != NULL) + { + DPRINT1("Line already has a key\n"); + return NULL; + } + + Line->Key = (PWCHAR)MALLOC((wcslen(Key) + 1) * sizeof(WCHAR)); + if (Line->Key == NULL) + { + DPRINT1("MALLOC() failed\n"); + return NULL; + } + + wcscpy(Line->Key, Key); + + return (PVOID)Line->Key; +} + + +PVOID +InfpAddFieldToLine(PINFCACHELINE Line, + PCWSTR Data) +{ + PINFCACHEFIELD Field; + ULONG Size; + + Size = (ULONG)FIELD_OFFSET(INFCACHEFIELD, + Data[wcslen(Data) + 1]); + Field = (PINFCACHEFIELD)MALLOC(Size); + if (Field == NULL) + { + DPRINT1("MALLOC() failed\n"); + return NULL; + } + ZEROMEMORY (Field, + Size); + wcscpy (Field->Data, Data); + + /* Append key */ + if (Line->FirstField == NULL) + { + Line->FirstField = Field; + Line->LastField = Field; + } + else + { + Line->LastField->Next = Field; + Field->Prev = Line->LastField; + Line->LastField = Field; + } + Line->FieldCount++; + + return (PVOID)Field; +} + + +PINFCACHELINE +InfpFindKeyLine(PINFCACHESECTION Section, + PCWSTR Key) +{ + PINFCACHELINE Line; + + Line = Section->FirstLine; + while (Line != NULL) + { + if (Line->Key != NULL && _wcsicmp (Line->Key, Key) == 0) + { + return Line; + } + + Line = Line->Next; + } + + return NULL; +} + + +/* push the current state on the parser stack */ +__inline static void push_state( struct parser *parser, enum parser_state state ) +{ +// assert( parser->stack_pos < sizeof(parser->stack)/sizeof(parser->stack[0]) ); + parser->stack[parser->stack_pos++] = state; +} + + +/* pop the current state */ +__inline static void pop_state( struct parser *parser ) +{ +// assert( parser->stack_pos ); + parser->state = parser->stack[--parser->stack_pos]; +} + + +/* set the parser state and return the previous one */ +__inline static enum parser_state set_state( struct parser *parser, enum parser_state state ) +{ + enum parser_state ret = parser->state; + parser->state = state; + return ret; +} + + +/* check if the pointer points to an end of file */ +__inline static int is_eof( struct parser *parser, const WCHAR *ptr ) +{ + return (ptr >= parser->end || *ptr == CONTROL_Z); +} + + +/* check if the pointer points to an end of line */ +__inline static int is_eol( struct parser *parser, const WCHAR *ptr ) +{ + return (ptr >= parser->end || + *ptr == CONTROL_Z || + *ptr == '\n' || + (*ptr == '\r' && *(ptr + 1) == '\n')); +} + + +/* push data from current token start up to pos into the current token */ +static int push_token( struct parser *parser, const WCHAR *pos ) +{ + UINT len = (UINT)(pos - parser->start); + const WCHAR *src = parser->start; + WCHAR *dst = parser->token + parser->token_len; + + if (len > MAX_FIELD_LEN - parser->token_len) + len = MAX_FIELD_LEN - parser->token_len; + + parser->token_len += len; + for ( ; len > 0; len--, dst++, src++) + { + if (*src) + { + *dst = *src; + } + else + { + *dst = ' '; + } + } + + *dst = 0; + parser->start = pos; + + return 0; +} + + + +/* add a section with the current token as name */ +static PVOID add_section_from_token( struct parser *parser ) +{ + PINFCACHESECTION Section; + + if (parser->token_len > MAX_SECTION_NAME_LEN) + { + parser->error = INF_STATUS_SECTION_NAME_TOO_LONG; + return NULL; + } + + Section = InfpFindSection(parser->file, + parser->token); + if (Section == NULL) + { + /* need to create a new one */ + Section= InfpAddSection(parser->file, + parser->token); + if (Section == NULL) + { + parser->error = INF_STATUS_NOT_ENOUGH_MEMORY; + return NULL; + } + } + + parser->token_len = 0; + parser->cur_section = Section; + + return (PVOID)Section; +} + + +/* add a field containing the current token to the current line */ +static struct field *add_field_from_token( struct parser *parser, int is_key ) +{ + PVOID field; + + if (!parser->line) /* need to start a new line */ + { + if (parser->cur_section == NULL) /* got a line before the first section */ + { + parser->error = INF_STATUS_WRONG_INF_STYLE; + return NULL; + } + + parser->line = InfpAddLine(parser->cur_section); + if (parser->line == NULL) + goto error; + } + else + { +// assert(!is_key); + } + + if (is_key) + { + field = InfpAddKeyToLine(parser->line, parser->token); + } + else + { + field = InfpAddFieldToLine(parser->line, parser->token); + } + + if (field != NULL) + { + parser->token_len = 0; + return field; + } + +error: + parser->error = INF_STATUS_NOT_ENOUGH_MEMORY; + return NULL; +} + + +/* close the current line and prepare for parsing a new one */ +static void close_current_line( struct parser *parser ) +{ + parser->line = NULL; +} + + + +/* handler for parser LINE_START state */ +static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eof( parser, p ); p++) + { + switch(*p) + { + case '\r': + continue; + + case '\n': + parser->line_pos++; + close_current_line( parser ); + break; + + case ';': + push_state( parser, LINE_START ); + set_state( parser, COMMENT ); + return p + 1; + + case '[': + parser->start = p + 1; + set_state( parser, SECTION_NAME ); + return p + 1; + + default: + if (!iswspace(*p)) + { + parser->start = p; + set_state( parser, KEY_NAME ); + return p; + } + break; + } + } + close_current_line( parser ); + return NULL; +} + + +/* handler for parser SECTION_NAME state */ +static const WCHAR *section_name_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == ']') + { + push_token( parser, p ); + if (add_section_from_token( parser ) == NULL) + return NULL; + push_state( parser, LINE_START ); + set_state( parser, COMMENT ); /* ignore everything else on the line */ + return p + 1; + } + } + parser->error = INF_STATUS_BAD_SECTION_NAME_LINE; /* unfinished section name */ + return NULL; +} + + +/* handler for parser KEY_NAME state */ +static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p, *token_end = parser->start; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == ',') break; + switch(*p) + { + + case '=': + push_token( parser, token_end ); + if (!add_field_from_token( parser, 1 )) return NULL; + parser->start = p + 1; + push_state( parser, VALUE_NAME ); + set_state( parser, LEADING_SPACES ); + return p + 1; + case ';': + push_token( parser, token_end ); + if (!add_field_from_token( parser, 0 )) return NULL; + push_state( parser, LINE_START ); + set_state( parser, COMMENT ); + return p + 1; + case '"': + push_token( parser, token_end ); + parser->start = p + 1; + push_state( parser, KEY_NAME ); + set_state( parser, QUOTES ); + return p + 1; + case '\\': + push_token( parser, token_end ); + parser->start = p; + push_state( parser, KEY_NAME ); + set_state( parser, EOL_BACKSLASH ); + return p; + default: + if (!iswspace(*p)) token_end = p + 1; + else + { + push_token( parser, p ); + push_state( parser, KEY_NAME ); + set_state( parser, TRAILING_SPACES ); + return p; + } + break; + } + } + push_token( parser, token_end ); + set_state( parser, VALUE_NAME ); + return p; +} + + +/* handler for parser VALUE_NAME state */ +static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p, *token_end = parser->start; + + for (p = pos; !is_eol( parser, p ); p++) + { + switch(*p) + { + case ';': + push_token( parser, token_end ); + if (!add_field_from_token( parser, 0 )) return NULL; + push_state( parser, LINE_START ); + set_state( parser, COMMENT ); + return p + 1; + case ',': + push_token( parser, token_end ); + if (!add_field_from_token( parser, 0 )) return NULL; + parser->start = p + 1; + push_state( parser, VALUE_NAME ); + set_state( parser, LEADING_SPACES ); + return p + 1; + case '"': + push_token( parser, token_end ); + parser->start = p + 1; + push_state( parser, VALUE_NAME ); + set_state( parser, QUOTES ); + return p + 1; + case '\\': + push_token( parser, token_end ); + parser->start = p; + push_state( parser, VALUE_NAME ); + set_state( parser, EOL_BACKSLASH ); + return p; + default: + if (!isspace(*p)) token_end = p + 1; + else + { + push_token( parser, p ); + push_state( parser, VALUE_NAME ); + set_state( parser, TRAILING_SPACES ); + return p; + } + break; + } + } + push_token( parser, token_end ); + if (!add_field_from_token( parser, 0 )) return NULL; + set_state( parser, LINE_START ); + return p; +} + + +/* handler for parser EOL_BACKSLASH state */ +static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eof( parser, p ); p++) + { + switch(*p) + { + case '\r': + continue; + + case '\n': + parser->line_pos++; + parser->start = p + 1; + set_state( parser, LEADING_SPACES ); + return p + 1; + + case '\\': + continue; + + case ';': + push_state( parser, EOL_BACKSLASH ); + set_state( parser, COMMENT ); + return p + 1; + + default: + if (iswspace(*p)) + continue; + push_token( parser, p ); + pop_state( parser ); + return p; + } + } + parser->start = p; + pop_state( parser ); + + return p; +} + + +/* handler for parser QUOTES state */ +static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p, *token_end = parser->start; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == '"') + { + if (p+1 < parser->end && p[1] == '"') /* double quotes */ + { + push_token( parser, p + 1 ); + parser->start = token_end = p + 2; + p++; + } + else /* end of quotes */ + { + push_token( parser, p ); + parser->start = p + 1; + pop_state( parser ); + return p + 1; + } + } + } + push_token( parser, p ); + pop_state( parser ); + return p; +} + + +/* handler for parser LEADING_SPACES state */ +static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == '\\') + { + parser->start = p; + set_state( parser, EOL_BACKSLASH ); + return p; + } + if (!iswspace(*p)) + break; + } + parser->start = p; + pop_state( parser ); + return p; +} + + +/* handler for parser TRAILING_SPACES state */ +static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == '\\') + { + set_state( parser, EOL_BACKSLASH ); + return p; + } + if (!iswspace(*p)) + break; + } + pop_state( parser ); + return p; +} + + +/* handler for parser COMMENT state */ +static const WCHAR *comment_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p = pos; + + while (!is_eol( parser, p )) + p++; + pop_state( parser ); + return p; +} + + +/* parse a complete buffer */ +INFSTATUS +InfpParseBuffer (PINFCACHE file, + const WCHAR *buffer, + const WCHAR *end, + PULONG error_line) +{ + struct parser parser; + const WCHAR *pos = buffer; + + parser.start = buffer; + parser.end = end; + parser.file = file; + parser.line = NULL; + parser.state = LINE_START; + parser.stack_pos = 0; + parser.cur_section = NULL; + parser.line_pos = 1; + parser.error = 0; + parser.token_len = 0; + + /* parser main loop */ + while (pos) + pos = (parser_funcs[parser.state])(&parser, pos); + + if (parser.error) + { + if (error_line) + *error_line = parser.line_pos; + return parser.error; + } + + /* find the [strings] section */ + file->StringsSection = InfpFindSection(file, + L"Strings"); + + return INF_STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infget.c b/reactos/lib/newinflib/infget.c new file mode 100644 index 00000000000..1cdbebf2ee5 --- /dev/null +++ b/reactos/lib/newinflib/infget.c @@ -0,0 +1,668 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" + +#define NDEBUG +#include + +static unsigned int +InfpSubstituteString(PINFCACHE Inf, + const WCHAR *text, + WCHAR *buffer, + unsigned int size); + +/* retrieve the string substitution for a given string, or NULL if not found */ +/* if found, len is set to the substitution length */ +static PCWSTR +InfpGetSubstitutionString(PINFCACHE Inf, + PCWSTR str, + unsigned int *len, + BOOL no_trailing_slash) +{ + static const WCHAR percent = '%'; + + INFSTATUS Status = INF_STATUS_NOT_FOUND; + PINFCONTEXT Context = NULL; + PWCHAR Data = NULL; + WCHAR ValueName[MAX_INF_STRING_LENGTH +1]; + WCHAR StringLangId[13]; + + if (!*len) /* empty string (%%) is replaced by single percent */ + { + *len = 1; + return &percent; + } + + wcsncpy(ValueName, str, *len); + ValueName[*len] = 0; + + DPRINT("Value name: %S\n", ValueName); + + if (Inf->LocaleId != 0) + { + swprintf(StringLangId, + L"Strings.%04hx", + Inf->LocaleId); + + Status = InfpFindFirstLine(Inf, + StringLangId, + ValueName, + &Context); + if (Status != INF_STATUS_SUCCESS) + { + swprintf(StringLangId, + L"Strings.%04hx", + MAKELANGID(PRIMARYLANGID(Inf->LocaleId), SUBLANG_NEUTRAL)); + + Status = InfpFindFirstLine(Inf, + StringLangId, + ValueName, + &Context); + if (Status != INF_STATUS_SUCCESS) + { + Status = InfpFindFirstLine(Inf, + L"Strings", + ValueName, + &Context); + } + } + } + else + { + Status = InfpFindFirstLine(Inf, + L"Strings", + ValueName, + &Context); + } + + if (Status != INF_STATUS_SUCCESS || Context == NULL) + return NULL; + + Status = InfpGetData(Context, + NULL, + &Data); + + InfpFreeContext(Context); + + if (Status == STATUS_SUCCESS) + { + *len = wcslen(Data); + DPRINT("Substitute: %S Length: %ul\n", Data, *len); + return Data; + } + + return NULL; +} + + +/* do string substitutions on the specified text */ +/* the buffer is assumed to be large enough */ +/* returns necessary length not including terminating null */ +static unsigned int +InfpSubstituteString(PINFCACHE Inf, + PCWSTR text, + PWSTR buffer, + unsigned int size) +{ + const WCHAR *start, *subst, *p; + unsigned int len, total = 0; + int inside = 0; + + if (!buffer) size = MAX_INF_STRING_LENGTH + 1; + for (p = start = text; *p; p++) + { + if (*p != '%') continue; + inside = !inside; + if (inside) /* start of a %xx% string */ + { + len = (unsigned int)(p - start); + if (len > size - 1) len = size - 1; + if (buffer) memcpy( buffer + total, start, len * sizeof(WCHAR) ); + total += len; + size -= len; + start = p; + } + else /* end of the %xx% string, find substitution */ + { + len = (unsigned int)(p - start - 1); + subst = InfpGetSubstitutionString( Inf, start + 1, &len, p[1] == '\\' ); + if (!subst) + { + subst = start; + len = (unsigned int)(p - start + 1); + } + if (len > size - 1) len = size - 1; + if (buffer) memcpy( buffer + total, subst, len * sizeof(WCHAR) ); + total += len; + size -= len; + start = p + 1; + } + } + + if (start != p) /* unfinished string, copy it */ + { + len = (unsigned int)(p - start); + if (len > size - 1) len = size - 1; + if (buffer) memcpy( buffer + total, start, len * sizeof(WCHAR) ); + total += len; + } + if (buffer && size) buffer[total] = 0; + return total; +} + + +INFSTATUS +InfpFindFirstLine(PINFCACHE Cache, + PCWSTR Section, + PCWSTR Key, + PINFCONTEXT *Context) +{ + PINFCACHESECTION CacheSection; + PINFCACHELINE CacheLine; + + if (Cache == NULL || Section == NULL || Context == NULL) + { + DPRINT1("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + CacheSection = InfpFindSection(Cache, Section); + if (NULL == CacheSection) + { + DPRINT("Section not found\n"); + return INF_STATUS_NOT_FOUND; + } + + if (Key != NULL) + { + CacheLine = InfpFindKeyLine(CacheSection, Key); + } + else + { + CacheLine = CacheSection->FirstLine; + } + + if (NULL == CacheLine) + { + DPRINT("Key not found\n"); + return INF_STATUS_NOT_FOUND; + } + + *Context = MALLOC(sizeof(INFCONTEXT)); + if (NULL == *Context) + { + DPRINT1("MALLOC() failed\n"); + return INF_STATUS_NO_MEMORY; + } + (*Context)->Inf = (PVOID)Cache; + (*Context)->Section = (PVOID)CacheSection; + (*Context)->Line = (PVOID)CacheLine; + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut) +{ + PINFCACHELINE CacheLine; + + if (ContextIn == NULL || ContextOut == NULL) + return INF_STATUS_INVALID_PARAMETER; + + if (ContextIn->Line == NULL) + return INF_STATUS_INVALID_PARAMETER; + + CacheLine = (PINFCACHELINE)ContextIn->Line; + if (CacheLine->Next == NULL) + return INF_STATUS_NOT_FOUND; + + if (ContextIn != ContextOut) + { + ContextOut->Inf = ContextIn->Inf; + ContextOut->Section = ContextIn->Section; + } + ContextOut->Line = (PVOID)(CacheLine->Next); + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpFindFirstMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut) +{ + PINFCACHELINE CacheLine; + + if (ContextIn == NULL || ContextOut == NULL || Key == NULL || *Key == 0) + return INF_STATUS_INVALID_PARAMETER; + + if (ContextIn->Inf == NULL || ContextIn->Section == NULL) + return INF_STATUS_INVALID_PARAMETER; + + CacheLine = ((PINFCACHESECTION)(ContextIn->Section))->FirstLine; + while (CacheLine != NULL) + { + if (CacheLine->Key != NULL && _wcsicmp (CacheLine->Key, Key) == 0) + { + + if (ContextIn != ContextOut) + { + ContextOut->Inf = ContextIn->Inf; + ContextOut->Section = ContextIn->Section; + } + ContextOut->Line = (PVOID)CacheLine; + + return INF_STATUS_SUCCESS; + } + + CacheLine = CacheLine->Next; + } + + return INF_STATUS_NOT_FOUND; +} + + +INFSTATUS +InfpFindNextMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut) +{ + PINFCACHELINE CacheLine; + + if (ContextIn == NULL || ContextOut == NULL || Key == NULL || *Key == 0) + return INF_STATUS_INVALID_PARAMETER; + + if (ContextIn->Inf == NULL || ContextIn->Section == NULL || ContextIn->Line == NULL) + return INF_STATUS_INVALID_PARAMETER; + + CacheLine = (PINFCACHELINE)ContextIn->Line; + while (CacheLine != NULL) + { + if (CacheLine->Key != NULL && _wcsicmp (CacheLine->Key, Key) == 0) + { + + if (ContextIn != ContextOut) + { + ContextOut->Inf = ContextIn->Inf; + ContextOut->Section = ContextIn->Section; + } + ContextOut->Line = (PVOID)CacheLine; + + return INF_STATUS_SUCCESS; + } + + CacheLine = CacheLine->Next; + } + + return INF_STATUS_NOT_FOUND; +} + + +LONG +InfpGetLineCount(HINF InfHandle, + PCWSTR Section) +{ + PINFCACHE Cache; + PINFCACHESECTION CacheSection; + + if (InfHandle == NULL || Section == NULL) + { + DPRINT("Invalid parameter\n"); + return -1; + } + + Cache = (PINFCACHE)InfHandle; + + /* Iterate through list of sections */ + CacheSection = Cache->FirstSection; + while (CacheSection != NULL) + { + /* Are the section names the same? */ + if (_wcsicmp(CacheSection->Name, Section) == 0) + { + return CacheSection->LineCount; + } + + /* Get the next section */ + CacheSection = CacheSection->Next; + } + + DPRINT("Section not found\n"); + + return -1; +} + + +/* InfpGetLineText */ + + +LONG +InfpGetFieldCount(PINFCONTEXT Context) +{ + if (Context == NULL || Context->Line == NULL) + return 0; + + return ((PINFCACHELINE)Context->Line)->FieldCount; +} + + +INFSTATUS +InfpGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + PUCHAR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + ULONG Index; + ULONG Size; + PUCHAR Ptr; + + if (Context == NULL || Context->Line == NULL || FieldIndex == 0) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (RequiredSize != NULL) + *RequiredSize = 0; + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + return INF_STATUS_NOT_FOUND; + + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + Size = (ULONG)CacheLine->FieldCount - FieldIndex + 1; + + if (RequiredSize != NULL) + *RequiredSize = Size; + + if (ReturnBuffer != NULL) + { + if (ReturnBufferSize < Size) + return INF_STATUS_BUFFER_OVERFLOW; + + /* Copy binary data */ + Ptr = ReturnBuffer; + while (CacheField != NULL) + { + *Ptr = (UCHAR)wcstoul(CacheField->Data, NULL, 16); + + Ptr++; + CacheField = CacheField->Next; + } + } + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + PLONG IntegerValue) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + ULONG Index; + PWCHAR Ptr; + + if (Context == NULL || Context->Line == NULL || IntegerValue == NULL) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (FieldIndex == 0) + { + Ptr = CacheLine->Key; + } + else + { + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + Ptr = CacheField->Data; + } + + *IntegerValue = (LONG)wcstol(Ptr, NULL, 0); + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + PINFCACHEFIELD FieldPtr; + ULONG Index; + ULONG Size; + PWCHAR Ptr; + + if (Context == NULL || Context->Line == NULL || FieldIndex == 0) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (RequiredSize != NULL) + *RequiredSize = 0; + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + return INF_STATUS_INVALID_PARAMETER; + + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + /* Calculate the required buffer size */ + FieldPtr = CacheField; + Size = 0; + while (FieldPtr != NULL) + { + Size += ((ULONG)wcslen (FieldPtr->Data) + 1); + FieldPtr = FieldPtr->Next; + } + Size++; + + if (RequiredSize != NULL) + *RequiredSize = Size; + + if (ReturnBuffer != NULL) + { + if (ReturnBufferSize < Size) + return INF_STATUS_BUFFER_OVERFLOW; + + /* Copy multi-sz string */ + Ptr = ReturnBuffer; + FieldPtr = CacheField; + while (FieldPtr != NULL) + { + Size = (ULONG)wcslen (FieldPtr->Data) + 1; + + wcscpy (Ptr, FieldPtr->Data); + + Ptr = Ptr + Size; + FieldPtr = FieldPtr->Next; + } + *Ptr = 0; + } + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + ULONG Index; + PWCHAR Ptr; + ULONG Size; + + if (Context == NULL || Context->Line == NULL || FieldIndex == 0) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (RequiredSize != NULL) + *RequiredSize = 0; + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + return INF_STATUS_INVALID_PARAMETER; + + if (FieldIndex == 0) + { + Ptr = CacheLine->Key; + } + else + { + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + Ptr = CacheField->Data; + } + +// Size = (ULONG)wcslen (Ptr) + 1; + Size = InfpSubstituteString(Context->Inf, + Ptr, + NULL, + 0); + + if (RequiredSize != NULL) + *RequiredSize = Size + 1; + + if (ReturnBuffer != NULL) + { + if (ReturnBufferSize <= Size) + return INF_STATUS_BUFFER_OVERFLOW; + +// wcscpy (ReturnBuffer, Ptr); + InfpSubstituteString(Context->Inf, + Ptr, + ReturnBuffer, + ReturnBufferSize); + } + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetData(PINFCONTEXT Context, + PWCHAR *Key, + PWCHAR *Data) +{ + PINFCACHELINE CacheKey; + + if (Context == NULL || Context->Line == NULL || Data == NULL) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + CacheKey = (PINFCACHELINE)Context->Line; + if (Key != NULL) + *Key = CacheKey->Key; + + if (Data != NULL) + { + if (CacheKey->FirstField == NULL) + { + *Data = NULL; + } + else + { + *Data = CacheKey->FirstField->Data; + } + } + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + PWCHAR *Data) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + ULONG Index; + + if (Context == NULL || Context->Line == NULL || Data == NULL) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + return INF_STATUS_INVALID_PARAMETER; + + if (FieldIndex == 0) + { + *Data = CacheLine->Key; + } + else + { + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + *Data = CacheField->Data; + } + + return INF_STATUS_SUCCESS; +} + +VOID +InfpFreeContext(PINFCONTEXT Context) +{ + FREE(Context); +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infhost.h b/reactos/lib/newinflib/infhost.h new file mode 100644 index 00000000000..6cdb37cbfa1 --- /dev/null +++ b/reactos/lib/newinflib/infhost.h @@ -0,0 +1,86 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "infcommon.h" + +extern NTSTATUS NTAPI RtlMultiByteToUnicodeN(IN PWCHAR UnicodeString, + IN ULONG UnicodeSize, IN PULONG ResultSize, IN PCSTR MbString, IN ULONG MbSize); + +extern BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); + + +extern int InfHostOpenBufferedFile(PHINF InfHandle, + void *Buffer, + ULONG BufferSize, + LCID LocaleId, + ULONG *ErrorLine); +extern int InfHostOpenFile(PHINF InfHandle, + const CHAR *FileName, + LCID LocaleId, + ULONG *ErrorLine); +extern int InfHostWriteFile(HINF InfHandle, + const CHAR *FileName, + const CHAR *HeaderComment); +extern void InfHostCloseFile(HINF InfHandle); +extern int InfHostFindFirstLine(HINF InfHandle, + const WCHAR *Section, + const WCHAR *Key, + PINFCONTEXT *Context); +extern int InfHostFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut); +extern int InfHostFindFirstMatchLine(PINFCONTEXT ContextIn, + const WCHAR *Key, + PINFCONTEXT ContextOut); +extern int InfHostFindNextMatchLine(PINFCONTEXT ContextIn, + const WCHAR *Key, + PINFCONTEXT ContextOut); +extern LONG InfHostGetLineCount(HINF InfHandle, + const WCHAR *Section); +extern LONG InfHostGetFieldCount(PINFCONTEXT Context); +extern int InfHostGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + UCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize); +extern int InfHostGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + ULONG *IntegerValue); +extern int InfHostGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize); +extern int InfHostGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize); +extern int InfHostGetData(PINFCONTEXT Context, + WCHAR **Key, + WCHAR **Data); +extern int InfHostGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR **Data); +extern int InfHostFindOrAddSection(HINF InfHandle, + const WCHAR *Section, + PINFCONTEXT *Context); +extern int InfHostAddLine(PINFCONTEXT Context, const WCHAR *Key); +extern int InfHostAddField(PINFCONTEXT Context, const WCHAR *Data); +extern void InfHostFreeContext(PINFCONTEXT Context); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* EOF */ diff --git a/reactos/lib/newinflib/infhostgen.c b/reactos/lib/newinflib/infhostgen.c new file mode 100644 index 00000000000..e5ad1b96e9b --- /dev/null +++ b/reactos/lib/newinflib/infhostgen.c @@ -0,0 +1,316 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + +/* PUBLIC FUNCTIONS *********************************************************/ + +int +InfHostOpenBufferedFile(PHINF InfHandle, + void *Buffer, + ULONG BufferSize, + LCID LocaleId, + ULONG *ErrorLine) +{ + INFSTATUS Status; + PINFCACHE Cache; + WCHAR *FileBuffer; + ULONG FileBufferSize; + + *InfHandle = NULL; + *ErrorLine = (ULONG)-1; + + /* Allocate file buffer */ + FileBufferSize = BufferSize + 2; + FileBuffer = MALLOC(FileBufferSize); + if (FileBuffer == NULL) + { + DPRINT1("MALLOC() failed\n"); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + MEMCPY(FileBuffer, Buffer, BufferSize); + + /* Append string terminator */ + FileBuffer[BufferSize] = 0; + FileBuffer[BufferSize + 1] = 0; + + /* Allocate infcache header */ + Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); + if (Cache == NULL) + { + DPRINT1("MALLOC() failed\n"); + FREE(FileBuffer); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + /* Initialize inicache header */ + ZEROMEMORY(Cache, + sizeof(INFCACHE)); + + Cache->LocaleId = LocaleId; + + if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferSize, NULL)) + { +// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; + WCHAR *new_buff; +// UINT codepage = CP_ACP; + UINT offset = 0; + +// if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) +// { +// codepage = CP_UTF8; +// offset = sizeof(utf8_bom); +// } + + new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); + if (new_buff != NULL) + { +// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, +// FileBufferSize - offset, new_buff, FileBufferSize); + + ULONG len; + Status = RtlMultiByteToUnicodeN(new_buff, + FileBufferSize * sizeof(WCHAR), + &len, + (char *)FileBuffer + offset, + FileBufferSize - offset); + + Status = InfpParseBuffer(Cache, + new_buff, + new_buff + len / sizeof(WCHAR), + ErrorLine); + FREE(new_buff); + } + else + Status = INF_STATUS_INSUFFICIENT_RESOURCES; + } + else + { + WCHAR *new_buff = (WCHAR *)FileBuffer; + /* UCS-16 files should start with the Unicode BOM; we should skip it */ + if (*new_buff == 0xfeff) + { + new_buff++; + FileBufferSize -= sizeof(WCHAR); + } + Status = InfpParseBuffer(Cache, + new_buff, + (WCHAR*)((char*)new_buff + FileBufferSize), + ErrorLine); + } + + /* Parse the inf buffer */ +// Status = InfpParseBuffer (Cache, +// FileBuffer, +// FileBuffer + BufferSize, +// ErrorLine); + if (!INF_SUCCESS(Status)) + { + FREE(Cache); + Cache = NULL; + } + + /* Free file buffer */ + FREE(FileBuffer); + + *InfHandle = (HINF)Cache; + + return INF_SUCCESS(Status) ? 0 : -1; +} + + +int +InfHostOpenFile(PHINF InfHandle, + const CHAR *FileName, + LCID LocaleId, + ULONG *ErrorLine) +{ + FILE *File; + CHAR *FileBuffer; + ULONG FileLength; + ULONG FileBufferLength; + PINFCACHE Cache; + INFSTATUS Status = INF_STATUS_SUCCESS; + + *InfHandle = NULL; + *ErrorLine = (ULONG)-1; + + /* Open the inf file */ + File = fopen(FileName, "rb"); + if (NULL == File) + { + DPRINT1("fopen() failed (errno %d)\n", errno); + return -1; + } + + DPRINT("fopen() successful\n"); + + /* Query file size */ + if (fseek(File, (size_t)0, SEEK_END)) + { + DPRINT1("fseek() to EOF failed (errno %d)\n", errno); + fclose(File); + return -1; + } + + FileLength = (ULONG)ftell(File); + if ((ULONG) -1 == FileLength) + { + DPRINT1("ftell() failed (errno %d)\n", errno); + fclose(File); + return -1; + } + DPRINT("File size: %u\n", (UINT)FileLength); + + /* Rewind */ + if (fseek(File, (size_t)0, SEEK_SET)) + { + DPRINT1("fseek() to BOF failed (errno %d)\n", errno); + fclose(File); + return -1; + } + + /* Allocate file buffer */ + FileBufferLength = FileLength + 2; + FileBuffer = MALLOC(FileBufferLength); + if (FileBuffer == NULL) + { + DPRINT1("MALLOC() failed\n"); + fclose(File); + return -1; + } + + /* Read file */ + if (FileLength != fread(FileBuffer, (size_t)1, (size_t)FileLength, File)) + { + DPRINT1("fread() failed (errno %d)\n", errno); + fclose(File); + return -1; + } + + fclose(File); + + /* Append string terminator */ + FileBuffer[FileLength] = 0; + FileBuffer[FileLength + 1] = 0; + + /* Allocate infcache header */ + Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); + if (Cache == NULL) + { + DPRINT1("MALLOC() failed\n"); + FREE(FileBuffer); + return -1; + } + + /* Initialize inicache header */ + ZEROMEMORY(Cache, + sizeof(INFCACHE)); + + Cache->LocaleId = LocaleId; + + /* Parse the inf buffer */ + if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferLength, NULL)) + { +// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; + WCHAR *new_buff; +// UINT codepage = CP_ACP; + UINT offset = 0; + +// if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) +// { +// codepage = CP_UTF8; +// offset = sizeof(utf8_bom); +// } + + new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); + if (new_buff != NULL) + { +// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, +// FileLength - offset, new_buff, FileLength); + + ULONG len; + Status = RtlMultiByteToUnicodeN(new_buff, + FileBufferLength * sizeof(WCHAR), + &len, + (char *)FileBuffer + offset, + FileBufferLength - offset); + + Status = InfpParseBuffer(Cache, + new_buff, + new_buff + len / sizeof(WCHAR), + ErrorLine); + + FREE(new_buff); + } + else + Status = INF_STATUS_INSUFFICIENT_RESOURCES; + } + else + { + WCHAR *new_buff = (WCHAR *)FileBuffer; + /* UCS-16 files should start with the Unicode BOM; we should skip it */ + if (*new_buff == 0xfeff) + { + new_buff++; + FileBufferLength -= sizeof(WCHAR); + } + Status = InfpParseBuffer(Cache, + new_buff, + (WCHAR*)((char*)new_buff + FileBufferLength), + ErrorLine); + } + +// Status = InfpParseBuffer (Cache, +// FileBuffer, +// FileBuffer + FileLength, +// ErrorLine); + if (!INF_SUCCESS(Status)) + { + FREE(Cache); + Cache = NULL; + } + + /* Free file buffer */ + FREE(FileBuffer); + + *InfHandle = (HINF)Cache; + + return INF_SUCCESS(Status) ? 0 : -1; +} + + +void +InfHostCloseFile(HINF InfHandle) +{ + PINFCACHE Cache; + + Cache = (PINFCACHE)InfHandle; + + if (Cache == NULL) + { + return; + } + + while (Cache->FirstSection != NULL) + { + Cache->FirstSection = InfpFreeSection(Cache->FirstSection); + } + Cache->LastSection = NULL; + + FREE(Cache); +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infhostget.c b/reactos/lib/newinflib/infhostget.c new file mode 100644 index 00000000000..bd49be17002 --- /dev/null +++ b/reactos/lib/newinflib/infhostget.c @@ -0,0 +1,249 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + +int +InfHostFindFirstLine(HINF InfHandle, + const WCHAR *Section, + const WCHAR *Key, + PINFCONTEXT *Context) +{ + INFSTATUS Status; + + Status = InfpFindFirstLine(InfHandle, Section, Key, Context); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut) +{ + INFSTATUS Status; + + Status = InfpFindNextLine(ContextIn, ContextOut); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostFindFirstMatchLine(PINFCONTEXT ContextIn, + const WCHAR *Key, + PINFCONTEXT ContextOut) +{ + INFSTATUS Status; + + Status = InfpFindFirstMatchLine(ContextIn, Key, ContextOut); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostFindNextMatchLine(PINFCONTEXT ContextIn, + const WCHAR *Key, + PINFCONTEXT ContextOut) +{ + INFSTATUS Status; + + Status = InfpFindNextMatchLine(ContextIn, Key, ContextOut); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +LONG +InfHostGetLineCount(HINF InfHandle, + PCWSTR Section) +{ + return InfpGetLineCount(InfHandle, Section); +} + + +/* InfGetLineText */ + + +LONG +InfHostGetFieldCount(PINFCONTEXT Context) +{ + return InfpGetFieldCount(Context); +} + + +int +InfHostGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + UCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize) +{ + INFSTATUS Status; + + Status = InfpGetBinaryField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + ULONG *IntegerValue) +{ + INFSTATUS Status; + + Status = InfpGetIntField(Context, FieldIndex, (PLONG)IntegerValue); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize) +{ + INFSTATUS Status; + + Status = InfpGetMultiSzField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize) +{ + INFSTATUS Status; + + Status = InfpGetStringField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetData(PINFCONTEXT Context, + WCHAR **Key, + WCHAR **Data) +{ + INFSTATUS Status; + + Status = InfpGetData(Context, Key, Data); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR **Data) +{ + INFSTATUS Status; + + Status = InfpGetDataField(Context, FieldIndex, Data); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + +VOID +InfHostFreeContext(PINFCONTEXT Context) +{ + InfpFreeContext(Context); +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infhostput.c b/reactos/lib/newinflib/infhostput.c new file mode 100644 index 00000000000..a5233e50545 --- /dev/null +++ b/reactos/lib/newinflib/infhostput.c @@ -0,0 +1,115 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + +int +InfHostWriteFile(HINF InfHandle, + const CHAR *FileName, + const CHAR *HeaderComment) +{ + WCHAR *Buffer; + ULONG BufferSize; + INFSTATUS Status; + FILE *File; + + Status = InfpBuildFileBuffer((PINFCACHE) InfHandle, &Buffer, &BufferSize); + if (! INF_SUCCESS(Status)) + { + errno = Status; + return -1; + } + + File = fopen(FileName, "wb"); + if (NULL == File) + { + FREE(Buffer); + DPRINT1("fopen() failed (errno %d)\n", errno); + return -1; + } + + DPRINT("fopen() successful\n"); + + if (NULL != HeaderComment && '\0' != *HeaderComment) + { +// fprintf(File, "; %s\r\n\r\n", HeaderComment); + } + + if (BufferSize != fwrite(Buffer, (size_t)1, (size_t)BufferSize, File)) + { + DPRINT1("fwrite() failed (errno %d)\n", errno); + fclose(File); + FREE(Buffer); + return -1; + } + + fclose(File); + + FREE(Buffer); + + return 0; +} + +int +InfHostFindOrAddSection(HINF InfHandle, + const WCHAR *Section, + PINFCONTEXT *Context) +{ + INFSTATUS Status; + + Status = InfpFindOrAddSection((PINFCACHE) InfHandle, Section, Context); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + +int +InfHostAddLine(PINFCONTEXT Context, const WCHAR *Key) +{ + INFSTATUS Status; + + Status = InfpAddLineWithKey(Context, Key); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + +int +InfHostAddField(PINFCONTEXT Context, const WCHAR *Data) +{ + INFSTATUS Status; + + Status = InfpAddField(Context, Data); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infhostrtl.c b/reactos/lib/newinflib/infhostrtl.c new file mode 100644 index 00000000000..c9a522149df --- /dev/null +++ b/reactos/lib/newinflib/infhostrtl.c @@ -0,0 +1,151 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + +NTSTATUS NTAPI +RtlMultiByteToUnicodeN( + IN PWCHAR UnicodeString, + IN ULONG UnicodeSize, + IN PULONG ResultSize, + IN PCSTR MbString, + IN ULONG MbSize) +{ + ULONG Size = 0; + ULONG i; + PUCHAR WideString; + + /* single-byte code page */ + if (MbSize > (UnicodeSize / sizeof(WCHAR))) + Size = UnicodeSize / sizeof(WCHAR); + else + Size = MbSize; + + if (ResultSize != NULL) + *ResultSize = Size * sizeof(WCHAR); + + WideString = (PUCHAR)UnicodeString; + for (i = 0; i <= Size; i++) + { + WideString[2 * i + 0] = (UCHAR)MbString[i]; + WideString[2 * i + 1] = 0; + } + + return STATUS_SUCCESS; +} + + +BOOLEAN +NTAPI +RtlIsTextUnicode( PVOID buf, INT len, INT *pf ) +{ + static const WCHAR std_control_chars[] = {'\r','\n','\t',' ',0x3000,0}; + static const WCHAR byterev_control_chars[] = {0x0d00,0x0a00,0x0900,0x2000,0}; + const WCHAR *s = buf; + int i; + unsigned int flags = MAXULONG, out_flags = 0; + + if (len < sizeof(WCHAR)) + { + /* FIXME: MSDN documents IS_TEXT_UNICODE_BUFFER_TOO_SMALL but there is no such thing... */ + if (pf) *pf = 0; + return FALSE; + } + if (pf) + flags = (unsigned int)*pf; + /* + * Apply various tests to the text string. According to the + * docs, each test "passed" sets the corresponding flag in + * the output flags. But some of the tests are mutually + * exclusive, so I don't see how you could pass all tests ... + */ + + /* Check for an odd length ... pass if even. */ + if (len & 1) out_flags |= IS_TEXT_UNICODE_ODD_LENGTH; + + if (((char *)buf)[len - 1] == 0) + len--; /* Windows seems to do something like that to avoid e.g. false IS_TEXT_UNICODE_NULL_BYTES */ + + len /= (INT)sizeof(WCHAR); + /* Windows only checks the first 256 characters */ + if (len > 256) len = 256; + + /* Check for the special byte order unicode marks. */ + if (*s == 0xFEFF) out_flags |= IS_TEXT_UNICODE_SIGNATURE; + if (*s == 0xFFFE) out_flags |= IS_TEXT_UNICODE_REVERSE_SIGNATURE; + + /* apply some statistical analysis */ + if (flags & IS_TEXT_UNICODE_STATISTICS) + { + int stats = 0; + /* FIXME: checks only for ASCII characters in the unicode stream */ + for (i = 0; i < len; i++) + { + if (s[i] <= 255) stats++; + } + if (stats > len / 2) + out_flags |= IS_TEXT_UNICODE_STATISTICS; + } + + /* Check for unicode NULL chars */ + if (flags & IS_TEXT_UNICODE_NULL_BYTES) + { + for (i = 0; i < len; i++) + { + if (!(s[i] & 0xff) || !(s[i] >> 8)) + { + out_flags |= IS_TEXT_UNICODE_NULL_BYTES; + break; + } + } + } + + if (flags & IS_TEXT_UNICODE_CONTROLS) + { + for (i = 0; i < len; i++) + { + if (wcschr(std_control_chars, s[i])) + { + out_flags |= IS_TEXT_UNICODE_CONTROLS; + break; + } + } + } + + if (flags & IS_TEXT_UNICODE_REVERSE_CONTROLS) + { + for (i = 0; i < len; i++) + { + if (wcschr(byterev_control_chars, s[i])) + { + out_flags |= IS_TEXT_UNICODE_REVERSE_CONTROLS; + break; + } + } + } + + if (pf) + { + out_flags &= (unsigned int)*pf; + *pf = (INT)out_flags; + } + /* check for flags that indicate it's definitely not valid Unicode */ + if (out_flags & (IS_TEXT_UNICODE_REVERSE_MASK | IS_TEXT_UNICODE_NOT_UNICODE_MASK)) return FALSE; + /* now check for invalid ASCII, and assume Unicode if so */ + if (out_flags & IS_TEXT_UNICODE_NOT_ASCII_MASK) return TRUE; + /* now check for Unicode flags */ + if (out_flags & IS_TEXT_UNICODE_UNICODE_MASK) return TRUE; + /* no flags set */ + return FALSE; +} diff --git a/reactos/lib/newinflib/inflib.h b/reactos/lib/newinflib/inflib.h new file mode 100644 index 00000000000..7dff17fa035 --- /dev/null +++ b/reactos/lib/newinflib/inflib.h @@ -0,0 +1,15 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +#include +#include +#include + +#include "builddep.h" +#include "infcommon.h" +#include "infpriv.h" + +/* EOF */ diff --git a/reactos/lib/newinflib/inflib.mak b/reactos/lib/newinflib/inflib.mak new file mode 100644 index 00000000000..a0edbe26b96 --- /dev/null +++ b/reactos/lib/newinflib/inflib.mak @@ -0,0 +1,76 @@ +INFLIB_BASE = $(LIB_BASE_)newinflib +INFLIB_BASE_ = $(INFLIB_BASE)$(SEP) +INFLIB_INT = $(INTERMEDIATE_)$(INFLIB_BASE)_host +INFLIB_INT_ = $(INTERMEDIATE_)$(INFLIB_BASE)_host$(SEP) +INFLIB_OUT = $(OUTPUT_)$(INFLIB_BASE)_host +INFLIB_OUT_ = $(OUTPUT_)$(INFLIB_BASE)_host$(SEP) + +$(INFLIB_INT): | $(LIB_INT) + $(ECHO_MKDIR) + ${mkdir} $@ + +ifneq ($(INTERMEDIATE),$(OUTPUT)) +$(INFLIB_OUT): | $(OUTPUT_)$(LIB_BASE) + $(ECHO_MKDIR) + ${mkdir} $@ +endif + +INFLIB_HOST_TARGET = \ + $(INFLIB_OUT)$(SEP)newinflib.a + +INFLIB_HOST_SOURCES = $(addprefix $(INFLIB_BASE_), \ + infcore.c \ + infget.c \ + infput.c \ + infhostgen.c \ + infhostget.c \ + infhostput.c \ + infhostrtl.c \ + ) + +INFLIB_HOST_OBJECTS = \ + $(subst $(INFLIB_BASE), $(INFLIB_INT), $(INFLIB_HOST_SOURCES:.c=.o)) + +INFLIB_HOST_CFLAGS = -O3 -Wall -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes -DINFLIB_HOST \ + -Iinclude/reactos -Iinclude $(HOST_CFLAGS) + +$(INFLIB_HOST_TARGET): $(INFLIB_HOST_OBJECTS) | $(INFLIB_OUT) + $(ECHO_HOSTAR) + $(host_ar) -r $@ $(INFLIB_HOST_OBJECTS) + +$(INFLIB_INT_)infcore.o: $(INFLIB_BASE_)infcore.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infget.o: $(INFLIB_BASE_)infget.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infput.o: $(INFLIB_BASE_)infput.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infhostgen.o: $(INFLIB_BASE_)infhostgen.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infhostget.o: $(INFLIB_BASE_)infhostget.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infhostput.o: $(INFLIB_BASE_)infhostput.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infhostrtl.o: $(INFLIB_BASE_)infhostrtl.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +.PHONY: newinflib_host +newinflib_host: $(INFLIB_HOST_TARGET) + +.PHONY: newinflib_host_clean +newinflib_host_clean: + -@$(rm) $(INFLIB_HOST_TARGET) $(INFLIB_HOST_OBJECTS) 2>$(NUL) +clean: newinflib_host_clean diff --git a/reactos/lib/newinflib/inflib.rbuild b/reactos/lib/newinflib/inflib.rbuild new file mode 100644 index 00000000000..fc7c2cdd7bb --- /dev/null +++ b/reactos/lib/newinflib/inflib.rbuild @@ -0,0 +1,31 @@ + + + + + . + infcore.c + infget.c + infput.c + infrosgen.c + infrosget.c + infrosput.c + + + . + + + -Wpointer-arith + -Wconversion + -Wstrict-prototypes + -Wmissing-prototypes + + + infcore.c + infget.c + infput.c + infhostgen.c + infhostget.c + infhostput.c + infhostrtl.c + + diff --git a/reactos/lib/newinflib/infpriv.h b/reactos/lib/newinflib/infpriv.h new file mode 100644 index 00000000000..0d2cea94dc4 --- /dev/null +++ b/reactos/lib/newinflib/infpriv.h @@ -0,0 +1,145 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +#pragma once + +#ifndef FIELD_OFFSET +#define FIELD_OFFSET(t,f) ((ptrdiff_t)&(((t*)0)->f)) +#endif + +#define INF_STATUS_INSUFFICIENT_RESOURCES ((INFSTATUS)0xC000009A) +#define INF_STATUS_BAD_SECTION_NAME_LINE ((INFSTATUS)0xC0700001) +#define INF_STATUS_SECTION_NAME_TOO_LONG ((INFSTATUS)0xC0700002) +#define INF_STATUS_WRONG_INF_STYLE ((INFSTATUS)0xC0700003) +#define INF_STATUS_NOT_ENOUGH_MEMORY ((INFSTATUS)0xC0700004) + +typedef struct _INFCACHEFIELD +{ + struct _INFCACHEFIELD *Next; + struct _INFCACHEFIELD *Prev; + + WCHAR Data[1]; +} INFCACHEFIELD, *PINFCACHEFIELD; + +typedef struct _INFCACHELINE +{ + struct _INFCACHELINE *Next; + struct _INFCACHELINE *Prev; + + LONG FieldCount; + + PWCHAR Key; + + PINFCACHEFIELD FirstField; + PINFCACHEFIELD LastField; + +} INFCACHELINE, *PINFCACHELINE; + +typedef struct _INFCACHESECTION +{ + struct _INFCACHESECTION *Next; + struct _INFCACHESECTION *Prev; + + PINFCACHELINE FirstLine; + PINFCACHELINE LastLine; + + LONG LineCount; + + WCHAR Name[1]; +} INFCACHESECTION, *PINFCACHESECTION; + +typedef struct _INFCACHE +{ + LCID LocaleId; + PINFCACHESECTION FirstSection; + PINFCACHESECTION LastSection; + + PINFCACHESECTION StringsSection; +} INFCACHE, *PINFCACHE; + +typedef struct _INFCONTEXT +{ + PINFCACHE Inf; + PINFCACHESECTION Section; + PINFCACHELINE Line; +} INFCONTEXT; + +typedef int INFSTATUS; + +/* FUNCTIONS ****************************************************************/ + +extern INFSTATUS InfpParseBuffer(PINFCACHE file, + const WCHAR *buffer, + const WCHAR *end, + PULONG error_line); +extern PINFCACHESECTION InfpFreeSection(PINFCACHESECTION Section); +extern PINFCACHESECTION InfpAddSection(PINFCACHE Cache, + PCWSTR Name); +extern PINFCACHELINE InfpAddLine(PINFCACHESECTION Section); +extern PVOID InfpAddKeyToLine(PINFCACHELINE Line, + PCWSTR Key); +extern PVOID InfpAddFieldToLine(PINFCACHELINE Line, + PCWSTR Data); +extern PINFCACHELINE InfpFindKeyLine(PINFCACHESECTION Section, + PCWSTR Key); +extern PINFCACHESECTION InfpFindSection(PINFCACHE Cache, + PCWSTR Section); + +extern INFSTATUS InfpBuildFileBuffer(PINFCACHE InfHandle, + PWCHAR *Buffer, + PULONG BufferSize); + +extern INFSTATUS InfpFindFirstLine(PINFCACHE InfHandle, + PCWSTR Section, + PCWSTR Key, + PINFCONTEXT *Context); +extern INFSTATUS InfpFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut); +extern INFSTATUS InfpFindFirstMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut); +extern INFSTATUS InfpFindNextMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut); +extern LONG InfpGetLineCount(HINF InfHandle, + PCWSTR Section); +extern LONG InfpGetFieldCount(PINFCONTEXT Context); +extern INFSTATUS InfpGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + PUCHAR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern INFSTATUS InfpGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + PLONG IntegerValue); +extern INFSTATUS InfpGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern INFSTATUS InfpGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern INFSTATUS InfpGetData(PINFCONTEXT Context, + PWCHAR *Key, + PWCHAR *Data); +extern INFSTATUS InfpGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + PWCHAR *Data); + +extern INFSTATUS InfpFindOrAddSection(PINFCACHE Cache, + PCWSTR Section, + PINFCONTEXT *Context); +extern INFSTATUS InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key); +extern INFSTATUS InfpAddField(PINFCONTEXT Context, PCWSTR Data); + +extern VOID InfpFreeContext(PINFCONTEXT Context); + +/* EOF */ diff --git a/reactos/lib/newinflib/infput.c b/reactos/lib/newinflib/infput.c new file mode 100644 index 00000000000..2d60af0fb9f --- /dev/null +++ b/reactos/lib/newinflib/infput.c @@ -0,0 +1,264 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" + +#define NDEBUG +#include + +#define EOL L"\r\n" +#define SIZE_INC 1024 + +typedef struct _OUTPUTBUFFER +{ + PWCHAR Buffer; + PWCHAR Current; + ULONG TotalSize; + ULONG FreeSize; + INFSTATUS Status; +} OUTPUTBUFFER, *POUTPUTBUFFER; + +static void +Output(POUTPUTBUFFER OutBuf, PCWSTR Text) +{ + ULONG Length; + PWCHAR NewBuf; + ULONG NewSize; + + /* Skip mode? */ + if (! INF_SUCCESS(OutBuf->Status)) + { + return; + } + + /* Doesn't fit? */ + Length = (ULONG)wcslen(Text) * sizeof(WCHAR); + if (OutBuf->FreeSize < Length + 1 && INF_SUCCESS(OutBuf->Status)) + { + DPRINT("Out of free space. TotalSize %u FreeSize %u Length %u\n", + (UINT)OutBuf->TotalSize, (UINT)OutBuf->FreeSize, (UINT)Length); + /* Round up to next SIZE_INC */ + NewSize = OutBuf->TotalSize + + (((Length + 1) - OutBuf->FreeSize + (SIZE_INC - 1)) / + SIZE_INC) * SIZE_INC; + DPRINT("NewSize %u\n", (UINT)NewSize); + NewBuf = MALLOC(NewSize); + /* Abort if failed */ + if (NULL == NewBuf) + { + DPRINT1("MALLOC() failed\n"); + OutBuf->Status = INF_STATUS_NO_MEMORY; + return; + } + + /* Need to copy old contents? */ + if (NULL != OutBuf->Buffer) + { + DPRINT("Copying %u bytes from old content\n", + (UINT)(OutBuf->TotalSize - OutBuf->FreeSize)); + MEMCPY(NewBuf, OutBuf->Buffer, OutBuf->TotalSize - OutBuf->FreeSize); + OutBuf->Current = NewBuf + (OutBuf->Current - OutBuf->Buffer); + FREE(OutBuf->Buffer); + } + else + { + OutBuf->Current = NewBuf; + } + OutBuf->Buffer = NewBuf; + OutBuf->FreeSize += NewSize - OutBuf->TotalSize; + OutBuf->TotalSize = NewSize; + DPRINT("After reallocation TotalSize %u FreeSize %u\n", + (UINT)OutBuf->TotalSize, (UINT)OutBuf->FreeSize); + } + + /* We're guaranteed to have enough room now. Copy char by char because of + possible "conversion" from Unicode to Ansi */ + while (Length--) + { + *OutBuf->Current++ = *Text++; + OutBuf->FreeSize--; + } + *OutBuf->Current = '\0'; +} + +INFSTATUS +InfpBuildFileBuffer(PINFCACHE Cache, + PWCHAR *Buffer, + PULONG BufferSize) +{ + OUTPUTBUFFER OutBuf; + PINFCACHESECTION CacheSection; + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + PWCHAR p; + BOOLEAN NeedQuotes; + + OutBuf.Buffer = NULL; + OutBuf.Current = NULL; + OutBuf.FreeSize = 0; + OutBuf.TotalSize = 0; + OutBuf.Status = INF_STATUS_SUCCESS; + + /* Iterate through list of sections */ + CacheSection = Cache->FirstSection; + while (CacheSection != NULL) + { + DPRINT("Processing section %S\n", CacheSection->Name); + if (CacheSection != Cache->FirstSection) + { + Output(&OutBuf, EOL); + } + Output(&OutBuf, L"["); + Output(&OutBuf, CacheSection->Name); + Output(&OutBuf, L"]"); + Output(&OutBuf, EOL); + + /* Iterate through list of lines */ + CacheLine = CacheSection->FirstLine; + while (CacheLine != NULL) + { + if (NULL != CacheLine->Key) + { + DPRINT("Line with key %S\n", CacheLine->Key); + Output(&OutBuf, CacheLine->Key); + Output(&OutBuf, L" = "); + } + else + { + DPRINT("Line without key\n"); + } + + /* Iterate through list of lines */ + CacheField = CacheLine->FirstField; + while (CacheField != NULL) + { + if (CacheField != CacheLine->FirstField) + { + Output(&OutBuf, L","); + } + p = CacheField->Data; + NeedQuotes = FALSE; + while (L'\0' != *p && ! NeedQuotes) + { + NeedQuotes = (BOOLEAN)(L',' == *p || L';' == *p || + L'\\' == *p); + p++; + } + if (NeedQuotes) + { + Output(&OutBuf, L"\""); + Output(&OutBuf, CacheField->Data); + Output(&OutBuf, L"\""); + } + else + { + Output(&OutBuf, CacheField->Data); + } + + /* Get the next field */ + CacheField = CacheField->Next; + } + + Output(&OutBuf, EOL); + /* Get the next line */ + CacheLine = CacheLine->Next; + } + + /* Get the next section */ + CacheSection = CacheSection->Next; + } + + if (INF_SUCCESS(OutBuf.Status)) + { + *Buffer = OutBuf.Buffer; + *BufferSize = OutBuf.TotalSize - OutBuf.FreeSize; + } + else if (NULL != OutBuf.Buffer) + { + FREE(OutBuf.Buffer); + } + + return INF_STATUS_SUCCESS; +} + +INFSTATUS +InfpFindOrAddSection(PINFCACHE Cache, + PCWSTR Section, + PINFCONTEXT *Context) +{ + DPRINT("InfpFindOrAddSection section %S\n", Section); + + *Context = MALLOC(sizeof(INFCONTEXT)); + if (NULL == *Context) + { + DPRINT1("MALLOC() failed\n"); + return INF_STATUS_NO_MEMORY; + } + + (*Context)->Inf = Cache; + (*Context)->Section = InfpFindSection(Cache, Section); + (*Context)->Line = NULL; + if (NULL == (*Context)->Section) + { + DPRINT("Section not found, creating it\n"); + (*Context)->Section = InfpAddSection(Cache, Section); + if (NULL == (*Context)->Section) + { + DPRINT("Failed to create section\n"); + FREE(*Context); + return INF_STATUS_NO_MEMORY; + } + } + + return INF_STATUS_SUCCESS; +} + +INFSTATUS +InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key) +{ + if (NULL == Context) + { + DPRINT1("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + Context->Line = InfpAddLine(Context->Section); + if (NULL == Context->Line) + { + DPRINT("Failed to create line\n"); + return INF_STATUS_NO_MEMORY; + } + + if (NULL != Key && NULL == InfpAddKeyToLine(Context->Line, Key)) + { + DPRINT("Failed to add key\n"); + return INF_STATUS_NO_MEMORY; + } + + return INF_STATUS_SUCCESS; +} + +INFSTATUS +InfpAddField(PINFCONTEXT Context, PCWSTR Data) +{ + if (NULL == Context || NULL == Context->Line) + { + DPRINT1("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (NULL == InfpAddFieldToLine(Context->Line, Data)) + { + DPRINT("Failed to add field\n"); + return INF_STATUS_NO_MEMORY; + } + + return INF_STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infros.h b/reactos/lib/newinflib/infros.h new file mode 100644 index 00000000000..c467af9f3fb --- /dev/null +++ b/reactos/lib/newinflib/infros.h @@ -0,0 +1,81 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include + +extern VOID InfSetHeap(PVOID Heap); +extern NTSTATUS InfOpenBufferedFile(PHINF InfHandle, + PVOID Buffer, + ULONG BufferSize, + LCID LocaleId, + PULONG ErrorLine); +extern NTSTATUS InfOpenFile(PHINF InfHandle, + PUNICODE_STRING FileName, + LCID LocaleId, + PULONG ErrorLine); +extern NTSTATUS InfWriteFile(HINF InfHandle, + PUNICODE_STRING FileName, + PUNICODE_STRING HeaderComment); +extern VOID InfCloseFile(HINF InfHandle); +extern BOOLEAN InfFindFirstLine(HINF InfHandle, + PCWSTR Section, + PCWSTR Key, + PINFCONTEXT *Context); +extern BOOLEAN InfFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut); +extern BOOLEAN InfFindFirstMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut); +extern BOOLEAN InfFindNextMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut); +extern LONG InfGetLineCount(HINF InfHandle, + PCWSTR Section); +extern LONG InfGetFieldCount(PINFCONTEXT Context); +extern BOOLEAN InfGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + PUCHAR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern BOOLEAN InfGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + PLONG IntegerValue); +extern BOOLEAN InfGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern BOOLEAN InfGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern BOOLEAN InfGetData(PINFCONTEXT Context, + PWCHAR *Key, + PWCHAR *Data); +extern BOOLEAN InfGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + PWCHAR *Data); +extern BOOLEAN InfFindOrAddSection(HINF InfHandle, + PCWSTR Section, + PINFCONTEXT *Context); +extern BOOLEAN InfAddLine(PINFCONTEXT Context, PCWSTR Key); +extern BOOLEAN InfAddField(PINFCONTEXT Context, PCWSTR Data); +extern VOID InfFreeContext(PINFCONTEXT Context); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* EOF */ diff --git a/reactos/lib/newinflib/infrosgen.c b/reactos/lib/newinflib/infrosgen.c new file mode 100644 index 00000000000..8ea53ae58d2 --- /dev/null +++ b/reactos/lib/newinflib/infrosgen.c @@ -0,0 +1,370 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infros.h" + +#define NDEBUG +#include + +/* PRIVATE FUNCTIONS ********************************************************/ + +static int InfpHeapRefCount; + +static VOID +CheckHeap() +{ + if (NULL == InfpHeap) + { + InfpHeap = RtlCreateHeap(HEAP_GROWABLE, NULL, 0, 0, NULL, NULL); + } + if (0 <= InfpHeapRefCount) + { + InfpHeapRefCount++; + } +} + + +/* PUBLIC FUNCTIONS *********************************************************/ + +PVOID InfpHeap; + +VOID +InfSetHeap(PVOID Heap) +{ + if (NULL == InfpHeap) + { + InfpHeap = Heap; + InfpHeapRefCount = -1; + } +} + + +NTSTATUS +InfOpenBufferedFile(PHINF InfHandle, + PVOID Buffer, + ULONG BufferSize, + LCID LocaleId, + PULONG ErrorLine) +{ + INFSTATUS Status; + PINFCACHE Cache; + PCHAR FileBuffer; + ULONG FileBufferSize; + + CheckHeap(); + + *InfHandle = NULL; + *ErrorLine = (ULONG)-1; + + /* Allocate file buffer */ + FileBufferSize = BufferSize + 2; + FileBuffer = MALLOC(FileBufferSize); + if (FileBuffer == NULL) + { + DPRINT1("MALLOC() failed\n"); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + MEMCPY(FileBuffer, Buffer, BufferSize); + + /* Append string terminator */ + FileBuffer[BufferSize] = 0; + FileBuffer[BufferSize + 1] = 0; + + /* Allocate infcache header */ + Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); + if (Cache == NULL) + { + DPRINT("MALLOC() failed\n"); + FREE(FileBuffer); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + /* Initialize inicache header */ + ZEROMEMORY(Cache, + sizeof(INFCACHE)); + + Cache->LocaleId = LocaleId; + + if (!RtlIsTextUnicode(FileBuffer, FileBufferSize, NULL)) + { +// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; + WCHAR *new_buff; +// UINT codepage = CP_ACP; + UINT offset = 0; + +// if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) +// { +// codepage = CP_UTF8; +// offset = sizeof(utf8_bom); +// } + + new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); + if (new_buff != NULL) + { +// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, +// FileBufferSize - offset, new_buff, FileBufferSize); + + ULONG len; + Status = RtlMultiByteToUnicodeN(new_buff, + FileBufferSize * sizeof(WCHAR), + &len, + (char *)FileBuffer + offset, + FileBufferSize - offset); + + Status = InfpParseBuffer(Cache, + new_buff, + new_buff + len, + ErrorLine); + FREE(new_buff); + } + else + Status = INF_STATUS_INSUFFICIENT_RESOURCES; + } + else + { + WCHAR *new_buff = (WCHAR *)FileBuffer; + /* UCS-16 files should start with the Unicode BOM; we should skip it */ + if (*new_buff == 0xfeff) + { + new_buff++; + FileBufferSize -= sizeof(WCHAR); + } + Status = InfpParseBuffer(Cache, + new_buff, + (WCHAR*)((char*)new_buff + FileBufferSize), + ErrorLine); + } + + if (!INF_SUCCESS(Status)) + { + FREE(Cache); + Cache = NULL; + } + + /* Free file buffer */ + FREE(FileBuffer); + + *InfHandle = (HINF)Cache; + + return(Status); +} + + +NTSTATUS +InfOpenFile(PHINF InfHandle, + PUNICODE_STRING FileName, + LCID LocaleId, + PULONG ErrorLine) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + FILE_STANDARD_INFORMATION FileInfo; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + NTSTATUS Status; + PCHAR FileBuffer; + ULONG FileLength; + ULONG FileBufferLength; + LARGE_INTEGER FileOffset; + PINFCACHE Cache; + + CheckHeap(); + + *InfHandle = NULL; + *ErrorLine = (ULONG)-1; + + /* Open the inf file */ + InitializeObjectAttributes(&ObjectAttributes, + FileName, + 0, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + GENERIC_READ | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); + if (!INF_SUCCESS(Status)) + { + DPRINT("NtOpenFile() failed (Status %lx)\n", Status); + return(Status); + } + + DPRINT("NtOpenFile() successful\n"); + + /* Query file size */ + Status = NtQueryInformationFile(FileHandle, + &IoStatusBlock, + &FileInfo, + sizeof(FILE_STANDARD_INFORMATION), + FileStandardInformation); + if (!INF_SUCCESS(Status)) + { + DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status); + NtClose(FileHandle); + return(Status); + } + + FileLength = FileInfo.EndOfFile.u.LowPart; + + DPRINT("File size: %lu\n", FileLength); + + /* Allocate file buffer */ + FileBufferLength = FileLength + 2; + FileBuffer = MALLOC(FileBufferLength); + if (FileBuffer == NULL) + { + DPRINT1("MALLOC() failed\n"); + NtClose(FileHandle); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + /* Read file */ + FileOffset.QuadPart = 0ULL; + Status = NtReadFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + FileBuffer, + FileLength, + &FileOffset, + NULL); + + /* Append string terminator */ + FileBuffer[FileLength] = 0; + FileBuffer[FileLength + 1] = 0; + + NtClose(FileHandle); + + if (!INF_SUCCESS(Status)) + { + DPRINT("NtReadFile() failed (Status %lx)\n", Status); + FREE(FileBuffer); + return(Status); + } + + /* Allocate infcache header */ + Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); + if (Cache == NULL) + { + DPRINT("MALLOC() failed\n"); + FREE(FileBuffer); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + /* Initialize inicache header */ + ZEROMEMORY(Cache, + sizeof(INFCACHE)); + + Cache->LocaleId = LocaleId; + + /* Parse the inf buffer */ + if (!RtlIsTextUnicode(FileBuffer, FileBufferLength, NULL)) + { +// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; + WCHAR *new_buff; +// UINT codepage = CP_ACP; + UINT offset = 0; + +// if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) +// { +// codepage = CP_UTF8; +// offset = sizeof(utf8_bom); +// } + + new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); + if (new_buff != NULL) + { +// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, +// FileLength - offset, new_buff, FileLength); + + ULONG len; + Status = RtlMultiByteToUnicodeN(new_buff, + FileBufferLength * sizeof(WCHAR), + &len, + (char *)FileBuffer + offset, + FileBufferLength - offset); + + Status = InfpParseBuffer(Cache, + new_buff, + new_buff + len, + ErrorLine); + FREE(new_buff); + } + else + Status = INF_STATUS_INSUFFICIENT_RESOURCES; + } + else + { + WCHAR *new_buff = (WCHAR *)FileBuffer; + /* UCS-16 files should start with the Unicode BOM; we should skip it */ + if (*new_buff == 0xfeff) + { + new_buff++; + FileBufferLength -= sizeof(WCHAR); + } + Status = InfpParseBuffer(Cache, + new_buff, + (WCHAR*)((char*)new_buff + FileBufferLength), + ErrorLine); + } + + if (!INF_SUCCESS(Status)) + { + FREE(Cache); + Cache = NULL; + } + + /* Free file buffer */ + FREE(FileBuffer); + + *InfHandle = (HINF)Cache; + + return(Status); +} + + +VOID +InfCloseFile(HINF InfHandle) +{ + PINFCACHE Cache; + + Cache = (PINFCACHE)InfHandle; + + if (Cache == NULL) + { + return; + } + + while (Cache->FirstSection != NULL) + { + Cache->FirstSection = InfpFreeSection(Cache->FirstSection); + } + Cache->LastSection = NULL; + + FREE(Cache); + + if (0 < InfpHeapRefCount) + { + InfpHeapRefCount--; + if (0 == InfpHeapRefCount) + { + RtlDestroyHeap(InfpHeap); + InfpHeap = NULL; + } + } +} + + +/* EOF */ diff --git a/reactos/lib/newinflib/infrosget.c b/reactos/lib/newinflib/infrosget.c new file mode 100644 index 00000000000..9f3e7b06abf --- /dev/null +++ b/reactos/lib/newinflib/infrosget.c @@ -0,0 +1,140 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infros.h" + +#define NDEBUG +#include + + +BOOLEAN +InfFindFirstLine(HINF InfHandle, + PCWSTR Section, + PCWSTR Key, + PINFCONTEXT *Context) +{ + return INF_SUCCESS(InfpFindFirstLine(InfHandle, Section, Key, Context)); +} + + +BOOLEAN +InfFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut) +{ + return INF_SUCCESS(InfpFindNextLine(ContextIn, ContextOut)); +} + + +BOOLEAN +InfFindFirstMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut) +{ + return INF_SUCCESS(InfpFindFirstMatchLine(ContextIn, Key, ContextOut)); +} + + +BOOLEAN +InfFindNextMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut) +{ + return INF_SUCCESS(InfpFindNextMatchLine(ContextIn, Key, ContextOut)); +} + + +LONG +InfGetLineCount(HINF InfHandle, + PCWSTR Section) +{ + return InfpGetLineCount(InfHandle, Section); +} + + +/* InfGetLineText */ + + +LONG +InfGetFieldCount(PINFCONTEXT Context) +{ + return InfpGetFieldCount(Context); +} + + +BOOLEAN +InfGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + PUCHAR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + return INF_SUCCESS(InfpGetBinaryField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize)); +} + + +BOOLEAN +InfGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + PLONG IntegerValue) +{ + return INF_SUCCESS(InfpGetIntField(Context, FieldIndex, IntegerValue)); +} + + +BOOLEAN +InfGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + return INF_SUCCESS(InfpGetMultiSzField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize)); +} + + +BOOLEAN +InfGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + return INF_SUCCESS(InfpGetStringField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize)); +} + + +BOOLEAN +InfGetData(PINFCONTEXT Context, + PWCHAR *Key, + PWCHAR *Data) +{ + return INF_SUCCESS(InfpGetData(Context, Key, Data)); +} + + +BOOLEAN +InfGetDataField (PINFCONTEXT Context, + ULONG FieldIndex, + PWCHAR *Data) +{ + return INF_SUCCESS(InfpGetDataField(Context, FieldIndex, Data)); +} + +VOID +InfFreeContext(PINFCONTEXT Context) +{ + InfpFreeContext(Context); +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infrosput.c b/reactos/lib/newinflib/infrosput.c new file mode 100644 index 00000000000..4c6ca5a3bca --- /dev/null +++ b/reactos/lib/newinflib/infrosput.c @@ -0,0 +1,132 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infros.h" + +#define NDEBUG +#include + +NTSTATUS +InfWriteFile(HINF InfHandle, + PUNICODE_STRING FileName, + PUNICODE_STRING HeaderComment) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + NTSTATUS Status; + INFSTATUS InfStatus; + PWCHAR Buffer; + ULONG BufferSize; + PWCHAR HeaderBuffer; + ULONG HeaderBufferSize; + UINT Index; + + InfStatus = InfpBuildFileBuffer((PINFCACHE) InfHandle, &Buffer, &BufferSize); + if (! INF_SUCCESS(InfStatus)) + { + DPRINT("Failed to create buffer (Status 0x%lx)\n", InfStatus); + return InfStatus; + } + + /* Open the inf file */ + InitializeObjectAttributes(&ObjectAttributes, + FileName, + 0, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + 0, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); + if (!INF_SUCCESS(Status)) + { + DPRINT1("NtOpenFile() failed (Status %lx)\n", Status); + FREE(Buffer); + return Status; + } + + DPRINT("NtOpenFile() successful\n"); + + if (NULL != HeaderComment && 0 != HeaderComment->Length) + { + /* This is just a comment header, don't abort on errors here */ + HeaderBufferSize = HeaderComment->Length + 7 * sizeof(WCHAR); + HeaderBuffer = MALLOC(HeaderBufferSize); + if (NULL != HeaderBuffer) + { + wcscpy(HeaderBuffer, L"; "); + for (Index = 0; Index < HeaderComment->Length / sizeof(WCHAR); Index++) + { + HeaderBuffer[2 + Index] = HeaderComment->Buffer[Index]; + } + wcscpy(HeaderBuffer + (2 + HeaderComment->Length / sizeof(WCHAR)), + L"\r\n\r\n"); + NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + HeaderBuffer, + HeaderBufferSize, + NULL, + NULL); + FREE(HeaderBuffer); + } + } + + /* Write main contents */ + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + Buffer, + BufferSize, + NULL, + NULL); + + NtClose(FileHandle); + FREE(Buffer); + + if (!INF_SUCCESS(Status)) + { + DPRINT1("NtWriteFile() failed (Status %lx)\n", Status); + FREE(Buffer); + return(Status); + } + + return STATUS_SUCCESS; +} + +BOOLEAN +InfFindOrAddSection(HINF InfHandle, + PCWSTR Section, + PINFCONTEXT *Context) +{ + return INF_SUCCESS(InfpFindOrAddSection((PINFCACHE) InfHandle, + Section, Context)); +} + +BOOLEAN +InfHostAddLine(PINFCONTEXT Context, PCWSTR Key) +{ + return INF_SUCCESS(InfpAddLineWithKey(Context, Key)); +} + +BOOLEAN +InfHostAddField(PINFCONTEXT Context, PCWSTR Data) +{ + return INF_SUCCESS(InfpAddField(Context, Data)); +} + +/* EOF */ From 6ebb4c8c3b2b36d0d1be2be4846a035c0e9aaad2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Apr 2010 18:36:15 +0000 Subject: [PATCH 195/261] [HOSTS] - Add a simple hosts file - Not used yet svn path=/trunk/; revision=47017 --- reactos/boot/bootdata/packages/reactos.dff | 1 + reactos/media/drivers/etc/etc.rbuild | 2 ++ reactos/media/drivers/etc/hosts | 3 +++ 3 files changed, 6 insertions(+) create mode 100644 reactos/media/drivers/etc/hosts diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index a4d4de2a79b..d87de7d4bf7 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -634,6 +634,7 @@ media\nls\c_28603.nls 1 media\nls\c_28604.nls 1 media\nls\c_28605.nls 1 media\nls\c_28606.nls 1 +media\drivers\etc\hosts 5 media\drivers\etc\services 5 media\inf\audio.inf 6 media\inf\acpi.inf 6 diff --git a/reactos/media/drivers/etc/etc.rbuild b/reactos/media/drivers/etc/etc.rbuild index 5302cc6ccd0..1ed562ed2ba 100644 --- a/reactos/media/drivers/etc/etc.rbuild +++ b/reactos/media/drivers/etc/etc.rbuild @@ -1,6 +1,8 @@ + hosts + hosts services services diff --git a/reactos/media/drivers/etc/hosts b/reactos/media/drivers/etc/hosts new file mode 100644 index 00000000000..f8352ba6721 --- /dev/null +++ b/reactos/media/drivers/etc/hosts @@ -0,0 +1,3 @@ +# ReactOS hosts file + +127.0.0.1 localhost From f995cc4ea6ad3ce7efc8509e26501a39d43156be Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 25 Apr 2010 19:20:59 +0000 Subject: [PATCH 196/261] [NEWINFLIB] - Use LANGID instead of LCID. - Move LANGID and language macros into the host typedefs header. - Remove dead code. svn path=/trunk/; revision=47018 --- reactos/include/host/typedefs.h | 6 ++++++ reactos/lib/newinflib/builddep.h | 6 ------ reactos/lib/newinflib/infget.c | 6 +++--- reactos/lib/newinflib/infhost.h | 4 ++-- reactos/lib/newinflib/infhostgen.c | 24 +++++------------------- reactos/lib/newinflib/infpriv.h | 2 +- reactos/lib/newinflib/infros.h | 4 ++-- reactos/lib/newinflib/infrosgen.c | 15 +++++---------- 8 files changed, 24 insertions(+), 43 deletions(-) diff --git a/reactos/include/host/typedefs.h b/reactos/include/host/typedefs.h index 42f30ed2294..07146c48220 100644 --- a/reactos/include/host/typedefs.h +++ b/reactos/include/host/typedefs.h @@ -65,6 +65,7 @@ typedef PVOID HANDLE, HKEY, *PHKEY; typedef INT NTSTATUS, POOL_TYPE; typedef LONG HRESULT; typedef ULONG_PTR SIZE_T, *PSIZE_T; +typedef WORD LANGID; #define MAXUSHORT USHRT_MAX @@ -232,6 +233,11 @@ typedef const UNICODE_STRING *PCUNICODE_STRING; #define RtlCopyMemory(Destination, Source, Length) memcpy(Destination, Source, Length) #define RtlMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length) +#define MAKELANGID(p,s) ((((WORD)(s))<<10)|(WORD)(p)) +#define PRIMARYLANGID(l) ((WORD)(l)&0x3ff) +#define SUBLANGID(l) ((WORD)(l)>>10) +#define SUBLANG_NEUTRAL 0x00 + /* Prevent inclusion of some other headers */ #define __INTERNAL_DEBUG #define RTL_H diff --git a/reactos/lib/newinflib/builddep.h b/reactos/lib/newinflib/builddep.h index c768a2ca88b..6930a7d597d 100644 --- a/reactos/lib/newinflib/builddep.h +++ b/reactos/lib/newinflib/builddep.h @@ -30,7 +30,6 @@ typedef char TCHAR, *PTCHAR, *PTSTR; typedef const TCHAR *PCTSTR; -typedef WORD LCID; #define _T(x) x #define _tcsicmp strcasecmp @@ -60,11 +59,6 @@ typedef WORD LCID; #define IS_TEXT_UNICODE_NOT_UNICODE_MASK 3840 #define IS_TEXT_UNICODE_NOT_ASCII_MASK 61440 -#define SUBLANG_NEUTRAL 0 -#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff) -#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD)(p)) - - #else /* ! defined(INFLIB_HOST) */ /* ReactOS definitions */ diff --git a/reactos/lib/newinflib/infget.c b/reactos/lib/newinflib/infget.c index 1cdbebf2ee5..4238f1ce0b5 100644 --- a/reactos/lib/newinflib/infget.c +++ b/reactos/lib/newinflib/infget.c @@ -46,11 +46,11 @@ InfpGetSubstitutionString(PINFCACHE Inf, DPRINT("Value name: %S\n", ValueName); - if (Inf->LocaleId != 0) + if (Inf->LanguageId != 0) { swprintf(StringLangId, L"Strings.%04hx", - Inf->LocaleId); + Inf->LanguageId); Status = InfpFindFirstLine(Inf, StringLangId, @@ -60,7 +60,7 @@ InfpGetSubstitutionString(PINFCACHE Inf, { swprintf(StringLangId, L"Strings.%04hx", - MAKELANGID(PRIMARYLANGID(Inf->LocaleId), SUBLANG_NEUTRAL)); + MAKELANGID(PRIMARYLANGID(Inf->LanguageId), SUBLANG_NEUTRAL)); Status = InfpFindFirstLine(Inf, StringLangId, diff --git a/reactos/lib/newinflib/infhost.h b/reactos/lib/newinflib/infhost.h index 6cdb37cbfa1..62403da83d8 100644 --- a/reactos/lib/newinflib/infhost.h +++ b/reactos/lib/newinflib/infhost.h @@ -23,11 +23,11 @@ extern BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); extern int InfHostOpenBufferedFile(PHINF InfHandle, void *Buffer, ULONG BufferSize, - LCID LocaleId, + LANGID LanguageId, ULONG *ErrorLine); extern int InfHostOpenFile(PHINF InfHandle, const CHAR *FileName, - LCID LocaleId, + LANGID LanguageId, ULONG *ErrorLine); extern int InfHostWriteFile(HINF InfHandle, const CHAR *FileName, diff --git a/reactos/lib/newinflib/infhostgen.c b/reactos/lib/newinflib/infhostgen.c index e5ad1b96e9b..e6269ff6318 100644 --- a/reactos/lib/newinflib/infhostgen.c +++ b/reactos/lib/newinflib/infhostgen.c @@ -20,7 +20,7 @@ int InfHostOpenBufferedFile(PHINF InfHandle, void *Buffer, ULONG BufferSize, - LCID LocaleId, + LANGID LanguageId, ULONG *ErrorLine) { INFSTATUS Status; @@ -59,8 +59,9 @@ InfHostOpenBufferedFile(PHINF InfHandle, ZEROMEMORY(Cache, sizeof(INFCACHE)); - Cache->LocaleId = LocaleId; + Cache->LanguageId = LanguageId; + /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferSize, NULL)) { // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; @@ -77,9 +78,6 @@ InfHostOpenBufferedFile(PHINF InfHandle, new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); if (new_buff != NULL) { -// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, -// FileBufferSize - offset, new_buff, FileBufferSize); - ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferSize * sizeof(WCHAR), @@ -111,11 +109,6 @@ InfHostOpenBufferedFile(PHINF InfHandle, ErrorLine); } - /* Parse the inf buffer */ -// Status = InfpParseBuffer (Cache, -// FileBuffer, -// FileBuffer + BufferSize, -// ErrorLine); if (!INF_SUCCESS(Status)) { FREE(Cache); @@ -134,7 +127,7 @@ InfHostOpenBufferedFile(PHINF InfHandle, int InfHostOpenFile(PHINF InfHandle, const CHAR *FileName, - LCID LocaleId, + LANGID LanguageId, ULONG *ErrorLine) { FILE *File; @@ -219,7 +212,7 @@ InfHostOpenFile(PHINF InfHandle, ZEROMEMORY(Cache, sizeof(INFCACHE)); - Cache->LocaleId = LocaleId; + Cache->LanguageId = LanguageId; /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferLength, NULL)) @@ -238,9 +231,6 @@ InfHostOpenFile(PHINF InfHandle, new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); if (new_buff != NULL) { -// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, -// FileLength - offset, new_buff, FileLength); - ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferLength * sizeof(WCHAR), @@ -273,10 +263,6 @@ InfHostOpenFile(PHINF InfHandle, ErrorLine); } -// Status = InfpParseBuffer (Cache, -// FileBuffer, -// FileBuffer + FileLength, -// ErrorLine); if (!INF_SUCCESS(Status)) { FREE(Cache); diff --git a/reactos/lib/newinflib/infpriv.h b/reactos/lib/newinflib/infpriv.h index 0d2cea94dc4..c7adededd5d 100644 --- a/reactos/lib/newinflib/infpriv.h +++ b/reactos/lib/newinflib/infpriv.h @@ -55,7 +55,7 @@ typedef struct _INFCACHESECTION typedef struct _INFCACHE { - LCID LocaleId; + LANGID LanguageId; PINFCACHESECTION FirstSection; PINFCACHESECTION LastSection; diff --git a/reactos/lib/newinflib/infros.h b/reactos/lib/newinflib/infros.h index c467af9f3fb..92dbc5133db 100644 --- a/reactos/lib/newinflib/infros.h +++ b/reactos/lib/newinflib/infros.h @@ -18,11 +18,11 @@ extern VOID InfSetHeap(PVOID Heap); extern NTSTATUS InfOpenBufferedFile(PHINF InfHandle, PVOID Buffer, ULONG BufferSize, - LCID LocaleId, + LANGID LanguageId, PULONG ErrorLine); extern NTSTATUS InfOpenFile(PHINF InfHandle, PUNICODE_STRING FileName, - LCID LocaleId, + LANGID LanguageId, PULONG ErrorLine); extern NTSTATUS InfWriteFile(HINF InfHandle, PUNICODE_STRING FileName, diff --git a/reactos/lib/newinflib/infrosgen.c b/reactos/lib/newinflib/infrosgen.c index 8ea53ae58d2..e994b28f030 100644 --- a/reactos/lib/newinflib/infrosgen.c +++ b/reactos/lib/newinflib/infrosgen.c @@ -51,7 +51,7 @@ NTSTATUS InfOpenBufferedFile(PHINF InfHandle, PVOID Buffer, ULONG BufferSize, - LCID LocaleId, + LANGID LanguageId, PULONG ErrorLine) { INFSTATUS Status; @@ -92,8 +92,9 @@ InfOpenBufferedFile(PHINF InfHandle, ZEROMEMORY(Cache, sizeof(INFCACHE)); - Cache->LocaleId = LocaleId; + Cache->LanguageId = LanguageId; + /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, FileBufferSize, NULL)) { // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; @@ -110,9 +111,6 @@ InfOpenBufferedFile(PHINF InfHandle, new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); if (new_buff != NULL) { -// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, -// FileBufferSize - offset, new_buff, FileBufferSize); - ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferSize * sizeof(WCHAR), @@ -162,7 +160,7 @@ InfOpenBufferedFile(PHINF InfHandle, NTSTATUS InfOpenFile(PHINF InfHandle, PUNICODE_STRING FileName, - LCID LocaleId, + LANGID LanguageId, PULONG ErrorLine) { OBJECT_ATTRIBUTES ObjectAttributes; @@ -267,7 +265,7 @@ InfOpenFile(PHINF InfHandle, ZEROMEMORY(Cache, sizeof(INFCACHE)); - Cache->LocaleId = LocaleId; + Cache->LanguageId = LanguageId; /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, FileBufferLength, NULL)) @@ -286,9 +284,6 @@ InfOpenFile(PHINF InfHandle, new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); if (new_buff != NULL) { -// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, -// FileLength - offset, new_buff, FileLength); - ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferLength * sizeof(WCHAR), From 318eee824181a5f963822eb2659a8e617d92f7d3 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 25 Apr 2010 19:54:57 +0000 Subject: [PATCH 197/261] [MKHIVE] - Use newinflib instead of inflib. - Add RegDeleteKeyW stub. - Convert registry generation code from ANSI APIs to UNICODE APIs. ATTENTION: This commit might break the build bot because it was not tested on a Linux system. svn path=/trunk/; revision=47019 --- reactos/tools/mkhive/mkhive.rbuild | 4 +- reactos/tools/mkhive/reginf.c | 106 ++++++++++++++--------------- reactos/tools/mkhive/registry.c | 35 +++++++--- 3 files changed, 82 insertions(+), 63 deletions(-) diff --git a/reactos/tools/mkhive/mkhive.rbuild b/reactos/tools/mkhive/mkhive.rbuild index c5d22dc1fbc..e4778b9d803 100644 --- a/reactos/tools/mkhive/mkhive.rbuild +++ b/reactos/tools/mkhive/mkhive.rbuild @@ -1,13 +1,13 @@ - . + . . . . -fshort-wchar - inflibhost + newinflibhost cmlibhost host_wcsfuncs binhive.c diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index dd8ac4596e0..e8a1a2e7da3 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -51,34 +51,34 @@ /* FUNCTIONS ****************************************************************/ static BOOL -GetRootKey (PCHAR Name) +GetRootKey (PWCHAR Name) { - if (!strcasecmp (Name, "HKCR")) + if (!wcsicmp (Name, L"HKCR")) { - strcpy (Name, "\\Registry\\Machine\\SOFTWARE\\Classes\\"); + wcscpy (Name, L"\\Registry\\Machine\\SOFTWARE\\Classes\\"); return TRUE; } - if (!strcasecmp (Name, "HKCU")) + if (!wcsicmp (Name, L"HKCU")) { - strcpy (Name, "\\Registry\\User\\.DEFAULT\\"); + wcscpy (Name, L"\\Registry\\User\\.DEFAULT\\"); return TRUE; } - if (!strcasecmp (Name, "HKLM")) + if (!wcsicmp (Name, L"HKLM")) { - strcpy (Name, "\\Registry\\Machine\\"); + wcscpy (Name, L"\\Registry\\Machine\\"); return TRUE; } - if (!strcasecmp (Name, "HKU")) + if (!wcsicmp (Name, L"HKU")) { - strcpy (Name, "\\Registry\\User\\"); + wcscpy (Name, L"\\Registry\\User\\"); return TRUE; } #if 0 - if (!strcasecmp (Name, "HKR")) + if (!wcsicmp (Name, L"HKR")) return FALSE; #endif @@ -94,19 +94,19 @@ GetRootKey (PCHAR Name) static VOID AppendMultiSzValue ( IN HKEY KeyHandle, - IN PCHAR ValueName, - IN PCHAR Strings, + IN PWCHAR ValueName, + IN PWCHAR Strings, IN SIZE_T StringSize) { SIZE_T Size; ULONG Type; size_t Total; - PCHAR Buffer; - PCHAR p; + PWCHAR Buffer; + PWCHAR p; size_t len; LONG Error; - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -117,11 +117,11 @@ AppendMultiSzValue ( (Type != REG_MULTI_SZ)) return; - Buffer = malloc (Size + StringSize); + Buffer = malloc (Size + (StringSize * sizeof(WCHAR))); if (Buffer == NULL) return; - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -135,25 +135,25 @@ AppendMultiSzValue ( Total = Size; while (*Strings != 0) { - len = strlen (Strings) + 1; + len = wcslen (Strings) + 1; - for (p = Buffer; *p != 0; p += strlen (p) + 1) - if (!strcasecmp (p, Strings)) + for (p = Buffer; *p != 0; p += wcslen (p) + 1) + if (!wcsicmp (p, Strings)) break; if (*p == 0) /* not found, need to append it */ { - memcpy (p, Strings, len); + memcpy (p, Strings, len * sizeof(WCHAR)); p[len] = 0; - Total += len; + Total += len * sizeof(WCHAR); } Strings += len; } if (Total != Size) { - DPRINT ("setting value %s to %s\n", ValueName, Buffer); - RegSetValueExA ( + DPRINT ("setting value %S to %S\n", ValueName, Buffer); + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -175,11 +175,11 @@ done: static BOOL do_reg_operation( IN HKEY KeyHandle, - IN PCHAR ValueName, + IN PWCHAR ValueName, IN PINFCONTEXT Context, IN ULONG Flags) { - CHAR EmptyStr = (CHAR)0; + WCHAR EmptyStr = (WCHAR)0; ULONG Type; ULONG Size; LONG Error; @@ -188,11 +188,11 @@ do_reg_operation( { if (ValueName) { - RegDeleteValueA (KeyHandle, ValueName); + RegDeleteValueW (KeyHandle, ValueName); } else { - RegDeleteKeyA (KeyHandle, NULL); + RegDeleteKeyW (KeyHandle, NULL); } return TRUE; @@ -203,7 +203,7 @@ do_reg_operation( if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY)) { - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -253,7 +253,7 @@ do_reg_operation( if (!(Flags & FLG_ADDREG_BINVALUETYPE) || (Type == REG_DWORD && InfHostGetFieldCount (Context) == 5)) { - PCHAR Str = NULL; + WCHAR *Str = NULL; if (Type == REG_MULTI_SZ) { @@ -262,7 +262,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size); + Str = malloc (Size * sizeof(WCHAR)); if (Str == NULL) return FALSE; @@ -292,7 +292,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size); + Str = malloc (Size * sizeof(WCHAR)); if (Str == NULL) return FALSE; @@ -302,11 +302,11 @@ do_reg_operation( if (Type == REG_DWORD) { - ULONG dw = Str ? strtoul (Str, NULL, 0) : 0; + ULONG dw = Str ? wcstoul (Str, NULL, 0) : 0; - DPRINT("setting dword %s to %x\n", ValueName, dw); + DPRINT("setting dword %S to %x\n", ValueName, dw); - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -316,27 +316,27 @@ do_reg_operation( } else { - DPRINT("setting value %s to %s\n", ValueName, Str); + DPRINT("setting value %S to %S\n", ValueName, Str); if (Str) { - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, Type, (PVOID)Str, - (ULONG)Size); + (ULONG)Size * sizeof(WCHAR)); } else { - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, Type, (PVOID)&EmptyStr, - (ULONG)sizeof(CHAR)); + (ULONG)sizeof(WCHAR)); } } free (Str); @@ -358,7 +358,7 @@ do_reg_operation( InfHostGetBinaryField (Context, 5, Data, Size, NULL); } - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -378,10 +378,10 @@ do_reg_operation( * Called once for each AddReg and DelReg entry in a given section. */ static BOOL -registry_callback (HINF hInf, PCHAR Section, BOOL Delete) +registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) { - CHAR Buffer[MAX_INF_STRING_LENGTH]; - PCHAR ValuePtr; + WCHAR Buffer[MAX_INF_STRING_LENGTH]; + PWCHAR ValuePtr; ULONG Flags; size_t Length; @@ -403,11 +403,11 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) continue; /* get key */ - Length = strlen (Buffer); + Length = wcslen (Buffer); if (InfHostGetStringField (Context, 2, Buffer + Length, MAX_INF_STRING_LENGTH - (ULONG)Length, NULL) != 0) *Buffer = 0; - DPRINT("KeyName: <%s>\n", Buffer); + DPRINT("KeyName: <%S>\n", Buffer); if (Delete) { @@ -424,17 +424,17 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) if (Delete || (Flags & FLG_ADDREG_OVERWRITEONLY)) { - if (RegOpenKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegOpenKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegOpenKey(%s) failed\n", Buffer); + DPRINT("RegOpenKey(%S) failed\n", Buffer); continue; /* ignore if it doesn't exist */ } } else { - if (RegCreateKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegCreateKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegCreateKey(%s) failed\n", Buffer); + DPRINT("RegCreateKey(%S) failed\n", Buffer); continue; } } @@ -469,18 +469,18 @@ ImportRegistryFile(PCHAR FileName) ULONG ErrorLine; /* Load inf file from install media. */ - if (InfHostOpenFile(&hInf, FileName, &ErrorLine) != 0) + if (InfHostOpenFile(&hInf, FileName, 0, &ErrorLine) != 0) { DPRINT1 ("InfHostOpenFile(%s) failed\n", FileName); return FALSE; } - if (!registry_callback (hInf, "DelReg", TRUE)) + if (!registry_callback (hInf, L"DelReg", TRUE)) { DPRINT1 ("registry_callback() for DelReg failed\n"); } - if (!registry_callback (hInf, "AddReg", FALSE)) + if (!registry_callback (hInf, L"AddReg", FALSE)) { DPRINT1 ("registry_callback() for AddReg failed\n"); } diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index 3bd2c9efe60..e182596e23b 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -25,9 +25,9 @@ /* * TODO: - * - Implement RegDeleteKey() + * - Implement RegDeleteKeyW() * - Implement RegEnumValue() - * - Implement RegQueryValueExA() + * - Implement RegQueryValueExW() */ #include @@ -246,15 +246,34 @@ RegCreateKeyA( } LONG WINAPI -RegDeleteKeyA(HKEY Key, - LPCSTR Name) +RegDeleteKeyW(IN HKEY hKey, + IN LPCWSTR lpSubKey) { - if (Name != NULL && strchr(Name, '\\') != NULL) - return(ERROR_INVALID_PARAMETER); + if (lpSubKey != NULL && wcschr(lpSubKey, L'\\') != NULL) + return(ERROR_INVALID_PARAMETER); - DPRINT1("FIXME!\n"); + DPRINT1("RegDeleteKeyW: FIXME!\n"); - return(ERROR_SUCCESS); + return(ERROR_SUCCESS); +} + +LONG WINAPI +RegDeleteKeyA(IN HKEY hKey, + IN LPCSTR lpSubKey) +{ + PWSTR lpSubKeyW; + LONG rc; + + if (lpSubKey != NULL && strchr(lpSubKey, '\\') != NULL) + return(ERROR_INVALID_PARAMETER); + + lpSubKeyW = MultiByteToWideChar(lpSubKey); + if (!lpSubKeyW) + return ERROR_OUTOFMEMORY; + + rc = RegDeleteKeyW(hKey, lpSubKeyW); + free(lpSubKeyW); + return rc; } LONG WINAPI From 98acf217f995a957ad319406780e5825fdcf20d9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Apr 2010 20:01:59 +0000 Subject: [PATCH 198/261] [WS2_32] - Add support for reading the hosts file - Fix an off-by-one error which prevented reading the last value in the services file - Fixes bug 4410 and bug 4880 svn path=/trunk/; revision=47020 --- reactos/dll/win32/ws2_32/misc/ns.c | 203 ++++++++++++++++++++++++++++- 1 file changed, 201 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/ws2_32/misc/ns.c b/reactos/dll/win32/ws2_32/misc/ns.c index bb89eadfb0d..fee4f032868 100644 --- a/reactos/dll/win32/ws2_32/misc/ns.c +++ b/reactos/dll/win32/ws2_32/misc/ns.c @@ -640,7 +640,199 @@ void free_servent(struct servent* s) HFREE(s); } +/* This function is far from perfect but it works enough */ +static +LPHOSTENT +FindEntryInHosts(IN CONST CHAR FAR* name) +{ + BOOL Found = FALSE; + HANDLE HostsFile; + CHAR HostsDBData[BUFSIZ] = { 0 }; + PCHAR SystemDirectory = HostsDBData; + PCHAR HostsLocation = "\\drivers\\etc\\hosts"; + PCHAR AddressStr, DnsName = NULL, AddrTerm, NameSt, NextLine, ThisLine, Comment; + UINT SystemDirSize = sizeof(HostsDBData) - 1, ValidData = 0; + DWORD ReadSize; + ULONG Address; + PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData; + /* We assume that the parameters are valid */ + + if (!GetSystemDirectoryA(SystemDirectory, SystemDirSize)) + { + WSASetLastError(WSANO_RECOVERY); + WS_DbgPrint(MIN_TRACE, ("Could not get windows system directory.\n")); + return NULL; /* Can't get system directory */ + } + + strncat(SystemDirectory, + HostsLocation, + SystemDirSize ); + + HostsFile = CreateFileA(SystemDirectory, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, + NULL); + if (HostsFile == INVALID_HANDLE_VALUE) + { + WSASetLastError(WSANO_RECOVERY); + return NULL; + } + + while(!Found && + ReadFile(HostsFile, + HostsDBData + ValidData, + sizeof(HostsDBData) - ValidData, + &ReadSize, + NULL)) + { + ValidData += ReadSize; + ReadSize = 0; + NextLine = ThisLine = HostsDBData; + + /* Find the beginning of the next line */ + while(NextLine < HostsDBData + ValidData && + *NextLine != '\r' && *NextLine != '\n' ) + { + NextLine++; + } + + /* Zero and skip, so we can treat what we have as a string */ + if( NextLine > HostsDBData + ValidData ) + break; + + *NextLine = 0; NextLine++; + + Comment = strchr( ThisLine, '#' ); + if( Comment ) *Comment = 0; /* Terminate at comment start */ + + AddressStr = ThisLine; + /* Find the first space separating the IP address from the DNS name */ + AddrTerm = strchr(ThisLine, ' '); + if (AddrTerm) + { + /* Terminate the address string */ + *AddrTerm = 0; + + /* Find the last space before the DNS name */ + NameSt = strrchr(ThisLine, ' '); + + /* If there is only one space (the one we removed above), then just use the address terminator */ + if (!NameSt) + NameSt = AddrTerm; + + /* Move from the space to the first character of the DNS name */ + NameSt++; + + DnsName = NameSt; + + if (!strcmp(name, DnsName)) + { + Found = TRUE; + break; + } + } + + /* Get rid of everything we read so far */ + while( NextLine <= HostsDBData + ValidData && + isspace (*NextLine)) + { + NextLine++; + } + + if (HostsDBData + ValidData - NextLine <= 0) + break; + + WS_DbgPrint(MAX_TRACE,("About to move %d chars\n", + HostsDBData + ValidData - NextLine)); + + memmove(HostsDBData, + NextLine, + HostsDBData + ValidData - NextLine ); + ValidData -= NextLine - HostsDBData; + WS_DbgPrint(MAX_TRACE,("Valid bytes: %d\n", ValidData)); + } + + CloseHandle(HostsFile); + + if (!Found) + { + WS_DbgPrint(MAX_TRACE,("Not found\n")); + WSASetLastError(WSANO_DATA); + return NULL; + } + + if( !p->Hostent ) + { + p->Hostent = HeapAlloc(GlobalHeap, 0, sizeof(*p->Hostent)); + if( !p->Hostent ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + } + + p->Hostent->h_name = HeapAlloc(GlobalHeap, 0, strlen(DnsName)); + if( !p->Hostent->h_name ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + + RtlCopyMemory(p->Hostent->h_name, + DnsName, + strlen(DnsName)); + + p->Hostent->h_aliases = HeapAlloc(GlobalHeap, 0, sizeof(char *)); + if( !p->Hostent->h_aliases ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + + p->Hostent->h_aliases[0] = 0; + + if (strstr(AddressStr, ":")) + { + DbgPrint("AF_INET6 NOT SUPPORTED!\n"); + WSASetLastError(WSAEINVAL); + return NULL; + } + else + p->Hostent->h_addrtype = AF_INET; + + p->Hostent->h_addr_list = HeapAlloc(GlobalHeap, 0, sizeof(char *)); + if( !p->Hostent->h_addr_list ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + + Address = inet_addr(AddressStr); + if (Address == INADDR_NONE) + { + WSASetLastError(WSAEINVAL); + return NULL; + } + + p->Hostent->h_addr_list[0] = HeapAlloc(GlobalHeap, 0, sizeof(Address)); + if( !p->Hostent->h_addr_list[0] ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + + RtlCopyMemory(p->Hostent->h_addr_list[0], + &Address, + sizeof(Address)); + + p->Hostent->h_length = sizeof(Address); + + return p->Hostent; +} LPHOSTENT EXPORT @@ -661,6 +853,7 @@ gethostbyname(IN CONST CHAR FAR* name) /* include/WinDNS.h -- look up DNS_RECORD on MSDN */ PDNS_RECORD dp = 0; PWINSOCK_THREAD_BLOCK p; + LPHOSTENT Hostent; addr = GH_INVALID; @@ -726,6 +919,12 @@ gethostbyname(IN CONST CHAR FAR* name) case GH_RFC1123_DNS: /* DNS_TYPE_A: include/WinDNS.h */ /* DnsQuery -- lib/dnsapi/dnsapi/query.c */ + + /* Look for the DNS name in the hosts file */ + Hostent = FindEntryInHosts(name); + if (Hostent) + return Hostent; + dns_status = DnsQuery_A(name, DNS_TYPE_A, DNS_QUERY_STANDARD, @@ -993,7 +1192,7 @@ getservbyname(IN CONST CHAR FAR* name, } /* Zero and skip, so we can treat what we have as a string */ - if( NextLine >= ServiceDBData + ValidData ) + if( NextLine > ServiceDBData + ValidData ) break; *NextLine = 0; NextLine++; @@ -1174,7 +1373,7 @@ getservbyport(IN INT port, *NextLine != '\r' && *NextLine != '\n' ) NextLine++; /* Zero and skip, so we can treat what we have as a string */ - if( NextLine >= ServiceDBData + ValidData ) + if( NextLine > ServiceDBData + ValidData ) break; *NextLine = 0; NextLine++; From 3bb199b69278113a93fa4ea5589bb7cd601e8dfd Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 25 Apr 2010 20:26:37 +0000 Subject: [PATCH 199/261] [MKHIVE] wcsicmp -> _wcsicmp, should fix buildbot build svn path=/trunk/; revision=47021 --- reactos/tools/mkhive/reginf.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index e8a1a2e7da3..cdf0c5b2c95 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -53,32 +53,32 @@ static BOOL GetRootKey (PWCHAR Name) { - if (!wcsicmp (Name, L"HKCR")) + if (!_wcsicmp (Name, L"HKCR")) { wcscpy (Name, L"\\Registry\\Machine\\SOFTWARE\\Classes\\"); return TRUE; } - if (!wcsicmp (Name, L"HKCU")) + if (!_wcsicmp (Name, L"HKCU")) { wcscpy (Name, L"\\Registry\\User\\.DEFAULT\\"); return TRUE; } - if (!wcsicmp (Name, L"HKLM")) + if (!_wcsicmp (Name, L"HKLM")) { wcscpy (Name, L"\\Registry\\Machine\\"); return TRUE; } - if (!wcsicmp (Name, L"HKU")) + if (!_wcsicmp (Name, L"HKU")) { wcscpy (Name, L"\\Registry\\User\\"); return TRUE; } #if 0 - if (!wcsicmp (Name, L"HKR")) + if (!_wcsicmp (Name, L"HKR")) return FALSE; #endif @@ -138,7 +138,7 @@ AppendMultiSzValue ( len = wcslen (Strings) + 1; for (p = Buffer; *p != 0; p += wcslen (p) + 1) - if (!wcsicmp (p, Strings)) + if (!_wcsicmp (p, Strings)) break; if (*p == 0) /* not found, need to append it */ From 79b5a24bd4a5159e266968e34ec814283e2d7c42 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 25 Apr 2010 20:49:29 +0000 Subject: [PATCH 200/261] [MKHIVE] Fix a buggy format string (%s --> %S). Add _wcsicmp to rtl.c. svn path=/trunk/; revision=47022 --- reactos/tools/mkhive/reginf.c | 2 +- reactos/tools/mkhive/rtl.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index cdf0c5b2c95..9e03c08c668 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -354,7 +354,7 @@ do_reg_operation( if (Data == NULL) return FALSE; - DPRINT("setting binary data %s len %d\n", ValueName, Size); + DPRINT("setting binary data %S len %d\n", ValueName, Size); InfHostGetBinaryField (Context, 5, Data, Size, NULL); } diff --git a/reactos/tools/mkhive/rtl.c b/reactos/tools/mkhive/rtl.c index e9ed22b66e0..a68d7a0672c 100644 --- a/reactos/tools/mkhive/rtl.c +++ b/reactos/tools/mkhive/rtl.c @@ -207,3 +207,32 @@ unsigned char BitScanReverse(ULONG * const Index, unsigned long Mask) } return Mask ? 1 : 0; } + +#undef tolower +WCHAR towlower(WCHAR ch) +{ + if (ch < L'A') + { + return ch; + } + else if (ch <= L'Z') + { + return ch + (L'a' - L'A'); + } + + return ch; +} + +int _wcsicmp(PCWSTR cs, PCWSTR ct) +{ + while (towlower(*cs) == towlower(*ct)) + { + if (*cs == 0) + return 0; + + cs++; + ct++; + } + + return towlower(*cs) - towlower(*ct); +} From fd9406974e79efb24e13d775a8e040f069fbef9f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Apr 2010 20:51:07 +0000 Subject: [PATCH 201/261] [AFD] - Add some sanity checks svn path=/trunk/; revision=47023 --- reactos/drivers/network/afd/afd/lock.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index 7605f8d0774..dcc4f24089a 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -17,6 +17,10 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) { BOOLEAN LockFailed = FALSE; + ASSERT(IrpSp->Parameters.DeviceIoControl.Type3InputBuffer); + ASSERT(IrpSp->Parameters.DeviceIoControl.InputBufferLength); + ASSERT(!Irp->MdlAddress); + Irp->MdlAddress = IoAllocateMdl( IrpSp->Parameters.DeviceIoControl.Type3InputBuffer, IrpSp->Parameters.DeviceIoControl.InputBufferLength, From 9bab4055b3d31a433ac5adee7b606f9caa90a79c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Apr 2010 21:00:04 +0000 Subject: [PATCH 202/261] [OSKITTCP] - Add a sanity check - Dedicated to Caemyr svn path=/trunk/; revision=47024 --- reactos/lib/drivers/oskittcp/oskittcp/osenv.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/lib/drivers/oskittcp/oskittcp/osenv.c b/reactos/lib/drivers/oskittcp/oskittcp/osenv.c index d29fa5fa239..aa8d246c63f 100644 --- a/reactos/lib/drivers/oskittcp/oskittcp/osenv.c +++ b/reactos/lib/drivers/oskittcp/oskittcp/osenv.c @@ -41,5 +41,10 @@ void* oskit_bufio_create(int len) } void oskit_bufio_map(void *srcbuf, void**dstbuf, int off, int len) { +#if DBG + if (off != 0) + panic("oskit_bufio_map: offset is non-zero"); +#endif + *dstbuf = srcbuf; } From 89a4d76d9de4304bf27b54a1737790a317ce42d7 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 26 Apr 2010 00:41:09 +0000 Subject: [PATCH 203/261] [STRSAFE] Add strsafe.h from amd64 branch. svn path=/trunk/; revision=47026 --- reactos/include/psdk/strsafe.h | 626 +++++++++++++++++++++++++++++++++ 1 file changed, 626 insertions(+) create mode 100644 reactos/include/psdk/strsafe.h diff --git a/reactos/include/psdk/strsafe.h b/reactos/include/psdk/strsafe.h new file mode 100644 index 00000000000..7f09e1bd0fe --- /dev/null +++ b/reactos/include/psdk/strsafe.h @@ -0,0 +1,626 @@ +#ifndef __STRSAFE_H_ +#define __STRSAFE_H_ + +#include +#include + +#if defined(STRSAFE_NO_CCH_FUNCTIONS) && defined(STRSAFE_NO_CB_FUNCTIONS) +#error Both STRSAFE_NO_CCH_FUNCTIONS and STRSAFE_NO_CB_FUNCTIONS are defined +#endif + +#ifndef SUCCEEDED +#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0) +#endif +#define STRSAFE_MAX_CCH 2147483647 +#define STRSAFE_E_INVALID_PARAMETER ((HRESULT)0x80070057L) +#define STRSAFE_E_INSUFFICIENT_BUFFER ((HRESULT)0x8007007AL) +#define STRSAFE_E_END_OF_FILE ((HRESULT)0x80070026L) + +#define STRSAFE_FILL_BEHIND_NULL 0x00000200 +#define STRSAFE_IGNORE_NULLS 0x00000200 +#define STRSAFE_FILL_ON_FAILURE 0x00000400 +#define STRSAFE_NULL_ON_FAILURE 0x00000800 +#define STRSAFE_NO_TRUNCATION 0x00001000 + +#ifndef S_OK +#define S_OK ((HRESULT)0x00000000L) +#endif + +#define STRSAFE_MIN(a,b) (((a) < (b))?(a):(b)) + +#ifndef _HRESULT_DEFINED +#define _HRESULT_DEFINED +typedef long HRESULT; +#endif + +typedef char * STRSAFE_LPSTR; +typedef const char * STRSAFE_LPCSTR; +typedef wchar_t * STRSAFE_LPWSTR; +typedef const wchar_t * STRSAFE_LPCWSTR; +typedef unsigned long STRSAFE_DWORD; + +#define STRSAFE_PASS2 + +/* Implement Cb functions for ansi and unicode */ +#ifndef STRSAFE_NO_CB_FUNCTIONS +#define STRSAFE_CB +#define STRSAFE_UNICODE 0 +# include +#undef STRSAFE_UNICODE +#define STRSAFE_UNICODE 1 +# include +#undef STRSAFE_UNICODE +#undef STRSAFE_CB +#endif // !STRSAFE_NO_CB_FUNCTIONS + +/* Implement Cch functions for ansi and unicode */ +#ifndef STRSAFE_NO_CCH_FUNCTIONS +#define STRSAFE_UNICODE 0 +# include +#undef STRSAFE_UNICODE +#define STRSAFE_UNICODE 1 +# include +#undef STRSAFE_UNICODE +#endif // !STRSAFE_NO_CCH_FUNCTIONS + +#undef STRSAFE_PASS2 + +/* Now define the functions depending on UNICODE */ +#if defined(UNICODE) +# define STRSAFE_UNICODE 1 +#else +# define STRSAFE_UNICODE 0 +#endif +#include +#undef STRSAFE_UNICODE + +#endif // !__STRSAFE_H_ + +/*****************************************************************************/ + +#if defined(STRSAFE_UNICODE) +#if (STRSAFE_UNICODE == 1) + +#define STRSAFE_LPTSTR STRSAFE_LPWSTR +#define STRSAFE_LPCTSTR STRSAFE_LPCWSTR +#define STRSAFE_TCHAR wchar_t + +#define StringCbCat StringCbCatW +#define StringCbCatEx StringCbCatExW +#define StringCbCatN StringCbCatNW +#define StringCbCatNEx StringCbCatNExW +#define StringCbCatWorker StringCxxCatWorkerW +#define StringCbCopy StringCbCopyW +#define StringCbCopyEx StringCbCopyExW +#define StringCbCopyN StringCbCopyNW +#define StringCbCopyNEx StringCbCopyNExW +#define StringCbGets StringCbGetsW +#define StringCbGetsEx StringCbGetsExW +#define StringCbLength StringCbLengthW +#define StringCbPrintf StringCbPrintfW +#define StringCbPrintfEx StringCbPrintfExW +#define StringCbVPrintf StringCbVPrintfW +#define StringCbVPrintfEx StringCbVPrintfExW +#define StringCchCat StringCchCatW +#define StringCchCatEx StringCchCatExW +#define StringCchCatN StringCchCatNW +#define StringCchCatNEx StringCchCatNExW +#define StringCchCatWorker StringCchCatWorkerW +#define StringCchCopy StringCchCopyW +#define StringCchCopyEx StringCchCopyExW +#define StringCchCopyN StringCchCopyNW +#define StringCchCopyNEx StringCchCopyNExW +#define StringCchGets StringCchGetsW +#define StringCchGetsEx StringCchGetsExW +#define StringCchLength StringCchLengthW +#define StringCchPrintf StringCchPrintfW +#define StringCchPrintfEx StringCchPrintfExW +#define StringCchVPrintf StringCchVPrintfW +#define StringCchVPrintfEx StringCchVPrintfExW +#define _vsnprintfAW _vsnwprintf + +#else // (STRSAFE_UNICODE != 1) + +#define STRSAFE_LPTSTR STRSAFE_LPSTR +#define STRSAFE_LPCTSTR STRSAFE_LPCSTR +#define STRSAFE_TCHAR char + +#define StringCbCat StringCbCatA +#define StringCbCatEx StringCbCatExA +#define StringCbCatN StringCbCatNA +#define StringCbCatNEx StringCbCatNExA +#define StringCbCatWorker StringCxxCatWorkerA +#define StringCbCopy StringCbCopyA +#define StringCbCopyEx StringCbCopyExA +#define StringCbCopyN StringCbCopyNA +#define StringCbCopyNEx StringCbCopyNExA +#define StringCbGets StringCbGetsA +#define StringCbGetsEx StringCbGetsExA +#define StringCbLength StringCbLengthA +#define StringCbPrintf StringCbPrintfA +#define StringCbPrintfEx StringCbPrintfExA +#define StringCbVPrintf StringCbVPrintfA +#define StringCbVPrintfEx StringCbVPrintfExA +#define StringCchCat StringCchCatA +#define StringCchCatEx StringCchCatExA +#define StringCchCatN StringCchCatNA +#define StringCchCatNEx StringCchCatNExA +#define StringCchCatWorker StringCchCatWorkerA +#define StringCchCopy StringCchCopyA +#define StringCchCopyEx StringCchCopyExA +#define StringCchCopyN StringCchCopyNA +#define StringCchCopyNEx StringCchCopyNExA +#define StringCchGets StringCchGetsA +#define StringCchGetsEx StringCchGetsExA +#define StringCchLength StringCchLengthA +#define StringCchPrintf StringCchPrintfA +#define StringCchPrintfEx StringCchPrintfExA +#define StringCchVPrintf StringCchVPrintfA +#define StringCchVPrintfEx StringCchVPrintfExA +#define _vsnprintfAW _vsnprintf + +#endif // (STRSAFE_UNICODE != 1) +#endif // defined(STRSAFE_UNICODE) + +/*****************************************************************************/ + +#if defined (STRSAFE_PASS2) + +#if defined(STRSAFE_CB) + +#define STRSAFE_CXXtoCB(x) (x) +#define STRSAFE_CBtoCXX(x) (x) +#define STRSAFE_CXXtoCCH(x) (x)/sizeof(STRSAFE_TCHAR) +#define STRSAFE_CCHtoCXX(x) (x)*sizeof(STRSAFE_TCHAR) +#define StringCxxCat StringCbCat +#define StringCxxCatEx StringCbCatEx +#define StringCxxCatN StringCbCatN +#define StringCxxCatNEx StringCbCatNEx +#define StringCxxCatWorker StringCbCatWorker +#define StringCxxCopy StringCbCopy +#define StringCxxCopyEx StringCbCopyEx +#define StringCxxCopyN StringCbCopyN +#define StringCxxCopyNEx StringCbCopyNEx +#define StringCxxGets StringCbGets +#define StringCxxGetsEx StringCbGetsEx +#define StringCxxLength StringCbLength +#define StringCxxPrintf StringCbPrintf +#define StringCxxPrintfEx StringCbPrintfEx +#define StringCxxVPrintf StringCbVPrintf +#define StringCxxVPrintfEx StringCbVPrintfEx + +#else // !STRSAFE_CB + +#define STRSAFE_CXXtoCB(x) (x)*sizeof(STRSAFE_TCHAR) +#define STRSAFE_CBtoCXX(x) (x)/sizeof(STRSAFE_TCHAR) +#define STRSAFE_CXXtoCCH(x) (x) +#define STRSAFE_CCHtoCXX(x) (x) +#define StringCxxCat StringCchCat +#define StringCxxCatEx StringCchCatEx +#define StringCxxCatN StringCchCatN +#define StringCxxCatNEx StringCchCatNEx +#define StringCxxCatWorker StringCchCatWorker +#define StringCxxCopy StringCchCopy +#define StringCxxCopyEx StringCchCopyEx +#define StringCxxCopyN StringCchCopyN +#define StringCxxCopyNEx StringCchCopyNEx +#define StringCxxGets StringCchGets +#define StringCxxGetsEx StringCchGetsEx +#define StringCxxLength StringCchLength +#define StringCxxPrintf StringCchPrintf +#define StringCxxPrintfEx StringCchPrintfEx +#define StringCxxVPrintf StringCchVPrintf +#define StringCxxVPrintfEx StringCchVPrintfEx + +#endif // !STRSAFE_CB + +#ifdef STRSAFE_LIB + +/* Normal function prototypes only */ +#define STRSAFEAPI HRESULT __stdcall + +STRSAFEAPI StringCxxCat(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc); +STRSAFEAPI StringCxxCatEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxCatN(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbMaxAppend); +STRSAFEAPI StringCxxCatNEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbMaxAppend, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxCopy(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc); +STRSAFEAPI StringCxxCopyEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxCopyN(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbSrc); +STRSAFEAPI StringCxxCopyNEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxGets(STRSAFE_LPTSTR pszDest, size_t cxDest); +STRSAFEAPI StringCxxGetsEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxLength(STRSAFE_LPCTSTR psz, size_t cxMax, size_t *pcb); +STRSAFEAPI StringCxxPrintf(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszFormat, ...); +STRSAFEAPI StringCxxPrintfEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCTSTR pszFormat, ...); +STRSAFEAPI StringCxxVPrintf(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszFormat, va_list args); +STRSAFEAPI StringCxxVPrintfEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags, LPCTSTR pszFormat, va_list args); + +#else // !STRSAFE_LIB + +/* Create inlined versions */ +#define STRSAFEAPI HRESULT static __inline__ + +#define STRSAFE_MAX_CXX STRSAFE_CCHtoCXX(STRSAFE_MAX_CCH) + +STRSAFEAPI +StringCxxCatWorker( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc, + size_t cxMaxAppend, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags, + int UseN) +{ + HRESULT result; + STRSAFE_LPTSTR psz = pszDest; + size_t cch = STRSAFE_CXXtoCCH(cxDest); + + if (!pszDest || !pszSrc || cxDest > STRSAFE_MAX_CXX || cxDest == 0) + { + return STRSAFE_E_INVALID_PARAMETER; + } + + for (--psz; *(++psz) != 0 && --cch > 0;); + if (cch == 0) + { + return STRSAFE_E_INSUFFICIENT_BUFFER; + } + + if (UseN) + { + cch = STRSAFE_MIN(cxDest, STRSAFE_CXXtoCCH(cxMaxAppend)); + } + + for (--pszSrc, --psz; (*(++psz) = *(++pszSrc)) != 0 && --cch > 0;); + if (cch == 0) + { + result = STRSAFE_E_INSUFFICIENT_BUFFER; + } + else + result = S_OK; + + if (ppszDestEnd) + { + *ppszDestEnd = psz; + } + + if (pcbRemaining) + { + *pcbRemaining = STRSAFE_CCHtoCXX(cch); + } + + if (dwFlags & STRSAFE_FILL_BEHIND_NULL) + { + for (--psz, ++cch; --cch; *(++psz) = dwFlags & 0xff); + } + + if (!SUCCEEDED(result)) + { + if (dwFlags & STRSAFE_FILL_ON_FAILURE) + { + cch = STRSAFE_CXXtoCCH(cxDest); + for (--pszDest, ++cch; --cch; *(++pszDest) = dwFlags & 0xff); + } + + if (dwFlags & STRSAFE_NULL_ON_FAILURE) + { + *pszDest = 0; + } + } + + return result; +} + +STRSAFEAPI +StringCxxCatEx( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return StringCxxCatWorker(pszDest, cxDest, pszSrc, 0, ppszDestEnd, pcbRemaining, dwFlags, 0); +} + +STRSAFEAPI +StringCxxCat( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc) +{ + return StringCxxCatWorker(pszDest, cxDest, pszSrc, 0, NULL, NULL, 0, 0); +} + +STRSAFEAPI +StringCxxCatN( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc, + size_t cbMaxAppend) +{ + return StringCxxCatWorker(pszDest, cxDest, pszSrc, cbMaxAppend, NULL, NULL, 0, 1); +} + +STRSAFEAPI +StringCxxCatNEx( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc, + size_t cbMaxAppend, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return StringCxxCatWorker(pszDest, cxDest, pszSrc, cbMaxAppend, ppszDestEnd, pcbRemaining, dwFlags, 1); +} + +STRSAFEAPI +StringCxxCopy( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPCTSTR pszSrc) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxCopyEx( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPCTSTR pszSrc, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxCopyN( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPCTSTR pszSrc, + size_t cbSrc) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxCopyNEx( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPCTSTR pszSrc, + size_t cbSrc, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxGets( + STRSAFE_LPTSTR pszDest, + size_t cbDest) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxGetsEx( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxLength( + STRSAFE_LPCTSTR psz, + size_t cxMax, + size_t *pcx) +{ + size_t cch = STRSAFE_CXXtoCCH(cxMax); + + /* Default return on error */ + if (pcx) + *pcx = 0; + + if (!psz || cxMax > STRSAFE_MAX_CXX || cxMax == 0) + { + return STRSAFE_E_INVALID_PARAMETER; + } + + for (--psz; *(++psz) != 0 && --cch > 0;); + + if (cch == 0) + { + return STRSAFE_E_INVALID_PARAMETER; + } + + if (pcx) + *pcx = cxMax - STRSAFE_CCHtoCXX(cch); + + return S_OK; +} + +STRSAFEAPI +StringCxxVPrintfEx( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcxRemaining, + STRSAFE_DWORD dwFlags, + STRSAFE_LPCTSTR pszFormat, + va_list args) +{ + size_t cchDest = STRSAFE_CXXtoCCH(cxDest); + size_t cchMax = cchDest - 1; + int iResult; + HRESULT hr; + + if (dwFlags & STRSAFE_IGNORE_NULLS) + { + if (!pszDest) pszDest = (STRSAFE_LPTSTR)L""; + if (!pszFormat) pszFormat = (STRSAFE_LPTSTR)L""; + } + + if (!pszDest || !pszFormat || cxDest > STRSAFE_MAX_CXX || cxDest == 0) + { + return STRSAFE_E_INVALID_PARAMETER; + } + +#if (STRSAFE_USE_SECURE_CRT == 1) + iResult = _vsnprintf_sAW(pszDest, cchDest, cchMax, pszFormat, args); +#else + iResult = _vsnprintfAW(pszDest, cchMax, pszFormat, args); +#endif + + hr = (iResult == -1) ? STRSAFE_E_INSUFFICIENT_BUFFER : S_OK; + + if ((size_t)iResult >= cchMax) + { + pszDest[cchMax] = 0; + iResult = cchMax; + } + + if (ppszDestEnd) *ppszDestEnd = pszDest + iResult; + + if (pcxRemaining) *pcxRemaining = STRSAFE_CCHtoCXX(cchMax - iResult); + + if (SUCCEEDED(hr)) + { + if ((dwFlags & STRSAFE_FILL_BEHIND_NULL) && (iResult + 1 < cchMax)) + { + memset(pszDest + iResult + 1, + dwFlags & 0xff, + (cchMax - iResult - 1) * sizeof(STRSAFE_TCHAR)); + } + } + else + { + if (dwFlags & STRSAFE_FILL_ON_FAILURE) + { + memset(pszDest, dwFlags & 0xff, cchMax * sizeof(STRSAFE_TCHAR)); + } + else if (dwFlags & STRSAFE_NULL_ON_FAILURE) + { + *pszDest = 0; + } + } + + return hr; +} + +STRSAFEAPI +StringCxxVPrintf( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszFormat, + va_list args) +{ + return StringCxxVPrintfEx(pszDest, cxDest, NULL, NULL, 0, pszFormat, args); +} + +STRSAFEAPI +StringCxxPrintf( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszFormat, ...) +{ + HRESULT result; + va_list args; + va_start(args, pszFormat); + result = StringCxxVPrintf(pszDest, cxDest, pszFormat, args); + va_end(args); + return result; +} + +STRSAFEAPI +StringCxxPrintfEx( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags, + STRSAFE_LPCTSTR pszFormat, ...) +{ + HRESULT result; + va_list args; + va_start(args, pszFormat); + result = StringCxxVPrintfEx(pszDest, cxDest, ppszDestEnd, pcbRemaining, dwFlags, pszFormat, args); + va_end(args); + return result; +} + +#endif // !STRSAFE_LIB + +/* Functions are implemented or defined, clear #defines for next pass */ +#undef StringCxxCat +#undef StringCxxCatEx +#undef StringCxxCatN +#undef StringCxxCatNEx +#undef StringCxxCatWorker +#undef StringCxxCopy +#undef StringCxxCopyEx +#undef StringCxxCopyN +#undef StringCxxCopyNEx +#undef StringCxxGets +#undef StringCxxGetsEx +#undef StringCxxLength +#undef StringCxxPrintf +#undef StringCxxPrintfEx +#undef StringCxxVPrintf +#undef StringCxxVPrintfEx + +#undef StringCbCat +#undef StringCbCatEx +#undef StringCbCatN +#undef StringCbCatNEx +#undef StringCbCatWorker +#undef StringCbCopy +#undef StringCbCopyEx +#undef StringCbCopyN +#undef StringCbCopyNEx +#undef StringCbGets +#undef StringCbGetsEx +#undef StringCbLength +#undef StringCbPrintf +#undef StringCbPrintfEx +#undef StringCbVPrintf +#undef StringCbVPrintfEx +#undef StringCchCat +#undef StringCchCatEx +#undef StringCchCatN +#undef StringCchCatNEx +#undef StringCchCatWorker +#undef StringCchCopy +#undef StringCchCopyEx +#undef StringCchCopyN +#undef StringCchCopyNEx +#undef StringCchGets +#undef StringCchGetsEx +#undef StringCchLength +#undef StringCchPrintf +#undef StringCchPrintfEx +#undef StringCchVPrintf +#undef StringCchVPrintfEx +#undef _vsnprintfAW + +#undef STRSAFE_LPTSTR +#undef STRSAFE_LPCTSTR +#undef STRSAFE_TCHAR + +#undef STRSAFE_CXXtoCB +#undef STRSAFE_CBtoCXX +#undef STRSAFE_CXXtoCCH +#undef STRSAFE_CCHtoCXX + +#endif // defined (STRSAFE_PASS2) + From b5a39d6dd14ee5454e1c3100edb5807b1ce3de0a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 26 Apr 2010 01:23:21 +0000 Subject: [PATCH 204/261] [WIN32CSR] - Rewrite harderror handling. The old code was a monster function, leaking memory, using ansi rather than unicode strings and not getting this right. It was also vulnerable to attacks, making csrss crash, when corrupt parameters were sent. svn path=/trunk/; revision=47027 --- .../subsystems/win32/csrss/win32csr/dllmain.c | 396 ------------- .../win32/csrss/win32csr/harderror.c | 552 ++++++++++++++++++ .../subsystems/win32/csrss/win32csr/w32csr.h | 7 + .../win32/csrss/win32csr/win32csr.rbuild | 2 + 4 files changed, 561 insertions(+), 396 deletions(-) create mode 100644 reactos/subsystems/win32/csrss/win32csr/harderror.c diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c index 2b3c6b7a1a4..e1fc421ff7c 100644 --- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c +++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c @@ -180,402 +180,6 @@ Win32CsrInitComplete(void) return TRUE; } -static BOOL WINAPI -Win32CsrHardError(IN PCSRSS_PROCESS_DATA ProcessData, - IN PHARDERROR_MSG HardErrorMessage) -{ - UINT responce = MB_OK; - NTSTATUS Status; - HANDLE hProcess; - OBJECT_ATTRIBUTES ObjectAttributes; - ULONG nParam = 0; - PRTL_MESSAGE_RESOURCE_ENTRY MessageResource; - ULONG_PTR ParameterList[MAXIMUM_HARDERROR_PARAMETERS]; - LPSTR CaptionText, MessageBody; - LPWSTR szxCaptionText, szxMessageBody; - DWORD SizeOfAllUnicodeStrings = 0; - PROCESS_BASIC_INFORMATION ClientBasicInfo; - UNICODE_STRING ClientFileNameU; - UNICODE_STRING TempStringU; - UNICODE_STRING ParameterStringU; - ANSI_STRING ParamStringA; - ULONG UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; - int MessageBoxResponse; - - HardErrorMessage->Response = ResponseNotHandled; - - DPRINT("NumberOfParameters = %d\n", HardErrorMessage->NumberOfParameters); - DPRINT("Status = %lx\n", HardErrorMessage->Status); - - // open client process - InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); - Status = NtOpenProcess(&hProcess, PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, &ObjectAttributes, &HardErrorMessage->h.ClientId); - if( !NT_SUCCESS(Status) ) { - DPRINT1("NtOpenProcess failed with code: %lx\n", Status); - return FALSE; - } - - // let's get a name of the client process to display it in the caption of a message box - - ClientFileNameU.MaximumLength = 0; - ClientFileNameU.Length = 0; - ClientFileNameU.Buffer = NULL; - Status = NtQueryInformationProcess(hProcess, - ProcessBasicInformation, - &ClientBasicInfo, - sizeof(ClientBasicInfo), - NULL); - if( NT_SUCCESS(Status) ) { - PLIST_ENTRY ModuleListHead; - PLIST_ENTRY Entry; - PLDR_DATA_TABLE_ENTRY Module; - PPEB_LDR_DATA Ldr; - PPEB Peb = ClientBasicInfo.PebBaseAddress; - - if( Peb ) - { - Status = NtReadVirtualMemory(hProcess, &Peb->Ldr, &Ldr, sizeof(Ldr), NULL); - if( NT_SUCCESS(Status) ) { - ModuleListHead = &Ldr->InLoadOrderModuleList; - Status = NtReadVirtualMemory( - hProcess, - &ModuleListHead->Flink, - &Entry, - sizeof(Entry), - NULL - ); - - if( NT_SUCCESS(Status) ) - { - if (Entry != ModuleListHead) - { - LDR_DATA_TABLE_ENTRY ModuleData; - Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); - - Status = NtReadVirtualMemory(hProcess, Module, &ModuleData, sizeof(ModuleData), NULL); - if( NT_SUCCESS(Status) ) { - PVOID ClientDllBase; - - Status = NtReadVirtualMemory( - hProcess, - &Peb->ImageBaseAddress, - &ClientDllBase, - sizeof(ClientDllBase), - NULL - ); - if( NT_SUCCESS(Status) && (ClientDllBase == ModuleData.DllBase) ) { - - ClientFileNameU.MaximumLength = ModuleData.BaseDllName.MaximumLength; - ClientFileNameU.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength); - Status = NtReadVirtualMemory( - hProcess, - ModuleData.BaseDllName.Buffer, - ClientFileNameU.Buffer, - ClientFileNameU.MaximumLength, - NULL - ); - if( NT_SUCCESS(Status) ) { - ClientFileNameU.Length = wcslen(ClientFileNameU.Buffer)*sizeof(wchar_t); - } - else { - RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); - ClientFileNameU.Buffer = NULL; - } - - DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU); - } - } - } - } - } - } - } - - // read all unicode strings from client space - for(nParam = 0; nParam < HardErrorMessage->NumberOfParameters; nParam++, UnicodeStringParameterMask >>= 1) - { - if( UnicodeStringParameterMask & 0x01 ) { - Status = NtReadVirtualMemory(hProcess, - (PVOID)HardErrorMessage->Parameters[nParam], - (PVOID)&TempStringU, - sizeof(TempStringU), - NULL); - - if( NT_SUCCESS(Status) ) { - ParameterStringU.Buffer = (PWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, TempStringU.MaximumLength); - if( !ParameterStringU.Buffer ) { - DPRINT1("Cannot allocate memory %d\n", TempStringU.MaximumLength); - NtClose(hProcess); - if( ClientFileNameU.Buffer ) { - RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); - } - return FALSE; - } - - Status = NtReadVirtualMemory(hProcess, - (PVOID)TempStringU.Buffer, - (PVOID)ParameterStringU.Buffer, - TempStringU.MaximumLength, - NULL); - if( !NT_SUCCESS(Status) ) { - DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status); - RtlFreeHeap (RtlGetProcessHeap(), 0, ParameterStringU.Buffer); - if( ClientFileNameU.Buffer ) { - RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); - } - NtClose(hProcess); - return FALSE; - } - ParameterStringU.Length = TempStringU.Length; - ParameterStringU.MaximumLength = TempStringU.MaximumLength; - DPRINT("ParameterStringU=\'%wZ\'\n", &ParameterStringU); - RtlUnicodeStringToAnsiString(&ParamStringA, &ParameterStringU, TRUE); - ParameterList[nParam] = (ULONG_PTR)ParamStringA.Buffer; - SizeOfAllUnicodeStrings += ParamStringA.MaximumLength; - } - } - else { - // it's not a unicode string - ParameterList[nParam] = HardErrorMessage->Parameters[nParam]; - } - } - - NtClose(hProcess); - - // get text string of the error code - Status = RtlFindMessage( - (PVOID)GetModuleHandle(TEXT("ntdll")), - (ULONG_PTR)RT_MESSAGETABLE, - LANG_NEUTRAL, - HardErrorMessage->Status, - &MessageResource ); - if( !NT_SUCCESS(Status) ) { - // WE HAVE TO DISPLAY HERE: "Unknown hard error" - if( ClientFileNameU.Buffer ) { - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength+64); - wsprintfW(szxCaptionText, L"%s - %hs", ClientFileNameU.Buffer, "Application Error"); - } else { - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 64); - wsprintfW(szxCaptionText, L"System - Application Error"); - } - MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 38); - wsprintfA(MessageBody, "Unknown hard error"); - } - else { - LPSTR NtStatusString; - UNICODE_STRING MessageU; - ANSI_STRING MessageA; - USHORT CaptionSize = 0; - - if( !MessageResource->Flags ) { - /* we've got an ansi string */ - DPRINT("MessageResource->Text=%s\n", (PSTR)MessageResource->Text); - RtlInitAnsiString(&MessageA, MessageResource->Text); - } - else { - /* we've got a unicode string */ - DPRINT("MessageResource->Text=%S\n", (PWSTR)MessageResource->Text); - RtlInitUnicodeString(&MessageU, (PWSTR)MessageResource->Text); - RtlUnicodeStringToAnsiString(&MessageA, &MessageU, TRUE); - } - - // check whether a caption exists - if( *MessageA.Buffer == '{' ) { - // get size of the caption - for( CaptionSize = 0; (CaptionSize < MessageA.Length) && ('}' != MessageA.Buffer[CaptionSize]); CaptionSize++); - - CaptionText = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, CaptionSize); - RtlCopyMemory(CaptionText, MessageA.Buffer+1, CaptionSize-1); - CaptionSize += 2; // "}\r\n" - 3 - - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wchar_t)*CaptionSize+ClientFileNameU.MaximumLength+128); - if( ClientFileNameU.Buffer ) { - wsprintfW(szxCaptionText, L"%s - %hs", ClientFileNameU.Buffer, CaptionText); - } else { - wsprintfW(szxCaptionText, L"System - %hs", CaptionText); - } - RtlFreeHeap (RtlGetProcessHeap(), 0, CaptionText); - } - else { - if( ClientFileNameU.Buffer ) { - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength); - wsprintfW(szxCaptionText, L"%s", ClientFileNameU.Buffer); - } else { - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 14); // 14 - "System\0\0" - wsprintfW(szxCaptionText, L"System"); - } - } - DPRINT("ParameterList[0]=0x%lx\n", ParameterList[0]); - if( STATUS_UNHANDLED_EXCEPTION == HardErrorMessage->Status ) - { - PRTL_MESSAGE_RESOURCE_ENTRY MsgResException; - MessageBody = NULL; - Status = RtlFindMessage( - (PVOID)GetModuleHandle(TEXT("ntdll")), - (ULONG_PTR)RT_MESSAGETABLE, - LANG_NEUTRAL, - ParameterList[0], - &MsgResException); - - if( NT_SUCCESS(Status) ) - { - UNICODE_STRING ExcMessageU; - ANSI_STRING ExcMessageA; - if( !MsgResException->Flags ) { - /* we've got an ansi string */ - DPRINT("MsgResException->Text=%s\n", (PSTR)MsgResException->Text); - RtlInitAnsiString(&ExcMessageA, MsgResException->Text); - } - else { - /* we've got a unicode string */ - DPRINT("MsgResException->Text=%S\n", (PWSTR)MsgResException->Text); - RtlInitUnicodeString(&ExcMessageU, (PWSTR)MsgResException->Text); - RtlUnicodeStringToAnsiString(&ExcMessageA, &ExcMessageU, TRUE); - } - - MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MsgResException->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough - if( STATUS_ACCESS_VIOLATION == ParameterList[0] ) { - LPSTR pOperationType; - if( ParameterList[2] ) pOperationType = "written"; - else pOperationType = "read"; - wsprintfA(MessageBody, ExcMessageA.Buffer, ParameterList[1], ParameterList[3], pOperationType); - } - else if( STATUS_IN_PAGE_ERROR == ParameterList[0] ) { - wsprintfA(MessageBody, ExcMessageA.Buffer, ParameterList[1], ParameterList[3], ParameterList[2]); - } - } - if( !MessageBody ) { - NtStatusString = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length-CaptionSize); - RtlCopyMemory(NtStatusString, MessageA.Buffer+CaptionSize, (MessageResource->Length-CaptionSize)-1); - - MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough - - wsprintfA(MessageBody, NtStatusString, - L"Unknown software exception", - ParameterList[0], - ParameterList[1]); - - RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString); - } - } - else - { - NtStatusString = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length-CaptionSize); - RtlCopyMemory(NtStatusString, MessageA.Buffer+CaptionSize, (MessageResource->Length-CaptionSize)-1); - - MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough - - wsprintfA(MessageBody, NtStatusString, - ParameterList[0], - ParameterList[1], - ParameterList[2], - ParameterList[3]); - - RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString); - } - if( MessageResource->Flags ) { - /* we've got a unicode string */ - RtlFreeAnsiString(&MessageA); - } - } - if( ClientFileNameU.Buffer ) { - RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); - } - - szxMessageBody = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wchar_t)*(strlen(MessageBody)+1)); - wsprintfW(szxMessageBody, L"%hs", MessageBody); - RtlFreeHeap (RtlGetProcessHeap(), 0, MessageBody); - - switch ( HardErrorMessage->ValidResponseOptions ) - { - case OptionAbortRetryIgnore: - responce = MB_ABORTRETRYIGNORE; - break; - - case OptionOk: - responce = MB_OK; - break; - - case OptionOkCancel: - responce = MB_OKCANCEL; - break; - - case OptionRetryCancel: - responce = MB_RETRYCANCEL; - break; - - case OptionYesNo: - responce = MB_YESNO; - break; - - case OptionYesNoCancel: - responce = MB_YESNOCANCEL; - break; - - case OptionShutdownSystem: - // XZ?? - break; - - default: - DPRINT1("Wrong option: ValidResponseOptions = %d\n", HardErrorMessage->ValidResponseOptions); - ASSERT(FALSE); - break; - } - - // FIXME: We should not use MessageBox !!!! - DPRINT1("%S\n", szxMessageBody); - MessageBoxResponse = MessageBoxW(0, szxMessageBody, szxCaptionText, responce|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND); - - RtlFreeHeap (RtlGetProcessHeap(), 0, szxMessageBody); - RtlFreeHeap (RtlGetProcessHeap(), 0, szxCaptionText); - - switch( MessageBoxResponse ) - { - case IDOK: - HardErrorMessage->Response = ResponseOk; - break; - - case IDCANCEL: - HardErrorMessage->Response = ResponseCancel; - break; - - case IDYES: - HardErrorMessage->Response = ResponseYes; - break; - - case IDNO: - HardErrorMessage->Response = ResponseNo; - break; - - case IDABORT: - HardErrorMessage->Response = ResponseAbort; - break; - - case IDIGNORE: - HardErrorMessage->Response = ResponseIgnore; - break; - - case IDRETRY: - HardErrorMessage->Response = ResponseRetry; - break; - - case 10://IDTRYAGAIN: - HardErrorMessage->Response = ResponseTryAgain; - break; - - case 11://IDCONTINUE: - HardErrorMessage->Response = ResponseContinue; - break; - - default: - ASSERT(FALSE); - break; - } - - return TRUE; -} - - BOOL WINAPI Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, PCSRSS_OBJECT_DEFINITION *ObjectDefinitions, diff --git a/reactos/subsystems/win32/csrss/win32csr/harderror.c b/reactos/subsystems/win32/csrss/win32csr/harderror.c new file mode 100644 index 00000000000..a1b5a5dc5d3 --- /dev/null +++ b/reactos/subsystems/win32/csrss/win32csr/harderror.c @@ -0,0 +1,552 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: subsys/csrss/win32csr/dllmain.c + * PURPOSE: Initialization + * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru) + * Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#define NDEBUG +#include "w32csr.h" +#include +#include + +#define IDTRYAGAIN 10 +#define IDCONTINUE 11 + +/* FUNCTIONS *****************************************************************/ + +static +NTSTATUS +CsrpGetClientFileName( + OUT PUNICODE_STRING ClientFileNameU, + HANDLE hProcess) +{ + PLIST_ENTRY ModuleListHead; + PLIST_ENTRY Entry; + PLDR_DATA_TABLE_ENTRY Module; + PPEB_LDR_DATA Ldr; + PROCESS_BASIC_INFORMATION ClientBasicInfo; + LDR_DATA_TABLE_ENTRY ModuleData; + PVOID ClientDllBase; + NTSTATUS Status; + PPEB Peb; + + /* Initialize string */ + ClientFileNameU->MaximumLength = 0; + ClientFileNameU->Length = 0; + ClientFileNameU->Buffer = NULL; + + /* Query process information */ + Status = NtQueryInformationProcess(hProcess, + ProcessBasicInformation, + &ClientBasicInfo, + sizeof(ClientBasicInfo), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + Peb = ClientBasicInfo.PebBaseAddress; + if (!Peb) return STATUS_UNSUCCESSFUL; + + Status = NtReadVirtualMemory(hProcess, &Peb->Ldr, &Ldr, sizeof(Ldr), NULL); + if (!NT_SUCCESS(Status)) return Status; + + ModuleListHead = &Ldr->InLoadOrderModuleList; + Status = NtReadVirtualMemory(hProcess, + &ModuleListHead->Flink, + &Entry, + sizeof(Entry), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + if (Entry == ModuleListHead) return STATUS_UNSUCCESSFUL; + + Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); + + Status = NtReadVirtualMemory(hProcess, + Module, + &ModuleData, + sizeof(ModuleData), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + Status = NtReadVirtualMemory(hProcess, + &Peb->ImageBaseAddress, + &ClientDllBase, + sizeof(ClientDllBase), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + if (ClientDllBase != ModuleData.DllBase) return STATUS_UNSUCCESSFUL; + + ClientFileNameU->MaximumLength = ModuleData.BaseDllName.MaximumLength; + ClientFileNameU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + ClientFileNameU->MaximumLength); + + Status = NtReadVirtualMemory(hProcess, + ModuleData.BaseDllName.Buffer, + ClientFileNameU->Buffer, + ClientFileNameU->MaximumLength, + NULL); + if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, ClientFileNameU->Buffer); + ClientFileNameU->Buffer = NULL; + ClientFileNameU->MaximumLength = 0; + return Status; + } + + ClientFileNameU->Length = wcslen(ClientFileNameU->Buffer)*sizeof(wchar_t); + DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU); + + return STATUS_SUCCESS; +} + + +static +NTSTATUS +CsrpCaptureStringParameters( + OUT PULONG_PTR Parameters, + OUT PULONG SizeOfAllUnicodeStrings, + IN PHARDERROR_MSG HardErrorMessage, + HANDLE hProcess) +{ + ULONG nParam, UnicodeStringParameterMask, Size = 0; + NTSTATUS Status; + UNICODE_STRING TempStringU; + PWSTR ParamString; + + UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; + + /* Read all strings from client space */ + for (nParam = 0; + nParam < HardErrorMessage->NumberOfParameters; + nParam++, UnicodeStringParameterMask >>= 1) + { + Parameters[nParam] = 0; + + /* Check if the current parameter is a unicode string */ + if (UnicodeStringParameterMask & 0x01) + { + /* Read the UNICODE_STRING from the process memory */ + Status = NtReadVirtualMemory(hProcess, + (PVOID)HardErrorMessage->Parameters[nParam], + &TempStringU, + sizeof(TempStringU), + NULL); + + if (!NT_SUCCESS(Status)) return Status; + + /* Allocate a buffer for the string */ + ParamString = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + TempStringU.Length + sizeof(WCHAR)); + + if (!ParamString) + { + DPRINT1("Cannot allocate memory %d\n", TempStringU.Length); + return STATUS_NO_MEMORY; + } + + /* Read the string buffer from the process memory */ + Status = NtReadVirtualMemory(hProcess, + TempStringU.Buffer, + ParamString, + TempStringU.Length, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, ParamString); + return Status; + } + + /* Zero terminate the string */ + ParamString[TempStringU.Length / sizeof(WCHAR)] = 0; + DPRINT("ParamString=\'%S\'\n", ParamString); + + Parameters[nParam] = (ULONG_PTR)ParamString; + Size += TempStringU.Length; + } + else + { + /* It's not a unicode string */ + Parameters[nParam] = HardErrorMessage->Parameters[nParam]; + } + } + + *SizeOfAllUnicodeStrings = Size; + return STATUS_SUCCESS; +} + +static +VOID +CsrpFreeStringParameters( + IN OUT PULONG_PTR Parameters, + IN PHARDERROR_MSG HardErrorMessage) +{ + ULONG nParam, UnicodeStringParameterMask; + + UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; + + /* Loop all parameters */ + for (nParam = 0; + nParam < HardErrorMessage->NumberOfParameters; + nParam++, UnicodeStringParameterMask >>= 1) + { + /* Check if the current parameter is a string */ + if (UnicodeStringParameterMask & 0x01) + { + /* Free the string buffer */ + RtlFreeHeap(RtlGetProcessHeap(), 0, (PVOID)Parameters[nParam]); + } + } +} + + +static +NTSTATUS +CsrpFormatMessages( + OUT PUNICODE_STRING TextStringU, + OUT PUNICODE_STRING CaptionStringU, + IN PULONG_PTR Parameters, + IN ULONG SizeOfStrings, + IN PHARDERROR_MSG Message, + IN HANDLE hProcess) +{ + NTSTATUS Status; + UNICODE_STRING FileNameU, TempStringU, FormatU; + ANSI_STRING FormatA; + PRTL_MESSAGE_RESOURCE_ENTRY MessageResource; + PWSTR FormatString; + ULONG Size; + + /* Get the file name of the client process */ + CsrpGetClientFileName(&FileNameU, hProcess); + + /* Check if we have a file name */ + if (!FileNameU.Buffer) + { + /* No, use system */ + RtlInitUnicodeString(&FileNameU, L"System"); + } + + /* Get text string of the error code */ + Status = RtlFindMessage(GetModuleHandleW(L"ntdll"), + (ULONG_PTR)RT_MESSAGETABLE, + LANG_NEUTRAL, + Message->Status, + &MessageResource); + + if (NT_SUCCESS(Status)) + { + if (MessageResource->Flags) + { + RtlInitUnicodeString(&FormatU, (PWSTR)MessageResource->Text); + FormatA.Buffer = NULL; + } + else + { + RtlInitAnsiString(&FormatA, MessageResource->Text); + RtlAnsiStringToUnicodeString(&FormatU, &FormatA, TRUE); + } + } + else + { + /* Fall back to hardcoded value */ + RtlInitUnicodeString(&FormatU, L"Unknown Hard Error"); + FormatA.Buffer = NULL; + } + + FormatString = FormatU.Buffer; + + /* Check whether a caption exists */ + if (FormatString[0] == L'{') + { + /* Set caption start */ + TempStringU.Buffer = ++FormatString; + + /* Get size of the caption */ + for (Size = 0; *FormatString != 0 && *FormatString != L'}'; Size++) + FormatString++; + + /* Skip '}', '\r', '\n' */ + FormatString += 3; + + TempStringU.Length = Size * sizeof(WCHAR); + TempStringU.MaximumLength = TempStringU.Length; + } + else + { + /* FIXME: Set string based on severity */ + RtlInitUnicodeString(&TempStringU, L"Application Error"); + } + + /* Calculate buffer length for the caption */ + CaptionStringU->MaximumLength = FileNameU.Length + TempStringU.Length + + 4 * sizeof(WCHAR); + + /* Allocate a buffer for the caption */ + CaptionStringU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + CaptionStringU->MaximumLength); + + /* Append the file name, seperator and the caption text */ + CaptionStringU->Length = 0; + RtlAppendUnicodeStringToString(CaptionStringU, &FileNameU); + RtlAppendUnicodeToString(CaptionStringU, L" - "); + RtlAppendUnicodeStringToString(CaptionStringU, &TempStringU); + + /* Zero terminate the buffer */ + CaptionStringU->Buffer[CaptionStringU->Length] = 0; + + /* Free the file name buffer */ + RtlFreeUnicodeString(&FileNameU); + + /* Check if this is an exception message */ + if (Message->Status == STATUS_UNHANDLED_EXCEPTION) + { + /* Handle special cases */ + if (Parameters[0] == STATUS_ACCESS_VIOLATION) + { + Parameters[0] = Parameters[1]; + Parameters[1] = Parameters[3]; + if (Parameters[2]) Parameters[2] = (ULONG_PTR)L"written"; + else Parameters[2] = (ULONG_PTR)L"read"; + MessageResource = NULL; + } + else if (Parameters[0] == STATUS_IN_PAGE_ERROR) + { + Parameters[0] = Parameters[1]; + Parameters[1] = Parameters[3]; + MessageResource = NULL; + } + else + { + /* Fall back to hardcoded value */ + Parameters[2] = Parameters[1]; + Parameters[1] = Parameters[0]; + Parameters[0] = (ULONG_PTR)L"unknown software exception"; + } + + if (!MessageResource) + { + /* Get text string of the exception code */ + Status = RtlFindMessage(GetModuleHandleW(L"ntdll"), + (ULONG_PTR)RT_MESSAGETABLE, + LANG_NEUTRAL, + Parameters[0], + &MessageResource); + + if (NT_SUCCESS(Status)) + { + if (FormatA.Buffer) RtlFreeUnicodeString(&FormatU); + + if (MessageResource->Flags) + { + RtlInitUnicodeString(&FormatU, (PWSTR)MessageResource->Text); + FormatA.Buffer = NULL; + } + else + { + RtlInitAnsiString(&FormatA, MessageResource->Text); + RtlAnsiStringToUnicodeString(&FormatU, &FormatA, TRUE); + } + } + else + { + /* Fall back to hardcoded value */ + Parameters[2] = Parameters[1]; + Parameters[1] = Parameters[0]; + Parameters[0] = (ULONG_PTR)L"unknown software exception"; + } + } + } + + /* Calculate length of text buffer */ + TextStringU->MaximumLength = wcslen(FormatString) * sizeof(WCHAR) + + SizeOfStrings + 42 * sizeof(WCHAR); + + /* Allocate a buffer for the text */ + TextStringU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + TextStringU->MaximumLength); + + /* Wrap in SEH to protect from invalid string parameters */ + _SEH2_TRY + { + /* Print the string into the buffer */ + StringCbPrintfW(TextStringU->Buffer, + TextStringU->MaximumLength, + FormatString, + Parameters[0], + Parameters[1], + Parameters[2], + Parameters[3], + Parameters[4]); + Status = STATUS_SUCCESS; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Set error and free buffers */ + Status = _SEH2_GetExceptionCode(); + RtlFreeHeap(RtlGetProcessHeap(), 0, TextStringU->Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, CaptionStringU->Buffer); + } + _SEH2_END + + if (NT_SUCCESS(Status)) + { + TextStringU->Length = wcslen(TextStringU->Buffer) * sizeof(WCHAR); + } + + if (FormatA.Buffer) RtlFreeUnicodeString(&FormatU); + + return Status; +} + +static +ULONG +CsrpMessageBox( + PWSTR Text, + PWSTR Caption, + ULONG ValidResponseOptions, + ULONG Severity) +{ + ULONG Type, MessageBoxResponse; + + /* Set the message box type */ + switch (ValidResponseOptions) + { + case OptionAbortRetryIgnore: + Type = MB_ABORTRETRYIGNORE; + break; + case OptionOk: + Type = MB_OK; + break; + case OptionOkCancel: + Type = MB_OKCANCEL; + break; + case OptionRetryCancel: + Type = MB_RETRYCANCEL; + break; + case OptionYesNo: + Type = MB_YESNO; + break; + case OptionYesNoCancel: + Type = MB_YESNOCANCEL; + break; + case OptionShutdownSystem: + Type = MB_RETRYCANCEL; // FIXME??? + break; + /* Anything else is invalid */ + default: + return ResponseNotHandled; + } + + /* Set severity */ + if (Severity == STATUS_SEVERITY_INFORMATIONAL) Type |= MB_ICONINFORMATION; + else if (Severity == STATUS_SEVERITY_WARNING) Type |= MB_ICONWARNING; + else if (Severity == STATUS_SEVERITY_ERROR) Type |= MB_ICONERROR; + + Type |= MB_SYSTEMMODAL | MB_SETFOREGROUND; + + DPRINT("Text = '%S', Caption = '%S', Severity = %d, Type = 0x%lx\n", + Text, Caption, Severity, Type); + + /* Display a message box */ + MessageBoxResponse = MessageBoxW(0, Text, Caption, Type); + + /* Return response value */ + switch (MessageBoxResponse) + { + case IDOK: return ResponseOk; + case IDCANCEL: return ResponseCancel; + case IDYES: return ResponseYes; + case IDNO: return ResponseNo; + case IDABORT: return ResponseAbort; + case IDIGNORE: return ResponseIgnore; + case IDRETRY: return ResponseRetry; + case IDTRYAGAIN: return ResponseTryAgain; + case IDCONTINUE: return ResponseContinue; + } + + return ResponseNotHandled; +} + +BOOL +WINAPI +Win32CsrHardError( + IN PCSRSS_PROCESS_DATA ProcessData, + IN PHARDERROR_MSG Message) +{ + ULONG_PTR Parameters[MAXIMUM_HARDERROR_PARAMETERS]; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING TextU, CaptionU; + NTSTATUS Status; + HANDLE hProcess; + ULONG Size; + + /* Default to not handled */ + Message->Response = ResponseNotHandled; + + /* Make sure we don't have too many parameters */ + if (Message->NumberOfParameters > MAXIMUM_HARDERROR_PARAMETERS) + Message->NumberOfParameters = MAXIMUM_HARDERROR_PARAMETERS; + + /* Initialize object attributes */ + InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); + + /* Open client process */ + Status = NtOpenProcess(&hProcess, + PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, + &ObjectAttributes, + &Message->h.ClientId); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtOpenProcess failed with code: %lx\n", Status); + return FALSE; + } + + /* Capture all string parameters from the process memory */ + Status = CsrpCaptureStringParameters(Parameters, &Size, Message, hProcess); + if (!NT_SUCCESS(Status)) + { + NtClose(hProcess); + return FALSE; + } + + /* Format the caption and message box text */ + Status = CsrpFormatMessages(&TextU, + &CaptionU, + Parameters, + Size, + Message, + hProcess); + + /* Cleanup */ + CsrpFreeStringParameters(Parameters, Message); + NtClose(hProcess); + + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Display the message box */ + Message->Response = CsrpMessageBox(TextU.Buffer, + CaptionU.Buffer, + Message->ValidResponseOptions, + (ULONG)Message->Status >> 30); + + RtlFreeUnicodeString(&TextU); + RtlFreeUnicodeString(&CaptionU); + + return TRUE; +} + diff --git a/reactos/subsystems/win32/csrss/win32csr/w32csr.h b/reactos/subsystems/win32/csrss/win32csr/w32csr.h index f6f0f4e649c..5ecc378a7c7 100644 --- a/reactos/subsystems/win32/csrss/win32csr/w32csr.h +++ b/reactos/subsystems/win32/csrss/win32csr/w32csr.h @@ -35,4 +35,11 @@ /* shared header with console.dll */ #include "console.h" + +BOOL +WINAPI +Win32CsrHardError( + IN PCSRSS_PROCESS_DATA ProcessData, + IN PHARDERROR_MSG Message); + /* EOF */ diff --git a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild index 7a14f63f806..eec81fcba60 100644 --- a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild +++ b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild @@ -14,6 +14,7 @@ advapi32 win32ksys psapi + pseh w32csr.h alias.c conio.c @@ -21,6 +22,7 @@ dllmain.c exitros.c guiconsole.c + harderror.c tuiconsole.c appswitch.c win32csr.rc From 770cc844b035d859ca1a6e85b3fb649c7439183a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 26 Apr 2010 04:18:11 +0000 Subject: [PATCH 205/261] [NTOSKRNL] - Revert r46682 - The NULL terminator is not supposed to be included in the length - Fixes corruption when printing the symbolic link svn path=/trunk/; revision=47028 --- reactos/ntoskrnl/io/iomgr/deviface.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 114e308c4a8..59eddeb898c 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -1055,7 +1055,6 @@ IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, RtlAppendUnicodeStringToString(SymbolicLinkName, ReferenceString); } SymbolicLinkName->Buffer[SymbolicLinkName->Length/sizeof(WCHAR)] = L'\0'; - SymbolicLinkName->Length += sizeof(WCHAR); /* Write symbolic link name in registry */ SymbolicLinkName->Buffer[1] = '\\'; From 540e5b6f31a5d212bbb9396de997d260931c88b5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 26 Apr 2010 04:54:25 +0000 Subject: [PATCH 206/261] [NTOSKRNL] - Create a helper function named OpenRegistryHandlesFromSymbolicLink which opens handles to various paths associated with a symbolic link - Store the Linked value in IoSetDeviceInterfaceState - Implement checking if an interface is enabled by reading the Linked value - Interfaces reported from IoGetDeviceInterfaces are only active ones now (unless the caller explicitly says that they want disabled ones too) svn path=/trunk/; revision=47029 --- reactos/ntoskrnl/io/iomgr/deviface.c | 292 +++++++++++++++++++++++++-- 1 file changed, 280 insertions(+), 12 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 59eddeb898c..8a8db7a843f 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -20,6 +20,180 @@ static PWCHAR BaseKeyString = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\DeviceClasses\\"; +static +NTSTATUS +OpenRegistryHandlesFromSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, + IN ACCESS_MASK DesiredAccess, + IN OPTIONAL PHANDLE GuidKey, + IN OPTIONAL PHANDLE DeviceKey, + IN OPTIONAL PHANDLE InstanceKey) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + WCHAR PathBuffer[MAX_PATH]; + UNICODE_STRING BaseKeyU; + UNICODE_STRING GuidString, SubKeyName, ReferenceString; + PWCHAR StartPosition, EndPosition; + HANDLE ClassesKey; + PHANDLE GuidKeyRealP, DeviceKeyRealP, InstanceKeyRealP; + HANDLE GuidKeyReal, DeviceKeyReal, InstanceKeyReal; + NTSTATUS Status; + + SubKeyName.Buffer = NULL; + + if (GuidKey != NULL) + GuidKeyRealP = GuidKey; + else + GuidKeyRealP = &GuidKeyReal; + + if (DeviceKey != NULL) + DeviceKeyRealP = DeviceKey; + else + DeviceKeyRealP = &DeviceKeyReal; + + if (InstanceKey != NULL) + InstanceKeyRealP = InstanceKey; + else + InstanceKeyRealP = &InstanceKeyReal; + + *GuidKeyRealP = INVALID_HANDLE_VALUE; + *DeviceKeyRealP = INVALID_HANDLE_VALUE; + *InstanceKeyRealP = INVALID_HANDLE_VALUE; + + BaseKeyU.Buffer = PathBuffer; + BaseKeyU.Length = 0; + BaseKeyU.MaximumLength = MAX_PATH * sizeof(WCHAR); + + RtlAppendUnicodeToString(&BaseKeyU, BaseKeyString); + + /* Open the DeviceClasses key */ + InitializeObjectAttributes(&ObjectAttributes, + &BaseKeyU, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); + Status = ZwOpenKey(&ClassesKey, + DesiredAccess | KEY_ENUMERATE_SUB_KEYS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open %wZ\n", &BaseKeyU); + goto cleanup; + } + + StartPosition = wcschr(SymbolicLinkName->Buffer, L'{'); + EndPosition = wcschr(SymbolicLinkName->Buffer, L'}'); + if (!StartPosition || !EndPosition || StartPosition > EndPosition) + { + DPRINT1("Bad symbolic link: %wZ\n", SymbolicLinkName); + return STATUS_INVALID_PARAMETER_1; + } + GuidString.Buffer = StartPosition; + GuidString.MaximumLength = GuidString.Length = (USHORT)((ULONG_PTR)(EndPosition + 1) - (ULONG_PTR)StartPosition); + + InitializeObjectAttributes(&ObjectAttributes, + &GuidString, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + ClassesKey, + NULL); + Status = ZwOpenKey(GuidKeyRealP, + DesiredAccess | KEY_ENUMERATE_SUB_KEYS, + &ObjectAttributes); + ZwClose(ClassesKey); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open %wZ%wZ (%x)\n", &BaseKeyU, &GuidString, Status); + goto cleanup; + } + + SubKeyName.Buffer = ExAllocatePool(PagedPool, SymbolicLinkName->Length); + if (!SubKeyName.Buffer) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + SubKeyName.MaximumLength = SymbolicLinkName->Length; + SubKeyName.Length = 0; + + RtlAppendUnicodeStringToString(&SubKeyName, + SymbolicLinkName); + + SubKeyName.Buffer[0] = L'#'; + SubKeyName.Buffer[1] = L'#'; + SubKeyName.Buffer[2] = L'?'; + SubKeyName.Buffer[3] = L'#'; + + ReferenceString.Buffer = wcsrchr(SubKeyName.Buffer, '\\'); + if (ReferenceString.Buffer != NULL) + { + ReferenceString.Buffer[0] = L'#'; + + SubKeyName.Length = ReferenceString.Buffer - SubKeyName.Buffer; + ReferenceString.Length = SymbolicLinkName->Length - SubKeyName.Length; + } + else + { + RtlInitUnicodeString(&ReferenceString, L"#"); + } + + InitializeObjectAttributes(&ObjectAttributes, + &SubKeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + *GuidKeyRealP, + NULL); + Status = ZwOpenKey(DeviceKeyRealP, + DesiredAccess | KEY_ENUMERATE_SUB_KEYS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open %wZ%wZ\\%wZ\n", &BaseKeyU, &GuidString, &SubKeyName); + goto cleanup; + } + + InitializeObjectAttributes(&ObjectAttributes, + &ReferenceString, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + *DeviceKeyRealP, + NULL); + Status = ZwOpenKey(InstanceKeyRealP, + DesiredAccess, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open %wZ%wZ\\%wZ%\\%wZ (%x)\n", &BaseKeyU, &GuidString, &SubKeyName, &ReferenceString, Status); + goto cleanup; + } + + Status = STATUS_SUCCESS; + +cleanup: + if (SubKeyName.Buffer != NULL) + ExFreePool(SubKeyName.Buffer); + + if (NT_SUCCESS(Status)) + { + if (!GuidKey) + ZwClose(*GuidKeyRealP); + + if (!DeviceKey) + ZwClose(*DeviceKeyRealP); + + if (!InstanceKey) + ZwClose(*InstanceKeyRealP); + } + else + { + if (*GuidKeyRealP != INVALID_HANDLE_VALUE) + ZwClose(*GuidKeyRealP); + + if (*DeviceKeyRealP != INVALID_HANDLE_VALUE) + ZwClose(*DeviceKeyRealP); + + if (*InstanceKeyRealP != INVALID_HANDLE_VALUE) + ZwClose(*InstanceKeyRealP); + } + + return Status; +} /*++ * @name IoOpenDeviceInterfaceRegistryKey * @unimplemented @@ -395,10 +569,11 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, PKEY_BASIC_INFORMATION DeviceBi = NULL; PKEY_BASIC_INFORMATION ReferenceBi = NULL; PKEY_VALUE_PARTIAL_INFORMATION bip = NULL; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; BOOLEAN FoundRightPDO = FALSE; - ULONG i = 0, j, Size; + ULONG i = 0, j, Size, NeededLength, ActualLength, LinkedValue; UNICODE_STRING ReturnBuffer = { 0, 0, NULL }; NTSTATUS Status; @@ -552,7 +727,6 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, /* We have to check if the interface is enabled, by * reading the Linked value in the Control subkey */ -#if 0 InitializeObjectAttributes( &ObjectAttributes, &Control, @@ -572,17 +746,63 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, } else if (!NT_SUCCESS(Status)) { - DPRINT("ZwOpenKey() failed with status 0x%08lx\n", Status); + DPRINT1("ZwOpenKey() failed with status 0x%08lx\n", Status); + goto cleanup; + } + + RtlInitUnicodeString(&KeyName, L"Linked"); + Status = ZwQueryValueKey(ControlKey, + &KeyName, + KeyValuePartialInformation, + NULL, + 0, + &NeededLength); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + ActualLength = NeededLength; + PartialInfo = ExAllocatePool(NonPagedPool, ActualLength); + if (!PartialInfo) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwQueryValueKey(ControlKey, + &KeyName, + KeyValuePartialInformation, + PartialInfo, + ActualLength, + &NeededLength); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ZwQueryValueKey #2 failed (%x)\n", Status); + ExFreePool(PartialInfo); + goto cleanup; + } + + if (PartialInfo->Type != REG_DWORD || PartialInfo->DataLength != sizeof(ULONG)) + { + DPRINT1("Bad registry read\n"); + ExFreePool(PartialInfo); + goto cleanup; + } + + RtlCopyMemory(&LinkedValue, + PartialInfo->Data, + PartialInfo->DataLength); + + ExFreePool(PartialInfo); + if (LinkedValue == 0) + { + /* This interface isn't active */ + goto NextReferenceString; + } + } + else + { + DPRINT1("ZwQueryValueKey #1 failed (%x)\n", Status); goto cleanup; } -#endif - /* FIXME: Read the Linked value - * If it doesn't exist => ERROR - * If it is not a REG_DWORD or Size != sizeof(ULONG) => ERROR - * If its value is 0, go to NextReferenceString - * At the moment, do as if it is active... - */ - DPRINT1("Checking if device is enabled is not implemented yet!\n"); } /* Read the SymbolicLink string and add it into SymbolicLinkList */ @@ -1118,7 +1338,10 @@ IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, PWCHAR EndPosition; NTSTATUS Status; LPCGUID EventGuid; - + HANDLE InstanceHandle, ControlHandle; + UNICODE_STRING KeyName; + OBJECT_ATTRIBUTES ObjectAttributes; + ULONG LinkedValue; if (SymbolicLinkName == NULL) return STATUS_INVALID_PARAMETER_1; @@ -1140,6 +1363,51 @@ IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, SymLink.Buffer = SymbolicLinkName->Buffer; SymLink.MaximumLength = SymLink.Length = (USHORT)((ULONG_PTR)(EndPosition + 1) - (ULONG_PTR)SymLink.Buffer); DPRINT("IoSetDeviceInterfaceState('%wZ', %d)\n", SymbolicLinkName, Enable); + + Status = OpenRegistryHandlesFromSymbolicLink(SymbolicLinkName, + KEY_CREATE_SUB_KEY, + NULL, + NULL, + &InstanceHandle); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, L"Control"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + InstanceHandle, + NULL); + Status = ZwCreateKey(&ControlHandle, + KEY_SET_VALUE, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + NULL); + ZwClose(InstanceHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create the Control subkey\n"); + return Status; + } + + LinkedValue = (Enable ? 1 : 0); + + RtlInitUnicodeString(&KeyName, L"Linked"); + Status = ZwSetValueKey(ControlHandle, + &KeyName, + 0, + REG_DWORD, + &LinkedValue, + sizeof(ULONG)); + ZwClose(ControlHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to write the Linked value\n"); + return Status; + } + /* Get pointer to the PDO */ Status = IoGetDeviceObjectPointer( &SymLink, From 224b244395ef928d4dbd4807d3b1d12c824461f4 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 09:37:08 +0000 Subject: [PATCH 207/261] - Fix file type description svn path=/trunk/; revision=47030 --- reactos/boot/bootdata/hivecls_arm.inf | 2 +- reactos/boot/bootdata/hivecls_i386.inf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/boot/bootdata/hivecls_arm.inf b/reactos/boot/bootdata/hivecls_arm.inf index a39f33f76f5..4651412d315 100644 --- a/reactos/boot/bootdata/hivecls_arm.inf +++ b/reactos/boot/bootdata/hivecls_arm.inf @@ -41,7 +41,7 @@ HKCR,"rtffile\shell\open\command","",0x00020000,"%SystemRoot%\system32\wordpad.e HKCR,".386","",0x00000000,"vxdfile" HKCR,".vxd","",0x00000000,"vxdfile" HKCR,"vxdfile","",0x00000000,"Virtual Device Driver" -HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-156" +HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-157" ; Animated Cursors HKCR,".ani","",0x00000000,"anifile" diff --git a/reactos/boot/bootdata/hivecls_i386.inf b/reactos/boot/bootdata/hivecls_i386.inf index 350fe18e010..147f80d81de 100644 --- a/reactos/boot/bootdata/hivecls_i386.inf +++ b/reactos/boot/bootdata/hivecls_i386.inf @@ -41,7 +41,7 @@ HKCR,"rtffile\shell\open\command","",0x00020000,"%SystemRoot%\system32\wordpad.e HKCR,".386","",0x00000000,"vxdfile" HKCR,".vxd","",0x00000000,"vxdfile" HKCR,"vxdfile","",0x00000000,"Virtual Device Driver" -HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-156" +HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-157" ; Animated Cursors HKCR,".ani","",0x00000000,"anifile" From dd0a9f5d5f1fb149b5a798df122ba1fd6f1359d6 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 10:38:15 +0000 Subject: [PATCH 208/261] [SHELL32] - Rewrite enumerating folder options file type dialog svn path=/trunk/; revision=47031 --- reactos/dll/win32/shell32/folder_options.c | 267 ++++++++++++++++++--- reactos/dll/win32/shell32/shresdef.h | 2 + 2 files changed, 233 insertions(+), 36 deletions(-) diff --git a/reactos/dll/win32/shell32/folder_options.c b/reactos/dll/win32/shell32/folder_options.c index c862c79855b..0e8ccbfe93d 100644 --- a/reactos/dll/win32/shell32/folder_options.c +++ b/reactos/dll/win32/shell32/folder_options.c @@ -41,6 +41,13 @@ typedef struct WCHAR szFolderPath[MAX_PATH]; }FOLDER_PROPERTIES_CONTEXT, *PFOLDER_PROPERTIES_CONTEXT; +typedef struct +{ + WCHAR FileExtension[30]; + WCHAR FileDescription[100]; + WCHAR ClassKey[MAX_PATH]; +}FOLDER_FILE_TYPE_ENTRY, *PFOLDER_FILE_TYPE_ENTRY; + typedef struct { LPCWSTR szKeyName; @@ -155,20 +162,49 @@ InitializeFileTypesListCtrlColumns(HWND hDlgCtrl) RECT clientRect; LVCOLUMNW col; WCHAR szName[50]; + DWORD dwStyle; + int columnSize = 140; + if (!LoadStringW(shell32_hInstance, IDS_COLUMN_EXTENSION, szName, sizeof(szName) / sizeof(WCHAR))) - szName[0] = 0; + { + /* default to english */ + wcscpy(szName, L"Extensions"); + } + + /* make sure its null terminated */ szName[(sizeof(szName)/sizeof(WCHAR))-1] = 0; GetClientRect(hDlgCtrl, &clientRect); ZeroMemory(&col, sizeof(LV_COLUMN)); - col.mask = LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT; - col.iSubItem = 0; - col.pszText = szName; - col.fmt = LVCFMT_LEFT; - col.cx = (clientRect.right - clientRect.left) - GetSystemMetrics(SM_CXVSCROLL); + columnSize = 140; //FIXME + col.iSubItem = 0; + col.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; + col.fmt = LVCFMT_FIXED_WIDTH; + col.cx = columnSize | LVCFMT_LEFT; + col.cchTextMax = wcslen(szName); + col.pszText = szName; (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM)&col); + + if (!LoadStringW(shell32_hInstance, IDS_FILE_TYPES, szName, sizeof(szName) / sizeof(WCHAR))) + { + /* default to english */ + wcscpy(szName, L"FileTypes"); + } + + col.iSubItem = 1; + col.cx = clientRect.right - clientRect.left - columnSize; + col.cchTextMax = wcslen(szName); + col.pszText = szName; + (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 1, (LPARAM)&col); + + /* set full select style */ + dwStyle = (DWORD) SendMessage(hDlgCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); + dwStyle = dwStyle | LVS_EX_FULLROWSELECT; + SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle); + } + INT FindItem(HWND hDlgCtrl, WCHAR * ItemName) { @@ -181,45 +217,105 @@ FindItem(HWND hDlgCtrl, WCHAR * ItemName) } VOID -InsertFileType(HWND hDlgCtrl, WCHAR * szName, DWORD Size, INT iItem) +InsertFileType(HWND hDlgCtrl, WCHAR * szName, PINT iItem, WCHAR * szFile) { - WCHAR szPath[100]; + PFOLDER_FILE_TYPE_ENTRY Entry; HKEY hKey; LVITEMW lvItem; DWORD dwSize; - if (FindItem(hDlgCtrl, szName) != -1) + if (szName[0] != L'.') + { + /* FIXME handle URL protocol handlers */ + return; + } + + /* allocate file type entry */ + Entry = (PFOLDER_FILE_TYPE_ENTRY)HeapAlloc(GetProcessHeap(), 0, sizeof(FOLDER_FILE_TYPE_ENTRY)); + + if (!Entry) return; - wcscpy(szPath, szName); - /* get the name */ - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS) + /* open key */ + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szName, 0, KEY_READ, &hKey) != ERROR_SUCCESS) + return; + + /* FIXME check for duplicates */ + + /* query for the default key */ + dwSize = sizeof(Entry->ClassKey); + if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)Entry->ClassKey, &dwSize) != ERROR_SUCCESS) { - if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", szName, Size, NULL, 0, NULL) != ERROR_SUCCESS) - { - dwSize = Size; - if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szName, &dwSize) != ERROR_SUCCESS) - { - wcscpy(szName, szPath); - } - } - RegCloseKey(hKey); - szName[(Size/sizeof(WCHAR))-1] = 0; + /* no link available */ + Entry->ClassKey[0] = 0; + } + + if (Entry->ClassKey[0]) + { + HKEY hTemp; + /* try open linked key */ + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, Entry->ClassKey, 0, KEY_READ, &hTemp) == ERROR_SUCCESS) + { + /* use linked key */ + RegCloseKey(hKey); + hKey = hTemp; + } + } + + /* read friendly type name */ + if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", Entry->FileDescription, sizeof(Entry->FileDescription), NULL, 0, NULL) != ERROR_SUCCESS) + { + /* read file description */ + dwSize = sizeof(Entry->FileDescription); + Entry->FileDescription[0] = 0; + + /* read default key */ + RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)Entry->FileDescription, &dwSize); + } + + /* close key */ + RegCloseKey(hKey); + + /* convert extension to upper case */ + wcscpy(Entry->FileExtension, szName); + _wcsupr(Entry->FileExtension); + + if (!Entry->FileDescription[0]) + { + /* construct default 'FileExtensionFile' */ + wcscpy(Entry->FileDescription, &Entry->FileExtension[1]); + wcscat(Entry->FileDescription, L" "); + wcscat(Entry->FileDescription, szFile); } - wcscat(szPath, L"\\shell"); ZeroMemory(&lvItem, sizeof(LVITEMW)); - lvItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; - lvItem.state = LVIS_SELECTED; - lvItem.pszText = szName; - lvItem.iItem = iItem; + lvItem.mask = LVIF_TEXT | LVIF_PARAM; + lvItem.iSubItem = 0; + lvItem.pszText = &Entry->FileExtension[1]; + lvItem.iItem = *iItem; + lvItem.lParam = (LPARAM)Entry; + (void)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS) - { - lvItem.lParam = 0; - (void)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); - RegCloseKey(hKey); - } + ZeroMemory(&lvItem, sizeof(LVITEMW)); + lvItem.mask = LVIF_TEXT; + lvItem.pszText = Entry->FileDescription; + lvItem.iItem = *iItem; + lvItem.iSubItem = 1; + + (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&lvItem); + (*iItem)++; +} + +int +CALLBACK +ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + PFOLDER_FILE_TYPE_ENTRY Entry1, Entry2; + + Entry1 = (PFOLDER_FILE_TYPE_ENTRY)lParam1; + Entry2 = (PFOLDER_FILE_TYPE_ENTRY)lParam2; + + return wcsicmp(Entry1->FileExtension, Entry2->FileExtension); } BOOL @@ -228,22 +324,70 @@ InitializeFileTypesListCtrl(HWND hwndDlg) HWND hDlgCtrl; DWORD dwIndex = 0; WCHAR szName[50]; + WCHAR szFile[100]; DWORD dwName; + LVITEMW lvItem; INT iItem = 0; hDlgCtrl = GetDlgItem(hwndDlg, 14000); InitializeFileTypesListCtrlColumns(hDlgCtrl); + szFile[0] = 0; + if (!LoadStringW(shell32_hInstance, IDS_SHV_COLUMN1, szFile, sizeof(szFile) / sizeof(WCHAR))) + { + /* default to english */ + wcscpy(szFile, L"File"); + } + szFile[(sizeof(szFile)/sizeof(WCHAR))-1] = 0; + dwName = sizeof(szName) / sizeof(WCHAR); while(RegEnumKeyExW(HKEY_CLASSES_ROOT, dwIndex++, szName, &dwName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { - InsertFileType(hDlgCtrl, szName, sizeof(szName), iItem++); + InsertFileType(hDlgCtrl, szName, &iItem, szFile); dwName = sizeof(szName) / sizeof(WCHAR); } + + /* sort list */ + ListView_SortItems(hDlgCtrl, ListViewCompareProc, NULL); + + /* select first item */ + ZeroMemory(&lvItem, sizeof(LVITEMW)); + lvItem.mask = LVIF_STATE; + lvItem.stateMask = (UINT)-1; + lvItem.state = LVIS_FOCUSED|LVIS_SELECTED; + lvItem.iItem = 0; + (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&lvItem); + return TRUE; } +PFOLDER_FILE_TYPE_ENTRY +FindSelectedItem( + HWND hDlgCtrl) +{ + UINT Count, Index; + LVITEMW lvItem; + + Count = ListView_GetItemCount(hDlgCtrl); + + for (Index = 0; Index < Count; Index++) + { + ZeroMemory(&lvItem, sizeof(LVITEM)); + lvItem.mask = LVIF_PARAM | LVIF_STATE; + lvItem.iItem = Index; + lvItem.stateMask = (UINT)-1; + + if (ListView_GetItem(hDlgCtrl, &lvItem)) + { + if (lvItem.state & LVIS_SELECTED) + return (PFOLDER_FILE_TYPE_ENTRY)lvItem.lParam; + } + } + + return NULL; +} + INT_PTR CALLBACK @@ -251,14 +395,65 @@ FolderOptionsFileTypesDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, - LPARAM lParam -) + LPARAM lParam) { + LPNMLISTVIEW lppl; + LVITEMW lvItem; + WCHAR Buffer[200], FormatBuffer[100]; + PFOLDER_FILE_TYPE_ENTRY pItem; + OPENASINFO Info; + switch(uMsg) { case WM_INITDIALOG: InitializeFileTypesListCtrl(hwndDlg); return TRUE; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case 14006: + pItem = FindSelectedItem(GetDlgItem(hwndDlg, 14000)); + if (pItem) + { + Info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_REGISTER_EXT; + Info.pcszClass = pItem->FileExtension; + SHOpenWithDialog(hwndDlg, &Info); + } + break; + } + + break; + case WM_NOTIFY: + lppl = (LPNMLISTVIEW) lParam; + + if (lppl->hdr.code == LVN_ITEMCHANGING) + { + ZeroMemory(&lvItem, sizeof(LVITEM)); + lvItem.mask = LVIF_PARAM; + lvItem.iItem = lppl->iItem; + if (!SendMessageW(lppl->hdr.hwndFrom, LVM_GETITEMW, 0, (LPARAM)&lvItem)) + return TRUE; + + pItem = (PFOLDER_FILE_TYPE_ENTRY)lvItem.lParam; + if (!pItem) + return TRUE; + + if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED)) + { + /* new focused item */ + if (!LoadStringW(shell32_hInstance, IDS_FILE_DETAILS, FormatBuffer, sizeof(FormatBuffer) / sizeof(WCHAR))) + { + /* use default english format string */ + wcscpy(FormatBuffer, L"Details for '%s' extension"); + } + + /* format buffer */ + swprintf(Buffer, FormatBuffer, &pItem->FileExtension[1]); + /* update dialog */ + SendDlgItemMessageW(hwndDlg, 14003, WM_SETTEXT, 0, (LPARAM)Buffer); + } + } + break; } return FALSE; diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index 981e17ff9ce..93b50975a07 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -139,6 +139,8 @@ #define IDS_SYS_FILE 171 #define IDS_EMPTY_BITBUCKET 172 #define IDS_SHLEXEC_NOASSOC 173 +#define IDS_FILE_TYPES 174 +#define IDS_FILE_DETAILS 175 #define IDS_OPEN_VERB 300 #define IDS_RUNAS_VERB 301 From 5367720c4643affab0dc0ef92553e7e8e7402dd2 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 12:26:31 +0000 Subject: [PATCH 209/261] [SHELL32] - Let explorer open control panel class folder when there is no default action See issue #4916 for more details. svn path=/trunk/; revision=47032 --- reactos/dll/win32/shell32/shfldr_cpanel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/shell32/shfldr_cpanel.c b/reactos/dll/win32/shell32/shfldr_cpanel.c index bf8b632f8eb..a7b92512462 100644 --- a/reactos/dll/win32/shell32/shfldr_cpanel.c +++ b/reactos/dll/win32/shell32/shfldr_cpanel.c @@ -1017,8 +1017,8 @@ ExecuteAppletFromCLSID(LPOLESTR pOleStr) dwSize = sizeof(szCmd); if (RegGetValueW(HKEY_CLASSES_ROOT, szBuffer, NULL, RRF_RT_REG_SZ, &dwType, (PVOID)szCmd, &dwSize) != ERROR_SUCCESS) { - ERR("RegGetValueW failed with %u\n", GetLastError()); - return E_FAIL; + wcscpy(szCmd, L"%SystemRoot%\\Explorer.exe ::"); + wcscat(szCmd, pOleStr); } #if 0 From 3c0e9dffbce683938eb9a871bfb295d2da993ffa Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 12:56:32 +0000 Subject: [PATCH 210/261] [SHELL32] - Assume it is an empty cdrom drive when there is no root mounted See issue #2977 for more details. svn path=/trunk/; revision=47033 --- reactos/dll/win32/shell32/folders.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/dll/win32/shell32/folders.c b/reactos/dll/win32/shell32/folders.c index 9b71506a5f0..d1a6c672b51 100644 --- a/reactos/dll/win32/shell32/folders.c +++ b/reactos/dll/win32/shell32/folders.c @@ -257,6 +257,7 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl) case DRIVE_CDROM: icon_idx = IDI_SHELL_CDROM; break; case DRIVE_REMOTE: icon_idx = IDI_SHELL_NETDRIVE; break; case DRIVE_RAMDISK: icon_idx = IDI_SHELL_RAMDISK; break; + case DRIVE_NO_ROOT_DIR: icon_idx = IDI_SHELL_CDROM; break; } } From 5fb94ed717ef8664cbd47401758c2dfaf7c0c813 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 13:58:09 +0000 Subject: [PATCH 211/261] [USERINIT] - Fix Startup Folder - ShellExecuteEx needs lots of work See issue #4568 for more details. svn path=/trunk/; revision=47035 --- reactos/base/system/userinit/userinit.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/base/system/userinit/userinit.c b/reactos/base/system/userinit/userinit.c index 9eb96029318..81027d4b964 100644 --- a/reactos/base/system/userinit/userinit.c +++ b/reactos/base/system/userinit/userinit.c @@ -212,7 +212,6 @@ StartAutoApplications( WARN("FindFirstFile(%s) failed with error %lu\n", debugstr_w(szPath), GetLastError()); return; } - szPath[len] = L'\0'; do { @@ -220,9 +219,10 @@ StartAutoApplications( { memset(&ExecInfo, 0x0, sizeof(SHELLEXECUTEINFOW)); ExecInfo.cbSize = sizeof(ExecInfo); + wcscpy(&szPath[len+1], findData.cFileName); ExecInfo.lpVerb = L"open"; - ExecInfo.lpFile = findData.cFileName; - ExecInfo.lpDirectory = szPath; + ExecInfo.lpFile = szPath; + ExecInfo.lpDirectory = NULL; TRACE("Executing %s in directory %s\n", debugstr_w(findData.cFileName), debugstr_w(szPath)); ShellExecuteExW(&ExecInfo); From 17557bfabd053b17b3a92f5b7c55084adb82613f Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Mon, 26 Apr 2010 13:58:46 +0000 Subject: [PATCH 212/261] [win32k] -rename w32k.h to win32k.h and win32k.h to win32kp.h svn path=/trunk/; revision=47036 --- reactos/subsystems/win32/win32k/dib/dib.c | 2 +- reactos/subsystems/win32/win32k/dib/dib16bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib1bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib24bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib24bppc.c | 2 +- reactos/subsystems/win32/win32k/dib/dib32bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib32bppc.c | 2 +- reactos/subsystems/win32/win32k/dib/dib4bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib8bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/floodfill.c | 2 +- reactos/subsystems/win32/win32k/dib/stretchblt.c | 2 +- reactos/subsystems/win32/win32k/eng/alphablend.c | 2 +- reactos/subsystems/win32/win32k/eng/bitblt.c | 2 +- reactos/subsystems/win32/win32k/eng/clip.c | 2 +- reactos/subsystems/win32/win32k/eng/copybits.c | 2 +- reactos/subsystems/win32/win32k/eng/debug.c | 2 +- reactos/subsystems/win32/win32k/eng/device.c | 2 +- reactos/subsystems/win32/win32k/eng/driverobj.c | 2 +- reactos/subsystems/win32/win32k/eng/engbrush.c | 2 +- reactos/subsystems/win32/win32k/eng/engevent.c | 2 +- reactos/subsystems/win32/win32k/eng/engmisc.c | 2 +- reactos/subsystems/win32/win32k/eng/engwindow.c | 2 +- reactos/subsystems/win32/win32k/eng/error.c | 2 +- reactos/subsystems/win32/win32k/eng/float.c | 2 +- reactos/subsystems/win32/win32k/eng/gradient.c | 2 +- reactos/subsystems/win32/win32k/eng/lineto.c | 2 +- reactos/subsystems/win32/win32k/eng/mapping.c | 2 +- reactos/subsystems/win32/win32k/eng/mem.c | 2 +- reactos/subsystems/win32/win32k/eng/mouse.c | 2 +- reactos/subsystems/win32/win32k/eng/paint.c | 2 +- reactos/subsystems/win32/win32k/eng/perfcnt.c | 2 +- reactos/subsystems/win32/win32k/eng/semaphor.c | 2 +- reactos/subsystems/win32/win32k/eng/sort.c | 2 +- reactos/subsystems/win32/win32k/eng/stretchblt.c | 2 +- reactos/subsystems/win32/win32k/eng/string.c | 2 +- reactos/subsystems/win32/win32k/eng/surface.c | 2 +- reactos/subsystems/win32/win32k/eng/transblt.c | 2 +- reactos/subsystems/win32/win32k/eng/xlate.c | 2 +- reactos/subsystems/win32/win32k/include/{win32k.h => win32kp.h} | 0 reactos/subsystems/win32/win32k/ldr/loader.c | 2 +- reactos/subsystems/win32/win32k/main/dllmain.c | 2 +- reactos/subsystems/win32/win32k/misc/copy.c | 2 +- reactos/subsystems/win32/win32k/misc/driver.c | 2 +- reactos/subsystems/win32/win32k/misc/err.c | 2 +- reactos/subsystems/win32/win32k/misc/file.c | 2 +- reactos/subsystems/win32/win32k/misc/math.c | 2 +- reactos/subsystems/win32/win32k/misc/registry.c | 2 +- reactos/subsystems/win32/win32k/misc/rtlstr.c | 2 +- reactos/subsystems/win32/win32k/misc/usrheap.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/d3d.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/dd.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/ddraw.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/ddsurf.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/dvp.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/dxeng.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/eng.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/mocomp.c | 2 +- reactos/subsystems/win32/win32k/ntuser/accelerator.c | 2 +- reactos/subsystems/win32/win32k/ntuser/callback.c | 2 +- reactos/subsystems/win32/win32k/ntuser/callproc.c | 2 +- reactos/subsystems/win32/win32k/ntuser/caret.c | 2 +- reactos/subsystems/win32/win32k/ntuser/class.c | 2 +- reactos/subsystems/win32/win32k/ntuser/clipboard.c | 2 +- reactos/subsystems/win32/win32k/ntuser/csr.c | 2 +- reactos/subsystems/win32/win32k/ntuser/cursoricon.c | 2 +- reactos/subsystems/win32/win32k/ntuser/defwnd.c | 2 +- reactos/subsystems/win32/win32k/ntuser/desktop.c | 2 +- reactos/subsystems/win32/win32k/ntuser/display.c | 2 +- reactos/subsystems/win32/win32k/ntuser/event.c | 2 +- reactos/subsystems/win32/win32k/ntuser/focus.c | 2 +- reactos/subsystems/win32/win32k/ntuser/guicheck.c | 2 +- reactos/subsystems/win32/win32k/ntuser/hook.c | 2 +- reactos/subsystems/win32/win32k/ntuser/hotkey.c | 2 +- reactos/subsystems/win32/win32k/ntuser/input.c | 2 +- reactos/subsystems/win32/win32k/ntuser/kbdlayout.c | 2 +- reactos/subsystems/win32/win32k/ntuser/keyboard.c | 2 +- reactos/subsystems/win32/win32k/ntuser/menu.c | 2 +- reactos/subsystems/win32/win32k/ntuser/message.c | 2 +- reactos/subsystems/win32/win32k/ntuser/metric.c | 2 +- reactos/subsystems/win32/win32k/ntuser/misc.c | 2 +- reactos/subsystems/win32/win32k/ntuser/monitor.c | 2 +- reactos/subsystems/win32/win32k/ntuser/msgqueue.c | 2 +- reactos/subsystems/win32/win32k/ntuser/ntstubs.c | 2 +- reactos/subsystems/win32/win32k/ntuser/ntuser.c | 2 +- reactos/subsystems/win32/win32k/ntuser/object.c | 2 +- reactos/subsystems/win32/win32k/ntuser/painting.c | 2 +- reactos/subsystems/win32/win32k/ntuser/prop.c | 2 +- reactos/subsystems/win32/win32k/ntuser/scrollbar.c | 2 +- reactos/subsystems/win32/win32k/ntuser/session.c | 2 +- reactos/subsystems/win32/win32k/ntuser/simplecall.c | 2 +- reactos/subsystems/win32/win32k/ntuser/sysparams.c | 2 +- reactos/subsystems/win32/win32k/ntuser/timer.c | 2 +- reactos/subsystems/win32/win32k/ntuser/useratom.c | 2 +- reactos/subsystems/win32/win32k/ntuser/vis.c | 2 +- reactos/subsystems/win32/win32k/ntuser/windc.c | 2 +- reactos/subsystems/win32/win32k/ntuser/window.c | 2 +- reactos/subsystems/win32/win32k/ntuser/winpos.c | 2 +- reactos/subsystems/win32/win32k/ntuser/winsta.c | 2 +- reactos/subsystems/win32/win32k/objects/arc.c | 2 +- reactos/subsystems/win32/win32k/objects/bezier.c | 2 +- reactos/subsystems/win32/win32k/objects/bitblt.c | 2 +- reactos/subsystems/win32/win32k/objects/bitmaps.c | 2 +- reactos/subsystems/win32/win32k/objects/brush.c | 2 +- reactos/subsystems/win32/win32k/objects/cliprgn.c | 2 +- reactos/subsystems/win32/win32k/objects/coord.c | 2 +- reactos/subsystems/win32/win32k/objects/dcattr.c | 2 +- reactos/subsystems/win32/win32k/objects/dclife.c | 2 +- reactos/subsystems/win32/win32k/objects/dcobjs.c | 2 +- reactos/subsystems/win32/win32k/objects/dcstate.c | 2 +- reactos/subsystems/win32/win32k/objects/dcutil.c | 2 +- reactos/subsystems/win32/win32k/objects/device.c | 2 +- reactos/subsystems/win32/win32k/objects/dibobj.c | 2 +- reactos/subsystems/win32/win32k/objects/drawing.c | 2 +- reactos/subsystems/win32/win32k/objects/fillshap.c | 2 +- reactos/subsystems/win32/win32k/objects/font.c | 2 +- reactos/subsystems/win32/win32k/objects/freetype.c | 2 +- reactos/subsystems/win32/win32k/objects/gdibatch.c | 2 +- reactos/subsystems/win32/win32k/objects/gdiobj.c | 2 +- reactos/subsystems/win32/win32k/objects/icm.c | 2 +- reactos/subsystems/win32/win32k/objects/line.c | 2 +- reactos/subsystems/win32/win32k/objects/metafile.c | 2 +- reactos/subsystems/win32/win32k/objects/palette.c | 2 +- reactos/subsystems/win32/win32k/objects/path.c | 2 +- reactos/subsystems/win32/win32k/objects/pen.c | 2 +- reactos/subsystems/win32/win32k/objects/polyfill.c | 2 +- reactos/subsystems/win32/win32k/objects/print.c | 2 +- reactos/subsystems/win32/win32k/objects/rect.c | 2 +- reactos/subsystems/win32/win32k/objects/region.c | 2 +- reactos/subsystems/win32/win32k/objects/stockobj.c | 2 +- reactos/subsystems/win32/win32k/objects/text.c | 2 +- reactos/subsystems/win32/win32k/objects/wingl.c | 2 +- reactos/subsystems/win32/win32k/objects/xformobj.c | 2 +- reactos/subsystems/win32/win32k/pch.h | 2 +- reactos/subsystems/win32/win32k/stubs/stubs.c | 2 +- reactos/subsystems/win32/win32k/stubs/umpdstubs.c | 2 +- reactos/subsystems/win32/win32k/{w32k.h => win32k.h} | 0 reactos/tools/gendib/gendib.c | 2 +- 137 files changed, 135 insertions(+), 135 deletions(-) rename reactos/subsystems/win32/win32k/include/{win32k.h => win32kp.h} (100%) rename reactos/subsystems/win32/win32k/{w32k.h => win32k.h} (100%) diff --git a/reactos/subsystems/win32/win32k/dib/dib.c b/reactos/subsystems/win32/win32k/dib/dib.c index c0e8bbf26bf..30591d3d27d 100644 --- a/reactos/subsystems/win32/win32k/dib/dib.c +++ b/reactos/subsystems/win32/win32k/dib/dib.c @@ -7,7 +7,7 @@ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib16bpp.c b/reactos/subsystems/win32/win32k/dib/dib16bpp.c index cbc0129903b..de569716586 100644 --- a/reactos/subsystems/win32/win32k/dib/dib16bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib16bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib1bpp.c b/reactos/subsystems/win32/win32k/dib/dib1bpp.c index 35ee87047b6..ebea73d3326 100644 --- a/reactos/subsystems/win32/win32k/dib/dib1bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib1bpp.c @@ -6,7 +6,7 @@ * PROGRAMMERS: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib24bpp.c b/reactos/subsystems/win32/win32k/dib/dib24bpp.c index 2106d9b4e1d..3810024a6f8 100644 --- a/reactos/subsystems/win32/win32k/dib/dib24bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib24bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib24bppc.c b/reactos/subsystems/win32/win32k/dib/dib24bppc.c index 79a71c9b4aa..ca09cee518b 100644 --- a/reactos/subsystems/win32/win32k/dib/dib24bppc.c +++ b/reactos/subsystems/win32/win32k/dib/dib24bppc.c @@ -7,7 +7,7 @@ * Magnus Olsen */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib32bpp.c b/reactos/subsystems/win32/win32k/dib/dib32bpp.c index edf3f63aa35..6c4704b1c96 100644 --- a/reactos/subsystems/win32/win32k/dib/dib32bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib32bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib32bppc.c b/reactos/subsystems/win32/win32k/dib/dib32bppc.c index da86647367f..859e9507e0e 100644 --- a/reactos/subsystems/win32/win32k/dib/dib32bppc.c +++ b/reactos/subsystems/win32/win32k/dib/dib32bppc.c @@ -7,7 +7,7 @@ * Magnus Olsen */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib4bpp.c b/reactos/subsystems/win32/win32k/dib/dib4bpp.c index 4ae4f8b8f47..1626b8e8397 100644 --- a/reactos/subsystems/win32/win32k/dib/dib4bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib4bpp.c @@ -7,7 +7,7 @@ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib8bpp.c b/reactos/subsystems/win32/win32k/dib/dib8bpp.c index cfbdb0a2db8..95b09cbb73c 100644 --- a/reactos/subsystems/win32/win32k/dib/dib8bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib8bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/floodfill.c b/reactos/subsystems/win32/win32k/dib/floodfill.c index 21bd2c306ab..c31c262d9fc 100644 --- a/reactos/subsystems/win32/win32k/dib/floodfill.c +++ b/reactos/subsystems/win32/win32k/dib/floodfill.c @@ -6,7 +6,7 @@ * PROGRAMMER: Gregor Schneider, */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/stretchblt.c b/reactos/subsystems/win32/win32k/dib/stretchblt.c index 579014ace91..b6d479d8703 100644 --- a/reactos/subsystems/win32/win32k/dib/stretchblt.c +++ b/reactos/subsystems/win32/win32k/dib/stretchblt.c @@ -8,7 +8,7 @@ * Gregor Schneider */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/alphablend.c b/reactos/subsystems/win32/win32k/eng/alphablend.c index 30ba88fd386..34b2930cd68 100644 --- a/reactos/subsystems/win32/win32k/eng/alphablend.c +++ b/reactos/subsystems/win32/win32k/eng/alphablend.c @@ -6,7 +6,7 @@ * PROGRAMER: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/bitblt.c b/reactos/subsystems/win32/win32k/eng/bitblt.c index 3c65aaa6862..afac0e8a7d3 100644 --- a/reactos/subsystems/win32/win32k/eng/bitblt.c +++ b/reactos/subsystems/win32/win32k/eng/bitblt.c @@ -9,7 +9,7 @@ * 2/10/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/clip.c b/reactos/subsystems/win32/win32k/eng/clip.c index d9bfe0e0960..0235d0f27b7 100644 --- a/reactos/subsystems/win32/win32k/eng/clip.c +++ b/reactos/subsystems/win32/win32k/eng/clip.c @@ -27,7 +27,7 @@ * 21/8/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/copybits.c b/reactos/subsystems/win32/win32k/eng/copybits.c index 1cabfb955f2..73a477dd13d 100644 --- a/reactos/subsystems/win32/win32k/eng/copybits.c +++ b/reactos/subsystems/win32/win32k/eng/copybits.c @@ -26,7 +26,7 @@ * 8/18/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/debug.c b/reactos/subsystems/win32/win32k/eng/debug.c index 91b39820db1..9e2e7226a0e 100644 --- a/reactos/subsystems/win32/win32k/eng/debug.c +++ b/reactos/subsystems/win32/win32k/eng/debug.c @@ -27,7 +27,7 @@ * 11/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/device.c b/reactos/subsystems/win32/win32k/eng/device.c index 301497afcc7..0e51ea05eef 100644 --- a/reactos/subsystems/win32/win32k/eng/device.c +++ b/reactos/subsystems/win32/win32k/eng/device.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/driverobj.c b/reactos/subsystems/win32/win32k/eng/driverobj.c index 900812eeabd..cb6ff389450 100644 --- a/reactos/subsystems/win32/win32k/eng/driverobj.c +++ b/reactos/subsystems/win32/win32k/eng/driverobj.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/engbrush.c b/reactos/subsystems/win32/win32k/eng/engbrush.c index 1337e298024..3c3d1d7b151 100644 --- a/reactos/subsystems/win32/win32k/eng/engbrush.c +++ b/reactos/subsystems/win32/win32k/eng/engbrush.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/engevent.c b/reactos/subsystems/win32/win32k/eng/engevent.c index e978786bdb3..d38c32ae2d1 100644 --- a/reactos/subsystems/win32/win32k/eng/engevent.c +++ b/reactos/subsystems/win32/win32k/eng/engevent.c @@ -8,7 +8,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/engmisc.c b/reactos/subsystems/win32/win32k/eng/engmisc.c index bb65ef6e733..af544c95d55 100644 --- a/reactos/subsystems/win32/win32k/eng/engmisc.c +++ b/reactos/subsystems/win32/win32k/eng/engmisc.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/engwindow.c b/reactos/subsystems/win32/win32k/eng/engwindow.c index aed25f0e8b8..5628610e58e 100644 --- a/reactos/subsystems/win32/win32k/eng/engwindow.c +++ b/reactos/subsystems/win32/win32k/eng/engwindow.c @@ -29,7 +29,7 @@ /* TODO: Check how the WNDOBJ implementation should behave with a driver on windows. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/error.c b/reactos/subsystems/win32/win32k/eng/error.c index d81b3822d84..d78da06d545 100644 --- a/reactos/subsystems/win32/win32k/eng/error.c +++ b/reactos/subsystems/win32/win32k/eng/error.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/float.c b/reactos/subsystems/win32/win32k/eng/float.c index ebee480c728..2ca5fe9b796 100644 --- a/reactos/subsystems/win32/win32k/eng/float.c +++ b/reactos/subsystems/win32/win32k/eng/float.c @@ -28,7 +28,7 @@ /* INCLUDES *****************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/gradient.c b/reactos/subsystems/win32/win32k/eng/gradient.c index 7559b17ddba..c3ef6535c04 100644 --- a/reactos/subsystems/win32/win32k/eng/gradient.c +++ b/reactos/subsystems/win32/win32k/eng/gradient.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/lineto.c b/reactos/subsystems/win32/win32k/eng/lineto.c index 049c0a9e79c..a67b47af5b1 100644 --- a/reactos/subsystems/win32/win32k/eng/lineto.c +++ b/reactos/subsystems/win32/win32k/eng/lineto.c @@ -19,7 +19,7 @@ * $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/mapping.c b/reactos/subsystems/win32/win32k/eng/mapping.c index 39de58264d1..7e445d7c631 100644 --- a/reactos/subsystems/win32/win32k/eng/mapping.c +++ b/reactos/subsystems/win32/win32k/eng/mapping.c @@ -6,7 +6,7 @@ * PROGRAMER: */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/mem.c b/reactos/subsystems/win32/win32k/eng/mem.c index 3beb023572c..a49e4fe5cab 100644 --- a/reactos/subsystems/win32/win32k/eng/mem.c +++ b/reactos/subsystems/win32/win32k/eng/mem.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/mouse.c b/reactos/subsystems/win32/win32k/eng/mouse.c index d96e8dd4ed2..f5f6b2f30ca 100644 --- a/reactos/subsystems/win32/win32k/eng/mouse.c +++ b/reactos/subsystems/win32/win32k/eng/mouse.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/paint.c b/reactos/subsystems/win32/win32k/eng/paint.c index 81d1e67b40c..29cd723d4b0 100644 --- a/reactos/subsystems/win32/win32k/eng/paint.c +++ b/reactos/subsystems/win32/win32k/eng/paint.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/perfcnt.c b/reactos/subsystems/win32/win32k/eng/perfcnt.c index e69ff02a921..381abc40c20 100644 --- a/reactos/subsystems/win32/win32k/eng/perfcnt.c +++ b/reactos/subsystems/win32/win32k/eng/perfcnt.c @@ -25,7 +25,7 @@ * PROGRAMER: Ge van Geldorp */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/semaphor.c b/reactos/subsystems/win32/win32k/eng/semaphor.c index 5ef403d8670..d09d4c9022b 100644 --- a/reactos/subsystems/win32/win32k/eng/semaphor.c +++ b/reactos/subsystems/win32/win32k/eng/semaphor.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/sort.c b/reactos/subsystems/win32/win32k/eng/sort.c index df6a1dab97a..0b9354bc599 100644 --- a/reactos/subsystems/win32/win32k/eng/sort.c +++ b/reactos/subsystems/win32/win32k/eng/sort.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/stretchblt.c b/reactos/subsystems/win32/win32k/eng/stretchblt.c index ee5711c6d15..932d93d5cb4 100644 --- a/reactos/subsystems/win32/win32k/eng/stretchblt.c +++ b/reactos/subsystems/win32/win32k/eng/stretchblt.c @@ -6,7 +6,7 @@ * PROGRAMER: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/string.c b/reactos/subsystems/win32/win32k/eng/string.c index 6ab902a1bb9..14cbc5be3bf 100644 --- a/reactos/subsystems/win32/win32k/eng/string.c +++ b/reactos/subsystems/win32/win32k/eng/string.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/surface.c b/reactos/subsystems/win32/win32k/eng/surface.c index 5a85d1ac1b6..c081ed51571 100644 --- a/reactos/subsystems/win32/win32k/eng/surface.c +++ b/reactos/subsystems/win32/win32k/eng/surface.c @@ -12,7 +12,7 @@ * refer to \test\microwin\src\engine\devdraw.c for info on correct pixel plotting for various formats */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/transblt.c b/reactos/subsystems/win32/win32k/eng/transblt.c index 4ef59544680..bca22440edd 100644 --- a/reactos/subsystems/win32/win32k/eng/transblt.c +++ b/reactos/subsystems/win32/win32k/eng/transblt.c @@ -27,7 +27,7 @@ * 4/6/2004: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/xlate.c b/reactos/subsystems/win32/win32k/eng/xlate.c index fcdd0b89b4b..27d06846fe8 100644 --- a/reactos/subsystems/win32/win32k/eng/xlate.c +++ b/reactos/subsystems/win32/win32k/eng/xlate.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #include diff --git a/reactos/subsystems/win32/win32k/include/win32k.h b/reactos/subsystems/win32/win32k/include/win32kp.h similarity index 100% rename from reactos/subsystems/win32/win32k/include/win32k.h rename to reactos/subsystems/win32/win32k/include/win32kp.h diff --git a/reactos/subsystems/win32/win32k/ldr/loader.c b/reactos/subsystems/win32/win32k/ldr/loader.c index 9803c8d4009..50a87560e6a 100644 --- a/reactos/subsystems/win32/win32k/ldr/loader.c +++ b/reactos/subsystems/win32/win32k/ldr/loader.c @@ -20,7 +20,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 8d106e725a3..040d3cc76ed 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -20,7 +20,7 @@ * Entry Point for win32k.sys */ -#include +#include #include #define NDEBUG diff --git a/reactos/subsystems/win32/win32k/misc/copy.c b/reactos/subsystems/win32/win32k/misc/copy.c index 5668ade27b5..a40a5be6ffb 100644 --- a/reactos/subsystems/win32/win32k/misc/copy.c +++ b/reactos/subsystems/win32/win32k/misc/copy.c @@ -1,4 +1,4 @@ -#include "w32k.h" +#include "win32k.h" NTSTATUS _MmCopyFromCaller( PVOID Target, PVOID Source, UINT Bytes ) { NTSTATUS Status = STATUS_SUCCESS; diff --git a/reactos/subsystems/win32/win32k/misc/driver.c b/reactos/subsystems/win32/win32k/misc/driver.c index e713f323e7b..1219f94effa 100644 --- a/reactos/subsystems/win32/win32k/misc/driver.c +++ b/reactos/subsystems/win32/win32k/misc/driver.c @@ -23,7 +23,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/misc/err.c b/reactos/subsystems/win32/win32k/misc/err.c index c1c66eaac94..b7fcb2cde31 100644 --- a/reactos/subsystems/win32/win32k/misc/err.c +++ b/reactos/subsystems/win32/win32k/misc/err.c @@ -27,7 +27,7 @@ * 06-06-2001 CSH Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/misc/file.c b/reactos/subsystems/win32/win32k/misc/file.c index 263ed12e0b7..1e2281aa517 100644 --- a/reactos/subsystems/win32/win32k/misc/file.c +++ b/reactos/subsystems/win32/win32k/misc/file.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/misc/math.c b/reactos/subsystems/win32/win32k/misc/math.c index 6b4fc0c9013..11ffc1ed847 100644 --- a/reactos/subsystems/win32/win32k/misc/math.c +++ b/reactos/subsystems/win32/win32k/misc/math.c @@ -19,7 +19,7 @@ Boston, MA 02110-1301, USA. */ -#include +#include /* * FIXME! Is there a better algorithm. like FT_MulDiv diff --git a/reactos/subsystems/win32/win32k/misc/registry.c b/reactos/subsystems/win32/win32k/misc/registry.c index f03de06e5f6..fcaefabb62f 100644 --- a/reactos/subsystems/win32/win32k/misc/registry.c +++ b/reactos/subsystems/win32/win32k/misc/registry.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/misc/rtlstr.c b/reactos/subsystems/win32/win32k/misc/rtlstr.c index 7e1da4b7672..06f8d3eff80 100644 --- a/reactos/subsystems/win32/win32k/misc/rtlstr.c +++ b/reactos/subsystems/win32/win32k/misc/rtlstr.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include /* FUNCTIONS *****************************************************************/ VOID diff --git a/reactos/subsystems/win32/win32k/misc/usrheap.c b/reactos/subsystems/win32/win32k/misc/usrheap.c index e8b1908fcfc..c371121c657 100644 --- a/reactos/subsystems/win32/win32k/misc/usrheap.c +++ b/reactos/subsystems/win32/win32k/misc/usrheap.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntddraw/d3d.c b/reactos/subsystems/win32/win32k/ntddraw/d3d.c index 8371ff1a882..f30f08cdae9 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/d3d.c +++ b/reactos/subsystems/win32/win32k/ntddraw/d3d.c @@ -13,7 +13,7 @@ * NtGdiDdUnlock and NtGdiDdUnlockD3D ultimately call the same function in dxg.sys */ -#include +#include #include diff --git a/reactos/subsystems/win32/win32k/ntddraw/dd.c b/reactos/subsystems/win32/win32k/ntddraw/dd.c index 9cccbce1ef0..a1207ed33a2 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dd.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dd.c @@ -8,7 +8,7 @@ * 19/1-2006 Magnus Olsen */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c index 3abbd18eed4..19b6931b01b 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c @@ -8,7 +8,7 @@ * 19/1-2006 Magnus Olsen */ -#include +#include #include PGD_DXDDSTARTUPDXGRAPHICS gpfnStartupDxGraphics = NULL; diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c b/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c index 388be271343..ae46f887e11 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c @@ -8,7 +8,7 @@ * 19/7-2006 Magnus Olsen */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntddraw/dvp.c b/reactos/subsystems/win32/win32k/ntddraw/dvp.c index de5fe6ad926..a03be0fa30c 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dvp.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dvp.c @@ -9,7 +9,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c index 586c496bdff..58413a584ff 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c @@ -6,7 +6,7 @@ * PROGRAMMERS: Magnus Olsen (magnus@greatlord.com) */ -#include +#include #include HSEMAPHORE ghsemShareDevLock = NULL; diff --git a/reactos/subsystems/win32/win32k/ntddraw/eng.c b/reactos/subsystems/win32/win32k/ntddraw/eng.c index 675b5965710..f55525a6b51 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/eng.c +++ b/reactos/subsystems/win32/win32k/ntddraw/eng.c @@ -11,7 +11,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntddraw/mocomp.c b/reactos/subsystems/win32/win32k/ntddraw/mocomp.c index 08c3f9488c4..bc80584faa9 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/mocomp.c +++ b/reactos/subsystems/win32/win32k/ntddraw/mocomp.c @@ -9,7 +9,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntuser/accelerator.c b/reactos/subsystems/win32/win32k/ntuser/accelerator.c index 544ecedcfc7..b59f1d1b7de 100644 --- a/reactos/subsystems/win32/win32k/ntuser/accelerator.c +++ b/reactos/subsystems/win32/win32k/ntuser/accelerator.c @@ -49,7 +49,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 9a8de743c54..eb4db061d10 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -14,7 +14,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/callproc.c b/reactos/subsystems/win32/win32k/ntuser/callproc.c index 866bac1afbf..dc8496dd431 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callproc.c +++ b/reactos/subsystems/win32/win32k/ntuser/callproc.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/caret.c b/reactos/subsystems/win32/win32k/ntuser/caret.c index ee5e33ba565..c75dc05c074 100644 --- a/reactos/subsystems/win32/win32k/ntuser/caret.c +++ b/reactos/subsystems/win32/win32k/ntuser/caret.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/class.c b/reactos/subsystems/win32/win32k/ntuser/class.c index f1755fecd54..b24b26f4199 100644 --- a/reactos/subsystems/win32/win32k/ntuser/class.c +++ b/reactos/subsystems/win32/win32k/ntuser/class.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/clipboard.c b/reactos/subsystems/win32/win32k/ntuser/clipboard.c index 55032c44e61..a44bbab169a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/clipboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/clipboard.c @@ -7,7 +7,7 @@ * Pablo Borobia */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/csr.c b/reactos/subsystems/win32/win32k/ntuser/csr.c index a1e425e629b..9487af53689 100644 --- a/reactos/subsystems/win32/win32k/ntuser/csr.c +++ b/reactos/subsystems/win32/win32k/ntuser/csr.c @@ -7,7 +7,7 @@ * PROGRAMER: Ge van Geldorp (ge@gse.nl) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 6c9532caae9..3fe0211ea53 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -36,7 +36,7 @@ * CURICON_PROCESS structs starting at CurIcon->ProcessList. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/defwnd.c b/reactos/subsystems/win32/win32k/ntuser/defwnd.c index 2a59f10f94b..f5e2bd1fc1d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/defwnd.c +++ b/reactos/subsystems/win32/win32k/ntuser/defwnd.c @@ -7,7 +7,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index 0f635d0cb7c..c5d76b215a5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/display.c b/reactos/subsystems/win32/win32k/ntuser/display.c index c652e30e45a..561171dedeb 100644 --- a/reactos/subsystems/win32/win32k/ntuser/display.c +++ b/reactos/subsystems/win32/win32k/ntuser/display.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/event.c b/reactos/subsystems/win32/win32k/ntuser/event.c index 2dc8eae7376..d170983d088 100644 --- a/reactos/subsystems/win32/win32k/ntuser/event.c +++ b/reactos/subsystems/win32/win32k/ntuser/event.c @@ -6,7 +6,7 @@ * PROGRAMER: James Tabor (james.tabor@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/focus.c b/reactos/subsystems/win32/win32k/ntuser/focus.c index 0f39b96674d..90702b41c00 100644 --- a/reactos/subsystems/win32/win32k/ntuser/focus.c +++ b/reactos/subsystems/win32/win32k/ntuser/focus.c @@ -18,7 +18,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/guicheck.c b/reactos/subsystems/win32/win32k/ntuser/guicheck.c index f0ee364f9d8..e3766d8c4b2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/guicheck.c +++ b/reactos/subsystems/win32/win32k/ntuser/guicheck.c @@ -33,7 +33,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index bca944e4ce7..93633370c43 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -10,7 +10,7 @@ * Copyright (C) 2002 Alexandre Julliard */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/hotkey.c b/reactos/subsystems/win32/win32k/ntuser/hotkey.c index c2585f3db7e..4ec1f1b5658 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hotkey.c +++ b/reactos/subsystems/win32/win32k/ntuser/hotkey.c @@ -40,7 +40,7 @@ windows/threads on destops not belonging to WinSta0 to set hotkeys (recieve noti /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 6b02f2d270e..78f8384460e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #include #define NDEBUG diff --git a/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c b/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c index ec07d34a82a..8ee11dc3983 100644 --- a/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c +++ b/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c @@ -12,7 +12,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index 813137856fc..242147c6659 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/keyboard.c @@ -28,7 +28,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/menu.c b/reactos/subsystems/win32/win32k/ntuser/menu.c index 9bdbe026cf8..3b1cd6a740b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/menu.c +++ b/reactos/subsystems/win32/win32k/ntuser/menu.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 1b244b0e038..01977a089da 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/metric.c b/reactos/subsystems/win32/win32k/ntuser/metric.c index 4519ff811ef..be2b1a10367 100644 --- a/reactos/subsystems/win32/win32k/ntuser/metric.c +++ b/reactos/subsystems/win32/win32k/ntuser/metric.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index 27faa8fc9e3..48ef50b7ae6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -8,7 +8,7 @@ * 2003/05/22 Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/monitor.c b/reactos/subsystems/win32/win32k/ntuser/monitor.c index 072bad97df4..541b3bfeb41 100644 --- a/reactos/subsystems/win32/win32k/ntuser/monitor.c +++ b/reactos/subsystems/win32/win32k/ntuser/monitor.c @@ -27,7 +27,7 @@ /* INCLUDES ******************************************************************/ -#include +#include /* FIXME: find include file for these */ #define MONITORINFOF_PRIMARY 1 diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 2b1fedae85a..4fc8b0e24d8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -28,7 +28,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index f9104fe5faa..2430a4df7ac 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -7,7 +7,7 @@ * REVISION HISTORY: * 04-06-2001 CSH Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/ntuser.c b/reactos/subsystems/win32/win32k/ntuser/ntuser.c index e51db8eb9a4..569acfdc54c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntuser.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntuser.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/object.c b/reactos/subsystems/win32/win32k/ntuser/object.c index cd5f59101ed..2ccc4356f75 100644 --- a/reactos/subsystems/win32/win32k/ntuser/object.c +++ b/reactos/subsystems/win32/win32k/ntuser/object.c @@ -22,7 +22,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index 66977db106f..ce612a5076a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/prop.c b/reactos/subsystems/win32/win32k/ntuser/prop.c index cf41600c224..c596c0e02a5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/prop.c +++ b/reactos/subsystems/win32/win32k/ntuser/prop.c @@ -27,7 +27,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/scrollbar.c b/reactos/subsystems/win32/win32k/ntuser/scrollbar.c index 065c7ccaeb0..8efd8721d76 100644 --- a/reactos/subsystems/win32/win32k/ntuser/scrollbar.c +++ b/reactos/subsystems/win32/win32k/ntuser/scrollbar.c @@ -10,7 +10,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/session.c b/reactos/subsystems/win32/win32k/ntuser/session.c index 1a8cddc0e49..88e453164cb 100644 --- a/reactos/subsystems/win32/win32k/ntuser/session.c +++ b/reactos/subsystems/win32/win32k/ntuser/session.c @@ -24,7 +24,7 @@ * PROGRAMER: Gunnar */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index f0dcc3a755b..77d8fb9d237 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -8,7 +8,7 @@ * 2008/03/20 Split from misc.c */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index 4768cb0d9a5..c39d06a4894 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -11,7 +11,7 @@ // - does setting invalid fonts work? // - save appropriate text metrics -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index c706805a9c8..863987f689e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/useratom.c b/reactos/subsystems/win32/win32k/ntuser/useratom.c index 61b41648600..ca72f6143d5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/useratom.c +++ b/reactos/subsystems/win32/win32k/ntuser/useratom.c @@ -24,7 +24,7 @@ * PROGRAMER: Filip Navara */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/vis.c b/reactos/subsystems/win32/win32k/ntuser/vis.c index f82ed555b72..d82e384cbf2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/vis.c +++ b/reactos/subsystems/win32/win32k/ntuser/vis.c @@ -24,7 +24,7 @@ * PROGRAMMER: Ge van Geldorp (ge@gse.nl) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index bde42e1396c..7dd06599a0e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 4445fff8fed..f95965027bd 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index 13c58617279..ab45d978c41 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -27,7 +27,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index a379a2f2655..2d26c8d39b7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -33,7 +33,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/arc.c b/reactos/subsystems/win32/win32k/objects/arc.c index e1bbc89ea65..58393036608 100644 --- a/reactos/subsystems/win32/win32k/objects/arc.c +++ b/reactos/subsystems/win32/win32k/objects/arc.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/bezier.c b/reactos/subsystems/win32/win32k/objects/bezier.c index 0071015ebe2..3e20c292590 100644 --- a/reactos/subsystems/win32/win32k/objects/bezier.c +++ b/reactos/subsystems/win32/win32k/objects/bezier.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index a02d652ce1e..6261ab46697 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -18,7 +18,7 @@ */ /* $Id: bitmaps.c 28300 2007-08-12 15:20:09Z tkreuzer $ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/bitmaps.c b/reactos/subsystems/win32/win32k/objects/bitmaps.c index 658b53dbb17..f471a67e502 100644 --- a/reactos/subsystems/win32/win32k/objects/bitmaps.c +++ b/reactos/subsystems/win32/win32k/objects/bitmaps.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index f45f6fbcdd4..c8682f6a849 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -6,7 +6,7 @@ * PROGRAMER: */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/cliprgn.c b/reactos/subsystems/win32/win32k/objects/cliprgn.c index acfc99b9a3f..c5297c38ba2 100644 --- a/reactos/subsystems/win32/win32k/objects/cliprgn.c +++ b/reactos/subsystems/win32/win32k/objects/cliprgn.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/coord.c b/reactos/subsystems/win32/win32k/objects/coord.c index 0ae25bcc10d..7310dcb1adc 100644 --- a/reactos/subsystems/win32/win32k/objects/coord.c +++ b/reactos/subsystems/win32/win32k/objects/coord.c @@ -27,7 +27,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dcattr.c b/reactos/subsystems/win32/win32k/objects/dcattr.c index 562d75473d6..9b445b1490c 100644 --- a/reactos/subsystems/win32/win32k/objects/dcattr.c +++ b/reactos/subsystems/win32/win32k/objects/dcattr.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index 1fe51886b2a..3791a6aaeb8 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #include #define NDEBUG diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index e18eb61bbc3..0bafaadd159 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dcstate.c b/reactos/subsystems/win32/win32k/objects/dcstate.c index 9e491a4f0b1..1b97ae7aca9 100644 --- a/reactos/subsystems/win32/win32k/objects/dcstate.c +++ b/reactos/subsystems/win32/win32k/objects/dcstate.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dcutil.c b/reactos/subsystems/win32/win32k/objects/dcutil.c index a8c28ecb348..f856ea19bda 100644 --- a/reactos/subsystems/win32/win32k/objects/dcutil.c +++ b/reactos/subsystems/win32/win32k/objects/dcutil.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/device.c b/reactos/subsystems/win32/win32k/objects/device.c index b1158471282..b8d322f09ac 100644 --- a/reactos/subsystems/win32/win32k/objects/device.c +++ b/reactos/subsystems/win32/win32k/objects/device.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index cc2a16efb2f..2ec35e6ee4a 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/drawing.c b/reactos/subsystems/win32/win32k/objects/drawing.c index 073ee1a97f7..0cc9a23200d 100755 --- a/reactos/subsystems/win32/win32k/objects/drawing.c +++ b/reactos/subsystems/win32/win32k/objects/drawing.c @@ -49,7 +49,7 @@ SUCH DAMAGE. Modified for ReactOS */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/fillshap.c b/reactos/subsystems/win32/win32k/objects/fillshap.c index 7da05400637..aa133f87f52 100644 --- a/reactos/subsystems/win32/win32k/objects/fillshap.c +++ b/reactos/subsystems/win32/win32k/objects/fillshap.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/font.c b/reactos/subsystems/win32/win32k/objects/font.c index 6127d835f42..a0837e1d24a 100644 --- a/reactos/subsystems/win32/win32k/objects/font.c +++ b/reactos/subsystems/win32/win32k/objects/font.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/freetype.c b/reactos/subsystems/win32/win32k/objects/freetype.c index fea0c101ee9..478863d6c13 100644 --- a/reactos/subsystems/win32/win32k/objects/freetype.c +++ b/reactos/subsystems/win32/win32k/objects/freetype.c @@ -35,7 +35,7 @@ /** Includes ******************************************************************/ -#include +#include #include #include FT_FREETYPE_H diff --git a/reactos/subsystems/win32/win32k/objects/gdibatch.c b/reactos/subsystems/win32/win32k/objects/gdibatch.c index ac174e971fb..11d3628b67d 100644 --- a/reactos/subsystems/win32/win32k/objects/gdibatch.c +++ b/reactos/subsystems/win32/win32k/objects/gdibatch.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 5af1413e69a..0f73d9b57cf 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -10,7 +10,7 @@ //#define GDI_DEBUG -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/icm.c b/reactos/subsystems/win32/win32k/objects/icm.c index 7a32146c0cb..dd99ea3d89d 100644 --- a/reactos/subsystems/win32/win32k/objects/icm.c +++ b/reactos/subsystems/win32/win32k/objects/icm.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/line.c b/reactos/subsystems/win32/win32k/objects/line.c index bbf60f426c4..173b3f91b25 100644 --- a/reactos/subsystems/win32/win32k/objects/line.c +++ b/reactos/subsystems/win32/win32k/objects/line.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/metafile.c b/reactos/subsystems/win32/win32k/objects/metafile.c index 573dde4b9dd..dbc62840154 100644 --- a/reactos/subsystems/win32/win32k/objects/metafile.c +++ b/reactos/subsystems/win32/win32k/objects/metafile.c @@ -8,7 +8,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/palette.c b/reactos/subsystems/win32/win32k/objects/palette.c index 61a50ec7ea7..8fcbbe4077c 100644 --- a/reactos/subsystems/win32/win32k/objects/palette.c +++ b/reactos/subsystems/win32/win32k/objects/palette.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/path.c b/reactos/subsystems/win32/win32k/objects/path.c index 1dfca39b381..7d6c796bdce 100644 --- a/reactos/subsystems/win32/win32k/objects/path.c +++ b/reactos/subsystems/win32/win32k/objects/path.c @@ -32,7 +32,7 @@ * PROGRAMMER: */ -#include +#include #include "math.h" #define NDEBUG diff --git a/reactos/subsystems/win32/win32k/objects/pen.c b/reactos/subsystems/win32/win32k/objects/pen.c index 6f604658107..8d02e9bdb0a 100644 --- a/reactos/subsystems/win32/win32k/objects/pen.c +++ b/reactos/subsystems/win32/win32k/objects/pen.c @@ -20,7 +20,7 @@ * $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/polyfill.c b/reactos/subsystems/win32/win32k/objects/polyfill.c index f5fdc53ed3f..1f6196a53af 100644 --- a/reactos/subsystems/win32/win32k/objects/polyfill.c +++ b/reactos/subsystems/win32/win32k/objects/polyfill.c @@ -27,7 +27,7 @@ * 21/2/2003: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/print.c b/reactos/subsystems/win32/win32k/objects/print.c index bc56a2f3845..bf21047292f 100644 --- a/reactos/subsystems/win32/win32k/objects/print.c +++ b/reactos/subsystems/win32/win32k/objects/print.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/rect.c b/reactos/subsystems/win32/win32k/objects/rect.c index d98e79ca2dd..ea58e63f0a9 100644 --- a/reactos/subsystems/win32/win32k/objects/rect.c +++ b/reactos/subsystems/win32/win32k/objects/rect.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index 3922016c338..165f86a1625 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -113,7 +113,7 @@ SOFTWARE. * the y-x-banding that's so nice to have... */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/stockobj.c b/reactos/subsystems/win32/win32k/objects/stockobj.c index 40708b6ea1b..5499a6fd956 100644 --- a/reactos/subsystems/win32/win32k/objects/stockobj.c +++ b/reactos/subsystems/win32/win32k/objects/stockobj.c @@ -22,7 +22,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/text.c b/reactos/subsystems/win32/win32k/objects/text.c index 14376a131ae..07cf12dcf21 100644 --- a/reactos/subsystems/win32/win32k/objects/text.c +++ b/reactos/subsystems/win32/win32k/objects/text.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/wingl.c b/reactos/subsystems/win32/win32k/objects/wingl.c index 150a762a151..72add55b52b 100644 --- a/reactos/subsystems/win32/win32k/objects/wingl.c +++ b/reactos/subsystems/win32/win32k/objects/wingl.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/xformobj.c b/reactos/subsystems/win32/win32k/objects/xformobj.c index 74453d58168..9ba7311ef06 100644 --- a/reactos/subsystems/win32/win32k/objects/xformobj.c +++ b/reactos/subsystems/win32/win32k/objects/xformobj.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/pch.h b/reactos/subsystems/win32/win32k/pch.h index 4bbbeb9c148..90075c80058 100644 --- a/reactos/subsystems/win32/win32k/pch.h +++ b/reactos/subsystems/win32/win32k/pch.h @@ -60,7 +60,7 @@ typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; #include /* Internal Win32K Header */ -#include "include/win32k.h" +#include "include/win32kp.h" /* Undocumented stuff */ typedef DRIVEROBJ *PDRIVEROBJ; diff --git a/reactos/subsystems/win32/win32k/stubs/stubs.c b/reactos/subsystems/win32/win32k/stubs/stubs.c index a1e610bbd6c..82a8555354a 100644 --- a/reactos/subsystems/win32/win32k/stubs/stubs.c +++ b/reactos/subsystems/win32/win32k/stubs/stubs.c @@ -2,7 +2,7 @@ * Stubs for unimplemented WIN32K.SYS exports */ -#include +#include #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ ) diff --git a/reactos/subsystems/win32/win32k/stubs/umpdstubs.c b/reactos/subsystems/win32/win32k/stubs/umpdstubs.c index 3ceadbb6e8c..9ecafb906af 100644 --- a/reactos/subsystems/win32/win32k/stubs/umpdstubs.c +++ b/reactos/subsystems/win32/win32k/stubs/umpdstubs.c @@ -1,4 +1,4 @@ -#include +#include #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ ) diff --git a/reactos/subsystems/win32/win32k/w32k.h b/reactos/subsystems/win32/win32k/win32k.h similarity index 100% rename from reactos/subsystems/win32/win32k/w32k.h rename to reactos/subsystems/win32/win32k/win32k.h diff --git a/reactos/tools/gendib/gendib.c b/reactos/tools/gendib/gendib.c index 36601b69459..a6cb9a3626e 100644 --- a/reactos/tools/gendib/gendib.c +++ b/reactos/tools/gendib/gendib.c @@ -1006,7 +1006,7 @@ Generate(char *OutputDir, unsigned Bpp) MARK(Out); Output(Out, "/* This is a generated file. Please do not edit */\n"); Output(Out, "\n"); - Output(Out, "#include \n"); + Output(Out, "#include \n"); CreateShiftTables(Out); RopInfo = FindRopInfo(ROPCODE_GENERIC); From 9721d8084b9e6220a9260db664c1c809ee655f55 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 26 Apr 2010 15:10:23 +0000 Subject: [PATCH 213/261] [USETUP] - Use newinflib instead of inflib. - Pass the user-selected language to the inf parser. - Convert registry code from ANSI APIs to UNICODE APIs. ATTENTION: This commit might break the build bot because it was not tested on a Linux system. svn path=/trunk/; revision=47037 --- reactos/base/setup/usetup/inffile.c | 4 ++++ reactos/base/setup/usetup/inffile.h | 2 ++ reactos/base/setup/usetup/interface/usetup.c | 9 ++++++++- reactos/base/setup/usetup/registry.c | 2 ++ reactos/base/setup/usetup/registry.h | 1 + reactos/base/setup/usetup/usetup.rbuild | 4 ++-- 6 files changed, 19 insertions(+), 3 deletions(-) diff --git a/reactos/base/setup/usetup/inffile.c b/reactos/base/setup/usetup/inffile.c index 51fe2e7489d..0bbde01d9da 100644 --- a/reactos/base/setup/usetup/inffile.c +++ b/reactos/base/setup/usetup/inffile.c @@ -132,6 +132,7 @@ InfpOpenInfFileW( IN PCWSTR FileName, IN PCWSTR InfClass, IN DWORD InfStyle, + IN LCID LocaleId, OUT PUINT ErrorLine) { HINF hInf = NULL; @@ -143,6 +144,7 @@ InfpOpenInfFileW( Status = InfOpenFile( &hInf, &FileNameU, + LocaleId, &ErrorLineUL); *ErrorLine = (UINT)ErrorLineUL; if (!NT_SUCCESS(Status)) @@ -252,6 +254,7 @@ INF_OpenBufferedFileA( IN ULONG FileSize, IN PCSTR InfClass, IN DWORD InfStyle, + IN LCID LocaleId, OUT PUINT ErrorLine) { #ifdef __REACTOS__ @@ -263,6 +266,7 @@ INF_OpenBufferedFileA( &hInf, FileBuffer, FileSize, + LocaleId, &ErrorLineUL); *ErrorLine = (UINT)ErrorLineUL; if (!NT_SUCCESS(Status)) diff --git a/reactos/base/setup/usetup/inffile.h b/reactos/base/setup/usetup/inffile.h index 52b002db3a9..864d2017020 100644 --- a/reactos/base/setup/usetup/inffile.h +++ b/reactos/base/setup/usetup/inffile.h @@ -110,6 +110,7 @@ InfpOpenInfFileW( IN PCWSTR FileName, IN PCWSTR InfClass, IN DWORD InfStyle, + IN LCID LocaleId, OUT PUINT ErrorLine); #endif /* __REACTOS__ */ @@ -132,6 +133,7 @@ INF_OpenBufferedFileA( IN ULONG FileSize, IN PCSTR InfClass, IN DWORD InfStyle, + IN LCID LocaleId, OUT PUINT ErrorLine); VOID INF_SetHeap( diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index 87df41628f9..ea1711ee3b2 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -79,6 +79,8 @@ static PGENERIC_LIST KeyboardList = NULL; static PGENERIC_LIST LayoutList = NULL; static PGENERIC_LIST LanguageList = NULL; +static LANGID LanguageId = 0; + /* FUNCTIONS ****************************************************************/ static VOID @@ -422,6 +424,7 @@ CheckUnattendedSetup(VOID) UnattendInf = SetupOpenInfFileW(UnattendInfPath, NULL, INF_STYLE_WIN4, + LanguageId, &ErrorLine); if (UnattendInf == INVALID_HANDLE_VALUE) @@ -678,6 +681,8 @@ LanguagePage(PINPUT_RECORD Ir) { SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList)); + LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF); + if (wcscmp(SelectedLanguageId, DefaultLanguage)) { UpdateKBLayout(); @@ -765,6 +770,7 @@ SetupStartPage(PINPUT_RECORD Ir) SetupInf = SetupOpenInfFileW(FileNameBuffer, NULL, INF_STYLE_WIN4, + LanguageId, &ErrorLine); if (SetupInf == INVALID_HANDLE_VALUE) @@ -3045,6 +3051,7 @@ PrepareCopyPage(PINPUT_RECORD Ir) InfFileSize, (const CHAR*) NULL, INF_STYLE_WIN4, + LanguageId, &ErrorLine); if (InfHandle == INVALID_HANDLE_VALUE) @@ -3274,7 +3281,7 @@ RegistryPage(PINPUT_RECORD Ir) CONSOLE_SetStatusText(MUIGetString(STRING_IMPORTFILE), File); - if (!ImportRegistryFile(File, Section, Delete)) + if (!ImportRegistryFile(File, Section, LanguageId, Delete)) { DPRINT("Importing %S failed\n", File); diff --git a/reactos/base/setup/usetup/registry.c b/reactos/base/setup/usetup/registry.c index d313b4d28bd..a8081292e67 100644 --- a/reactos/base/setup/usetup/registry.c +++ b/reactos/base/setup/usetup/registry.c @@ -617,6 +617,7 @@ registry_callback (HINF hInf, PCWSTR Section, BOOLEAN Delete) BOOLEAN ImportRegistryFile(PWSTR Filename, PWSTR Section, + LCID LocaleId, BOOLEAN Delete) { WCHAR FileNameBuffer[MAX_PATH]; @@ -632,6 +633,7 @@ ImportRegistryFile(PWSTR Filename, FileNameBuffer, NULL, INF_STYLE_WIN4, + LocaleId, &ErrorLine); if (hInf == INVALID_HANDLE_VALUE) { diff --git a/reactos/base/setup/usetup/registry.h b/reactos/base/setup/usetup/registry.h index d76470402d7..63d2b67ef8b 100644 --- a/reactos/base/setup/usetup/registry.h +++ b/reactos/base/setup/usetup/registry.h @@ -29,6 +29,7 @@ BOOLEAN ImportRegistryFile(PWSTR Filename, PWSTR Section, + LCID LocaleId, BOOLEAN Delete); BOOLEAN diff --git a/reactos/base/setup/usetup/usetup.rbuild b/reactos/base/setup/usetup/usetup.rbuild index fa96c8cd59e..51f3c0386a0 100644 --- a/reactos/base/setup/usetup/usetup.rbuild +++ b/reactos/base/setup/usetup/usetup.rbuild @@ -4,10 +4,10 @@ . . - . + . include/reactos/drivers zlib - inflib + newinflib ext2lib vfatlib ntdll From 3a0805b27a693a623549f21b403641617f4110c1 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 26 Apr 2010 15:35:57 +0000 Subject: [PATCH 214/261] [MKHIVE] Partial revert of r47019 because mkhive failed on Linux machines. svn path=/trunk/; revision=47038 --- reactos/tools/mkhive/mkhive.rbuild | 4 +- reactos/tools/mkhive/reginf.c | 108 ++++++++++++++--------------- reactos/tools/mkhive/rtl.c | 29 -------- 3 files changed, 56 insertions(+), 85 deletions(-) diff --git a/reactos/tools/mkhive/mkhive.rbuild b/reactos/tools/mkhive/mkhive.rbuild index e4778b9d803..c5d22dc1fbc 100644 --- a/reactos/tools/mkhive/mkhive.rbuild +++ b/reactos/tools/mkhive/mkhive.rbuild @@ -1,13 +1,13 @@ - . + . . . . -fshort-wchar - newinflibhost + inflibhost cmlibhost host_wcsfuncs binhive.c diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index 9e03c08c668..50d379b0ffe 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -51,34 +51,34 @@ /* FUNCTIONS ****************************************************************/ static BOOL -GetRootKey (PWCHAR Name) +GetRootKey (PCHAR Name) { - if (!_wcsicmp (Name, L"HKCR")) + if (!strcasecmp (Name, "HKCR")) { - wcscpy (Name, L"\\Registry\\Machine\\SOFTWARE\\Classes\\"); + strcpy (Name, "\\Registry\\Machine\\SOFTWARE\\Classes\\"); return TRUE; } - if (!_wcsicmp (Name, L"HKCU")) + if (!strcasecmp (Name, "HKCU")) { - wcscpy (Name, L"\\Registry\\User\\.DEFAULT\\"); + strcpy (Name, "\\Registry\\User\\.DEFAULT\\"); return TRUE; } - if (!_wcsicmp (Name, L"HKLM")) + if (!strcasecmp (Name, "HKLM")) { - wcscpy (Name, L"\\Registry\\Machine\\"); + strcpy (Name, "\\Registry\\Machine\\"); return TRUE; } - if (!_wcsicmp (Name, L"HKU")) + if (!strcasecmp (Name, "HKU")) { - wcscpy (Name, L"\\Registry\\User\\"); + strcpy (Name, "\\Registry\\User\\"); return TRUE; } #if 0 - if (!_wcsicmp (Name, L"HKR")) + if (!strcasecmp (Name, "HKR")) return FALSE; #endif @@ -94,19 +94,19 @@ GetRootKey (PWCHAR Name) static VOID AppendMultiSzValue ( IN HKEY KeyHandle, - IN PWCHAR ValueName, - IN PWCHAR Strings, + IN PCHAR ValueName, + IN PCHAR Strings, IN SIZE_T StringSize) { SIZE_T Size; ULONG Type; size_t Total; - PWCHAR Buffer; - PWCHAR p; + PCHAR Buffer; + PCHAR p; size_t len; LONG Error; - Error = RegQueryValueExW ( + Error = RegQueryValueExA ( KeyHandle, ValueName, NULL, @@ -117,11 +117,11 @@ AppendMultiSzValue ( (Type != REG_MULTI_SZ)) return; - Buffer = malloc (Size + (StringSize * sizeof(WCHAR))); + Buffer = malloc (Size + StringSize); if (Buffer == NULL) return; - Error = RegQueryValueExW ( + Error = RegQueryValueExA ( KeyHandle, ValueName, NULL, @@ -135,25 +135,25 @@ AppendMultiSzValue ( Total = Size; while (*Strings != 0) { - len = wcslen (Strings) + 1; + len = strlen (Strings) + 1; - for (p = Buffer; *p != 0; p += wcslen (p) + 1) - if (!_wcsicmp (p, Strings)) + for (p = Buffer; *p != 0; p += strlen (p) + 1) + if (!strcasecmp (p, Strings)) break; if (*p == 0) /* not found, need to append it */ { - memcpy (p, Strings, len * sizeof(WCHAR)); + memcpy (p, Strings, len); p[len] = 0; - Total += len * sizeof(WCHAR); + Total += len; } Strings += len; } if (Total != Size) { - DPRINT ("setting value %S to %S\n", ValueName, Buffer); - RegSetValueExW ( + DPRINT ("setting value %s to %s\n", ValueName, Buffer); + RegSetValueExA ( KeyHandle, ValueName, 0, @@ -175,11 +175,11 @@ done: static BOOL do_reg_operation( IN HKEY KeyHandle, - IN PWCHAR ValueName, + IN PCHAR ValueName, IN PINFCONTEXT Context, IN ULONG Flags) { - WCHAR EmptyStr = (WCHAR)0; + CHAR EmptyStr = (CHAR)0; ULONG Type; ULONG Size; LONG Error; @@ -188,11 +188,11 @@ do_reg_operation( { if (ValueName) { - RegDeleteValueW (KeyHandle, ValueName); + RegDeleteValueA (KeyHandle, ValueName); } else { - RegDeleteKeyW (KeyHandle, NULL); + RegDeleteKeyA (KeyHandle, NULL); } return TRUE; @@ -203,7 +203,7 @@ do_reg_operation( if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY)) { - Error = RegQueryValueExW ( + Error = RegQueryValueExA ( KeyHandle, ValueName, NULL, @@ -253,7 +253,7 @@ do_reg_operation( if (!(Flags & FLG_ADDREG_BINVALUETYPE) || (Type == REG_DWORD && InfHostGetFieldCount (Context) == 5)) { - WCHAR *Str = NULL; + CHAR *Str = NULL; if (Type == REG_MULTI_SZ) { @@ -262,7 +262,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size * sizeof(WCHAR)); + Str = malloc (Size); if (Str == NULL) return FALSE; @@ -292,7 +292,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size * sizeof(WCHAR)); + Str = malloc (Size); if (Str == NULL) return FALSE; @@ -302,11 +302,11 @@ do_reg_operation( if (Type == REG_DWORD) { - ULONG dw = Str ? wcstoul (Str, NULL, 0) : 0; + ULONG dw = Str ? strtoul (Str, NULL, 0) : 0; - DPRINT("setting dword %S to %x\n", ValueName, dw); + DPRINT("setting dword %s to %x\n", ValueName, dw); - RegSetValueExW ( + RegSetValueExA ( KeyHandle, ValueName, 0, @@ -316,27 +316,27 @@ do_reg_operation( } else { - DPRINT("setting value %S to %S\n", ValueName, Str); + DPRINT("setting value %s to %s\n", ValueName, Str); if (Str) { - RegSetValueExW ( + RegSetValueExA ( KeyHandle, ValueName, 0, Type, (PVOID)Str, - (ULONG)Size * sizeof(WCHAR)); + (ULONG)Size); } else { - RegSetValueExW ( + RegSetValueExA ( KeyHandle, ValueName, 0, Type, (PVOID)&EmptyStr, - (ULONG)sizeof(WCHAR)); + (ULONG)sizeof(CHAR)); } } free (Str); @@ -354,11 +354,11 @@ do_reg_operation( if (Data == NULL) return FALSE; - DPRINT("setting binary data %S len %d\n", ValueName, Size); + DPRINT("setting binary data %s len %d\n", ValueName, Size); InfHostGetBinaryField (Context, 5, Data, Size, NULL); } - RegSetValueExW ( + RegSetValueExA ( KeyHandle, ValueName, 0, @@ -378,10 +378,10 @@ do_reg_operation( * Called once for each AddReg and DelReg entry in a given section. */ static BOOL -registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) +registry_callback (HINF hInf, PCHAR Section, BOOL Delete) { - WCHAR Buffer[MAX_INF_STRING_LENGTH]; - PWCHAR ValuePtr; + CHAR Buffer[MAX_INF_STRING_LENGTH]; + PCHAR ValuePtr; ULONG Flags; size_t Length; @@ -403,11 +403,11 @@ registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) continue; /* get key */ - Length = wcslen (Buffer); + Length = strlen (Buffer); if (InfHostGetStringField (Context, 2, Buffer + Length, MAX_INF_STRING_LENGTH - (ULONG)Length, NULL) != 0) *Buffer = 0; - DPRINT("KeyName: <%S>\n", Buffer); + DPRINT("KeyName: <%s>\n", Buffer); if (Delete) { @@ -424,17 +424,17 @@ registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) if (Delete || (Flags & FLG_ADDREG_OVERWRITEONLY)) { - if (RegOpenKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegOpenKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegOpenKey(%S) failed\n", Buffer); + DPRINT("RegOpenKey(%s) failed\n", Buffer); continue; /* ignore if it doesn't exist */ } } else { - if (RegCreateKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegCreateKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegCreateKey(%S) failed\n", Buffer); + DPRINT("RegCreateKey(%s) failed\n", Buffer); continue; } } @@ -469,18 +469,18 @@ ImportRegistryFile(PCHAR FileName) ULONG ErrorLine; /* Load inf file from install media. */ - if (InfHostOpenFile(&hInf, FileName, 0, &ErrorLine) != 0) + if (InfHostOpenFile(&hInf, FileName, &ErrorLine) != 0) { DPRINT1 ("InfHostOpenFile(%s) failed\n", FileName); return FALSE; } - if (!registry_callback (hInf, L"DelReg", TRUE)) + if (!registry_callback (hInf, "DelReg", TRUE)) { DPRINT1 ("registry_callback() for DelReg failed\n"); } - if (!registry_callback (hInf, L"AddReg", FALSE)) + if (!registry_callback (hInf, "AddReg", FALSE)) { DPRINT1 ("registry_callback() for AddReg failed\n"); } diff --git a/reactos/tools/mkhive/rtl.c b/reactos/tools/mkhive/rtl.c index a68d7a0672c..e9ed22b66e0 100644 --- a/reactos/tools/mkhive/rtl.c +++ b/reactos/tools/mkhive/rtl.c @@ -207,32 +207,3 @@ unsigned char BitScanReverse(ULONG * const Index, unsigned long Mask) } return Mask ? 1 : 0; } - -#undef tolower -WCHAR towlower(WCHAR ch) -{ - if (ch < L'A') - { - return ch; - } - else if (ch <= L'Z') - { - return ch + (L'a' - L'A'); - } - - return ch; -} - -int _wcsicmp(PCWSTR cs, PCWSTR ct) -{ - while (towlower(*cs) == towlower(*ct)) - { - if (*cs == 0) - return 0; - - cs++; - ct++; - } - - return towlower(*cs) - towlower(*ct); -} From cc87229eb87615550696d543af465882182c229f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 26 Apr 2010 15:46:16 +0000 Subject: [PATCH 215/261] Comment out an ASSERT that gets trigged frequently. See issue #5320 for more details. svn path=/trunk/; revision=47039 --- reactos/subsystems/win32/win32k/ntuser/windc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index 7dd06599a0e..ed49ac6a920 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -736,7 +736,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) else { DPRINT1("Not POWNED or CLASSDC hwndCurrent -> %x \n", pDCE->hwndCurrent); - ASSERT(FALSE); + //ASSERT(FALSE); } } else From 93b98b3f84a9b6e3111a1fb4d9fdda402951c0a5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 26 Apr 2010 16:06:17 +0000 Subject: [PATCH 216/261] [MKHIVE] Revert remaining changes of r47019. svn path=/trunk/; revision=47040 --- reactos/tools/mkhive/reginf.c | 4 ++-- reactos/tools/mkhive/registry.c | 35 ++++++++------------------------- 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index 50d379b0ffe..dd8ac4596e0 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -188,7 +188,7 @@ do_reg_operation( { if (ValueName) { - RegDeleteValueA (KeyHandle, ValueName); + RegDeleteValueA (KeyHandle, ValueName); } else { @@ -253,7 +253,7 @@ do_reg_operation( if (!(Flags & FLG_ADDREG_BINVALUETYPE) || (Type == REG_DWORD && InfHostGetFieldCount (Context) == 5)) { - CHAR *Str = NULL; + PCHAR Str = NULL; if (Type == REG_MULTI_SZ) { diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index e182596e23b..3bd2c9efe60 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -25,9 +25,9 @@ /* * TODO: - * - Implement RegDeleteKeyW() + * - Implement RegDeleteKey() * - Implement RegEnumValue() - * - Implement RegQueryValueExW() + * - Implement RegQueryValueExA() */ #include @@ -246,34 +246,15 @@ RegCreateKeyA( } LONG WINAPI -RegDeleteKeyW(IN HKEY hKey, - IN LPCWSTR lpSubKey) +RegDeleteKeyA(HKEY Key, + LPCSTR Name) { - if (lpSubKey != NULL && wcschr(lpSubKey, L'\\') != NULL) - return(ERROR_INVALID_PARAMETER); + if (Name != NULL && strchr(Name, '\\') != NULL) + return(ERROR_INVALID_PARAMETER); - DPRINT1("RegDeleteKeyW: FIXME!\n"); + DPRINT1("FIXME!\n"); - return(ERROR_SUCCESS); -} - -LONG WINAPI -RegDeleteKeyA(IN HKEY hKey, - IN LPCSTR lpSubKey) -{ - PWSTR lpSubKeyW; - LONG rc; - - if (lpSubKey != NULL && strchr(lpSubKey, '\\') != NULL) - return(ERROR_INVALID_PARAMETER); - - lpSubKeyW = MultiByteToWideChar(lpSubKey); - if (!lpSubKeyW) - return ERROR_OUTOFMEMORY; - - rc = RegDeleteKeyW(hKey, lpSubKeyW); - free(lpSubKeyW); - return rc; + return(ERROR_SUCCESS); } LONG WINAPI From 5d4a67e6250155cf0c5ad7dacc9a1874a38bcfd4 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 26 Apr 2010 18:30:08 +0000 Subject: [PATCH 217/261] [NETSHELL] Fix LAN status icon resource See issue #3813 for more details. svn path=/trunk/; revision=47041 --- reactos/dll/win32/netshell/lang/bg-BG.rc | 2 +- reactos/dll/win32/netshell/lang/cs-CZ.rc | 2 +- reactos/dll/win32/netshell/lang/da-DK.rc | 2 +- reactos/dll/win32/netshell/lang/el-GR.rc | 2 +- reactos/dll/win32/netshell/lang/en-US.rc | 2 +- reactos/dll/win32/netshell/lang/es-ES.rc | 2 +- reactos/dll/win32/netshell/lang/fr-FR.rc | 2 +- reactos/dll/win32/netshell/lang/hu-HU.rc | 2 +- reactos/dll/win32/netshell/lang/id-ID.rc | 2 +- reactos/dll/win32/netshell/lang/it-IT.rc | 2 +- reactos/dll/win32/netshell/lang/ja-JP.rc | 2 +- reactos/dll/win32/netshell/lang/nl-NL.rc | 2 +- reactos/dll/win32/netshell/lang/no-NO.rc | 2 +- reactos/dll/win32/netshell/lang/pl-PL.rc | 2 +- reactos/dll/win32/netshell/lang/ro-RO.rc | 2 +- reactos/dll/win32/netshell/lang/ru-RU.rc | 2 +- reactos/dll/win32/netshell/lang/sv-SE.rc | 2 +- reactos/dll/win32/netshell/lang/uk-UA.rc | 2 +- reactos/dll/win32/netshell/lang/zh-CN.rc | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/reactos/dll/win32/netshell/lang/bg-BG.rc b/reactos/dll/win32/netshell/lang/bg-BG.rc index a42b9b510fc..c47a1813b80 100644 --- a/reactos/dll/win32/netshell/lang/bg-BG.rc +++ b/reactos/dll/win32/netshell/lang/bg-BG.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Ñêîðîñò:", -1, 19, 48, 60, 8 GROUPBOX "Äåéíîñò", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Ïðàòåíè", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 18, 20 + ICON "", IDC_NETSTAT, 110, 85, 18, 20 LTEXT "Ïîëó÷åíè", -1, 149, 90, 37, 8 LTEXT "Áàéòà:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/cs-CZ.rc b/reactos/dll/win32/netshell/lang/cs-CZ.rc index b98ecf7c9b8..c0818ab9754 100644 --- a/reactos/dll/win32/netshell/lang/cs-CZ.rc +++ b/reactos/dll/win32/netshell/lang/cs-CZ.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Rychlost:", -1, 19, 48, 60, 8 GROUPBOX "Aktivita", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Odesláno", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Pøijato", -1, 149, 90, 37, 8 LTEXT "Bytù:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/da-DK.rc b/reactos/dll/win32/netshell/lang/da-DK.rc index 682914a6d5a..d23e9c59471 100644 --- a/reactos/dll/win32/netshell/lang/da-DK.rc +++ b/reactos/dll/win32/netshell/lang/da-DK.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Hastighed:", -1, 19, 48, 60, 8 GROUPBOX "Netværks Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sendt", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT " Modtaget", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 73, 115, 44, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/el-GR.rc b/reactos/dll/win32/netshell/lang/el-GR.rc index 9df47c3fc46..c0eacd68648 100644 --- a/reactos/dll/win32/netshell/lang/el-GR.rc +++ b/reactos/dll/win32/netshell/lang/el-GR.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Ôá÷ýôçôá:", -1, 19, 48, 60, 8 GROUPBOX "Åíåñãçôéêüôçôá", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "ÁðåóôÜëëçóáí", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "ÅëÞöèçóáí", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/en-US.rc b/reactos/dll/win32/netshell/lang/en-US.rc index 350e73cd20f..a9d17bca423 100644 --- a/reactos/dll/win32/netshell/lang/en-US.rc +++ b/reactos/dll/win32/netshell/lang/en-US.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Speed:", -1, 19, 48, 60, 8 GROUPBOX "Activity", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sent", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Received", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/es-ES.rc b/reactos/dll/win32/netshell/lang/es-ES.rc index 284425b4607..bc6cedc6539 100644 --- a/reactos/dll/win32/netshell/lang/es-ES.rc +++ b/reactos/dll/win32/netshell/lang/es-ES.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Velocidad:", -1, 19, 48, 60, 8 GROUPBOX "Actividad ", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Enviados", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Recibidos", -1, 149, 90, 37, 8 LTEXT "Paquetes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/fr-FR.rc b/reactos/dll/win32/netshell/lang/fr-FR.rc index 6ca04cc5996..ed4926ca34e 100644 --- a/reactos/dll/win32/netshell/lang/fr-FR.rc +++ b/reactos/dll/win32/netshell/lang/fr-FR.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Vitesse :", -1, 19, 48, 60, 8 GROUPBOX "Activité", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Envoyés", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Reçus", -1, 149, 90, 37, 8 LTEXT "Octets :", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/hu-HU.rc b/reactos/dll/win32/netshell/lang/hu-HU.rc index dc6b75047a4..1365ac40837 100644 --- a/reactos/dll/win32/netshell/lang/hu-HU.rc +++ b/reactos/dll/win32/netshell/lang/hu-HU.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Sebesség:", -1, 19, 48, 60, 8 GROUPBOX "Tevékenység", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Elküldött", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Beérkezett", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/id-ID.rc b/reactos/dll/win32/netshell/lang/id-ID.rc index b6936192f0c..25675a79643 100644 --- a/reactos/dll/win32/netshell/lang/id-ID.rc +++ b/reactos/dll/win32/netshell/lang/id-ID.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Kecepatan:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitas", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Dikirim", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Diterima", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/it-IT.rc b/reactos/dll/win32/netshell/lang/it-IT.rc index b7168eae222..5084bd727d3 100644 --- a/reactos/dll/win32/netshell/lang/it-IT.rc +++ b/reactos/dll/win32/netshell/lang/it-IT.rc @@ -39,7 +39,7 @@ BEGIN GROUPBOX "Attività", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Inviati", -1, 26, 90, 60, 8 ICON IDI_HORIZONTAL, -1, 90, 85, 18, 20 - ICON IDI_NETSTAT, -1, 110, 85, 18, 20 + ICON "", IDC_NETSTAT, 110, 85, 18, 20 ICON IDI_HORIZONTAL, -1, 130, 85, 18, 20 LTEXT "Ricevuti", -1, 149, 90, 37, 8 LTEXT "Byte:", -1, 17, 115, 32, 8 diff --git a/reactos/dll/win32/netshell/lang/ja-JP.rc b/reactos/dll/win32/netshell/lang/ja-JP.rc index c9bdf75b1d5..dfe0ff7c58e 100644 --- a/reactos/dll/win32/netshell/lang/ja-JP.rc +++ b/reactos/dll/win32/netshell/lang/ja-JP.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "‘¬“x:", -1, 19, 48, 60, 8 GROUPBOX "“®ìó‹µ", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "‘—M", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "ŽóM", -1, 149, 90, 37, 8 LTEXT "ƒoƒCƒg:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/nl-NL.rc b/reactos/dll/win32/netshell/lang/nl-NL.rc index 914abced291..bae6286dc86 100644 --- a/reactos/dll/win32/netshell/lang/nl-NL.rc +++ b/reactos/dll/win32/netshell/lang/nl-NL.rc @@ -39,7 +39,7 @@ BEGIN LTEXT "Snelheid:", -1, 19, 48, 60, 8 GROUPBOX "Activiteit", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Verzonden", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Ontvangen", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/no-NO.rc b/reactos/dll/win32/netshell/lang/no-NO.rc index 31fafa28464..b93f14261b8 100644 --- a/reactos/dll/win32/netshell/lang/no-NO.rc +++ b/reactos/dll/win32/netshell/lang/no-NO.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Hastighet:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sendt", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Mottatt", -1, 149, 90, 37, 8 LTEXT "Byte:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/pl-PL.rc b/reactos/dll/win32/netshell/lang/pl-PL.rc index f8c9cc8dcd1..38ff75b21b2 100644 --- a/reactos/dll/win32/netshell/lang/pl-PL.rc +++ b/reactos/dll/win32/netshell/lang/pl-PL.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Szybkoœæ:", -1, 19, 48, 60, 8 GROUPBOX "Aktywnoœæ", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Wys³ano", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Odebrano", -1, 149, 90, 37, 8 LTEXT "bajtów:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/ro-RO.rc b/reactos/dll/win32/netshell/lang/ro-RO.rc index 3a52b7df5b2..06ca39c1bf8 100644 --- a/reactos/dll/win32/netshell/lang/ro-RO.rc +++ b/reactos/dll/win32/netshell/lang/ro-RO.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Vitezã:", -1, 19, 48, 60, 8 GROUPBOX "Activitate", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Trimis", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Primit", -1, 149, 90, 37, 8 LTEXT "Octeþi:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/ru-RU.rc b/reactos/dll/win32/netshell/lang/ru-RU.rc index 74c2b698959..91daab64e12 100644 --- a/reactos/dll/win32/netshell/lang/ru-RU.rc +++ b/reactos/dll/win32/netshell/lang/ru-RU.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Ñêîðîñòü:", -1, 19, 48, 60, 8 GROUPBOX "Àêòèâíîñòü", -1, 9, 74, 198, 70, BS_GROUPBOX RTEXT "Îòïðàâëåíî", -1, 20, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Ïðèíÿòî", -1, 158, 90, 37, 8 LTEXT "Áàéò:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 54, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/sv-SE.rc b/reactos/dll/win32/netshell/lang/sv-SE.rc index d7243c4e8be..78651fccbfa 100644 --- a/reactos/dll/win32/netshell/lang/sv-SE.rc +++ b/reactos/dll/win32/netshell/lang/sv-SE.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Hastighet:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Skickat", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Mottaget", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/uk-UA.rc b/reactos/dll/win32/netshell/lang/uk-UA.rc index a8abd4067c4..f109166df5a 100644 --- a/reactos/dll/win32/netshell/lang/uk-UA.rc +++ b/reactos/dll/win32/netshell/lang/uk-UA.rc @@ -45,7 +45,7 @@ BEGIN LTEXT "Øâèäê³ñòü:", -1, 19, 48, 60, 8 GROUPBOX "Àêòèâí³ñòü", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Íàä³ñëàíî", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Îòðèìàíî", -1, 149, 90, 37, 8 LTEXT "Áàéò³â:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/zh-CN.rc b/reactos/dll/win32/netshell/lang/zh-CN.rc index 184a73c0f7a..45acd1f3aa6 100644 --- a/reactos/dll/win32/netshell/lang/zh-CN.rc +++ b/reactos/dll/win32/netshell/lang/zh-CN.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "ËÙ¶È:", -1, 19, 48, 60, 8 GROUPBOX "Activity", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "·¢ËÍ", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "½ÓÊÕ", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 From 0554e844fcaa573f5b8d8daf8bbf683df98a43c8 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 26 Apr 2010 19:01:37 +0000 Subject: [PATCH 218/261] [EXPLORER] Add missing 24bpp start menu icon, created by Gabriel Ilardi See issue #5007 for more details. svn path=/trunk/; revision=47042 --- reactos/base/shell/explorer/res/startmenu.ico | Bin 25214 -> 36710 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/base/shell/explorer/res/startmenu.ico b/reactos/base/shell/explorer/res/startmenu.ico index 492e388a939f05b77da8a5a5681b2843e38b3a55..b0c5059f3d82ab5a34978dbb7ec8989290606d5a 100644 GIT binary patch delta 8744 zcmdT}d0bTG-hUu<$b8i-%WP50HZxzdZjq*_A-JH3g2=wj!p^YFoMD?8aF{v3FawSV zilVrJ;S!j+hl&d+D(+hdD9mUmm|&8(?gb-A=re>kxpglXO-kP; zWQTkA0z8B8lBDkWqe*B#LjK4i#NMs7cm_fbFv>JVHi`I?TadjNGM^Xc>9-)VHly9VdP4QSPTXa#12#Vi!El4`8Oyd}JRjMAVmuv#Z)xljZ#h@2-x1QvzatYqa*&WzG*CIUGp z7YG>)tbsk@OqsW0Tw+yIY0z0La-mS+Kw%o$-r8ioRn4E7(E#b7-m`4VqndV&g!0Vn1LI{8-+y3 zkp~_j=v`+8+sU$>25iu;n=#|WfC|5vEm|k5p9De)%NmVFmTj|G6v|K`Z#Tk#3W!ib zEC}i4jvOI@kimGD5icO9fw4$=2)f$gZqZF8`o zN+1U;)Zk1h3EH|frUN{PFpLK}-Ucb@M&Z`I2`q+AmNC^0YpOi^s>a5Y^u~Mtd1x$A z*(r40l)38wx$~bQKp@o#nP|iX-m*9ZhzK!bZc$1ZxrokG5WpqHa7yCj$U#fMhFZ){ zfWCwkaFl>!rQBK0mu}k1Z zpgOQ>)0lx`Q~hX-Y0>Ndu}i*w{q==*Oek*&sXRKGkpzNzicA8-+gT)HC33J`Bx_g# zV`yQPWsx0$?17h^MxeD*CHVw(2sTW%y? zq#&ZW1mYVfA|VMe#5Z0>;uGV!Llosp6w*i%CyK)nk0XdA#Ke=~pizp$b;>2u0NNkp zDm>mn${v}CX>LDCJG$Rn!^!TE`Q+Kz_sHI%_mIlFNDX~Ic;Eq3!?4DUi(Y)zWILc+ zp|J!0TNSDtJaA3Fywz4kzCI|kaU@dv4o=}x$6tvwwS!E~>L4p&FnTHp3=D z<3JoXWCYIGUadUh{d~U>D^{$K%MpRSTU=b6QmKSxWn=Yfi9znI6Fcgo7Od4qtu`c? z*jNm@ySw}Q`(p_|F>;>L&wg3Z7ls(ObpOv|X1oyX@O-Mr1e4sm*qFRBDwUOxYHXJwpbJIjp?n_ad#Gj~~pAw6tWwrq8Jc&g{b@X60cO&yGzRVon(n=&GE z)WK^rJ+|jL9xnRi#JchPj{9=sw6!`{yan6f;9x2xvcnKu!2^7IIE_%{D1!@9gA1}^ zFcpS?VZgOeD}@A5B+OnA@BA9{swj#)yM6xU@{cZmH39pjZR4#HhdiZxm~Q| z%X#tc2RB7su9$c2>#0|FPUa=)5#z#^u~-Fn0Y3l|Gk( z;d9pJrCM!g%0LqfX-j~&jL7itaEycd$uifQ-@0JGwRgd-1D;?C%tcIj4y5Gs#uTLq zk8O*Bcs*jA{>lSxD@^eRWZ+A{2b1|dZq_Sm@4w~7c>vz4wb1}8MqqOQ!)kC7OJ!hV zHy3DO7-08c$UaCQpoSwM4M#-Xdr0j!2>=E>0>eU6iXXiU1YuaP=A*GFc_AE8y4(wR;DOFF0^T4} z#FRmRM7~Z6|Bnq@t`S}N){EmKYB(xstd3}`j%qp{-Lqq)?qC{ll<4{nI6%e3h411K zn1UdC*N4zx`Dy~3kI;bY5CS|mz%V~G1Xckz6UXgc@t!ro(4_HLI3<4~_Rh(KyQi4D zHHrLw{b>63)iUH2CkUyW* zQkPe=#|ZahDTl~Ga+fy&L=3i^H-bL|fjHn(e=Gq|;A0PpA&{UvQVDE`behk`0T$r! zu{WTFMObR7%eh=#RKiA3v`-!g@}P}J4Bo$5eE-U-`9%IGaJ4oRR}H2!vGk z519XT^`JWAfQ4|9taK)`qJ@DZS^}I+$zJ~dSla% z*C>-eaX6U(99}sPVYS%gfe2!x8Nd%dLE4}SgaAKRt8)vIy!lXsQ*lpeH|%L|;`YYM zwuTC@YQ4F&^?FG!6WFRI5k5o&05m8lpa56^egH3W6PO?`AY#F1Tp02*uLCrNzDQ^_ z`wJg59{lOi+$#Oxe`>_}m-d^Ghe~3uhMax1rx=BEPceWG zGAR-(DhetGk}Mh-xER79^59}uSJ$3;PEZm!84$h*88{eTL9|mb8my-1`0*TMfB;WB zTAn_+hyB-|??4jB23PO~p>PJwcqi}}J01-&P);BQVh~6|0p@EPz=leUv;s+Jar#TY zfZ~98z~xG{7}nv9wXc+IZ>$6}u%t$5zX@r6>ume`)5qAUOg}YRP1ACO2P5yHUQ|$l zL{y-CZYUaj3qZ@1pUNKb3D_YGBB%0zw7Ll2yy;;m@pub)p+VnqppzE}jNu#z0a5<= z`%|2M`=yl{sqLE8S9kW)SnP&OFHAXsRH#d+C$x3qHokVElRyxle#3OVB^(0Dz0tm* z`GA}BdVP;TxB-3;ng4GKsrbM_Ug$OvK*J}3q$K>NM>oiX38(E!R}TP(zeSVO`9SpOx4RR0D<=*?h!G@7tK${>D%0}pg@XmjBgG(s@ap9J!n z1bm_K0G81l;tXqH4%!|NK@qrex(r65@y*4S3eNkt!PS$?P$_9S)JajYXckKkM>CHd zBgiMHm+;P()ofpvp+duJn2b~aQz6M=K41>>P}>6k(2NR2lg>E`Z!YgZz<-f+_?m~l z4AM|4gg~==6uGDc=nqf@kx*b8L_S~y)ioLoKdt8sU}0^R%0`52I6ROh`%?Ddog>sX zeKYOdL)L)0xwSXb)~2JlqZP%f9)kQ0v_<0pB@s7}0Tw~hf#JdA(+_dwO9=8Cg6Gkl z{XA`J0^y6{ITj59`ZcV0V-Phq8;f=HCe7Ai46Xn=sGv$CPocs!ohv{&M8AQi3d`^j z=+fVG_EmdTrvRVGU4*pLPi5{(FhZY+%^yQ>olZyp& z8UN$70KcwusRL3x`^aY1JuuyAYH&Qz_pV;kKzO(1cV#t zGZ-CF6VeX?EW>pGy;eaUT=B>W)^mlxfzOy)UlR`-jW^SA^n45ts(gNAiOnE<4C6Oa zB$rjIR^bD9!3g~_S**x2O6V0G>K`ulK~I5jLa@TPvsGD9^Rr{!)d7=JJSL?3eV!v* zYD^9G@^JI@b{7YEg$kF3i#)O8Mk4eMlLXVRE0YOq|FVG}w!aMGu^>$%mj=g1hb~Kr z&5T)?>^`2E|CUxftC$TrQsR7CwQ171E#uE^8CO#>?nu%2m>_#UPiG$=AB92zJs>2) zDk>~ET;wed_6+o25*8MglatezO-`z0bymD8S%x2VF>ca`wq`EQ@O>}N@#QSZ^ol&! z^W~10cYJoaeBz~TA6(e-=Gl#7Bt8!Ai{=?s!W@OlHz&@670*)pe3}t7ZMni{g*K}1 zhXv1Rl{Oki#7}rKY3RX{#aAllo!!2;T<T0;m+-+Pn>#u^UQMmyQL%0-vXU}VBa&hk-rDc+ z!$Gef4*Ap{_B+2@v`#rY!Fgo-?AO*U^ZvFtB2zqrHoVh@C|pMA0zdR|oe?GR%TUrU zzSvM7gx~Vi5IA&!pJko#mTB=~ai)VomdDB}(hfpoqsxtcwPiEH17<{seL!Q(%uTD5E$7$^hcfeGoa3EdNpgF4t3LF` z$)bDLHq*>^xzJpvZ?4rq+#83ZwrJ+WJB@(8>(boQ;^upJcxbg+ka=SktCE!J1LgBZ zrMi#Xnk~6|c~^VWzVS4pZidnw)DgcH%BdM=vh z>%GMK>yAnu9h4K}66f^Fa_OA&hYMP7@29<~?_&HS z)k~PWOOyttcuv#^XXb0eELTfuOKUmt z)?~)S#>Vn?GR7`Wj1$XZBa@iejPw+ZO15=%>Vw839jzBQ3*Ds_QvI`ufWDInw+@T9 zvwuh4gFDsm z0v!D0;gyco^Dxh!U9A4$XlzBXWW%}wV}?q;JS7;}S>-=DT{IIBvr;YLsq^RctFqUu zq-nPAR#uXG^-TH0rlY+et>5wE^$h^&ozuEAdzf6Etnd7i)j1}uOe1kJGTzzC;`_cb z<=DPDV(U8n_lJsZp4oi=`ZmjzlItgypQuPLHYHXzelD@ae{F`kcB;C%8b;wD0&@c@ zU?Yxp9H_2uq0)YdLxB4sI2>?{qW5?&z+6EU>M0r{8+xd5q@iX^9rO0{Lka%5jiaZW zn!a{<-!yUH!Vw$R=I7>UGcqz%Divx#R#q0;a1=X){&3a$d@Y+C78fu_Bbq7nT^Jtd z7!y1_B4}oi??QwK{#l)-PEJXTTb7pE1GT~&CHPbpdaRM#XNG+I-CF0%+drw@GAYn~ zdRnjpB2*JJO&{mp<5)~CWP?x*@Kt?!dyvL&(sHR|y5DEZ!^Y>SWDY({7bQga%Y^u6 zeeZUwD(dd{$(Qyg7R1j?^ZMTswM(k|`}+%B&Tg5o)MG)M#QNJ3zhL*SEsZr9o3)}us@lPAw2N`+gKfWZO_8AKzpg* z99dk9R4Of7zd{+cbi?{J>kHEm8NYQtM0BG$eOSNUQfFv79;0OzWa`qx+^5D17bDvI zN>*xD<)jqkWfbM>ny&4qAIv=r&ShTQ7nz+FqgO_0qQ}*hKc=5(`OH_ KeDvPfF|DB&sw_X1%=Mv>;74`I}Ri}d;L~jw%;9$02)QPS`H!{-PcM-jhC*$X7I7hT+ zpvBMA&uv6UHnjM8I(P@svm0CdK{}Wxx^#DoKS+z~;dtx4tpiYOA^P@yqUgk?jnQ(o zGyY`LRIZm*tQu=T7I*#0Do1PVzBg(t+Oc_k9~(cb(N|%OIYtMS=V}bW(+-7xoga@b zZSH=??MFKe+eM8~>@9-p!&oyz3&VS8eF^1$R&xv_Rv)fAbHIX zuen)SS%J=@hQje`G(Q^ICOWAN?A1issVLm@$Hs&;LYka?&C)%rRw=|(YTFs#2ZqfU zyWo*tcI%Q`L|KlTU;{ohDheRD_o}E0D&kCBeCEgn^=y#!BO;37@gj`k_!3<9~A|3mNWP zD2>Y`_lq9r`Y3Z<7ko#W%AYR)*BST=q6pX`-f$bt<=mlC@EGXa7BX^FNQ~EIg|wM01eF6rONOJ%`JGYMrsF5Syrr(d%%Qxn zguwrDt!s^%mQbnvPlOO=NeCa!NekVAeY9xC@MR299U+mO7T5^W6iGPC7d+(U`zfG9 zA2J0bah#xYhLKj1gr_G<%r%WCmv}H^nx-#GX%BQ;Pq<7>lUXNm4!nI{>Rq7OoY_Xv zH%Ac$Wi3I~WsoEx^NpeilZ5niQgA}&9EFdH%J~xXR%V7mbWi%G85l<3j)iDqY97;u zLeCaP1MV0_eyZG36ZjWQE0B`Um=;&pB$I$Sg%UzS`wb(UYpIEIs4-O%Z7meD!BQZ~ zkg9FQ#UKrAsojMS)eHpj$ r8*X9`-i-Ie2fF)n@$3B6?lmI-_TLO{jtj#-v_~fnb;cizpV{~y)r9y7 From 42c28cc44f397363225de805fe8afb07ba408e80 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 19:50:11 +0000 Subject: [PATCH 219/261] [SHELL32] - Start implementing file copy / move / delete dialog - Not yet enabled svn path=/trunk/; revision=47043 --- reactos/dll/win32/shell32/lang/en-US.rc | 11 ++ reactos/dll/win32/shell32/shlfileop.c | 214 +++++++++++++++++++++--- reactos/dll/win32/shell32/shresdef.h | 1 + 3 files changed, 205 insertions(+), 21 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 6e8aef34ee0..04df98d1e60 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -373,6 +373,17 @@ BEGIN PUSHBUTTON "Cancel", 14006, 206, 236, 50, 14 END +IDD_SH_FILE_COPY DIALOGEX 0, 0, 264, 45 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +CAPTION "Copying..." +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + PUSHBUTTON "Cancel", 14002, 195, 14, 60, 16 + CONTROL "", 14000, "MSCTLS_PROGRESS32", 0, 8, 20, 170, 10 + LTEXT "File", 14001, 8, 6, 169, 10 +END + + FOLDER_OPTIONS_GENERAL_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "General" diff --git a/reactos/dll/win32/shell32/shlfileop.c b/reactos/dll/win32/shell32/shlfileop.c index 6992d187ee4..defe95facd6 100644 --- a/reactos/dll/win32/shell32/shlfileop.c +++ b/reactos/dll/win32/shell32/shlfileop.c @@ -33,6 +33,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); #define IsDotDir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0)))) #define FO_MASK 0xF +#define WM_FILE (WM_USER + 1) +#define TIMER_ID (100) static const WCHAR wWildcardFile[] = {'*',0}; static const WCHAR wWildcardChars[] = {'*','?',0}; @@ -52,6 +54,40 @@ typedef struct BOOL bCancelled; } FILE_OPERATION; +#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 + +typedef struct +{ + DWORD attributes; + LPWSTR szDirectory; + LPWSTR szFilename; + LPWSTR szFullPath; + BOOL bFromWildcard; + BOOL bFromRelative; + BOOL bExists; +} FILE_ENTRY; + +typedef struct +{ + FILE_ENTRY *feFiles; + DWORD num_alloc; + DWORD dwNumFiles; + BOOL bAnyFromWildcard; + BOOL bAnyDirectories; + BOOL bAnyDontExist; +} FILE_LIST; + +typedef struct +{ + FILE_LIST * from; + FILE_LIST * to; + FILE_OPERATION * op; + DWORD Index; + HWND hDlgCtrl; + HWND hwndDlg; +}FILE_OPERATION_CONTEXT; + + /* Confirm dialogs with an optional "Yes To All" as used in file operations confirmations */ static const WCHAR CONFIRM_MSG_PROP[] = {'W','I','N','E','_','C','O','N','F','I','R','M',0}; @@ -514,6 +550,163 @@ static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest) return GetLastError(); } +static WINAPI DWORD SHOperationProgressRoutine(LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData) +{ + FILE_OPERATION_CONTEXT * Context; + LARGE_INTEGER Progress; + + /* get context */ + Context = (FILE_OPERATION_CONTEXT*)lpData; + + if (TotalBytesTransferred.QuadPart) + { + Progress.QuadPart = (TotalBytesTransferred.QuadPart * 100) / TotalFileSize.QuadPart; + } + else + { + Progress.QuadPart = 1; + } + + /* update progress bar */ + SendMessageW(Context->hDlgCtrl, PBM_SETPOS, (WPARAM)Progress.u.LowPart, 0); + + if (TotalBytesTransferred.QuadPart == TotalFileSize.QuadPart) + { + /* file was copied */ + Context->Index++; + PostMessageW(Context->hwndDlg, WM_FILE, 0, 0); + } + + return PROGRESS_CONTINUE; +} + +BOOL +QueueFile( + FILE_OPERATION_CONTEXT * Context) +{ + FILE_ENTRY * from, *to; + BOOL bRet = FALSE; + + if (Context->Index >= Context->from->dwNumFiles) + return FALSE; + + /* get current file */ + from = &Context->from->feFiles[Context->Index]; + + if (Context->op->req->fFlags != FO_DELETE) + to = &Context->to->feFiles[Context->Index]; + + /* update status */ + SendDlgItemMessageW(Context->hwndDlg, 14001, WM_SETTEXT, 0, (LPARAM)from->szFullPath); + + if (Context->op->req->wFunc == FO_COPY) + { + bRet = CopyFileExW(from->szFullPath, to->szFullPath, SHOperationProgressRoutine, (LPVOID)Context, &Context->op->bCancelled, 0); + } + else if (Context->op->req->wFunc == FO_MOVE) + { + //bRet = MoveFileWithProgressW(from->szFullPath, to->szFullPath, SHOperationProgressRoutine, (LPVOID)Context, MOVEFILE_COPY_ALLOWED); + } + else if (Context->op->req->wFunc == FO_DELETE) + { + bRet = DeleteFile(from->szFullPath); + } + + return bRet; +} + +static INT_PTR CALLBACK SHOperationDialog(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + FILE_OPERATION_CONTEXT * Context; + + Context = (FILE_OPERATION_CONTEXT*) GetWindowLongPtr(hwndDlg, DWLP_USER); + + switch(uMsg) + { + case WM_INITDIALOG: + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG)lParam); + + /* get context */ + Context = (FILE_OPERATION_CONTEXT*)lParam; + + /* store progress bar handle */ + Context->hDlgCtrl = GetDlgItem(hwndDlg, 14000); + + /* store window handle */ + Context->hwndDlg = hwndDlg; + + /* set progress bar range */ + (void)SendMessageW(Context->hDlgCtrl, (UINT) PBM_SETRANGE, 0, MAKELPARAM(0, 100)); + + /* start file queueing */ + SetTimer(hwndDlg, TIMER_ID, 1000, NULL); + //QueueFile(Context); + + return TRUE; + + case WM_CLOSE: + Context->op->bCancelled = TRUE; + EndDialog(hwndDlg, Context->op->bCancelled); + return TRUE; + case WM_COMMAND: + if (LOWORD(wParam) == 14002) + { + Context->op->bCancelled = TRUE; + EndDialog(hwndDlg, Context->op->bCancelled); + return TRUE; + } + break; + case WM_TIMER: + if (wParam == TIMER_ID) + { + QueueFile(Context); + KillTimer(hwndDlg, TIMER_ID); + } + break; + case WM_FILE: + if (!QueueFile(Context)) + EndDialog(hwndDlg, Context->op->bCancelled); + default: + break; + } + return FALSE; +} + +HRESULT +SHShowFileOperationDialog(FILE_OPERATION *op, FILE_LIST *flFrom, FILE_LIST *flTo) +{ + HWND hwnd; + BOOL bRet; + MSG msg; + FILE_OPERATION_CONTEXT Context; + + Context.from = flFrom; + Context.to = flTo; + Context.op = op; + Context.Index = 0; + Context.op->bCancelled = FALSE; + + hwnd = CreateDialogParam(shell32_hInstance, MAKEINTRESOURCE(IDD_SH_FILE_COPY), NULL, SHOperationDialog, (LPARAM)&Context); + if (hwnd == NULL) + { + ERR("Failed to create dialog\n"); + return E_FAIL; + } + ShowWindow(hwnd, SW_SHOWNORMAL); + + while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) + { + if (!IsWindow(hwnd) || !IsDialogMessage(hwnd, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return NOERROR; +} + + /************************************************************************ * SHNotifyCopyFile [internal] * @@ -808,28 +1001,7 @@ int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp) return retCode; } -#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 -typedef struct -{ - DWORD attributes; - LPWSTR szDirectory; - LPWSTR szFilename; - LPWSTR szFullPath; - BOOL bFromWildcard; - BOOL bFromRelative; - BOOL bExists; -} FILE_ENTRY; - -typedef struct -{ - FILE_ENTRY *feFiles; - DWORD num_alloc; - DWORD dwNumFiles; - BOOL bAnyFromWildcard; - BOOL bAnyDirectories; - BOOL bAnyDontExist; -} FILE_LIST; static void __inline grow_list(FILE_LIST *list) diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index 93b50975a07..43e409cbf44 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -193,6 +193,7 @@ #define IDD_TREEVIEW 0x3741 #define SHELL_EXTENDED_SHORTCUT_DLG 0x4000 #define OPEN_WITH_PROGRAMM_DLG 0x4001 +#define IDD_SH_FILE_COPY 0x4002 /* ID's of the ShellAbout controls */ // Part 1 - ID's identical to Windows Server 2003 SP1's shell32.dll From 2e62657924092429314dd529c04a9eaa4c814ba5 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Tue, 27 Apr 2010 06:31:32 +0000 Subject: [PATCH 220/261] Update rapps Database to recent Versions. svn path=/trunk/; revision=47046 --- reactos/base/applications/rapps/rapps/mirandaim.txt | 4 ++-- reactos/base/applications/rapps/rapps/opera.txt | 6 +++--- reactos/base/applications/rapps/rapps/scite.txt | 4 ++-- reactos/base/applications/rapps/rapps/utorrent.txt | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt index db0b17f1ab6..e1f66280ecc 100644 --- a/reactos/base/applications/rapps/rapps/mirandaim.txt +++ b/reactos/base/applications/rapps/rapps/mirandaim.txt @@ -2,13 +2,13 @@ [Section] Name = Miranda IM -Version = 0.8.19 +Version = 0.8.21 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 1.6MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.19-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.21-unicode.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/opera.txt b/reactos/base/applications/rapps/rapps/opera.txt index 44e49cc61ac..aee4c21a933 100644 --- a/reactos/base/applications/rapps/rapps/opera.txt +++ b/reactos/base/applications/rapps/rapps/opera.txt @@ -2,13 +2,13 @@ [Section] Name = Opera -Version = 10.51 +Version = 10.52 Licence = Freeware Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. -Size = 11.0M +Size = 12.0M Category = 5 URLSite = http://www.opera.com/ -URLDownload = http://get4.opera.com/pub/opera/win/1051/int/Opera_1051_int_Setup.exe +URLDownload = http://get4.opera.com/pub/opera/win/1052/int/Opera_1052_int_Setup.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/scite.txt b/reactos/base/applications/rapps/rapps/scite.txt index 1f8208b2153..c32df9cd195 100644 --- a/reactos/base/applications/rapps/rapps/scite.txt +++ b/reactos/base/applications/rapps/rapps/scite.txt @@ -2,13 +2,13 @@ [Section] Name = SciTE -Version = 2.10 +Version = 2.11 Licence = Freeware Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs. Size = 0.6M Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc210.exe +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc211.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/utorrent.txt b/reactos/base/applications/rapps/rapps/utorrent.txt index 988263777c5..ffcded74c34 100644 --- a/reactos/base/applications/rapps/rapps/utorrent.txt +++ b/reactos/base/applications/rapps/rapps/utorrent.txt @@ -2,13 +2,13 @@ [Section] Name = µTorrent -Version = 2.0 +Version = 2.0.1 Licence = Freeware for non-commercial uses Description = Small and fast BitTorrent Client. -Size = 312K +Size = 314K Category = 5 URLSite = http://www.utorrent.com/ -URLDownload = http://download.utorrent.com/2.0/utorrent.exe +URLDownload = http://download.utorrent.com/2.0.1/utorrent.exe CDPath = none From e2463c955c8dcb8fbbec110b13474882cdfc805a Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 27 Apr 2010 13:06:42 +0000 Subject: [PATCH 221/261] [KMTEST] - Add KeStallExecutionProcessor test. svn path=/trunk/; revision=47047 --- rostests/drivers/kmtest/kmtest.c | 2 + rostests/drivers/kmtest/kmtest.rbuild | 1 + rostests/drivers/kmtest/ntos_ke.c | 86 +++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 rostests/drivers/kmtest/ntos_ke.c diff --git a/rostests/drivers/kmtest/kmtest.c b/rostests/drivers/kmtest/kmtest.c index 948797a3273..964486a93f6 100644 --- a/rostests/drivers/kmtest/kmtest.c +++ b/rostests/drivers/kmtest/kmtest.c @@ -106,6 +106,7 @@ PWCHAR CreateLowerDeviceRegistryKey(PUNICODE_STRING RegistryPath, PWCHAR NewDriv * Test Declarations */ VOID NtoskrnlIoTests(); +VOID NtoskrnlKeTests(); VOID NtoskrnlObTest(); VOID NtoskrnlExecutiveTests(); VOID NtoskrnlPoolsTest(); @@ -214,6 +215,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, ThisDriverObject = DriverObject; NtoskrnlExecutiveTests(); + NtoskrnlKeTests(); NtoskrnlIoTests(); NtoskrnlObTest(); NtoskrnlPoolsTest(); diff --git a/rostests/drivers/kmtest/kmtest.rbuild b/rostests/drivers/kmtest/kmtest.rbuild index e45f8a6baea..9219db9f9c1 100644 --- a/rostests/drivers/kmtest/kmtest.rbuild +++ b/rostests/drivers/kmtest/kmtest.rbuild @@ -12,6 +12,7 @@ reghelper.c ntos_ex.c ntos_io.c + ntos_ke.c ntos_ob.c ntos_pools.c kmtest.rc diff --git a/rostests/drivers/kmtest/ntos_ke.c b/rostests/drivers/kmtest/ntos_ke.c new file mode 100644 index 00000000000..1c6032238be --- /dev/null +++ b/rostests/drivers/kmtest/ntos_ke.c @@ -0,0 +1,86 @@ +/* + * NTOSKRNL Executive Regressions KM-Test + * ReactOS Kernel Mode Regression Testing framework + * + * Copyright 2006 Aleksey Bragin + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* INCLUDES *******************************************************************/ + +#include +#include +#include +#include "kmtest.h" + +#define NDEBUG +#include "debug.h" + +/* PRIVATE FUNCTIONS ***********************************************************/ + +VOID +NTAPI +KeStallTest() +{ + ULONG i; + LARGE_INTEGER TimeStart, TimeFinish; + + StartTest(); + + DPRINT1("Waiting for 30 secs with 50us stalls...\n"); + KeQuerySystemTime(&TimeStart); + for (i = 0; i < (30*1000*20); i++) + { + KeStallExecutionProcessor(50); + } + KeQuerySystemTime(&TimeFinish); + DPRINT1("Time elapsed: %d secs\n", (TimeFinish.QuadPart - TimeStart.QuadPart) / 10000000); // 30 + + DPRINT1("Waiting for 30 secs with 1000us stalls...\n"); + KeQuerySystemTime(&TimeStart); + for (i = 0; i < (30*1000); i++) + { + KeStallExecutionProcessor(1000); + } + KeQuerySystemTime(&TimeFinish); + DPRINT1("Time elapsed: %d secs\n", (TimeFinish.QuadPart - TimeStart.QuadPart) / 10000000); // 30 + + DPRINT1("Waiting for 30 secs with 1us stalls...\n"); + KeQuerySystemTime(&TimeStart); + for (i = 0; i < (30*1000*1000); i++) + { + KeStallExecutionProcessor(1); + } + KeQuerySystemTime(&TimeFinish); + DPRINT1("Time elapsed: %d secs\n", (TimeFinish.QuadPart - TimeStart.QuadPart) / 10000000); // 43 + + DPRINT1("Waiting for 30 secs with one huge stall...\n"); + KeQuerySystemTime(&TimeStart); + KeStallExecutionProcessor(30*1000000); + KeQuerySystemTime(&TimeFinish); + DPRINT1("Time elapsed: %d secs\n", (TimeFinish.QuadPart - TimeStart.QuadPart) / 10000000); // 30 + + FinishTest("NTOSKRNL KeStallmanExecution test"); +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +VOID +NtoskrnlKeTests() +{ + KeStallTest(); +} From 60eddf565732fba67b051990f95c1471710cd8f9 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Tue, 27 Apr 2010 13:35:52 +0000 Subject: [PATCH 222/261] [ntoskrnl\mm] - Fix a continuous loop bug in MiWriteProtectSystemImage. svn path=/trunk/; revision=47048 --- reactos/ntoskrnl/mm/sysldr.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 1fb86f95d01..fcecf3c8da5 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -2154,6 +2154,10 @@ MiWriteProtectSystemImage(IN PVOID ImageBase) { /* Same protection, so merge the request */ CurrentAddress = BaseAddress + Size - 1; + + /* Next */ + Sections--; + Section++; continue; } From 02c3f0fa12720e3962587014c8d825a20dd7106e Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Tue, 27 Apr 2010 13:41:37 +0000 Subject: [PATCH 223/261] [ntoskrnl/io] - Check for null pointers before attempting to copy or free memory. svn path=/trunk/; revision=47049 --- reactos/ntoskrnl/io/iomgr/deviface.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 8a8db7a843f..7d97336cc16 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -884,7 +884,8 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, NextReferenceString: ExFreePool(ReferenceBi); ReferenceBi = NULL; - ExFreePool(bip); + if (bip) + ExFreePool(bip); bip = NULL; if (ReferenceKey != INVALID_HANDLE_VALUE) { @@ -921,8 +922,11 @@ NextReferenceString: Status = STATUS_INSUFFICIENT_RESOURCES; goto cleanup; } - RtlCopyMemory(NewBuffer, ReturnBuffer.Buffer, ReturnBuffer.Length); - ExFreePool(ReturnBuffer.Buffer); + if (ReturnBuffer.Buffer) + { + RtlCopyMemory(NewBuffer, ReturnBuffer.Buffer, ReturnBuffer.Length); + ExFreePool(ReturnBuffer.Buffer); + } ReturnBuffer.Buffer = NewBuffer; } ReturnBuffer.Buffer[ReturnBuffer.Length / sizeof(WCHAR)] = UNICODE_NULL; From d39102cd836a3465172f862fa037132b448d1b85 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 27 Apr 2010 21:47:54 +0000 Subject: [PATCH 224/261] [MKHIVE] - Add RegDeleteKeyW stub. - Implement RegDeleteKeyA so that it calls RegDeleteKeyW. svn path=/trunk/; revision=47050 --- reactos/tools/mkhive/registry.c | 39 ++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index 3bd2c9efe60..a6d7d4b248f 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -25,9 +25,9 @@ /* * TODO: - * - Implement RegDeleteKey() + * - Implement RegDeleteKeyW() * - Implement RegEnumValue() - * - Implement RegQueryValueExA() + * - Implement RegQueryValueExW() */ #include @@ -246,15 +246,38 @@ RegCreateKeyA( } LONG WINAPI -RegDeleteKeyA(HKEY Key, - LPCSTR Name) +RegDeleteKeyW( + IN HKEY hKey, + IN LPCWSTR lpSubKey) { - if (Name != NULL && strchr(Name, '\\') != NULL) - return(ERROR_INVALID_PARAMETER); + DPRINT1("FIXME!\n"); + return ERROR_SUCCESS; +} - DPRINT1("FIXME!\n"); +LONG WINAPI +RegDeleteKeyA( + IN HKEY hKey, + IN LPCSTR lpSubKey) +{ + PWSTR lpSubKeyW = NULL; + LONG rc; - return(ERROR_SUCCESS); + if (lpSubKey != NULL && strchr(lpSubKey, '\\') != NULL) + return ERROR_INVALID_PARAMETER; + + if (lpSubKey) + { + lpSubKeyW = MultiByteToWideChar(lpSubKey); + if (!lpSubKeyW) + return ERROR_OUTOFMEMORY; + } + + rc = RegDeleteKeyW(hKey, lpSubKeyW); + + if (lpSubKey) + free(lpSubKeyW); + + return rc; } LONG WINAPI From 5f783c4e2d6dd11d366ffd9a8636a03b5819cd2f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 27 Apr 2010 22:12:11 +0000 Subject: [PATCH 225/261] [FREELDR] - Set the partition count to 0 for a floppy drive so it can be told apart from a cd-rom drive - Add a last-chance sector size detection algorithm based on the partition number - Add the same detection code to the xbox code too (it is essentially the same as what was already there just with more comments) - Change DiskNormalizeSystemPath so it doesn't try to "normalize" a floppy boot path - Fixes bug #5233 svn path=/trunk/; revision=47051 --- .../boot/freeldr/freeldr/arch/i386/hardware.c | 18 +++++++++++++++++- .../boot/freeldr/freeldr/arch/i386/xboxhw.c | 15 ++++++++++++++- reactos/boot/freeldr/freeldr/disk/disk.c | 2 +- reactos/boot/freeldr/freeldr/reactos/arcname.c | 2 +- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index 1dff167c987..97577aa020c 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -452,7 +452,23 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) SectorCount = Geometry.Sectors; } else - return EINVAL; + { + DPRINTM(DPRINT_HWDETECT, "Using legacy sector size detection\n"); + + /* Fall back to legacy detection */ + if (DrivePartition == 0xff) + { + /* This is a CD-ROM device */ + SectorSize = 2048; + } + else + { + /* This is either a floppy disk device (DrivePartition == 0) or + * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but + * it doesn't matter which one because they both have 512 bytes per sector */ + SectorSize = 512; + } + } if (DrivePartition != 0xff && DrivePartition != 0) { diff --git a/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c b/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c index 5c7680b17ae..ff325b3dd49 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c @@ -138,7 +138,20 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition)) return EINVAL; - SectorSize = (DrivePartition == 0xff ? 2048 : 512); + + if (DrivePartition == 0xff) + { + /* This is a CD-ROM device */ + SectorSize = 2048; + } + else + { + /* This is either a floppy disk device (DrivePartition == 0) or + * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but + * it doesn't matter which one because they both have 512 bytes per sector */ + SectorSize = 512; + } + if (DrivePartition != 0xff && DrivePartition != 0) { if (!XboxDiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry)) diff --git a/reactos/boot/freeldr/freeldr/disk/disk.c b/reactos/boot/freeldr/freeldr/disk/disk.c index 16ee1be7ad9..a5a65103aac 100644 --- a/reactos/boot/freeldr/freeldr/disk/disk.c +++ b/reactos/boot/freeldr/freeldr/disk/disk.c @@ -136,7 +136,7 @@ DiskNormalizeSystemPath(char *SystemPath, unsigned Size) return FALSE; } - if (0 != PartitionNumber) + if (0 != PartitionNumber || DriveNumber < 0x80) { return TRUE; } diff --git a/reactos/boot/freeldr/freeldr/reactos/arcname.c b/reactos/boot/freeldr/freeldr/reactos/arcname.c index 3ca69fadb51..3fe1fc6bd26 100644 --- a/reactos/boot/freeldr/freeldr/reactos/arcname.c +++ b/reactos/boot/freeldr/freeldr/reactos/arcname.c @@ -60,7 +60,7 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B if (p == NULL) return FALSE; p++; - *BootPartition = 0xff; + *BootPartition = 0; } else if (_strnicmp(p, "cdrom(", 6) == 0) { From 9adb79a0d9b3604895b167c6c8e9af526539cb9e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 28 Apr 2010 03:07:21 +0000 Subject: [PATCH 226/261] [FREELDR] - Remove the useless function MachDiskNormalizeSystemPath - Rewrite DiskGetBootPath to be much less hacky (but still not hack free) - Freeloader doesn't have to be installed on multi(0)disk(0)rdisk(0)partition(1) (IDE primary master) anymore :) - Freeloader successfully booted ROS after loading itself from multi(0)disk(0)rdisk(1)partition(1) svn path=/trunk/; revision=47052 --- .../boot/freeldr/freeldr/arch/i386/machpc.c | 1 - .../boot/freeldr/freeldr/arch/i386/machxbox.c | 1 - .../boot/freeldr/freeldr/arch/i386/miscboot.c | 6 - .../boot/freeldr/freeldr/arch/powerpc/mach.c | 1 - reactos/boot/freeldr/freeldr/disk/disk.c | 120 ++++++++++-------- reactos/boot/freeldr/freeldr/disk/partition.c | 4 - reactos/boot/freeldr/freeldr/include/disk.h | 1 - .../boot/freeldr/freeldr/include/machine.h | 1 - reactos/boot/freeldr/freeldr/linuxboot.c | 7 - reactos/boot/freeldr/freeldr/machine.c | 7 - .../boot/freeldr/freeldr/reactos/arcname.c | 2 +- .../boot/freeldr/freeldr/reactos/reactos.c | 6 - 12 files changed, 70 insertions(+), 87 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machpc.c b/reactos/boot/freeldr/freeldr/arch/i386/machpc.c index 74f3e22ee4c..1b985f28c4d 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machpc.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/machpc.c @@ -45,7 +45,6 @@ PcMachInit(const char *CmdLine) MachVtbl.PrepareForReactOS = PcPrepareForReactOS; MachVtbl.GetMemoryMap = PcMemGetMemoryMap; MachVtbl.DiskGetBootPath = DiskGetBootPath; - MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry; MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c b/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c index 442c7be2f1d..704a7ae91cc 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c @@ -48,7 +48,6 @@ XboxMachInit(const char *CmdLine) MachVtbl.PrepareForReactOS = XboxPrepareForReactOS; MachVtbl.GetMemoryMap = XboxMemGetMemoryMap; MachVtbl.DiskGetBootPath = DiskGetBootPath; - MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = XboxDiskGetDriveGeometry; MachVtbl.DiskGetCacheableBlockCount = XboxDiskGetCacheableBlockCount; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c b/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c index e0aa98cfd50..1f30141ce7f 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c @@ -44,12 +44,6 @@ VOID LoadAndBootBootSector(PCSTR OperatingSystemName) return; } - if (!MachDiskNormalizeSystemPath(FileName, sizeof(FileName))) - { - UiMessageBox("Invalid path to boot sector file"); - return; - } - FilePointer = FsOpenFile(FileName); if (!FilePointer) { diff --git a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c index 57cacd27675..9abd56bca53 100644 --- a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c +++ b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c @@ -440,7 +440,6 @@ void PpcDefaultMachVtbl() MachVtbl.GetMemoryMap = PpcGetMemoryMap; - MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskGetBootPath = PpcDiskGetBootPath; MachVtbl.DiskReadLogicalSectors = PpcDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = PpcDiskGetDriveGeometry; diff --git a/reactos/boot/freeldr/freeldr/disk/disk.c b/reactos/boot/freeldr/freeldr/disk/disk.c index a5a65103aac..b7ce3295497 100644 --- a/reactos/boot/freeldr/freeldr/disk/disk.c +++ b/reactos/boot/freeldr/freeldr/disk/disk.c @@ -107,62 +107,80 @@ DiskGetBootPath(char *BootPath, unsigned Size) { static char Path[] = "multi(0)disk(0)"; char Device[4]; - - _itoa(BootDrive, Device, 10); - if (Size <= sizeof(Path) + 6 + strlen(Device)) + char Partition[4]; + PARTITION_TABLE_ENTRY PartitionEntry; + MASTER_BOOT_RECORD MasterBootRecord; + + if (BootDrive < 0x80) { - return FALSE; + /* This is a floppy */ + + if (Size <= sizeof(Path) + 7 + strlen(Device)) + { + return FALSE; + } + + strcpy(BootPath, Path); + + strcat(BootPath, "fdisk"); + + _itoa(BootDrive, Device, 10); + strcat(BootPath, "("); + strcat(BootPath, Device); + strcat(BootPath, ")"); } - strcpy(BootPath, Path); - strcat(BootPath, BootDrive < 0x80 ? "fdisk" : "cdrom"); - strcat(strcat(strcat(BootPath, "("), Device), ")"); - - if (strcmp(BootPath, "multi(0)disk(0)cdrom(128)") == 0) - strcpy(BootPath, "multi(0)disk(0)rdisk(0)partition(1)"); + /* FIXME */ + else if (DiskReadBootRecord(BootDrive, 0, &MasterBootRecord)) + { + /* This is a hard disk */ + + if (!DiskGetActivePartitionEntry(BootDrive, &PartitionEntry, &BootPartition)) + { + DbgPrint("Invalid active partition information\n"); + return FALSE; + } + + if (Size <= sizeof(Path) + 18 + strlen(Device) + strlen(Partition)) + { + return FALSE; + } + + strcpy(BootPath, Path); + + strcat(BootPath, "rdisk"); + + _itoa(BootDrive - 0x80, Device, 10); + strcat(BootPath, "("); + strcat(BootPath, Device); + strcat(BootPath, ")"); + + _itoa(BootPartition, Partition, 10); + strcat(BootPath, "partition("); + strcat(BootPath, Partition); + strcat(BootPath, ")"); + } + else + { + /* This is a CD-ROM drive */ + + if (Size <= sizeof(Path) + 7 + strlen(Device)) + { + return FALSE; + } + + strcpy(BootPath, Path); + + strcat(BootPath, "cdrom"); + + _itoa(BootDrive - 0x80, Device, 10); + strcat(BootPath, "("); + strcat(BootPath, Device); + strcat(BootPath, ")"); + } + return TRUE; } -BOOLEAN -DiskNormalizeSystemPath(char *SystemPath, unsigned Size) -{ - CHAR BootPath[256]; - ULONG PartitionNumber; - ULONG DriveNumber; - PARTITION_TABLE_ENTRY PartEntry; - char *p; - - if (!DissectArcPath(SystemPath, BootPath, &DriveNumber, &PartitionNumber)) - { - return FALSE; - } - - if (0 != PartitionNumber || DriveNumber < 0x80) - { - return TRUE; - } - - if (! DiskGetActivePartitionEntry(DriveNumber, - &PartEntry, - &PartitionNumber) || - PartitionNumber < 1 || 9 < PartitionNumber) - { - return FALSE; - } - - p = SystemPath; - while ('\0' != *p && 0 != _strnicmp(p, "partition(", 10)) { - p++; - } - p = strchr(p, ')'); - if (NULL == p || '0' != *(p - 1)) { - return FALSE; - } - *(p - 1) = '0' + PartitionNumber; - - return TRUE; -} - - // This function is in arch/i386/i386disk.c //VOID DiskStopFloppyMotor(VOID) diff --git a/reactos/boot/freeldr/freeldr/disk/partition.c b/reactos/boot/freeldr/freeldr/disk/partition.c index 8966e67187a..b93b2e17b2a 100644 --- a/reactos/boot/freeldr/freeldr/disk/partition.c +++ b/reactos/boot/freeldr/freeldr/disk/partition.c @@ -197,7 +197,6 @@ BOOLEAN DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMASTER_BOOT_RECORD BootRecord) { - char ErrMsg[64]; ULONG Index; // Read master boot record @@ -231,9 +230,6 @@ BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMA // Check the partition table magic value if (BootRecord->MasterBootRecordMagic != 0xaa55) { - sprintf(ErrMsg, "Invalid partition table magic 0x%x found on drive 0x%lx", - BootRecord->MasterBootRecordMagic, DriveNumber); - DiskError(ErrMsg, 0); return FALSE; } diff --git a/reactos/boot/freeldr/freeldr/include/disk.h b/reactos/boot/freeldr/freeldr/include/disk.h index daaaa495e55..191ee1215d6 100644 --- a/reactos/boot/freeldr/freeldr/include/disk.h +++ b/reactos/boot/freeldr/freeldr/include/disk.h @@ -127,7 +127,6 @@ extern ULONG BootDrive; extern ULONG BootPartition; BOOLEAN DiskGetBootPath(char *BootPath, unsigned Size); -BOOLEAN DiskNormalizeSystemPath(char *SystemPath, unsigned Size); /////////////////////////////////////////////////////////////////////////////////////// diff --git a/reactos/boot/freeldr/freeldr/include/machine.h b/reactos/boot/freeldr/freeldr/include/machine.h index 0c0076f4760..65952056faa 100644 --- a/reactos/boot/freeldr/freeldr/include/machine.h +++ b/reactos/boot/freeldr/freeldr/include/machine.h @@ -62,7 +62,6 @@ typedef struct tagMACHVTBL ULONG (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize); BOOLEAN (*DiskGetBootPath)(char *BootPath, unsigned Size); - BOOLEAN (*DiskNormalizeSystemPath)(char *SystemPath, unsigned Size); BOOLEAN (*DiskReadLogicalSectors)(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer); BOOLEAN (*DiskGetDriveGeometry)(ULONG DriveNumber, PGEOMETRY DriveGeometry); ULONG (*DiskGetCacheableBlockCount)(ULONG DriveNumber); diff --git a/reactos/boot/freeldr/freeldr/linuxboot.c b/reactos/boot/freeldr/freeldr/linuxboot.c index 10c2017eb0c..5aea40c2427 100644 --- a/reactos/boot/freeldr/freeldr/linuxboot.c +++ b/reactos/boot/freeldr/freeldr/linuxboot.c @@ -97,13 +97,6 @@ VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description) goto LinuxBootFailed; } - // Open the boot volume - if (!MachDiskNormalizeSystemPath(LinuxBootPath, sizeof(LinuxBootPath))) - { - UiMessageBox("Invalid boot path"); - goto LinuxBootFailed; - } - // Open the kernel LinuxKernel = FsOpenFile(LinuxKernelName); if (!LinuxKernel) diff --git a/reactos/boot/freeldr/freeldr/machine.c b/reactos/boot/freeldr/freeldr/machine.c index 9021a7c57a7..c898bf49430 100644 --- a/reactos/boot/freeldr/freeldr/machine.c +++ b/reactos/boot/freeldr/freeldr/machine.c @@ -37,7 +37,6 @@ #undef MachBeep #undef MachPrepareForReactOS #undef MachDiskGetBootPath -#undef MachDiskNormalizeSystemPath #undef MachDiskReadLogicalSectors #undef MachDiskGetDriveGeometry #undef MachDiskGetCacheableBlockCount @@ -152,12 +151,6 @@ MachDiskGetBootPath(char *BootPath, unsigned Size) return MachVtbl.DiskGetBootPath(BootPath, Size); } -BOOLEAN -MachDiskNormalizeSystemPath(char *SystemPath, unsigned Size) -{ - return MachVtbl.DiskNormalizeSystemPath(SystemPath, Size); -} - BOOLEAN MachDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) { diff --git a/reactos/boot/freeldr/freeldr/reactos/arcname.c b/reactos/boot/freeldr/freeldr/reactos/arcname.c index 3fe1fc6bd26..4b7f97addb6 100644 --- a/reactos/boot/freeldr/freeldr/reactos/arcname.c +++ b/reactos/boot/freeldr/freeldr/reactos/arcname.c @@ -69,7 +69,7 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B * multi(0)disk(0)cdrom(x)\path */ p = p + 6; - *BootDrive = atoi(p); + *BootDrive = atoi(p) + 0x80; p = strchr(p, ')'); if (p == NULL) return FALSE; diff --git a/reactos/boot/freeldr/freeldr/reactos/reactos.c b/reactos/boot/freeldr/freeldr/reactos/reactos.c index 12c8c6647e4..81b654b84b9 100644 --- a/reactos/boot/freeldr/freeldr/reactos/reactos.c +++ b/reactos/boot/freeldr/freeldr/reactos/reactos.c @@ -718,12 +718,6 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) } else { - if (! MachDiskNormalizeSystemPath(SystemPath, - sizeof(SystemPath))) - { - UiMessageBox("Invalid system path"); - return; - } /* copy system path into kernel command line */ strcpy(reactos_kernel_cmdline, SystemPath); } From 1a9d9f441c0b721f0a6e195e70ffd2e384a592f0 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 28 Apr 2010 11:35:34 +0000 Subject: [PATCH 227/261] [MKHIVE/USETUP] - Fix buffer size calculation for the parser. - Do not try to execute an empty registry instruction Patches by Roel Messiant. - Stop the parser at the first NULL character. Patch by me. svn path=/trunk/; revision=47053 --- reactos/base/setup/usetup/interface/usetup.c | 2 ++ reactos/lib/newinflib/infcore.c | 5 +++-- reactos/lib/newinflib/infrosgen.c | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index ea1711ee3b2..7a97b492c27 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -3266,6 +3266,8 @@ RegistryPage(PINPUT_RECORD Ir) DPRINT("Action: %S File: %S Section %S\n", Action, File, Section); + if (Action == NULL) break; // Hackfix + if (!_wcsicmp (Action, L"AddReg")) { Delete = FALSE; diff --git a/reactos/lib/newinflib/infcore.c b/reactos/lib/newinflib/infcore.c index 3582ec56787..b70ce795e19 100644 --- a/reactos/lib/newinflib/infcore.c +++ b/reactos/lib/newinflib/infcore.c @@ -365,7 +365,7 @@ __inline static enum parser_state set_state( struct parser *parser, enum parser_ /* check if the pointer points to an end of file */ __inline static int is_eof( struct parser *parser, const WCHAR *ptr ) { - return (ptr >= parser->end || *ptr == CONTROL_Z); + return (ptr >= parser->end || *ptr == CONTROL_Z || *ptr == 0); } @@ -375,7 +375,8 @@ __inline static int is_eol( struct parser *parser, const WCHAR *ptr ) return (ptr >= parser->end || *ptr == CONTROL_Z || *ptr == '\n' || - (*ptr == '\r' && *(ptr + 1) == '\n')); + (*ptr == '\r' && *(ptr + 1) == '\n') || + *ptr == 0); } diff --git a/reactos/lib/newinflib/infrosgen.c b/reactos/lib/newinflib/infrosgen.c index e994b28f030..b23403b96c0 100644 --- a/reactos/lib/newinflib/infrosgen.c +++ b/reactos/lib/newinflib/infrosgen.c @@ -120,7 +120,7 @@ InfOpenBufferedFile(PHINF InfHandle, Status = InfpParseBuffer(Cache, new_buff, - new_buff + len, + new_buff + len / sizeof(WCHAR), ErrorLine); FREE(new_buff); } @@ -293,7 +293,7 @@ InfOpenFile(PHINF InfHandle, Status = InfpParseBuffer(Cache, new_buff, - new_buff + len, + new_buff + len / sizeof(WCHAR), ErrorLine); FREE(new_buff); } From 0ddb991b140fbd54b7f173c23a5b8f32807d5167 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Wed, 28 Apr 2010 19:15:17 +0000 Subject: [PATCH 228/261] Hardcode GeckoCabDir to C:\ReactOS. the mshtml installer now wants a REG_SZ string for it, which excludes using %SystemRoot%. Fixes bootcdregtest. svn path=/trunk/; revision=47055 --- reactos/boot/bootdata/hivedef_arm.inf | 3 ++- reactos/boot/bootdata/hivedef_i386.inf | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/boot/bootdata/hivedef_arm.inf b/reactos/boot/bootdata/hivedef_arm.inf index 8d8c48935d1..086ee67f4fa 100644 --- a/reactos/boot/bootdata/hivedef_arm.inf +++ b/reactos/boot/bootdata/hivedef_arm.inf @@ -1530,7 +1530,8 @@ HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0" ; Internet Explorer HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" -HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" +;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" +HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\" ; Sound Schemes HKCU,"AppEvents",,0x00000012 diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf index 9650563ee47..9cf6b0c1147 100644 --- a/reactos/boot/bootdata/hivedef_i386.inf +++ b/reactos/boot/bootdata/hivedef_i386.inf @@ -1712,7 +1712,8 @@ HKCU,"SOFTWARE\ReactOS\Debug","SpyInclude",0x00020000,"INCLUDEALL" ; Internet Explorer HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" -HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" +;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" +HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\" ; Sound Schemes HKCU,"AppEvents",,0x00000012 From 62b639c945a8b44876132edb918b23c8d1921d3b Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 28 Apr 2010 20:06:28 +0000 Subject: [PATCH 229/261] [NTOSKRNL] - Fix length calculation of symbolic links with reference strings attached - Fixes opening registry keys for symbolic links with reference strings (such as audio devices) svn path=/trunk/; revision=47056 --- reactos/ntoskrnl/io/iomgr/deviface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 7d97336cc16..fa1b1a35acd 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -127,7 +127,7 @@ OpenRegistryHandlesFromSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, { ReferenceString.Buffer[0] = L'#'; - SubKeyName.Length = ReferenceString.Buffer - SubKeyName.Buffer; + SubKeyName.Length = (USHORT)((ULONG_PTR)(ReferenceString.Buffer) - (ULONG_PTR)SubKeyName.Buffer); ReferenceString.Length = SymbolicLinkName->Length - SubKeyName.Length; } else From 3ec3baec08b3d28a9b10bdb5996ddc09163db45e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 29 Apr 2010 01:44:20 +0000 Subject: [PATCH 230/261] [NTOSKRNL] - Rewrite IoOpenDeviceInterfaceRegistryKey using the same helper function that is used in IoGetDeviceInterfaces and IoSetDeviceInterfaceState to reduce complexity and chance of bugs (tested and confirmed working) - Revert r46748 - Fixes bug #5321 (AC97) svn path=/trunk/; revision=47057 --- reactos/ntoskrnl/io/iomgr/deviface.c | 182 +++++---------------------- 1 file changed, 33 insertions(+), 149 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index fa1b1a35acd..a9b5e475705 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -224,159 +224,37 @@ IoOpenDeviceInterfaceRegistryKey(IN PUNICODE_STRING SymbolicLinkName, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DeviceInterfaceKey) { - WCHAR StrBuff[MAX_PATH], PathBuff[MAX_PATH]; - PWCHAR Guid, RefString; - UNICODE_STRING DevParamU = RTL_CONSTANT_STRING(L"\\Device Parameters"); - UNICODE_STRING PrefixU = RTL_CONSTANT_STRING(L"\\??\\"); - UNICODE_STRING KeyPath, KeyName; - UNICODE_STRING MatchableGuid; - UNICODE_STRING GuidString; - HANDLE GuidKey, hInterfaceKey; - ULONG Index = 0; - PKEY_BASIC_INFORMATION KeyInformation; - ULONG KeyInformationLength; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS Status; - ULONG RequiredLength; + HANDLE InstanceKey, DeviceParametersKey; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING DeviceParametersU = RTL_CONSTANT_STRING(L"Device Parameters"); - swprintf(StrBuff, L"##?#%s", &SymbolicLinkName->Buffer[PrefixU.Length / sizeof(WCHAR)]); + Status = OpenRegistryHandlesFromSymbolicLink(SymbolicLinkName, + KEY_CREATE_SUB_KEY, + NULL, + NULL, + &InstanceKey); + if (!NT_SUCCESS(Status)) + return Status; - RefString = wcsstr(StrBuff, L"\\"); - if (RefString) - { - RefString[0] = 0; - } + InitializeObjectAttributes(&ObjectAttributes, + &DeviceParametersU, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + InstanceKey, + NULL); + Status = ZwCreateKey(&DeviceParametersKey, + DesiredAccess, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + NULL); + ZwClose(InstanceKey); - RtlInitUnicodeString(&MatchableGuid, StrBuff); + if (NT_SUCCESS(Status)) + *DeviceInterfaceKey = DeviceParametersKey; - Guid = wcsstr(StrBuff, L"{"); - if (!Guid) - return STATUS_OBJECT_NAME_NOT_FOUND; - - KeyPath.Buffer = PathBuff; - KeyPath.Length = 0; - KeyPath.MaximumLength = MAX_PATH * sizeof(WCHAR); - - GuidString.Buffer = Guid; - GuidString.Length = GuidString.MaximumLength = 38 * sizeof(WCHAR); - - RtlAppendUnicodeToString(&KeyPath, BaseKeyString); - RtlAppendUnicodeStringToString(&KeyPath, &GuidString); - - InitializeObjectAttributes(&ObjectAttributes, - &KeyPath, - OBJ_CASE_INSENSITIVE, - 0, - NULL); - - Status = ZwOpenKey(&GuidKey, KEY_CREATE_SUB_KEY, &ObjectAttributes); - if (!NT_SUCCESS(Status)) - return Status; - - while (TRUE) - { - Status = ZwEnumerateKey(GuidKey, - Index, - KeyBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyInformationLength = RequiredLength; - KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); - if (!KeyInformation) - { - ZwClose(GuidKey); - return STATUS_INSUFFICIENT_RESOURCES; - } - - Status = ZwEnumerateKey(GuidKey, - Index, - KeyBasicInformation, - KeyInformation, - KeyInformationLength, - &RequiredLength); - } - else - { - ZwClose(GuidKey); - return STATUS_OBJECT_PATH_NOT_FOUND; - } - Index++; - - if (!NT_SUCCESS(Status)) - { - ZwClose(GuidKey); - return Status; - } - - KeyName.Length = KeyName.MaximumLength = KeyInformation->NameLength; - KeyName.Buffer = KeyInformation->Name; - - if (!RtlEqualUnicodeString(&KeyName, &MatchableGuid, TRUE)) - { - ExFreePool(KeyInformation); - continue; - } - - KeyPath.Length = 0; - RtlAppendUnicodeStringToString(&KeyPath, &KeyName); - RtlAppendUnicodeToString(&KeyPath, L"\\"); - - /* check for presence of a reference string */ - if (RefString) - { - /* append reference string */ - RefString[0] = L'#'; - RtlInitUnicodeString(&KeyName, RefString); - } - else - { - /* no reference string */ - RtlInitUnicodeString(&KeyName, L"#"); - } - RtlAppendUnicodeStringToString(&KeyPath, &KeyName); - - /* initialize reference string attributes */ - InitializeObjectAttributes(&ObjectAttributes, - &KeyPath, - OBJ_CASE_INSENSITIVE, - GuidKey, - NULL); - - /* now open device interface key */ - Status = ZwOpenKey(&hInterfaceKey, KEY_CREATE_SUB_KEY, &ObjectAttributes); - - if (NT_SUCCESS(Status)) - { - /* check if it provides a DeviceParameters key */ - InitializeObjectAttributes(&ObjectAttributes, &DevParamU, OBJ_CASE_INSENSITIVE, hInterfaceKey, NULL); - - Status = ZwCreateKey(DeviceInterfaceKey, DesiredAccess, &ObjectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE, NULL); - - if (NT_SUCCESS(Status)) - { - /* DeviceParameters key present */ - ZwClose(hInterfaceKey); - } - else - { - /* fall back to device interface */ - *DeviceInterfaceKey = hInterfaceKey; - Status = STATUS_SUCCESS; - } - } - - /* close class key */ - ZwClose(GuidKey); - ExFreePool(KeyInformation); - return Status; - } - - return STATUS_OBJECT_PATH_NOT_FOUND; + return Status; } /*++ @@ -881,6 +759,12 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, DPRINT("RtlAppendUnicodeStringToString() failed with status 0x%08lx\n", Status); goto cleanup; } + /* RtlAppendUnicodeStringToString added a NULL at the end of the + * destination string, but didn't increase the Length field. + * Do it for it. + */ + ReturnBuffer.Length += sizeof(WCHAR); + NextReferenceString: ExFreePool(ReferenceBi); ReferenceBi = NULL; From 0ec839d5443f665f2f19b1333ae96c89851678d2 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 29 Apr 2010 07:48:43 +0000 Subject: [PATCH 231/261] [win32k] - Do not do callbacks to user mode while holding a lock - Fix when WH_MOUSE_LL and WH_JOURNALRECORD are called See issue #4926 for more details. svn path=/trunk/; revision=47058 --- .../win32/win32k/include/msgqueue.h | 10 ++ .../subsystems/win32/win32k/ntuser/input.c | 10 ++ .../subsystems/win32/win32k/ntuser/message.c | 123 +++++++++++------- .../subsystems/win32/win32k/ntuser/msgqueue.c | 109 ++++++---------- 4 files changed, 140 insertions(+), 112 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index 5752481c9d4..c751f3a911d 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -248,6 +248,16 @@ VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PVOID pWindow); /* F*(&$ headers, (message) == WM_NCRBUTTON##code || \ (message) == WM_NCXBUTTON##code ) +#define WM_NCMOUSEFIRST WM_NCMOUSEMOVE +#define WM_NCMOUSELAST (WM_NCMOUSEFIRST+(WM_MOUSELAST-WM_MOUSEFIRST)) + +#define IS_MOUSE_MESSAGE(message) \ + ((message >= WM_NCMOUSEFIRST && message <= WM_NCMOUSELAST) || \ + (message >= WM_MOUSEFIRST && message <= WM_MOUSELAST)) + +#define IS_KBD_MESSAGE(message) \ + (message == WM_KEYDOWN || message == WM_KEYUP) + HANDLE FASTCALL IntMsqSetWakeMask(DWORD WakeMask); diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 78f8384460e..f51395ee607 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -204,6 +204,16 @@ MouseThreadMain(PVOID StartContext) NTSTATUS Status; MOUSE_ATTRIBUTES MouseAttr; + Status = Win32kInitWin32Thread(PsGetCurrentThread()); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Win32K: Failed making keyboard thread a win32 thread.\n"); + return; //(Status); + } + + KeSetPriorityThread(&PsGetCurrentThread()->Tcb, + LOW_REALTIME_PRIORITY + 3); + InitializeObjectAttributes(&MouseObjectAttributes, &MouseDeviceName, 0, diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 01977a089da..3bd92011346 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -645,6 +645,74 @@ co_IntTranslateMouseMessage( return FALSE; } +BOOL ProcessMouseMessage(MSG* Msg, USHORT HitTest, UINT RemoveMsg) +{ + MOUSEHOOKSTRUCT MHook; + EVENTMSG Event; + + Event.message = Msg->message; + Event.time = Msg->time; + Event.hwnd = Msg->hwnd; + Event.paramL = Msg->pt.x; + Event.paramH = Msg->pt.y; + co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); + + + MHook.pt = Msg->pt; + MHook.hwnd = Msg->hwnd; + MHook.wHitTestCode = HitTest; + MHook.dwExtraInfo = 0; + if (co_HOOK_CallHooks( WH_MOUSE, + RemoveMsg ? HC_ACTION : HC_NOREMOVE, + Msg->message, + (LPARAM)&MHook )) + { + if (ISITHOOKED(WH_CBT)) + { + MHook.pt = Msg->pt; + MHook.hwnd = Msg->hwnd; + MHook.wHitTestCode = HitTest; + MHook.dwExtraInfo = 0; + co_HOOK_CallHooks( WH_CBT, + HCBT_CLICKSKIPPED, + Msg->message, + (LPARAM)&MHook); + } + return FALSE; + } + + return TRUE; +} + +BOOL ProcessKeyboardMessage(MSG* Msg, UINT RemoveMsg) +{ + EVENTMSG Event; + + Event.message = Msg->message; + Event.hwnd = Msg->hwnd; + Event.time = Msg->time; + Event.paramL = (Msg->wParam & 0xFF) | (HIWORD(Msg->lParam) << 8); + Event.paramH = Msg->lParam & 0x7FFF; + if (HIWORD(Msg->lParam) & 0x0100) Event.paramH |= 0x8000; + co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); + + if (co_HOOK_CallHooks( WH_KEYBOARD, + RemoveMsg ? HC_ACTION : HC_NOREMOVE, + LOWORD(Msg->wParam), + Msg->lParam)) + { + if (ISITHOOKED(WH_CBT)) + { + /* skip this message */ + co_HOOK_CallHooks( WH_CBT, + HCBT_KEYSKIPPED, + LOWORD(Msg->wParam), + Msg->lParam ); + } + return FALSE; + } + return TRUE; +} /* * Internal version of PeekMessage() doing all the work */ @@ -662,7 +730,6 @@ co_IntPeekMessage( PUSER_MESSAGE Msg, BOOL Present, RemoveMessages; USER_REFERENCE_ENTRY Ref; USHORT HitTest; - MOUSEHOOKSTRUCT MHook; /* The queues and order in which they are checked are documented in the MSDN article on GetMessage() */ @@ -867,52 +934,20 @@ MessageFound: } MsgExit: - if ( ISITHOOKED(WH_MOUSE) && - Msg->Msg.message >= WM_MOUSEFIRST && - Msg->Msg.message <= WM_MOUSELAST ) + if ( ISITHOOKED(WH_MOUSE) && IS_MOUSE_MESSAGE(Msg->Msg.message)) { - MHook.pt = Msg->Msg.pt; - MHook.hwnd = Msg->Msg.hwnd; - MHook.wHitTestCode = HitTest; - MHook.dwExtraInfo = 0; - if (co_HOOK_CallHooks( WH_MOUSE, - RemoveMsg ? HC_ACTION : HC_NOREMOVE, - Msg->Msg.message, - (LPARAM)&MHook )) - { - if (ISITHOOKED(WH_CBT)) - { - MHook.pt = Msg->Msg.pt; - MHook.hwnd = Msg->Msg.hwnd; - MHook.wHitTestCode = HitTest; - MHook.dwExtraInfo = 0; - co_HOOK_CallHooks( WH_CBT, - HCBT_CLICKSKIPPED, - Msg->Msg.message, - (LPARAM)&MHook); - } - return FALSE; - } - } + if(!ProcessMouseMessage(&Msg->Msg, HitTest, RemoveMsg)) + { + return FALSE; + } + } - if ( ISITHOOKED(WH_KEYBOARD) && - (Msg->Msg.message == WM_KEYDOWN || Msg->Msg.message == WM_KEYUP) ) + if ( ISITHOOKED(WH_KEYBOARD) && IS_KBD_MESSAGE(Msg->Msg.message)) { - if (co_HOOK_CallHooks( WH_KEYBOARD, - RemoveMsg ? HC_ACTION : HC_NOREMOVE, - LOWORD(Msg->Msg.wParam), - Msg->Msg.lParam)) - { - if (ISITHOOKED(WH_CBT)) - { - /* skip this message */ - co_HOOK_CallHooks( WH_CBT, - HCBT_KEYSKIPPED, - LOWORD(Msg->Msg.wParam), - Msg->Msg.lParam ); - } - return FALSE; - } + if(!ProcessKeyboardMessage(&Msg->Msg, RemoveMsg)) + { + return FALSE; + } } // The WH_GETMESSAGE hook enables an application to monitor messages about to // be returned by the GetMessage or PeekMessage function. diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 4fc8b0e24d8..16323aeb5c4 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -174,8 +174,41 @@ MsqInsertSystemMessage(MSG* Msg) LARGE_INTEGER LargeTickCount; KIRQL OldIrql; ULONG Prev; - EVENTMSG Event; + MSLLHOOKSTRUCT MouseHookData; + KeQueryTickCount(&LargeTickCount); + Msg->time = MsqCalculateMessageTime(&LargeTickCount); + + MouseHookData.pt.x = LOWORD(Msg->lParam); + MouseHookData.pt.y = HIWORD(Msg->lParam); + switch(Msg->message) + { + case WM_MOUSEWHEEL: + MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg->wParam)); + break; + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_XBUTTONDBLCLK: + case WM_NCXBUTTONDOWN: + case WM_NCXBUTTONUP: + case WM_NCXBUTTONDBLCLK: + MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg->wParam)); + break; + default: + MouseHookData.mouseData = 0; + break; + } + MouseHookData.flags = 0; + MouseHookData.time = Msg->time; + MouseHookData.dwExtraInfo = 0; + if( co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, Msg->message, (LPARAM) &MouseHookData)) + return; + + /* + * If we got WM_MOUSEMOVE and there are already messages in the + * system message queue, check if the last message is mouse move + * and if it is then just overwrite it. + */ IntLockSystemMessageQueue(OldIrql); /* @@ -189,22 +222,6 @@ MsqInsertSystemMessage(MSG* Msg) return; } - KeQueryTickCount(&LargeTickCount); - Msg->time = MsqCalculateMessageTime(&LargeTickCount); - - Event.message = Msg->message; - Event.time = Msg->time; - Event.hwnd = Msg->hwnd; - Event.paramL = Msg->pt.x; - Event.paramH = Msg->pt.y; - co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); - - /* - * If we got WM_MOUSEMOVE and there are already messages in the - * system message queue, check if the last message is mouse move - * and if it is then just overwrite it. - */ - if (Msg->message == WM_MOUSEMOVE && SystemMessageQueueCount) { if (SystemMessageQueueTail == 0) @@ -623,7 +640,6 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo { PUSER_MESSAGE UserMsg; MSG Msg; - BOOL ProcessMessage; ASSERT(SystemMessageQueueHead < SYSTEM_MESSAGE_QUEUE_SIZE); Msg = SystemMessageQueue[SystemMessageQueueHead]; @@ -631,48 +647,14 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo (SystemMessageQueueHead + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; SystemMessageQueueCount--; IntUnLockSystemMessageQueue(OldIrql); - if (WM_MOUSEFIRST <= Msg.message && Msg.message <= WM_MOUSELAST) - { - MSLLHOOKSTRUCT MouseHookData; - MouseHookData.pt.x = LOWORD(Msg.lParam); - MouseHookData.pt.y = HIWORD(Msg.lParam); - switch(Msg.message) - { - case WM_MOUSEWHEEL: - MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg.wParam)); - break; - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_XBUTTONDBLCLK: - case WM_NCXBUTTONDOWN: - case WM_NCXBUTTONUP: - case WM_NCXBUTTONDBLCLK: - MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg.wParam)); - break; - default: - MouseHookData.mouseData = 0; - break; - } - MouseHookData.flags = 0; - MouseHookData.time = Msg.time; - MouseHookData.dwExtraInfo = 0; - ProcessMessage = (0 == co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, - Msg.message, (LPARAM) &MouseHookData)); - } - else - { - ProcessMessage = TRUE; - } - if (ProcessMessage) - { - UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); - /* What to do if out of memory? For now we just panic a bit in debug */ - ASSERT(UserMsg); - UserMsg->FreeLParam = FALSE; - UserMsg->Msg = Msg; - InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); - } + UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); + /* What to do if out of memory? For now we just panic a bit in debug */ + ASSERT(UserMsg); + UserMsg->FreeLParam = FALSE; + UserMsg->Msg = Msg; + InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); + IntLockSystemMessageQueue(OldIrql); } HardwareMessageQueueStamp++; @@ -767,7 +749,6 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) MSG Msg; LARGE_INTEGER LargeTickCount; KBDLLHOOKSTRUCT KbdHookData; - EVENTMSG Event; BOOLEAN Entered = FALSE; DPRINT("MsqPostKeyboardMessage(uMsg 0x%x, wParam 0x%x, lParam 0x%x)\n", @@ -795,14 +776,6 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) KeQueryTickCount(&LargeTickCount); Msg.time = MsqCalculateMessageTime(&LargeTickCount); - Event.message = Msg.message; - Event.hwnd = Msg.hwnd; - Event.time = Msg.time; - Event.paramL = (Msg.wParam & 0xFF) | (HIWORD(Msg.lParam) << 8); - Event.paramH = Msg.lParam & 0x7FFF; - if (HIWORD(Msg.lParam) & 0x0100) Event.paramH |= 0x8000; - co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); - /* We can't get the Msg.pt point here since we don't know thread (and thus the window station) the message will end up in yet. */ From d34a8d86bcd110e982aa9912f9f8e80b54dc3206 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Thu, 29 Apr 2010 13:41:32 +0000 Subject: [PATCH 232/261] [win32k] - Fix a problem where application that used WH_CBT hook procedures were receiving destroy window notification on windows that were never created. The window was never created because the application had returned a non zero value when it was notified of window creation, which effectively destroys the window and returns failure for window creation. See CBTProc Function on MSDN. Fixes bug #4461. svn path=/trunk/; revision=47059 --- reactos/subsystems/win32/win32k/ntuser/window.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index f95965027bd..aa1cbc0188e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2468,7 +2468,23 @@ AllocErr: CLEANUP: if (!_ret_ && Window && Window->Wnd && ti) + { + ULONG SavedHooks; + /* HACK: co_UserDestroyWindow will call CBT proc with code HCBT_DESTROYWND. + Applications can choke on this as a hwnd was never returned from this call */ + /* Save the flags */ + SavedHooks = ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks; + + /* Temporary remove the flag */ + ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks &= ~HOOKID_TO_FLAG(WH_CBT); + + /* Destroy the window */ co_UserDestroyWindow(Window); + + /* Restore the flag */ + ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks = SavedHooks; + } + // UserFreeWindowInfo(ti, Window); if (Window) { From 91a35b7ec11b661e627713b8c0e740a1103aaeae Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 29 Apr 2010 16:39:52 +0000 Subject: [PATCH 233/261] [NTOSKRNL] - On backtraces, print the address of the call instruction (assumed 5 bytes lentgh) instead of the return address, which in many cases does not make sense. (WinDbg does it this way, too) - Fix Ke386SaveFpuState to store the fpu state in the buffer, but in the pointer to the buffer - Anable Ke386SaveFpuState to save the floating point state in KiNpxHandler and KiTrap13Handler, so we know what error we got. - Disable saving debug registers in the trap frame, as long as the kernel doesn't support this - Fixes ntdll_winetest exception / OllyDbg freeze/reboot See issue #5301 for more details. svn path=/trunk/; revision=47060 --- .../ntoskrnl/include/internal/i386/intrin_i.h | 4 +- reactos/ntoskrnl/kdbg/kdb_cli.c | 3 +- reactos/ntoskrnl/ke/i386/exp.c | 2 +- reactos/ntoskrnl/ke/i386/traphdlr.c | 102 +++++++++--------- 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/i386/intrin_i.h b/reactos/ntoskrnl/include/internal/i386/intrin_i.h index 94501841149..6cb2a7cbf0a 100644 --- a/reactos/ntoskrnl/include/internal/i386/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/i386/intrin_i.h @@ -42,11 +42,11 @@ Ke386SaveFpuState(IN PFX_SAVE_AREA SaveArea) extern ULONG KeI386FxsrPresent; if (KeI386FxsrPresent) { - __asm__ __volatile__ ("fxsave %0\n" : : "m"(SaveArea)); + __asm__ __volatile__ ("fxsave %0\n" : : "m"(*SaveArea)); } else { - __asm__ __volatile__ ("fnsave %0\n wait\n" : : "m"(SaveArea)); + __asm__ __volatile__ ("fnsave %0\n wait\n" : : "m"(*SaveArea)); } } diff --git a/reactos/ntoskrnl/kdbg/kdb_cli.c b/reactos/ntoskrnl/kdbg/kdb_cli.c index fa42826c9fa..4c469fd3721 100644 --- a/reactos/ntoskrnl/kdbg/kdb_cli.c +++ b/reactos/ntoskrnl/kdbg/kdb_cli.c @@ -823,7 +823,8 @@ KdbpCmdBackTrace( break; } - if (!KdbSymPrintAddress((PVOID)Address)) + /* Print the location of the call instruction */ + if (!KdbSymPrintAddress((PVOID)(Address - 5))) KdbpPrint("<%08x>\n", Address); else KdbpPrint("\n"); diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 284ff19e3bf..38dded77062 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -584,7 +584,7 @@ KeContextToTrapFrame(IN PCONTEXT Context, } /* Handle the Debug Registers */ - if ((ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) + if (0 && (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) { /* Loop DR registers */ for (i = 0; i < 4; i++) diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index f9a954ec298..b9033c2069e 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -240,7 +240,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, } /* User or kernel trap -- get ready to issue an exception */ - if (Thread->NpxState == NPX_STATE_NOT_LOADED) + //if (Thread->NpxState == NPX_STATE_NOT_LOADED) { /* Update CR0 */ Cr0 = __readcr0(); @@ -248,7 +248,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, __writecr0(Cr0); /* Save FPU state */ - //Ke386SaveFpuState(SaveArea); + Ke386SaveFpuState(SaveArea); /* Mark CR0 state dirty */ Cr0 |= NPX_STATE_NOT_LOADED; @@ -1082,64 +1082,64 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) * we should probably table this for now since it's not a "real" issue. */ - /* - * NOTE2: Another scenario is the IRET during a V8086 restore (BIOS Call) - * which will cause a GPF since the trap frame is a total mess (on purpose) - * as built in KiEnterV86Mode. - * - * The idea is to scan for IRET, scan for the known EIP adress, validate CS - * and then manually issue a jump to the V8086 return EIP. - */ - Instructions = (PUCHAR)TrapFrame->Eip; - if (Instructions[0] == 0xCF) - { - /* - * Some evil shit is going on here -- this is not the SS:ESP you're - * looking for! Instead, this is actually CS:EIP you're looking at! - * Why? Because part of the trap frame actually corresponds to the IRET - * stack during the trap exit! - */ - if ((TrapFrame->HardwareEsp == (ULONG)Ki386BiosCallReturnAddress) && - (TrapFrame->HardwareSegSs == (KGDT_R0_CODE | RPL_MASK))) - { - /* Exit the V86 trap! */ - Ki386BiosCallReturnAddress(TrapFrame); - } - else - { - /* Otherwise, this is another kind of IRET fault */ - UNIMPLEMENTED; - while (TRUE); - } - } + /* + * NOTE2: Another scenario is the IRET during a V8086 restore (BIOS Call) + * which will cause a GPF since the trap frame is a total mess (on purpose) + * as built in KiEnterV86Mode. + * + * The idea is to scan for IRET, scan for the known EIP adress, validate CS + * and then manually issue a jump to the V8086 return EIP. + */ + Instructions = (PUCHAR)TrapFrame->Eip; + if (Instructions[0] == 0xCF) + { + /* + * Some evil shit is going on here -- this is not the SS:ESP you're + * looking for! Instead, this is actually CS:EIP you're looking at! + * Why? Because part of the trap frame actually corresponds to the IRET + * stack during the trap exit! + */ + if ((TrapFrame->HardwareEsp == (ULONG)Ki386BiosCallReturnAddress) && + (TrapFrame->HardwareSegSs == (KGDT_R0_CODE | RPL_MASK))) + { + /* Exit the V86 trap! */ + Ki386BiosCallReturnAddress(TrapFrame); + } + else + { + /* Otherwise, this is another kind of IRET fault */ + UNIMPLEMENTED; + while (TRUE); + } + } /* So since we're not dealing with the above case, check for RDMSR/WRMSR */ - if ((Instructions[0] == 0xF) && // 2-byte opcode + if ((Instructions[0] == 0xF) && // 2-byte opcode (((Instructions[1] >> 8) == 0x30) || // RDMSR ((Instructions[2] >> 8) == 0x32))) // WRMSR - { + { /* Unknown CPU MSR, so raise an access violation */ KiDispatchException0Args(STATUS_ACCESS_VIOLATION, TrapFrame->Eip, TrapFrame); - } + } - /* Check for lazy segment load */ - if (TrapFrame->SegDs != (KGDT_R3_DATA | RPL_MASK)) - { - /* Fix it */ - TrapFrame->SegDs = (KGDT_R3_DATA | RPL_MASK); - } - else if (TrapFrame->SegEs != (KGDT_R3_DATA | RPL_MASK)) - { + /* Check for lazy segment load */ + if (TrapFrame->SegDs != (KGDT_R3_DATA | RPL_MASK)) + { + /* Fix it */ + TrapFrame->SegDs = (KGDT_R3_DATA | RPL_MASK); + } + else if (TrapFrame->SegEs != (KGDT_R3_DATA | RPL_MASK)) + { /* Fix it */ TrapFrame->SegEs = (KGDT_R3_DATA | RPL_MASK); - } - else - { - /* Whatever it is, we can't handle it */ - KiSystemFatalException(EXCEPTION_GP_FAULT, TrapFrame); - } + } + else + { + /* Whatever it is, we can't handle it */ + KiSystemFatalException(EXCEPTION_GP_FAULT, TrapFrame); + } /* Return to where we came from */ KiTrapReturn(TrapFrame); @@ -1353,7 +1353,7 @@ KiTrap13Handler(IN PKTRAP_FRAME TrapFrame) __writecr0(Cr0); /* Save FPU state */ - //Ke386SaveFpuState(SaveArea); + Ke386SaveFpuState(SaveArea); /* Mark CR0 state dirty */ Cr0 |= NPX_STATE_NOT_LOADED; @@ -1379,7 +1379,7 @@ KiTrap13Handler(IN PKTRAP_FRAME TrapFrame) FSW_UNDERFLOW | FSW_PRECISION); Error &= MxCsrMask; - + /* Now handle any of those legal errors */ if (Error & (FSW_INVALID_OPERATION | FSW_DENORMAL | From 8e5ba15296ba7862e0fec9eea79193089aaf71ca Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 29 Apr 2010 19:20:32 +0000 Subject: [PATCH 234/261] [INF] - Comment out the service installation for VBE and VGA so the configuration set in first-stage won't get overwritten - Nasty graphical glitches still remain in VGA mode - Fixes bug 2073 and bug 4192 svn path=/trunk/; revision=47061 --- reactos/media/inf/display.inf | Bin 6476 -> 6534 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/display.inf b/reactos/media/inf/display.inf index a9469631e79220346346aa9b12f60a0a41ff6762..f2179abb9c1045bb69ebabda5dfc0e28c68d0d19 100644 GIT binary patch delta 52 tcmX?O)MmV)f Date: Thu, 29 Apr 2010 19:56:18 +0000 Subject: [PATCH 235/261] [PAINT] - angle rounding for lines and polygons when SHIFT key is pressed - equal width and height for (rounded) rectangles and ellipses when SHIFT key is pressed Based on a patch by Katayama Hirofumi, see #5285 svn path=/trunk/; revision=47062 --- reactos/base/applications/paint/main.c | 9 ++-- reactos/base/applications/paint/mouse.c | 72 +++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/paint/main.c b/reactos/base/applications/paint/main.c index 98565f4b36c..904220567d1 100644 --- a/reactos/base/applications/paint/main.c +++ b/reactos/base/applications/paint/main.c @@ -143,6 +143,7 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument HBITMAP tempBm; int i; TCHAR tooltips[16][30]; + HDC hDC; TCHAR *c; TCHAR sfnFilename[1000]; @@ -152,7 +153,7 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument TCHAR ofnFiletitle[256]; TCHAR ofnFilter[1000]; TCHAR miniaturetitle[100]; - int custColors[16] = { 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, + static int custColors[16] = { 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff }; @@ -371,8 +372,10 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument CreateWindowEx(0, _T("Scrollbox"), _T(""), WS_CHILD | WS_VISIBLE, 3, 3, imgXRes, imgYRes, hScrlClient, NULL, hThisInstance, NULL); - hDrawingDC = CreateCompatibleDC(GetDC(hImageArea)); - hSelDC = CreateCompatibleDC(GetDC(hImageArea)); + hDC = GetDC(hImageArea); + hDrawingDC = CreateCompatibleDC(hDC); + hSelDC = CreateCompatibleDC(hDC); + ReleaseDC(hImageArea, hDC); SelectObject(hDrawingDC, CreatePen(PS_SOLID, 0, fgColor)); SelectObject(hDrawingDC, CreateSolidBrush(bgColor)); diff --git a/reactos/base/applications/paint/mouse.c b/reactos/base/applications/paint/mouse.c index 4f5c13031fd..9165291594e 100644 --- a/reactos/base/applications/paint/mouse.c +++ b/reactos/base/applications/paint/mouse.c @@ -25,6 +25,34 @@ placeSelWin() //SendMessage(hSelection, WM_PAINT, 0, 0); } +void +regularize(short x0, short y0, short *x1, short *y1) +{ + if (abs(*x1 - x0) >= abs(*y1 - y0)) + *y1 = y0 + (*y1 > y0 ? abs(*x1 - x0) : -abs(*x1 - x0)); + else + *x1 = x0 + (*x1 > x0 ? abs(*y1 - y0) : -abs(*y1 - y0)); +} + +void +roundTo8Directions(short x0, short y0, short *x1, short *y1) +{ + if (abs(*x1 - x0) >= abs(*y1 - y0)) + { + if (abs(*y1 - y0) * 5 < abs(*x1 - x0) * 2) + *y1 = y0; + else + *y1 = y0 + (*y1 > y0 ? abs(*x1 - x0) : -abs(*x1 - x0)); + } + else + { + if (abs(*x1 - x0) * 5 < abs(*y1 - y0) * 2) + *x1 = x0; + else + *x1 = x0 + (*x1 > x0 ? abs(*y1 - y0) : -abs(*y1 - y0)); + } +} + POINT pointStack[256]; short pointSP; POINT *ptStack = NULL; @@ -147,6 +175,8 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, fg, lineWidth); break; case 12: @@ -169,21 +199,30 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, + (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); if (pointSP + 1 >= 2) Poly(hdc, pointStack, pointSP + 1, fg, bg, lineWidth, shapeStyle, FALSE); break; case 15: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 16: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; } @@ -276,6 +315,8 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, fg, lineWidth); break; case 12: @@ -285,12 +326,17 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, + (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); pointSP++; if (pointSP >= 2) { @@ -310,10 +356,14 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 15: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 16: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; } @@ -398,6 +448,8 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, bg, lineWidth); break; case 12: @@ -420,21 +472,30 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, + (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); if (pointSP + 1 >= 2) Poly(hdc, pointStack, pointSP + 1, bg, fg, lineWidth, shapeStyle, FALSE); break; case 15: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 16: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; } @@ -457,6 +518,8 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, bg, lineWidth); break; case 12: @@ -466,12 +529,17 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, + (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); pointSP++; if (pointSP >= 2) { @@ -491,10 +559,14 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 15: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 16: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; } From 04c6b4502390e39177bc17508fa3caacc1e22af9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 29 Apr 2010 20:51:28 +0000 Subject: [PATCH 236/261] [MSIMTF] Silence debug spam svn path=/trunk/; revision=47063 --- reactos/dll/win32/msimtf/activeimmapp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/msimtf/activeimmapp.c b/reactos/dll/win32/msimtf/activeimmapp.c index 73ce0758c70..d8446267893 100644 --- a/reactos/dll/win32/msimtf/activeimmapp.c +++ b/reactos/dll/win32/msimtf/activeimmapp.c @@ -655,7 +655,7 @@ static HRESULT WINAPI ActiveIMMApp_Deactivate(IActiveIMMApp* This) static HRESULT WINAPI ActiveIMMApp_OnDefWindowProc(IActiveIMMApp* This, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { - FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); + //FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); return E_FAIL; } From 174a4670ea5a7893c79d9bb0d87a2b36adedd5ec Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 29 Apr 2010 22:35:49 +0000 Subject: [PATCH 237/261] [NTOSKRNL] - Fix a horrible casting bug - EventCategoryData1 is a pointer to a GUID not a pointer to a UNICODE_STRING - Convert the GUID into a UNICODE_STRING properly by using RtlStringFromGUID and pass that string to RtlCompareUnicodeString - Fix another bug which results in us sending EventCategoryHardwareProfileChange and EventCategoryTargetDeviceChange events to everyone registered for PnP notifications - Fixes sending EventCategoryDeviceInterfaceChange notifications that happen after calling IoRegisterPlugPlayNotification svn path=/trunk/; revision=47064 --- reactos/ntoskrnl/io/pnpmgr/pnpnotify.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c b/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c index c328c80965f..f19f986e4e3 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c @@ -42,6 +42,8 @@ IopNotifyPlugPlayNotification( PLIST_ENTRY ListEntry; PVOID NotificationStructure; BOOLEAN CallCurrentEntry; + UNICODE_STRING GuidString; + NTSTATUS Status; ASSERT(DeviceObject); @@ -71,6 +73,13 @@ IopNotifyPlugPlayNotification( RtlCopyMemory(&NotificationInfos->Event, Event, sizeof(GUID)); RtlCopyMemory(&NotificationInfos->InterfaceClassGuid, EventCategoryData1, sizeof(GUID)); NotificationInfos->SymbolicLinkName = (PUNICODE_STRING)EventCategoryData2; + Status = RtlStringFromGUID(&NotificationInfos->InterfaceClassGuid, &GuidString); + if (!NT_SUCCESS(Status)) + { + KeReleaseGuardedMutex(&PnpNotifyListLock); + ExFreePool(NotificationStructure); + return; + } break; } case EventCategoryHardwareProfileChange: @@ -125,12 +134,17 @@ IopNotifyPlugPlayNotification( ChangeEntry = CONTAINING_RECORD(ListEntry, PNP_NOTIFY_ENTRY, PnpNotifyList); CallCurrentEntry = FALSE; + if (ChangeEntry->EventCategory != EventCategory) + { + ListEntry = ListEntry->Flink; + continue; + } + switch (EventCategory) { case EventCategoryDeviceInterfaceChange: { - if (ChangeEntry->EventCategory == EventCategory - && RtlCompareUnicodeString(&ChangeEntry->Guid, (PUNICODE_STRING)EventCategoryData1, FALSE) == 0) + if (RtlCompareUnicodeString(&ChangeEntry->Guid, &GuidString, FALSE) == 0) { CallCurrentEntry = TRUE; } @@ -174,6 +188,8 @@ IopNotifyPlugPlayNotification( } KeReleaseGuardedMutex(&PnpNotifyListLock); ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY); + if (EventCategory == EventCategoryDeviceInterfaceChange) + RtlFreeUnicodeString(&GuidString); } /* PUBLIC FUNCTIONS **********************************************************/ From 0409ef75e863fe0497616b0a25d1642ce5a915ed Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Fri, 30 Apr 2010 11:23:17 +0000 Subject: [PATCH 238/261] [win32k] - When calling NtUserCallNextHookEx check that the current hook is not the first in the chain. If so don't call the hook proc and just return, as it has already been called and it makes no sense for the NextHook function to call the first hook proc. Fixes bugs #4461 and #4407. - The previous commit claiming to fix bug #4461 was incorrect, it may have actually fixed bug #5320. Testers please test. svn path=/trunk/; revision=47065 --- reactos/subsystems/win32/win32k/ntuser/hook.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 93633370c43..a71ea9bebf2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -1050,6 +1050,12 @@ NtUserCallNextHookEx(int Code, if (!HookObj) RETURN( 0); + /* Check that the first hook in the chain is not this hook */ + NextObj = IntGetFirstHook(IntGetTable(HookObj), HookObj->HookId); + + /* Its the same so it has already been called */ + if (HookObj == NextObj) RETURN(0); + UserReferenceObject(HookObj); Ansi = HookObj->Ansi; From 8dc269c258e4554784f2fa13949e1a0f65d3d0c4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 30 Apr 2010 22:47:44 +0000 Subject: [PATCH 239/261] [NTOSKRNL] - Fix RtlWalkFrameChain to do usermode back traces for threads that are not system threads. Also use _SEH2_YIELD when leaving the SEH block. svn path=/trunk/; revision=47066 --- reactos/ntoskrnl/rtl/libsupp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/rtl/libsupp.c b/reactos/ntoskrnl/rtl/libsupp.c index 27f78952c72..4a6c8bc55ea 100644 --- a/reactos/ntoskrnl/rtl/libsupp.c +++ b/reactos/ntoskrnl/rtl/libsupp.c @@ -317,7 +317,7 @@ RtlWalkFrameChain(OUT PVOID *Callers, &StackBegin, &StackEnd); if (!Result) return 0; - } + } /* Use a SEH block for maximum protection */ _SEH2_TRY @@ -331,12 +331,11 @@ RtlWalkFrameChain(OUT PVOID *Callers, /* Make sure we can trust the TEB and trap frame */ if (!(Teb) || - !(Thread->SystemThread) || (KeIsAttachedProcess()) || (KeGetCurrentIrql() >= DISPATCH_LEVEL)) { /* Invalid or unsafe attempt to get the stack */ - return 0; + _SEH2_YIELD(return 0;) } /* Get the stack limits */ From 9bb0bed65510639d1fa3cc2774c74c762d8d8093 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 30 Apr 2010 22:48:43 +0000 Subject: [PATCH 240/261] [WIN32K] - Fix IntDumpHandleTable, it was very broken. svn path=/trunk/; revision=47067 --- .../subsystems/win32/win32k/objects/gdidbg.c | 136 +++++++++++------- 1 file changed, 87 insertions(+), 49 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/gdidbg.c b/reactos/subsystems/win32/win32k/objects/gdidbg.c index a9991ad3610..efa686fc06b 100644 --- a/reactos/subsystems/win32/win32k/objects/gdidbg.c +++ b/reactos/subsystems/win32/win32k/objects/gdidbg.c @@ -3,23 +3,48 @@ #define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl('DsoR', (PVOID)Frames, Count, NULL, 0, NULL, KernelMode) NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags); -static int leak_reported = 0; -#define GDI_STACK_LEVELS 12 -static ULONG GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG GDIHandleLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG GDIHandleShareLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG GDIHandleDeleter[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +#define GDI_STACK_LEVELS 20 +static ULONG_PTR GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG_PTR GDIHandleLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG_PTR GDIHandleShareLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG_PTR GDIHandleDeleter[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; struct DbgOpenGDIHandle { ULONG idx; int count; }; -#define H 1024 -static struct DbgOpenGDIHandle h[H]; +#define MAX_BACKTRACES 1024 +static struct DbgOpenGDIHandle AllocatorTable[MAX_BACKTRACES]; + +static +BOOL +CompareBacktraces(ULONG idx1, ULONG idx2) +{ + ULONG iLevel; + + /* Loop all stack levels */ + for (iLevel = 0; iLevel < GDI_STACK_LEVELS; iLevel++) + { + if (GDIHandleAllocator[idx1][iLevel] + != GDIHandleAllocator[idx2][iLevel]) +// if (GDIHandleShareLocker[idx1][iLevel] +// != GDIHandleShareLocker[idx2][iLevel]) + { + return FALSE; + } + } + + return TRUE; +} + +#define IS_HANDLE_VALID(idx) \ + ((GdiHandleTable->Entries[idx].Type & GDI_ENTRY_BASETYPE_MASK) != 0) void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) { - int i, n = 0, j, k, J; + static int leak_reported = 0; + int i, j, idx, nTraces = 0; + KIRQL OldIrql; if (leak_reported) { @@ -30,68 +55,79 @@ void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) leak_reported = 1; DPRINT1("reporting gdi handle abusers:\n"); - /* step through GDI handle table and find out who our culprit is... */ - for (i = RESERVE_ENTRIES_COUNT; i < GDI_HANDLE_COUNT; i++) + /* We've got serious business to do */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + + /* Step through GDI handle table and find out who our culprit is... */ + for (idx = RESERVE_ENTRIES_COUNT; idx < GDI_HANDLE_COUNT; idx++) { - for (j = 0; j < n; j++) + /* If the handle is free, continue */ + if (!IS_HANDLE_VALID(idx)) continue; + + /* Step through all previous backtraces */ + for (j = 0; j < nTraces; j++) { -next: - J = h[j].idx; - for (k = 0; k < GDI_STACK_LEVELS; k++) + /* Check if the backtrace matches */ + if (CompareBacktraces(idx, AllocatorTable[j].idx)) { - if (GDIHandleAllocator[i][k] - != GDIHandleAllocator[J][k]) - { - if (++j == n) - goto done; - else - goto next; - } + /* It matches, increment count and break out */ + AllocatorTable[j].count++; + break; } - goto done; } -done: - if (j < H) + + /* Did we find a new backtrace? */ + if (j == nTraces) { - if (j == n) - { - h[j].idx = i; - h[j].count = 1; - n = n + 1; - } - else - h[j].count++; + /* Break out, if we reached the maximum */ + if (nTraces == MAX_BACKTRACES) break; + + /* Initialize this entry */ + AllocatorTable[j].idx = idx; + AllocatorTable[j].count = 1; + nTraces++; } } + /* bubble sort time! weeeeee!! */ - for (i = 0; i < n-1; i++) + for (i = 0; i < nTraces-1; i++) { - if (h[i].count < h[i+1].count) + if (AllocatorTable[i].count < AllocatorTable[i+1].count) { - struct DbgOpenGDIHandle t; - t = h[i+1]; - h[i+1] = h[i]; + struct DbgOpenGDIHandle temp; + + temp = AllocatorTable[i+1]; + AllocatorTable[i+1] = AllocatorTable[i]; j = i; - while (j > 0 && h[j-1].count < t.count) + while (j > 0 && AllocatorTable[j-1].count < temp.count) j--; - h[j] = t; + AllocatorTable[j] = temp; } } - /* print the worst offenders... */ - DbgPrint("Worst GDI Handle leak offenders (out of %i unique locations):\n", n); - for (i = 0; i < n && h[i].count > 1; i++) + + /* Print the worst offenders... */ + DbgPrint("Worst GDI Handle leak offenders (out of %i unique locations):\n", nTraces); + for (i = 0; i < nTraces && AllocatorTable[i].count > 1; i++) { /* Print out the allocation count */ - DbgPrint(" %i allocs: ", h[i].count); + DbgPrint(" %i allocs, type = 0x%lx:\n", + AllocatorTable[i].count, + GdiHandleTable->Entries[AllocatorTable[i].idx].Type); /* Dump the frames */ - KeRosDumpStackFrames(GDIHandleAllocator[h[i].idx], GDI_STACK_LEVELS); + KeRosDumpStackFrames(GDIHandleAllocator[AllocatorTable[i].idx], GDI_STACK_LEVELS); + //KeRosDumpStackFrames(GDIHandleShareLocker[AllocatorTable[i].idx], GDI_STACK_LEVELS); /* Print new line for better readability */ DbgPrint("\n"); } - if (i < n && h[i].count == 1) + + if (i < nTraces) DbgPrint("(list terminated - the remaining entries have 1 allocation only)\n"); + + KeLowerIrql(OldIrql); + + ASSERT(FALSE); } ULONG @@ -101,11 +137,13 @@ CaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture) memset(pFrames, 0x00, (nFramesToCapture + 1) * sizeof(PVOID)); - nFrameCount = RtlCaptureStackBackTrace(1, nFramesToCapture, pFrames, NULL); + nFrameCount = RtlWalkFrameChain(pFrames, nFramesToCapture, 0); if (nFrameCount < nFramesToCapture) { - nFrameCount += RtlWalkFrameChain(pFrames + nFrameCount, nFramesToCapture - nFrameCount, 1); + nFrameCount += RtlWalkFrameChain(pFrames + nFrameCount, + nFramesToCapture - nFrameCount, + 1); } return nFrameCount; From e66431b123de0038bdcdc0fe02396d1d8701a284 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 1 May 2010 01:52:47 +0000 Subject: [PATCH 241/261] [PCI] - Store correct bus and slot information in resource lists that we give in response to IRP_MN_QUERY_RESOURCES and IRP_MN_QUERY_RESOURCE_REQUIREMENTS - Fixes bug 4354 svn path=/trunk/; revision=47068 --- reactos/drivers/bus/pci/pdo.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index 266b95d6a97..e5961fbf3a2 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -413,8 +413,8 @@ PdoQueryResourceRequirements( RtlZeroMemory(ResourceList, ListSize); ResourceList->ListSize = ListSize; ResourceList->InterfaceType = PCIBus; - ResourceList->BusNumber = 0; - ResourceList->SlotNumber = 0; + ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber; + ResourceList->SlotNumber = DeviceExtension->PciDevice->SlotNumber.u.AsULONG; ResourceList->AlternativeLists = 1; ResourceList->List[0].Version = 1; @@ -717,7 +717,7 @@ PdoQueryResources( RtlZeroMemory(ResourceList, ListSize); ResourceList->Count = 1; ResourceList->List[0].InterfaceType = PCIBus; - ResourceList->List[0].BusNumber = 0; + ResourceList->List[0].BusNumber = DeviceExtension->PciDevice->BusNumber; PartialList = &ResourceList->List[0].PartialResourceList; PartialList->Version = 1; From a0790104cc81365eae2435808f4efee6c8a85d1c Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 1 May 2010 09:55:16 +0000 Subject: [PATCH 242/261] [WIN32K] - The timer implementation uses a bitmap to store window-less timers. As an optimization to find the first free index, it uses the variable "HintIndex" which points to the first timer index. In order to find the next free index, the RtlFindClearBitsAndSet function is used. When a new timer is allocated, the "HintIndex" variable is increased, which increases the search offset. Now if more than NUM_WINDOW_LESS_TIMERS (1024) timers are allocated, no more timers can be allocated because RtlFindClearBitsAndSet will claim no more index are available, because the free indexes are below the search offset. Everytime a timer gets freed, store the freed index in "HintIndex". As a result the timer implementation will always find a free timer index (when there is one) svn path=/trunk/; revision=47069 --- reactos/subsystems/win32/win32k/ntuser/timer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index 863987f689e..a1da2d64314 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -526,6 +526,8 @@ IntKillTimer(HWND Wnd, UINT_PTR IDEvent, BOOL SystemTimer) ASSERT(RtlAreBitsSet(&WindowLessTimersBitMap, IDEvent - 1, 1)); RtlClearBits(&WindowLessTimersBitMap, IDEvent - 1, 1); + HintIndex = IDEvent - 1; + IntUnlockWindowlessTimerBitmap(); } From 06ef98d273d3081335dd06e6adba0a75a7ae9fcc Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 1 May 2010 10:42:45 +0000 Subject: [PATCH 243/261] [WIN32K] - Add an assert to PostTimerMessages to catch null pointer windows - Add another assert to catch special windows (Window == 1) - Improve check if the window is '1' svn path=/trunk/; revision=47070 --- reactos/subsystems/win32/win32k/ntuser/timer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index a1da2d64314..1c34ab751d5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -279,7 +279,9 @@ PostTimerMessages(PWINDOW_OBJECT Window) if (!pTmr) return FALSE; - if (Window && (int)Window != 1) + ASSERT(Window); + + if (Window && ((ULONG_PTR)Window != 1)) { if (!Window->Wnd) return FALSE; } @@ -294,6 +296,7 @@ PostTimerMessages(PWINDOW_OBJECT Window) (pTmr->pti == pti) && (pTmr->pWnd == Window)) { + ASSERT((ULONG_PTR)Window != 1); Msg.hwnd = Window->hSelf; Msg.message = (pTmr->flags & TMRF_SYSTEM) ? WM_SYSTIMER : WM_TIMER; Msg.wParam = (WPARAM) pTmr->nID; From d771ba8ec64e0b6339056590a98a6ec7d47c378a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 10:43:39 +0000 Subject: [PATCH 244/261] [NEWINFLIB] - Change Unicode string functions from wcs* to str*W because glibc (Linux build) provides the wcs* functions but they use a wchar_t size of 32 bits instead of the required 16 bits. - Add a str*W to wcs* wrapper (infrosrtl.c) in order to use the wcs* function for the WIN32 build. - Add required str*W functions to the host library. ATTENTION: This might break the build bot although it has been tested on Windows and Linux!!! svn path=/trunk/; revision=47071 --- reactos/lib/host/wcsfuncs/wcsfuncs.c | 40 ++++++++++++++++++++++ reactos/lib/newinflib/builddep.h | 27 ++++++++------- reactos/lib/newinflib/infcore.c | 28 +++++++-------- reactos/lib/newinflib/infget.c | 24 ++++++------- reactos/lib/newinflib/infhost.h | 6 ---- reactos/lib/newinflib/infhostrtl.c | 4 +-- reactos/lib/newinflib/inflib.rbuild | 1 + reactos/lib/newinflib/infput.c | 2 +- reactos/lib/newinflib/infrosput.c | 6 ++-- reactos/lib/newinflib/infrosrtl.c | 51 ++++++++++++++++++++++++++++ 10 files changed, 138 insertions(+), 51 deletions(-) create mode 100644 reactos/lib/newinflib/infrosrtl.c diff --git a/reactos/lib/host/wcsfuncs/wcsfuncs.c b/reactos/lib/host/wcsfuncs/wcsfuncs.c index fc40b7408c6..58dafe13cd3 100644 --- a/reactos/lib/host/wcsfuncs/wcsfuncs.c +++ b/reactos/lib/host/wcsfuncs/wcsfuncs.c @@ -18,6 +18,17 @@ SIZE_T utf16_wcslen(PCWSTR str) return i; } + +SIZE_T strlenW(PCWSTR str) +{ + SIZE_T i; + + for(i = 0; str[i]; i++); + + return i; +} + + PWSTR utf16_wcschr(PWSTR str, WCHAR c) { SIZE_T i; @@ -30,6 +41,18 @@ PWSTR utf16_wcschr(PWSTR str, WCHAR c) return NULL; } +PWSTR strchrW(PWSTR str, WCHAR c) +{ + SIZE_T i; + + for(i = 0; str[i] && str[i] != c; i++); + + if(str[i]) + return &str[i]; + else + return NULL; +} + INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count) { while(count--) @@ -46,3 +69,20 @@ INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count) return 0; } + +INT strncmpW(PCWSTR string1, PCWSTR string2, size_t count) +{ + while(count--) + { + if(*string1 != *string2) + return 1; + + if(*string1 == 0) + return 0; + + string1++; + string2++; + } + + return 0; +} diff --git a/reactos/lib/newinflib/builddep.h b/reactos/lib/newinflib/builddep.h index 6930a7d597d..873ab39915f 100644 --- a/reactos/lib/newinflib/builddep.h +++ b/reactos/lib/newinflib/builddep.h @@ -28,20 +28,13 @@ #define INF_STATUS_BUFFER_OVERFLOW E2BIG #define INF_SUCCESS(x) (0 == (x)) -typedef char TCHAR, *PTCHAR, *PTSTR; -typedef const TCHAR *PCTSTR; - -#define _T(x) x -#define _tcsicmp strcasecmp -#define _tcslen strlen -#define _tcscpy strcpy -#define _tcstoul strtoul -#define _tcstol strtol #define STRFMT "%s" -#ifdef _MSC_VER -#define strcasecmp _stricmp -#endif +NTSTATUS NTAPI RtlMultiByteToUnicodeN(IN PWCHAR UnicodeString, + IN ULONG UnicodeSize, IN PULONG ResultSize, IN PCSTR MbString, IN ULONG MbSize); + +BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); + #define IS_TEXT_UNICODE_ASCII16 1 #define IS_TEXT_UNICODE_REVERSE_ASCII16 16 @@ -69,10 +62,18 @@ typedef const TCHAR *PCTSTR; #include #define NTOS_MODE_USER #include -#include extern PVOID InfpHeap; +INT isspaceW(WCHAR c); +INT strlenW(PCWSTR s); +PWSTR strcpyW(PWSTR d, PCWSTR s); +PWSTR strncpyW(PWSTR d, PCWSTR s, SIZE_T c); +INT strcmpiW(PCWSTR s1, PCWSTR s2); +LONG strtolW(PCWSTR s, PWSTR *e, INT r); +ULONG strtoulW(PCWSTR s, PWSTR *e, INT r); + + #define FREE(Area) RtlFreeHeap(InfpHeap, 0, (Area)) #define MALLOC(Size) RtlAllocateHeap(InfpHeap, 0, (Size)) #define ZEROMEMORY(Area, Size) RtlZeroMemory((Area), (Size)) diff --git a/reactos/lib/newinflib/infcore.c b/reactos/lib/newinflib/infcore.c index b70ce795e19..7e187359e2a 100644 --- a/reactos/lib/newinflib/infcore.c +++ b/reactos/lib/newinflib/infcore.c @@ -154,7 +154,7 @@ InfpFindSection(PINFCACHE Cache, Section = Cache->FirstSection; while (Section != NULL) { - if (_wcsicmp (Section->Name, Name) == 0) + if (strcmpiW(Section->Name, Name) == 0) { return Section; } @@ -182,7 +182,7 @@ InfpAddSection(PINFCACHE Cache, /* Allocate and initialize the new section */ Size = (ULONG)FIELD_OFFSET(INFCACHESECTION, - Name[wcslen (Name) + 1]); + Name[strlenW(Name) + 1]); Section = (PINFCACHESECTION)MALLOC(Size); if (Section == NULL) { @@ -193,7 +193,7 @@ InfpAddSection(PINFCACHE Cache, Size); /* Copy section name */ - wcscpy (Section->Name, Name); + strcpyW(Section->Name, Name); /* Append section */ if (Cache->FirstSection == NULL) @@ -266,14 +266,14 @@ InfpAddKeyToLine(PINFCACHELINE Line, return NULL; } - Line->Key = (PWCHAR)MALLOC((wcslen(Key) + 1) * sizeof(WCHAR)); + Line->Key = (PWCHAR)MALLOC((strlenW(Key) + 1) * sizeof(WCHAR)); if (Line->Key == NULL) { DPRINT1("MALLOC() failed\n"); return NULL; } - wcscpy(Line->Key, Key); + strcpyW(Line->Key, Key); return (PVOID)Line->Key; } @@ -287,7 +287,7 @@ InfpAddFieldToLine(PINFCACHELINE Line, ULONG Size; Size = (ULONG)FIELD_OFFSET(INFCACHEFIELD, - Data[wcslen(Data) + 1]); + Data[strlenW(Data) + 1]); Field = (PINFCACHEFIELD)MALLOC(Size); if (Field == NULL) { @@ -296,7 +296,7 @@ InfpAddFieldToLine(PINFCACHELINE Line, } ZEROMEMORY (Field, Size); - wcscpy (Field->Data, Data); + strcpyW(Field->Data, Data); /* Append key */ if (Line->FirstField == NULL) @@ -325,7 +325,7 @@ InfpFindKeyLine(PINFCACHESECTION Section, Line = Section->FirstLine; while (Line != NULL) { - if (Line->Key != NULL && _wcsicmp (Line->Key, Key) == 0) + if (Line->Key != NULL && strcmpiW(Line->Key, Key) == 0) { return Line; } @@ -522,7 +522,7 @@ static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ) return p + 1; default: - if (!iswspace(*p)) + if (!isspaceW(*p)) { parser->start = p; set_state( parser, KEY_NAME ); @@ -595,7 +595,7 @@ static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ) set_state( parser, EOL_BACKSLASH ); return p; default: - if (!iswspace(*p)) token_end = p + 1; + if (!isspaceW(*p)) token_end = p + 1; else { push_token( parser, p ); @@ -647,7 +647,7 @@ static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ) set_state( parser, EOL_BACKSLASH ); return p; default: - if (!isspace(*p)) token_end = p + 1; + if (!isspaceW(*p)) token_end = p + 1; else { push_token( parser, p ); @@ -692,7 +692,7 @@ static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos return p + 1; default: - if (iswspace(*p)) + if (isspaceW(*p)) continue; push_token( parser, p ); pop_state( parser ); @@ -749,7 +749,7 @@ static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *po set_state( parser, EOL_BACKSLASH ); return p; } - if (!iswspace(*p)) + if (!isspaceW(*p)) break; } parser->start = p; @@ -770,7 +770,7 @@ static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *p set_state( parser, EOL_BACKSLASH ); return p; } - if (!iswspace(*p)) + if (!isspaceW(*p)) break; } pop_state( parser ); diff --git a/reactos/lib/newinflib/infget.c b/reactos/lib/newinflib/infget.c index 4238f1ce0b5..25177e1f975 100644 --- a/reactos/lib/newinflib/infget.c +++ b/reactos/lib/newinflib/infget.c @@ -41,7 +41,7 @@ InfpGetSubstitutionString(PINFCACHE Inf, return &percent; } - wcsncpy(ValueName, str, *len); + strncpyW(ValueName, str, *len); ValueName[*len] = 0; DPRINT("Value name: %S\n", ValueName); @@ -94,7 +94,7 @@ InfpGetSubstitutionString(PINFCACHE Inf, if (Status == STATUS_SUCCESS) { - *len = wcslen(Data); + *len = strlenW(Data); DPRINT("Substitute: %S Length: %ul\n", Data, *len); return Data; } @@ -253,7 +253,7 @@ InfpFindFirstMatchLine(PINFCONTEXT ContextIn, CacheLine = ((PINFCACHESECTION)(ContextIn->Section))->FirstLine; while (CacheLine != NULL) { - if (CacheLine->Key != NULL && _wcsicmp (CacheLine->Key, Key) == 0) + if (CacheLine->Key != NULL && strcmpiW (CacheLine->Key, Key) == 0) { if (ContextIn != ContextOut) @@ -289,7 +289,7 @@ InfpFindNextMatchLine(PINFCONTEXT ContextIn, CacheLine = (PINFCACHELINE)ContextIn->Line; while (CacheLine != NULL) { - if (CacheLine->Key != NULL && _wcsicmp (CacheLine->Key, Key) == 0) + if (CacheLine->Key != NULL && strcmpiW (CacheLine->Key, Key) == 0) { if (ContextIn != ContextOut) @@ -329,7 +329,7 @@ InfpGetLineCount(HINF InfHandle, while (CacheSection != NULL) { /* Are the section names the same? */ - if (_wcsicmp(CacheSection->Name, Section) == 0) + if (strcmpiW(CacheSection->Name, Section) == 0) { return CacheSection->LineCount; } @@ -402,7 +402,7 @@ InfpGetBinaryField(PINFCONTEXT Context, Ptr = ReturnBuffer; while (CacheField != NULL) { - *Ptr = (UCHAR)wcstoul(CacheField->Data, NULL, 16); + *Ptr = (UCHAR)strtoulW(CacheField->Data, NULL, 16); Ptr++; CacheField = CacheField->Next; @@ -450,7 +450,7 @@ InfpGetIntField(PINFCONTEXT Context, Ptr = CacheField->Data; } - *IntegerValue = (LONG)wcstol(Ptr, NULL, 0); + *IntegerValue = (LONG)strtolW(Ptr, NULL, 0); return INF_STATUS_SUCCESS; } @@ -493,7 +493,7 @@ InfpGetMultiSzField(PINFCONTEXT Context, Size = 0; while (FieldPtr != NULL) { - Size += ((ULONG)wcslen (FieldPtr->Data) + 1); + Size += ((ULONG)strlenW(FieldPtr->Data) + 1); FieldPtr = FieldPtr->Next; } Size++; @@ -511,9 +511,9 @@ InfpGetMultiSzField(PINFCONTEXT Context, FieldPtr = CacheField; while (FieldPtr != NULL) { - Size = (ULONG)wcslen (FieldPtr->Data) + 1; + Size = (ULONG)strlenW(FieldPtr->Data) + 1; - wcscpy (Ptr, FieldPtr->Data); + strcpyW(Ptr, FieldPtr->Data); Ptr = Ptr + Size; FieldPtr = FieldPtr->Next; @@ -565,7 +565,7 @@ InfpGetStringField(PINFCONTEXT Context, Ptr = CacheField->Data; } -// Size = (ULONG)wcslen (Ptr) + 1; +// Size = (ULONG)strlenW(Ptr) + 1; Size = InfpSubstituteString(Context->Inf, Ptr, NULL, @@ -579,7 +579,7 @@ InfpGetStringField(PINFCONTEXT Context, if (ReturnBufferSize <= Size) return INF_STATUS_BUFFER_OVERFLOW; -// wcscpy (ReturnBuffer, Ptr); +// strcpyW(ReturnBuffer, Ptr); InfpSubstituteString(Context->Inf, Ptr, ReturnBuffer, diff --git a/reactos/lib/newinflib/infhost.h b/reactos/lib/newinflib/infhost.h index 62403da83d8..b1dfaaf8a86 100644 --- a/reactos/lib/newinflib/infhost.h +++ b/reactos/lib/newinflib/infhost.h @@ -14,12 +14,6 @@ extern "C" { #include "infcommon.h" -extern NTSTATUS NTAPI RtlMultiByteToUnicodeN(IN PWCHAR UnicodeString, - IN ULONG UnicodeSize, IN PULONG ResultSize, IN PCSTR MbString, IN ULONG MbSize); - -extern BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); - - extern int InfHostOpenBufferedFile(PHINF InfHandle, void *Buffer, ULONG BufferSize, diff --git a/reactos/lib/newinflib/infhostrtl.c b/reactos/lib/newinflib/infhostrtl.c index c9a522149df..c62d40a8d56 100644 --- a/reactos/lib/newinflib/infhostrtl.c +++ b/reactos/lib/newinflib/infhostrtl.c @@ -115,7 +115,7 @@ RtlIsTextUnicode( PVOID buf, INT len, INT *pf ) { for (i = 0; i < len; i++) { - if (wcschr(std_control_chars, s[i])) + if (strchrW(std_control_chars, s[i])) { out_flags |= IS_TEXT_UNICODE_CONTROLS; break; @@ -127,7 +127,7 @@ RtlIsTextUnicode( PVOID buf, INT len, INT *pf ) { for (i = 0; i < len; i++) { - if (wcschr(byterev_control_chars, s[i])) + if (strchrW(byterev_control_chars, s[i])) { out_flags |= IS_TEXT_UNICODE_REVERSE_CONTROLS; break; diff --git a/reactos/lib/newinflib/inflib.rbuild b/reactos/lib/newinflib/inflib.rbuild index fc7c2cdd7bb..b8c85cf50c2 100644 --- a/reactos/lib/newinflib/inflib.rbuild +++ b/reactos/lib/newinflib/inflib.rbuild @@ -9,6 +9,7 @@ infrosgen.c infrosget.c infrosput.c + infrosrtl.c . diff --git a/reactos/lib/newinflib/infput.c b/reactos/lib/newinflib/infput.c index 2d60af0fb9f..c049f3fdcf5 100644 --- a/reactos/lib/newinflib/infput.c +++ b/reactos/lib/newinflib/infput.c @@ -37,7 +37,7 @@ Output(POUTPUTBUFFER OutBuf, PCWSTR Text) } /* Doesn't fit? */ - Length = (ULONG)wcslen(Text) * sizeof(WCHAR); + Length = (ULONG)strlenW(Text) * sizeof(WCHAR); if (OutBuf->FreeSize < Length + 1 && INF_SUCCESS(OutBuf->Status)) { DPRINT("Out of free space. TotalSize %u FreeSize %u Length %u\n", diff --git a/reactos/lib/newinflib/infrosput.c b/reactos/lib/newinflib/infrosput.c index 4c6ca5a3bca..f5d3df9399e 100644 --- a/reactos/lib/newinflib/infrosput.c +++ b/reactos/lib/newinflib/infrosput.c @@ -64,13 +64,13 @@ InfWriteFile(HINF InfHandle, HeaderBuffer = MALLOC(HeaderBufferSize); if (NULL != HeaderBuffer) { - wcscpy(HeaderBuffer, L"; "); + strcpyW(HeaderBuffer, L"; "); for (Index = 0; Index < HeaderComment->Length / sizeof(WCHAR); Index++) { HeaderBuffer[2 + Index] = HeaderComment->Buffer[Index]; } - wcscpy(HeaderBuffer + (2 + HeaderComment->Length / sizeof(WCHAR)), - L"\r\n\r\n"); + strcpyW(HeaderBuffer + (2 + HeaderComment->Length / sizeof(WCHAR)), + L"\r\n\r\n"); NtWriteFile(FileHandle, NULL, NULL, diff --git a/reactos/lib/newinflib/infrosrtl.c b/reactos/lib/newinflib/infrosrtl.c new file mode 100644 index 00000000000..42a5a5e3aef --- /dev/null +++ b/reactos/lib/newinflib/infrosrtl.c @@ -0,0 +1,51 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Eric Kohl + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + + +/* FUNCTIONS ****************************************************************/ + +INT isspaceW(WCHAR c) +{ + return iswspace(c); +} + +INT strlenW(PCWSTR s) +{ + return wcslen(s); +} + +PWSTR strcpyW(PWSTR d, PCWSTR s) +{ + return wcscpy(d, s); +} + +PWSTR strncpyW(PWSTR d, PCWSTR s, SIZE_T c) +{ + return wcsncpy(d, s, c); +} + +INT strcmpiW(PCWSTR s1, PCWSTR s2) +{ + return wcsicmp(s1, s2); +} + +LONG strtolW(PCWSTR s, PWSTR *e, INT r) +{ + return wcstol(s, e, r); +} + +ULONG strtoulW(PCWSTR s, PWSTR *e, INT r) +{ + return wcstoul(s, e, r); +} From daff774a1acdf07a8e061a322e968d172995f62c Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 1 May 2010 10:47:23 +0000 Subject: [PATCH 245/261] - Partly revert 470470 svn path=/trunk/; revision=47072 --- reactos/subsystems/win32/win32k/ntuser/timer.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index 1c34ab751d5..6ad4ddeb8ca 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -279,8 +279,6 @@ PostTimerMessages(PWINDOW_OBJECT Window) if (!pTmr) return FALSE; - ASSERT(Window); - if (Window && ((ULONG_PTR)Window != 1)) { if (!Window->Wnd) return FALSE; From 18af76559c7d830268d70cf1c974ebe1a89077da Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sat, 1 May 2010 12:02:23 +0000 Subject: [PATCH 246/261] [win32k] - Revert the hack done in 47059 to apply a better solution. - co_IntCreateWindowEx: Add the WNDS2_WMCREATEMSGPROCESSED flag to state2 member of WND after sending the WM_CREATE message. - By setting this flag it can be examined elsewhere to determine if the window was created successfully. - co_UserDestroyWindow: Examine above mentioned flag to make sure the windows was created before calling hook procedure to inform of destroying window. svn path=/trunk/; revision=47073 --- .../subsystems/win32/win32k/ntuser/window.c | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index aa1cbc0188e..603e36fcb34 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2333,6 +2333,11 @@ AllocErr: IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->Wnd, OBJID_WINDOW, 0); + /* By setting the flag below it can be examined to determine if the window + was created successfully and a valid pwnd was passed back to caller since + from here the function has to succeed. */ + Window->Wnd->state2 |= WNDS2_WMCREATEMSGPROCESSED; + /* Send move and size messages. */ if (!(Window->state & WINDOWOBJECT_NEED_SIZE)) { @@ -2468,23 +2473,7 @@ AllocErr: CLEANUP: if (!_ret_ && Window && Window->Wnd && ti) - { - ULONG SavedHooks; - /* HACK: co_UserDestroyWindow will call CBT proc with code HCBT_DESTROYWND. - Applications can choke on this as a hwnd was never returned from this call */ - /* Save the flags */ - SavedHooks = ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks; - - /* Temporary remove the flag */ - ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks &= ~HOOKID_TO_FLAG(WH_CBT); - - /* Destroy the window */ co_UserDestroyWindow(Window); - - /* Restore the flag */ - ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks = SavedHooks; - } - // UserFreeWindowInfo(ti, Window); if (Window) { @@ -2649,8 +2638,8 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) return FALSE; } - /* Call hooks */ - if (ISITHOOKED(WH_CBT)) + /* If window was created successfully and it is hooked */ + if ((Wnd->state2 & WNDS2_WMCREATEMSGPROCESSED) && (ISITHOOKED(WH_CBT))) { if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) hWnd, 0)) return FALSE; } From f4fd1abac0c5ba778bfa2c7c815fa4e67c6a0a50 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 1 May 2010 13:02:46 +0000 Subject: [PATCH 247/261] [GDI32] - Fix pointer arithmetics in the gdi batch code (&pTeb->GdiTebBatch.Buffer[0] is a PULONG, but pTeb->GdiTebBatch.Offset is a byte offset) - To prevent this from happening again, refactor the code to use one common routine GdiAllocBatchCommand to do most of the stuff. - Reenable gdi batch for SelectObject - Fixes gdi handle leak, causes some drawing problems in Acrobat reader, but those are less critical and I'll investigate those. svn path=/trunk/; revision=47074 --- reactos/dll/win32/gdi32/include/gdi32p.h | 87 ++++++++++++++++++++++++ reactos/dll/win32/gdi32/objects/dc.c | 31 ++++----- reactos/dll/win32/gdi32/objects/region.c | 25 +++---- 3 files changed, 107 insertions(+), 36 deletions(-) diff --git a/reactos/dll/win32/gdi32/include/gdi32p.h b/reactos/dll/win32/gdi32/include/gdi32p.h index f45a0ddd171..5cc09870a94 100644 --- a/reactos/dll/win32/gdi32/include/gdi32p.h +++ b/reactos/dll/win32/gdi32/include/gdi32p.h @@ -292,4 +292,91 @@ int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID); BOOL FASTCALL EndPagePrinterEx(PVOID,HANDLE); BOOL FASTCALL LoadTheSpoolerDrv(VOID); + +FORCEINLINE +PVOID +GdiAllocBatchCommand( + HDC hdc, + USHORT Cmd) +{ + PTEB pTeb; + ULONG ulSize; + PGDIBATCHHDR pHdr; + + /* Get a pointer to the TEB */ + pTeb = NtCurrentTeb(); + + /* Check if we have a valid environment */ + if (!pTeb || !pTeb->Win32ThreadInfo) return NULL; + + /* Do we use a DC? */ + if (hdc) + { + /* If the batch DC is NULL, we set this one as the new one */ + if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc; + + /* If not, check if the batch DC equal to our DC */ + else if (pTeb->GdiTebBatch.HDC != hdc) return NULL; + } + + /* Get the size of the entry */ + switch(Cmd) + { + case GdiBCPatBlt: + ulSize = 0; + break; + case GdiBCPolyPatBlt: + ulSize = 0; + break; + case GdiBCTextOut: + ulSize = 0; + break; + case GdiBCExtTextOut: + ulSize = 0; + break; + case GdiBCSetBrushOrg: + ulSize = 0; + break; + case GdiBCExtSelClipRgn: + ulSize = 0; + break; + case GdiBCSelObj: + ulSize = sizeof(GDIBSOBJECT); + break; + case GdiBCDelRgn: + ulSize = sizeof(GDIBSOBJECT); + break; + case GdiBCDelObj: + ulSize = sizeof(GDIBSOBJECT); + break; + default: + return NULL; + } + + /* Unsupported operation */ + if (ulSize == 0) return NULL; + + /* Check if the buffer is full */ + if ((pTeb->GdiBatchCount >= GDI_BatchLimit) || + ((pTeb->GdiTebBatch.Offset + ulSize) > GDIBATCHBUFSIZE)) + { + /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush + the current batch */ + NtGdiFlush(); + } + + /* Get the head of the entry */ + pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset); + + /* Update Offset and batch count */ + pTeb->GdiTebBatch.Offset += ulSize; + pTeb->GdiBatchCount++; + + /* Fill in the core fields */ + pHdr->Cmd = Cmd; + pHdr->Size = ulSize; + + return pHdr; +} + /* EOF */ diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index 2d90f60cdac..ddc33e501f1 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -1540,7 +1540,6 @@ SelectObject(HDC hDC, PDC_ATTR pDc_Attr; HGDIOBJ hOldObj = NULL; UINT uType; -// PTEB pTeb; if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) { @@ -1582,29 +1581,23 @@ SelectObject(HDC hDC, case GDI_OBJECT_TYPE_FONT: hOldObj = pDc_Attr->hlfntNew; if (hOldObj == hGdiObj) return hOldObj; -#if 0 + pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS; pDc_Attr->ulDirty_ |= DIRTY_CHARSET; pDc_Attr->hlfntNew = hGdiObj; - pTeb = NtCurrentTeb(); - if (((pTeb->GdiTebBatch.HDC == 0) || - (pTeb->GdiTebBatch.HDC == hDC)) && - ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) && - (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))) - { - PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] + - pTeb->GdiTebBatch.Offset); - pgO->gbHdr.Cmd = GdiBCSelObj; - pgO->gbHdr.Size = sizeof(GDIBSOBJECT); - pgO->hgdiobj = hGdiObj; - pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT); - pTeb->GdiTebBatch.HDC = hDC; - pTeb->GdiBatchCount++; - if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); - return hOldObj; + if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)) + { + PGDIBSOBJECT pgO; + + pgO = GdiAllocBatchCommand(hDC, GdiBCSelObj); + if (pgO) + { + pgO->hgdiobj = hGdiObj; + return hOldObj; + } } -#endif + // default for select object font return NtGdiSelectFont(hDC, hGdiObj); diff --git a/reactos/dll/win32/gdi32/objects/region.c b/reactos/dll/win32/gdi32/objects/region.c index 3e2b7fe5b65..b8d70772dcf 100644 --- a/reactos/dll/win32/gdi32/objects/region.c +++ b/reactos/dll/win32/gdi32/objects/region.c @@ -109,23 +109,14 @@ DeleteRegion( HRGN hRgn ) if ((GdiGetHandleUserData((HGDIOBJ) hRgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr)) && ( Rgn_Attr != NULL )) { - PTEB pTeb = NtCurrentTeb(); - if (pTeb->Win32ThreadInfo != NULL) - { - if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) - { - PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] + - pTeb->GdiTebBatch.Offset); - pgO->gbHdr.Cmd = GdiBCDelRgn; - pgO->gbHdr.Size = sizeof(GDIBSOBJECT); - pgO->hgdiobj = (HGDIOBJ)hRgn; - - pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT); - pTeb->GdiBatchCount++; - if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); - return TRUE; - } - } + PGDIBSOBJECT pgO; + + pgO = GdiAllocBatchCommand(NULL, GdiBCDelRgn); + if (pgO) + { + pgO->hgdiobj = (HGDIOBJ)hRgn; + return TRUE; + } } return NtGdiDeleteObjectApp((HGDIOBJ) hRgn); } From 35ff67b13e71b0f149435eac1019de00807354e8 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sat, 1 May 2010 13:32:38 +0000 Subject: [PATCH 248/261] [win32k] - Only call ExFreePool.. if Buffer is not NULL, which can occur if the Unicode String MessageNameUnsafe coming from user mode is incorrect. Fixes a bugcheck when using OllyDbg V2.0. svn path=/trunk/; revision=47075 --- reactos/subsystems/win32/win32k/ntuser/window.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 603e36fcb34..822c8c55285 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -4268,8 +4268,8 @@ NtUserRegisterWindowMessage(PUNICODE_STRING MessageNameUnsafe) } Ret = (UINT)IntAddAtom(SafeMessageName.Buffer); - - ExFreePoolWithTag(SafeMessageName.Buffer, TAG_STRING); + if (SafeMessageName.Buffer) + ExFreePoolWithTag(SafeMessageName.Buffer, TAG_STRING); RETURN( Ret); CLEANUP: From 4f7643e5b3ad7528431803453b36cc97bb2d90bc Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 20:17:11 +0000 Subject: [PATCH 249/261] [CMLIB/NEWINFLIB/MKHIVE] - Make cmlib, newinflib and mkhive use the Wine unicode lib instead of the host_wcsfuncs lib. - Only the header file include/host/wcsfuncs.h is still used to map str*W functions to wcs* functions in WIN32 builds. - Remove obsolete rtl functions. - Make mkhive use the newinflib instead of inflib. ATTENTION: This might break the build bot although it has been tested on Windows and Linux!!! svn path=/trunk/; revision=47076 --- reactos/include/host/wcsfuncs.h | 19 +++-- reactos/lib/cmlib/cminit.c | 2 +- reactos/lib/cmlib/cmlib.h | 1 + reactos/lib/cmlib/cmlib.rbuild | 2 + reactos/lib/newinflib/builddep.h | 12 +-- reactos/lib/newinflib/infget.c | 2 +- reactos/lib/newinflib/inflib.rbuild | 8 +- reactos/lib/newinflib/infrosrtl.c | 51 ------------ reactos/tools/mkhive/mkhive.rbuild | 8 +- reactos/tools/mkhive/reginf.c | 120 ++++++++++++++++------------ reactos/tools/mkhive/registry.c | 8 +- reactos/tools/mkhive/rtl.c | 2 +- 12 files changed, 101 insertions(+), 134 deletions(-) delete mode 100644 reactos/lib/newinflib/infrosrtl.c diff --git a/reactos/include/host/wcsfuncs.h b/reactos/include/host/wcsfuncs.h index bf2c12771f2..c07679aa34a 100644 --- a/reactos/include/host/wcsfuncs.h +++ b/reactos/include/host/wcsfuncs.h @@ -11,14 +11,19 @@ #ifdef USE_HOST_WCSFUNCS /* Function prototypes */ - SIZE_T utf16_wcslen(PCWSTR str); - PWSTR utf16_wcschr(PWSTR str, WCHAR c); - INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count); + #else - /* Define the utf16_ functions to the CRT functions */ - #define utf16_wcslen wcslen - #define utf16_wcschr wcschr - #define utf16_wcsncmp wcsncmp + /* Map str*W functions to wcs* function */ + + #define isspaceW iswspace + #define strchrW wcschr + #define strcmpiW _wcsicmp + #define strcpyW wcscpy + #define strlenW wcslen + #define strncmpW wcsncmp + #define strtolW wcstol + #define strtoulW wcstoul + #endif #endif diff --git a/reactos/lib/cmlib/cminit.c b/reactos/lib/cmlib/cminit.c index 59b3843432f..1be9b656a80 100644 --- a/reactos/lib/cmlib/cminit.c +++ b/reactos/lib/cmlib/cminit.c @@ -21,7 +21,7 @@ CmCreateRootNode( SIZE_T NameSize; /* Allocate the cell */ - NameSize = utf16_wcslen(Name) * sizeof(WCHAR); + NameSize = strlenW(Name) * sizeof(WCHAR); RootCellIndex = HvAllocateCell(Hive, FIELD_OFFSET(CM_KEY_NODE, Name) + NameSize, Stable, diff --git a/reactos/lib/cmlib/cmlib.h b/reactos/lib/cmlib/cmlib.h index c6823b06a47..e472fd35c4f 100644 --- a/reactos/lib/cmlib/cmlib.h +++ b/reactos/lib/cmlib/cmlib.h @@ -13,6 +13,7 @@ #define _CMLIB_DEBUG_ 1 #ifdef CMLIB_HOST + #include #include #include #include diff --git a/reactos/lib/cmlib/cmlib.rbuild b/reactos/lib/cmlib/cmlib.rbuild index 506eef92334..ab81a0256a2 100644 --- a/reactos/lib/cmlib/cmlib.rbuild +++ b/reactos/lib/cmlib/cmlib.rbuild @@ -14,6 +14,8 @@ hivewrt.c + " " + . diff --git a/reactos/lib/newinflib/builddep.h b/reactos/lib/newinflib/builddep.h index 873ab39915f..51b4d4850d7 100644 --- a/reactos/lib/newinflib/builddep.h +++ b/reactos/lib/newinflib/builddep.h @@ -8,6 +8,7 @@ /* Definitions native to the host on which we're building */ +#include #include #include @@ -65,15 +66,6 @@ BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); extern PVOID InfpHeap; -INT isspaceW(WCHAR c); -INT strlenW(PCWSTR s); -PWSTR strcpyW(PWSTR d, PCWSTR s); -PWSTR strncpyW(PWSTR d, PCWSTR s, SIZE_T c); -INT strcmpiW(PCWSTR s1, PCWSTR s2); -LONG strtolW(PCWSTR s, PWSTR *e, INT r); -ULONG strtoulW(PCWSTR s, PWSTR *e, INT r); - - #define FREE(Area) RtlFreeHeap(InfpHeap, 0, (Area)) #define MALLOC(Size) RtlAllocateHeap(InfpHeap, 0, (Size)) #define ZEROMEMORY(Area, Size) RtlZeroMemory((Area), (Size)) @@ -90,4 +82,6 @@ ULONG strtoulW(PCWSTR s, PWSTR *e, INT r); #endif /* INFLIB_HOST */ +#include + /* EOF */ diff --git a/reactos/lib/newinflib/infget.c b/reactos/lib/newinflib/infget.c index 25177e1f975..e2b360ab22d 100644 --- a/reactos/lib/newinflib/infget.c +++ b/reactos/lib/newinflib/infget.c @@ -41,7 +41,7 @@ InfpGetSubstitutionString(PINFCACHE Inf, return &percent; } - strncpyW(ValueName, str, *len); + memcpy(ValueName, str, *len * sizeof(WCHAR)); ValueName[*len] = 0; DPRINT("Value name: %S\n", ValueName); diff --git a/reactos/lib/newinflib/inflib.rbuild b/reactos/lib/newinflib/inflib.rbuild index b8c85cf50c2..7c758a7c332 100644 --- a/reactos/lib/newinflib/inflib.rbuild +++ b/reactos/lib/newinflib/inflib.rbuild @@ -9,16 +9,16 @@ infrosgen.c infrosget.c infrosput.c - infrosrtl.c + " " + . + + -Wwrite-strings -Wpointer-arith - -Wconversion - -Wstrict-prototypes - -Wmissing-prototypes infcore.c diff --git a/reactos/lib/newinflib/infrosrtl.c b/reactos/lib/newinflib/infrosrtl.c deleted file mode 100644 index 42a5a5e3aef..00000000000 --- a/reactos/lib/newinflib/infrosrtl.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Eric Kohl - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infhost.h" - -#define NDEBUG -#include - - -/* FUNCTIONS ****************************************************************/ - -INT isspaceW(WCHAR c) -{ - return iswspace(c); -} - -INT strlenW(PCWSTR s) -{ - return wcslen(s); -} - -PWSTR strcpyW(PWSTR d, PCWSTR s) -{ - return wcscpy(d, s); -} - -PWSTR strncpyW(PWSTR d, PCWSTR s, SIZE_T c) -{ - return wcsncpy(d, s, c); -} - -INT strcmpiW(PCWSTR s1, PCWSTR s2) -{ - return wcsicmp(s1, s2); -} - -LONG strtolW(PCWSTR s, PWSTR *e, INT r) -{ - return wcstol(s, e, r); -} - -ULONG strtoulW(PCWSTR s, PWSTR *e, INT r) -{ - return wcstoul(s, e, r); -} diff --git a/reactos/tools/mkhive/mkhive.rbuild b/reactos/tools/mkhive/mkhive.rbuild index c5d22dc1fbc..3b78e806f2c 100644 --- a/reactos/tools/mkhive/mkhive.rbuild +++ b/reactos/tools/mkhive/mkhive.rbuild @@ -1,15 +1,17 @@ - . + " " + + . . . . -fshort-wchar - inflibhost + newinflibhost cmlibhost - host_wcsfuncs + unicode binhive.c cmi.c mkhive.c diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index dd8ac4596e0..330afc0a4ae 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -48,37 +48,51 @@ #define FLG_ADDREG_TYPE_MASK (0xFFFF0000 | FLG_ADDREG_BINVALUETYPE) +static const WCHAR HKCR[] = {'H','K','C','R',0}; +static const WCHAR HKCU[] = {'H','K','C','U',0}; +static const WCHAR HKLM[] = {'H','K','L','M',0}; +static const WCHAR HKU[] = {'H','K','U',0}; +static const WCHAR HKR[] = {'H','K','R',0}; + +static const WCHAR HKCRPath[] = {'\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e','\\','S','O','F','T','W','A','R','E','\\','C','l','a','s','s','e','s','\\',0}; +static const WCHAR HKCUPath[] = {'\\','R','e','g','i','s','t','r','y','\\','U','s','e','r','\\','.','D','E','F','A','U','L','T','\\',0}; +static const WCHAR HKLMPath[] = {'\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e','\\',0}; +static const WCHAR HKUPath[] = {'\\','R','e','g','i','s','t','r','y','\\','U','s','e','r','\\',0}; + +static const WCHAR AddReg[] = {'A','d','d','R','e','g',0}; +static const WCHAR DelReg[] = {'D','e','l','R','e','g',0}; + /* FUNCTIONS ****************************************************************/ static BOOL -GetRootKey (PCHAR Name) +GetRootKey (PWCHAR Name) { - if (!strcasecmp (Name, "HKCR")) + if (!strcmpiW (Name, HKCR)) { - strcpy (Name, "\\Registry\\Machine\\SOFTWARE\\Classes\\"); + strcpyW (Name, HKCRPath); return TRUE; } - if (!strcasecmp (Name, "HKCU")) + if (!strcmpiW (Name, HKCU)) { - strcpy (Name, "\\Registry\\User\\.DEFAULT\\"); + strcpyW (Name, HKCUPath); return TRUE; } - if (!strcasecmp (Name, "HKLM")) + if (!strcmpiW (Name, HKLM)) { - strcpy (Name, "\\Registry\\Machine\\"); + strcpyW (Name, HKLMPath); return TRUE; } - if (!strcasecmp (Name, "HKU")) + if (!strcmpiW (Name, HKU)) { - strcpy (Name, "\\Registry\\User\\"); + strcpyW (Name, HKUPath); return TRUE; } #if 0 - if (!strcasecmp (Name, "HKR")) + if (!strcmpiW (Name, HKR)) return FALSE; #endif @@ -94,19 +108,19 @@ GetRootKey (PCHAR Name) static VOID AppendMultiSzValue ( IN HKEY KeyHandle, - IN PCHAR ValueName, - IN PCHAR Strings, + IN PWCHAR ValueName, + IN PWCHAR Strings, IN SIZE_T StringSize) { SIZE_T Size; ULONG Type; size_t Total; - PCHAR Buffer; - PCHAR p; + PWCHAR Buffer; + PWCHAR p; size_t len; LONG Error; - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -117,11 +131,11 @@ AppendMultiSzValue ( (Type != REG_MULTI_SZ)) return; - Buffer = malloc (Size + StringSize); + Buffer = malloc ((Size + StringSize) * sizeof(WCHAR)); if (Buffer == NULL) return; - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -135,10 +149,10 @@ AppendMultiSzValue ( Total = Size; while (*Strings != 0) { - len = strlen (Strings) + 1; + len = strlenW(Strings) + 1; - for (p = Buffer; *p != 0; p += strlen (p) + 1) - if (!strcasecmp (p, Strings)) + for (p = Buffer; *p != 0; p += strlenW(p) + 1) + if (!strcmpiW(p, Strings)) break; if (*p == 0) /* not found, need to append it */ @@ -152,14 +166,14 @@ AppendMultiSzValue ( if (Total != Size) { - DPRINT ("setting value %s to %s\n", ValueName, Buffer); - RegSetValueExA ( + DPRINT ("setting value %S to %S\n", ValueName, Buffer); + RegSetValueExW ( KeyHandle, ValueName, 0, REG_MULTI_SZ, (PUCHAR)Buffer, - (ULONG)Total); + (ULONG)Total * sizeof(WCHAR)); } done: @@ -175,11 +189,11 @@ done: static BOOL do_reg_operation( IN HKEY KeyHandle, - IN PCHAR ValueName, + IN PWCHAR ValueName, IN PINFCONTEXT Context, IN ULONG Flags) { - CHAR EmptyStr = (CHAR)0; + WCHAR EmptyStr = (CHAR)0; ULONG Type; ULONG Size; LONG Error; @@ -188,11 +202,11 @@ do_reg_operation( { if (ValueName) { - RegDeleteValueA (KeyHandle, ValueName); + RegDeleteValueW (KeyHandle, ValueName); } else { - RegDeleteKeyA (KeyHandle, NULL); + RegDeleteKeyW (KeyHandle, NULL); } return TRUE; @@ -203,7 +217,7 @@ do_reg_operation( if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY)) { - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -253,7 +267,7 @@ do_reg_operation( if (!(Flags & FLG_ADDREG_BINVALUETYPE) || (Type == REG_DWORD && InfHostGetFieldCount (Context) == 5)) { - PCHAR Str = NULL; + PWCHAR Str = NULL; if (Type == REG_MULTI_SZ) { @@ -262,7 +276,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size); + Str = malloc (Size * sizeof(WCHAR)); if (Str == NULL) return FALSE; @@ -292,7 +306,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size); + Str = malloc (Size * sizeof(WCHAR)); if (Str == NULL) return FALSE; @@ -302,11 +316,11 @@ do_reg_operation( if (Type == REG_DWORD) { - ULONG dw = Str ? strtoul (Str, NULL, 0) : 0; + ULONG dw = Str ? strtoulW (Str, NULL, 0) : 0; - DPRINT("setting dword %s to %x\n", ValueName, dw); + DPRINT("setting dword %S to %x\n", ValueName, dw); - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -316,27 +330,27 @@ do_reg_operation( } else { - DPRINT("setting value %s to %s\n", ValueName, Str); + DPRINT("setting value %S to %S\n", ValueName, Str); if (Str) { - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, Type, (PVOID)Str, - (ULONG)Size); + (ULONG)Size * sizeof(WCHAR)); } else { - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, Type, (PVOID)&EmptyStr, - (ULONG)sizeof(CHAR)); + (ULONG)sizeof(WCHAR)); } } free (Str); @@ -354,11 +368,11 @@ do_reg_operation( if (Data == NULL) return FALSE; - DPRINT("setting binary data %s len %d\n", ValueName, Size); + DPRINT("setting binary data %S len %d\n", ValueName, Size); InfHostGetBinaryField (Context, 5, Data, Size, NULL); } - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -378,10 +392,10 @@ do_reg_operation( * Called once for each AddReg and DelReg entry in a given section. */ static BOOL -registry_callback (HINF hInf, PCHAR Section, BOOL Delete) +registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) { - CHAR Buffer[MAX_INF_STRING_LENGTH]; - PCHAR ValuePtr; + WCHAR Buffer[MAX_INF_STRING_LENGTH]; + PWCHAR ValuePtr; ULONG Flags; size_t Length; @@ -403,11 +417,11 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) continue; /* get key */ - Length = strlen (Buffer); + Length = strlenW (Buffer); if (InfHostGetStringField (Context, 2, Buffer + Length, MAX_INF_STRING_LENGTH - (ULONG)Length, NULL) != 0) *Buffer = 0; - DPRINT("KeyName: <%s>\n", Buffer); + DPRINT("KeyName: <%S>\n", Buffer); if (Delete) { @@ -424,17 +438,17 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) if (Delete || (Flags & FLG_ADDREG_OVERWRITEONLY)) { - if (RegOpenKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegOpenKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegOpenKey(%s) failed\n", Buffer); + DPRINT("RegOpenKey(%S) failed\n", Buffer); continue; /* ignore if it doesn't exist */ } } else { - if (RegCreateKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegCreateKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegCreateKey(%s) failed\n", Buffer); + DPRINT("RegCreateKey(%S) failed\n", Buffer); continue; } } @@ -469,18 +483,18 @@ ImportRegistryFile(PCHAR FileName) ULONG ErrorLine; /* Load inf file from install media. */ - if (InfHostOpenFile(&hInf, FileName, &ErrorLine) != 0) + if (InfHostOpenFile(&hInf, FileName, 0, &ErrorLine) != 0) { DPRINT1 ("InfHostOpenFile(%s) failed\n", FileName); return FALSE; } - if (!registry_callback (hInf, "DelReg", TRUE)) + if (!registry_callback (hInf, (PWCHAR)DelReg, TRUE)) { DPRINT1 ("registry_callback() for DelReg failed\n"); } - if (!registry_callback (hInf, "AddReg", FALSE)) + if (!registry_callback (hInf, (PWCHAR)AddReg, FALSE)) { DPRINT1 ("registry_callback() for AddReg failed\n"); } diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index a6d7d4b248f..6813a67d195 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -127,7 +127,7 @@ RegpOpenOrCreateKey( LocalKeyName = (PWSTR)KeyName; for (;;) { - End = (PWSTR) utf16_wcschr(LocalKeyName, '\\'); + End = (PWSTR)strchrW(LocalKeyName, '\\'); if (End) { KeyString.Buffer = LocalKeyName; @@ -138,9 +138,9 @@ RegpOpenOrCreateKey( RtlInitUnicodeString(&KeyString, LocalKeyName); /* Redirect from 'CurrentControlSet' to 'ControlSet001' */ - if (!utf16_wcsncmp(LocalKeyName, L"CurrentControlSet", 17) && - ParentKey->NameSize == 12 && - !memcmp(ParentKey->Name, L"SYSTEM", 12)) + if (!strncmpW(LocalKeyName, L"CurrentControlSet", 17) && + ParentKey->NameSize == 12 && + !memcmp(ParentKey->Name, L"SYSTEM", 12)) RtlInitUnicodeString(&KeyString, L"ControlSet001"); /* Check subkey in memory structure */ diff --git a/reactos/tools/mkhive/rtl.c b/reactos/tools/mkhive/rtl.c index e9ed22b66e0..4a186e253f6 100644 --- a/reactos/tools/mkhive/rtl.c +++ b/reactos/tools/mkhive/rtl.c @@ -59,7 +59,7 @@ RtlInitUnicodeString( if(SourceString) { - DestSize = utf16_wcslen(SourceString) * sizeof(WCHAR); + DestSize = strlenW(SourceString) * sizeof(WCHAR); DestinationString->Length = (USHORT)DestSize; DestinationString->MaximumLength = (USHORT)DestSize + sizeof(WCHAR); } From f6cb22d04e630c71286330ede59494e8f4fd2966 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 22:00:09 +0000 Subject: [PATCH 250/261] Remove duplicate line. WRC complains about the control id already being in use. svn path=/trunk/; revision=47077 --- reactos/dll/cpl/sysdm/lang/uk-UA.rc | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/dll/cpl/sysdm/lang/uk-UA.rc b/reactos/dll/cpl/sysdm/lang/uk-UA.rc index 408f6511dc6..651a167d1ea 100644 --- a/reactos/dll/cpl/sysdm/lang/uk-UA.rc +++ b/reactos/dll/cpl/sysdm/lang/uk-UA.rc @@ -58,7 +58,6 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN GROUPBOX "²íôîðìàö³ÿ ïðî âåðñ³þ",IDC_STATIC,6,3,210,73 CONTROL "Ïîçíà÷èòè ÿê ðîáî÷ó ñòàíö³þ",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10 - CONTROL "Ïîçíà÷èòè ÿê ðîáî÷ó ñòàíö³þ",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10 LTEXT "ReactOS áóäóºòüñÿ ÿê ñåðâåðíà ÎÑ. Îáðàòè ïðàïîðåöü, ùîá çì³íèòè ëèøå öåé äîäàòîê.",IDC_STATIC,15,15,183,41 PUSHBUTTON "OK",IDOK,166,83,50,14 END From 1f235be55f0700849ec325e23b9b25f2ac405a48 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 22:16:44 +0000 Subject: [PATCH 251/261] Delete ANSI version. svn path=/trunk/; revision=47078 --- reactos/boot/bootdata/hivedef_i386.inf | 1872 ------------------------ 1 file changed, 1872 deletions(-) delete mode 100644 reactos/boot/bootdata/hivedef_i386.inf diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf deleted file mode 100644 index 9cf6b0c1147..00000000000 --- a/reactos/boot/bootdata/hivedef_i386.inf +++ /dev/null @@ -1,1872 +0,0 @@ -[Version] -Signature="$ReactOS$ - -[AddReg] - -HKCU,"Console","CursorSize",0x00010003,25 -HKCU,"Console","FaceName",0x00000002,"" -HKCU,"Console","FontFamily",0x00010003,0 -HKCU,"Console","FontSize",0x00010003,0 -HKCU,"Console","FontWeight",0x00010003,0 -HKCU,"Console","FullScreen",0x00010003,0 -HKCU,"Console","HistoryBufferSize",0x00010003,50 -HKCU,"Console","InsertMode",0x00010003,1 -HKCU,"Console","LoadConIme",0x00010003,1 -HKCU,"Console","NumberOfHistoryBuffers",0x00010003,4 -HKCU,"Console","PopupColors",0x00010003,245 -HKCU,"Console","QuickEdit",0x00010003,0 -HKCU,"Console","ScreenBufferSize",0x00010003,19660880 -HKCU,"Console","ScreenColors",0x00010003,7 -HKCU,"Console","WindowSize",0x00010003,1638480 -HKCU,"Console","ColorTable00",0x00010003,0 -HKCU,"Console","ColorTable01",0x00010003,8388608 -HKCU,"Console","ColorTable02",0x00010003,32768 -HKCU,"Console","ColorTable03",0x00010003,8421376 -HKCU,"Console","ColorTable04",0x00010003,128 -HKCU,"Console","ColorTable05",0x00010003,8388736 -HKCU,"Console","ColorTable06",0x00010003,32896 -HKCU,"Console","ColorTable07",0x00010003,12632256 -HKCU,"Console","ColorTable08",0x00010003,8421504 -HKCU,"Console","ColorTable09",0x00010003,16711680 -HKCU,"Console","ColorTable10",0x00010003,65280 -HKCU,"Console","ColorTable11",0x00010003,16776960 -HKCU,"Console","ColorTable12",0x00010003,255 -HKCU,"Console","ColorTable13",0x00010003,16711935 -HKCU,"Console","ColorTable14",0x00010003,65535 -HKCU,"Console","ColorTable15",0x00010003,16777215 - -HKCU,"Control Panel",,0x00000012 - -; Accessibility -HKCU,"Control Panel\Accessibility",,0x00000012 -HKCU,"Control Panel\Accessibility\Keyboard Preference",,0x00000012 -HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0" -HKCU,"Control Panel\Accessibility\HighContrast","Flags",2,"126" -HKCU,"Control Panel\Accessibility\HighContrast","High Contrast Scheme",2,"High Contrast Black (large)" -HKCU,"Control Panel\Accessibility\Keyboard Response","AutoRepeatDelay",2,"1000" -HKCU,"Control Panel\Accessibility\Keyboard Response","AutoRepeatRate",2,"500" -HKCU,"Control Panel\Accessibility\Keyboard Response","BounceTime",2,"0" -HKCU,"Control Panel\Accessibility\Keyboard Response","DelayBeforeAcceptance",2,"1000" -HKCU,"Control Panel\Accessibility\Keyboard Response","Flags",2,"126" -HKCU,"Control Panel\Accessibility\MouseKeys","Flags",2,"62" -HKCU,"Control Panel\Accessibility\MouseKeys","MaximumSpeed",2,"80" -HKCU,"Control Panel\Accessibility\MouseKeys","TimeToMaximumSpeed",2,"3000" -HKCU,"Control Panel\Accessibility\ShowSounds","On",2,"0" -HKCU,"Control Panel\Accessibility\SoundSentry","Flags",2,"2" -HKCU,"Control Panel\Accessibility\SoundSentry","FSTextEffect",2,"0" -HKCU,"Control Panel\Accessibility\SoundSentry","WindowsEffect",2,"1" -HKCU,"Control Panel\Accessibility\StickyKeys","Flags",2,"510" -HKCU,"Control Panel\Accessibility\TimeOut","Flags",2,"2" -HKCU,"Control Panel\Accessibility\TimeOut","TimeToWait",2,"300000" -HKCU,"Control Panel\Accessibility\ToggleKeys","Flags",2,"62" -HKCU,"Control Panel\Accessibility\Blind Access","On",2,"0" - -HKCU,"Control Panel\Mouse","MouseTrails",0x00000002,"0" -HKCU,"Control Panel\Mouse","SnapToDefaultButton",0x00000002,"0" -HKCU,"Control Panel\Mouse","MouseSpeed",0x00000002,"1" -HKCU,"Control Panel\Mouse","MouseThreshold1",0x00000002,"6" -HKCU,"Control Panel\Mouse","MouseThreshold2",0x00000002,"10" -HKCU,"Control Panel\Mouse","DoubleClickSpeed",0x00000002,"500" -HKCU,"Control Panel\Mouse","SwapMouseButtons",0x00000002,"0" -HKCU,"Control Panel\Mouse","MouseSensitivity",0x00000002,"10" -HKCU,"Control Panel\Mouse","MouseHoverTime",0x00000002,"400" -HKCU,"Control Panel\Mouse","MouseHoverWidth",0x00000002,"4" -HKCU,"Control Panel\Mouse","MouseHoverHeight",0x00000002,"4" -HKCU,"Control Panel\Mouse","DoubleClickWidth",0x00000002,"4" -HKCU,"Control Panel\Mouse","DoubleClickHeight",0x00000002,"4" - -HKCU,"Control Panel\Keyboard","InitialKeyboardIndicators",2,"0x80000000" -HKCU,"Control Panel\Keyboard","KeyboardDelay",2,"1" -HKCU,"Control Panel\Keyboard","KeyboardSpeed",2,"31" - -HKCU,"Control Panel\Desktop","ActiveWndTrkTimeout",0x00010003,0x00000000 -HKCU,"Control Panel\Desktop","AutoEndTasks",2,"0" -HKCU,"Control Panel\Desktop","CaretWidth",0x00010003,0x00000001 -HKCU,"Control Panel\Desktop","CoolSwitch",2,"1" -HKCU,"Control Panel\Desktop","CoolSwitchColumns",2,"7" -HKCU,"Control Panel\Desktop","CoolSwitchRows",2,"3" -HKCU,"Control Panel\Desktop","CursorBlinkRate",2,"530" -HKCU,"Control Panel\Desktop","DragFullWindows",2,"0" -HKCU,"Control Panel\Desktop","DragHeight",0x00000000,"4" -HKCU,"Control Panel\Desktop","DragWidth",0x00000000,"4" -HKCU,"Control Panel\Desktop","PaintDesktopVersion",0x00010001,"0" -HKCU,"Control Panel\Desktop","HungAppTimeout",2,"5000" -HKCU,"Control Panel\Desktop","SCRNSAVE.EXE",0,"" -HKCU,"Control Panel\Desktop","ScreenSaveActive",2,"1" -HKCU,"Control Panel\Desktop","ScreenSaverIsSecure",2,"1" -HKCU,"Control Panel\Desktop","ScreenSaveTimeOut",0,"600" -HKCU,"Control Panel\Desktop","WaitToKillAppTimeout",2,"20000" -HKCU,"Control Panel\Desktop","Wallpaper",0x00000000,"" -HKCU,"Control Panel\Desktop","FontSmoothing",2,"0" -HKCU,"Control Panel\Desktop","FontSmoothingOrientation",0x00010003,0x00000001 -HKCU,"Control Panel\Desktop","FontSmoothingType",0x00010003,0x00000001 -HKCU,"Control Panel\Desktop","ForegroundFlashCount",0x00010003,0x00000003 -HKCU,"Control Panel\Desktop","ForegroundLockTimeout",0x00010003,0x00030d40 -HKCU,"Control Panel\Desktop","GridGranularity",2,"0" -HKCU,"Control Panel\Desktop","SmoothScroll",3,00,00,00,00 -HKCU,"Control Panel\Desktop","UserPreferencesMask",3,10,00,00,80 -HKCU,"Control Panel\Desktop","LowPowerActive",2,"0" -HKCU,"Control Panel\Desktop","LowPowerTimeOut",2,"0" -HKCU,"Control Panel\Desktop","PowerOffActive",2,"0" -HKCU,"Control Panel\Desktop","PowerOffTimeOut",2,"0" -HKCU,"Control Panel\Desktop","MenuShowDelay",2,"400" -HKCU,"Control Panel\Desktop","WheelScrollLines",2,"3" -HKCU,"Control Panel\Desktop","WheelScrollChars",2,"3" -HKCU,"Control Panel\Desktop","TileWallpaper",2,"0" -HKCU,"Control Panel\Desktop","Pattern",2,"(None)" - -HKCU,"Control Panel\Desktop\WindowMetrics","ScrollWidth",2,"16" -HKCU,"Control Panel\Desktop\WindowMetrics","ScrollHeight",2,"16" -HKCU,"Control Panel\Desktop\WindowMetrics","CaptionWidth",2,"18" -HKCU,"Control Panel\Desktop\WindowMetrics","CaptionHeight",2,"18" -HKCU,"Control Panel\Desktop\WindowMetrics","SmCaptionWidth",2,"13" -HKCU,"Control Panel\Desktop\WindowMetrics","SmCaptionHeight",2,"15" -HKCU,"Control Panel\Desktop\WindowMetrics","MenuWidth",2,"18" -HKCU,"Control Panel\Desktop\WindowMetrics","MenuHeight",2,"18" -HKCU,"Control Panel\Desktop\WindowMetrics","BorderWidth",2,"1" -HKCU,"Control Panel\Desktop\WindowMetrics","Shell Icon Size",2,"32" -HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,\ -00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","IconFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ -00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,\ -61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","MenuFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ -00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,\ -61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","MessageFont",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,\ -00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","SmCaptionFont",0x00000001,f5,ff,ff,ff,00,00,\ -00,00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,\ -6d,00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","StatusFont",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,\ -00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 - -; Input Methods -HKCU,"Control Panel\Input Method\Hot Keys",,0x00000012 -HKCU,"Control Panel\Input Method\Hot Keys\00000010","Key Modifiers",0x00030003,02,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000010","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000010","Virtual Key",0x00030003,20,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000011","Key Modifiers",0x00030003,04,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000011","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000011","Virtual Key",0x00030003,20,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000012","Key Modifiers",0x00030003,02,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000012","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000012","Virtual Key",0x00030003,be,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000070","Key Modifiers",0x00030003,02,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000070","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000070","Virtual Key",0x00030003,20,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000071","Key Modifiers",0x00030003,04,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000071","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000071","Virtual Key",0x00030003,20,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000072","Key Modifiers",0x00030003,03,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000072","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000072","Virtual Key",0x00030003,bc,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000200","Key Modifiers",0x00030003,03,C0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000200","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000200","Virtual Key",0x00030003,47,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000201","Key Modifiers",0x00030003,03,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000201","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000201","Virtual Key",0x00030003,4b,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000202","Key Modifiers",0x00030003,03,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000202","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000202","Virtual Key",0x00030003,4c,00,00,00 - -; International keys -HKCU,"Control Panel\International",,0x00000012 -HKCU,"Control Panel\International","Locale",0x00000000,"0409" -HKCU,"Control Panel\International","iCountry",2,"1" -HKCU,"Control Panel\International","iCurrDigits",2,"2" -HKCU,"Control Panel\International","iCurrency",2,"0" -HKCU,"Control Panel\International","iDate",2,"0" -HKCU,"Control Panel\International","iDigits",2,"2" -HKCU,"Control Panel\International","iLZero",2,"1" -HKCU,"Control Panel\International","iMeasure",2,"1" -HKCU,"Control Panel\International","iNegCurr",2,"0" -HKCU,"Control Panel\International","iTime",2,"0" -HKCU,"Control Panel\International","iTLZero",2,"0" -HKCU,"Control Panel\International","s1159",2,"AM" -HKCU,"Control Panel\International","s2359",2,"PM" -HKCU,"Control Panel\International","sCountry",2,"United States" -HKCU,"Control Panel\International","sCurrency",2,"$" -HKCU,"Control Panel\International","sDate",2,"/" -HKCU,"Control Panel\International","sDecimal",2,"." -;HKCU,"Control Panel\International","sLanguage",2,"ENU" -HKCU,"Control Panel\International","sList",2,"," -HKCU,"Control Panel\International","sLongDate",2,"dddd, MMMM dd, yyyy" -HKCU,"Control Panel\International","sShortDate",2,"M/d/yyyy" -HKCU,"Control Panel\International","sThousand",2,"," -HKCU,"Control Panel\International","sTime",2,":" -HKCU,"Control Panel\International\Geo","Nation",0x00000000,"1" - -; Cursors Schemes -HKCU,"Control Panel\Cursors",,,"ReactOS Default" -HKCU,"Control Panel\Cursors","Scheme Source",0x00010001,0x00000002 - -; PowerCfg -HKCU,"Control Panel\PowerCfg","CurrentPowerPolicy",2,"0" -HKCU,"Control Panel\PowerCfg\GlobalPowerPolicy","Policies",0x00030003,01,00,00,00,00,\ -00,00,00,03,00,00,00,10,00,00,00,00,00,00,00,03,00,00,00,10,00,00,00,02,00,00,00,03,\ -00,00,00,00,00,00,00,02,00,00,00,03,00,00,00,00,00,00,00,02,00,00,00,01,00,00,00,00,\ -00,00,00,02,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,03,00,00,00,03,00,00,00,00,\ -00,00,C0,01,00,00,00,05,00,00,00,01,00,00,00,0A,00,00,00,00,00,00,00,03,00,00,00,01,\ -00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,16,\ -00,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\0","Name",2,"Home/Office Desk" -HKCU,"Control Panel\PowerCfg\PowerPolicies\0","Description",2,"This scheme is suited to most home or desktop computers that are left plugged in all the time." -HKCU,"Control Panel\PowerCfg\PowerPolicies\0","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,2C,01,\ -00,00,32,32,00,03,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,B0,04,00,00,2C,01,\ -00,00,00,00,00,00,58,02,00,00,01,01,64,50,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\1","Name",2,"Portable/Laptop" -HKCU,"Control Panel\PowerCfg\PowerPolicies\1","Description",2,"This scheme is designed for extended battery life for portable computers on the road." -HKCU,"Control Panel\PowerCfg\PowerPolicies\1","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,01,00,00,00,00,00,00,00,B0,04,00,00,2C,01,\ -00,00,32,32,03,03,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,84,03,00,00,2C,01,\ -00,00,08,07,00,00,2C,01,00,00,01,01,64,50,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\2","Name",2,"Presentation" -HKCU,"Control Panel\PowerCfg\PowerPolicies\2","Description",2,"This scheme keeps the monitor on for doing presentations." -HKCU,"Control Panel\PowerCfg\PowerPolicies\2","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,84,03,\ -00,00,32,32,03,02,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,2C,01,00,00,01,01,50,50,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\3","Name",2,"Always On" -HKCU,"Control Panel\PowerCfg\PowerPolicies\3","Description",2,"This scheme keeps the computer running so that it can be accessed from the network. Use this scheme if you do not have network wakeup hardware." -HKCU,"Control Panel\PowerCfg\PowerPolicies\3","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,32,32,00,00,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,B0,04,00,00,84,03,\ -00,00,00,00,00,00,08,07,00,00,00,01,64,64,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\4","Name",2,"Minimal Power Management" -HKCU,"Control Panel\PowerCfg\PowerPolicies\4","Description",2,"This scheme keeps the computer on and optimizes it for high performance." -HKCU,"Control Panel\PowerCfg\PowerPolicies\4","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,2C,01,\ -00,00,32,32,03,03,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,84,03,00,00,2C,01,\ -00,00,00,00,00,00,84,03,00,00,00,01,64,64,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\5","Name",2,"Max Battery" -HKCU,"Control Panel\PowerCfg\PowerPolicies\5","Description",2,"This scheme is extremely aggressive for saving power." -HKCU,"Control Panel\PowerCfg\PowerPolicies\5","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,05,00,00,00,00,00,00,00,B0,04,00,00,78,00,\ -00,00,32,32,03,02,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,84,03,00,00,3C,00,\ -00,00,00,00,00,00,B4,00,00,00,01,01,64,32,64,64,00,00 - -; Color schemes -HKCU,"Control Panel\Current","Color Schemes",0x00020000,"ReactOS Standard" -HKCU,"Control Panel\Appearance","Current",0x00020000,"ReactOS Standard" -HKCU,"Control Panel\Appearance","NewCurrent",0x00020000,"ReactOS Standard" -HKCU,"Control Panel\Appearance\New Schemes","SelectedSize",0x00020000,"0" -HKCU,"Control Panel\Appearance\New Schemes","SelectedStyle",0x00020000,"0" -; ReactOS Standard -HKCU,"Control Panel\Appearance\New Schemes\0","DisplayName",0x00020000,"@themeui.dll,-883" -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #0",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #1",0x00010001,0x00a56e3a -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #2",0x00010001,0x006a240a -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #4",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #5",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #6",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #10",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #11",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #12",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #13",0x00010001,0x006a240a -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #15",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #16",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #17",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #19",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #20",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #21",0x00010001,0x00404040 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #22",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #24",0x00010001,0x00e1ffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #25",0x00010001,0x00b5b5b5 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #26",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #27",0x00010001,0x00f0caa6 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #28",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #29",0x00010001,0x006a240a -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #30",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","LegacyName",0x00020000,"ReactOS Standard" -; Brick -HKCU,"Control Panel\Appearance\New Schemes\1","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #0",0x00010001,0x02d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #1",0x00010001,0x00000042 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #2",0x00010001,0x00000080 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #3",0x00010001,0x0061898d -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #4",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #5",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #9",0x00010001,0x00d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #10",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #11",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #12",0x00010001,0x00d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #13",0x00010001,0x0061898d -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #15",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #16",0x00010001,0x0261898d -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #17",0x00010001,0x0261898d -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #19",0x00010001,0x00d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #20",0x00010001,0x02d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #22",0x00010001,0x02a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #23",0x00010001,0x00000080 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #24",0x00010001,0x00d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #26",0x00010001,0x02000080 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #27",0x00010001,0x004074b0 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #28",0x00010001,0x0070b8c8 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #29",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #30",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","LegacyName",0x00020000,"Brick" -; Eggplant -HKCU,"Control Panel\Appearance\New Schemes\2","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #0",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #1",0x00010001,0x00400040 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #2",0x00010001,0x00788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #3",0x00010001,0x00a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #4",0x00010001,0x00a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #10",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #11",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #13",0x00010001,0x00788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #15",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #16",0x00010001,0x02788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #17",0x00010001,0x02788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #19",0x00010001,0x00788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #20",0x00010001,0x02d8d8c8 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #22",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #23",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #26",0x00010001,0x02788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #27",0x00010001,0x00834b83 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #28",0x00010001,0x00d2bdcb -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #29",0x00010001,0x00788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #30",0x00010001,0x00a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","LegacyName",0x00020000,"Eggplant" -; Green Olive -HKCU,"Control Panel\Appearance\New Schemes\3","DisplayName",0x00020000,"@themeui.dll,-877" -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #0",0x00010001,0x02d3e3d0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #1",0x00010001,0x00213f21 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #2",0x00010001,0x00649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #4",0x00010001,0x00a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #10",0x00010001,0x02a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #11",0x00010001,0x02a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #12",0x00010001,0x02d3e3d0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #13",0x00010001,0x00649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #15",0x00010001,0x02a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #16",0x00010001,0x02649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #17",0x00010001,0x02649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #19",0x00010001,0x00d3e3d0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #20",0x00010001,0x02d3e3d0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #22",0x00010001,0x02a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #26",0x00010001,0x02649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #27",0x00010001,0x00e8c898 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #28",0x00010001,0x00b0cca8 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #29",0x00010001,0x00649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #30",0x00010001,0x00a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","LegacyName",0x00020000,"Green Olive" -; High Contrast 1 -HKCU,"Control Panel\Appearance\New Schemes\4","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #0",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #2",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #3",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #4",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #5",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #6",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #7",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #8",0x00010001,0x0000ffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #10",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #11",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #12",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #13",0x00010001,0x00008000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #15",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #17",0x00010001,0x0200ff00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #18",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #19",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #20",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #21",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #22",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #23",0x00010001,0x0000ffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #24",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #26",0x00010001,0x02800080 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #27",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #28",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #29",0x00010001,0x00008000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #30",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","LegacyName",0x00020000,"High Contrast 1" -; High Contrast 2 -HKCU,"Control Panel\Appearance\New Schemes\5","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #0",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #2",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #3",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #4",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #5",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #6",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #7",0x00010001,0x0000ff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #8",0x00010001,0x0000ff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #9",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #10",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #11",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #12",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #13",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #15",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #17",0x00010001,0x0200ff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #18",0x00010001,0x0000ff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #20",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #21",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #22",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #24",0x00010001,0x0000ffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #26",0x00010001,0x02800080 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #27",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #28",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #29",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #30",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","LegacyName",0x00020000,"High Contrast 2" -; High Contrast Black -HKCU,"Control Panel\Appearance\New Schemes\6","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #0",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #2",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #3",0x00010001,0x00008000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #4",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #5",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #6",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #7",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #8",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #10",0x00010001,0x0200ffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #11",0x00010001,0x02008000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #12",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #13",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #15",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #17",0x00010001,0x0200ff00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #18",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #20",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #21",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #22",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #23",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #24",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #26",0x00010001,0x02800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #27",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #28",0x00010001,0x00008000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #29",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #30",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","LegacyName",0x00020000,"High Contrast Black" -; High Contrast White -HKCU,"Control Panel\Appearance\New Schemes\7","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #0",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #1",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #2",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #3",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #4",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #10",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #11",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #13",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #15",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #17",0x00010001,0x0200ff00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #19",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #20",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #22",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #26",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #27",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #28",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #29",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #30",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","LegacyName",0x00020000,"High Contrast White" -; Lilac -HKCU,"Control Panel\Appearance\New Schemes\8","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #0",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #2",0x00010001,0x00b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #4",0x00010001,0x00d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #10",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #11",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #12",0x00010001,0x02b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #13",0x00010001,0x00b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #15",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #16",0x00010001,0x02b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #17",0x00010001,0x02b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #20",0x00010001,0x02ecd5d8 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #22",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #26",0x00010001,0x02b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #27",0x00010001,0x00cb8fb6 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #28",0x00010001,0x00d0b4b8 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #29",0x00010001,0x00b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #30",0x00010001,0x00d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","LegacyName",0x00020000,"Lilac" -; Maple -HKCU,"Control Panel\Appearance\New Schemes\9","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #0",0x00010001,0x02d7ecf2 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #2",0x00010001,0x00000080 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #3",0x00010001,0x0046a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #4",0x00010001,0x00aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #10",0x00010001,0x02aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #11",0x00010001,0x02aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #12",0x00010001,0x0246a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #13",0x00010001,0x0046a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #14",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #15",0x00010001,0x02aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #16",0x00010001,0x0246a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #17",0x00010001,0x0246a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #19",0x00010001,0x00d7ecf2 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #20",0x00010001,0x02d7ecf2 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #22",0x00010001,0x02aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #25",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #26",0x00010001,0x0246a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #27",0x00010001,0x00389cc0 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #28",0x00010001,0x0088c8e0 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #29",0x00010001,0x0046a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #30",0x00010001,0x00aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","LegacyName",0x00020000,"Maple" -; Marine -HKCU,"Control Panel\Appearance\New Schemes\10","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #0",0x00010001,0x02d8e0c8 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #1",0x00010001,0x00474e2c -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #2",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #3",0x00010001,0x00889048 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #4",0x00010001,0x00b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #5",0x00010001,0x02d8e0c8 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #10",0x00010001,0x02b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #11",0x00010001,0x02b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #12",0x00010001,0x00848d4b -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #13",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #15",0x00010001,0x02b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #16",0x00010001,0x02889048 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #17",0x00010001,0x02889048 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #19",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #20",0x00010001,0x02d8e0c8 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #22",0x00010001,0x02b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #24",0x00010001,0x00d8e0c8 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #26",0x00010001,0x02800000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #27",0x00010001,0x00c0b418 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #28",0x00010001,0x00d8cc78 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #29",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #30",0x00010001,0x00b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","LegacyName",0x00020000,"Marine" -; Plum -HKCU,"Control Panel\Appearance\New Schemes\11","DisplayName",0x00020000,"@themeui.dll,-869" -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #0",0x00010001,0x00c8d0d8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #1",0x00010001,0x00402840 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #2",0x00010001,0x00604048 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #3",0x00010001,0x00586078 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #4",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #5",0x00010001,0x00c8d0d8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #6",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #10",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #11",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #12",0x00010001,0x005a6374 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #13",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #14",0x00010001,0x00c8d0d8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #15",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #16",0x00010001,0x00586078 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #17",0x00010001,0x00586078 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #19",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #20",0x00010001,0x00c8d0d8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #21",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #22",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #23",0x00010001,0x00580030 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #24",0x00010001,0x00c8ccd5 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #26",0x00010001,0x00604048 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #27",0x00010001,0x00b884a0 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #28",0x00010001,0x007898a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #29",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #30",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","LegacyName",0x00020000,"Plum" -; Pumpkin -HKCU,"Control Panel\Appearance\New Schemes\12","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #0",0x00010001,0x02cfeaf5 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #1",0x00010001,0x00420042 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #2",0x00010001,0x002fa5d7 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #3",0x00010001,0x00a4a0a0 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #4",0x00010001,0x009dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #10",0x00010001,0x029dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #11",0x00010001,0x029dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #12",0x00010001,0x02cfeaf5 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #13",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #15",0x00010001,0x029dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #16",0x00010001,0x022fa5d7 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #17",0x00010001,0x022fa5d7 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #19",0x00010001,0x00cfeaf5 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #20",0x00010001,0x02cfeaf5 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #22",0x00010001,0x029dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #23",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #26",0x00010001,0x022fa5d7 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #27",0x00010001,0x0088cce0 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #28",0x00010001,0x0090ccd0 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #29",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #30",0x00010001,0x009dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","LegacyName",0x00020000,"Pumpkin" -; Rainy Day -HKCU,"Control Panel\Appearance\New Schemes\13","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #0",0x00010001,0x02d9ccc1 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #2",0x00010001,0x007d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #4",0x00010001,0x00b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #10",0x00010001,0x02b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #11",0x00010001,0x02b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #13",0x00010001,0x007d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #15",0x00010001,0x02b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #16",0x00010001,0x027d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #17",0x00010001,0x027d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #19",0x00010001,0x00d9ccc1 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #20",0x00010001,0x02d9ccc1 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #22",0x00010001,0x02b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #26",0x00010001,0x027d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #27",0x00010001,0x00d0b480 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #28",0x00010001,0x00d0bcb0 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #29",0x00010001,0x007d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #30",0x00010001,0x00b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","LegacyName",0x00020000,"Rainy Day" -; ReactOS Classic -HKCU,"Control Panel\Appearance\New Schemes\14","DisplayName",0x00020000,"@themeui.dll,-880" -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #0",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #1",0x00010001,0x00a56e3a -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #2",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #4",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #5",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #6",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #10",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #11",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #12",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #13",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #15",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #16",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #17",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #19",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #20",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #21",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #22",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #24",0x00010001,0x00e1ffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #26",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #27",0x00010001,0x00d08410 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #28",0x00010001,0x00b5b5b5 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #29",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #30",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","LegacyName",0x00020000,"ReactOS Classic" -; Rose -HKCU,"Control Panel\Appearance\New Schemes\15","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #0",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #1",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #2",0x00010001,0x0070609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #3",0x00010001,0x00a4a0a0 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #4",0x00010001,0x00b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #10",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #11",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #12",0x00010001,0x0270609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #13",0x00010001,0x0070609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #15",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #16",0x00010001,0x0270609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #17",0x00010001,0x0270609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #19",0x00010001,0x007d7d7d -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #20",0x00010001,0x02dcd8e7 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #22",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #26",0x00010001,0x0270609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #27",0x00010001,0x00d0ccd8 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #28",0x00010001,0x00d0d4d0 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #29",0x00010001,0x0070609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #30",0x00010001,0x00b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","LegacyName",0x00020000,"Rose" -; Sand -HKCU,"Control Panel\Appearance\New Schemes\16","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #0",0x00010001,0x02dde6ea -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #1",0x00010001,0x02688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #2",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #3",0x00010001,0x00688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #4",0x00010001,0x00bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #10",0x00010001,0x02bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #11",0x00010001,0x02bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #12",0x00010001,0x02688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #13",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #15",0x00010001,0x02bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #16",0x00010001,0x02688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #17",0x00010001,0x02688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #20",0x00010001,0x02dde6ea -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #22",0x00010001,0x02bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #26",0x00010001,0x02808000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #27",0x00010001,0x00aabd84 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #28",0x00010001,0x0080d0e8 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #29",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #30",0x00010001,0x00bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","LegacyName",0x00020000,"Sand" -; Sky (WinXP-like) -HKCU,"Control Panel\Appearance\New Schemes\17","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #0",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #1",0x00010001,0x00984e00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #2",0x00010001,0x00e35400 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #3",0x00010001,0x00df967a -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #4",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #5",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #6",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #10",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #11",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #12",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #13",0x00010001,0x00c56a31 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #15",0x00010001,0x00d8e9ec -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #16",0x00010001,0x0099a8ac -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #17",0x00010001,0x0099a8ac -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #19",0x00010001,0x00f8e4d8 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #20",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #21",0x00010001,0x00646f71 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #22",0x00010001,0x00e2eff1 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #24",0x00010001,0x00e1ffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #25",0x00010001,0x00b5b5b5 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #26",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #27",0x00010001,0x00ff953d -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #28",0x00010001,0x00ebb99d -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #29",0x00010001,0x00c56a31 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #30",0x00010001,0x00d8e9ec -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","LegacyName",0x00020000,"Sky" -; Slate -HKCU,"Control Panel\Appearance\New Schemes\18","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #0",0x00010001,0x02e3dcce -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #1",0x00010001,0x00414141 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #2",0x00010001,0x00978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #4",0x00010001,0x00c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #10",0x00010001,0x02c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #11",0x00010001,0x02c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #12",0x00010001,0x00424242 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #13",0x00010001,0x00978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #15",0x00010001,0x02c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #16",0x00010001,0x02978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #17",0x00010001,0x02978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #19",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #20",0x00010001,0x02e3dcce -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #22",0x00010001,0x02c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #26",0x00010001,0x02978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #27",0x00010001,0x00d8b888 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #28",0x00010001,0x00c8bca0 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #29",0x00010001,0x00978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #30",0x00010001,0x00c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","LegacyName",0x00020000,"Slate" -; Storm -HKCU,"Control Panel\Appearance\New Schemes\19","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #0",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #2",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #4",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #10",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #11",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #13",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #15",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #17",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #19",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #20",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #22",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #23",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #26",0x00010001,0x02800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #27",0x00010001,0x00b08c38 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #28",0x00010001,0x00a8aca8 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #29",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #30",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","LegacyName",0x00020000,"Storm" -; Teal -HKCU,"Control Panel\Appearance\New Schemes\20","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #0",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #1",0x00010001,0x00404000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #2",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #4",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #10",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #11",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #13",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #15",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #17",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #19",0x00010001,0x00f0fbff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #20",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #22",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #26",0x00010001,0x02808000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #27",0x00010001,0x00d8cc00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #28",0x00010001,0x00b8c898 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #29",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #30",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","LegacyName",0x00020000,"Teal" -; Wheat -HKCU,"Control Panel\Appearance\New Schemes\21","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #0",0x00010001,0x02d0eeee -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #1",0x00010001,0x021d4000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #2",0x00010001,0x00008080 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #3",0x00010001,0x0041bcbc -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #4",0x00010001,0x00a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #10",0x00010001,0x02a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #11",0x00010001,0x02a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #12",0x00010001,0x0241bcbc -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #13",0x00010001,0x00008080 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #15",0x00010001,0x02a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #16",0x00010001,0x0241bcbc -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #17",0x00010001,0x0241bcbc -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #20",0x00010001,0x02d0eeee -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #22",0x00010001,0x02a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #25",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #26",0x00010001,0x02008080 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #27",0x00010001,0x0048b0c8 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #28",0x00010001,0x0080b8b8 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #29",0x00010001,0x00008080 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #30",0x00010001,0x00a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","LegacyName",0x00020000,"Wheat" - -HKCU,"Control Panel\Sound","Beep",2,"yes" -HKCU,"Control Panel\Sound","ExtendedSounds",2,"yes" - -HKCU,"Environment",,0x00000012 -HKCU,"Environment","TEMP",0x00020000,"%USERPROFILE%\Local Settings\Temp" -HKCU,"Environment","TMP",0x00020000,"%USERPROFILE%\Local Settings\Temp" - -HKCU,"SOFTWARE",,0x00000012 -HKCU,"SOFTWARE\Policies",,0x00000012 -HKCU,"SOFTWARE\Microsoft",,0x00000012 - -; DirectX version report as DirectX 9.0 -HKCU,"SOFTWARE\Microsoft\DirectX","Debug",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\DirectX","InstalledVersion",0x00000001,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00 -HKCU,"SOFTWARE\Microsoft\DirectX","InstallMDX",0x00010001,0x00000001 -HKCU,"SOFTWARE\Microsoft\DirectX","RC",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\DirectX","Version",0x00000000,"5.03.2600.2180" - -; Open With settings -HKCU,"SOFTWARE\Classes",,0x00000012 -HKCU,"SOFTWARE\Classes\Applications",,0x00000012 - -; Current user shell folder settings -HKCU,"SOFTWARE\Microsoft\Windows",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\ClassicStartMenu",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\ClassicStartMenu","{208D2C60-3AEA-1069-A2D7-08002B30309D}",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",,0x00000012 - -; default shell -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe" - -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",,0x00000012 -HKCU,"Software\Microsoft\Windows\CurrentVersion\Telephony",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",,0x00000012 - -HKCU,"SOFTWARE\Microsoft\Windows NT",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Devices",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Network",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\PrinterPorts",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Program Manager",,0x00000012 - -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","DebugOptions",2,"2048" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","device",2,"" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","Documents",2,"" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","DosPrint",2,"no" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","load",2,"" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","NetMessage",2,"no" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","NullPort",2,"None" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","Programs",2,"com exe bat pif cmd" - -; Application compatibility settings for Windows 95 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN95","MajorVersion",0x00010001,0x00000004 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN95","MinorVersion",0x00010001,0x0000000A -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN95","BuildNumber",0x00010001,0x000003B6 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN95","PlatformId",0x00010001,0x00000001 -; Application compatibility settings for Windows 98/ME -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN98","MajorVersion",0x00010001,0x00000004 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN98","MinorVersion",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN98","BuildNumber",0x00010001,0x000008AE -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN98","PlatformId",0x00010001,0x00000001 -; Application compatibility settings for Windows NT 4 Service Pack 5 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","MajorVersion",0x00010001,0x00000004 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","MinorVersion",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","BuildNumber",0x00010001,0x00000565 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","PlatformId",0x00010001,0x00000002 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMajorVersion",0x00010001,0x00000005 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMinorVersion",0x00010001,0x00000000 -; Application compatibility settings for Windows 2000 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","MajorVersion",0x00010001,0x00000005 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","MinorVersion",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","BuildNumber",0x00010001,0x00000893 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","PlatformId",0x00010001,0x00000002 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","SPMajorVersion",0x00010001,0x00000003 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","SPMinorVersion",0x00010001,0x00000000 -; Application compatibility settings for Windows XP -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","MajorVersion",0x00010001,0x00000005 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","MinorVersion",0x00010001,0x00000001 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","BuildNumber",0x00010001,0x00000A28 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","PlatformId",0x00010001,0x00000002 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMajorVersion",0x00010001,0x00000001 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMinorVersion",0x00010001,0x00000000 - -; DEBUG: Windows Messages SPY configuration -HKCU,"SOFTWARE\ReactOS\Debug","SpyInclude",0x00020000,"INCLUDEALL" -;HKCU,"SOFTWARE\ReactOS\Debug","SpyExclude",0x00020000,"" -;HKCU,"SOFTWARE\ReactOS\Debug","SpyExcludeDWP",0x00020000,"" - -; Internet Explorer - -HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" -;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" -HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\" - -; Sound Schemes -HKCU,"AppEvents",,0x00000012 -HKCU,"AppEvents\Schemes","",0x00000000,".Default" -HKCU,"AppEvents\Schemes\Apps",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default","",0x00000000,"ReactOS" -HKCU,"AppEvents\Schemes\Apps\.Default","DispFileName",0x00000000,"@mmsys.cpl,-5856" -HKCU,"AppEvents\Schemes\Apps\.Default\.Default",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\.Default\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\.Default\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Close",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\Close\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Close\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Maximize",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\Maximize\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Maximize\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Minimize",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\Minimize\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Minimize\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Open",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\Open\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Open\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon\.Current","",0x00020000,"%SystemRoot%\media\ReactOS_LogOn.wav" -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon\.Default","",0x00020000,"%SystemRoot%\media\ReactOS_LogOn.wav" -HKCU,"AppEvents\Schemes\Apps\Explorer","",0x00000002,"ReactOS Explorer" -HKCU,"AppEvents\Schemes\Apps\Explorer","DispFileName",0x00000000,"@mmsys.cpl,-5854" -HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Names",,0x00000012 -HKCU,"AppEvents\Schemes\Names\.Default","",0x00000002,"ReactOS Default" -HKCU,"AppEvents\Schemes\Names\.None","",0x00000002,"No sounds" - -HKCU,"AppEvents\EventLabels",,0x00000012 -HKCU,"AppEvents\EventLabels\.Default","",0x00000000,"Default Beep" -HKCU,"AppEvents\EventLabels\.Default","DispFileName",0x00000000,"@mmsys.cpl,-5824" -HKCU,"AppEvents\EventLabels\AppGPFault","",0x00000000,"Program error" -HKCU,"AppEvents\EventLabels\AppGPFault","DispFileName",0x00000000,"@mmsys.cpl,-5825" -HKCU,"AppEvents\EventLabels\Close","",0x00000000,"Close program" -HKCU,"AppEvents\EventLabels\Close","DispFileName",0x00000000,"@mmsys.cpl,-5826" -HKCU,"AppEvents\EventLabels\CriticalBatteryAlarm","",0x00000000,"Critical Battery Alarm" -HKCU,"AppEvents\EventLabels\CriticalBatteryAlarm","DispFileName",0x00000000,"@mmsys.cpl,-5827" -HKCU,"AppEvents\EventLabels\DeviceConnect","",0x00000000,"Device Connect" -HKCU,"AppEvents\EventLabels\DeviceConnect","DispFileName",0x00000000,"@mmsys.cpl,-5828" -HKCU,"AppEvents\EventLabels\DeviceDisconnect","",0x00000000,"Device Disconnect" -HKCU,"AppEvents\EventLabels\DeviceDisconnect","DispFileName",0x00000000,"@mmsys.cpl,-5829" -HKCU,"AppEvents\EventLabels\DeviceFail","",0x00000000,"Device Failed to Connect" -HKCU,"AppEvents\EventLabels\DeviceFail","DispFileName",0x00000000,"@mmsys.cpl,-5830" -HKCU,"AppEvents\EventLabels\EmptyRecycleBin","",0x00000000,"Empty Recycle Bin" -HKCU,"AppEvents\EventLabels\EmptyRecycleBin","DispFileName",0x00000000,"@mmsys.cpl,-5831" -HKCU,"AppEvents\EventLabels\LowBatteryAlarm","",0x00000000,"Low Battery Alarm" -HKCU,"AppEvents\EventLabels\LowBatteryAlarm","DispFileName",0x00000000,"@mmsys.cpl,-5832" -HKCU,"AppEvents\EventLabels\Maximize","",0x00000000,"Maximize" -HKCU,"AppEvents\EventLabels\Maximize","DispFileName",0x00000000,"@mmsys.cpl,-5833" -HKCU,"AppEvents\EventLabels\MenuCommand","",0x00000000,"Menu command" -HKCU,"AppEvents\EventLabels\MenuCommand","DispFileName",0x00000000,"@mmsys.cpl,-5834" -HKCU,"AppEvents\EventLabels\MenuPopup","",0x00000000,"Menu popup" -HKCU,"AppEvents\EventLabels\MenuPopup","DispFileName",0x00000000,"@mmsys.cpl,-5835" -HKCU,"AppEvents\EventLabels\Minimize","",0x00000000,"Minimize" -HKCU,"AppEvents\EventLabels\Minimize","DispFileName",0x00000000,"@mmsys.cpl,-5836" -HKCU,"AppEvents\EventLabels\MailBeep","",0x00000000,"New Mail Notification" -HKCU,"AppEvents\EventLabels\MailBeep","DispFileName",0x00000000,"@mmsys.cpl,-5837" -HKCU,"AppEvents\EventLabels\Navigating","",0x00000000,"Start Navigation" -HKCU,"AppEvents\EventLabels\Navigating","DispFileName",0x00000000,"@mmsys.cpl,-5838" -HKCU,"AppEvents\EventLabels\Open","",0x00000000,"Open program" -HKCU,"AppEvents\EventLabels\Open","DispFileName",0x00000000,"@mmsys.cpl,-5839" -HKCU,"AppEvents\EventLabels\PrintComplete","",0x00000000,"Print Complete" -HKCU,"AppEvents\EventLabels\PrintComplete","DispFileName",0x00000000,"@mmsys.cpl,-5840" -HKCU,"AppEvents\EventLabels\RestoreDown","",0x00000000,"Restore Down" -HKCU,"AppEvents\EventLabels\RestoreDown","DispFileName",0x00000000,"@mmsys.cpl,-5841" -HKCU,"AppEvents\EventLabels\RestoreUp","",0x00000000,"Restore Up" -HKCU,"AppEvents\EventLabels\RestoreUp","DispFileName",0x00000000,"@mmsys.cpl,-5842" -HKCU,"AppEvents\EventLabels\SystemAsterisk","",0x00000000,"Asterisk" -HKCU,"AppEvents\EventLabels\SystemAsterisk","DispFileName",0x00000000,"@mmsys.cpl,-5843" -HKCU,"AppEvents\EventLabels\SystemExclamation","",0x00000000,"Exclamation" -HKCU,"AppEvents\EventLabels\SystemExclamation","DispFileName",0x00000000,"@mmsys.cpl,-5845" -HKCU,"AppEvents\EventLabels\SystemExit","",0x00000000,"Exit ReactOS" -HKCU,"AppEvents\EventLabels\SystemExit","DispFileName",0x00000000,"@mmsys.cpl,-5846" -HKCU,"AppEvents\EventLabels\SystemHand","",0x00000000,"Critical Stop" -HKCU,"AppEvents\EventLabels\SystemHand","DispFileName",0x00000000,"@mmsys.cpl,-5847" -HKCU,"AppEvents\EventLabels\SystemNotification","",0x00000000,"System Notification" -HKCU,"AppEvents\EventLabels\SystemNotification","DispFileName",0x00000000,"@mmsys.cpl,-5848" -HKCU,"AppEvents\EventLabels\SystemQuestion","",0x00000000,"Question" -HKCU,"AppEvents\EventLabels\SystemQuestion","DispFileName",0x00000000,"@mmsys.cpl,-5849" -HKCU,"AppEvents\EventLabels\SystemStart","",0x00000000,"Start ReactOS" -HKCU,"AppEvents\EventLabels\SystemStart","DispFileName",0x00000000,"@mmsys.cpl,-5850" -HKCU,"AppEvents\EventLabels\WindowsLogoff","",0x00000000,"ReactOS Logoff" -HKCU,"AppEvents\EventLabels\WindowsLogoff","DispFileName",0x00000000,"@mmsys.cpl,-5852" -HKCU,"AppEvents\EventLabels\WindowsLogon","",0x00000000,"ReactOS Logon" -HKCU,"AppEvents\EventLabels\WindowsLogon","DispFileName",0x00000000,"@mmsys.cpl,-5853" - -; EOF From 2d25ad0d850d513361bdad84719bc2c77f14d743 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 22:17:34 +0000 Subject: [PATCH 252/261] - Convert hivedef_i386.inf to Unicode. - Add Strings-Sections for several languages and add TEMP_DIR string. Please translate the TEMP_DIR string as this is the sollution for bug #2482. svn path=/trunk/; revision=47079 --- reactos/boot/bootdata/hivedef_i386.inf | Bin 0 -> 314598 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reactos/boot/bootdata/hivedef_i386.inf diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf new file mode 100644 index 0000000000000000000000000000000000000000..33d3a0a09fd5f587ec5563f5779360935f8abce7 GIT binary patch literal 314598 zcmeHw{cqezk|lpW;Qj|eI}OYNZnspDY-t(`j6b`5({}e-_VnD27Xy9S)>{5J$!@pj zaR2(-xzyJI9;;+R?ab8>$r^Wl?UGbmA ze=q)9v5&uA;je?@WAO?9Jt_XJSTFuiJjHJZ#Sz~98K3z>`B{Gc@5PzD8G=zQcbM_N$~`)ZyQH6$KAluh-zJUMB3(K!6UzgZO)1>WeeJIZVWmmZQb4OVaNLwEoSe% z23}fu9L7&*>lymysARzjtT6VNKLXtau(8j-6nDX|mw1qa{g&84Yb3mS1e_P;F+UcM zai-%23#z=@6dm&?9OnQ>GCY3N!mQ!Pe1g`$Ee=bhKf?-P+gx!^!jTR7hS9Y;L{L*5h*V4u?nysPqU7(+ITz2X)g8^tajGPYFD#@_9>&25pz ze}ygH!6NUA&jN050`(R!Z;Np|tk1yAL*PC^i#Ix$BC|*PaW^}TyIUgPy|lYzgtnh! z(Q%F~c-8o?Z@BhI6f`EC^pd&p5^Lo*zP#TCeAPh|4zrTZ6Dl53&!BT)o~8? z!EQOiu5O>(9ml7AI0_bc?2Kx~ZpT?{Pcxdxd}lkG_BzhN(R>?h;;YmTwVj1AB^+^Y z!Ak6rtB-3U3?JXLg5!Z+bVT(ci`MjpRwY}4zTw1?CzjKzoSxAHWL7r42ZDG1(<^SGG?Rj&;nVOh#>H zBOL4Ue(kdMi!ztwEP!K%bC+{ig?TsIzmA#A8UB8SclftCyYaqrAz-dcd}|GaYvp|7 zHTufV-VDC3Z`>{0!yI(2_+$C|IgWl({A)yuHu=T*?gcVxTA1?K zS@eCp(&A>`XzguAVmynFLHM-9Y1&}$F+Rp*q!is<*zVKiXnh8j)LD=Mk?Xy?=*O49 zN55h{<_GjIeXaE_se5;hvCUcar;_ugSB)QO_ba#HU*d5*bmqtCgWpTGa8A8nj=U2@ z0q5VCCryvTGWHoP)Q@Sa9AhzY?Zc;<8K)UV$Co~S%2=~svVn8meT)keZH%XDXGBas zbf0^_cm_njV}w4yxMe25)l0{TxR$pTZ(53!c06?^xsD-&6>=Y%e<&-gzg}# zjA;ow27WFhp^1uZUMVII+Rka;<5>I^{=u$I84qp8Ufd|hbG^cYt1)x?MrJ`~&8eQx zn;vM-HHR?H`CfBG_xH0hzvP_3@XW0`n;gfkw-05RJA*mnKD^5Td^@eosQeOtagF+8 zxsv=5ugt~x*{KjXMD-XGI^WPy?T+8H@#`}0xF|jR8N97Ocdy%;D><=x*FUpApRb>J zxHs`zeINb!>2gi;Udd|a_A-lKC2#f5zmGLr^31)@b!f}4X*urBY2payAt}#8+}53-HMt0_?F!VSGY#{u*@*eO3v7NZqMTsF33<-HuA`#_MB5n2^Fi?gxJ;8FXCml{Fcz4Ke34m2BscV(_>+PK-xn9&}dn!?cgyh|H}1 z9Gh=FhnJ-<_yteDwtZ1n92i&GQevRJt7pH_p%#%_nLYg(2>6p&+9OR28~bOn+;Se@ z&H=~gd#*jyV!oWPRsNZ#Y}I4*5XXV73o)MimFTOi-L&NezrrJ(l*g}*ho8zQ!g;70 ze=+6*?Pt3O3>@*X&&EFDnm%)aW>k*JLPkE$XwK1Z&SHN=2FdvBG!0kxBrj@n88U=p zpX)2eYU^MN72n36)#nFxraE+Wxz3ki2>e;mTo|}s!0NuqL)z^?rQwu4QO6Ln#MCGl z>*`3_tuby~OIYFK2w8-Bx+(j``qg$jOx+*$?4j0AeST_msIjA$YPZ0&)@L+h9HY|l z5quRrBXwi$S{macs3rE1tl=Hz&CHscYRMO6UD2&g^mDR4F6{h)p4;WUZhmqDnZ*wN z#|)$X)6W!d6fa5!H{X}Ma|o*t0qxNDd9JO5KC^?o-2V3#@=5pmZsm8j#T?-lSW!n_ z{Z{BKdfp#n^J!aA_hzwKY)4T{{u+B+&7ynY6FKD=7q)KKXRgNID)QyxZxwmiV*adf zj!#a@UmFoKf9Zd#EXe$g!|v(%%WE%KaXP^YpUF>BXAx<=a5Zu)7mKUN9I$f zmc`9^VjL!qw`VFQ8{{S{Hhs4&OdfCZv0Uxu{M1Y~H7H)?5QoFY8e^=Qio~+}w4+TxCeBJ_3HL>97{9 zBd%jLxaURuS6KEO9Qah$Ff0@5Ic60z)eKep&WYJ*+po$Fu34pFhsC`-?68QJi5=$p zgR8P5o$s)?mxmn|@lbYfSEDq(@qUJF2*shaJ|^!`X3|j2+hBEgL&5?&V>JMLe7xMl;ilEcDWL zjm~N_-4zN{gswq#&HcxQuhz96k8y^6%&sNbRkPu%bK&E!7e=#B{Qh+fcAbv4SO*Sj zgt_D4(0J8#_S4Gs3)~HuZ8o|sj_=rK;#EoKP!VuRhU((E zqT6l7`&iH8C!GDJILAD8`>FU3w1m1m*P8fj;QBhRF&=xRT7Ta>!I@rx=Z1Z*P4Rok zUPUnNIokRsc3UoxNpYV``Wx#J?qGdA?ijs*ui>7c)wBFE!CBljT6G`y9OIgPh`W?g zyZZ5R6w@!o^hFn6+1K<%e~5mrrZ4(#f^+aHQ(m{r$mKY4^YTpJx7>N4UF+L7elHLq zc^%oSvSvbMjyu}}T#@lSdfRxljNPZx#6rg3xO`yLXPcUR#k)B0aRZEeeEC@W`py@` zF+O7BG1n%sGSx)%xcCm||L*e4@z4DXN^)MQNaYo;t#thx-|kHh{ikTQe1U5oPcEb8 zdU@{)d)*3K+C+m-?)d{xQx*q&)_9D&T!^CR)1!8afNFj%hnu=<|01pRd}v`g^DqJbn|cMG`uD^~iJo9!5Ji z5^JUQ^K$?CkZrA>mF`F4yqEQD?j7gPjQ67A$oSjpy`VTs)=M?iTll!|um?M@#iGwW zLBzAysSb-o4#N;s=3Kne_Ox=HDG?it%uSdLuHot8@Y>h+c;6j6f8Y*ZYvs-z%pTXu ztcLAd!~5s>$!qo8Rc&iH-g|u7=*^7UY7O7xwbT5z*(YnQTo-y-zViXUe?shI4$S$= zDY7Mg&Rm1XZ}MEsIe1o^iBH?Bet*+)L!*`RnQfzK=%{x`>mCtT`|kpI16$bcsd%j; zcYUa0Fuu-R!B;7IlT>q~7%v~TND*tHRXhTQa!44HXTD2AC_@*!T^HzB-?$Bg^ zH}AM(PU}@{^`Yri$Vkp(?ERR&E9Z~AhTQDGM_kj435#i*PcdGCD}CH)faCn-rT;Ly zXft2sXZRmxlXj>&;mRNHvo@^HUXU2RO( zJ&5rgb9fNmk%?p8&&>Kfi18GDy|?-;=Mk*mG~P3{2eB2ZHV?vmeYnSuzYErMzQdxq zs_$Usi}yNVreeo2_YgDdn<@k8&sGuls%eW!^wbYzJSF!@8eEP{Kba3<390e28fx&Jt;$!nMQ zh?;KnTO2V*zdyTJ!x-m2b@T{k)N_roI^*C>hWPOp@)6demw5w^v4%Bye%c(nefIPc|NVk*e8MX|5szZ7jp6)cDr1Z4e)W7%BK&NTtEOXc(^r}bkd zk1@3(uC18;!FX42-o=~#+ITXX>2L+d+~>~h;cDJz<YQUc@F*a zoOYj7^*7EFaGqm6ufcPeyPCG;IOg7HYq)PubroUCRacAUs{X;`5@sEQF`qu|40#0e z6t0V!Sq$&iVloKp0a#i74e#37j`fh!j(pqN*x=%a%Ls9tl<@zDNB^&v3%x*$s zb?b6Pw;in=$-V{dHr870C(SC68~G+j>dqNV-Jf-5GgGhD8m?0F=QuF2-c-8Xk-4j= zt;Ik0$RP<|oXa?Nt1kU7@WSz^}vC>j!BNQ7`z}(+8x*^#U_g zVyfSl*YqFt7W9JVzKWcqRrg?YwV1jshw25}`fn&I-pRVDa&E`P5%Cmls_ImH1`f$% zhv0WLODdHwkYAeJnyae>A-n$ha`laoiM7F-=nvNCZWQ0bEAC=_b^N#q*`2sweC_=U z{BCQnaofQj+Z?P!AKC-$EiwDUf#a9Kq?i;O3rPW4C*3 zrEf)AMw_ZsN=6UaWvr{8vyV1RUv)+^>!fG!HP-WG9huSHK6mJUSDn#jRXsC0XB}Pf zZ`i0xn{}Ag;>_sG=w)U!ue7zR*v-|BwzZiftco2YH{sm}=O2M}y#8Fa4etT2SH6X{ zr!A~arpD{fRNC;~0?q|&yP*KDpNF>L-33znOl@C3%V@)^iNAgfX~WAaZR{hpeR&7F z>b#^4FJriUq{hp;wJ#H1-h*tJ@S1%fTn^O62g_Z)rsf0j^;=kzhv2Rr%Z6AI@ zYkF2l;+&?qyovmvpB1`Bo+Q@k8hMgvr;Epuc&7{TvPC>oNAHW#nt06W|8n_?g(&86 zhGd_qBgg_XwtgGyVud8;**u=F>1`~Dc_-kGjeF@4OJd$3)+g*UJz{Chv&=}3SQ7JI zg1@{@>HsT2=@Cm}-cgB|s5Oi{$vjU}e#~8$mcbuWWk!9i-My}RCT+)D8gKj))=*yo zEBD!wC@cHaphj0o-RND|fP2ZjnQ&~{-3#I>D|g|$dF1JQ%I39Eh=y9CSs@z6?DTZL zr?I1SKCOnmyF+vTmtmEutUhAjX;1~u?@u104rn#c{)%H}wBg0_{=ClWBZ-gpXXo=X zI_v4;j-FL#w7+_j86B5j^B-;18SSs`Wk%1>!MJB!bw>NEznRf-`8EI1R*}(l#ihU6 z(Nz2_pbTALt#AX+%>*lBb-eyuwu#q{N>&qx-6?F?)yAQDN*%91Q|ZDxt#(F+*Uv-S z@bc>6U0i=o-SGS?8+H5oSw~-;2 z674i)KbyGIcb|T0x?8_!uRPH(@0Te=(`TC+6`~qw+U(%Twok`wGY4JA z-3#OH89KEhba8DIp`n&&R)mHzJN=x$f@J3>SrIx+k4n4oO1tzwuXEi`!f3yWmKm*q zm18ihI-~s+==m9)6`^DJ+x+gTGumIR$&7AtWVzm1bw>NEd7076#os2{RcExn+M5~O zNgC#Jl*q1J1OHP#GVF)C)Q0Qja%DwU9XN zBQ;(<`WP7>B#O{^6wNZc9AEtvZ%rOeq6pO%ll!9_tKxI)G%aO?B+hAy%bFCSQX5NR zovx85iFUeJ(I4*?P>t%zFC~glr$Ew>QOFdbnrtjpgz}26sTD{vU!h46Dn%@bd78YN zOcBZ`%?Dpo=f*NcsHSXlA-W1;9!02>$IBM;7|;4Ldh&Ox)PwRhJ&z@`JSv+H;gOH< zGd*I-JWo^1lPW?}uViXegoZrDP(`S({&c#~AFxO02_EmTU+B-cW7TQ#8~&P(&FauF=By6Afh$Ljzv?;j9p#xL$5OY>?@#i6 zq3pfP=$I_7j)t_1_Gjj1M$4FY1GTlC^5;wMXVVg6v;kQi+O+4GcgFO^nDe^tre(BW ztspKwGNa=~;i~_d{`Xa9w6EL9jHU&q=iPK?S#?JH)y~Z5>9{t}kynw?bv2+wJ9CT` zcHWG7uc`6+GnJ+qa09c{ZS2o*8}pXEe(I-k&5 zU7ZhpmeGdy0Cwdr90!x`7b?T+$B-u8xzwRDypr0Xje~qmJ>DdhLrr)kbwf>fB~`h&`Ia(wmGlBu=S;~}K#P)&&Yqa63A)09O>;+&?qtVtaz9eI*ir)%U%qMa^Q^v65y z2&X5%)T9oT@>mk{G~ZNqQSgW_jG%^au|s%F`p3#5_%`kg7vd`(usj(2#E%st#?} zfI5xnk5GlaDqce&$~C;ICDtZgsWoea@wK8;?Nu;;XkW#V8J&uWvCg~djP}=oGoxcME7fsU zk*t{%ywrnf;DeuKwBfb3 z)qvNJAx*qW5qE@ZO*Yt=b^Eyr5O{Nvqg;*N%Eb8>E zki)Mi1`?k_7vES=+7W~AqFf6UXB(aY{FPy1SCq_(k4D{2|R z*EEQ$3dz1)vx+ta-l1C2ZY`)xGrE|tUyN^FKF#RPwb6`*TB2Dq8pfP8qggX*m4@`y zaetpKK1mqu&&O;m%9_#G{T!Dy;iFyWTDOGJ{u=fCjLw?TxL$JA8SSsN^eVNhob1?21SDn%RdT?fRTz<`ev{htuT@%)?sF_Rc5z71Pc>TF-I?bI7uRl|1 z;+?BnAj9kDp&`81_szeuQRjo7Wwhb7SoxY7uOCC2cy*08iHgS7nE9I8zLI((c|fch z_#mk!YQn2WKO^&J9AEvlIm=)TjF4+aiB<>VAyH0)myl^jt&h-QV@ag5Jl0|3Ws7y1 zG^0}Q)*tUoK4H0>IzCJG7d2i@4`NBo(=_rlX+~u{mhCU9%f|gNZ!Yb#)W(vzof&)P zXKG&|+h3GeEi=+1?vHtMX-1{2kj(I`GH_bWs1$L3%yWz&JJPd4GRw2^P6uLX%rl-M zy^S?#M!R^dQ8OCC8&fmNXvuN-J$4uE(w5%Ez3C6I!`zz*N3HRA%cmW^b#1hxp_XXY zj)pO3?P%7HhP8T(kYoNkUG^ejv|n$t@jh!u$MxzMMvVLJb*_0!812v7=Vx@*j*j(- z^%1b@jP}=cGNa@2YyP9HI-~tsS7!A59E^L$RcExnE}R)1mtXTAZ50_^*WUFjYv$6j zh4TJ7UVko|PJ1WA>(5l0c-@{2(^h6=c>O%I4KK&3ttQRCvQg)QpJjybT3?+SuOCC2 zcy*08NoCPiZuy$pzC-GY8t_W1iq^)d?JKP*YQf9#)u$bG>M9M4kZ4B@Vl6&c(|)6} zC@0g7TKj5<%bM;@FSYTq#X3#eQK^ml*D-*yH^%Z=U@| zWj5BN9hD;PpV{f+vFzUTHgD6A3CXpiT4r~PqCe)%r5%;>STe)YlnKf1O|J{FWR|CC zRYkVns3se0(vEhGJdN7X5Z;*DQKt!&X-I#?J?u}5kHyJ^8LP>imrp}_``TzoLoLy) zAq`{B8q%yGt*e?C(__6e-OOFWXus}eGw!S*jn~7mm?AsQb*_C&812vB=Vx@*kjC_n zH;@(4N5(zou%o5*(SGedGkRF>$^7P=$6R$r`|6I&=sDRp#kp3U(f;~yX7m&+oAa2f z$mqHTPf~51r>+#r`|Ei9xon#TPZM5$rqaY~y@+|8KMSqf*Uv-S@M^NJpJiyr>&K8L z-nlBzvhgOVFjg6yn!o*;nkw2UH8nE(N~?<&b!z+S(bLH6%kkB(r(reJK2uv*rXih2 z0VK6?f0Uc+Uf)v0k~n9_9ADG3V%Z|yra(`lE7ob!kV<*nAMfVUkV+BvM?8brj=uCG zPZIMiS`EHJlZI5r3YmsfmyIPcPg9hZX-IY1c-dl}CJm`{NKQ3K_zN-8=Wr4Gb3;LbfUZ0Mkg9-iDsQ> z7<1N%W}WDCT9YaL;EQ4({`Q|x$*URisrc3!@Yxc@tpF??@*Rh$Lr5!+jMqzT=I4Pc}g9xKT~Pq-6#$V?j&{sUBy9i zynY_qhSw^p_?p_jewNXOR}+8z7}CT$mv%-r-t<%vWqA8_Gga@9p1+a`Vij@f@g}Js z&Qpz(@qy#3Uni=`L&$WZx)AqAxrM4IC);aOQ(V@x*Qj*lNn)KY9!sK~E>`r%J8dJc zKjO`$6P5CK*a0SOPE^Kg9QvTb$Qw^3g?!1HL*I*SaipJlY+rG}Xm?-K=h{TR~3 zJC_zzW?xCA&@njucC(@Bi>wEP-z5_#5_%NB$*ae7vklc z*GXcYChw+63o09Vvir_!$~Glh&;{nr?%wmM^Z5m`vi|&7Q_PcTLANm9--D%T>-0A6 zk9oXj!7k8pl|lnzNzBv43Yiu(y+78d1r2%Qp;}O<`>bn0&#_nCJMenCacF1x%cln= z^7h^Q?!#&qrH=NX_)BXsgNTy5iDb z`QY4=53YP{6u;xSxK!7%sxjrhGT~Wm9kD;JZ6e-)8s&Dm|0b(3DOSYli2Yeh8)B+M z?IS&6KPPQR%o+@Bt$`JO#?gkD`-iY%#9B;x8~gF3iCEjnlhhI|hxwY`#{K%4DqanU zCAGvV=JYm})Dq{Z;&TMGS19WKn4haxTH3~*E^i^zjcUUzi+qeA$A}|`3Ot5PJE|*M zYuZUvJ_aT6PaB^l5s=x1p1f!inQ*_a(}uY}3cA|3j!eT;-|d`B6SfElJ0q zR7q-7OFCwMn)Vfy+qpjua!+4PvlC5vQn{Tavp{pLpqAAPiKbMa-;l*YH&01FOOfeH z>6f`<=cbAkf(20Y#cu90O22W0IIm$Py4k`6>!it0r|C z(_f%*`~=nGls?3)DaY5B-kMyKxfxjTSVnzms4cqnrD4>0*U@|j`gn>~W>eLpP3sTa z*HNpQX}=C5&vgHOz3br;Kkd)c=jU|Rm->Eg+?dIn_G|f>({UL#|Isq1 z{dK;~>G@e0_l%j-emyjEIxfTJKiXVt_ZF*3w{JZVGBn!cWq*I!jMBhmg$Kl1vuH5RLRO^;YoQLJK4k64qwR5tQB()#PR zy1a!%UrO($$-`|T2KU=}r`*kYtGps4J)7nFQd=X}fLRj#bj1?M{-pZ&EQx@+@*;`8 zbOZM!*Obdq-P7+kbVWg#zEqcgmgq~h&Hg0%(ke5iy=F+3Z%FQ3ug%xV^riG0v^Eu5 z>Eobm$5O^Y>hX@@^)z6X%>$jrR0C#79MrXr3_I z&oX_fhS;rBUmA*nL-nOrNm|vGQd#<;cvJ3SI;H0`Gu8MC(;ci!PrK{qBCu+{j0)3G zTXZW-!>F^uG%HNU>7$rkhmJ6C+`&A?e#UUrFyj{H3-0}wmESX`uWs$GQJ0$2el4zDlrVPWvmtnbQ*9X#UJM>Qd6{<2Vc|kSd+q3 zW@C=DJ_QpirJB5jL}98AbARO1mt9C=pRJDbHT?+GwS%d23`*jkwlOG)fVwg{iNcf$ zI8E87L}98e(~v1lbW-)LoO;;m~!^2BY&1EOw-Q?bt+6lUSqhzw5lg{ zI@70E89goD;ZE;s#eMw#Wzsp9ng1=L)^sbdinokf(@GBSd1JS;VuZlTh7;f>b%QJSn-nDTFr~S3-`8l1nrdJ!op>JhQ`?ZbC z=@3_z<^9ZQU-^+ay)4`f;mn-&YonRdA+9XT`>V<6x_(Tex;cjKhO5~}xWX#MthSEW zpVzi&^z7K=YkI`~tfh&Vdx9S08cEJ{Un)TC=cH|jStqd1^fvZ0jyA-H;O}0!^T(C~ z8~gF3iFiJ(X=v_UA9<1rqpp#sNoy*zu_mpl46!DysSGhkTEEs*m$#5IqjWt{&> z;-D^HC)1kh%Jy|>O=W&Vm)2B@dHLd?Ol!(Jha6%JW@-(j)XtLGpuv0u+&b2}Bymtz zz9G|^YVglGwWc9957nABHKkR(DR(2M_^^KHquruB#I`%>h6PT4nkpHnGEB|NTvCN-!1 zIlP_w&Zno&+S9n)y59N^N$%m-`7@{EGHm{%WlsA_kj&}%Ss3?>nbUr)G;=yG!{$HQ zYI3@+C+k1UPtWDTAC_DqrR~o zCB-bOj@ZvhLx`JhGA3UvabyHm~Vz+^@UQhFDT< ztYS`YV@a)17mqp8`n0FcQ)r2LlDKERn-`SI8xt_Gj+%b2=+dGpCsspX2!s_3IPl zcTe#1Gp@ke$KS8<`&&FO@IF`7+Z74bD+B!Me&%#shRuJp?5BPGN9OeWER1``%xQmR zICDBK!{$HQYI3@+E$r9cEU=z^8`;iFWH;09#2Lz#>WKY$ZBwZ?-wtXr#Qvx+7lxTnj*@eZQ>cGea7WQtR5m?hCq z+ZdF@KW%)LL_lra=#PO^<7mo0b?tU4%QR$)Q||I+pXuYEL~*(R;v+nFv8H`nLF`_X ziVfD(e#euKw!B$ahO`jHL0!I1m*P}524#vUUN6I>~I1 zyPY0mErzceVv1xws4L%)DNZ%`XPt`Ekk=TlI5kRAr!CzttL(><^4j>aWz?453aAV2 zV+Yua;zPL~>=&pL4oXEreJ1W!>TY0;{%7nWYn2P1@a>!MCTDouD85DR!W@gEdP?sS zYKv}dX&80ZmS$~fJmnwfGu5M|8HtY5{#vA+Z)I(1y`QRmru+BnT??1^X@9MHeokj? zsqg2;jhW18zmA_d9hYJAA1!m*uXSZk&(FfRXUv@TYoVFbaTzxM(N>ewbxoc`Wpj*` zrjv4a&}sJu4b1@Ri2ZqOTW#?cYN5M8eSnp*6!Y*pVt>}sMC|S*%u$dYv7eK+A=YJM zKjUaaduRcaHHhN;9b~BZZK}r16#%DdHlRX-lPcmc&6_ zIg(6UdVm$9L#!KdN7M8(D_$erH%~DuN7R*`;L{o~OX8p|Zb-GI>HV`#ZE47B4Aque zC23V#`lk4TU7P+`{0hb6yW(%fFHk$4;rBP-`@c@gcat|SqvrJXHPW1h+M-)?8b92e=)i=E7BlVkR*Mt`qzwy^vCwi3jCPTGd}7<&`$K{3R=Zqu{E z&p6r;&sA-dvBHlh`Vse68f{E8ujyIQueZ^LSW;!IVoq;kNsUq0$m2-sujOisdXl)O z4YMTj+4?hI)3aHoIXyzGzJ<8A1tqWs%*z-3c(0%SF=+Nt+(Ui&NQIpx5pWM#(E;+$ z10|RxF;E-k<%@!{{Y+ni7boT3bJOaBWErSLbGm^n-#ya%I*I0#d-HDN`4V#z4gOi8 zIi+T7fhTRP1G8ifs4Ekd?Pq!d`&ve8;IkwS+B>B4RRd;89ArLc9~v-A;vjjk2ODo; zy-NdTNgOks?y!R)U^+B`4orI%GU3ks+ht6KSW-{4ah$K|eTAf&s0*>A zmS}7Fd`)j-j~K0@9QMmQf;$8iMCW*7Anz}YV&ov_A`~m z6q&YES1zh+KU1llmoE;=_A{k^@DNWvH2CNKIB2f?=1!XjD(0`uCHi9bhO&G^rY+Sl zx6-LC4S9{>+ES|}t?ElZ7VnF5-0gkJ@n|@^jQY~OYosp?wMDnSG>kgyOS8T-o>GeQ z-RjY%^@r`1xQFn?j6rL~zo5cakMnjup7o{meyaAF?%%I>JzV0a{q^ekIi2;TzMmU6 zW-_P!dPe4ST!zhmw9IK=?U6Y>KMUiYF>~7217%LfW!U^jTTM>am4q^-%{*1n&GJH@KlXoQE)yDp){sQ;-D@* z%k-tX{Dv-lsf-&^eW|9{Ez_6kii5iJrBZJ6$3e#n9W&Pj_66?GpS5wLKMrm{Tgsg7 z2-j0jt1p#uqdyLAeBCFV`=zI!4a)STy0{_Lm%4G7%Fa6Vr6D#C*Oyu?sneG}!=45Q z#o2_+wpq~fsY{8xT?cl*I4v%U53t(-c7uI_pKoEuy3ckQ^bP#y&rprM#%K7sPx$st z>?m=D$Bp7!T>rTNH5v2U>3AP*i)M9c7iy=(^H-bf`dwDyWhLHKEs$m;I!^mlxXfu< zV4M~%?GdhXHC*PW{nhIEIi1y|amPUBv|q{3oQ}(|`Hz-4?N_@pr{`y3+%slQ`>Vj2 z({UL#|It>H({<&ezw(hzXA_Qp`#EVB zVj@p(V?X0)Lp)DyU&>=Yo-`59r7o2smedrXnwZv8T&hXi}HT?c5*v=2EuFF%OA-I(&wv-AmE9FWSVu zr2W258|MBfNS?Vz`nWCIz4Rq8zl4T~@i0AR+OVG+x?;B`b*a?XX;PQUF-zj08-W^f zXHDu-xt;stpi{L?t1gve9ufz2#&JD?Y(B>OD z?5s&$+HGfz>e4Xcq3TkrBz4--UrWW~0hEtZW=m#8c^TEEo7YHP8fuGfb!iy2Q{wqq zw#}Ndx^!9fc-OmfDB-kUh0C0#1+uzyj0L8R@$J`PRQKccSF7jebXJ$f9Yxts`>Qya z({UL#|Isq1eXU34^!zN0d&bOZe-$`$IxfTJKiXsv2G1 zLZ&X&hPglTQ4yjkj>z^dQWa8(_^L$`{SUl*`F?Tsm#~O)TO$7oow$?Hv%=}&brj4Qf^4%;9OT(NHI&|pspNA zrY_w^R>%EIsn*ospZnvW$wR3yM@$$U^3H)QHk4gOiDx-{f9hN?@QmelA=hp>4c zcWwTJ`!*k!8O?few_LCOQ2w=m>SrB$c%EQC&tdy-`bT|G{0^n-NqHWwBf9_d$TzUd zr++5D4G-|$->^66d3l#9)zg|2m9u$v@U&^DoW4TP3 z*uMGtsecsri$}#%ywkKv_gSuf4&NI4#m~h@ck zX{k+{$9h~IhkbN`=gZz6V!OV_9mBb2>^aVUgm3%}fB%Nx&vA^?vbWdD|9!yk=lK5` zc9gwn`OY5pjcsOA5{xgr^OIH7OrIb&d@5d*)^)sSt~Xb+xtItZf#VlwG4~)o1DfOF zuQj{W=O7jZwYL^+*Kd2m&rR2&$FT9=23dErF|M!PzfX&MgU%h(4w8PP=5oE*DOtUR zpWOMLeazoBk+X0P%JE~z(9hU&nO<=XUf~q1d5zyL@Xkj(PVxRL{MF}2Uce^YxA~&{ zrt!^=Lyloh|Jv+_`jKA1Q++6Rg{G(Bbq{82_npJG?jAOC&MA*LO^fs&o%XM`v&oaI_Qu$Azd)4vz3e}F zVcIvPC7Nicfpt8f_SNzrZJ)Iveg2iZ%Y*qL#w%lx$>j9e^he<1xM$S9DBi$Fya!t! z!PoF=mF2@*^~Cg;`)JVtM%_nbs`T=o)Q!Ks9+0(Yz4+gVZ=9Xq$LqZ^=6#EMqTB)V z?%;j^%)V~niqLQI*8-opjo-{%egl8s#V0q)=N|s|e@YwKT!`}m6Tzw(l8tG6?T?P} zy(q2n6MFX%@V>Zg`+Z>9Mt=VQuU&25?QMHFTG+VCG4m44`h?NVxO(x`i^j0V8t(t_ z4DITQYBs{2VWhq)N9(ka0^?d;4?6eaxDfx$~YDPtm6L`28E$;lzufH_LZ; zcMMuPhQ<4AJ?(7I_NC31`p`TD@7@jaWM)?Rx%7o6u;};^$!l{N**<{zj1^x7;i=EV zW8irX49wTv%&&Vq#9)mX6W! zhjJeC8SFeqW~0GIzW@n2N)LBlt{^cp(P1rOV)=E~z#BhvTiwBLG}X>&D}V}$P*bg5C@N53B-qS)18 z!$&>XE-+H;xN%l{2h^!8$K2}xz3Nb*=Q>=AGNad_(_phFWzKx|)%!VgPhib= z<;Y0uPwJkqIvO}Drf+0EdV<$OSeV)W2aM^Lcs;^@$p+%*lWX+t>v#MtkM*HE!YPi# zbpozGe!+MA^+&Tp$F;e-|69Y1ZYN6qD~qV6EmUb+v_8bG7^&Eq!$9`6cb-I*F;m%;6Jui|;Vr9w@h~QJbuWXK-yD?-}B(xJ~Er zZCl5AhTU@Qa=uL9DzVMBbXhzDR~6SV6I#QH9OJZ|i>x6VJ3vPA2LI8TPZ0YyaQ^~? z*FU3ZYwh**9L?5_^Bp_LDVB%FW4(t&RnWiQ8$TX2dzGV?>q=wi0n5|3rp2*F?)15% zt;lGOyB1@-D4>;3W)AJQHx`@bs7zS>(vUTSdV9x30`7vmrFtGzZ|!xB1#L`@6%CfD zf0r#D{0$LXb1WdfRfz-DwvLYhSJedjE6~jH`l@!r=hm*RPR;9-rmOmmY3cR$ z{jNu2`Tb>Ka9p2n>q_^rzIzwCk{^mcwbX^`6+mA1K@|TJudF-0!y5J}D*Mz-J571N zpMQ!~Bd!yD#C0_L81>YA9O5YES`X^HKA-~h2**FdTKOlekDEHTTOqgEj#25eLPQsn)wA!5?(9^CgsNK^lIhNRAC<7~YozM+LR!!0Ls$!Cb&;+30DH3Pz*Rf; zQ@yWvT^O$#a{4agrH#^SAGUmkdG}9c9qtDlgDZXSVfAwymC=*+x!3sqN1W$Rs2zNV z3LdX-JI5zaaOK2ju!U$|7yk=?5yvZh#=c91h&kd-eE&6`O>15a;XSbJ5ZvHZPQ)4F z(KldTyK>MVaa@XngZ8=yOTBaU*7WJq-jIt4FVbF&=FPSNVytqq}n7CYCAi`^adMGHz|?`l`Qf5x>c zbbj*l0<5=M|0iHAd$|kOpYe&e_!e1v6Me<;eFM7W9b_w9y^M{t9eZ^|89uaK1KQ88 zu0Cp>neWt<&29XwM~dm~(Zrbom9g~?h!_vSBBL%Rj(K{j?d&>wD};<0NY!gK{lU~c z;`MsGZr6IJC;_CuZ}H!ztyjkVXct6wDNvz^YvXA zgO2{|#;3Ip=UkU*x6r#Q<)mSiJk`p_i2nx-Mf*Q+)c~3MGghN`9l!yUR`IpCU9B9- z0xhlduiD_K4{6oSUW;7MaaY$gulpEl_jW`^Jrq;D&U>TxU*8bEdZ2CZ{|A`eb8pWt zlmDE*OzofY-6+fPO;n< zmiJm>4NvAVL%kP96W?;&O>KJY=bhxo;HO6mUl$U}#ho{_-(ADiiuJ2XrbHFr zj@+d(7Gi_0d2PlJYqlR_dW7*U%X<&U!fmeu==T6sUaytciBjRs8T=Y@Y33(W@wJXI zwmr>#k;mAxdv?}uS@-=lZ=OjnYi62LAUzGldhzN zvQBFQr}CDt%(Rdhy3@2CtXWH1gN!vPK|JZajPTH@&g31}nI8W;z(XPqHpWAJ< z-ixbESsC(dR)ODdGyBQ7D-QOkQ+fWeGmEg^z29Q)yJjZAiif+RV9e-rM>f&CdfX{I z-8Oa%8#gBE8tbYqzuVu{zqf|f5v%AQW54=Q-7%-J-Pn0U9j(>I53`&3Ry>{V%aiu{Aot;*nHTx zsMTWk+mN3$YbZ|95N~wQiVjPBCXUUIt9G->-~PDk*9f?0B-iuoewuC<%l6$EL%C8I zO?=CZ&5Ns8!!rbq7TVM82Wl(EX7#>$l&NMK)pK+sjc?_#EBaOJzUsA~r_FD~@{Y|T zPvaNIX4h5wxj9+C<=khd^NsEt22X7E?TpT;+tq$n8QVRwnNzxmvUaIXw7S|cJnTai z-;QJR#dgF-4Rk${ciVl2cQ{WsIhH*$?-%tG^Z;znKTyGXj=z4u-)tk_<&mD_efOCsINS5m z3fzs|*wx2>6CQw%#bryr$LEK&H}I5Pw^>7Pvu1KpGUg2L875M#BxBAG=!>UdtCTaL{}U zd7HS)_|@7oo?G|J%wgQv*o0mn75*p4xSrx}Ee|k0#`9`>L_1vMW~6>sa*XxXdgNxc z`WWvqjx!fL#*ZnEwmid(;SNwrVn7(7jm%TM@vL4Xj9AaX=BK5# snN5$I-7LP&hlkFF$8(!LoxFKowqblr#>~@(%x$MESjMdX57T~in*aa+ literal 0 HcmV?d00001 From d94aa6cafdee5a123d5a25cea9ad4d9c0a2144e1 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 2 May 2010 11:34:13 +0000 Subject: [PATCH 253/261] [win32k] - IntMouseInput: Add the state of virtual keys to wParam before calling MsqInsertSystemMessage. Fixes bug #5066. - Add and Remove MK_XBUTTON1/2 flags to CurInfo->ButtonsDown vice XBUTTON1/2. - Code based on patches in bug #5066. svn path=/trunk/; revision=47080 --- reactos/subsystems/win32/win32k/ntuser/input.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index f51395ee607..e86d14a33bc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -1111,7 +1111,7 @@ IntMouseInput(MOUSEINPUT *mi) /* * Insert the messages into the system queue */ - Msg.wParam = CurInfo->ButtonsDown; + Msg.wParam = 0; Msg.lParam = MAKELPARAM(MousePos.x, MousePos.y); Msg.pt = MousePos; @@ -1134,6 +1134,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_LBUTTON] |= 0xc0; Msg.message = SwapBtnMsg[0][SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[SwapButtons]; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_LEFTUP) @@ -1141,6 +1142,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_LBUTTON] &= ~0x80; Msg.message = SwapBtnMsg[1][SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[SwapButtons]; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } if(mi->dwFlags & MOUSEEVENTF_MIDDLEDOWN) @@ -1148,6 +1150,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_MBUTTON] |= 0xc0; Msg.message = WM_MBUTTONDOWN; CurInfo->ButtonsDown |= MK_MBUTTON; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_MIDDLEUP) @@ -1155,6 +1158,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_MBUTTON] &= ~0x80; Msg.message = WM_MBUTTONUP; CurInfo->ButtonsDown &= ~MK_MBUTTON; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } if(mi->dwFlags & MOUSEEVENTF_RIGHTDOWN) @@ -1162,6 +1166,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_RBUTTON] |= 0xc0; Msg.message = SwapBtnMsg[0][!SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[!SwapButtons]; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_RIGHTUP) @@ -1169,6 +1174,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_RBUTTON] &= ~0x80; Msg.message = SwapBtnMsg[1][!SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[!SwapButtons]; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } @@ -1185,15 +1191,15 @@ IntMouseInput(MOUSEINPUT *mi) if(mi->mouseData & XBUTTON1) { gQueueKeyStateTable[VK_XBUTTON1] |= 0xc0; + CurInfo->ButtonsDown |= MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); - CurInfo->ButtonsDown |= XBUTTON1; MsqInsertSystemMessage(&Msg); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] |= 0xc0; + CurInfo->ButtonsDown |= MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); - CurInfo->ButtonsDown |= XBUTTON2; MsqInsertSystemMessage(&Msg); } } @@ -1203,15 +1209,15 @@ IntMouseInput(MOUSEINPUT *mi) if(mi->mouseData & XBUTTON1) { gQueueKeyStateTable[VK_XBUTTON1] &= ~0x80; + CurInfo->ButtonsDown &= ~MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); - CurInfo->ButtonsDown &= ~XBUTTON1; MsqInsertSystemMessage(&Msg); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] &= ~0x80; + CurInfo->ButtonsDown &= ~MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); - CurInfo->ButtonsDown &= ~XBUTTON2; MsqInsertSystemMessage(&Msg); } } From 2b896af1284cc480673f499d4f9b755f8c071594 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 2 May 2010 11:47:19 +0000 Subject: [PATCH 254/261] Gabriel Ilardi: - Update spanish %temp% path, part of bug 2482. svn path=/trunk/; revision=47081 --- reactos/boot/bootdata/hivedef_i386.inf | Bin 314598 -> 314636 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf index 33d3a0a09fd5f587ec5563f5779360935f8abce7..905f5ef3daff1b1d91a02000819e52a8f03b898b 100644 GIT binary patch delta 78 zcmaDhQ@CfAa6=1Y3sVd878ZvC(-rozNH981XFSMauIkK?&ydHE#*oR7&QQuw#E{64 e3}k->iYYMo0OgW_B019&53*=(-*JFNj|Tvt9~Mdg delta 37 tcmeB~CH!ora6=1Y3sVd878ZvC)ANqANH7~PI8N_8&Jw--&H)w!9smwf4a)!k From 91e196a64f92334e9db3a82f52130b34cf56f90a Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 2 May 2010 16:40:05 +0000 Subject: [PATCH 255/261] [win32k] - co_UserDestroyWindow: ThreadInfo->pDeskInfo->hShell holds the hWnd of the Shells Desktop Window. Set it to NULL if that windows is being destroyed. Fixes bug #4902. svn path=/trunk/; revision=47082 --- reactos/subsystems/win32/win32k/ntuser/window.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 822c8c55285..f22c6dce047 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2619,6 +2619,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) BOOLEAN isChild; PWND Wnd; HWND hWnd; + PTHREADINFO ti; ASSERT_REFS_CO(Window); // FIXME: temp hack? @@ -2662,6 +2663,21 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) if (Window->pti->MessageQueue->CaptureWindow == Window->hSelf) Window->pti->MessageQueue->CaptureWindow = NULL; + /* + * Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL + */ + + ti = PsGetCurrentThreadWin32Thread(); + + if ((ti != NULL) & (ti->pDeskInfo != NULL)) + { + if (ti->pDeskInfo->hShellWindow == hWnd) + { + DPRINT1("Destroying the ShellWindow!\n"); + ti->pDeskInfo->hShellWindow = NULL; + } + } + IntDereferenceMessageQueue(Window->pti->MessageQueue); IntEngWindowChanged(Window, WOC_DELETE); From dc3a34f70bcda28effae841f054af16bc7a3b642 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 2 May 2010 19:19:28 +0000 Subject: [PATCH 256/261] [SETUPAPI] - Store device settings in the "Device Parameters" key, as the kernel now does it too - Fixes display of AC97 device in audio cpl svn path=/trunk/; revision=47084 --- reactos/dll/win32/setupapi/interface.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/setupapi/interface.c b/reactos/dll/win32/setupapi/interface.c index 1d207097d00..e7556cec75f 100644 --- a/reactos/dll/win32/setupapi/interface.c +++ b/reactos/dll/win32/setupapi/interface.c @@ -399,7 +399,13 @@ InstallOneInterface( HeapFree(GetProcessHeap(), 0, Path); } - return SetupInstallFromInfSectionW(NULL, /* FIXME */ hInf, InterfaceSection, SPINST_REGISTRY, hKey, NULL, 0, NULL, NULL, NULL, NULL); + if (RegCreateKeyExW(hKey, L"Device Parameters", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hRefKey, NULL) != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return FALSE; + } + + return SetupInstallFromInfSectionW(NULL, /* FIXME */ hInf, InterfaceSection, SPINST_REGISTRY, hRefKey, NULL, 0, NULL, NULL, NULL, NULL); } /*********************************************************************** From 31c846d674a63fff004082e0787fb9f32d00bc83 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 2 May 2010 21:04:47 +0000 Subject: [PATCH 257/261] [VGA] - Return SPS_ACCEPT_NOEXCLUDE from DrvSetPointerShape because we completed the requested operation successfully - Patch by Daniel Zimmermann - Fixes bug 4347 svn path=/trunk/; revision=47087 --- reactos/drivers/video/displays/vga/objects/pointer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/video/displays/vga/objects/pointer.c b/reactos/drivers/video/displays/vga/objects/pointer.c index 698f8790fe0..c0d365bb9a4 100644 --- a/reactos/drivers/video/displays/vga/objects/pointer.c +++ b/reactos/drivers/video/displays/vga/objects/pointer.c @@ -272,7 +272,7 @@ DrvSetPointerShape( VGADDI_ShowCursor(ppdev, prcl); } - return SPS_ACCEPT_EXCLUDE; + return SPS_ACCEPT_NOEXCLUDE; } static VOID FASTCALL From 567bf0c1881584c4bed64e35705506602e74fbe6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 2 May 2010 23:26:06 +0000 Subject: [PATCH 258/261] [NTDLL] The harderror message for STATUS_DLL_NOT_FOUND expects an ANSI dll name. svn path=/trunk/; revision=47088 --- reactos/dll/ntdll/ldr/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/ntdll/ldr/utils.c b/reactos/dll/ntdll/ldr/utils.c index 9dcb99960ef..14512194832 100644 --- a/reactos/dll/ntdll/ldr/utils.c +++ b/reactos/dll/ntdll/ldr/utils.c @@ -1518,7 +1518,7 @@ LdrpGetOrLoadModule(PWCHAR SearchPath, if (!NT_SUCCESS(Status)) { ULONG ErrorResponse; - ULONG_PTR ErrorParameter = (ULONG_PTR)&DllName; + ULONG_PTR ErrorParameter = (ULONG_PTR)&AnsiDllName; DPRINT1("failed to load %wZ\n", &DllName); From 2fce2d1d8f72a8d8b3bdf4c59bea73b3c23c0af8 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 3 May 2010 00:06:31 +0000 Subject: [PATCH 259/261] [NETCFGX] - Remove the hack that set DI_NEEDRESTART for all network adapters which prevented us from starting the miniport driver - Part of the fix for bug 3716 svn path=/trunk/; revision=47089 --- reactos/dll/win32/netcfgx/netcfgx.c | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/reactos/dll/win32/netcfgx/netcfgx.c b/reactos/dll/win32/netcfgx/netcfgx.c index c9d8a4520d8..ba89dff123a 100644 --- a/reactos/dll/win32/netcfgx/netcfgx.c +++ b/reactos/dll/win32/netcfgx/netcfgx.c @@ -325,7 +325,6 @@ InstallNetDevice( HKEY hLinkageKey = NULL; HKEY hConnectionKey = NULL; DWORD dwShowIcon, dwLength; - SP_DEVINSTALL_PARAMS_W installParams; /* Get Instance ID */ if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0, &dwLength)) @@ -550,31 +549,6 @@ InstallNetDevice( goto cleanup; } - /* HACK: hpoussin, Dec 2005. TCP/IP driver is not able to manage devices - * which are installed after its startup. So, we have to reboot to take - * this new netcard into account. - */ - /* Should we reboot? */ - installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W); - if (!SetupDiGetDeviceInstallParamsW( - DeviceInfoSet, - DeviceInfoData, - &installParams)) - { - rc = GetLastError(); - DPRINT("SetupDiGetDeviceInstallParams() failed with error 0x%lx\n", rc); - goto cleanup; - } - installParams.Flags |= DI_NEEDRESTART; - if (!SetupDiSetDeviceInstallParamsW( - DeviceInfoSet, - DeviceInfoData, - &installParams)) - { - rc = GetLastError(); - DPRINT("SetupDiSetDeviceInstallParams() failed with error 0x%lx\n", rc); - goto cleanup; - } rc = ERROR_SUCCESS; cleanup: From c55eb25c0687e316af724faa96add97506d18205 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 3 May 2010 00:28:29 +0000 Subject: [PATCH 260/261] [NDIS] - Provide a IRP_MJ_CREATE and IRP_MJ_CLOSE handler for miniport drivers so IoGetDeviceObjectPointer doesn't fail (and consequently, IoSetDeviceInterfaceState) svn path=/trunk/; revision=47090 --- reactos/drivers/network/ndis/ndis/miniport.c | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index 2a9934c355e..f3347a059e0 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -1722,6 +1722,22 @@ NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp) return Status; } +NTSTATUS +NTAPI +NdisICreateClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + DbgPrint("NdisICreateClose\n"); + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI @@ -2499,6 +2515,8 @@ NdisMRegisterMiniport( *MiniportPtr = Miniport; + Miniport->DriverObject->MajorFunction[IRP_MJ_CREATE] = NdisICreateClose; + Miniport->DriverObject->MajorFunction[IRP_MJ_CLOSE] = NdisICreateClose; Miniport->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp; Miniport->DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = NdisIShutdown; Miniport->DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NdisIDeviceIoControl; @@ -2960,6 +2978,12 @@ NdisMRegisterDevice( DriverBlock->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp; + if (!DriverBlock->DriverObject->MajorFunction[IRP_MJ_CREATE]) + DriverBlock->DriverObject->MajorFunction[IRP_MJ_CREATE] = NdisICreateClose; + + if (!DriverBlock->DriverObject->MajorFunction[IRP_MJ_CLOSE]) + DriverBlock->DriverObject->MajorFunction[IRP_MJ_CLOSE] = NdisICreateClose; + DeviceBlock->DeviceObject = DeviceObject; DeviceBlock->SymbolicName = SymbolicName; From 66482fa4f3ff3f6933129358d8e83eb35bd6aa4c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 3 May 2010 00:30:49 +0000 Subject: [PATCH 261/261] - Remove a forgotten debug print svn path=/trunk/; revision=47091 --- reactos/drivers/network/ndis/ndis/miniport.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index f3347a059e0..daaf7cac1b1 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -1731,8 +1731,6 @@ NdisICreateClose( Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; - DbgPrint("NdisICreateClose\n"); - IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS;