Author: tkreuzer
Date: Mon Oct 25 15:26:06 2010
New Revision: 49272
URL:
http://svn.reactos.org/svn/reactos?rev=49272&view=rev
Log:
Merge trunk head (r49270)
Modified:
branches/reactos-yarotows/ (props changed)
branches/reactos-yarotows/base/system/services/rpcserver.c
branches/reactos-yarotows/dll/win32/jscript/jscript_Si.rc (props changed)
branches/reactos-yarotows/dll/win32/user32/include/user32.h
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/guids.cpp
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/interfaces.hpp
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/irpstream.cpp
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/private.hpp
branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/undoc.cpp
branches/reactos-yarotows/hal/halx86/generic/usage.c
branches/reactos-yarotows/include/psdk/ks.h
branches/reactos-yarotows/include/psdk/ksmedia.h
branches/reactos-yarotows/ntoskrnl/include/internal/io.h
branches/reactos-yarotows/ntoskrnl/io/iomgr/iorsrce.c
branches/reactos-yarotows/ntoskrnl/io/pnpmgr/pnpreport.c
branches/reactos-yarotows/ntoskrnl/io/pnpmgr/pnpres.c
branches/reactos-yarotows/ntoskrnl/mm/ARM3/virtual.c
branches/reactos-yarotows/subsystems/win32/csrss/win32csr/ (props changed)
branches/reactos-yarotows/subsystems/win32/win32k/ntuser/callback.c
branches/reactos-yarotows/subsystems/win32/win32k/ntuser/hook.c
branches/reactos-yarotows/subsystems/win32/win32k/ntuser/msgqueue.c
Propchange: branches/reactos-yarotows/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Oct 25 15:26:06 2010
@@ -1,4 +1,4 @@
/branches/header-work:45691-47721
/branches/ros-amd64-bringup:36852
/branches/ros-amd64-bringup/reactos:34711-34712,34741,34743,34770,34780-34782,34803,34812,34839,34842,34864,34870,34874,34877,34908-34909,34917,34965,35323-35324,35347-35348,35361,35436,35509,35515,35588,35655,35683,35739,35746,35762,35771,35777,35781,35789,35805,35823,35827,35902,35904-35906,35942,35947-35949,35952-35953,35966,36011-36013,36172,36360,36380,36388-36389,36393,36397,36443,36445,36475,36502-36503,36505,36570,36614,36852,36898-36899,36930,36936,36949,36951,36958,36961,36964,36969,36972,36987-36988,36990,36992,37019,37322-37323,37333-37334,37434,37472,37475,37536,37820-37821,37868-37869,37873,37990-37991,38013-38014,38092,38100,38148-38151,38264-38265,38268,38355,39151,39333,39335,39345,39639,40120,40122-40123,40125,40127-40128,40155,40247,40324,40608,40753,40926-40928,40986-40987,40989,40991,40993,40995-40996,41000-41001,41027-41030,41044-41045,41047-41050,41052,41070,41082-41086,41097-41098,41101,41449,41479-41480,41483-41485,41499-41500,41502,41531,41536,41540,41546-41547,41549,43080,43426,43451,43454,43506,43566,43574,43598,43600-43602,43604-43605,43677,43682,43757,43775,43836,43838-43840,43852,43857-43858,43860,43905-43907,43952,43954,43965,43969,43979,43981,43992,44002,44036-44037,44039-44040,44044-44045,44053,44065,44095,44123,44143-44144,44205,44238,44257,44259,44294,44338-44339,44385,44389,44391,44426,44460,44467-44468,44470-44471,44499,44501,44503-44504,44506,44510-44512,44521,44523-44526,44530,44540,44601,44634,44639,44772,44818,45124,45126-45127,45430,46394,46404,46478,46511,46523-46524,46526,46534-46535,46537-46539,46589,46805,46868,47472,47846-47847,47878,47882
-/trunk/reactos:45219-49238
+/trunk/reactos:45219-49270
Modified: branches/reactos-yarotows/base/system/services/rpcserver.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/base/system/se…
==============================================================================
--- branches/reactos-yarotows/base/system/services/rpcserver.c [iso-8859-1] (original)
+++ branches/reactos-yarotows/base/system/services/rpcserver.c [iso-8859-1] Mon Oct 25
15:26:06 2010
@@ -31,9 +31,6 @@
typedef struct _MANAGER_HANDLE
{
SCMGR_HANDLE Handle;
-
- /* FIXME: Insert more data here */
-
WCHAR DatabaseName[1];
} MANAGER_HANDLE, *PMANAGER_HANDLE;
@@ -41,11 +38,7 @@
typedef struct _SERVICE_HANDLE
{
SCMGR_HANDLE Handle;
-
PSERVICE ServiceEntry;
-
- /* FIXME: Insert more data here */
-
} SERVICE_HANDLE, *PSERVICE_HANDLE;
@@ -149,7 +142,7 @@
if (lpDatabaseName == NULL)
lpDatabaseName = SERVICES_ACTIVE_DATABASEW;
- if (_wcsicmp(lpDatabaseName,SERVICES_FAILED_DATABASEW)==0)
+ if (_wcsicmp(lpDatabaseName, SERVICES_FAILED_DATABASEW) == 0)
{
DPRINT("Database %S, does not exist\n",lpDatabaseName);
return ERROR_DATABASE_DOES_NOT_EXIST;
@@ -168,8 +161,6 @@
Ptr->Handle.Tag = MANAGER_TAG;
- /* FIXME: initialize more data here */
-
wcscpy(Ptr->DatabaseName, lpDatabaseName);
*Handle = (SC_HANDLE)Ptr;
@@ -192,7 +183,6 @@
Ptr->Handle.Tag = SERVICE_TAG;
- /* FIXME: initialize more data here */
Ptr->ServiceEntry = lpServiceEntry;
*Handle = (SC_HANDLE)Ptr;
@@ -453,9 +443,10 @@
if (*hSCObject == 0)
return ERROR_INVALID_HANDLE;
- hManager = (PMANAGER_HANDLE)*hSCObject;
- hService = (PSERVICE_HANDLE)*hSCObject;
- if (hManager->Handle.Tag == MANAGER_TAG)
+ hManager = ScmGetServiceManagerFromHandle(*hSCObject);
+ hService = ScmGetServiceFromHandle(*hSCObject);
+
+ if (hManager != NULL)
{
DPRINT("Found manager handle\n");
@@ -467,7 +458,7 @@
DPRINT("RCloseServiceHandle() done\n");
return ERROR_SUCCESS;
}
- else if (hService->Handle.Tag == SERVICE_TAG)
+ else if (hService != NULL)
{
DPRINT("Found service handle\n");
@@ -561,6 +552,8 @@
DWORD dwError = ERROR_SUCCESS;
DWORD pcbBytesNeeded = 0;
DWORD dwServicesReturned = 0;
+ DWORD dwControlsAccepted;
+ DWORD dwCurrentState;
HKEY hServicesKey = NULL;
DPRINT("RControlService() called\n");
@@ -662,6 +655,49 @@
}
else
{
+ dwControlsAccepted = lpService->Status.dwControlsAccepted;
+ dwCurrentState = lpService->Status.dwCurrentState;
+
+ /* Check the current state before sending a control request */
+ switch (dwCurrentState)
+ {
+ case SERVICE_STOP_PENDING:
+ case SERVICE_STOPPED:
+ return ERROR_SERVICE_CANNOT_ACCEPT_CTRL;
+
+ case SERVICE_START_PENDING:
+ switch (dwControl)
+ {
+ case SERVICE_CONTROL_STOP:
+ break;
+
+ case SERVICE_CONTROL_INTERROGATE:
+ RtlCopyMemory(lpServiceStatus,
+ &lpService->Status,
+ sizeof(SERVICE_STATUS));
+ return ERROR_SUCCESS;
+
+ default:
+ return ERROR_SERVICE_CANNOT_ACCEPT_CTRL;
+ }
+ break;
+ }
+
+ /* Check if the control code is acceptable to the service */
+ switch (dwControl)
+ {
+ case SERVICE_CONTROL_STOP:
+ if ((dwControlsAccepted & SERVICE_ACCEPT_STOP) == 0)
+ return ERROR_INVALID_SERVICE_CONTROL;
+ break;
+
+ case SERVICE_CONTROL_PAUSE:
+ case SERVICE_CONTROL_CONTINUE:
+ if ((dwControlsAccepted & SERVICE_ACCEPT_PAUSE_CONTINUE) == 0)
+ return ERROR_INVALID_SERVICE_CONTROL;
+ break;
+ }
+
/* Send control code to the service */
dwError = ScmControlService(lpService,
dwControl);
Propchange: branches/reactos-yarotows/dll/win32/jscript/jscript_Si.rc
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Oct 25 15:26:06 2010
@@ -2,4 +2,4 @@
/branches/reactos-yarotows/dll/win32/jscript/jscript_Si.rc:46848,46966,47800
/branches/ros-amd64-bringup/dll/win32/jscript/jscript_Si.rc:36852
/branches/ros-amd64-bringup/reactos/dll/win32/jscript/jscript_Si.rc:34711-34712,34741,34743,34780-34782,34803,34812,34839,34842,34864,34870,34874,34877,34908-34909,34917,34965,35323-35324,35347-35348,35361,35436,35509,35515,35588,35655,35683,35739,35746,35762,35771,35777,35781,35789,35805,35823,35827,35902,35904-35906,35942,35947-35949,35952-35953,35966,36011-36013,36172,36360,36380,36388-36389,36397,36445,36502-36503,36505,36570,36614,36898-36899,36930,36936,36949,36951,36958,36961,36964,36969,36972,36992,37323,37434,37472,37475,37536,37820-37821,37868-37869,37873,37990-37991,38013-38014,38092,38100,38148-38151,38264-38265,38268,38355,39151,39333,39335,39345,39639,40122-40123,40125,40127-40128,40155,40247,40324,40608,40753,40927-40928,40986-40987,40989,40991,40993,40995-40996,41000-41001,41027-41030,41044-41045,41047-41050,41052,41070,41082-41086,41097-41098,41101,41449,41479,41484-41485,41499-41500,41502,41531,41536,41540,41546-41547,41549,43080,43426,43454,43506,43566,43574,43598,43600-43602,43604-43605,43677,43682,43757,43775,43836,43838-43840,43857-43858,43860,43905-43907,43969,44002,44036-44037,44039-44040,44044-44045,44065,44095,44123,44144,44205,44238,44294,44338-44339,44389,44391,44426,44460,44467-44468,44470-44471,44499,44501,44503-44504,44506,44510-44512,44521,44523-44526,44530,44540,44601,44772,45124,45126-45127,46394,46478,46511,46523-46524,46526,46534-46535,46537-46539,46589,46805
-/trunk/reactos/dll/win32/jscript/jscript_Si.rc:47414-49238
+/trunk/reactos/dll/win32/jscript/jscript_Si.rc:47414-49270
Modified: branches/reactos-yarotows/dll/win32/user32/include/user32.h
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/dll/win32/user…
==============================================================================
--- branches/reactos-yarotows/dll/win32/user32/include/user32.h [iso-8859-1] (original)
+++ branches/reactos-yarotows/dll/win32/user32/include/user32.h [iso-8859-1] Mon Oct 25
15:26:06 2010
@@ -169,7 +169,7 @@
static __inline BOOL
IsThreadHooked(PCLIENTINFO pci)
{
- return pci->fsHooks != 0;
+ return (pci->fsHooks|pci->pDeskInfo->fsHooks) != 0;
}
static __inline PDESKTOPINFO
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/guids.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/guids.cpp [iso-8859-1]
(original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/guids.cpp [iso-8859-1] Mon
Oct 25 15:26:06 2010
@@ -79,6 +79,7 @@
const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87,
0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5,
0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
const GUID KSPROPTYPESETID_General = {0x97E99BA0L, 0xBDEA, 0x11CF, {0xA5,
0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+const GUID KSPROPSETID_DrmAudioStream = {0x2f2c8ddd, 0x4198, 0x4fac, {0xba,
0x29, 0x61, 0xbb, 0x05, 0xb7, 0xde, 0x06}};
const GUID KSEVENTSETID_LoopedStreaming = {0x4682B940L, 0xC6EF, 0x11D0, {0x96,
0xD8, 0x00, 0xAA, 0x00, 0x51, 0xE5, 0x1D}};
const GUID KSEVENTSETID_Connection = {0x7f4bcbe0L, 0x9ea5, 0x11cf, {0xa5,
0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00}};
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/interfaces.hpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/interfaces.hpp
[iso-8859-1] (original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/interfaces.hpp
[iso-8859-1] Mon Oct 25 15:26:06 2010
@@ -321,8 +321,7 @@
STDMETHOD_(NTSTATUS, Init)(THIS_
IN KSPIN_CONNECT *ConnectDetails,
IN ULONG FrameSize,
- IN ULONG Alignment,
- IN PVOID SilenceBuffer) PURE;
+ IN ULONG Alignment) PURE;
STDMETHOD_(NTSTATUS, AddMapping)(THIS_
IN PIRP Irp,
@@ -363,8 +362,7 @@
STDMETHODIMP_(NTSTATUS) Init(THIS_ \
IN KSPIN_CONNECT *ConnectDetails, \
IN ULONG FrameSize, \
- IN ULONG Alignment, \
- IN PVOID SilenceBuffer); \
+ IN ULONG Alignment); \
\
STDMETHODIMP_(NTSTATUS) AddMapping(THIS_ \
IN PIRP Irp, \
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/irpstream.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/irpstream.cpp [iso-8859-1]
(original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/irpstream.cpp [iso-8859-1]
Mon Oct 25 15:26:06 2010
@@ -43,7 +43,6 @@
LIST_ENTRY m_IrpList;
LIST_ENTRY m_FreeIrpList;
PIRP m_Irp;
- PVOID m_SilenceBuffer;
ULONG m_OutOfMapping;
ULONG m_MaxFrameSize;
@@ -84,12 +83,10 @@
CIrpQueue::Init(
IN KSPIN_CONNECT *ConnectDetails,
IN ULONG FrameSize,
- IN ULONG Alignment,
- IN PVOID SilenceBuffer)
+ IN ULONG Alignment)
{
m_ConnectDetails = ConnectDetails;
m_MaxFrameSize = FrameSize;
- m_SilenceBuffer = SilenceBuffer;
m_Alignment = Alignment;
InitializeListHead(&m_IrpList);
@@ -259,21 +256,12 @@
m_CurrentOffset = Offset = 0;
}
- if (!Irp && m_SilenceBuffer && m_MaxFrameSize)
- {
+ if (!Irp)
+ {
+ // no irp buffer available
DPRINT("NoIrp\n");
- // no irp available, use silence buffer
- *Buffer = (PUCHAR)m_SilenceBuffer;
- *BufferSize = m_MaxFrameSize;
- return STATUS_SUCCESS;
- }
-
- if (!Irp)
- {
- // no irp buffer available
return STATUS_UNSUCCESSFUL;
}
-
// get stream header
StreamHeader = (PKSSTREAM_HEADER)Irp->Tail.Overlay.DriverContext[2];
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp [iso-8859-1]
(original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp [iso-8859-1]
Mon Oct 25 15:26:06 2010
@@ -604,7 +604,7 @@
}
}
- Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL);
+ Status = m_IrpQueue->Init(ConnectDetails, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT("IrpQueue_Init failed with %x\n", Status);
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
[iso-8859-1] (original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
[iso-8859-1] Mon Oct 25 15:26:06 2010
@@ -73,7 +73,7 @@
ULONG m_StopCount;
KSAUDIO_POSITION m_Position;
KSALLOCATOR_FRAMING m_AllocatorFraming;
- SUBDEVICE_DESCRIPTOR m_Descriptor;
+ PSUBDEVICE_DESCRIPTOR m_Descriptor;
KSPIN_LOCK m_EventListLock;
LIST_ENTRY m_EventList;
@@ -105,10 +105,12 @@
NTSTATUS NTAPI PinWaveCyclicAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN
OUT PVOID Data);
NTSTATUS NTAPI PinWaveCyclicAddEndOfStreamEvent(IN PIRP Irp, IN PKSEVENTDATA EventData,
IN PKSEVENT_ENTRY EventEntry);
NTSTATUS NTAPI PinWaveCyclicAddLoopedStreamEvent(IN PIRP Irp, IN PKSEVENTDATA EventData,
IN PKSEVENT_ENTRY EventEntry);
+NTSTATUS NTAPI PinWaveCyclicDRMHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT
PVOID Data);
DEFINE_KSPROPERTY_CONNECTIONSET(PinWaveCyclicConnectionSet, PinWaveCyclicState,
PinWaveCyclicDataFormat, PinWaveCyclicAllocatorFraming);
DEFINE_KSPROPERTY_AUDIOSET(PinWaveCyclicAudioSet, PinWaveCyclicAudioPosition);
+DEFINE_KSPROPERTY_DRMSET(PinWaveCyclicDRMSet, PinWaveCyclicDRMHandler);
KSEVENT_ITEM PinWaveCyclicConnectionEventSet =
{
@@ -146,6 +148,13 @@
(const KSPROPERTY_ITEM*)&PinWaveCyclicAudioSet,
0,
NULL
+ },
+ {
+ &KSPROPSETID_DrmAudioStream,
+ sizeof(PinWaveCyclicDRMSet) / sizeof(KSPROPERTY_ITEM),
+ (const KSPROPERTY_ITEM*)&PinWaveCyclicDRMSet,
+ 0,
+ NULL
}
};
@@ -191,6 +200,19 @@
return STATUS_UNSUCCESSFUL;
}
+
+NTSTATUS
+NTAPI
+PinWaveCyclicDRMHandler(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data)
+{
+ DPRINT1("PinWaveCyclicDRMHandler\n");
+ ASSERT(0);
+ return STATUS_INVALID_PARAMETER;
+}
+
NTSTATUS
NTAPI
@@ -448,12 +470,14 @@
{
// FIXME
// complete with successful state
+ Pin->m_Stream->Silence(Pin->m_CommonBuffer,
Pin->m_CommonBufferSize);
Pin->m_IrpQueue->CancelBuffers();
Pin->m_Position.PlayOffset = 0;
Pin->m_Position.WriteOffset = 0;
}
else if (Pin->m_State == KSSTATE_STOP)
{
+ Pin->m_Stream->Silence(Pin->m_CommonBuffer,
Pin->m_CommonBufferSize);
Pin->m_IrpQueue->CancelBuffers();
Pin->m_Position.PlayOffset = 0;
Pin->m_Position.WriteOffset = 0;
@@ -662,6 +686,7 @@
ULONG BufferLength;
ULONG BytesToCopy;
ULONG BufferSize;
+ ULONG Gap;
PUCHAR Buffer;
NTSTATUS Status;
@@ -672,7 +697,18 @@
{
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
if (!NT_SUCCESS(Status))
- return;
+ {
+ Gap = Position - m_CommonBufferOffset;
+ if (Gap > m_FrameSize)
+ {
+ // insert silence samples
+ DPRINT1("Inserting Silence Buffer Offset %lu GapLength %lu\n",
m_CommonBufferOffset, BufferLength);
+ m_Stream->Silence((PUCHAR)m_CommonBuffer + m_CommonBufferOffset,
BufferLength);
+
+ m_CommonBufferOffset += BufferLength;
+ break;
+ }
+ }
BytesToCopy = min(BufferLength, BufferSize);
@@ -688,7 +724,7 @@
m_IrpQueue->UpdateMapping(BytesToCopy);
m_CommonBufferOffset += BytesToCopy;
- BufferLength = Position - m_CommonBufferOffset;
+ BufferLength -= BytesToCopy;
m_Position.PlayOffset += BytesToCopy;
if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
@@ -720,7 +756,18 @@
{
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
if (!NT_SUCCESS(Status))
- return;
+ {
+ Gap = m_CommonBufferSize - m_CommonBufferOffset + Position;
+ if (Gap > m_FrameSize)
+ {
+ // insert silence samples
+ DPRINT1("Overlap Inserting Silence Buffer Size %lu Offset %lu Gap
%lu Position %lu\n", m_CommonBufferSize, m_CommonBufferOffset, Gap, Position);
+ m_Stream->Silence((PUCHAR)m_CommonBuffer + m_CommonBufferOffset,
BufferLength);
+
+ m_CommonBufferOffset += BufferLength;
+ }
+ break;
+ }
BytesToCopy = min(BufferLength, BufferSize);
@@ -741,7 +788,7 @@
m_CommonBufferOffset += BytesToCopy;
m_Position.PlayOffset += BytesToCopy;
- BufferLength = m_CommonBufferSize - m_CommonBufferOffset;
+ BufferLength -=BytesToCopy;
if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
{
@@ -751,7 +798,6 @@
m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset;
}
}
-
}
if (Gap == Length)
@@ -773,22 +819,13 @@
{
ULONG Position;
NTSTATUS Status;
- PUCHAR Buffer;
- ULONG BufferSize;
ULONGLONG OldOffset, NewOffset;
PC_ASSERT_IRQL(DISPATCH_LEVEL);
if (m_State == KSSTATE_RUN)
{
- Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
- if (!NT_SUCCESS(Status))
- {
- return;
- }
-
Status = m_Stream->GetPosition(&Position);
- DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture
%u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
OldOffset = m_Position.PlayOffset;
@@ -841,7 +878,7 @@
if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
{
/* handle property with subdevice descriptor */
- Status = PcHandlePropertyWithTable(Irp, m_Descriptor.FilterPropertySetCount,
m_Descriptor.FilterPropertySet, &m_Descriptor);
+ Status = PcHandlePropertyWithTable(Irp, m_Descriptor->FilterPropertySetCount,
m_Descriptor->FilterPropertySet, m_Descriptor);
if (Status == STATUS_NOT_FOUND)
{
@@ -854,11 +891,11 @@
}
else if (IoStack->Parameters.DeviceIoControl.IoControlCode ==
IOCTL_KS_ENABLE_EVENT)
{
- Status = PcHandleEnableEventWithTable(Irp, &m_Descriptor);
+ Status = PcHandleEnableEventWithTable(Irp, m_Descriptor);
}
else if (IoStack->Parameters.DeviceIoControl.IoControlCode ==
IOCTL_KS_DISABLE_EVENT)
{
- Status = PcHandleDisableEventWithTable(Irp, &m_Descriptor);
+ Status = PcHandleDisableEventWithTable(Irp, m_Descriptor);
}
else if (IoStack->Parameters.DeviceIoControl.IoControlCode ==
IOCTL_KS_RESET_STATE)
{
@@ -1120,7 +1157,6 @@
PKSDATAFORMAT DataFormat;
PDEVICE_OBJECT DeviceObject;
BOOLEAN Capture;
- PVOID SilenceBuffer;
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
//IDrmAudioStream * DrmAudio = NULL;
@@ -1179,7 +1215,6 @@
#endif
DPRINT1("CPortPinWaveCyclic::Init Status %x PinId %u Capture %u\n", Status,
ConnectDetails->PinId, Capture);
- DPRINT1("Bits %u Samples %u Channels %u Tag %u FrameSize %u\n",
((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wBitsPerSample,
((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nSamplesPerSec,
((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nChannels,
((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wFormatTag, m_FrameSize);
if (!NT_SUCCESS(Status))
return Status;
@@ -1203,18 +1238,26 @@
InitializeListHead(&m_EventList);
KeInitializeSpinLock(&m_EventListLock);
- /* set up subdevice descriptor */
- RtlZeroMemory(&m_Descriptor, sizeof(SUBDEVICE_DESCRIPTOR));
- m_Descriptor.FilterPropertySet = PinWaveCyclicPropertySet;
- m_Descriptor.FilterPropertySetCount = sizeof(PinWaveCyclicPropertySet) /
sizeof(KSPROPERTY_SET);
- m_Descriptor.UnknownStream = (PUNKNOWN)m_Stream;
- m_Descriptor.DeviceDescriptor = SubDeviceDescriptor->DeviceDescriptor;
- m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
- m_Descriptor.PortPin = (PVOID)this;
- m_Descriptor.EventSetCount = sizeof(PinWaveCyclicEventSet) / sizeof(KSEVENT_SET);
- m_Descriptor.EventSet = PinWaveCyclicEventSet;
- m_Descriptor.EventList = &m_EventList;
- m_Descriptor.EventListLock = &m_EventListLock;
+ Status = PcCreateSubdeviceDescriptor(&m_Descriptor,
+ SubDeviceDescriptor->InterfaceCount,
+ SubDeviceDescriptor->Interfaces,
+ 0, /* FIXME KSINTERFACE_STANDARD with
KSINTERFACE_STANDARD_STREAMING / KSINTERFACE_STANDARD_LOOPED_STREAMING */
+ NULL,
+ sizeof(PinWaveCyclicPropertySet) /
sizeof(KSPROPERTY_SET),
+ PinWaveCyclicPropertySet,
+ 0,
+ 0,
+ 0,
+ NULL,
+ sizeof(PinWaveCyclicEventSet) /
sizeof(KSEVENT_SET),
+ PinWaveCyclicEventSet,
+ SubDeviceDescriptor->DeviceDescriptor);
+
+ m_Descriptor->UnknownStream = (PUNKNOWN)m_Stream;
+ m_Descriptor->UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
+ m_Descriptor->PortPin = (PVOID)this;
+ m_Descriptor->EventList = &m_EventList;
+ m_Descriptor->EventListLock = &m_EventListLock;
// initialize reset state
m_ResetState = KSRESET_END;
@@ -1247,9 +1290,7 @@
PC_ASSERT(NT_SUCCESS(Status));
PC_ASSERT(m_FrameSize);
- SilenceBuffer = AllocateItem(NonPagedPool, m_FrameSize, TAG_PORTCLASS);
- if (!SilenceBuffer)
- return STATUS_INSUFFICIENT_RESOURCES;
+ DPRINT1("Bits %u Samples %u Channels %u Tag %u FrameSize %u CommonBufferSize
%lu\n", ((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wBitsPerSample,
((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nSamplesPerSec,
((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.nChannels,
((PKSDATAFORMAT_WAVEFORMATEX)(DataFormat))->WaveFormatEx.wFormatTag, m_FrameSize,
m_CommonBufferSize);
/* set up allocator framing */
@@ -1260,10 +1301,9 @@
m_AllocatorFraming.Reserved = 0;
m_AllocatorFraming.FrameSize = m_FrameSize;
- m_Stream->Silence(SilenceBuffer, m_FrameSize);
m_Stream->Silence(m_CommonBuffer, m_CommonBufferSize);
- Status = m_IrpQueue->Init(ConnectDetails, m_FrameSize, 0, SilenceBuffer);
+ Status = m_IrpQueue->Init(ConnectDetails, m_FrameSize, 0);
if (!NT_SUCCESS(Status))
{
m_IrpQueue->Release();
@@ -1282,9 +1322,6 @@
m_Port = Port;
m_Filter = Filter;
- //DPRINT("Setting state to acquire %x\n",
m_Stream->SetState(KSSTATE_ACQUIRE));
- //DPRINT("Setting state to pause %x\n",
m_Stream->SetState(KSSTATE_PAUSE));
-
return STATUS_SUCCESS;
}
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
[iso-8859-1] (original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
[iso-8859-1] Mon Oct 25 15:26:06 2010
@@ -919,7 +919,7 @@
}
// initialize irp queue
- Status = m_IrpQueue->Init(ConnectDetails, m_AllocatorFraming.FrameSize,
m_AllocatorFraming.FileAlignment, NULL);
+ Status = m_IrpQueue->Init(ConnectDetails, m_AllocatorFraming.FrameSize,
m_AllocatorFraming.FileAlignment);
if (!NT_SUCCESS(Status))
{
// this should never happen
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp
[iso-8859-1] (original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp
[iso-8859-1] Mon Oct 25 15:26:06 2010
@@ -587,7 +587,7 @@
goto cleanup;
}
- Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL);
+ Status = m_IrpQueue->Init(ConnectDetails, 0, 0);
if (!NT_SUCCESS(Status))
{
goto cleanup;
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/private.hpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/private.hpp [iso-8859-1]
(original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/private.hpp [iso-8859-1]
Mon Oct 25 15:26:06 2010
@@ -354,6 +354,22 @@
PropPositionHandler)\
DEFINE_KSPROPERTY_TABLE(PinSet) {\
DEFINE_KSPROPERTY_ITEM_AUDIO_POSITION(PropPositionHandler, PropPositionHandler)\
+}
+
+
+#define DEFINE_KSPROPERTY_ITEM_DRMAUDIOSTREAM_CONTENTID(SetHandler)\
+ DEFINE_KSPROPERTY_ITEM(\
+ KSPROPERTY_DRMAUDIOSTREAM_CONTENTID,\
+ NULL,\
+ sizeof(KSPROPERTY),\
+ sizeof(ULONG),\
+ (SetHandler),\
+ NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_DRMSET(PinSet,\
+ PropPositionHandler)\
+DEFINE_KSPROPERTY_TABLE(PinSet) {\
+ DEFINE_KSPROPERTY_ITEM_DRMAUDIOSTREAM_CONTENTID(PropPositionHandler)\
}
#define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
Modified: branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/undoc.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/drivers/wdm/au…
==============================================================================
--- branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/undoc.cpp [iso-8859-1]
(original)
+++ branches/reactos-yarotows/drivers/wdm/audio/backpln/portcls/undoc.cpp [iso-8859-1] Mon
Oct 25 15:26:06 2010
@@ -8,22 +8,6 @@
#include "private.hpp"
-
-KSPIN_INTERFACE PinInterfaces[] =
-{
- {
- {STATIC_KSINTERFACESETID_Standard},
- KSINTERFACE_STANDARD_STREAMING,
- 0
- },
- {
- {STATIC_KSINTERFACESETID_Standard},
- KSINTERFACE_STANDARD_LOOPED_STREAMING,
- 0
- }
-};
-
-
NTSTATUS
NTAPI
KsoDispatchCreateWithGenericFactory(
@@ -84,274 +68,6 @@
// FIXME seh probing
return KsDisableEvent(Irp, Descriptor->EventList, KSEVENTS_SPINLOCK,
(PVOID)Descriptor->EventListLock);
-}
-
-NTSTATUS
-PcHandleGuidNullRequest(
- IN OUT PIRP Irp,
- IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor)
-{
- PPCNODE_DESCRIPTOR Node;
- PPCPROPERTY_ITEM PropertyItem;
- PIO_STACK_LOCATION IoStack;
- PKSP_NODE Property;
- LPGUID Buffer;
- ULONG Count = 0, SubIndex, Index;
-
- // get current irp stack location
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
-
- // access property
- Property = (PKSP_NODE)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
-
- if (Property->NodeId >=
SubDeviceDescriptor->DeviceDescriptor->NodeCount)
- {
- // request is out of bounds
- Irp->IoStatus.Information = 0;
- return STATUS_INVALID_PARAMETER;
- }
-
- Node =
(PPCNODE_DESCRIPTOR)((ULONG_PTR)SubDeviceDescriptor->DeviceDescriptor->Nodes +
(Property->NodeId * SubDeviceDescriptor->DeviceDescriptor->NodeSize));
-
- if (!Node->AutomationTable)
- {
- // request is out of bounds
- Irp->IoStatus.Information = 0;
- return STATUS_INVALID_PARAMETER;
- }
-
- PC_ASSERT(Node->AutomationTable);
- PC_ASSERT(Node->AutomationTable->PropertyCount);
- PC_ASSERT(Node->AutomationTable->PropertyItemSize);
-
- Buffer = (LPGUID)AllocateItem(NonPagedPool, sizeof (GUID) *
Node->AutomationTable->PropertyCount, TAG_PORTCLASS);
- if (!Buffer)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- PropertyItem = (PCPROPERTY_ITEM*)Node->AutomationTable->Properties;
- for (Index = 0; Index < Node->AutomationTable->PropertyCount; Index++)
- {
- BOOL Found = FALSE;
- for (SubIndex = 0; SubIndex < Count; SubIndex++)
- {
- if (IsEqualGUIDAligned(Buffer[SubIndex], *PropertyItem->Set))
- {
- Found = TRUE;
- break;
- }
- }
- if (!Found)
- {
- RtlMoveMemory(&Buffer[Count], PropertyItem->Set, sizeof (GUID));
- Count++;
- }
- PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem +
Node->AutomationTable->PropertyItemSize);
- }
-
- // store result length
- Irp->IoStatus.Information = sizeof (GUID) * Count;
- if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof (GUID) *
Count)
- {
- // buffer too small
- FreeItem(Buffer, TAG_PORTCLASS);
- return STATUS_MORE_ENTRIES;
- }
-
- RtlMoveMemory(Irp->UserBuffer, Buffer, sizeof (GUID) * Count);
- FreeItem(Buffer, TAG_PORTCLASS);
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-PcFindNodePropertyHandler(
- PIRP Irp,
- PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor,
- OUT PPCPROPERTY_ITEM * OutPropertyItem)
-{
- PPCNODE_DESCRIPTOR Node;
- PPCPROPERTY_ITEM PropertyItem;
- PIO_STACK_LOCATION IoStack;
- PKSP_NODE Property;
- ULONG Index;
-
- // get current irp stack location
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- // access property
- Property = (PKSP_NODE)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
-
- if (Property->NodeId >=
SubDeviceDescriptor->DeviceDescriptor->NodeCount)
- {
- // request is out of bounds
- DPRINT("InvalidIndex %u %u\n", Property->NodeId,
SubDeviceDescriptor->DeviceDescriptor->NodeCount);
- return STATUS_INVALID_PARAMETER;
- }
-
- Node =
(PPCNODE_DESCRIPTOR)((ULONG_PTR)SubDeviceDescriptor->DeviceDescriptor->Nodes +
(Property->NodeId * SubDeviceDescriptor->DeviceDescriptor->NodeSize));
-
- if (!Node->AutomationTable)
- {
- // request is out of bounds
- Irp->IoStatus.Information = 0;
- return STATUS_NOT_FOUND;
- }
-
- // sanity checks
- PC_ASSERT(Node->AutomationTable);
- PC_ASSERT(Node->AutomationTable->PropertyCount);
- PC_ASSERT(Node->AutomationTable->PropertyItemSize);
-
- PropertyItem = (PCPROPERTY_ITEM*)Node->AutomationTable->Properties;
-
- DPRINT("NodeId %u PropertyCount %u\n", Property->NodeId,
Node->AutomationTable->PropertyCount);
- for(Index = 0; Index < Node->AutomationTable->PropertyCount; Index++)
- {
- if (IsEqualGUIDAligned(*PropertyItem->Set, Property->Property.Set)
&& PropertyItem->Id == Property->Property.Id)
- {
- //found property handler
- *OutPropertyItem = PropertyItem;
- return STATUS_SUCCESS;
- }
- PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem +
Node->AutomationTable->PropertyItemSize);
- }
-
- // no handler yet found
- DPRINT("NotFound\n");
- return STATUS_NOT_FOUND;
-}
-
-NTSTATUS
-PcNodeBasicSupportHandler(
- PIRP Irp,
- PPCPROPERTY_ITEM PropertyItem)
-{
- PULONG Flags;
- PIO_STACK_LOCATION IoStack;
- PKSPROPERTY_DESCRIPTION Description;
- PKSP_NODE Property;
-
- // get current irp stack location
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- // access property
- Property = (PKSP_NODE)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
-
- PC_ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength >=
sizeof(ULONG));
- Flags= (PULONG)Irp->UserBuffer;
-
- // reset flags
- *Flags = 0;
-
- if (PropertyItem->Flags & KSPROPERTY_TYPE_SET)
- *Flags |= KSPROPERTY_TYPE_SET;
-
- if (PropertyItem->Flags & KSPROPERTY_TYPE_GET)
- *Flags |= KSPROPERTY_TYPE_GET;
-
- // store result length
- Irp->IoStatus.Information = sizeof(ULONG);
-
- if (IoStack->Parameters.DeviceIoControl.OutputBufferLength >=
sizeof(KSPROPERTY_DESCRIPTION))
- {
- // get output buffer
- Description = (PKSPROPERTY_DESCRIPTION)Irp->UserBuffer;
-
- // 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;
-
- Irp->IoStatus.Information = sizeof(KSPROPERTY_DESCRIPTION);
- }
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-PcHandleNodePropertyRequest(
- PIRP Irp,
- IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor)
-{
- PIO_STACK_LOCATION IoStack;
- PPCPROPERTY_ITEM PropertyItem;
- PPCPROPERTY_REQUEST PropertyRequest;
- PKSP_NODE Property;
- NTSTATUS Status;
-
- // get current irp stack location
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSP_NODE))
- {
- // certainly not a node property request
- return STATUS_NOT_FOUND;
- }
-
- // access property
- Property = (PKSP_NODE)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
-
- if (IsEqualGUIDAligned(Property->Property.Set, GUID_NULL) &&
Property->Property.Id == 0 && Property->Property.Flags ==
(KSPROPERTY_TYPE_SETSUPPORT | KSPROPERTY_TYPE_TOPOLOGY))
- {
- return PcHandleGuidNullRequest(Irp, SubDeviceDescriptor);
- }
-
- // find property handler
- Status = PcFindNodePropertyHandler(Irp, SubDeviceDescriptor, &PropertyItem);
-
- // check for success
- if (!NT_SUCCESS(Status))
- {
- // might not be a node property request
- DPRINT("NotFound\n");
- return STATUS_NOT_FOUND;
- }
-
- if (Property->Property.Flags & KSPROPERTY_TYPE_BASICSUPPORT)
- {
- // caller issued a basic property request
- if (!(PropertyItem->Flags & KSPROPERTY_TYPE_BASICSUPPORT))
- {
- // driver does not have a basic support handler
- return PcNodeBasicSupportHandler(Irp, PropertyItem);
- }
- }
-
- // sanity check
- PC_ASSERT(SubDeviceDescriptor->UnknownMiniport);
-
- // allocate a property request
- PropertyRequest = (PPCPROPERTY_REQUEST)AllocateItem(NonPagedPool,
sizeof(PCPROPERTY_REQUEST), TAG_PORTCLASS);
- if (!PropertyRequest)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- // initialize property request
- PropertyRequest->MajorTarget = SubDeviceDescriptor->UnknownMiniport;
- PropertyRequest->MinorTarget = SubDeviceDescriptor->UnknownStream;
- PropertyRequest->Irp = Irp;
- PropertyRequest->Node = Property->NodeId;
- PropertyRequest->PropertyItem = PropertyItem;
- PropertyRequest->Verb = Property->Property.Flags;
- PropertyRequest->InstanceSize =
IoStack->Parameters.DeviceIoControl.InputBufferLength - sizeof(KSNODEPROPERTY);
- PropertyRequest->Instance =
(PVOID)((ULONG_PTR)IoStack->Parameters.DeviceIoControl.Type3InputBuffer +
sizeof(KSNODEPROPERTY));
- PropertyRequest->ValueSize =
IoStack->Parameters.DeviceIoControl.OutputBufferLength;
- PropertyRequest->Value = Irp->UserBuffer;
-
- Status = PropertyItem->Handler(PropertyRequest);
-
- if (Status != STATUS_PENDING)
- {
- //request completed
- Irp->IoStatus.Information = PropertyRequest->ValueSize;
- FreeItem(PropertyRequest, TAG_PORTCLASS);
- }
-
- // done
- DPRINT("Status %x\n", Status);
- return Status;
}
NTSTATUS
@@ -362,21 +78,22 @@
IN PKSPROPERTY_SET PropertySet,
IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor)
{
- NTSTATUS Status;
-
- // try handle it as node property request
- Status = PcHandleNodePropertyRequest(Irp, SubDeviceDescriptor);
-
- if (Status == STATUS_NOT_FOUND)
- {
- // store device descriptor
- KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (PKSPROPERTY_ITEM)SubDeviceDescriptor;
-
- /* then try KsPropertyHandler */
- Status = KsPropertyHandler(Irp, PropertySetCount, PropertySet);
- }
-
- return Status;
+ PIO_STACK_LOCATION IoStack;
+
+ // get current irp stack location
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->Parameters.DeviceIoControl.InputBufferLength <
sizeof(KSPROPERTY))
+ {
+ // certainly an invalid request
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ // store device descriptor
+ KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (PKSPROPERTY_ITEM)SubDeviceDescriptor;
+
+ // then try KsPropertyHandler
+ return KsPropertyHandler(Irp, PropertySetCount, PropertySet);
}
VOID
@@ -406,15 +123,377 @@
}
NTSTATUS
+NTAPI
+PropertyItemDispatch(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data)
+{
+ PPCPROPERTY_REQUEST PropertyRequest;
+ PSUBDEVICE_DESCRIPTOR Descriptor;
+ PKSPROPERTY Property;
+ PPCNODE_DESCRIPTOR NodeDescriptor;
+ PKSNODEPROPERTY NodeProperty;
+ PKSPROPERTY_SET PropertySet;
+ PPCPROPERTY_ITEM PropertyItem;
+ PPCAUTOMATION_TABLE NodeAutomation;
+ PIO_STACK_LOCATION IoStack;
+ ULONG InstanceSize, ValueSize, Index;
+ PVOID Instance;
+ NTSTATUS Status;
+
+ // allocate a property request
+ PropertyRequest = (PPCPROPERTY_REQUEST)AllocateItem(NonPagedPool,
sizeof(PCPROPERTY_REQUEST), TAG_PORTCLASS);
+ if (!PropertyRequest)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ // grab device descriptor
+ Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
+
+ // get current irp stack
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ // get input property request
+ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
+
+ // get property set
+ PropertySet = (PKSPROPERTY_SET)KSPROPERTY_SET_IRP_STORAGE(Irp);
+
+ // sanity check
+ PC_ASSERT(Descriptor);
+ PC_ASSERT(Descriptor->UnknownMiniport);
+
+ // get instance / value size
+ InstanceSize = IoStack->Parameters.DeviceIoControl.InputBufferLength;
+ Instance = Data;
+ ValueSize = IoStack->Parameters.DeviceIoControl.OutputBufferLength;
+
+ // initialize property request
+ PropertyRequest->MajorTarget = Descriptor->UnknownMiniport;
+ PropertyRequest->MinorTarget = Descriptor->UnknownStream;
+ PropertyRequest->Irp = Irp;
+ PropertyRequest->Verb = Property->Flags;
+
+
+ // check if this is filter / pin property request
+ if (!(Property->Flags & KSPROPERTY_TYPE_TOPOLOGY))
+ {
+ // adjust input buffer size
+ InstanceSize -= sizeof(KSPROPERTY);
+ Instance = (PVOID)((ULONG_PTR)Instance + sizeof(KSPROPERTY));
+
+ // filter / pin property request dont use node field
+ PropertyRequest->Node = MAXULONG;
+ }
+ else if (InstanceSize >= sizeof(KSNODEPROPERTY))
+ {
+ // request is for a node
+ InstanceSize -= sizeof(KSNODEPROPERTY);
+ Instance = (PVOID)((ULONG_PTR)Instance + sizeof(KSNODEPROPERTY));
+
+ // cast node property request
+ NodeProperty = (PKSNODEPROPERTY)Request;
+
+ // store node id
+ PropertyRequest->Node = NodeProperty->NodeId;
+ }
+ else
+ {
+ // invalid buffer size
+ return STATUS_INVALID_BUFFER_SIZE;
+ }
+
+ // store instance size
+ PropertyRequest->InstanceSize = InstanceSize;
+ PropertyRequest->Instance = (InstanceSize != 0 ? Instance : NULL);
+
+ // store value size
+ PropertyRequest->ValueSize = ValueSize;
+ PropertyRequest->Value = (ValueSize != 0 ? Irp->UserBuffer : NULL);
+
+ // now scan the property set for the attached property set item stored in Relations
member
+ if (PropertySet)
+ {
+ // sanity check
+ PC_ASSERT(IsEqualGUIDAligned(Property->Set, *PropertySet->Set));
+
+ for(Index = 0; Index < PropertySet->PropertiesCount; Index++)
+ {
+ // check if they got the same property id
+ if (PropertySet->PropertyItem[Index].PropertyId == Property->Id)
+ {
+ // found item
+ PropertyRequest->PropertyItem = (const
PCPROPERTY_ITEM*)PropertySet->PropertyItem[Index].Relations;
+
+ // done
+ break;
+ }
+ }
+ }
+
+ // check if there has been a property set item attached
+ if (!PropertyRequest->PropertyItem)
+ {
+ // is topology node id valid
+ if (PropertyRequest->Node < Descriptor->DeviceDescriptor->NodeCount)
+ {
+ // get node descriptor
+ NodeDescriptor = (PPCNODE_DESCRIPTOR)
((ULONG_PTR)Descriptor->DeviceDescriptor->Nodes + PropertyRequest->Node *
Descriptor->DeviceDescriptor->NodeSize);
+
+ // get node automation table
+ NodeAutomation = (PPCAUTOMATION_TABLE)NodeDescriptor->AutomationTable;
+
+ // has it got a automation table
+ if (NodeAutomation)
+ {
+ // now scan the properties and check if it supports this request
+ PropertyItem = (PPCPROPERTY_ITEM)NodeAutomation->Properties;
+ for(Index = 0; Index < NodeAutomation->PropertyCount; Index++)
+ {
+ // are they same property
+ if (IsEqualGUIDAligned(*PropertyItem->Set, Property->Set))
+ {
+ if (PropertyItem->Id == Property->Id)
+ {
+ // found match
+ PropertyRequest->PropertyItem = PropertyItem;
+
+ // done
+ break;
+ }
+ }
+
+ // move to next property item
+ PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem +
NodeAutomation->PropertyItemSize);
+ }
+ }
+ }
+ }
+
+ if (PropertyRequest->PropertyItem &&
PropertyRequest->PropertyItem->Handler)
+ {
+ // now call the handler
+ UNICODE_STRING GuidBuffer;
+ RtlStringFromGUID(Property->Set, &GuidBuffer);
+ DPRINT1("Calling Node %lu MajorTarget %p MinorTarget %p PropertySet %S
PropertyId %lu PropertyFlags %lx InstanceSize %lu ValueSize %lu Handler %p PropertyRequest
%p\n",
+ PropertyRequest->Node, PropertyRequest->MajorTarget,
PropertyRequest->MinorTarget, GuidBuffer.Buffer, Property->Id, Property->Flags,
PropertyRequest->InstanceSize, PropertyRequest->ValueSize,
+ PropertyRequest->PropertyItem->Handler, PropertyRequest);
+ Status = PropertyRequest->PropertyItem->Handler(PropertyRequest);
+
+ Irp->IoStatus.Information = PropertyRequest->ValueSize;
+
+ if (Status != STATUS_PENDING)
+ {
+ // free property request
+ FreeItem(PropertyRequest, TAG_PORTCLASS);
+ }
+ }
+ else
+ {
+ FreeItem(PropertyRequest, TAG_PORTCLASS);
+ Status = STATUS_NOT_FOUND;
+ }
+
+ /* done */
+ return Status;
+}
+
+NTSTATUS
PcAddToPropertyTable(
- PVOID Ptr,
- LONG Unknown,
- LONG Unknown2,
- LONG Unknown3,
- CHAR Unknown4)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor,
+ IN PPCPROPERTY_ITEM PropertyItem,
+ IN ULONG bNode)
+{
+ ULONG bFound = FALSE;
+ ULONG Index, PropertySetIndex, PropertySetItemIndex;
+ PKSPROPERTY_SET NewPropertySet;
+ PKSPROPERTY_ITEM FilterPropertyItem, NewFilterPropertyItem;
+ LPGUID Guid;
+ //UNICODE_STRING GuidBuffer;
+
+ASSERT(PropertyItem->Set);
+ // RtlStringFromGUID(*PropertyItem->Set, &GuidBuffer);
+ // DPRINT1("PcAddToPropertyTable Adding Item Set %S Id %lu Flags %lx\n",
GuidBuffer.Buffer, PropertyItem->Id, PropertyItem->Flags);
+
+
+
+ //DPRINT1("FilterPropertySetCount %lu\n",
SubDeviceDescriptor->FilterPropertySetCount);
+ // first step check if the property set is present already
+ for(Index = 0; Index < SubDeviceDescriptor->FilterPropertySetCount; Index++)
+ {
+
+ //RtlStringFromGUID(*SubDeviceDescriptor->FilterPropertySet[Index].Set,
&GuidBuffer);
+ //DPRINT1("FilterProperty Set %S PropertyCount %lu\n",
GuidBuffer.Buffer, SubDeviceDescriptor->FilterPropertySet[Index].PropertiesCount);
+ if (IsEqualGUIDAligned(*SubDeviceDescriptor->FilterPropertySet[Index].Set,
*PropertyItem->Set))
+ {
+ // property set is already present
+ bFound = TRUE;
+ PropertySetIndex = Index;
+
+ // break out
+ break;
+ }
+ }
+
+ // is the property set present
+ if (!bFound)
+ {
+ // need to allocate a property set
+ NewPropertySet = (PKSPROPERTY_SET)AllocateItem(NonPagedPool,
(SubDeviceDescriptor->FilterPropertySetCount + 1) * sizeof(KSPROPERTY_SET),
TAG_PORTCLASS);
+ if (!NewPropertySet)
+ {
+ // out of memory
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ // need to allocate property set guid
+ Guid = (LPGUID)AllocateItem(NonPagedPool, sizeof(GUID), TAG_PORTCLASS);
+ if (!Guid)
+ {
+ // out of memory
+ FreeItem(NewPropertySet, TAG_PORTCLASS);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ // are any existing property sets
+ if (SubDeviceDescriptor->FilterPropertySetCount)
+ {
+ // copy property sets
+ RtlMoveMemory(NewPropertySet, SubDeviceDescriptor->FilterPropertySet,
SubDeviceDescriptor->FilterPropertySetCount * sizeof(KSPROPERTY_SET));
+
+ // release memory
+ FreeItem(SubDeviceDescriptor->FilterPropertySet, TAG_PORTCLASS);
+ }
+
+ // store new property set descriptors
+ SubDeviceDescriptor->FilterPropertySet = NewPropertySet;
+
+ // store index
+ PropertySetIndex = SubDeviceDescriptor->FilterPropertySetCount;
+
+ // increment property set count
+ SubDeviceDescriptor->FilterPropertySetCount++;
+
+ // copy property guid
+ RtlMoveMemory(Guid, PropertyItem->Set, sizeof(GUID));
+
+ // initialize property set
+ SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].Set = Guid;
+ SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertiesCount = 0;
+ }
+
+ // as the property set has been indentified, now search for duplicate property set
item entries
+ FilterPropertyItem =
(PKSPROPERTY_ITEM)SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertyItem;
+ bFound = FALSE;
+
+ for(Index = 0; Index <
SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertiesCount; Index++)
+ {
+ // now search for an equal property set item
+ if (FilterPropertyItem->PropertyId == PropertyItem->Id)
+ {
+ // found existing property set item
+ bFound = TRUE;
+ PropertySetItemIndex = Index;
+ break;
+ }
+
+ // move to next entry
+ FilterPropertyItem++;
+ }
+
+ if (!bFound)
+ {
+ // need to allocate memory for new property set item
+ NewFilterPropertyItem = (PKSPROPERTY_ITEM)AllocateItem(NonPagedPool,
(SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertiesCount + 1) *
sizeof(KSPROPERTY_ITEM), TAG_PORTCLASS);
+ if (!NewFilterPropertyItem)
+ {
+ // out of memory
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ // are any existing property set items
+ if (SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertiesCount)
+ {
+ // copy property item sets
+ RtlMoveMemory(NewFilterPropertyItem,
+
(PVOID)SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertyItem,
+
SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertiesCount *
sizeof(KSPROPERTY_ITEM));
+
+ // release old descriptors
+
FreeItem((PVOID)SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertyItem,
TAG_PORTCLASS);
+ }
+
+ // store new descriptor
+ SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertyItem =
NewFilterPropertyItem;
+
+ // store index
+ PropertySetItemIndex =
SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertiesCount;
+
+ // increment property item set count
+ SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertiesCount++;
+
+ // now initialize property item
+ FilterPropertyItem =
(PKSPROPERTY_ITEM)&SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertyItem[PropertySetItemIndex];
+ FilterPropertyItem->PropertyId = PropertyItem->Id;
+ FilterPropertyItem->MinProperty = sizeof(KSPROPERTY);
+ FilterPropertyItem->MinData = 0;
+
+ // are any set operations supported
+ if (PropertyItem->Flags & PCPROPERTY_ITEM_FLAG_SET)
+ {
+ // setup handler
+ FilterPropertyItem->SetPropertyHandler = PropertyItemDispatch;
+ }
+
+ // are set operation supported
+ if (PropertyItem->Flags & PCPROPERTY_ITEM_FLAG_GET)
+ {
+ // setup handler
+ FilterPropertyItem->GetPropertyHandler = PropertyItemDispatch;
+ }
+
+ // are get operations supported
+ if (PropertyItem->Flags & PCPROPERTY_ITEM_FLAG_GET)
+ {
+ // setup handler
+ FilterPropertyItem->GetPropertyHandler = PropertyItemDispatch;
+ }
+
+ // are basic support operations supported
+ if (PropertyItem->Flags & PCPROPERTY_ITEM_FLAG_BASICSUPPORT)
+ {
+ // setup handler
+ FilterPropertyItem->SupportHandler = PropertyItemDispatch;
+ }
+
+ if (!bNode)
+ {
+ // store property item in relations
+ // only store property item of filter properties / pin properties
+ // because filter & pin properties do not require a specific context
+ // on the other hand node properties are specifically bound to a node
+
+ FilterPropertyItem->Relations = (const KSPROPERTY*)PropertyItem;
+ }
+ }
+ else
+ {
+ // property set item handler already present
+
+ if (bNode)
+ {
+ // filter & pin properties should not be exposed on a node
+
ASSERT(SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertyItem[PropertySetItemIndex].Relations
== NULL);
+ }
+ else
+ {
+ // node properties should not be exposed on a filter & pin
+
ASSERT(SubDeviceDescriptor->FilterPropertySet[PropertySetIndex].PropertyItem[PropertySetItemIndex].Relations
!= NULL);
+ }
+ }
+
+ // done
+ return STATUS_SUCCESS;
}
NTSTATUS
@@ -491,6 +570,15 @@
EventItem = (PPCEVENT_ITEM)((ULONG_PTR)EventItem +
NodeDescriptor->AutomationTable->EventItemSize);
}
+ DPRINT1(" Index %u PropertyCount %u\n", Index,
NodeDescriptor->AutomationTable->PropertyCount);
+ PropertyItem =
(PPCPROPERTY_ITEM)NodeDescriptor->AutomationTable->Properties;
+ for(SubIndex = 0; SubIndex <
NodeDescriptor->AutomationTable->PropertyCount; SubIndex++)
+ {
+ RtlStringFromGUID(*PropertyItem->Set, &GuidString);
+ DPRINT1(" PropertyIndex %u GUID %S Id %u Flags %x\n",
SubIndex, GuidString.Buffer, PropertyItem->Id, PropertyItem->Flags);
+
+ PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem +
NodeDescriptor->AutomationTable->PropertyItemSize);
+ }
}
@@ -539,10 +627,13 @@
IN PPCFILTER_DESCRIPTOR FilterDescription)
{
SUBDEVICE_DESCRIPTOR * Descriptor;
- ULONG Index;
+ ULONG Index, SubIndex;
NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES;
PPCPIN_DESCRIPTOR SrcDescriptor;
-
+ PPCNODE_DESCRIPTOR NodeDescriptor;
+ PPCPROPERTY_ITEM PropertyItem;
+
+ // allocate subdevice descriptor
Descriptor = (PSUBDEVICE_DESCRIPTOR)AllocateItem(NonPagedPool,
sizeof(SUBDEVICE_DESCRIPTOR), TAG_PORTCLASS);
if (!Descriptor)
return STATUS_INSUFFICIENT_RESOURCES;
@@ -551,6 +642,7 @@
InitializeListHead(&Descriptor->SymbolicLinkList);
InitializeListHead(&Descriptor->PhysicalConnectionList);
+ //FIXME add driver category guids
Descriptor->Interfaces = (GUID*)AllocateItem(NonPagedPool, sizeof(GUID) *
InterfaceCount, TAG_PORTCLASS);
if (!Descriptor->Interfaces)
goto cleanup;
@@ -559,98 +651,215 @@
RtlCopyMemory(Descriptor->Interfaces, InterfaceGuids, sizeof(GUID) *
InterfaceCount);
Descriptor->InterfaceCount = InterfaceCount;
+ //DumpFilterDescriptor(FilterDescription);
+
+ // are any property sets supported by the portcls
if (FilterPropertiesCount)
{
- /// FIXME
- /// handle driver properties
-
- DumpFilterDescriptor(FilterDescription);
-
+ // first allocate filter properties set
Descriptor->FilterPropertySet = (PKSPROPERTY_SET)AllocateItem(NonPagedPool,
sizeof(KSPROPERTY_SET) * FilterPropertiesCount, TAG_PORTCLASS);
if (! Descriptor->FilterPropertySet)
goto cleanup;
+ // now copy all filter property sets
Descriptor->FilterPropertySetCount = FilterPropertiesCount;
for(Index = 0; Index < FilterPropertiesCount; Index++)
{
+ // copy property set
RtlMoveMemory(&Descriptor->FilterPropertySet[Index],
&FilterProperties[Index], sizeof(KSPROPERTY_SET));
+
+ if (Descriptor->FilterPropertySet[Index].PropertiesCount)
+ {
+ // copy property items to make sure they are dynamically allocated
+ Descriptor->FilterPropertySet[Index].PropertyItem =
(PKSPROPERTY_ITEM)AllocateItem(NonPagedPool, FilterProperties[Index].PropertiesCount *
sizeof(KSPROPERTY_ITEM), TAG_PORTCLASS);
+ if (!Descriptor->FilterPropertySet[Index].PropertyItem)
+ {
+ // no memory
+ goto cleanup;
+ }
+
+ // copy filter property items
+ RtlMoveMemory((PVOID)Descriptor->FilterPropertySet[Index].PropertyItem,
FilterProperties[Index].PropertyItem, FilterProperties[Index].PropertiesCount *
sizeof(KSPROPERTY_ITEM));
+ }
}
}
- Descriptor->Topology = (PKSTOPOLOGY)AllocateItem(NonPagedPool, sizeof(KSTOPOLOGY),
TAG_PORTCLASS);
- if (!Descriptor->Topology)
- goto cleanup;
-
- if (FilterDescription->ConnectionCount)
- {
- Descriptor->Topology->TopologyConnections =
(PKSTOPOLOGY_CONNECTION)AllocateItem(NonPagedPool, sizeof(KSTOPOLOGY_CONNECTION) *
FilterDescription->ConnectionCount, TAG_PORTCLASS);
- if (!Descriptor->Topology->TopologyConnections)
- goto cleanup;
-
- RtlMoveMemory((PVOID)Descriptor->Topology->TopologyConnections,
FilterDescription->Connections, FilterDescription->ConnectionCount *
sizeof(PCCONNECTION_DESCRIPTOR));
- Descriptor->Topology->TopologyConnectionsCount =
FilterDescription->ConnectionCount;
- }
-
- if (FilterDescription->NodeCount)
- {
- Descriptor->Topology->TopologyNodes = (const GUID
*)AllocateItem(NonPagedPool, sizeof(GUID) * FilterDescription->NodeCount,
TAG_PORTCLASS);
- if (!Descriptor->Topology->TopologyNodes)
- goto cleanup;
-
- Descriptor->Topology->TopologyNodesNames = (const GUID
*)AllocateItem(NonPagedPool, sizeof(GUID) * FilterDescription->NodeCount,
TAG_PORTCLASS);
- if (!Descriptor->Topology->TopologyNodesNames)
- goto cleanup;
-
- for(Index = 0; Index < FilterDescription->NodeCount; Index++)
- {
- if (FilterDescription->Nodes[Index].Type)
- {
-
RtlMoveMemory((PVOID)&Descriptor->Topology->TopologyNodes[Index],
FilterDescription->Nodes[Index].Type, sizeof(GUID));
- }
- if (FilterDescription->Nodes[Index].Name)
- {
-
RtlMoveMemory((PVOID)&Descriptor->Topology->TopologyNodesNames[Index],
FilterDescription->Nodes[Index].Name, sizeof(GUID));
- }
- }
- Descriptor->Topology->TopologyNodesCount =
FilterDescription->NodeCount;
- }
-
+ // now check if the filter descriptor supports filter properties
+ if (FilterDescription->AutomationTable)
+ {
+ // get first entry
+ PropertyItem =
(PPCPROPERTY_ITEM)FilterDescription->AutomationTable->Properties;
+
+ // copy driver filter property sets
+ for(Index = 0; Index <
FilterDescription->AutomationTable->PropertyCount; Index++)
+ {
+ // add the property item
+ Status = PcAddToPropertyTable(Descriptor, PropertyItem, FALSE);
+
+ // check for success
+ if (Status != STATUS_SUCCESS)
+ {
+ // goto cleanup
+ goto cleanup;
+ }
+
+ // move to next entry
+ PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem +
FilterDescription->AutomationTable->PropertyItemSize);
+ }
+ }
+
+ // check if the filter has pins
if (FilterDescription->PinCount)
{
+ // allocate pin factory descriptors
Descriptor->Factory.KsPinDescriptor =
(PKSPIN_DESCRIPTOR)AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) *
FilterDescription->PinCount, TAG_PORTCLASS);
if (!Descriptor->Factory.KsPinDescriptor)
goto cleanup;
+ // allocate pin instance info
Descriptor->Factory.Instances = (PPIN_INSTANCE_INFO)AllocateItem(NonPagedPool,
FilterDescription->PinCount * sizeof(PIN_INSTANCE_INFO), TAG_PORTCLASS);
if (!Descriptor->Factory.Instances)
goto cleanup;
+ // initialize pin factory descriptor
Descriptor->Factory.PinDescriptorCount = FilterDescription->PinCount;
Descriptor->Factory.PinDescriptorSize = sizeof(KSPIN_DESCRIPTOR);
+ // grab first entry
SrcDescriptor = (PPCPIN_DESCRIPTOR)FilterDescription->Pins;
- DPRINT("Size %u Expected %u\n", FilterDescription->PinSize,
sizeof(PCPIN_DESCRIPTOR));
// copy pin factories
for(Index = 0; Index < FilterDescription->PinCount; Index++)
{
+ // copy pin descriptor
RtlMoveMemory(&Descriptor->Factory.KsPinDescriptor[Index],
&SrcDescriptor->KsPinDescriptor, sizeof(KSPIN_DESCRIPTOR));
- Descriptor->Factory.KsPinDescriptor[Index].Interfaces = PinInterfaces;
- Descriptor->Factory.KsPinDescriptor[Index].InterfacesCount =
sizeof(PinInterfaces) / sizeof(KSPIN_INTERFACE);
-
- DPRINT("Index %u DataRangeCount %u\n", Index,
SrcDescriptor->KsPinDescriptor.DataRangesCount);
-
+ // initialize pin factory instance data
Descriptor->Factory.Instances[Index].CurrentPinInstanceCount = 0;
Descriptor->Factory.Instances[Index].MaxFilterInstanceCount =
SrcDescriptor->MaxFilterInstanceCount;
Descriptor->Factory.Instances[Index].MaxGlobalInstanceCount =
SrcDescriptor->MaxGlobalInstanceCount;
Descriptor->Factory.Instances[Index].MinFilterInstanceCount =
SrcDescriptor->MinFilterInstanceCount;
+
+ // check if the descriptor has an automation table
+ if (SrcDescriptor->AutomationTable)
+ {
+ // it has, grab first entry
+ PropertyItem =
(PPCPROPERTY_ITEM)SrcDescriptor->AutomationTable->Properties;
+
+ // now add all supported property items
+ for(SubIndex = 0; SubIndex <
SrcDescriptor->AutomationTable->PropertyCount; SubIndex++)
+ {
+ // add the property item to the table
+ Status = PcAddToPropertyTable(Descriptor, PropertyItem, FALSE);
+
+ // check for success
+ if (Status != STATUS_SUCCESS)
+ {
+ // goto cleanup
+ goto cleanup;
+ }
+
+ // move to next entry
+ PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem +
SrcDescriptor->AutomationTable->PropertyItemSize);
+ }
+ }
+
+ // move to next entry
SrcDescriptor = (PPCPIN_DESCRIPTOR)((ULONG_PTR)SrcDescriptor +
FilterDescription->PinSize);
}
}
+ // allocate topology descriptor
+ Descriptor->Topology = (PKSTOPOLOGY)AllocateItem(NonPagedPool, sizeof(KSTOPOLOGY),
TAG_PORTCLASS);
+ if (!Descriptor->Topology)
+ goto cleanup;
+
+ // are there any connections
+ if (FilterDescription->ConnectionCount)
+ {
+ // allocate connection descriptor
+ Descriptor->Topology->TopologyConnections =
(PKSTOPOLOGY_CONNECTION)AllocateItem(NonPagedPool, sizeof(KSTOPOLOGY_CONNECTION) *
FilterDescription->ConnectionCount, TAG_PORTCLASS);
+ if (!Descriptor->Topology->TopologyConnections)
+ goto cleanup;
+
+ // copy connection descriptor
+ RtlMoveMemory((PVOID)Descriptor->Topology->TopologyConnections,
FilterDescription->Connections, FilterDescription->ConnectionCount *
sizeof(PCCONNECTION_DESCRIPTOR));
+
+ // store connection count
+ Descriptor->Topology->TopologyConnectionsCount =
FilterDescription->ConnectionCount;
+ }
+
+ // does the filter have nodes
+ if (FilterDescription->NodeCount)
+ {
+ // allocate topology node types array
+ Descriptor->Topology->TopologyNodes = (const GUID
*)AllocateItem(NonPagedPool, sizeof(GUID) * FilterDescription->NodeCount,
TAG_PORTCLASS);
+ if (!Descriptor->Topology->TopologyNodes)
+ goto cleanup;
+
+ // allocate topology node names array
+ Descriptor->Topology->TopologyNodesNames = (const GUID
*)AllocateItem(NonPagedPool, sizeof(GUID) * FilterDescription->NodeCount,
TAG_PORTCLASS);
+ if (!Descriptor->Topology->TopologyNodesNames)
+ goto cleanup;
+
+ // grab first entry
+ NodeDescriptor = (PPCNODE_DESCRIPTOR)FilterDescription->Nodes;
+
+ // iterate all nodes and copy node types / names and node properties
+ for(Index = 0; Index < FilterDescription->NodeCount; Index++)
+ {
+ // does it have a type
+ if (NodeDescriptor->Type)
+ {
+ // copy node type
+
RtlMoveMemory((PVOID)&Descriptor->Topology->TopologyNodes[Index],
NodeDescriptor->Type, sizeof(GUID));
+ }
+
+ // does it have a node name
+ if (NodeDescriptor->Name)
+ {
+ // copy node name
+
RtlMoveMemory((PVOID)&Descriptor->Topology->TopologyNodesNames[Index],
NodeDescriptor->Name, sizeof(GUID));
+ }
+
+ // check if has an automation table
+ if (NodeDescriptor->AutomationTable)
+ {
+ // grab first entry
+ PropertyItem =
(PPCPROPERTY_ITEM)NodeDescriptor->AutomationTable->Properties;
+
+ // copy all node properties into the global property set
+ for(SubIndex = 0; SubIndex <
NodeDescriptor->AutomationTable->PropertyCount; SubIndex++)
+ {
+ // add to property set
+ Status = PcAddToPropertyTable(Descriptor, PropertyItem, TRUE);
+
+ // check for success
+ if (Status != STATUS_SUCCESS)
+ {
+ // failed
+ goto cleanup;
+ }
+
+ // move to next property item
+ PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem +
NodeDescriptor->AutomationTable->PropertyItemSize);
+ }
+ }
+
+ // move to next descriptor
+ NodeDescriptor = (PPCNODE_DESCRIPTOR)((ULONG_PTR)NodeDescriptor +
FilterDescription->NodeSize);
+ }
+
+ // now store the topology node count
+ Descriptor->Topology->TopologyNodesCount =
FilterDescription->NodeCount;
+ }
+
+ // store descriptor
Descriptor->DeviceDescriptor = FilterDescription;
+
+ // store result
*OutSubdeviceDescriptor = Descriptor;
+ // done
return STATUS_SUCCESS;
cleanup:
Modified: branches/reactos-yarotows/hal/halx86/generic/usage.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/hal/halx86/gen…
==============================================================================
--- branches/reactos-yarotows/hal/halx86/generic/usage.c [iso-8859-1] (original)
+++ branches/reactos-yarotows/hal/halx86/generic/usage.c [iso-8859-1] Mon Oct 25 15:26:06
2010
@@ -235,8 +235,9 @@
if (!HalpGetInfoFromACPI)
{
/* No, so use our local table */
- Port = HalpComPortIrqMapping[0][0];
- for (i = 0; Port; i++)
+ for (i = 0, Port = HalpComPortIrqMapping[i][0];
+ Port;
+ i++, Port = HalpComPortIrqMapping[i][0])
{
/* Is this the port we want? */
if (Port == (ULONG_PTR)KdComPortInUse)
@@ -248,9 +249,6 @@
PRIMARY_VECTOR_BASE,
HIGH_LEVEL);
}
-
- /* Next port */
- Port = HalpComPortIrqMapping[i][0];
}
}
}
@@ -509,6 +507,9 @@
IN PVOID Handler,
IN KINTERRUPT_MODE Mode)
{
+ /* Set the IDT_LATCHED flag for latched interrupts */
+ if (Mode == Latched) Flags |= IDT_LATCHED;
+
/* Register the vector */
HalpRegisterVector(Flags, BusVector, SystemVector, Irql);
Modified: branches/reactos-yarotows/include/psdk/ks.h
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/include/psdk/k…
==============================================================================
--- branches/reactos-yarotows/include/psdk/ks.h [iso-8859-1] (original)
+++ branches/reactos-yarotows/include/psdk/ks.h [iso-8859-1] Mon Oct 25 15:26:06 2010
@@ -1003,11 +1003,6 @@
KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION
KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR
KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY
-*/
-
-#define KSPROPSETID_DrmAudioStream
-/*
- KSPROPERTY_DRMAUDIOSTREAM_CONTENTID
*/
#define KSPROPSETID_Hrtf3d
Modified: branches/reactos-yarotows/include/psdk/ksmedia.h
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/include/psdk/k…
==============================================================================
--- branches/reactos-yarotows/include/psdk/ksmedia.h [iso-8859-1] (original)
+++ branches/reactos-yarotows/include/psdk/ksmedia.h [iso-8859-1] Mon Oct 25 15:26:06
2010
@@ -565,6 +565,15 @@
#endif // !_NTDDK_
} LOOPEDSTREAMING_POSITION_EVENT_DATA, *PLOOPEDSTREAMING_POSITION_EVENT_DATA ;
+#define STATIC_KSPROPSETID_DrmAudioStream\
+ 0x2f2c8ddd, 0x4198, 0x4fac, 0xba, 0x29, 0x61, 0xbb, 0x5, 0xb7, 0xde, 0x6
+DEFINE_GUIDSTRUCT("2F2C8DDD-4198-4fac-BA29-61BB05B7DE06",
KSPROPSETID_DrmAudioStream);
+#define KSPROPSETID_DrmAudioStream DEFINE_GUIDNAMED(KSPROPSETID_DrmAudioStream)
+
+typedef enum {
+ KSPROPERTY_DRMAUDIOSTREAM_CONTENTID
+} KSPROPERTY_DRMAUDIOSTREAM;
+
/*
SysAudio Properties
Modified: branches/reactos-yarotows/ntoskrnl/include/internal/io.h
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/ntoskrnl/inclu…
==============================================================================
--- branches/reactos-yarotows/ntoskrnl/include/internal/io.h [iso-8859-1] (original)
+++ branches/reactos-yarotows/ntoskrnl/include/internal/io.h [iso-8859-1] Mon Oct 25
15:26:06 2010
@@ -514,6 +514,21 @@
IN PDEVICE_NODE DeviceNode
);
+NTSTATUS
+NTAPI
+IopCreateResourceListFromRequirements(
+ IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
+ OUT PCM_RESOURCE_LIST *ResourceList
+);
+
+NTSTATUS
+NTAPI
+IopDetectResourceConflict(
+ IN PCM_RESOURCE_LIST ResourceList,
+ IN BOOLEAN Silent,
+ OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
+);
+
//
// PNP Routines
//
Modified: branches/reactos-yarotows/ntoskrnl/io/iomgr/iorsrce.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/ntoskrnl/io/io…
==============================================================================
--- branches/reactos-yarotows/ntoskrnl/io/iomgr/iorsrce.c [iso-8859-1] (original)
+++ branches/reactos-yarotows/ntoskrnl/io/iomgr/iorsrce.c [iso-8859-1] Mon Oct 25 15:26:06
2010
@@ -841,7 +841,7 @@
}
/*
- * @unimplemented
+ * @halfplemented
*/
NTSTATUS NTAPI
IoReportResourceUsage(PUNICODE_STRING DriverClassName,
@@ -876,13 +876,48 @@
* a conflict is detected with another driver.
*/
{
- UNIMPLEMENTED;
- *ConflictDetected = FALSE;
- return STATUS_SUCCESS;
+ NTSTATUS Status;
+ PCM_RESOURCE_LIST ResourceList;
+
+ DPRINT1("IoReportResourceUsage is halfplemented!\n");
+
+ if (!DriverList && !DeviceList)
+ return STATUS_INVALID_PARAMETER;
+
+ if (DeviceList)
+ ResourceList = DeviceList;
+ else
+ ResourceList = DriverList;
+
+ Status = IopDetectResourceConflict(ResourceList, FALSE, NULL);
+ if (Status == STATUS_CONFLICTING_ADDRESSES)
+ {
+ *ConflictDetected = TRUE;
+
+ if (!OverrideConflict)
+ {
+ DPRINT1("Denying an attempt to claim resources currently in use by
another device!\n");
+ return STATUS_CONFLICTING_ADDRESSES;
+ }
+ else
+ {
+ DPRINT1("Proceeding with conflicting resources\n");
+ }
+ }
+ else if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ /* TODO: Claim resources in registry */
+
+ *ConflictDetected = FALSE;
+
+ return STATUS_SUCCESS;
}
/*
- * @unimplemented
+ * @halfplemented
*/
NTSTATUS NTAPI
IoAssignResources(PUNICODE_STRING RegistryPath,
@@ -892,8 +927,23 @@
PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
PCM_RESOURCE_LIST* AllocatedResources)
{
- UNIMPLEMENTED;
- return(STATUS_NOT_IMPLEMENTED);
+ NTSTATUS Status;
+
+ DPRINT1("IoAssignResources is halfplemented!\n");
+
+ Status = IopCreateResourceListFromRequirements(RequestedResources,
+ AllocatedResources);
+ if (!NT_SUCCESS(Status))
+ {
+ if (Status == STATUS_CONFLICTING_ADDRESSES)
+ DPRINT1("Denying an attempt to claim resources currently in use by
another device!\n");
+
+ return Status;
+ }
+
+ /* TODO: Claim resources in registry */
+
+ return STATUS_SUCCESS;
}
/*
Modified: branches/reactos-yarotows/ntoskrnl/io/pnpmgr/pnpreport.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/ntoskrnl/io/pn…
==============================================================================
--- branches/reactos-yarotows/ntoskrnl/io/pnpmgr/pnpreport.c [iso-8859-1] (original)
+++ branches/reactos-yarotows/ntoskrnl/io/pnpmgr/pnpreport.c [iso-8859-1] Mon Oct 25
15:26:06 2010
@@ -37,9 +37,6 @@
NTSTATUS
IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode,
PVOID Context);
-
-NTSTATUS
-IopDetectResourceConflict(IN PCM_RESOURCE_LIST ResourceList);
NTSTATUS
PpSetCustomTargetEvent(IN PDEVICE_OBJECT DeviceObject,
@@ -379,7 +376,7 @@
ResourceList = DriverList;
/* Look for a resource conflict */
- Status = IopDetectResourceConflict(ResourceList);
+ Status = IopDetectResourceConflict(ResourceList, FALSE, NULL);
if (Status == STATUS_CONFLICTING_ADDRESSES)
{
/* Oh noes */
Modified: branches/reactos-yarotows/ntoskrnl/io/pnpmgr/pnpres.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/ntoskrnl/io/pn…
==============================================================================
--- branches/reactos-yarotows/ntoskrnl/io/pnpmgr/pnpres.c [iso-8859-1] (original)
+++ branches/reactos-yarotows/ntoskrnl/io/pnpmgr/pnpres.c [iso-8859-1] Mon Oct 25 15:26:06
2010
@@ -12,12 +12,6 @@
#define NDEBUG
#include <debug.h>
-NTSTATUS
-IopDetectResourceConflict(
- IN PCM_RESOURCE_LIST ResourceList,
- IN BOOLEAN Silent,
- OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor);
-
static
BOOLEAN
IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL
PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
@@ -187,8 +181,8 @@
return FALSE;
}
-static
-NTSTATUS
+
+NTSTATUS NTAPI
IopCreateResourceListFromRequirements(
IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
OUT PCM_RESOURCE_LIST *ResourceList)
@@ -335,9 +329,6 @@
{
ULONG i, ii;
BOOLEAN Result = FALSE;
-
- if (ResDesc->ShareDisposition == CmResourceShareShared)
- return FALSE;
for (i = 0; i < ResourceList->Count; i++)
{
@@ -615,40 +606,61 @@
if (DeviceNode->ResourceList)
{
- PWCHAR DeviceName = NULL;
UNICODE_STRING NameU;
- UNICODE_STRING Suffix;
+ UNICODE_STRING RawSuffix, TranslatedSuffix;
ULONG OldLength = 0;
ASSERT(DeviceNode->ResourceListTranslated);
+
+ RtlInitUnicodeString(&TranslatedSuffix, L".Translated");
+ RtlInitUnicodeString(&RawSuffix, L".Raw");
Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
DevicePropertyPhysicalDeviceObjectName,
0,
NULL,
&OldLength);
- if ((OldLength != 0) && (Status == STATUS_BUFFER_TOO_SMALL))
- {
- DeviceName = ExAllocatePool(NonPagedPool, OldLength);
- ASSERT(DeviceName);
-
- IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
- DevicePropertyPhysicalDeviceObjectName,
- OldLength,
- DeviceName,
- &OldLength);
-
- RtlInitUnicodeString(&NameU, DeviceName);
- }
- else
- {
- /* Some failure */
- ASSERT(!NT_SUCCESS(Status));
- return Status;
- }
-
- RtlInitUnicodeString(&Suffix, L".Raw");
- RtlAppendUnicodeStringToString(&NameU, &Suffix);
+ if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL)
+ {
+ ASSERT(OldLength);
+
+ NameU.Buffer = ExAllocatePool(PagedPool, OldLength + TranslatedSuffix.Length);
+ if (!NameU.Buffer)
+ {
+ ZwClose(PnpMgrLevel2);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ NameU.Length = 0;
+ NameU.MaximumLength = OldLength + TranslatedSuffix.Length;
+
+ Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
+ DevicePropertyPhysicalDeviceObjectName,
+ NameU.MaximumLength,
+ NameU.Buffer,
+ &OldLength);
+ if (!NT_SUCCESS(Status))
+ {
+ ZwClose(PnpMgrLevel2);
+ ExFreePool(NameU.Buffer);
+ return Status;
+ }
+ }
+ else if (!NT_SUCCESS(Status))
+ {
+ /* Some failure */
+ ZwClose(PnpMgrLevel2);
+ return Status;
+ }
+ else
+ {
+ /* This should never happen */
+ ASSERT(FALSE);
+ }
+
+ NameU.Length = OldLength;
+
+ RtlAppendUnicodeStringToString(&NameU, &RawSuffix);
Status = ZwSetValueKey(PnpMgrLevel2,
&NameU,
@@ -659,14 +671,14 @@
if (!NT_SUCCESS(Status))
{
ZwClose(PnpMgrLevel2);
+ ExFreePool(NameU.Buffer);
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);
+ NameU.Length = OldLength;
+
+ RtlAppendUnicodeStringToString(&NameU, &TranslatedSuffix);
Status = ZwSetValueKey(PnpMgrLevel2,
&NameU,
@@ -675,8 +687,8 @@
DeviceNode->ResourceListTranslated,
PnpDetermineResourceListSize(DeviceNode->ResourceListTranslated));
ZwClose(PnpMgrLevel2);
- ASSERT(DeviceName);
- ExFreePool(DeviceName);
+ ExFreePool(NameU.Buffer);
+
if (!NT_SUCCESS(Status))
return Status;
}
@@ -718,7 +730,7 @@
DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, ListSize);
if (!DeviceNode->ResourceListTranslated)
{
- Status =STATUS_NO_MEMORY;
+ Status = STATUS_NO_MEMORY;
goto cleanup;
}
RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList,
ListSize);
@@ -743,6 +755,7 @@
&DescriptorTranslated->u.Port.Start))
{
Status = STATUS_UNSUCCESSFUL;
+ DPRINT1("Failed to translate port resource (Start:
0xI64x)\n", DescriptorRaw->u.Port.Start.QuadPart);
goto cleanup;
}
break;
@@ -756,6 +769,14 @@
DescriptorRaw->u.Interrupt.Vector,
(PKIRQL)&DescriptorTranslated->u.Interrupt.Level,
&DescriptorTranslated->u.Interrupt.Affinity);
+
+ if (!DescriptorTranslated->u.Interrupt.Vector)
+ {
+ Status = STATUS_UNSUCCESSFUL;
+ DPRINT1("Failed to translate interrupt resource (Vector: 0x%x |
Level: 0x%x)\n", DescriptorRaw->u.Interrupt.Vector,
+
DescriptorRaw->u.Interrupt.Level);
+ goto cleanup;
+ }
break;
}
case CmResourceTypeMemory:
@@ -769,6 +790,7 @@
&DescriptorTranslated->u.Memory.Start))
{
Status = STATUS_UNSUCCESSFUL;
+ DPRINT1("Failed to translate memory resource (Start:
0xI64x)\n", DescriptorRaw->u.Memory.Start.QuadPart);
goto cleanup;
}
}
@@ -864,16 +886,21 @@
Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements,
&DeviceNode->ResourceList);
if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to create a resource list from supplied resources for
%wZ\n", &DeviceNode->InstancePath);
goto ByeBye;
-
- Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL);
- if (!NT_SUCCESS(Status))
- goto ByeBye;
+ }
+
+ /* IopCreateResourceListFromRequirements should NEVER succeed with a conflicting list
*/
+ ASSERT(IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL) !=
STATUS_CONFLICTING_ADDRESSES);
Finish:
Status = IopTranslateDeviceResources(DeviceNode);
if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to translate resources for %wZ\n",
&DeviceNode->InstancePath);
goto ByeBye;
+ }
Status = IopUpdateResourceMapForPnPDevice(DeviceNode);
if (!NT_SUCCESS(Status))
@@ -935,7 +962,7 @@
return Result;
}
-NTSTATUS
+NTSTATUS NTAPI
IopDetectResourceConflict(
IN PCM_RESOURCE_LIST ResourceList,
IN BOOLEAN Silent,
Modified: branches/reactos-yarotows/ntoskrnl/mm/ARM3/virtual.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/ntoskrnl/mm/AR…
==============================================================================
--- branches/reactos-yarotows/ntoskrnl/mm/ARM3/virtual.c [iso-8859-1] (original)
+++ branches/reactos-yarotows/ntoskrnl/mm/ARM3/virtual.c [iso-8859-1] Mon Oct 25 15:26:06
2010
@@ -2306,7 +2306,7 @@
NTSTATUS Status;
PMMVAD Vad = NULL;
PVOID Address, NextAddress;
- BOOLEAN Found;
+ BOOLEAN Found = FALSE;
ULONG NewProtect, NewState, BaseVpn;
MEMORY_BASIC_INFORMATION MemoryInfo;
KAPC_STATE ApcState;
@@ -2390,11 +2390,44 @@
/* Was a VAD found? */
if (!Found)
{
- /* We don't handle this yet */
- UNIMPLEMENTED;
- while (TRUE);
- }
-
+ Address = PAGE_ALIGN(BaseAddress);
+
+ /* Calculate region size */
+ if (Vad)
+ {
+ /* We don't handle this yet */
+ UNIMPLEMENTED;
+ while (TRUE);
+ }
+ else
+ {
+ /* Maximum possible region size with that base address */
+ MemoryInfo.RegionSize = (PCHAR)MM_HIGHEST_VAD_ADDRESS + 1 - (PCHAR)Address;
+ }
+
+ /* Check if we were attached */
+ if (ProcessHandle != NtCurrentProcess())
+ {
+ /* Detach and derefernece the process */
+ KeUnstackDetachProcess(&ApcState);
+ ObDereferenceObject(TargetProcess);
+ }
+
+ /* Build the rest of the initial information block */
+ MemoryInfo.BaseAddress = Address;
+ MemoryInfo.AllocationBase = NULL;
+ MemoryInfo.AllocationProtect = 0;
+ MemoryInfo.State = MEM_FREE;
+ MemoryInfo.Protect = PAGE_NOACCESS;
+ MemoryInfo.Type = 0;
+
+ /* Return the data (FIXME: Use SEH) */
+ *(PMEMORY_BASIC_INFORMATION)MemoryInformation = MemoryInfo;
+ if (ReturnLength) *ReturnLength = sizeof(MEMORY_BASIC_INFORMATION);
+
+ return STATUS_SUCCESS;
+ }
+
/* This must be a VM VAD */
ASSERT(Vad->u.VadFlags.PrivateMemory);
Propchange: branches/reactos-yarotows/subsystems/win32/csrss/win32csr/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Oct 25 15:26:06 2010
@@ -1,4 +1,4 @@
/branches/header-work/subsystems/win32/csrss/win32csr:45691-46463
/branches/ros-amd64-bringup/reactos/subsystems/win32/csrss/win32csr:34711-34712,34741,34743,34780-34782,34803,34812,34839,34842,34864,34870,34874,34877,34908-34909,34917,34965,35323-35324,35347-35348,35361,35436,35509,35515,35588,35655,35683,35739,35746,35762,35771,35777,35781,35789,35805,35823,35827,35902,35904-35906,35942,35947-35949,35952-35953,35966,36011-36013,36172,36360,36380,36388-36389,36397,36445,36502-36503,36505,36570,36614,36898-36899,36930,36936,36949,36951,36958,36961,36964,36969,36972,36992,37323,37434,37472,37475,37536,37820-37821,37868-37869,37873,37990-37991,38013-38014,38092,38100,38148-38151,38264-38265,38268,38355,39151,39333,39335,39345,39639,40122-40123,40125,40128,40155,40247,40324,40753,40927-40928,40986-40987,40989,40991,40993,40995-40996,41000-41001,41027-41030,41044-41045,41047-41050,41052,41070,41082-41086,41097-41098,41101,41449,41479,41484-41485,41499-41500,41502,41531,41536,41540,41546-41547,41549,43080,43426,43454,43506,43566,43574,43598,43600-43602,43604-43605,43677,43682,43757,43775,43836,43838-43840,43857-43858,43860,43905-43907,43969,44002,44036-44037,44039-44040,44044-44045,44065,44095,44123,44144,44205,44238,44294,44338-44339,44389,44391,44426,44460,44467-44468,44470-44471,44499,44501,44503-44504,44506,44510-44512,44521,44523-44526,44530,44540,44601,44772,45124,45126-45127,46394,46478,46511,46524,46526,46534-46535,46537-46539,46589
/branches/ros-amd64-bringup/subsystems/win32/csrss/win32csr:36852
-/trunk/reactos/subsystems/win32/csrss/win32csr:45219-49238
+/trunk/reactos/subsystems/win32/csrss/win32csr:45219-49270
Modified: branches/reactos-yarotows/subsystems/win32/win32k/ntuser/callback.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win…
==============================================================================
--- branches/reactos-yarotows/subsystems/win32/win32k/ntuser/callback.c [iso-8859-1]
(original)
+++ branches/reactos-yarotows/subsystems/win32/win32k/ntuser/callback.c [iso-8859-1] Mon
Oct 25 15:26:06 2010
@@ -503,7 +503,7 @@
RtlCopyMemory( &CbtCreatewndExtra->Cs, CbtCreateWnd->lpcs,
sizeof(CREATESTRUCTW) );
CbtCreatewndExtra->WndInsertAfter = CbtCreateWnd->hwndInsertAfter;
Extra = (PCHAR) (CbtCreatewndExtra + 1);
- CbtCreatewndExtra->Cs.lpszClass = ClassName.Buffer; // if Atom
+ CbtCreatewndExtra->Cs.lpszClass = CbtCreateWnd->lpcs->lpszClass;
// if Atom
if (Ansi)
{
@@ -517,7 +517,7 @@
}
else
{
- if (asWindowName.Buffer)
+ if (WindowName.Buffer)
RtlCopyMemory(Extra, WindowName.Buffer, WindowName.Length);
CbtCreatewndExtra->Cs.lpszName = (LPCWSTR) (Extra - (PCHAR)
CbtCreatewndExtra);
Extra += WindowName.Length;
@@ -526,7 +526,7 @@
Extra += sizeof(WCHAR);
}
- if (!IS_ATOM(ClassName.Buffer))
+ if (!IS_ATOM(CbtCreateWnd->lpcs->lpszClass))
{
if (Ansi)
{
Modified: branches/reactos-yarotows/subsystems/win32/win32k/ntuser/hook.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win…
==============================================================================
--- branches/reactos-yarotows/subsystems/win32/win32k/ntuser/hook.c [iso-8859-1]
(original)
+++ branches/reactos-yarotows/subsystems/win32/win32k/ntuser/hook.c [iso-8859-1] Mon Oct
25 15:26:06 2010
@@ -582,7 +582,11 @@
break;
}
break;
-
+/*
+ Note WH_JOURNALPLAYBACK,
+ "To have the system wait before processing the message, the return value
+ must be the amount of time, in clock ticks, that the system should wait."
+ */
case WH_JOURNALPLAYBACK:
case WH_JOURNALRECORD:
{
@@ -660,8 +664,6 @@
DPRINT1("Unsupported HOOK Id -> %d\n",Hook->HookId);
break;
}
- if (Hook->HookId == WH_JOURNALPLAYBACK && lResult == 0)
- lResult = -1;
return lResult;
}
@@ -873,8 +875,7 @@
ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK);
- pti = GetW32ThreadInfo(); // Need to call this!
-
+ pti = PsGetCurrentThreadWin32Thread();
if (!pti || !pti->pDeskInfo)
goto Exit; // Must have a desktop running for hooks.
@@ -1006,8 +1007,6 @@
DPRINT("Ret: Global HookId %d Result 0x%x\n", HookId,Result);
}
Exit:
- if (HookId == WH_JOURNALPLAYBACK && Result == 0)
- Result = -1;
return Result;
}
@@ -1179,6 +1178,7 @@
HookId == WH_MOUSE_LL ||
HookId == WH_SYSMSGFILTER)
{
+ DPRINT1("Local hook installing Global HookId: %d\n",HookId);
/* these can only be global */
SetLastWin32Error(ERROR_GLOBAL_ONLY_HOOK);
RETURN( NULL);
@@ -1197,6 +1197,7 @@
if ( pti->rpdesk != ptiCurrent->rpdesk) // gptiCurrent->rpdesk)
{
+ DPRINT1("Local hook wrong desktop HookId: %d\n",HookId);
SetLastWin32Error(ERROR_ACCESS_DENIED);
RETURN( NULL);
}
@@ -1213,6 +1214,7 @@
HookId == WH_FOREGROUNDIDLE ||
HookId == WH_CALLWNDPROCRET) )
{
+ DPRINT1("Local hook needs hMod HookId: %d\n",HookId);
SetLastWin32Error(ERROR_HOOK_NEEDS_HMOD);
RETURN( NULL);
}
@@ -1246,6 +1248,7 @@
HookId == WH_FOREGROUNDIDLE ||
HookId == WH_CALLWNDPROCRET) )
{
+ DPRINT1("Global hook needs hMod HookId: %d\n",HookId);
SetLastWin32Error(ERROR_HOOK_NEEDS_HMOD);
RETURN( NULL);
}
@@ -1377,6 +1380,7 @@
else
Hook->offPfn = 0;
+ DPRINT1("Installing: HookId %d Global %s\n", HookId, !ThreadId ?
"TRUE" : "FALSE");
RETURN( Handle);
CLEANUP:
Modified: branches/reactos-yarotows/subsystems/win32/win32k/ntuser/msgqueue.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win…
==============================================================================
--- branches/reactos-yarotows/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1]
(original)
+++ branches/reactos-yarotows/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] Mon
Oct 25 15:26:06 2010
@@ -1003,9 +1003,7 @@
KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE);
}
- /* Call the callback if the message wa
-
- s sent with SendMessageCallback */
+ /* Call the callback if the message was sent with SendMessageCallback */
if (Message->CompletionCallback != NULL)
{
co_IntCallSentMessageCallback(Message->CompletionCallback,