multiple xpdm drivers on vista

Discussion in 'Windows Vista Drivers' started by Rudi De Vos, Nov 27, 2006.

  1. Rudi De Vos

    Rudi De Vos Guest

    Any know problems when you use multiple xpdm drivers on vista ?

    Vista running a xpdm video driver (real video card) then i add 2 virtual
    drivers,
    this works ok on w2k and xp.

    Usage:
    To support 3 or 4 displays on notebooks you can't use the new driver model,
    external usb VGA, dockings with GPU or virtual video drivers over network
    are never of the same chip model as the portable.

    In Vista however, i can only activate one.
    real+ virtualA
    real +virtualB
    but as soon as i activate real + virtualA +virtualB the while system loops

    **driver virtual A and virtual B are indentical ( except the inf file)

    -------------Start driver A (OK)----------------------
    00000311 78.06970978 ADrvAssertMode(fee43e08, 0)
    00000312 78.06989288 ADrvEnablePDEV:
    00000313 78.06990814 ADrvPDEV
    00000314 78.07004547 ADrvCompletePDEV
    00000315 78.07006073 ADrvEnableSurface:
    00000316 78.07007599 ADrvEnableSurface - lock our surface
    00000317 78.07009125 ADrvEsurface
    00000318 78.07016754 ADrvNotify: DN_DRAWING_BEGIN
    00000319 78.07088470 ADrvNotify: DN_DEVICE_ORIGIN (1024,0)
    00000320 78.07142639 ADrvCompletePDEV
    00000321 78.07143402 ADrvCompletePDEV
    00000322 78.08670044 ADrvDisableSurface
    00000323 78.08934021 ADrvDsurface
    00000324 78.08935547 ADrvDisablePDEV
    00000325 78.12242889 ADrvAssertMode(fea36668, 0)
    00000326 78.12259674 ADrvEnablePDEV:
    00000327 78.12261200 ADrvPDEV
    00000328 78.12273407 ADrvCompletePDEV
    00000329 78.12274933 ADrvEnableSurface:
    00000330 78.12278748 ADrvEnableSurface - lock our surface
    00000331 78.12278748 ADrvEsurface
    00000332 78.12286377 ADrvNotify: DN_DRAWING_BEGIN
    00000333 78.12360382 ADrvNotify: DN_DEVICE_ORIGIN (1024,0)
    00000334 78.12402344 ADrvCompletePDEV
    00000335 78.12402344 ADrvCompletePDEV
    00000336 78.13651276 ADrvDisableSurface
    00000337 78.13653564 ADrvDsurface
    00000338 78.13654327 ADrvDisablePDEV
    00000339 78.16310883 ADrvAssertMode(fea04b38, 0)
    00000340 78.16326904 ADrvEnablePDEV:
    00000341 78.16328430 ADrvPDEV
    00000342 78.16339874 ADrvCompletePDEV
    00000343 78.16342163 ADrvEnableSurface:
    00000344 78.16411591 ADrvEnableSurface - lock our surface
    00000345 78.16412354 ADrvEsurface
    00000346 78.16420746 ADrvNotify: DN_DRAWING_BEGIN
    00000347 78.16493988 ADrvNotify: DN_DEVICE_ORIGIN (1024,0)
    00000348 78.16545868 ADrvCompletePDEV
    00000349 78.16545868 ADrvCompletePDEV
    00000350 78.17852020 ADrvDisableSurface
    00000351 78.17854309 ADrvDsurface
    00000352 78.17855072 ADrvDisablePDEV
    ----------------Start driver B OK ---------------------------------

    00000361 107.24395752 BDrvAssertMode(feb1a120, 1)
    00000362 107.54464722 BDrvAssertMode(feb1a120, 0)
    00000363 107.54485321 BDrvEnablePDEV:
    00000364 107.54486847 BDrvPDEV
    00000365 107.54500580 BDrvCompletePDEV
    00000366 107.54502106 BDrvEnableSurface:
    00000367 107.54504395 BDrvEnableSurface - lock our surface
    00000368 107.54505920 BDrvEsurface
    00000369 107.54673004 BDrvCompletePDEV
    00000370 107.54673004 BDrvCompletePDEV
    00000371 107.56929779 BDrvDisableSurface
    00000372 107.57209778 BDrvDsurface
    00000373 107.57210541 BDrvDisablePDEV
    00000374 107.59709167 BDrvAssertMode(fef442a8, 0)
    00000375 107.59726715 BDrvEnablePDEV:
    00000376 107.59728241 BDrvPDEV
    00000377 107.59741211 BDrvCompletePDEV
    00000378 107.59743500 BDrvEnableSurface:
    00000379 107.59745789 BDrvEnableSurface - lock our surface
    00000380 107.59745789 BDrvEsurface
    00000381 107.59883118 BDrvCompletePDEV
    00000382 107.59883881 BDrvCompletePDEV
    00000383 107.61106873 BDrvDisableSurface
    00000384 107.61109161 BDrvDsurface
    00000385 107.61109161 BDrvDisablePDEV
    00000386 107.63892365 BDrvAssertMode(ff4484b8, 0)
    00000387 107.63916779 BDrvEnablePDEV:
    00000388 107.63918304 BDrvPDEV
    00000389 107.63932800 BDrvCompletePDEV
    00000390 107.63934326 BDrvEnableSurface:
    00000391 107.64008331 BDrvEnableSurface - lock our surface
    00000392 107.64009094 BDrvEsurface
    00000393 107.64196014 BDrvCompletePDEV
    00000394 107.64196777 BDrvCompletePDEV
    00000395 107.65664673 BDrvDisableSurface
    00000396 107.65668488 BDrvDsurface
    00000397 107.65669250 BDrvDisablePDEV
    -------------------------------------------------------------
    First observation
    Driver B never has drvnotify.
    If renamed the dll's (virtualA.dll --> virtualB.dll and B to A) just to be
    sure that
    drivers where identical. But it is always the driver with the lowest screen
    number that get the drvnotify, not releated to dll.

    ------------starting A when B is runnning LOOPING ---------------
    [real (1024x768][B 1024x1280][A 1024x1280]

    00000401 123.32875824 ADrvAssertMode(feb311f0, 1)
    00000402 123.33076477 ADrvNotify: DN_DEVICE_ORIGIN (2048,0)
    00000403 123.62335205 ADrvAssertMode(feb311f0, 0)
    00000404 123.62371063 ADrvEnablePDEV:
    00000405 123.62373352 ADrvPDEV
    00000406 123.62387085 ADrvCompletePDEV
    00000407 123.62389374 ADrvEnableSurface:
    00000408 123.62391663 ADrvEnableSurface - lock our surface
    00000409 123.62391663 ADrvEsurface
    00000410 123.62400055 ADrvNotify: DN_DRAWING_BEGIN
    00000411 123.62474823 ADrvNotify: DN_DEVICE_ORIGIN (2048,0)
    00000412 123.62535858 ADrvCompletePDEV
    00000413 123.62536621 ADrvCompletePDEV
    00000414 123.64171600 ADrvDisableSurface
    00000415 123.64433289 ADrvDsurface
    00000416 123.64434814 ADrvDisablePDEV
    00000417 123.68189240 ADrvAssertMode(ff4484b8, 0)
    00000418 123.68206024 ADrvEnablePDEV:
    00000419 123.68207550 ADrvPDEV
    00000420 123.68221283 ADrvCompletePDEV
    00000421 123.68222046 ADrvEnableSurface:
    00000422 123.68225861 ADrvEnableSurface - lock our surface
    00000423 123.68225861 ADrvEsurface
    00000424 123.68233490 ADrvNotify: DN_DRAWING_BEGIN
    00000425 123.68312836 ADrvNotify: DN_DEVICE_ORIGIN (2048,0)
    00000426 123.68355560 ADrvCompletePDEV
    00000427 123.68355560 ADrvCompletePDEV
    00000428 123.69692993 ADrvDisableSurface
    00000429 123.69695282 ADrvDsurface
    00000430 123.69696045 ADrvDisablePDEV
    00000431 123.72312927 ADrvAssertMode(feb311f0, 0)
    00000432 123.72339630 ADrvEnablePDEV:
    00000433 123.72341919 ADrvPDEV
    00000434 123.72354889 ADrvCompletePDEV
    00000435 123.72357178 ADrvEnableSurface:
    00000436 123.72427368 ADrvEnableSurface - lock our surface
    00000437 123.72427368 ADrvEsurface
    00000438 123.72436523 ADrvNotify: DN_DRAWING_BEGIN
    00000439 123.72520447 ADrvNotify: DN_DEVICE_ORIGIN (2048,0)
    00000440 123.72574615 ADrvCompletePDEV
    00000441 123.72574615 ADrvCompletePDEV
    00000442 123.74198914 ADrvDisableSurface
    00000443 123.74201965 ADrvDsurface
    00000444 123.74202728 ADrvDisablePDEV
    00000445 123.99344635 BDrvAssertMode(ff43a350, 0)
    00000446 123.99362183 BDrvEnablePDEV:
    00000447 123.99363708 BDrvPDEV
    00000448 123.99376678 BDrvCompletePDEV
    00000449 123.99378967 BDrvEnableSurface:
    00000450 123.99381256 BDrvEnableSurface - lock our surface
    00000451 123.99381256 BDrvEsurface
    00000452 123.99470520 ADrvNotify: DN_DEVICE_ORIGIN (1664,0)
    00000453 123.99535370 BDrvCompletePDEV
    00000454 123.99536133 BDrvCompletePDEV
    00000455 124.01645660 BDrvDisableSurface
    00000456 124.01909637 BDrvDsurface
    00000457 124.01910400 BDrvDisablePDEV
    00000458 124.04107666 BDrvAssertMode(feb1a118, 0)
    00000459 124.04125214 BDrvEnablePDEV:
    00000460 124.04126740 BDrvPDEV
    00000461 124.04138947 BDrvCompletePDEV
    00000462 124.04141235 BDrvEnableSurface:
    00000463 124.04143524 BDrvEnableSurface - lock our surface
    00000464 124.04143524 BDrvEsurface
    00000465 124.04240417 ADrvNotify: DN_DEVICE_ORIGIN (1664,0)
    00000466 124.04282379 BDrvCompletePDEV
    00000467 124.04283142 BDrvCompletePDEV
    00000468 124.05725861 BDrvDisableSurface
    00000469 124.05728912 BDrvDsurface
    00000470 124.05728912 BDrvDisablePDEV
    00000471 124.08261108 BDrvAssertMode(ff43a350, 0)
    00000472 124.08277893 BDrvEnablePDEV:
    00000473 124.08280182 BDrvPDEV
    00000474 124.08292389 BDrvCompletePDEV
    00000475 124.08294678 BDrvEnableSurface:
    00000476 124.08363342 BDrvEnableSurface - lock our surface
    00000477 124.08364105 BDrvEsurface
    00000478 124.08496094 ADrvNotify: DN_DEVICE_ORIGIN (2048,0)
    00000479 124.08551025 BDrvCompletePDEV
    00000480 124.08551025 BDrvCompletePDEV
    00000481 124.10243225 BDrvDisableSurface
    00000482 124.10245514 BDrvDsurface
    00000483 124.10247040 BDrvDisablePDEV
    00000484 124.60281372 ADrvAssertMode(ff4484b8, 0)
    00000485 124.60300446 ADrvEnablePDEV:
    00000486 124.60301208 ADrvPDEV
    00000487 124.60314941 ADrvCompletePDEV
    00000488 124.60317230 ADrvEnableSurface:
    00000489 124.60319519 ADrvEnableSurface - lock our surface
    00000490 124.60319519 ADrvEsurface
    00000491 124.60327148 ADrvNotify: DN_DRAWING_BEGIN
    00000492 124.60402679 ADrvNotify: DN_DEVICE_ORIGIN (2048,0)
    00000493 124.60462952 ADrvCompletePDEV
    00000494 124.60462952 ADrvCompletePDEV
    00000495 124.62181854 ADrvDisableSurface
    00000496 124.62445068 ADrvDsurface
    00000497 124.62446594 ADrvDisablePDEV
    00000498 124.64775848 ADrvAssertMode(ff43a350, 0)
    00000499 124.64794159 ADrvEnablePDEV:
    00000500 124.64795685 ADrvPDEV
    00000501 124.64809418 ADrvCompletePDEV
    00000502 124.64810944 ADrvEnableSurface:
    00000503 124.64813995 ADrvEnableSurface - lock our surface
    00000504 124.64814758 ADrvEsurface
    00000505 124.64821625 ADrvNotify: DN_DRAWING_BEGIN
    00000506 124.64900970 ADrvNotify: DN_DEVICE_ORIGIN (2048,0)
    00000507 124.64944458 ADrvCompletePDEV
    00000508 124.64944458 ADrvCompletePDEV
    00000509 124.66358185 ADrvDisableSurface
    ---------------------------------------------------

    As you can see, the whole thing start looping
    line
    00000452 123.99470520 ADrvNotify: DN_DEVICE_ORIGIN (1664,0)
    look me realy strange.

    This problem is driving me crazy, did the xpdm model changed compared to XP ?
    Does vista support 3 xdmp drivers ? any know bugs...
     
    Rudi De Vos, Nov 27, 2006
    #1
    1. Advertisements

  2. When you talk about `virtual drivers` do you mean `mirror driver` ?
    The system design should not have changed in the XPDM area.
    In fact, when you have a WDDM video-card and you load a mirror driver,
    the system will use the cdd.dll `XPDM` driver, and, it will load any other
    mirror driver on the side.
    The system ships with one mirror driver, rdpencdd.dll.
    You can load that mirror driver by starting wincollab.exe,
    and sharing your desktop.
    Can you try to add one of your drivers while rdpencdd.dll is loaded ?
    Maybe it's a problem with one of them.
    The only suspicious thiung I can think of is that DrvNotify (in Vista)
    is being used `more often` since cdd.dll needs
    to refresh the screen using DxgKrnl.sys

    --
    --
    This posting is provided "AS IS" with no warranties, and confers no rights.
    Use of any included script samples are subject to the terms specified at
    http://www.microsoft.com/info/cpyright.htm


     
    Ivan Brugiolo [MSFT], Nov 27, 2006
    #2
    1. Advertisements

  3. Rudi De Vos

    Rudi De Vos Guest

    The Vista "mirror drivers" works fine and work with xpdm and wddm, i already
    tested that part. They even work better then on XP.

    With virtual drivers i mean a display driver without hardware, not a mirror
    driver.
    The virtual display drivers put there output to a viewer located on another
    PC.
    When you install them, your PC have 3 displays instead of one.
    (www.maxivista.com)










     
    Rudi De Vos, Nov 27, 2006
    #3
  4. I get the concept, and, per code inspection,
    there aren't any significant changes in that area compared to Win2003.
    The Device-Origin is being calculated from the DEVMODE::dmposition
    and DEVMODE::dmPelsWidth - DEVMODE::dmPelsHeight
    after the whole screen rectangle has been built.
    Conceptually, the code for mirror drivers and multi-mon is the same,
    that's why I was asking.
    3 or more monitors are quite common in the Microsoft Campus, so,
    I'm sure the basic scenario has been tested.

    --
    --
    This posting is provided "AS IS" with no warranties, and confers no rights.
    Use of any included script samples are subject to the terms specified at
    http://www.microsoft.com/info/cpyright.htm


     
    Ivan Brugiolo [MSFT], Nov 27, 2006
    #4
  5. Rudi De Vos

    Rudi De Vos Guest

    Thanks for the feedback.

    Indeed, a mirror ard virtual driver only differ a function.
    Still, i don't understand why it work on w2K, xp, w2k3,mce,.... and only fail
    on Vista(xpdm).

    Can you confirm that they are using 3 independed xpdm (not wddm) drivers on
    Vista ?

    I will test again, using the mirror sample, remove drvescape and add
    drvgetmodes.
    This is the most basic driver I can make...
     
    Rudi De Vos, Nov 27, 2006
    #5
  6. Rudi De Vos

    Rudi De Vos Guest

    Even the basic mirror driver( remove escape add drvgetmodes)
    Start looping as soon as you activate test1 and test2

    I prepared a zip (src,dll,sys,inf) , so you can see it yourself.
    Only take 10 minutes if you have a Vista PC with a xpdm driver on it :)
    Can i mail our upload the zip somewhere ?
     
    Rudi De Vos, Nov 27, 2006
    #6
  7. You can send the package with your changes
    at the replay-to address without the `online` part,
    but, I cannot promise much. If you really need support,
    PSS is probably the best place to ask.

    BTW,
    What's the rationale behind removing DrvGetModes ?
    I'm not sure how Win32k.sys can find which modes your display driver
    supports.

    I don't have a non WDDM machine, but, installing the VGA driver should work,
    and, I still belive that cdd.dll is a legitimate XPDM driver
     
    Ivan Brugiolo [MSFT], Nov 27, 2006
    #7
  8. Rudi De Vos

    Rudi De Vos Guest

    My english is not always that clear...

    Compared to the mirror driver,
    drvescape : removed
    drvgetmodes: added
     
    Rudi De Vos, Nov 27, 2006
    #8
  9. OK, now it makes sense. Sorry for the confusion
    BTW, you can have DrvEscape in a display driver.
    Please send the modified sources, and,
    I will try to find some time to look at them.
     
    Ivan Brugiolo [MSFT], Nov 27, 2006
    #9
  10. Rudi De Vos

    Rudi De Vos Guest

    Mail send,
    content test.zip

    Yep, normal i have drvescape to activate and desactivate driver cursor
    support.
    But for testing, made it as simple as possible...to exclude al possible
    errors in
    non essential functions.

    Source == mirror, only added a DrvGetModes, to tell the supported displays.
    Could not be that difficult for a guru like you :)
     
    Rudi De Vos, Nov 27, 2006
    #10
  11. Rudi De Vos

    Rudi De Vos Guest

    With the standard vga driver, it seems that the same effect already happen
    when you activate only one. (test1)
     
    Rudi De Vos, Nov 28, 2006
    #11
  12. I think I got it working on Longhorn Server,
    with minimal modification to your example.
    Here are my findings/steps.

    -1-
    I removed the PnP support from the MiniPort.
    I did not want to spend time implementing
    the proper code in HwVidGetVideoChildDescriptor.

    -2-
    I Installed the `vga` driver on a machine with WDDM.
    You cannot have a mixture of XPDM and WDDM driver.
    Only mirror drivers are allowed to be `XPDM` while the machine is WDDM.

    -3-
    Since it was a server SKU, I modified KUSER_SHARED_DATA
    to simulate a Client SKU to prevent Win32k from pruning
    the VGA display driver from the device-list.
    [I belive this is a trick to allow server machines to boot without any video
    adapter.
    You do not need this on a real client SKU, or on a non VGA XPDM driver].

    The overall monitor composition looks like:

    +----------+
    | |
    | VGA |
    | |
    | | (800,600)
    +----------+-----------+ (600,1024)
    | (0,600) |
    | |
    | |
    | Test1 |
    | |
    | |
    | |
    | |
    | |
    +----------------------+

    I emailed the PNG of desk.cpl with the overall changes.

    Good luck with the real code
     
    Ivan Brugiolo [MSFT], Nov 28, 2006
    #12
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.