ReactOS.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
List overview
Download
Ros-diffs
April 2010
----- 2025 -----
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
ros-diffs@reactos.org
22 participants
435 discussions
Start a n
N
ew thread
[gschneider] 46887: [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.
by gschneider@svn.reactos.org
Author: gschneider Date: Thu Apr 15 23:01:12 2010 New Revision: 46887 URL:
http://svn.reactos.org/svn/reactos?rev=46887&view=rev
Log: [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. Modified: trunk/reactos/dll/cpl/desk/background.c Modified: trunk/reactos/dll/cpl/desk/background.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/background.c?…
============================================================================== --- trunk/reactos/dll/cpl/desk/background.c [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/desk/background.c [iso-8859-1] Thu Apr 15 23:01:12 2010 @@ -94,14 +94,17 @@ 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 @@ 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 @@ 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++;
15 years
1
0
0
0
[tkreuzer] 46886: [MSIMTF] Silence debug flood
by tkreuzer@svn.reactos.org
Author: tkreuzer Date: Thu Apr 15 22:07:18 2010 New Revision: 46886 URL:
http://svn.reactos.org/svn/reactos?rev=46886&view=rev
Log: [MSIMTF] Silence debug flood Modified: trunk/reactos/dll/win32/msimtf/activeimmapp.c Modified: trunk/reactos/dll/win32/msimtf/activeimmapp.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msimtf/activeimm…
============================================================================== --- trunk/reactos/dll/win32/msimtf/activeimmapp.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msimtf/activeimmapp.c [iso-8859-1] Thu Apr 15 22:07:18 2010 @@ -655,7 +655,7 @@ 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; }
15 years
1
0
0
0
[jgardou] 46885: [WIN32K] - Maintain a list of DC attached to a PDEVOBJ No functional change for now, stay tuned!
by jgardou@svn.reactos.org
Author: jgardou Date: Thu Apr 15 21:07:07 2010 New Revision: 46885 URL:
http://svn.reactos.org/svn/reactos?rev=46885&view=rev
Log: [WIN32K] - Maintain a list of DC attached to a PDEVOBJ No functional change for now, stay tuned! Modified: branches/reactos-yarotows/subsystems/win32/win32k/objects/dclife.c Modified: branches/reactos-yarotows/subsystems/win32/win32k/objects/dclife.c URL:
http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win…
============================================================================== --- branches/reactos-yarotows/subsystems/win32/win32k/objects/dclife.c [iso-8859-1] (original) +++ branches/reactos-yarotows/subsystems/win32/win32k/objects/dclife.c [iso-8859-1] Thu Apr 15 21:07:07 2010 @@ -117,8 +117,8 @@ { if (dctype == DCTYPE_DIRECT) { - /* Lock ppdev */ - EngAcquireSemaphoreShared(ppdev->hsemDevLock); + /* Lock ppdev exclusively */ + EngAcquireSemaphore(ppdev->hsemDevLock); } /* Setup some basic fields */ @@ -161,6 +161,30 @@ { /* Direct DCs get the surface from the PDEV */ pdc->dclevel.pSurface = PDEVOBJ_pSurface(ppdev); + + /* Maintain a list of DC attached to this device */ + if(!pdc->dclevel.pSurface->hDC) + pdc->dclevel.pSurface->hDC = pdc->BaseObject.hHmgr ; + else + { + PDC Surf_Dc = DC_LockDc(pdc->dclevel.pSurface->hDC); + if(!Surf_Dc) + { + DPRINT1("Something went wrong with device DC list!\n"); + /* Save what can be saved ... */ + pdc->dclevel.pSurface->hDC = pdc->BaseObject.hHmgr; + } + else + { + /* Insert this one at the head of the list */ + pdc->hdcNext = Surf_Dc->BaseObject.hHmgr; + /* Sanity check */ + ASSERT(NULL == Surf_Dc->hdcPrev); + Surf_Dc->hdcPrev = pdc->BaseObject.hHmgr ; + pdc->dclevel.pSurface->hDC = pdc->BaseObject.hHmgr; + DC_UnlockDc(Surf_Dc); + } + } pdc->erclBounds.left = 0x7fffffff; pdc->erclBounds.top = 0x7fffffff; @@ -324,8 +348,6 @@ // pdc->dclevel.pFont = LFONT_ShareLockFont(pdc->dcattr.hlfntNew); /* Other stuff */ - pdc->hdcNext = NULL; - pdc->hdcPrev = NULL; pdc->ipfdDevMax = 0x0000ffff; pdc->ulCopyCount = -1; pdc->ptlDoBanding.x = 0; @@ -375,9 +397,34 @@ PATH_Delete(pdc->dclevel.hPath); + if(pdc->dctype == DCTYPE_DIRECT) + { + EngAcquireSemaphore(pdc->ppdev->hsemDevLock); + /* Remove it from the list of DC attached to the Device */ + PDC tmpDC = DC_LockDc(pdc->hdcNext); + if(tmpDC != NULL) + { + tmpDC->hdcPrev = pdc->hdcPrev ; + DC_UnlockDc(tmpDC); + } + tmpDC = DC_LockDc(pdc->hdcPrev); + if(tmpDC != NULL) + { + tmpDC->hdcNext = pdc->hdcNext ; + DC_UnlockDc(tmpDC); + } + /* Reassign list head if needed */ + if(pdc->BaseObject.hHmgr == pdc->dclevel.pSurface->hDC) + { + /* Sanity check */ + ASSERT(pdc->hdcPrev == NULL); + pdc->dclevel.pSurface->hDC = pdc->hdcNext; + } + EngReleaseSemaphore(pdc->ppdev->hsemDevLock) ; + } + if(pdc->dclevel.pSurface) SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface); - PDEVOBJ_vRelease(pdc->ppdev) ; return TRUE;
15 years
1
0
0
0
[tkreuzer] 46884: [RBUILD] - Link C++ apps to libsupc++.a, needed for recent versions of gcc - remove amd64 hack
by tkreuzer@svn.reactos.org
Author: tkreuzer Date: Thu Apr 15 20:47:44 2010 New Revision: 46884 URL:
http://svn.reactos.org/svn/reactos?rev=46884&view=rev
Log: [RBUILD] - Link C++ apps to libsupc++.a, needed for recent versions of gcc - remove amd64 hack Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rbuild/backend/mingw…
============================================================================== --- trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp [iso-8859-1] (original) +++ trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp [iso-8859-1] Thu Apr 15 20:47:44 2010 @@ -481,13 +481,10 @@ 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"); }
15 years
1
0
0
0
[tkreuzer] 46883: [GENINC] Add some more constants
by tkreuzer@svn.reactos.org
Author: tkreuzer Date: Thu Apr 15 20:42:48 2010 New Revision: 46883 URL:
http://svn.reactos.org/svn/reactos?rev=46883&view=rev
Log: [GENINC] Add some more constants Modified: trunk/reactos/tools/geninc/data.c Modified: trunk/reactos/tools/geninc/data.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/geninc/data.c?rev=46…
============================================================================== --- trunk/reactos/tools/geninc/data.c [iso-8859-1] (original) +++ trunk/reactos/tools/geninc/data.c [iso-8859-1] Thu Apr 15 20:42:48 2010 @@ -350,6 +350,15 @@ #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), @@ -412,6 +421,13 @@ // CONSTANT(XSAVE_PRESENT), #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),
15 years
1
0
0
0
[gschneider] 46882: [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.
by gschneider@svn.reactos.org
Author: gschneider Date: Thu Apr 15 18:33:25 2010 New Revision: 46882 URL:
http://svn.reactos.org/svn/reactos?rev=46882&view=rev
Log: [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. Modified: trunk/reactos/dll/win32/shell32/dialogs.c Modified: trunk/reactos/dll/win32/shell32/dialogs.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/dialogs.…
============================================================================== --- trunk/reactos/dll/win32/shell32/dialogs.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/dialogs.c [iso-8859-1] Thu Apr 15 18:33:25 2010 @@ -344,7 +344,7 @@ 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 @@ ) ; 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);
15 years
1
0
0
0
[janderwald] 46881: [BDASUP] - Fix build
by janderwald@svn.reactos.org
Author: janderwald Date: Thu Apr 15 16:09:38 2010 New Revision: 46881 URL:
http://svn.reactos.org/svn/reactos?rev=46881&view=rev
Log: [BDASUP] - Fix build Modified: trunk/reactos/drivers/multimedia/bdasup/precomp.h Modified: trunk/reactos/drivers/multimedia/bdasup/precomp.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/multimedia/bdasup/…
============================================================================== --- trunk/reactos/drivers/multimedia/bdasup/precomp.h [iso-8859-1] (original) +++ trunk/reactos/drivers/multimedia/bdasup/precomp.h [iso-8859-1] Thu Apr 15 16:09:38 2010 @@ -3,6 +3,9 @@ #include <ntddk.h> #include <windef.h> #include <ks.h> +#define NOBITMAP +#include <mmreg.h> +#include <ksmedia.h> #include <bdatypes.h> #include <bdamedia.h> #include <bdasup.h>
15 years
1
0
0
0
[janderwald] 46880: [PSDK] - Add KS_DATARANGE_BDA_TRANSPORT Type - Fix build
by janderwald@svn.reactos.org
Author: janderwald Date: Thu Apr 15 14:54:04 2010 New Revision: 46880 URL:
http://svn.reactos.org/svn/reactos?rev=46880&view=rev
Log: [PSDK] - Add KS_DATARANGE_BDA_TRANSPORT Type - Fix build Modified: trunk/reactos/include/dxsdk/bdamedia.h Modified: trunk/reactos/include/dxsdk/bdamedia.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/dxsdk/bdamedia.h?r…
============================================================================== --- trunk/reactos/include/dxsdk/bdamedia.h [iso-8859-1] (original) +++ trunk/reactos/include/dxsdk/bdamedia.h [iso-8859-1] Thu Apr 15 14:54:04 2010 @@ -317,6 +317,20 @@ }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 */
15 years
1
0
0
0
[janderwald] 46879: [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
by janderwald@svn.reactos.org
Author: janderwald Date: Thu Apr 15 13:08:19 2010 New Revision: 46879 URL:
http://svn.reactos.org/svn/reactos?rev=46879&view=rev
Log: [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 Modified: trunk/reactos/dll/directx/bdaplgin/pincontrol.cpp trunk/reactos/dll/directx/ksproxy/output_pin.cpp trunk/reactos/dll/directx/msdvbnp/msdvbnp.cpp Modified: trunk/reactos/dll/directx/bdaplgin/pincontrol.cpp URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/bdaplgin/pinco…
============================================================================== --- trunk/reactos/dll/directx/bdaplgin/pincontrol.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/directx/bdaplgin/pincontrol.cpp [iso-8859-1] Thu Apr 15 13:08:19 2010 @@ -336,6 +336,7 @@ 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 @@ WCHAR Buffer[100]; swprintf(Buffer, L"CBDAPinControl_fnConstructor failed to register filter with %lx\n", hr); OutputDebugStringW(Buffer); - DebugBreak(); } } } Modified: trunk/reactos/dll/directx/ksproxy/output_pin.cpp URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ksproxy/output…
============================================================================== --- trunk/reactos/dll/directx/ksproxy/output_pin.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/directx/ksproxy/output_pin.cpp [iso-8859-1] Thu Apr 15 13:08:19 2010 @@ -246,8 +246,16 @@ 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 @@ HRESULT hr; ALLOCATOR_PROPERTIES Properties; IMemAllocatorCallbackTemp *pMemCallback; + LPGUID pGuid; + ULONG NumGuids = 0; #ifdef KSPROXY_TRACE WCHAR Buffer[200]; @@ -1540,6 +1550,20 @@ 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 @@ return hr; } - if (!m_hPin) - { - //FIXME create pin handle - assert(0); + + assert(m_hPin != INVALID_HANDLE_VALUE); + + // get all supported sets + if (m_Plugins.size() == 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 @@ // 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 @@ 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 @@ // 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 @@ 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)) - return hr; + { + OutputDebugStringW(L"COutputPin::CreatePinHandle no IID_IKsObject interface\n"); + return hr; + } // get parent filter handle hFilter = KsObjectParent->KsGetObjectHandle(); @@ -2146,13 +2192,19 @@ KsObjectParent->Release(); if (!hFilter) + { + OutputDebugStringW(L"COutputPin::CreatePinHandle no filter handle\n"); return E_HANDLE; - + } + + OutputDebugStringW(L"COutputPin::CreatePinHandle before creating pin\n"); // create pin - hr = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin); - - if (SUCCEEDED(hr)) - { + 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 @@ 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); Modified: trunk/reactos/dll/directx/msdvbnp/msdvbnp.cpp URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/msdvbnp/msdvbn…
============================================================================== --- trunk/reactos/dll/directx/msdvbnp/msdvbnp.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/directx/msdvbnp/msdvbnp.cpp [iso-8859-1] Thu Apr 15 13:08:19 2010 @@ -152,7 +152,7 @@ } 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");
15 years
1
0
0
0
[janderwald] 46878: [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) - R
by janderwald@svn.reactos.org
Author: janderwald Date: Thu Apr 15 12:07:38 2010 New Revision: 46878 URL:
http://svn.reactos.org/svn/reactos?rev=46878&view=rev
Log: [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 Modified: trunk/reactos/drivers/ksfilter/ks/allocators.c trunk/reactos/drivers/ksfilter/ks/api.c trunk/reactos/drivers/ksfilter/ks/bag.c trunk/reactos/drivers/ksfilter/ks/clocks.c trunk/reactos/drivers/ksfilter/ks/connectivity.c trunk/reactos/drivers/ksfilter/ks/device.c trunk/reactos/drivers/ksfilter/ks/driver.c trunk/reactos/drivers/ksfilter/ks/filter.c trunk/reactos/drivers/ksfilter/ks/filterfactory.c trunk/reactos/drivers/ksfilter/ks/irp.c trunk/reactos/drivers/ksfilter/ks/ksfunc.h trunk/reactos/drivers/ksfilter/ks/ksiface.h trunk/reactos/drivers/ksfilter/ks/kstypes.h trunk/reactos/drivers/ksfilter/ks/misc.c trunk/reactos/drivers/ksfilter/ks/pin.c trunk/reactos/drivers/ksfilter/ks/priv.h Modified: trunk/reactos/drivers/ksfilter/ks/allocators.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/alloca…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/allocators.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/allocators.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -251,7 +251,7 @@ } } - /* unhandeled request */ + /* unhandled request */ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; IoCompleteRequest(Irp, IO_NO_INCREMENT); Modified: trunk/reactos/drivers/ksfilter/ks/api.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/api.c?…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/api.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/api.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -1629,7 +1629,7 @@ 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 @@ 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 @@ 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 @@ } /* - @unimplemented + @implemented */ KSDDKAPI void @@ -1971,7 +1971,12 @@ 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 @@ IN PIRP Irp) { UNIMPLEMENTED + return STATUS_UNSUCCESSFUL; } @@ -2700,8 +2706,26 @@ 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; } /* Modified: trunk/reactos/drivers/ksfilter/ks/bag.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/bag.c?…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/bag.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/bag.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -41,7 +41,7 @@ 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); Modified: trunk/reactos/drivers/ksfilter/ks/clocks.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/clocks…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/clocks.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/clocks.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -21,19 +21,234 @@ 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; +} /* @@ -96,7 +311,32 @@ 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 @@ NTSTATUS Status; PKSCLOCK_CREATE ClockCreate; PKSICLOCK Clock; - PKSOBJECT_CREATE_ITEM CreateItem; Status = KsValidateClockCreateRequest(Irp, &ClockCreate); if (!NT_SUCCESS(Status)) @@ -169,16 +408,13 @@ /* 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; /* increment reference count */ InterlockedIncrement(&Clock->DefaultClock->ReferenceCount); - - /* get create item */ - CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); return Status; } @@ -228,8 +464,20 @@ 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; Modified: trunk/reactos/drivers/ksfilter/ks/connectivity.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/connec…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/connectivity.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/connectivity.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -23,6 +23,7 @@ 0 }; +const GUID KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT = {0xf4aeb342, 0x0329, 0x4fdd, {0xa8, 0xfd, 0x4a, 0xff, 0x49, 0x26, 0xc9, 0x78}}; /* @implemented @@ -53,8 +54,156 @@ ConnectionHandle); } +NTSTATUS +KspValidateConnectRequest( + IN PIRP Irp, + IN ULONG DescriptorsCount, + IN PVOID Descriptors, + IN ULONG DescriptorSize, + OUT PKSPIN_CONNECT* Connect) +{ + PKSPIN_CONNECT ConnectDetails; + PKSPIN_INTERFACE Interface; + PKSPIN_MEDIUM Medium; + ULONG Size; + NTSTATUS Status; + ULONG Index; + ULONG Count; + BOOLEAN Found; + PKSPIN_DESCRIPTOR Descriptor; + + /* did the caller miss the connect parameter */ + if (!Connect) + return STATUS_INVALID_PARAMETER; + + /* set create param size */ + Size = sizeof(KSPIN_CONNECT); + + /* fetch create parameters */ + Status = KspCopyCreateRequest(Irp, + KSSTRING_Pin, + &Size, + (PVOID*)&ConnectDetails); + + /* check for success */ + if (!NT_SUCCESS(Status)) + return Status; + + /* is pin id out of bounds */ + 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->InterfacesCount && Descriptor->Interfaces) + { + /* use provided pin interface count */ + Count = Descriptor->InterfacesCount; + Interface = (PKSPIN_INTERFACE)Descriptor->Interfaces; + } + else + { + /* use standard pin interface */ + Count = 1; + Interface = &StandardPinInterface; + } + + /* now check the interface */ + Found = FALSE; + 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) + { + /* found a matching interface */ + Found = TRUE; + break; + } + /* iterate to next interface */ + Index++; + }while(Index < Count); + + if (!Found) + { + /* pin doesnt support this interface */ + return STATUS_NO_MATCH; + } + + /* does the pin have medium details filled in */ + if (Descriptor->MediumsCount && Descriptor->Mediums) + { + /* use provided pin interface count */ + Count = Descriptor->MediumsCount; + Medium = (PKSPIN_MEDIUM)Descriptor->Mediums; + } + else + { + /* use standard pin interface */ + Count = 1; + Medium = &StandardPinMedium; + } + + /* now check the interface */ + Found = FALSE; + 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) + { + /* found a matching interface */ + Found = TRUE; + break; + } + + + + /* iterate to next medium */ + Index++; + }while(Index < Count); + + if (!Found) + { + /* pin doesnt support this medium */ + return STATUS_NO_MATCH; + } + + /// FIXME + /// implement format checking + + *Connect = ConnectDetails; + return STATUS_SUCCESS; +} + /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS @@ -65,115 +214,8 @@ IN KSPIN_DESCRIPTOR* Descriptor, OUT PKSPIN_CONNECT* Connect) { - PKSPIN_CONNECT ConnectDetails; - PKSPIN_INTERFACE Interface; - PKSPIN_MEDIUM Medium; - ULONG Size; - NTSTATUS Status; - ULONG Index; - ULONG Count; - BOOLEAN Found; - - /* did the caller miss the connect parameter */ - if (!Connect) - return STATUS_INVALID_PARAMETER; - - /* set create param size */ - Size = sizeof(KSPIN_CONNECT); - - /* fetch create parameters */ - Status = KspCopyCreateRequest(Irp, - KSSTRING_Pin, - &Size, - (PVOID*)&ConnectDetails); - - /* check for success */ - if (!NT_SUCCESS(Status)) - return Status; - - /* is pin id out of bounds */ - if (ConnectDetails->PinId >= DescriptorsCount) - return STATUS_INVALID_PARAMETER; - - /* does the pin have interface details filled in */ - if (Descriptor[ConnectDetails->PinId].InterfacesCount && Descriptor[ConnectDetails->PinId].Interfaces) - { - /* use provided pin interface count */ - Count = Descriptor[ConnectDetails->PinId].InterfacesCount; - Interface = (PKSPIN_INTERFACE)Descriptor[ConnectDetails->PinId].Interfaces; - } - else - { - /* use standard pin interface */ - Count = 1; - Interface = &StandardPinInterface; - } - - /* now check the interface */ - Found = FALSE; - Index = 0; - do - { - if (IsEqualGUIDAligned(&Interface[Index].Set, &ConnectDetails->Interface.Set) && - Interface[Index].Id == ConnectDetails->Interface.Id) - { - /* found a matching interface */ - Found = TRUE; - break; - } - /* iterate to next interface */ - Index++; - }while(Index < Count); - - if (!Found) - { - /* pin doesnt support this interface */ - return STATUS_NO_MATCH; - } - - /* does the pin have medium details filled in */ - if (Descriptor[ConnectDetails->PinId].MediumsCount && Descriptor[ConnectDetails->PinId].Mediums) - { - /* use provided pin interface count */ - Count = Descriptor[ConnectDetails->PinId].MediumsCount; - Medium = (PKSPIN_MEDIUM)Descriptor[ConnectDetails->PinId].Mediums; - } - else - { - /* use standard pin interface */ - Count = 1; - Medium = &StandardPinMedium; - } - - /* now check the interface */ - Found = FALSE; - Index = 0; - do - { - if (IsEqualGUIDAligned(&Medium[Index].Set, &ConnectDetails->Medium.Set) && - Medium[Index].Id == ConnectDetails->Medium.Id) - { - /* found a matching interface */ - Found = TRUE; - break; - } - /* iterate to next medium */ - Index++; - }while(Index < Count); - - if (!Found) - { - /* pin doesnt support this medium */ - return STATUS_NO_MATCH; - } - - /// FIXME - /// implement format checking - - *Connect = ConnectDetails; - return STATUS_SUCCESS; -} - + return KspValidateConnectRequest(Irp, DescriptorsCount, Descriptor, sizeof(KSPIN_DESCRIPTOR), Connect); +} NTSTATUS KspReadMediaCategory( @@ -265,18 +307,16 @@ 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 @@ 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; @@ -294,6 +335,29 @@ 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); + + /* 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) { @@ -303,13 +367,7 @@ 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 @@ 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) - { - DataRanges = Descriptor[Pin->PinId].DataRanges; - Count = Descriptor[Pin->PinId].DataRangesCount; + 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->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 @@ 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 @@ 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 @@ 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 @@ 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 @@ Status = STATUS_BUFFER_TOO_SMALL; break; } - if (Descriptor[Pin->PinId].Category) - { - RtlMoveMemory(Buffer, Descriptor[Pin->PinId].Category, sizeof(GUID)); + if (Descriptor->Category) + { + RtlMoveMemory(Buffer, Descriptor->Category, sizeof(GUID)); } Status = STATUS_SUCCESS; @@ -501,28 +526,19 @@ 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); @@ -538,13 +554,6 @@ 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 @@ } 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)) { @@ -606,6 +615,22 @@ } /* + @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 */ KSDDKAPI NTSTATUS NTAPI Modified: trunk/reactos/drivers/ksfilter/ks/device.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/device…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/device.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/device.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -16,15 +16,29 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ IKsDevice_fnGetAdapterObject( IN IKsDevice * iface, IN PADAPTER_OBJECT * Object, - IN PULONG Unknown1, - IN PULONG Unknown2) -{ - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); + IN PULONG MaxMappingsByteCount, + IN PULONG MappingTableStride) +{ + 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ } /* acquire list lock */ - IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice); + IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown); if (Status != STATUS_PENDING) { @@ -726,7 +742,7 @@ } /* initialize IKsDevice interface */ - Header->lpVtblIKsDevice = &vt_IKsDevice; + Header->BasicHeader.OuterUnknown = (PUNKNOWN)&vt_IKsDevice; Header->ref = 1; /* allocate object bag */ @@ -810,7 +826,7 @@ PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; if (Device) { @@ -834,7 +850,7 @@ PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; if (Device) { @@ -859,7 +875,7 @@ PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; if (Device) { @@ -883,7 +899,7 @@ DPRINT1("KsDereferenceSoftwareBusObject DeviceHeader %p\n", Header); /* get device interface */ - Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; if (Device) { Modified: trunk/reactos/drivers/ksfilter/ks/driver.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/driver…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/driver.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/driver.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -39,12 +39,19 @@ { 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->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->PhysicalDeviceObject); + ASSERT(BasicHeader->KsDevice->SystemPowerState == PowerSystemWorking); + ASSERT(BasicHeader->KsDevice->DevicePowerState == PowerDeviceD0); return BasicHeader->KsDevice; } Modified: trunk/reactos/drivers/ksfilter/ks/filter.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/filter…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -14,16 +14,12 @@ 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 @@ IKsFilterImpl * This, PKSFILTERFACTORY FilterFactory); - -DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, KspTopologyPropertyHandler); -DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, KspPinPropertyHandler, KspPinPropertyHandler, KspPinPropertyHandler); +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, FilterTopologyPropertyHandler); +DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, FilterPinPropertyHandler, FilterPinPropertyHandler, FilterPinPropertyHandler); KSPROPERTY_SET FilterPropertySet[] = { @@ -82,7 +81,7 @@ if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->lpVtbl; + *Output = &This->Header.OuterUnknown; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } @@ -185,12 +184,13 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ } /* 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 @@ 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 @@ } /* 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,7 +617,14 @@ 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); @@ -613,7 +633,7 @@ /* 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 @@ } /* ignore custom structs for now */ - ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - ASSERT(This->PinDescriptorCount > Pin->PinId); - - if (This->PinDescriptorsEx[Pin->PinId].IntersectHandler == NULL || - This->PinDescriptors[Pin->PinId].DataRanges == NULL || - This->PinDescriptors[Pin->PinId].DataRangesCount == 0) + ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); + ASSERT(This->Filter.Descriptor->PinDescriptorsCount > Pin->PinId); + + 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 @@ 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 @@ /* 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 @@ NTSTATUS NTAPI -KspPinPropertyHandler( +FilterPinPropertyHandler( IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data) @@ -724,7 +742,7 @@ 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 @@ 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); @@ -780,7 +798,6 @@ /* get filter instance */ FilterInstance = Filter->lpVtbl->GetStruct(Filter); - /* sanity check */ ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSIDENTIFIER)); @@ -788,9 +805,8 @@ 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) { @@ -858,6 +874,9 @@ /* release filter */ Filter->lpVtbl->Release(Filter); + + /* release control mutex */ + KeReleaseMutex(This->Header.ControlMutex, FALSE); if (Status != STATUS_PENDING) { @@ -895,10 +914,7 @@ /* 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 @@ 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 @@ 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 @@ } /* 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 @@ 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 @@ 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 @@ 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 @@ 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); - - if (This->PinInstanceCount[Connect->PinId] < This->PinDescriptorsEx[Connect->PinId].InstancesPossible) + This->Filter.Descriptor->PinDescriptors[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 @@ { /* 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 @@ 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 @@ /* 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 @@ /* 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 @@ 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); - } - - /* add new connections */ - RtlMoveMemory((PVOID)(Connections + This->Filter.Descriptor->ConnectionsCount), NewTopologyConnections, NewConnectionsCount); - - /* 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; + /* copy new connections */ + RtlMoveMemory((PVOID)&This->Filter.Descriptor->Connections[This->Filter.Descriptor->ConnectionsCount], + NewTopologyConnections, + NewConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION)); + + /* update topology */ + This->Topology.TopologyConnectionsCount += NewConnectionsCount; + ((PKSFILTER_DESCRIPTOR)This->Filter.Descriptor)->ConnectionsCount += NewConnectionsCount; + This->Topology.TopologyConnections = This->Filter.Descriptor->Connections; + + return Status; } /* @@ -1630,13 +1644,13 @@ 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 @@ 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,9 +1667,8 @@ return Status; } - - /* allocate pin instance count array */ - Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->PinInstanceCount, sizeof(ULONG) * Count, sizeof(ULONG) * 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 */ @@ -1663,23 +1676,12 @@ return Status; } - /* allocate first pin array */ - Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->FirstPin, sizeof(PKSPIN) * Count, sizeof(PKSPIN) * This->PinDescriptorCount, 0); - if (!NT_SUCCESS(Status)) - { - /* failed */ - DPRINT("KsFilterCreatePinFactory _KsEdit failed with %lx\n", Status); - return Status; - } - /* 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 @@ } /* 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 @@ { 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 @@ { 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; Modified: trunk/reactos/drivers/ksfilter/ks/filterfactory.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/filter…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/filterfactory.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/filterfactory.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -14,7 +14,6 @@ KSBASIC_HEADER Header; KSFILTERFACTORY FilterFactory; - IKsFilterFactoryVtbl *lpVtbl; LONG ref; PKSIDEVICE_HEADER DeviceHeader; PFNKSFILTERFACTORYPOWER SleepCallback; @@ -59,7 +58,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 * 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 @@ 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 @@ 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 @@ /* 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 @@ 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); } Modified: trunk/reactos/drivers/ksfilter/ks/irp.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/irp.c?…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/irp.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/irp.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -1360,7 +1360,7 @@ 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 @@ { PLIST_ENTRY Entry; PCREATE_ITEM_ENTRY CreateItemEntry; + UNICODE_STRING RefString; + #ifndef MS_KSUSER /* remove '\' slash */ @@ -1726,6 +1728,16 @@ 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 @@ 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 @@ } /* 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 @@ 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 @@ 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 @@ 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 @@ 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); Modified: trunk/reactos/drivers/ksfilter/ks/ksfunc.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/ksfunc…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/ksfunc.h [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/ksfunc.h [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -84,19 +84,17 @@ 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 @@ 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); Modified: trunk/reactos/drivers/ksfilter/ks/ksiface.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/ksifac…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/ksiface.h [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/ksiface.h [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -283,8 +283,8 @@ 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, Modified: trunk/reactos/drivers/ksfilter/ks/kstypes.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/kstype…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/kstypes.h [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/kstypes.h [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -61,6 +61,8 @@ PRKMUTEX ControlMutex; LIST_ENTRY EventList; KSPIN_LOCK EventListLock; + PUNKNOWN ClientAggregate; + PUNKNOWN OuterUnknown; union { PKSDEVICE KsDevice; @@ -87,7 +89,6 @@ { KSBASIC_HEADER BasicHeader; KSDEVICE KsDevice; - IKsDeviceVtbl *lpVtblIKsDevice; LONG ref; ERESOURCE SecurityLock; @@ -109,6 +110,8 @@ LIST_ENTRY ObjectBags; PADAPTER_OBJECT AdapterObject; + ULONG MaxMappingsByteCount; + ULONG MappingTableStride; }KSIDEVICE_HEADER, *PKSIDEVICE_HEADER; Modified: trunk/reactos/drivers/ksfilter/ks/misc.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/misc.c…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/misc.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/misc.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -175,16 +175,21 @@ } /* - @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; } /* Modified: trunk/reactos/drivers/ksfilter/ks/pin.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/pin.c?…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/pin.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/pin.c [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -32,7 +32,6 @@ KSPROCESSPIN ProcessPin; LIST_ENTRY Entry; - IKsPinVtbl *lpVtbl; LONG ref; IKsFilter * Filter; @@ -296,7 +295,7 @@ /* 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ { 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 @@ { 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 @@ { 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 @@ */ NTSTATUS NTAPI - KsPinGetReferenceClockInterface( +KsPinGetReferenceClockInterface( IN PKSPIN Pin, OUT PIKSREFERENCECLOCK* Interface) { @@ -1045,12 +1117,8 @@ *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; } @@ -1936,6 +2004,13 @@ /* 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 @@ //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 @@ } } + 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 @@ 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 @@ 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 @@ KeInitializeSpinLock(&This->BasicHeader.EventListLock); /* initialize pin */ - This->lpVtbl = &vt_IKsPin; This->FrameSize = FrameSize; This->NumFrames = NumFrames; This->lpVtblReferenceClock = &vt_ReferenceClock; @@ -2442,7 +2538,7 @@ /* 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 @@ } - DPRINT("KspCreatePin Status %lx\n", Status); + DPRINT("KspCreatePin Status %lx KsDevice %p\n", Status, KsDevice); if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) { Modified: trunk/reactos/drivers/ksfilter/ks/priv.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/priv.h…
============================================================================== --- trunk/reactos/drivers/ksfilter/ks/priv.h [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/priv.h [iso-8859-1] Thu Apr 15 12:07:38 2010 @@ -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_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)\ }
15 years
1
0
0
0
← Newer
1
...
16
17
18
19
20
21
22
...
44
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Results per page:
10
25
50
100
200