Re: [ros-dev] [ros-diffs] [pschweitzer] 69221: [MOUNTMGR] Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: - Implement WriteRemoteDatabaseEntry() - Implement MountMgrVolumeMountPointCrea

2015-09-15 Thread Alex Ionescu
yes

Best regards,
Alex Ionescu

On Mon, Sep 14, 2015 at 3:16 AM, Pierre Schweitzer 
wrote:

> Refering to CVE-2015-1769/MS15-085?
>
> On 14/09/2015 05:24, Alex Ionescu wrote:
> > Lol, make sure not to implement the huge vulnerability Microsoft patched
> > two months ago (win2k->xp-style database migration).
> >
> > Best regards,
> > Alex Ionescu
> >
> > On Sun, Sep 13, 2015 at 6:52 PM,  wrote:
> >
> >> Author: pschweitzer
> >> Date: Sun Sep 13 22:52:07 2015
> >> New Revision: 69221
> >>
> >> URL: http://svn.reactos.org/svn/reactos?rev=69221=rev
> >> Log:
> >> [MOUNTMGR]
> >> Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED:
> >> - Implement WriteRemoteDatabaseEntry()
> >> - Implement MountMgrVolumeMountPointCreated()
> >>
> >> Modified:
> >> trunk/reactos/drivers/filters/mountmgr/database.c
> >> trunk/reactos/drivers/filters/mountmgr/device.c
> >> trunk/reactos/drivers/filters/mountmgr/mntmgr.h
> >> trunk/reactos/drivers/filters/mountmgr/mountmgr.c
> >>
> >> Modified: trunk/reactos/drivers/filters/mountmgr/database.c
> >> URL:
> >>
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/database.c?rev=69221=69220=69221=diff
> >>
> >>
> ==
> >> --- trunk/reactos/drivers/filters/mountmgr/database.c   [iso-8859-1]
> >> (original)
> >> +++ trunk/reactos/drivers/filters/mountmgr/database.c   [iso-8859-1] Sun
> >> Sep 13 22:52:07 2015
> >> @@ -192,6 +192,39 @@
> >>  }
> >>
> >>  return Entry;
> >> +}
> >> +
> >> +/*
> >> + * @implemented
> >> + */
> >> +NTSTATUS
> >> +WriteRemoteDatabaseEntry(IN HANDLE Database,
> >> + IN LONG Offset,
> >> + IN PDATABASE_ENTRY Entry)
> >> +{
> >> +NTSTATUS Status;
> >> +LARGE_INTEGER ByteOffset;
> >> +IO_STATUS_BLOCK IoStatusBlock;
> >> +
> >> +ByteOffset.QuadPart = Offset;
> >> +Status = ZwWriteFile(Database,
> >> + NULL,
> >> + NULL,
> >> + NULL,
> >> + ,
> >> + Entry,
> >> + Entry->EntrySize,
> >> + ,
> >> + NULL);
> >> +if (NT_SUCCESS(Status))
> >> +{
> >> +if (IoStatusBlock.Information < Entry->EntrySize)
> >> +{
> >> +Status = STATUS_INSUFFICIENT_RESOURCES;
> >> +}
> >> +}
> >> +
> >> +return Status;
> >>  }
> >>
> >>  /*
> >>
> >> Modified: trunk/reactos/drivers/filters/mountmgr/device.c
> >> URL:
> >>
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/device.c?rev=69221=69220=69221=diff
> >>
> >>
> ==
> >> --- trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1]
> >> (original)
> >> +++ trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] Sun
> >> Sep 13 22:52:07 2015
> >> @@ -1688,15 +1688,242 @@
> >>  return Status;
> >>  }
> >>
> >> +/*
> >> + * @implemented
> >> + */
> >>  NTSTATUS
> >>  MountMgrVolumeMountPointCreated(IN PDEVICE_EXTENSION DeviceExtension,
> >>  IN PIRP Irp,
> >>  IN NTSTATUS LockStatus)
> >>  {
> >> -UNREFERENCED_PARAMETER(DeviceExtension);
> >> -UNREFERENCED_PARAMETER(Irp);
> >> -UNREFERENCED_PARAMETER(LockStatus);
> >> -return STATUS_NOT_IMPLEMENTED;
> >> +LONG Offset;
> >> +BOOLEAN Found;
> >> +NTSTATUS Status;
> >> +HANDLE RemoteDatabase;
> >> +PMOUNTDEV_UNIQUE_ID UniqueId;
> >> +PDATABASE_ENTRY DatabaseEntry;
> >> +PASSOCIATED_DEVICE_ENTRY AssociatedEntry;
> >> +PDEVICE_INFORMATION DeviceInformation, TargetDeviceInformation;
> >> +UNICODE_STRING LinkTarget, SourceDeviceName, SourceSymbolicName,
> >> TargetVolumeName, VolumeName, DbName;
> >> +
> >> +/* Initialize string */
> >> +LinkTarget.Length = 0;
> >> +LinkTarget.MaximumLength = 0xC8;
> >> +LinkTarget.Buffer = AllocatePool(LinkTarget.MaximumLength);
> >> +if (LinkTarget.Buffer == NULL)
> >> +{
> >> +return STATUS_INSUFFICIENT_RESOURCES;
> >> +}
> >> +
> >> +/* If the mount point was created, then, it changed!
> >> + * Also use it to query some information
> >> + */
> >> +Status = MountMgrVolumeMountPointChanged(DeviceExtension, Irp,
> >> LockStatus, , , );
> >> +/* Pending means DB are under synchronization, bail out */
> >> +if (Status == STATUS_PENDING)
> >> +{
> >> +FreePool(LinkTarget.Buffer);
> >> +FreePool(SourceDeviceName.Buffer);
> >> +FreePool(SourceSymbolicName.Buffer);
> >> +return STATUS_PENDING;
> >> +}
> >> +else if (!NT_SUCCESS(Status))
> >> +{
> >> +FreePool(LinkTarget.Buffer);
> >> +return Status;
> >> +}
> >> +
> >> +   

Re: [ros-dev] [ros-diffs] [pschweitzer] 69221: [MOUNTMGR] Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: - Implement WriteRemoteDatabaseEntry() - Implement MountMgrVolumeMountPointCrea

2015-09-14 Thread Pierre Schweitzer
Refering to CVE-2015-1769/MS15-085?

On 14/09/2015 05:24, Alex Ionescu wrote:
> Lol, make sure not to implement the huge vulnerability Microsoft patched
> two months ago (win2k->xp-style database migration).
> 
> Best regards,
> Alex Ionescu
> 
> On Sun, Sep 13, 2015 at 6:52 PM,  wrote:
> 
>> Author: pschweitzer
>> Date: Sun Sep 13 22:52:07 2015
>> New Revision: 69221
>>
>> URL: http://svn.reactos.org/svn/reactos?rev=69221=rev
>> Log:
>> [MOUNTMGR]
>> Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED:
>> - Implement WriteRemoteDatabaseEntry()
>> - Implement MountMgrVolumeMountPointCreated()
>>
>> Modified:
>> trunk/reactos/drivers/filters/mountmgr/database.c
>> trunk/reactos/drivers/filters/mountmgr/device.c
>> trunk/reactos/drivers/filters/mountmgr/mntmgr.h
>> trunk/reactos/drivers/filters/mountmgr/mountmgr.c
>>
>> Modified: trunk/reactos/drivers/filters/mountmgr/database.c
>> URL:
>> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/database.c?rev=69221=69220=69221=diff
>>
>> ==
>> --- trunk/reactos/drivers/filters/mountmgr/database.c   [iso-8859-1]
>> (original)
>> +++ trunk/reactos/drivers/filters/mountmgr/database.c   [iso-8859-1] Sun
>> Sep 13 22:52:07 2015
>> @@ -192,6 +192,39 @@
>>  }
>>
>>  return Entry;
>> +}
>> +
>> +/*
>> + * @implemented
>> + */
>> +NTSTATUS
>> +WriteRemoteDatabaseEntry(IN HANDLE Database,
>> + IN LONG Offset,
>> + IN PDATABASE_ENTRY Entry)
>> +{
>> +NTSTATUS Status;
>> +LARGE_INTEGER ByteOffset;
>> +IO_STATUS_BLOCK IoStatusBlock;
>> +
>> +ByteOffset.QuadPart = Offset;
>> +Status = ZwWriteFile(Database,
>> + NULL,
>> + NULL,
>> + NULL,
>> + ,
>> + Entry,
>> + Entry->EntrySize,
>> + ,
>> + NULL);
>> +if (NT_SUCCESS(Status))
>> +{
>> +if (IoStatusBlock.Information < Entry->EntrySize)
>> +{
>> +Status = STATUS_INSUFFICIENT_RESOURCES;
>> +}
>> +}
>> +
>> +return Status;
>>  }
>>
>>  /*
>>
>> Modified: trunk/reactos/drivers/filters/mountmgr/device.c
>> URL:
>> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/device.c?rev=69221=69220=69221=diff
>>
>> ==
>> --- trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1]
>> (original)
>> +++ trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] Sun
>> Sep 13 22:52:07 2015
>> @@ -1688,15 +1688,242 @@
>>  return Status;
>>  }
>>
>> +/*
>> + * @implemented
>> + */
>>  NTSTATUS
>>  MountMgrVolumeMountPointCreated(IN PDEVICE_EXTENSION DeviceExtension,
>>  IN PIRP Irp,
>>  IN NTSTATUS LockStatus)
>>  {
>> -UNREFERENCED_PARAMETER(DeviceExtension);
>> -UNREFERENCED_PARAMETER(Irp);
>> -UNREFERENCED_PARAMETER(LockStatus);
>> -return STATUS_NOT_IMPLEMENTED;
>> +LONG Offset;
>> +BOOLEAN Found;
>> +NTSTATUS Status;
>> +HANDLE RemoteDatabase;
>> +PMOUNTDEV_UNIQUE_ID UniqueId;
>> +PDATABASE_ENTRY DatabaseEntry;
>> +PASSOCIATED_DEVICE_ENTRY AssociatedEntry;
>> +PDEVICE_INFORMATION DeviceInformation, TargetDeviceInformation;
>> +UNICODE_STRING LinkTarget, SourceDeviceName, SourceSymbolicName,
>> TargetVolumeName, VolumeName, DbName;
>> +
>> +/* Initialize string */
>> +LinkTarget.Length = 0;
>> +LinkTarget.MaximumLength = 0xC8;
>> +LinkTarget.Buffer = AllocatePool(LinkTarget.MaximumLength);
>> +if (LinkTarget.Buffer == NULL)
>> +{
>> +return STATUS_INSUFFICIENT_RESOURCES;
>> +}
>> +
>> +/* If the mount point was created, then, it changed!
>> + * Also use it to query some information
>> + */
>> +Status = MountMgrVolumeMountPointChanged(DeviceExtension, Irp,
>> LockStatus, , , );
>> +/* Pending means DB are under synchronization, bail out */
>> +if (Status == STATUS_PENDING)
>> +{
>> +FreePool(LinkTarget.Buffer);
>> +FreePool(SourceDeviceName.Buffer);
>> +FreePool(SourceSymbolicName.Buffer);
>> +return STATUS_PENDING;
>> +}
>> +else if (!NT_SUCCESS(Status))
>> +{
>> +FreePool(LinkTarget.Buffer);
>> +return Status;
>> +}
>> +
>> +/* Query the device information */
>> +Status = FindDeviceInfo(DeviceExtension, , FALSE,
>> );
>> +if (!NT_SUCCESS(Status))
>> +{
>> +/* If it failed, first try to get volume name */
>> +Status = QueryVolumeName(0, NULL, , ,
>> );
>> +if (!NT_SUCCESS(Status))
>> +{
>> +/* Then, try to read the symlink */
>> +Status = 

Re: [ros-dev] [ros-diffs] [pschweitzer] 69221: [MOUNTMGR] Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: - Implement WriteRemoteDatabaseEntry() - Implement MountMgrVolumeMountPointCrea

2015-09-14 Thread Ameer Ali
u can implement thisit is wonderful

On Mon, Sep 14, 2015 at 8:54 AM, Alex Ionescu  wrote:

> Lol, make sure not to implement the huge vulnerability Microsoft patched
> two months ago (win2k->xp-style database migration).
>
> Best regards,
> Alex Ionescu
>
> On Sun, Sep 13, 2015 at 6:52 PM,  wrote:
>
>> Author: pschweitzer
>> Date: Sun Sep 13 22:52:07 2015
>> New Revision: 69221
>>
>> URL: http://svn.reactos.org/svn/reactos?rev=69221=rev
>> Log:
>> [MOUNTMGR]
>> Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED:
>> - Implement WriteRemoteDatabaseEntry()
>> - Implement MountMgrVolumeMountPointCreated()
>>
>> Modified:
>> trunk/reactos/drivers/filters/mountmgr/database.c
>> trunk/reactos/drivers/filters/mountmgr/device.c
>> trunk/reactos/drivers/filters/mountmgr/mntmgr.h
>> trunk/reactos/drivers/filters/mountmgr/mountmgr.c
>>
>> Modified: trunk/reactos/drivers/filters/mountmgr/database.c
>> URL:
>> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/database.c?rev=69221=69220=69221=diff
>>
>> ==
>> --- trunk/reactos/drivers/filters/mountmgr/database.c   [iso-8859-1]
>> (original)
>> +++ trunk/reactos/drivers/filters/mountmgr/database.c   [iso-8859-1] Sun
>> Sep 13 22:52:07 2015
>> @@ -192,6 +192,39 @@
>>  }
>>
>>  return Entry;
>> +}
>> +
>> +/*
>> + * @implemented
>> + */
>> +NTSTATUS
>> +WriteRemoteDatabaseEntry(IN HANDLE Database,
>> + IN LONG Offset,
>> + IN PDATABASE_ENTRY Entry)
>> +{
>> +NTSTATUS Status;
>> +LARGE_INTEGER ByteOffset;
>> +IO_STATUS_BLOCK IoStatusBlock;
>> +
>> +ByteOffset.QuadPart = Offset;
>> +Status = ZwWriteFile(Database,
>> + NULL,
>> + NULL,
>> + NULL,
>> + ,
>> + Entry,
>> + Entry->EntrySize,
>> + ,
>> + NULL);
>> +if (NT_SUCCESS(Status))
>> +{
>> +if (IoStatusBlock.Information < Entry->EntrySize)
>> +{
>> +Status = STATUS_INSUFFICIENT_RESOURCES;
>> +}
>> +}
>> +
>> +return Status;
>>  }
>>
>>  /*
>>
>> Modified: trunk/reactos/drivers/filters/mountmgr/device.c
>> URL:
>> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/device.c?rev=69221=69220=69221=diff
>>
>> ==
>> --- trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1]
>> (original)
>> +++ trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] Sun
>> Sep 13 22:52:07 2015
>> @@ -1688,15 +1688,242 @@
>>  return Status;
>>  }
>>
>> +/*
>> + * @implemented
>> + */
>>  NTSTATUS
>>  MountMgrVolumeMountPointCreated(IN PDEVICE_EXTENSION DeviceExtension,
>>  IN PIRP Irp,
>>  IN NTSTATUS LockStatus)
>>  {
>> -UNREFERENCED_PARAMETER(DeviceExtension);
>> -UNREFERENCED_PARAMETER(Irp);
>> -UNREFERENCED_PARAMETER(LockStatus);
>> -return STATUS_NOT_IMPLEMENTED;
>> +LONG Offset;
>> +BOOLEAN Found;
>> +NTSTATUS Status;
>> +HANDLE RemoteDatabase;
>> +PMOUNTDEV_UNIQUE_ID UniqueId;
>> +PDATABASE_ENTRY DatabaseEntry;
>> +PASSOCIATED_DEVICE_ENTRY AssociatedEntry;
>> +PDEVICE_INFORMATION DeviceInformation, TargetDeviceInformation;
>> +UNICODE_STRING LinkTarget, SourceDeviceName, SourceSymbolicName,
>> TargetVolumeName, VolumeName, DbName;
>> +
>> +/* Initialize string */
>> +LinkTarget.Length = 0;
>> +LinkTarget.MaximumLength = 0xC8;
>> +LinkTarget.Buffer = AllocatePool(LinkTarget.MaximumLength);
>> +if (LinkTarget.Buffer == NULL)
>> +{
>> +return STATUS_INSUFFICIENT_RESOURCES;
>> +}
>> +
>> +/* If the mount point was created, then, it changed!
>> + * Also use it to query some information
>> + */
>> +Status = MountMgrVolumeMountPointChanged(DeviceExtension, Irp,
>> LockStatus, , , );
>> +/* Pending means DB are under synchronization, bail out */
>> +if (Status == STATUS_PENDING)
>> +{
>> +FreePool(LinkTarget.Buffer);
>> +FreePool(SourceDeviceName.Buffer);
>> +FreePool(SourceSymbolicName.Buffer);
>> +return STATUS_PENDING;
>> +}
>> +else if (!NT_SUCCESS(Status))
>> +{
>> +FreePool(LinkTarget.Buffer);
>> +return Status;
>> +}
>> +
>> +/* Query the device information */
>> +Status = FindDeviceInfo(DeviceExtension, , FALSE,
>> );
>> +if (!NT_SUCCESS(Status))
>> +{
>> +/* If it failed, first try to get volume name */
>> +Status = QueryVolumeName(0, NULL, ,
>> , );
>> +if (!NT_SUCCESS(Status))
>> +{
>> +/* Then, try to read the symlink */
>> 

Re: [ros-dev] [ros-diffs] [pschweitzer] 69221: [MOUNTMGR] Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: - Implement WriteRemoteDatabaseEntry() - Implement MountMgrVolumeMountPointCrea

2015-09-13 Thread Alex Ionescu
Lol, make sure not to implement the huge vulnerability Microsoft patched
two months ago (win2k->xp-style database migration).

Best regards,
Alex Ionescu

On Sun, Sep 13, 2015 at 6:52 PM,  wrote:

> Author: pschweitzer
> Date: Sun Sep 13 22:52:07 2015
> New Revision: 69221
>
> URL: http://svn.reactos.org/svn/reactos?rev=69221=rev
> Log:
> [MOUNTMGR]
> Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED:
> - Implement WriteRemoteDatabaseEntry()
> - Implement MountMgrVolumeMountPointCreated()
>
> Modified:
> trunk/reactos/drivers/filters/mountmgr/database.c
> trunk/reactos/drivers/filters/mountmgr/device.c
> trunk/reactos/drivers/filters/mountmgr/mntmgr.h
> trunk/reactos/drivers/filters/mountmgr/mountmgr.c
>
> Modified: trunk/reactos/drivers/filters/mountmgr/database.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/database.c?rev=69221=69220=69221=diff
>
> ==
> --- trunk/reactos/drivers/filters/mountmgr/database.c   [iso-8859-1]
> (original)
> +++ trunk/reactos/drivers/filters/mountmgr/database.c   [iso-8859-1] Sun
> Sep 13 22:52:07 2015
> @@ -192,6 +192,39 @@
>  }
>
>  return Entry;
> +}
> +
> +/*
> + * @implemented
> + */
> +NTSTATUS
> +WriteRemoteDatabaseEntry(IN HANDLE Database,
> + IN LONG Offset,
> + IN PDATABASE_ENTRY Entry)
> +{
> +NTSTATUS Status;
> +LARGE_INTEGER ByteOffset;
> +IO_STATUS_BLOCK IoStatusBlock;
> +
> +ByteOffset.QuadPart = Offset;
> +Status = ZwWriteFile(Database,
> + NULL,
> + NULL,
> + NULL,
> + ,
> + Entry,
> + Entry->EntrySize,
> + ,
> + NULL);
> +if (NT_SUCCESS(Status))
> +{
> +if (IoStatusBlock.Information < Entry->EntrySize)
> +{
> +Status = STATUS_INSUFFICIENT_RESOURCES;
> +}
> +}
> +
> +return Status;
>  }
>
>  /*
>
> Modified: trunk/reactos/drivers/filters/mountmgr/device.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/device.c?rev=69221=69220=69221=diff
>
> ==
> --- trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1]
> (original)
> +++ trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] Sun
> Sep 13 22:52:07 2015
> @@ -1688,15 +1688,242 @@
>  return Status;
>  }
>
> +/*
> + * @implemented
> + */
>  NTSTATUS
>  MountMgrVolumeMountPointCreated(IN PDEVICE_EXTENSION DeviceExtension,
>  IN PIRP Irp,
>  IN NTSTATUS LockStatus)
>  {
> -UNREFERENCED_PARAMETER(DeviceExtension);
> -UNREFERENCED_PARAMETER(Irp);
> -UNREFERENCED_PARAMETER(LockStatus);
> -return STATUS_NOT_IMPLEMENTED;
> +LONG Offset;
> +BOOLEAN Found;
> +NTSTATUS Status;
> +HANDLE RemoteDatabase;
> +PMOUNTDEV_UNIQUE_ID UniqueId;
> +PDATABASE_ENTRY DatabaseEntry;
> +PASSOCIATED_DEVICE_ENTRY AssociatedEntry;
> +PDEVICE_INFORMATION DeviceInformation, TargetDeviceInformation;
> +UNICODE_STRING LinkTarget, SourceDeviceName, SourceSymbolicName,
> TargetVolumeName, VolumeName, DbName;
> +
> +/* Initialize string */
> +LinkTarget.Length = 0;
> +LinkTarget.MaximumLength = 0xC8;
> +LinkTarget.Buffer = AllocatePool(LinkTarget.MaximumLength);
> +if (LinkTarget.Buffer == NULL)
> +{
> +return STATUS_INSUFFICIENT_RESOURCES;
> +}
> +
> +/* If the mount point was created, then, it changed!
> + * Also use it to query some information
> + */
> +Status = MountMgrVolumeMountPointChanged(DeviceExtension, Irp,
> LockStatus, , , );
> +/* Pending means DB are under synchronization, bail out */
> +if (Status == STATUS_PENDING)
> +{
> +FreePool(LinkTarget.Buffer);
> +FreePool(SourceDeviceName.Buffer);
> +FreePool(SourceSymbolicName.Buffer);
> +return STATUS_PENDING;
> +}
> +else if (!NT_SUCCESS(Status))
> +{
> +FreePool(LinkTarget.Buffer);
> +return Status;
> +}
> +
> +/* Query the device information */
> +Status = FindDeviceInfo(DeviceExtension, , FALSE,
> );
> +if (!NT_SUCCESS(Status))
> +{
> +/* If it failed, first try to get volume name */
> +Status = QueryVolumeName(0, NULL, , ,
> );
> +if (!NT_SUCCESS(Status))
> +{
> +/* Then, try to read the symlink */
> +Status = MountMgrQuerySymbolicLink(,
> );
> +if (!NT_SUCCESS(Status))
> +{
> +FreePool(LinkTarget.Buffer);
> +FreePool(SourceDeviceName.Buffer);
> +FreePool(SourceSymbolicName.Buffer);
> +