private PrinterNotifyInfoData GetInfoData(int index)
        {
            // Need to figure out where the location must be set in order to find PrinterNotifyInfoData objects.
            // This location can be subtly different based on what bitness the OS is running.
            // For this reason, the true "size" of object is the marshal size, plus however many bytes gets us
            // to the next memory boundary.  The size of IntPtr indicates what the memory boundary is for the given OS.
            int sizeOfInfo = Marshal.SizeOf <PrinterNotifyInfo>();

            sizeOfInfo += (sizeOfInfo % Marshal.SizeOf <IntPtr>());

            int sizeOfData = Marshal.SizeOf <PrinterNotifyInfoData>();

            sizeOfData += (sizeOfData % Marshal.SizeOf <IntPtr>());

            long location = _infoHandle.DangerousGetHandle().ToInt64() + sizeOfInfo + (sizeOfData * index);

            return(Marshal.PtrToStructure <PrinterNotifyInfoData>(new IntPtr(location)));
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="PrinterNotifyInfoReader"/> class.
 /// </summary>
 /// <param name="infoHandle">The handle to a <see cref="PrinterNotifyInfo" />.</param>
 public PrinterNotifyInfoReader(SafePrinterNotifyInfoHandle infoHandle)
 {
     _infoHandle = infoHandle;
     Info        = Marshal.PtrToStructure <PrinterNotifyInfo>(infoHandle.DangerousGetHandle());
 }