Hi,

I have a pending rewrite of the driver loading code in
branches/reactos-yarotows.
It should hopefully fix the issues and load eVb's driver.
It's mostly done, I experienced some random lock ups, though and had to
take a break from that code.

Regards,
Timo

[email protected] schrieb:
> Author: sir_richard
> Date: Thu Mar 11 18:46:15 2010
> New Revision: 46103
>
> URL: http://svn.reactos.org/svn/reactos?rev=46103&view=rev
> Log:
> [WIN32K]: Stop memory corruption when InstalledDisplayDrivers has more than 
> one driver in the list. Note that driver loading is inherently broken right 
> now, as the list of drivers is not parsed properly (this breaks eVb's VGA/VBE 
> driver).
>
> Modified:
>     trunk/reactos/subsystems/win32/win32k/objects/device.c
>
> Modified: trunk/reactos/subsystems/win32/win32k/objects/device.c
> URL: 
> http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/device.c?rev=46103&r1=46102&r2=46103&view=diff
> ==============================================================================
> --- trunk/reactos/subsystems/win32/win32k/objects/device.c [iso-8859-1] 
> (original)
> +++ trunk/reactos/subsystems/win32/win32k/objects/device.c [iso-8859-1] Thu 
> Mar 11 18:46:15 2010
> @@ -59,12 +59,37 @@
>      return TRUE;
>  }
>  
> +
> +NTSTATUS
> +NTAPI
> +EnumDisplayQueryRoutine(IN PWSTR ValueName,
> +                        IN ULONG ValueType,
> +                        IN PVOID ValueData,
> +                        IN ULONG ValueLength,
> +                        IN PVOID Context,
> +                        IN PVOID EntryContext)
> +{
> +    if ((Context == NULL) && ((ValueType == REG_SZ) || (ValueType == 
> REG_MULTI_SZ)))
> +    {
> +        *(PULONG)EntryContext = ValueLength;
> +    }
> +    else
> +    {
> +        DPRINT1("Value data: %S %d\n", ValueData, ValueLength);
> +        RtlCopyMemory(Context, ValueData, ValueLength);
> +    }
> +
> +    return STATUS_SUCCESS;
> +}
> +
>  static BOOL FASTCALL
>  FindDriverFileNames(PUNICODE_STRING DriverFileNames, ULONG DisplayNumber)
>  {
>      RTL_QUERY_REGISTRY_TABLE QueryTable[2];
>      UNICODE_STRING RegistryPath;
>      NTSTATUS Status;
> +    PWCHAR DriverNames = NULL;
> +    ULONG Length = 0;
>  
>      if (! GetRegistryPath(&RegistryPath, DisplayNumber))
>      {
> @@ -73,23 +98,40 @@
>      }
>  
>      RtlZeroMemory(QueryTable, sizeof(QueryTable));
> -    QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | 
> RTL_QUERY_REGISTRY_DIRECT;
> +    QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | 
> RTL_QUERY_REGISTRY_NOEXPAND;
>      QueryTable[0].Name = L"InstalledDisplayDrivers";
> -    QueryTable[0].EntryContext = DriverFileNames;
> +    QueryTable[0].EntryContext = &Length;
> +    QueryTable[0].QueryRoutine = EnumDisplayQueryRoutine;
>  
>      Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
>                                      RegistryPath.Buffer,
>                                      QueryTable,
>                                      NULL,
>                                      NULL);
> + //   DPRINT1("Status: %lx\n", Status);
> +    if (Length)
> +    {
> +        DriverNames = ExAllocatePool(PagedPool, Length);
> +       // DPRINT1("Length allocated: %d\n", Length);
> +        Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
> +                                        RegistryPath.Buffer,
> +                                        QueryTable,
> +                                        DriverNames,
> +                                        NULL);
> +        if (!NT_SUCCESS(Status)) DriverNames = NULL;
> +    }
> +
>      ExFreePoolWithTag(RegistryPath.Buffer, TAG_RTLREGISTRY);
>      if (! NT_SUCCESS(Status))
>      {
>          DPRINT1("No InstalledDisplayDrivers value in service entry found\n");
>          return FALSE;
>      }
> -
> -    DPRINT("DriverFileNames %S\n", DriverFileNames->Buffer);
> +    
> +    RtlInitUnicodeString(DriverFileNames, DriverNames);
> +    DriverFileNames->Length = Length;
> +    DriverFileNames->MaximumLength = Length;
> +    //DPRINT1("DriverFileNames %wZ\n", DriverFileNames);
>  
>      return TRUE;
>  }
> @@ -301,7 +343,7 @@
>              continue;
>          }
>  
> -        DPRINT("Display driver %S loaded\n", CurrentName);
> +        DPRINT1("Display driver %S loaded\n", CurrentName);
>  
>          ExFreePoolWithTag(DriverFileNames.Buffer, TAG_RTLREGISTRY);
>  
>
>
>
>   


_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to