On Sep 6, 2013, at 9:41 AM, Deric Cole <[email protected]> wrote:

> I always thought type 'X' was always assumed to be a UINTN, but apparently I 
> was wrong. Maybe what is missing here is a new [flag], call it 'N', which is 
> equivalent 'L' in 64-bit builds, and ignored in 32-bit builds.
> 

It was in EDK days, but we ran into an issue with var args with some compilers 
and had to change it in edk2. The problem was that math in C was ending up with 
a result that was an int and the compiler would only push 32-bits for the 
64-bit slot. If the other 32-bits on the stack were non zero then you would see 
junk. 

You may be able to use %p.

Thanks,

Andrew Fish 

> Deric Cole
> Sr. Customer Engineer
> Phoenix Technologies Ltd.
> 
> -----Original Message-----
> From: Andrew Fish [mailto:[email protected]]
> Sent: Friday, September 06, 2013 9:27 AM
> To: [email protected]
> Subject: Re: [edk2] Printing UINTN numbers in X64 (David F.)
> 
> 
> Andrew Fish
> 
> 
> 
> 
> 
> On Sep 6, 2013, at 9:05 AM, Alexei Fedorov <[email protected]> wrote:
> 
>> What I meant was using 0x%x for 64-bit UINTN:
>> ...size=0x%x\n", ...BufferSize
>>>> DEBUG ((EFI_D_INFO, "BlockIo (MMIO) ReadBlocks: lba=0x%lx, size=0x%x\n", 
>>>> Lba, BufferSize));
>>> Shouldn't that be %llx and not %lx
>> 
> 
> Print() is not ANSI C. It also changed as in the EDK %X was a UINTN, so the 
> bug you see could be something that was missed when the change happened.
> 
>> From 
>> https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdePkg/Include/Library/PrintLib.h
> 
> This does not follow the ANSI C standard for sprint().  The format of argument
>  descriptors is described below.  The ANSI C standard for sprint() has been
>  followed for some of the format types, and has not been followed for others.
>  The exceptions are noted below.
> 
>    %[flags][width][.precision]type
> 
>  [flags]:
>    - -
>      - The field is left justified.  If not flag is not specified, then the
>        field is right justified.
>    - space
>      - Prefix a space character to a number.  Only valid for types X, x, and 
> d.
>    - +
>      - Prefix a plus character to a number.  Only valid for types X, x, and d.
>        If both space and + are specified, then space is ignored.
>    - 0
>      - Pad with 0 characters to the left of a number.  Only valid for types
>        X, x, and d.
>    - ,
>      - Place a comma every 3rd digit of the number.  Only valid for type d.
>        If 0 is also specified, then 0 is ignored.
>    - L, l
>      - The number being printed is size UINT64.  Only valid for types X, x, 
> and d.
>        If this flag is not specified, then the number being printed is size 
> int.
>    - NOTE: All invalid flags are ignored.
> 
>  [width]:
> 
>    - *
>      - The width of the field is specified by a UINTN argument in the
>        argument list.
>    - number
>      - The number specified as a decimal value represents the width of
>        the field.
>    - NOTE: If [width] is not specified, then a field width of 0 is assumed.
> 
>  [.precision]:
> 
>    - *
>      - The precision of the field is specified by a UINTN argument in the
>        argument list.
>    - number
>      - The number specified as a decimal value represents the precision of
>        the field.
>    - NOTE: If [.precision] is not specified, then a precision of 0 is assumed.
> 
>  type:
> 
>    - %
>      - Print a %%.
>    - c
>      - The argument is a Unicode character.  ASCII characters can be printed
>        using this type too by making sure bits 8..15 of the argument are set 
> to 0.
>    - x
>      - The argument is an unsigned hexadecimal number.  The characters used 
> are 0..9 and
>        A..F.  If the flag 'L' is not specified, then the argument is assumed
>        to be size int.  This does not follow ANSI C.
>    - X
>      - The argument is an unsigned hexadecimal number and the number is 
> padded with
>        zeros.  This is equivalent to a format string of "0x". If the flag
>        'L' is not specified, then the argument is assumed to be size int.
>        This does not follow ANSI C.
>    - d
>      - The argument is a signed decimal number.  If the flag 'L' is not 
> specified,
>        then the argument is assumed to be size int.
>    - p
>      - The argument is a pointer that is a (VOID *), and it is printed as an
>        unsigned hexadecimal number  The characters used are 0..9 and A..F.
>    - a
>      - The argument is a pointer to an ASCII string.
>        This does not follow ANSI C.
>    - S, s
>      - The argument is a pointer to a Unicode string.
>        This does not follow ANSI C.
>    - g
>      - The argument is a pointer to a GUID structure.  The GUID is printed
>        in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
>        This does not follow ANSI C.
>    - t
>      - The argument is a pointer to an EFI_TIME structure.  The time and
>        date are printed in the format "mm/dd/yyyy hh:mm" where mm is the
>        month zero padded, dd is the day zero padded, yyyy is the year zero
>        padded, hh is the hour zero padded, and mm is minutes zero padded.
>        This does not follow ANSI C.
>    - r
>      - The argument is a RETURN_STATUS value.  This value is converted to
>        a string following the table below.  This does not follow ANSI C.
>      - RETURN_SUCCESS
>        - "Success"
>      - RETURN_LOAD_ERROR
>        - "Load Error"
>      - RETURN_INVALID_PARAMETER
>        - "Invalid Parameter"
>      - RETURN_UNSUPPORTED
>        - "Unsupported"
>      - RETURN_BAD_BUFFER_SIZE
>        - "Bad Buffer Size"
>      - RETURN_BUFFER_TOO_SMALL
>        - "Buffer Too Small"
>      - RETURN_NOT_READY
>        - "Not Ready"
>      - RETURN_DEVICE_ERROR
>        - "Device Error"
>      - RETURN_WRITE_PROTECTED
>        - "Write Protected"
>      - RETURN_OUT_OF_RESOURCES
>        - "Out of Resources"
>      - RETURN_VOLUME_CORRUPTED
>        - "Volume Corrupt"
>      - RETURN_VOLUME_FULL
>        - "Volume Full"
>      - RETURN_NO_MEDIA
>        - "No Media"
>      - RETURN_MEDIA_CHANGED
>        - "Media changed"
>      - RETURN_NOT_FOUND
>        - "Not Found"
>      - RETURN_ACCESS_DENIED
>        - "Access Denied"
>      - RETURN_NO_RESPONSE
>        - "No Response"
>      - RETURN_NO_MAPPING
>        - "No mapping"
>      - RETURN_TIMEOUT
>        - "Time out"
>      - RETURN_NOT_STARTED
>        - "Not started"
>      - RETURN_ALREADY_STARTED
>        - "Already started"
>      - RETURN_ABORTED
>        - "Aborted"
>      - RETURN_ICMP_ERROR
>        - "ICMP Error"
>      - RETURN_TFTP_ERROR
>        - "TFTP Error"
>      - RETURN_PROTOCOL_ERROR
>        - "Protocol Error"
>      - RETURN_WARN_UNKNOWN_GLYPH
>        - "Warning Unknown Glyph"
>      - RETURN_WARN_DELETE_FAILURE
>        - "Warning Delete Failure"
>      - RETURN_WARN_WRITE_FAILURE
>        - "Warning Write Failure"
>      - RETURN_WARN_BUFFER_TOO_SMALL
>        - "Warning Buffer Too Small"
> 
> 
> 
> 
>> -----Original Message-----
>> From: [email protected] 
>> [mailto:[email protected]]
>> Sent: 06 September 2013 16:17
>> To: [email protected]
>> Subject: edk2-devel Digest, Vol 45, Issue 35
>> 
>> Send edk2-devel mailing list submissions to
>>       [email protected]
>> 
>> To subscribe or unsubscribe via the World Wide Web, visit
>>       https://lists.sourceforge.net/lists/listinfo/edk2-devel
>> or, via email, send a message with subject or body 'help' to
>>       [email protected]
>> 
>> You can reach the person managing the list at
>>       [email protected]
>> 
>> When replying, please edit your Subject line so it is more specific
>> than "Re: Contents of edk2-devel digest..."
>> 
>> 
>> Today's Topics:
>> 
>>  1. Re: Printing UINTN numbers in X64 (David F.)
>>  2. Re: Getting actual device name from block devices (David F.)
>> 
>> 
>> ----------------------------------------------------------------------
>> 
>> Message: 1
>> Date: Fri, 6 Sep 2013 08:10:54 -0700
>> From: "David F." <[email protected]>
>> Subject: Re: [edk2] Printing UINTN numbers in X64
>> To: "[email protected]"
>>       <[email protected]>
>> Message-ID:
>>       <cagrsmlswxs9kqt6o+yvc1a3kc7hphofkm42r5p39fu-gnha...@mail.gmail.com>
>> Content-Type: text/plain; charset="windows-1252"
>> 
>>>> DEBUG ((EFI_D_INFO, "BlockIo (MMIO) ReadBlocks: lba=0x%lx, size=0x%x\n",
>> Lba, BufferSize));
>> 
>> Shouldn't that be %llx and not %lx
>> 
>> 
>> 
>> 
>> On Fri, Sep 6, 2013 at 3:45 AM, Alexei Fedorov <[email protected]>wrote:
>> 
>>> According to \edk2\MdePkg\Include\X64\ProcessorBind.h****
>>> 
>>> ** **
>>> 
>>> for X64 ?UINTN? type has a length of 8 bytes:****
>>> 
>>> ** **
>>> 
>>> typedef UINT64  UINTN;****
>>> 
>>> ** **
>>> 
>>> and ?int? is 32-bit value:****
>>> 
>>> ** **
>>> 
>>> typedef unsigned int        UINT32;****
>>> 
>>> ** **
>>> 
>>> , so debug macros like in CpuConvertPagesToUncachedVirtualAddress()
>>> function (\edk2\OvmfPkg\BlockMmioToBlockIoDxe\BlockIo.c):****
>>> 
>>> ** **
>>> 
>>> EFI_STATUS****
>>> 
>>> EFIAPI****
>>> 
>>> BlockIoReadBlocks (****
>>> 
>>> IN EFI_BLOCK_IO_PROTOCOL    *This,****
>>> 
>>> IN UINT32                   MediaId,****
>>> 
>>> IN EFI_LBA                  Lba,****
>>> 
>>> IN UINTN                    BufferSize,****
>>> 
>>> OUT VOID                    *Buffer****
>>> 
>>> )****
>>> 
>>> {****
>>> 
>>> DEBUG ((EFI_D_INFO, "BlockIo (MMIO) ReadBlocks: lba=0x%lx, size=0x%x\n",
>>> Lba, BufferSize));****
>>> 
>>> ...****
>>> 
>>> ** **
>>> 
>>> using ?%x? format for UINTN BufferSize will result in truncation to 32-bit
>>> value. ****
>>> 
>>> In some cases ?%x? for UINTN can produce wrong output if this UINTN number
>>> is specified as not the last parameter.****
>>> 
>>> ** **
>>> 
>>> This happens because ?int? type is still 32-bit value & it?s used in
>>> BasePrintLibSPrintMarker() function
>>> (\edk2\MdePkg\Library\BasePrintLib\PrintLibInternal.c):****
>>> 
>>> Line #543:****
>>> 
>>>     case 'd':****
>>> 
>>>       if ((Flags & LONG_TYPE) == 0) {****
>>> 
>>>         //****
>>> 
>>>         // 'd','x', and 'X' that are not preceded by 'l' or 'L' are
>>> assumed to be type "int".****
>>> 
>>>         // This assumption is made so the format string definition is
>>> compatible with the ANSI C****
>>> 
>>>         // Specification for formatted strings.  It is recommended that
>>> the Base Types be used ****
>>> 
>>>         // everywhere, but in this one case, compliance with ANSI C is
>>> more important, and ****
>>> 
>>>         // provides an implementation that is compatible with that
>>> largest possible set of CPU ****
>>> 
>>>         // architectures.  This is why the type "int" is used in this
>>> one case.****
>>> 
>>>         //****
>>> 
>>>         if (BaseListMarker == NULL) {****
>>> 
>>>           Value = VA_ARG (VaListMarker, int);****
>>> 
>>>         } else {****
>>> 
>>>           Value = BASE_ARG (BaseListMarker, int);****
>>> 
>>>         }****
>>> 
>>> ** **
>>> 
>>> & line #588:****
>>> 
>>>         if ((Flags & LONG_TYPE) == 0 && Value < 0) {****
>>> 
>>>           //****
>>> 
>>>           // 'd','x', and 'X' that are not preceded by 'l' or 'L' are
>>> assumed to be type "int".****
>>> 
>>>           // This assumption is made so the format string definition is
>>> compatible with the ANSI C****
>>> 
>>>           // Specification for formatted strings.  It is recommended
>>> that the Base Types be used ****
>>> 
>>>           // everywhere, but in this one case, compliance with ANSI C is
>>> more important, and ****
>>> 
>>>           // provides an implementation that is compatible with that
>>> largest possible set of CPU ****
>>> 
>>>           // architectures.  This is why the type "unsigned int" is used
>>> in this one case.****
>>> 
>>>           //****
>>> 
>>>           Value = (unsigned int)Value;****
>>> 
>>> ** **
>>> 
>>> Any comments on that?****
>>> 
>>> ** **
>>> 
>>> Alexei.****
>>> 
>>> ** **
>>> 
>>> ** **
>>> 
>>> -- IMPORTANT NOTICE: The contents of this email and any attachments are
>>> confidential and may also be privileged. If you are not the intended
>>> recipient, please notify the sender immediately and do not disclose the
>>> contents to any other person, use it for any purpose, or store or copy the
>>> information in any medium. Thank you.
>>> 
>>> ARM Limited, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ,
>>> Registered in England & Wales, Company No: 2557590
>>> ARM Holdings plc, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ,
>>> Registered in England & Wales, Company No: 2548782
>>> 
>>> 
>>> ------------------------------------------------------------------------------
>>> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
>>> Discover the easy way to master current and previous Microsoft technologies
>>> and advance your career. Get an incredible 1,500+ hours of step-by-step
>>> tutorial videos with LearnDevNow. Subscribe today and save!
>>> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
>>> _______________________________________________
>>> edk2-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>> 
>>> 
>> -------------- next part --------------
>> An HTML attachment was scrubbed...
>> 
>> ------------------------------
>> 
>> Message: 2
>> Date: Fri, 6 Sep 2013 08:17:13 -0700
>> From: "David F." <[email protected]>
>> Subject: Re: [edk2] Getting actual device name from block devices
>> To: "[email protected]"
>>       <[email protected]>
>> Message-ID:
>>       <CAGRSmLu3mVXyYC2h-=9et8r42gtdkbs7y85izlym5-dgxgo...@mail.gmail.com>
>> Content-Type: text/plain; charset="iso-8859-1"
>> 
>> but want the actual device name, also at minimum need load/eject and
>> prevent/allow removal support, but really able to send any command to the
>> devices.  Not the controller info...
>> 
>> 
>> On Fri, Sep 6, 2013 at 4:59 AM, Sergey Isakov <[email protected]> wrote:
>> 
>>> May be this part of codes helps you
>>> ----------------
>>> // Scan PCI handles
>>> Status = gBS->LocateHandleBuffer (
>>>                                   ByProtocol,
>>>                                   &gEfiPciIoProtocolGuid,
>>>                                   NULL,
>>>                                   &HandleCount,
>>>                                   &HandleArray
>>>                                   );
>>> if (!EFI_ERROR (Status)) {
>>>   for (Index = 0; Index < HandleCount; Index++) {
>>>     Status = gBS->HandleProtocol (
>>>                                   HandleArray[Index],
>>>                                   &gEfiPciIoProtocolGuid,
>>>                                   (VOID **)&PciIo
>>>                                   );
>>>     if (!EFI_ERROR (Status)) {
>>>       // Read PCI BUS
>>>       Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device,
>>> &Function);
>>>       Status = PciIo->Pci.Read (
>>>                                 PciIo,
>>>                                 EfiPciIoWidthUint32,
>>>                                 0,
>>>                                 sizeof (Pci) / sizeof (UINT32),
>>>                                 &Pci
>>>                                 );
>>>       Print(L"PCI (%02x|%02x:%02x.%02x) : %04x %04x
>>> class=%02x%02x%02x\n",
>>>           Segment, Bus, Device, Function,
>>>           Pci.Hdr.VendorId, Pci.Hdr.DeviceId,
>>>           Pci.Hdr.ClassCode[2], Pci.Hdr.ClassCode[1], Pci.Hdr.ClassCode[
>>> 0]);
>>> 
>>> ----------------
>>> The same is possible for ExtScsiPassTru protocol
>>> 
>>> Regards,
>>> Sergey
>>> 
>>> On 06.09.2013, at 9:40, David F. <[email protected]> wrote:
>>> 
>>> Yes, but to do it right you really need the SCSI Pass Through Interface to
>>> talk directly with the device as you may need to send setup or blank
>>> commands, etc...  Also for ATA devices, be nice for the various commands
>>> dealing with their command set.
>>> 
>>> 
>>> 
>>> 
>>> 
>>> On Thu, Sep 5, 2013 at 7:42 PM, Sergey Isakov <[email protected]> wrote:
>>> 
>>>> Hi David,
>>>> I am not understanding what are you going to do. How did you propose to
>>>> burn DVD in UEFI mode? Do you have such UEFI application to burn DVD?
>>>> Sergey.
>>>> 
>>>> On 06.09.2013, at 6:22, David F. <[email protected]> wrote:
>>>> 
>>>>> Well, without any passthru support, I'm not sure how I'm, as an
>>>> application, supposed to get the device names of the various hard drives
>>>> and dvd drives in the system? Also, how you would be able to burn a CD/DVD
>>>> and send the various commands to setup for the burn.   I see the Visual
>>>> BIOS on the system has all the name, so there must be a way without
>>>> essentially turning off all UEFI services and writing a raw DOS like
>>>> program to directly program the SATA/PATA controllers like the old days?
>>>> Strange?
>>>>> 
>>>>> Does anyone have the answer??
>>>>> 
>>>>> TIA!!
>>>>> 
>>>>> 
>>>> ------------------------------------------------------------------------------
>>>>> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
>>>>> Discover the easy way to master current and previous Microsoft
>>>> technologies
>>>>> and advance your career. Get an incredible 1,500+ hours of step-by-step
>>>>> tutorial videos with LearnDevNow. Subscribe today and save!
>>>>> 
>>>> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk_______________________________________________
>>>>> edk2-devel mailing list
>>>>> [email protected]
>>>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>> 
>>>> 
>>>> 
>>>> ------------------------------------------------------------------------------
>>>> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
>>>> Discover the easy way to master current and previous Microsoft
>>>> technologies
>>>> and advance your career. Get an incredible 1,500+ hours of step-by-step
>>>> tutorial videos with LearnDevNow. Subscribe today and save!
>>>> 
>>>> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>> 
>>> 
>>> 
>>> ------------------------------------------------------------------------------
>>> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
>>> Discover the easy way to master current and previous Microsoft technologies
>>> and advance your career. Get an incredible 1,500+ hours of step-by-step
>>> tutorial videos with LearnDevNow. Subscribe today and save!
>>> 
>>> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk_______________________________________________
>>> edk2-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>> 
>>> 
>>> 
>>> 
>>> ------------------------------------------------------------------------------
>>> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
>>> Discover the easy way to master current and previous Microsoft technologies
>>> and advance your career. Get an incredible 1,500+ hours of step-by-step
>>> tutorial videos with LearnDevNow. Subscribe today and save!
>>> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
>>> _______________________________________________
>>> edk2-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>> 
>>> 
>> -------------- next part --------------
>> An HTML attachment was scrubbed...
>> 
>> ------------------------------
>> 
>> ------------------------------------------------------------------------------
>> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
>> Discover the easy way to master current and previous Microsoft technologies
>> and advance your career. Get an incredible 1,500+ hours of step-by-step
>> tutorial videos with LearnDevNow. Subscribe today and save!
>> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
>> 
>> ------------------------------
>> 
>> _______________________________________________
>> edk2-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>> 
>> 
>> End of edk2-devel Digest, Vol 45, Issue 35
>> ******************************************
>> 
>> 
>> -- IMPORTANT NOTICE: The contents of this email and any attachments are 
>> confidential and may also be privileged. If you are not the intended 
>> recipient, please notify the sender immediately and do not disclose the 
>> contents to any other person, use it for any purpose, or store or copy the 
>> information in any medium.  Thank you.
>> 
>> ARM Limited, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ, 
>> Registered in England & Wales, Company No:  2557590
>> ARM Holdings plc, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ, 
>> Registered in England & Wales, Company No:  2548782
>> 
>> 
>> ------------------------------------------------------------------------------
>> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
>> Discover the easy way to master current and previous Microsoft technologies
>> and advance your career. Get an incredible 1,500+ hours of step-by-step
>> tutorial videos with LearnDevNow. Subscribe today and save!
>> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
>> _______________________________________________
>> edk2-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> 
> 
> ------------------------------------------------------------------------------
> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
> Discover the easy way to master current and previous Microsoft technologies
> and advance your career. Get an incredible 1,500+ hours of step-by-step
> tutorial videos with LearnDevNow. Subscribe today and save!
> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> 
> ------------------------------------------------------------------------------
> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
> Discover the easy way to master current and previous Microsoft technologies
> and advance your career. Get an incredible 1,500+ hours of step-by-step
> tutorial videos with LearnDevNow. Subscribe today and save!
> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel


------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to