Merge pull request #16 from ReneLergner/feature/modernize

Modernize WPinternals
This commit is contained in:
Gustave Monce
2021-02-08 18:17:43 +01:00
committed by GitHub
21 changed files with 655 additions and 1298 deletions
+37
View File
@@ -0,0 +1,37 @@
name: CI
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
build:
runs-on: windows-latest
strategy:
matrix:
architecture: [x86, x64]
platform: [win]
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install .NET SDK
uses: actions/setup-dotnet@v1
with:
dotnet-version: "5.0.101"
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1.0.2
- name: Build utilities
shell: pwsh
run: |
msbuild /m /t:restore,wpinternals:publish /p:Platform=${{ matrix.architecture }} /p:RuntimeIdentifier=${{ matrix.platform }}-${{ matrix.architecture }} /p:PublishDir=${{ github.workspace }}/artifacts/${{ matrix.platform }}-${{ matrix.architecture }} /p:PublishSingleFile=true /p:PublishTrimmed=true WPinternals.sln
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.platform }}-${{ matrix.architecture }}
path: ${{ github.workspace }}/artifacts/${{ matrix.platform }}-${{ matrix.architecture }}
+87 -75
View File
@@ -5,6 +5,7 @@ using System;
namespace SevenZip.Compression.LZMA namespace SevenZip.Compression.LZMA
{ {
using RangeCoder; using RangeCoder;
using System.Threading;
public class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream public class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream
{ {
@@ -228,7 +229,7 @@ namespace SevenZip.Compression.LZMA
} }
public void Code(System.IO.Stream inStream, System.IO.Stream outStream, public void Code(System.IO.Stream inStream, System.IO.Stream outStream,
Int64 inSize, Int64 outSize, ICodeProgress progress) Int64 inSize, Int64 outSize, ICodeProgress progress, CancellationToken? token = null)
{ {
Init(inStream, outStream); Init(inStream, outStream);
@@ -247,100 +248,111 @@ namespace SevenZip.Compression.LZMA
m_OutWindow.PutByte(b); m_OutWindow.PutByte(b);
nowPos64++; nowPos64++;
} }
while (nowPos64 < outSize64)
try
{ {
// UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64); while (nowPos64 < outSize64)
// while(nowPos64 < next)
{ {
uint posState = (uint)nowPos64 & m_PosStateMask; token?.ThrowIfCancellationRequested();
if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0)
// UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64);
// while(nowPos64 < next)
{ {
byte b; uint posState = (uint)nowPos64 & m_PosStateMask;
byte prevByte = m_OutWindow.GetByte(0); if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0)
if (!state.IsCharState())
b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder,
(uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0));
else
b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte);
m_OutWindow.PutByte(b);
state.UpdateChar();
nowPos64++;
}
else
{
uint len;
if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1)
{ {
if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) byte b;
{ byte prevByte = m_OutWindow.GetByte(0);
if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) if (!state.IsCharState())
{ b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder,
state.UpdateShortRep(); (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0));
m_OutWindow.PutByte(m_OutWindow.GetByte(rep0));
nowPos64++;
continue;
}
}
else else
b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte);
m_OutWindow.PutByte(b);
state.UpdateChar();
nowPos64++;
}
else
{
uint len;
if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1)
{ {
UInt32 distance; if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0)
if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0)
{ {
distance = rep1; if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0)
{
state.UpdateShortRep();
m_OutWindow.PutByte(m_OutWindow.GetByte(rep0));
nowPos64++;
continue;
}
} }
else else
{ {
if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) UInt32 distance;
distance = rep2; if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0)
{
distance = rep1;
}
else else
{ {
distance = rep3; if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0)
rep3 = rep2; distance = rep2;
else
{
distance = rep3;
rep3 = rep2;
}
rep2 = rep1;
} }
rep2 = rep1; rep1 = rep0;
} rep0 = distance;
rep1 = rep0;
rep0 = distance;
}
len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen;
state.UpdateRep();
}
else
{
rep3 = rep2;
rep2 = rep1;
rep1 = rep0;
len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState);
state.UpdateMatch();
uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder);
if (posSlot >= Base.kStartPosModelIndex)
{
int numDirectBits = (int)((posSlot >> 1) - 1);
rep0 = ((2 | (posSlot & 1)) << numDirectBits);
if (posSlot < Base.kEndPosModelIndex)
rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders,
rep0 - posSlot - 1, m_RangeDecoder, numDirectBits);
else
{
rep0 += (m_RangeDecoder.DecodeDirectBits(
numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits);
rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder);
} }
len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen;
state.UpdateRep();
} }
else else
rep0 = posSlot; {
rep3 = rep2;
rep2 = rep1;
rep1 = rep0;
len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState);
state.UpdateMatch();
uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder);
if (posSlot >= Base.kStartPosModelIndex)
{
int numDirectBits = (int)((posSlot >> 1) - 1);
rep0 = ((2 | (posSlot & 1)) << numDirectBits);
if (posSlot < Base.kEndPosModelIndex)
rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders,
rep0 - posSlot - 1, m_RangeDecoder, numDirectBits);
else
{
rep0 += (m_RangeDecoder.DecodeDirectBits(
numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits);
rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder);
}
}
else
rep0 = posSlot;
}
if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck)
{
if (rep0 == 0xFFFFFFFF)
break;
throw new DataErrorException();
}
m_OutWindow.CopyBlock(rep0, len);
nowPos64 += len;
} }
if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck)
{
if (rep0 == 0xFFFFFFFF)
break;
throw new DataErrorException();
}
m_OutWindow.CopyBlock(rep0, len);
nowPos64 += len;
} }
} }
} }
catch (OperationCanceledException)
{
}
m_OutWindow.Flush(); m_OutWindow.Flush();
m_OutWindow.ReleaseStream(); m_OutWindow.ReleaseStream();
m_RangeDecoder.ReleaseStream(); m_RangeDecoder.ReleaseStream();
+3 -1
View File
@@ -5,6 +5,7 @@ using System;
namespace SevenZip.Compression.LZMA namespace SevenZip.Compression.LZMA
{ {
using RangeCoder; using RangeCoder;
using System.Threading;
public class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties public class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties
{ {
@@ -1271,7 +1272,7 @@ namespace SevenZip.Compression.LZMA
public void Code(System.IO.Stream inStream, System.IO.Stream outStream, public void Code(System.IO.Stream inStream, System.IO.Stream outStream,
Int64 inSize, Int64 outSize, ICodeProgress progress) Int64 inSize, Int64 outSize, ICodeProgress progress, CancellationToken? token = null)
{ {
_needReleaseMFStream = false; _needReleaseMFStream = false;
try try
@@ -1279,6 +1280,7 @@ namespace SevenZip.Compression.LZMA
SetStreams(inStream, outStream, inSize, outSize); SetStreams(inStream, outStream, inSize, outSize);
while (true) while (true)
{ {
token?.ThrowIfCancellationRequested();
Int64 processedInSize; Int64 processedInSize;
Int64 processedOutSize; Int64 processedOutSize;
bool finished; bool finished;
+2 -1
View File
@@ -1,6 +1,7 @@
// ICoder.h // ICoder.h
using System; using System;
using System.Threading;
namespace SevenZip namespace SevenZip
{ {
@@ -58,7 +59,7 @@ namespace SevenZip
/// if input stream is not valid /// if input stream is not valid
/// </exception> /// </exception>
void Code(System.IO.Stream inStream, System.IO.Stream outStream, void Code(System.IO.Stream inStream, System.IO.Stream outStream,
Int64 inSize, Int64 outSize, ICodeProgress progress); Int64 inSize, Int64 outSize, ICodeProgress progress, CancellationToken? token = null);
}; };
/* /*
+2
View File
@@ -34,6 +34,7 @@ namespace DiscUtils.Fat
internal FatFileSystemOptions() internal FatFileSystemOptions()
{ {
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
FileNameEncoding = Encoding.GetEncoding(437); FileNameEncoding = Encoding.GetEncoding(437);
} }
@@ -45,6 +46,7 @@ namespace DiscUtils.Fat
} }
else else
{ {
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
FileNameEncoding = Encoding.GetEncoding(437); FileNameEncoding = Encoding.GetEncoding(437);
} }
} }
+8 -4
View File
@@ -166,7 +166,8 @@ namespace WPinternals
FlowDirection.LeftToRight, FlowDirection.LeftToRight,
new Typeface(PathTextBlock.FontFamily, PathTextBlock.FontStyle, PathTextBlock.FontWeight, PathTextBlock.FontStretch), new Typeface(PathTextBlock.FontFamily, PathTextBlock.FontStyle, PathTextBlock.FontWeight, PathTextBlock.FontStretch),
FontSize, FontSize,
Foreground Foreground,
VisualTreeHelper.GetDpi(this).PixelsPerDip
); );
#endif #endif
@@ -198,7 +199,8 @@ namespace WPinternals
FlowDirection.LeftToRight, FlowDirection.LeftToRight,
new Typeface(CaptionTextBlock.FontFamily, CaptionTextBlock.FontStyle, CaptionTextBlock.FontWeight, CaptionTextBlock.FontStretch), new Typeface(CaptionTextBlock.FontFamily, CaptionTextBlock.FontStyle, CaptionTextBlock.FontWeight, CaptionTextBlock.FontStretch),
FontSize, FontSize,
Foreground Foreground,
VisualTreeHelper.GetDpi(this).PixelsPerDip
); );
#endif #endif
double CaptionWidth = formatted.Width; double CaptionWidth = formatted.Width;
@@ -238,7 +240,8 @@ namespace WPinternals
FlowDirection.LeftToRight, FlowDirection.LeftToRight,
new Typeface(PathTextBlock.FontFamily, PathTextBlock.FontStyle, PathTextBlock.FontWeight, PathTextBlock.FontStretch), new Typeface(PathTextBlock.FontFamily, PathTextBlock.FontStyle, PathTextBlock.FontWeight, PathTextBlock.FontStretch),
FontSize, FontSize,
Foreground Foreground,
VisualTreeHelper.GetDpi(this).PixelsPerDip
); );
#endif #endif
if (NewWidth < 0) if (NewWidth < 0)
@@ -321,7 +324,8 @@ namespace WPinternals
FlowDirection.LeftToRight, FlowDirection.LeftToRight,
new Typeface(PathTextBlock.FontFamily, PathTextBlock.FontStyle, PathTextBlock.FontWeight, PathTextBlock.FontStretch), new Typeface(PathTextBlock.FontFamily, PathTextBlock.FontStyle, PathTextBlock.FontWeight, PathTextBlock.FontStretch),
FontSize, FontSize,
Foreground Foreground,
VisualTreeHelper.GetDpi(this).PixelsPerDip
); );
#endif #endif
+6 -6
View File
@@ -375,18 +375,18 @@ namespace WPinternals
HasChanged = true; HasChanged = true;
} }
if ((NewPartition.PartitionGuid == null) || (NewPartition.PartitionGuid != CurrentPartition.PartitionGuid)) if ((NewPartition.PartitionGuid != Guid.Empty) || (NewPartition.PartitionGuid != CurrentPartition.PartitionGuid))
HasChanged = true; HasChanged = true;
if (NewPartition.PartitionGuid != null) if (NewPartition.PartitionGuid != Guid.Empty)
CurrentPartition.PartitionGuid = NewPartition.PartitionGuid; CurrentPartition.PartitionGuid = NewPartition.PartitionGuid;
if (CurrentPartition.PartitionGuid == null) if (CurrentPartition.PartitionGuid != Guid.Empty)
CurrentPartition.PartitionGuid = Guid.NewGuid(); CurrentPartition.PartitionGuid = Guid.NewGuid();
if ((NewPartition.PartitionTypeGuid == null) || (NewPartition.PartitionTypeGuid != CurrentPartition.PartitionTypeGuid)) if ((NewPartition.PartitionTypeGuid != Guid.Empty) || (NewPartition.PartitionTypeGuid != CurrentPartition.PartitionTypeGuid))
HasChanged = true; HasChanged = true;
if (NewPartition.PartitionTypeGuid != null) if (NewPartition.PartitionTypeGuid != Guid.Empty)
CurrentPartition.PartitionTypeGuid = NewPartition.PartitionTypeGuid; CurrentPartition.PartitionTypeGuid = NewPartition.PartitionTypeGuid;
if (CurrentPartition.PartitionTypeGuid == null) if (CurrentPartition.PartitionTypeGuid != Guid.Empty)
CurrentPartition.PartitionTypeGuid = Guid.NewGuid(); CurrentPartition.PartitionTypeGuid = Guid.NewGuid();
for (int i = this.Partitions.Count - 1; i >= 0; i--) for (int i = this.Partitions.Count - 1; i >= 0; i--)
+11 -3
View File
@@ -92,6 +92,8 @@ namespace WPinternals
private Stream stream; private Stream stream;
private bool LeaveOpen; private bool LeaveOpen;
private Thread WorkThread; private Thread WorkThread;
private CancellationTokenSource source;
private CancellationToken token;
public LZMACompressionStream(Stream stream, CompressionMode mode, bool LeaveOpen, int DictionarySize, int PosStateBits, public LZMACompressionStream(Stream stream, CompressionMode mode, bool LeaveOpen, int DictionarySize, int PosStateBits,
int LitContextBits, int LitPosBits, int Algorithm, int NumFastBytes, string MatchFinder, bool EndMarker) int LitContextBits, int LitPosBits, int Algorithm, int NumFastBytes, string MatchFinder, bool EndMarker)
@@ -99,6 +101,8 @@ namespace WPinternals
this.stream = stream; this.stream = stream;
this.LeaveOpen = LeaveOpen; this.LeaveOpen = LeaveOpen;
BufferStream = new PumpStream(); BufferStream = new PumpStream();
source = new CancellationTokenSource();
token = source.Token;
if (mode == CompressionMode.Compress) if (mode == CompressionMode.Compress)
{ {
@@ -130,14 +134,14 @@ namespace WPinternals
private void Encode() private void Encode()
{ {
Encoder.Code(BufferStream, stream, -1, -1, null); Encoder.Code(BufferStream, stream, -1, -1, null, token);
if (LeaveOpen == false) if (LeaveOpen == false)
stream.Close(); stream.Close();
} }
private void Decode() private void Decode()
{ {
Decoder.Code(stream, BufferStream, -1, -1, null); Decoder.Code(stream, BufferStream, -1, -1, null, token);
BufferStream.Close(); BufferStream.Close();
if (LeaveOpen == false) if (LeaveOpen == false)
stream.Close(); stream.Close();
@@ -148,7 +152,11 @@ namespace WPinternals
if (Encoder != null) if (Encoder != null)
BufferStream.Close(); BufferStream.Close();
else if (WorkThread.IsAlive) else if (WorkThread.IsAlive)
WorkThread.Abort(); {
if (source != null)
source.Cancel();
WorkThread.Join();
}
} }
public override int Read(byte[] buffer, int offset, int count) public override int Read(byte[] buffer, int offset, int count)
+1 -12
View File
@@ -118,14 +118,12 @@ namespace WPinternals
[DllImport( [DllImport(
KERNEL32, KERNEL32,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern bool CloseHandle(IntPtr handle); internal static extern bool CloseHandle(IntPtr handle);
[DllImport( [DllImport(
ADVAPI32, ADVAPI32,
CharSet = CharSet.Unicode, CharSet = CharSet.Unicode,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern bool AdjustTokenPrivileges( internal static extern bool AdjustTokenPrivileges(
[In] SafeTokenHandle TokenHandle, [In] SafeTokenHandle TokenHandle,
[In] bool DisableAllPrivileges, [In] bool DisableAllPrivileges,
@@ -138,7 +136,6 @@ namespace WPinternals
ADVAPI32, ADVAPI32,
CharSet = CharSet.Auto, CharSet = CharSet.Auto,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern internal static extern
bool RevertToSelf(); bool RevertToSelf();
@@ -147,7 +144,6 @@ namespace WPinternals
EntryPoint = "LookupPrivilegeValueW", EntryPoint = "LookupPrivilegeValueW",
CharSet = CharSet.Auto, CharSet = CharSet.Auto,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern internal static extern
bool LookupPrivilegeValue( bool LookupPrivilegeValue(
[In] string lpSystemName, [In] string lpSystemName,
@@ -158,7 +154,6 @@ namespace WPinternals
KERNEL32, KERNEL32,
CharSet = CharSet.Auto, CharSet = CharSet.Auto,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern internal static extern
IntPtr GetCurrentProcess(); IntPtr GetCurrentProcess();
@@ -166,7 +161,6 @@ namespace WPinternals
KERNEL32, KERNEL32,
CharSet = CharSet.Auto, CharSet = CharSet.Auto,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern internal static extern
IntPtr GetCurrentThread(); IntPtr GetCurrentThread();
@@ -174,7 +168,6 @@ namespace WPinternals
ADVAPI32, ADVAPI32,
CharSet = CharSet.Unicode, CharSet = CharSet.Unicode,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern internal static extern
bool OpenProcessToken( bool OpenProcessToken(
[In] IntPtr ProcessToken, [In] IntPtr ProcessToken,
@@ -185,7 +178,6 @@ namespace WPinternals
(ADVAPI32, (ADVAPI32,
CharSet = CharSet.Unicode, CharSet = CharSet.Unicode,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern internal static extern
bool OpenThreadToken( bool OpenThreadToken(
[In] IntPtr ThreadToken, [In] IntPtr ThreadToken,
@@ -197,7 +189,6 @@ namespace WPinternals
(ADVAPI32, (ADVAPI32,
CharSet = CharSet.Unicode, CharSet = CharSet.Unicode,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern internal static extern
bool DuplicateTokenEx( bool DuplicateTokenEx(
[In] SafeTokenHandle ExistingToken, [In] SafeTokenHandle ExistingToken,
@@ -211,7 +202,6 @@ namespace WPinternals
(ADVAPI32, (ADVAPI32,
CharSet = CharSet.Unicode, CharSet = CharSet.Unicode,
SetLastError = true)] SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern internal static extern
bool SetThreadToken( bool SetThreadToken(
[In] IntPtr Thread, [In] IntPtr Thread,
@@ -301,8 +291,7 @@ namespace WPinternals
} }
[DllImport(NativeMethods.KERNEL32, SetLastError = true), [DllImport(NativeMethods.KERNEL32, SetLastError = true),
SuppressUnmanagedCodeSecurity, SuppressUnmanagedCodeSecurity]
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
private static extern bool CloseHandle(IntPtr handle); private static extern bool CloseHandle(IntPtr handle);
override protected bool ReleaseHandle() override protected bool ReleaseHandle()
-20
View File
@@ -20,8 +20,6 @@
using System; using System;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
@@ -93,7 +91,6 @@ namespace WPinternals
// of privilege names to luids // of privilege names to luids
// //
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private static Luid LuidFromPrivilege(string privilege) private static Luid LuidFromPrivilege(string privilege)
{ {
Luid luid; Luid luid;
@@ -104,8 +101,6 @@ namespace WPinternals
// Look up the privilege LUID inside the cache // Look up the privilege LUID inside the cache
// //
RuntimeHelpers.PrepareConstrainedRegions();
try try
{ {
privilegeLock.AcquireReaderLock(Timeout.Infinite); privilegeLock.AcquireReaderLock(Timeout.Infinite);
@@ -206,8 +201,6 @@ namespace WPinternals
} }
} }
RuntimeHelpers.PrepareConstrainedRegions();
try try
{ {
// Open the thread token; if there is no thread token, // Open the thread token; if there is no thread token,
@@ -382,19 +375,16 @@ namespace WPinternals
#endregion #endregion
#region Public methods and properties #region Public methods and properties
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public void Enable() public void Enable()
{ {
this.ToggleState(true); this.ToggleState(true);
} }
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public void Disable() public void Disable()
{ {
this.ToggleState(false); this.ToggleState(false);
} }
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public void Revert() public void Revert()
{ {
int error = 0; int error = 0;
@@ -413,8 +403,6 @@ namespace WPinternals
// This code must be eagerly prepared and non-interruptible. // This code must be eagerly prepared and non-interruptible.
RuntimeHelpers.PrepareConstrainedRegions();
try try
{ {
// The payload is entirely in the finally block // The payload is entirely in the finally block
@@ -492,8 +480,6 @@ namespace WPinternals
Privilege p = new Privilege(privilege); Privilege p = new Privilege(privilege);
RuntimeHelpers.PrepareConstrainedRegions();
try try
{ {
if (enabled) if (enabled)
@@ -520,7 +506,6 @@ namespace WPinternals
#endregion #endregion
#region Private implementation #region Private implementation
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private void ToggleState(bool enable) private void ToggleState(bool enable)
{ {
int error = 0; int error = 0;
@@ -542,8 +527,6 @@ namespace WPinternals
// Need to make this block of code non-interruptible so that it would preserve // Need to make this block of code non-interruptible so that it would preserve
// consistency of thread oken state even in the face of catastrophic exceptions // consistency of thread oken state even in the face of catastrophic exceptions
RuntimeHelpers.PrepareConstrainedRegions();
try try
{ {
// The payload is entirely in the finally block // The payload is entirely in the finally block
@@ -635,11 +618,8 @@ namespace WPinternals
} }
} }
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
private void Reset() private void Reset()
{ {
RuntimeHelpers.PrepareConstrainedRegions();
try try
{ {
// Payload is in the finally block // Payload is in the finally block
+19 -948
View File
File diff suppressed because it is too large Load Diff
+265 -89
View File
@@ -3,232 +3,408 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.29123.89 VisualStudioVersion = 16.0.29123.89
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPinternals", "WPinternals.csproj", "{AED6DEB8-F54C-4B41-9655-793E7096AE6E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WPinternals", "WPinternals.csproj", "{AED6DEB8-F54C-4B41-9655-793E7096AE6E}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Debug-AddEmergency|Any CPU = Debug-AddEmergency|Any CPU Debug-AddEmergency|Any CPU = Debug-AddEmergency|Any CPU
Debug-AddEmergency|x64 = Debug-AddEmergency|x64
Debug-AddEmergency|x86 = Debug-AddEmergency|x86
Debug-BackupGPT|Any CPU = Debug-BackupGPT|Any CPU Debug-BackupGPT|Any CPU = Debug-BackupGPT|Any CPU
Debug-BackupGPT|x64 = Debug-BackupGPT|x64
Debug-BackupGPT|x86 = Debug-BackupGPT|x86
Debug-ClearNV|Any CPU = Debug-ClearNV|Any CPU Debug-ClearNV|Any CPU = Debug-ClearNV|Any CPU
Debug-ClearNV|x64 = Debug-ClearNV|x64
Debug-ClearNV|x86 = Debug-ClearNV|x86
Debug-CustomFlash-930|Any CPU = Debug-CustomFlash-930|Any CPU Debug-CustomFlash-930|Any CPU = Debug-CustomFlash-930|Any CPU
Debug-CustomFlash-930|x64 = Debug-CustomFlash-930|x64
Debug-CustomFlash-930|x86 = Debug-CustomFlash-930|x86
Debug-CustomFlash-950 (no restart)|Any CPU = Debug-CustomFlash-950 (no restart)|Any CPU Debug-CustomFlash-950 (no restart)|Any CPU = Debug-CustomFlash-950 (no restart)|Any CPU
Debug-CustomFlash-950 (no restart)|x64 = Debug-CustomFlash-950 (no restart)|x64
Debug-CustomFlash-950 (no restart)|x86 = Debug-CustomFlash-950 (no restart)|x86
Debug-CustomFlash-950|Any CPU = Debug-CustomFlash-950|Any CPU Debug-CustomFlash-950|Any CPU = Debug-CustomFlash-950|Any CPU
Debug-CustomFlash-950|x64 = Debug-CustomFlash-950|x64
Debug-CustomFlash-950|x86 = Debug-CustomFlash-950|x86
Debug-DLall|Any CPU = Debug-DLall|Any CPU Debug-DLall|Any CPU = Debug-DLall|Any CPU
Debug-DLall|x64 = Debug-DLall|x64
Debug-DLall|x86 = Debug-DLall|x86
Debug-DLEmergency|Any CPU = Debug-DLEmergency|Any CPU Debug-DLEmergency|Any CPU = Debug-DLEmergency|Any CPU
Debug-DLEmergency|x64 = Debug-DLEmergency|x64
Debug-DLEmergency|x86 = Debug-DLEmergency|x86
Debug-DLFFU|Any CPU = Debug-DLFFU|Any CPU Debug-DLFFU|Any CPU = Debug-DLFFU|Any CPU
Debug-DLFFU|x64 = Debug-DLFFU|x64
Debug-DLFFU|x86 = Debug-DLFFU|x86
Debug-DumpFFU|Any CPU = Debug-DumpFFU|Any CPU Debug-DumpFFU|Any CPU = Debug-DumpFFU|Any CPU
Debug-DumpFFU|x64 = Debug-DumpFFU|x64
Debug-DumpFFU|x86 = Debug-DumpFFU|x86
Debug-DumpUEFI|Any CPU = Debug-DumpUEFI|Any CPU Debug-DumpUEFI|Any CPU = Debug-DumpUEFI|Any CPU
Debug-DumpUEFI|x64 = Debug-DumpUEFI|x64
Debug-DumpUEFI|x86 = Debug-DumpUEFI|x86
Debug-EnableRootAccess|Any CPU = Debug-EnableRootAccess|Any CPU Debug-EnableRootAccess|Any CPU = Debug-EnableRootAccess|Any CPU
Debug-EnableRootAccess|x64 = Debug-EnableRootAccess|x64
Debug-EnableRootAccess|x86 = Debug-EnableRootAccess|x86
Debug-EnableRootAccessOnImage|Any CPU = Debug-EnableRootAccessOnImage|Any CPU Debug-EnableRootAccessOnImage|Any CPU = Debug-EnableRootAccessOnImage|Any CPU
Debug-EnableRootAccessOnImage|x64 = Debug-EnableRootAccessOnImage|x64
Debug-EnableRootAccessOnImage|x86 = Debug-EnableRootAccessOnImage|x86
Debug-EnableTestSigning (no restart)|Any CPU = Debug-EnableTestSigning (no restart)|Any CPU Debug-EnableTestSigning (no restart)|Any CPU = Debug-EnableTestSigning (no restart)|Any CPU
Debug-EnableTestSigning (no restart)|x64 = Debug-EnableTestSigning (no restart)|x64
Debug-EnableTestSigning (no restart)|x86 = Debug-EnableTestSigning (no restart)|x86
Debug-EnableTestSigning|Any CPU = Debug-EnableTestSigning|Any CPU Debug-EnableTestSigning|Any CPU = Debug-EnableTestSigning|Any CPU
Debug-EnableTestSigning|x64 = Debug-EnableTestSigning|x64
Debug-EnableTestSigning|x86 = Debug-EnableTestSigning|x86
Debug-FindFlashingProfile|Any CPU = Debug-FindFlashingProfile|Any CPU Debug-FindFlashingProfile|Any CPU = Debug-FindFlashingProfile|Any CPU
Debug-FindFlashingProfile|x64 = Debug-FindFlashingProfile|x64
Debug-FindFlashingProfile|x86 = Debug-FindFlashingProfile|x86
Debug-FindFlashingProfileNoRestart|Any CPU = Debug-FindFlashingProfileNoRestart|Any CPU Debug-FindFlashingProfileNoRestart|Any CPU = Debug-FindFlashingProfileNoRestart|Any CPU
Debug-FindFlashingProfileNoRestart|x64 = Debug-FindFlashingProfileNoRestart|x64
Debug-FindFlashingProfileNoRestart|x86 = Debug-FindFlashingProfileNoRestart|x86
Debug-FixBoot|Any CPU = Debug-FixBoot|Any CPU Debug-FixBoot|Any CPU = Debug-FixBoot|Any CPU
Debug-FixBoot|x64 = Debug-FixBoot|x64
Debug-FixBoot|x86 = Debug-FixBoot|x86
Debug-FlashCustomRom-640|Any CPU = Debug-FlashCustomRom-640|Any CPU Debug-FlashCustomRom-640|Any CPU = Debug-FlashCustomRom-640|Any CPU
Debug-FlashCustomRom-640|x64 = Debug-FlashCustomRom-640|x64
Debug-FlashCustomRom-640|x86 = Debug-FlashCustomRom-640|x86
Debug-FlashFFU-RM1073|Any CPU = Debug-FlashFFU-RM1073|Any CPU Debug-FlashFFU-RM1073|Any CPU = Debug-FlashFFU-RM1073|Any CPU
Debug-FlashFFU-RM1073|x64 = Debug-FlashFFU-RM1073|x64
Debug-FlashFFU-RM1073|x86 = Debug-FlashFFU-RM1073|x86
Debug-FlashFFU-RM1085|Any CPU = Debug-FlashFFU-RM1085|Any CPU Debug-FlashFFU-RM1085|Any CPU = Debug-FlashFFU-RM1085|Any CPU
Debug-FlashFFU-RM1085|x64 = Debug-FlashFFU-RM1085|x64
Debug-FlashFFU-RM1085|x86 = Debug-FlashFFU-RM1085|x86
Debug-FlashRaw|Any CPU = Debug-FlashRaw|Any CPU Debug-FlashRaw|Any CPU = Debug-FlashRaw|Any CPU
Debug-FlashRaw|x64 = Debug-FlashRaw|x64
Debug-FlashRaw|x86 = Debug-FlashRaw|x86
Debug-Help|Any CPU = Debug-Help|Any CPU Debug-Help|Any CPU = Debug-Help|Any CPU
Debug-Help|x64 = Debug-Help|x64
Debug-Help|x86 = Debug-Help|x86
Debug-MergeGptXmlXml|Any CPU = Debug-MergeGptXmlXml|Any CPU Debug-MergeGptXmlXml|Any CPU = Debug-MergeGptXmlXml|Any CPU
Debug-MergeGptXmlXml|x64 = Debug-MergeGptXmlXml|x64
Debug-MergeGptXmlXml|x86 = Debug-MergeGptXmlXml|x86
Debug-MergeGptXmlZip|Any CPU = Debug-MergeGptXmlZip|Any CPU Debug-MergeGptXmlZip|Any CPU = Debug-MergeGptXmlZip|Any CPU
Debug-MergeGptXmlZip|x64 = Debug-MergeGptXmlZip|x64
Debug-MergeGptXmlZip|x86 = Debug-MergeGptXmlZip|x86
Debug-MSM|Any CPU = Debug-MSM|Any CPU Debug-MSM|Any CPU = Debug-MSM|Any CPU
Debug-MSM|x64 = Debug-MSM|x64
Debug-MSM|x86 = Debug-MSM|x86
Debug-ReadGPT|Any CPU = Debug-ReadGPT|Any CPU Debug-ReadGPT|Any CPU = Debug-ReadGPT|Any CPU
Debug-ReadGPT|x64 = Debug-ReadGPT|x64
Debug-ReadGPT|x86 = Debug-ReadGPT|x86
Debug-RelockPhone|Any CPU = Debug-RelockPhone|Any CPU Debug-RelockPhone|Any CPU = Debug-RelockPhone|Any CPU
Debug-RelockPhone|x64 = Debug-RelockPhone|x64
Debug-RelockPhone|x86 = Debug-RelockPhone|x86
Debug-RestoreGPT|Any CPU = Debug-RestoreGPT|Any CPU Debug-RestoreGPT|Any CPU = Debug-RestoreGPT|Any CPU
Debug-RestoreGPT|x64 = Debug-RestoreGPT|x64
Debug-RestoreGPT|x86 = Debug-RestoreGPT|x86
Debug-ShowFFU|Any CPU = Debug-ShowFFU|Any CPU Debug-ShowFFU|Any CPU = Debug-ShowFFU|Any CPU
Debug-ShowFFU|x64 = Debug-ShowFFU|x64
Debug-ShowFFU|x86 = Debug-ShowFFU|x86
Debug-ShowPhoneInfo|Any CPU = Debug-ShowPhoneInfo|Any CPU Debug-ShowPhoneInfo|Any CPU = Debug-ShowPhoneInfo|Any CPU
Debug-ShowPhoneInfo|x64 = Debug-ShowPhoneInfo|x64
Debug-ShowPhoneInfo|x86 = Debug-ShowPhoneInfo|x86
Debug-Test|Any CPU = Debug-Test|Any CPU Debug-Test|Any CPU = Debug-Test|Any CPU
Debug-Test|x64 = Debug-Test|x64
Debug-Test|x86 = Debug-Test|x86
Debug-TestProgrammer-550|Any CPU = Debug-TestProgrammer-550|Any CPU Debug-TestProgrammer-550|Any CPU = Debug-TestProgrammer-550|Any CPU
Debug-TestProgrammer-550|x64 = Debug-TestProgrammer-550|x64
Debug-TestProgrammer-550|x86 = Debug-TestProgrammer-550|x86
Debug-TestProgrammer-630|Any CPU = Debug-TestProgrammer-630|Any CPU Debug-TestProgrammer-630|Any CPU = Debug-TestProgrammer-630|Any CPU
Debug-TestProgrammer-630|x64 = Debug-TestProgrammer-630|x64
Debug-TestProgrammer-630|x86 = Debug-TestProgrammer-630|x86
Debug-TestProgrammer-640|Any CPU = Debug-TestProgrammer-640|Any CPU Debug-TestProgrammer-640|Any CPU = Debug-TestProgrammer-640|Any CPU
Debug-TestProgrammer-640|x64 = Debug-TestProgrammer-640|x64
Debug-TestProgrammer-640|x86 = Debug-TestProgrammer-640|x86
Debug-TestProgrammer-650|Any CPU = Debug-TestProgrammer-650|Any CPU Debug-TestProgrammer-650|Any CPU = Debug-TestProgrammer-650|Any CPU
Debug-TestProgrammer-650|x64 = Debug-TestProgrammer-650|x64
Debug-TestProgrammer-650|x86 = Debug-TestProgrammer-650|x86
Debug-TestProgrammer-930|Any CPU = Debug-TestProgrammer-930|Any CPU Debug-TestProgrammer-930|Any CPU = Debug-TestProgrammer-930|Any CPU
Debug-TestProgrammer-930|x64 = Debug-TestProgrammer-930|x64
Debug-TestProgrammer-930|x86 = Debug-TestProgrammer-930|x86
Debug-TestProgrammer-950|Any CPU = Debug-TestProgrammer-950|Any CPU Debug-TestProgrammer-950|Any CPU = Debug-TestProgrammer-950|Any CPU
Debug-TestProgrammer-950|x64 = Debug-TestProgrammer-950|x64
Debug-TestProgrammer-950|x86 = Debug-TestProgrammer-950|x86
Debug-UnlockBootloader|Any CPU = Debug-UnlockBootloader|Any CPU Debug-UnlockBootloader|Any CPU = Debug-UnlockBootloader|Any CPU
Debug-UnlockBootloader|x64 = Debug-UnlockBootloader|x64
Debug-UnlockBootloader|x86 = Debug-UnlockBootloader|x86
Preview|Any CPU = Preview|Any CPU Preview|Any CPU = Preview|Any CPU
Preview|x64 = Preview|x64
Preview|x86 = Preview|x86
Preview-Test|Any CPU = Preview-Test|Any CPU Preview-Test|Any CPU = Preview-Test|Any CPU
Preview-Test|x64 = Preview-Test|x64
Preview-Test|x86 = Preview-Test|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
Release-Test|Any CPU = Release-Test|Any CPU Release-Test|Any CPU = Release-Test|Any CPU
Release-Test|x64 = Release-Test|x64
Release-Test|x86 = Release-Test|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-AddEmergency|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-AddEmergency|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-AddEmergency|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-AddEmergency|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-AddEmergency|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-AddEmergency|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-AddEmergency|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-AddEmergency|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-BackupGPT|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-BackupGPT|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-BackupGPT|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-BackupGPT|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-BackupGPT|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-BackupGPT|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-BackupGPT|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-BackupGPT|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ClearNV|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ClearNV|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ClearNV|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ClearNV|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ClearNV|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ClearNV|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ClearNV|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ClearNV|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-930|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-930|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-930|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-930|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-930|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-930|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-930|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-930|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950 (no restart)|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950 (no restart)|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950 (no restart)|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950 (no restart)|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950 (no restart)|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950 (no restart)|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950 (no restart)|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950 (no restart)|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-CustomFlash-950|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLall|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLall|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLall|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLall|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLall|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLall|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLall|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLall|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLEmergency|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLEmergency|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLEmergency|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLEmergency|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLEmergency|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLEmergency|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLEmergency|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLEmergency|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLFFU|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLFFU|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLFFU|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLFFU|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLFFU|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLFFU|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLFFU|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DLFFU|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpFFU|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpFFU|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpFFU|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpFFU|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpFFU|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpFFU|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpFFU|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpFFU|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpUEFI|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpUEFI|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpUEFI|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpUEFI|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpUEFI|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpUEFI|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpUEFI|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-DumpUEFI|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccess|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccess|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccess|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccess|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccess|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccess|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccess|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccess|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccessOnImage|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccessOnImage|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccessOnImage|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccessOnImage|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccessOnImage|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccessOnImage|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccessOnImage|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableRootAccessOnImage|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning (no restart)|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning (no restart)|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning (no restart)|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning (no restart)|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning (no restart)|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning (no restart)|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning (no restart)|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning (no restart)|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-EnableTestSigning|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfile|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfile|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfile|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfile|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfile|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfile|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfile|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfile|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfileNoRestart|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfileNoRestart|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfileNoRestart|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfileNoRestart|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfileNoRestart|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfileNoRestart|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfileNoRestart|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FindFlashingProfileNoRestart|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FixBoot|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FixBoot|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FixBoot|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FixBoot|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FixBoot|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FixBoot|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FixBoot|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FixBoot|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashCustomRom-640|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashCustomRom-640|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashCustomRom-640|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashCustomRom-640|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashCustomRom-640|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashCustomRom-640|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashCustomRom-640|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashCustomRom-640|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1073|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1073|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1073|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1073|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1073|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1073|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1073|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1073|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1085|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1085|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1085|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1085|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1085|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1085|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1085|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashFFU-RM1085|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashRaw|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashRaw|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashRaw|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashRaw|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashRaw|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashRaw|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashRaw|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-FlashRaw|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Help|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Help|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Help|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Help|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Help|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Help|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Help|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Help|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlXml|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlXml|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlXml|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlXml|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlXml|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlXml|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlXml|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlXml|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlZip|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlZip|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlZip|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlZip|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlZip|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlZip|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlZip|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MergeGptXmlZip|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MSM|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MSM|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MSM|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MSM|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MSM|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MSM|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MSM|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-MSM|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ReadGPT|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ReadGPT|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ReadGPT|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ReadGPT|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ReadGPT|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ReadGPT|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ReadGPT|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ReadGPT|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RelockPhone|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RelockPhone|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RelockPhone|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RelockPhone|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RelockPhone|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RelockPhone|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RelockPhone|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RelockPhone|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RestoreGPT|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RestoreGPT|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RestoreGPT|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RestoreGPT|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RestoreGPT|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RestoreGPT|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RestoreGPT|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-RestoreGPT|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowFFU|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowFFU|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowFFU|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowFFU|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowFFU|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowFFU|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowFFU|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowFFU|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowPhoneInfo|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowPhoneInfo|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowPhoneInfo|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowPhoneInfo|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowPhoneInfo|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowPhoneInfo|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowPhoneInfo|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-ShowPhoneInfo|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Test|Any CPU.ActiveCfg = Debug-Test|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Test|Any CPU.ActiveCfg = Debug-Test|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Test|Any CPU.Build.0 = Debug-Test|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Test|Any CPU.Build.0 = Debug-Test|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Test|x64.ActiveCfg = Debug-Test|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Test|x64.Build.0 = Debug-Test|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Test|x86.ActiveCfg = Debug-Test|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-Test|x86.Build.0 = Debug-Test|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-550|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-550|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-550|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-550|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-550|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-550|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-550|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-550|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-630|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-630|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-630|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-630|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-630|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-630|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-630|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-630|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-640|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-640|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-640|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-640|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-640|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-640|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-640|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-640|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-650|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-650|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-650|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-650|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-650|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-650|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-650|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-650|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-930|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-930|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-930|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-930|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-930|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-930|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-930|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-930|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-950|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-950|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-950|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-950|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-950|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-950|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-950|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-TestProgrammer-950|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-UnlockBootloader|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-UnlockBootloader|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-UnlockBootloader|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-UnlockBootloader|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-UnlockBootloader|x64.ActiveCfg = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-UnlockBootloader|x64.Build.0 = Debug|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-UnlockBootloader|x86.ActiveCfg = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Debug-UnlockBootloader|x86.Build.0 = Debug|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview|Any CPU.ActiveCfg = Release|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview|Any CPU.ActiveCfg = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview|Any CPU.Build.0 = Release|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview|Any CPU.Build.0 = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview|x64.ActiveCfg = Release|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview|x64.Build.0 = Release|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview|x86.ActiveCfg = Release|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview|x86.Build.0 = Release|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview-Test|Any CPU.ActiveCfg = Release|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview-Test|Any CPU.ActiveCfg = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview-Test|Any CPU.Build.0 = Release|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview-Test|Any CPU.Build.0 = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview-Test|x64.ActiveCfg = Release|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview-Test|x64.Build.0 = Release|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview-Test|x86.ActiveCfg = Release|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Preview-Test|x86.Build.0 = Release|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release|Any CPU.ActiveCfg = Release|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release|Any CPU.Build.0 = Release|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release|Any CPU.Build.0 = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release|x64.ActiveCfg = Release|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release|x64.Build.0 = Release|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release|x86.ActiveCfg = Release|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release|x86.Build.0 = Release|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release-Test|Any CPU.ActiveCfg = Release|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release-Test|Any CPU.ActiveCfg = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release-Test|Any CPU.Build.0 = Release|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release-Test|Any CPU.Build.0 = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release-Test|x64.ActiveCfg = Release|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release-Test|x64.Build.0 = Release|x64
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-AddEmergency|Any CPU.ActiveCfg = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release-Test|x86.ActiveCfg = Release|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-AddEmergency|Any CPU.Build.0 = Debug|Any CPU {AED6DEB8-F54C-4B41-9655-793E7096AE6E}.Release-Test|x86.Build.0 = Release|x86
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-BackupGPT|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-BackupGPT|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-ClearNV|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-ClearNV|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-CustomFlash-930|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-CustomFlash-930|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-CustomFlash-950 (no restart)|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-CustomFlash-950 (no restart)|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-CustomFlash-950|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-CustomFlash-950|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DLall|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DLall|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DLEmergency|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DLEmergency|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DLFFU|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DLFFU|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DumpFFU|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DumpFFU|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DumpUEFI|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-DumpUEFI|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-EnableRootAccess|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-EnableRootAccess|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-EnableRootAccessOnImage|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-EnableRootAccessOnImage|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-EnableTestSigning (no restart)|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-EnableTestSigning (no restart)|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-EnableTestSigning|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-EnableTestSigning|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FindFlashingProfile|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FindFlashingProfile|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FindFlashingProfileNoRestart|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FindFlashingProfileNoRestart|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FixBoot|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FixBoot|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FlashCustomRom-640|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FlashCustomRom-640|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FlashFFU-RM1073|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FlashFFU-RM1073|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FlashFFU-RM1085|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FlashFFU-RM1085|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FlashRaw|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-FlashRaw|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-Help|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-Help|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-MergeGptXmlXml|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-MergeGptXmlXml|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-MergeGptXmlZip|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-MergeGptXmlZip|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-MSM|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-MSM|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-ReadGPT|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-ReadGPT|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-RelockPhone|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-RelockPhone|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-RestoreGPT|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-RestoreGPT|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-ShowFFU|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-ShowFFU|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-ShowPhoneInfo|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-ShowPhoneInfo|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-Test|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-Test|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-550|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-550|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-630|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-630|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-640|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-640|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-650|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-650|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-930|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-930|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-950|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-TestProgrammer-950|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-UnlockBootloader|Any CPU.ActiveCfg = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Debug-UnlockBootloader|Any CPU.Build.0 = Debug|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Preview|Any CPU.ActiveCfg = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Preview|Any CPU.Build.0 = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Preview-Test|Any CPU.ActiveCfg = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Preview-Test|Any CPU.Build.0 = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Release|Any CPU.Build.0 = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Release-Test|Any CPU.ActiveCfg = Release|Any CPU
{AED6DEB8-F54C-4B41-9655-793E7096AE6F}.Release-Test|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
+35 -9
View File
@@ -1,6 +1,6 @@
/* WinUSBNet library /* WinUSBNet library
* (C) 2010 Thomas Bleeker (www.madwizard.org) * (C) 2010 Thomas Bleeker (www.madwizard.org)
* *
* Licensed under the MIT license, see license.txt or: * Licensed under the MIT license, see license.txt or:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
*/ */
@@ -97,23 +97,48 @@ namespace MadWizard.WinUSBNet.API
return deviceDesc; return deviceDesc;
} }
public string GetStringDescriptor(byte index) private int ReadStringDescriptor(byte index, ushort languageID, byte[] buffer)
{ {
byte[] buffer = new byte[256];
uint transfered; uint transfered;
bool success = WinUsb_GetDescriptor(_winUsbHandle, USB_STRING_DESCRIPTOR_TYPE, bool success = WinUsb_GetDescriptor(_winUsbHandle, USB_STRING_DESCRIPTOR_TYPE,
index, 0, buffer, (uint)buffer.Length, out transfered); index, languageID, buffer, (uint)buffer.Length, out transfered);
if (!success) if (!success)
throw APIException.Win32("Failed to get USB string descriptor (" + index + "): 0x" + Marshal.GetLastWin32Error().ToString("X8")); throw APIException.Win32("Failed to get USB string descriptor (" + index + ").");
int length = buffer[0] - 2; if (transfered == 0)
if (length <= 0) throw new APIException("No data returned when reading USB descriptor.");
int length = buffer[0];
if (length != transfered)
throw new APIException("Unexpected length when reading USB descriptor.");
return length;
}
public ushort[] GetSupportedLanguageIDs()
{
byte[] buffer = new byte[256];
int length = ReadStringDescriptor(0, 0, buffer);
length -= 2; // Skip length byte and descriptor type
if (length < 0 || (length % 2) != 0)
throw new APIException("Unexpected length when reading supported languages.");
ushort[] langIDs = new ushort[length / 2];
Buffer.BlockCopy(buffer, 2, langIDs, 0, length);
return langIDs;
}
public string GetStringDescriptor(byte index, ushort languageID)
{
byte[] buffer = new byte[256];
int length = ReadStringDescriptor(index, languageID, buffer);
length -= 2; // Skip length byte and descriptor type
if (length < 0)
return null; return null;
char[] chars = System.Text.Encoding.Unicode.GetChars(buffer, 2, length); char[] chars = System.Text.Encoding.Unicode.GetChars(buffer, 2, length);
return new string(chars); return new string(chars);
} }
public void ControlTransfer(byte requestType, byte request, ushort value, ushort index, ushort length, byte[] data) public int ControlTransfer(byte requestType, byte request, ushort value, ushort index, ushort length, byte[] data)
{ {
uint bytesReturned = 0; uint bytesReturned = 0;
WINUSB_SETUP_PACKET setupPacket; WINUSB_SETUP_PACKET setupPacket;
@@ -127,6 +152,7 @@ namespace MadWizard.WinUSBNet.API
bool success = WinUsb_ControlTransfer(_winUsbHandle, setupPacket, data, length, ref bytesReturned, IntPtr.Zero); bool success = WinUsb_ControlTransfer(_winUsbHandle, setupPacket, data, length, ref bytesReturned, IntPtr.Zero);
if (!success) // todo check bytes returned? if (!success) // todo check bytes returned?
throw APIException.Win32("Control transfer on WinUSB device failed."); throw APIException.Win32("Control transfer on WinUSB device failed.");
return (int)bytesReturned;
} }
@@ -227,7 +253,7 @@ namespace MadWizard.WinUSBNet.API
finally finally
{ {
// Save interface handles (will be cleaned by Dispose) // Save interface handles (will be cleaned by Dispose)
// also in case of exception (which is why it is in finally block), // also in case of exception (which is why it is in finally block),
// because some handles might have already been opened and need // because some handles might have already been opened and need
// to be disposed. // to be disposed.
_addInterfaces = interfaces.ToArray(); _addInterfaces = interfaces.ToArray();
+39 -18
View File
@@ -1,6 +1,6 @@
/* WinUSBNet library /* WinUSBNet library
* (C) 2010 Thomas Bleeker (www.madwizard.org) * (C) 2010 Thomas Bleeker (www.madwizard.org)
* *
* Licensed under the MIT license, see license.txt or: * Licensed under the MIT license, see license.txt or:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
*/ */
@@ -47,20 +47,13 @@ namespace MadWizard.WinUSBNet
/* /*
// Listen for the control's window creation and then hook into it. // Listen for the control's window creation and then hook into it.
internal void OnHandleCreated(object sender, EventArgs e) private void OnHandleCreated(object sender, EventArgs e)
{ {
try try
{ {
// Window is now created, assign handle to NativeWindow. // Window is now created, assign handle to NativeWindow.
IntPtr handle = ((Control)sender).Handle; IntPtr handle = ((Control)sender).Handle;
AssignHandle(handle); RegisterNotify(handle);
if (_notifyHandle != IntPtr.Zero)
{
API.DeviceManagement.StopDeviceDeviceNotifications(_notifyHandle);
_notifyHandle = IntPtr.Zero;
}
API.DeviceManagement.RegisterForDeviceNotifications(handle, _guid, ref _notifyHandle);
} }
catch (API.APIException ex) catch (API.APIException ex)
{ {
@@ -68,17 +61,12 @@ namespace MadWizard.WinUSBNet
} }
} }
internal void OnHandleDestroyed(object sender, EventArgs e) private void OnHandleDestroyed(object sender, EventArgs e)
{ {
try try
{ {
// Window was destroyed, release hook. // Window was destroyed, release hook.
ReleaseHandle(); StopNotify();
if (_notifyHandle != null)
{
API.DeviceManagement.StopDeviceDeviceNotifications(_notifyHandle);
_notifyHandle = IntPtr.Zero;
}
} }
catch (API.APIException ex) catch (API.APIException ex)
{ {
@@ -86,6 +74,28 @@ namespace MadWizard.WinUSBNet
} }
} }
private void RegisterNotify(IntPtr handle)
{
AssignHandle(handle);
if (_notifyHandle != IntPtr.Zero)
{
API.DeviceManagement.StopDeviceDeviceNotifications(_notifyHandle);
_notifyHandle = IntPtr.Zero;
}
API.DeviceManagement.RegisterForDeviceNotifications(handle, _guid, ref _notifyHandle);
}
private void StopNotify()
{
//ReleaseHandle();
if (_notifyHandle != IntPtr.Zero)
{
API.DeviceManagement.StopDeviceDeviceNotifications(_notifyHandle);
_notifyHandle = IntPtr.Zero;
}
}
protected override void WndProc(ref Message m) protected override void WndProc(ref Message m)
{ {
// Listen for operating system messages // Listen for operating system messages
@@ -95,6 +105,17 @@ namespace MadWizard.WinUSBNet
case API.DeviceManagement.WM_DEVICECHANGE: case API.DeviceManagement.WM_DEVICECHANGE:
_notifier.HandleDeviceChange(m); _notifier.HandleDeviceChange(m);
break; break;
case WM_NCDESTROY:
// Note: when a control is used, OnHandleDestroyed will be called and the
// handle is already released from NativeWindow. In that case, this
// WM_NCDESTROY message will not be caught here. This is no problem since
// StopNotify is already called. Even if it does, calling it twice does not cause
// problems.
// When a window handle is used instead of a Control the OnHandle events will not
// fire and this handler is necessary to release the handle and stop notifications
// when the window is destroyed.
StopNotify();
break;
} }
base.WndProc(ref m); base.WndProc(ref m);
} }
+4 -4
View File
@@ -1,6 +1,6 @@
/* WinUSBNet library /* WinUSBNet library
* (C) 2010 Thomas Bleeker (www.madwizard.org) * (C) 2010 Thomas Bleeker (www.madwizard.org)
* *
* Licensed under the MIT license, see license.txt or: * Licensed under the MIT license, see license.txt or:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
*/ */
@@ -55,10 +55,10 @@ namespace MadWizard.WinUSBNet
/// <summary>Video base class (0x0E)</summary> /// <summary>Video base class (0x0E)</summary>
Video = 0x0E, Video = 0x0E,
/// <summary>Personal healthcare base class (0x0F)</summary> /// <summary>Personal health care base class (0x0F)</summary>
PersonalHealthcare = 0x0F, PersonalHealthcare = 0x0F,
/// <summary>Diagnosticdevice base class (0xDC)</summary> /// <summary>Diagnostic device base class (0xDC)</summary>
DiagnosticDevice = 0xDC, DiagnosticDevice = 0xDC,
/// <summary>Wireless controller base class (0xE0)</summary> /// <summary>Wireless controller base class (0xE0)</summary>
+84 -66
View File
@@ -1,6 +1,6 @@
/* WinUSBNet library /* WinUSBNet library
* (C) 2010 Thomas Bleeker (www.madwizard.org) * (C) 2010 Thomas Bleeker (www.madwizard.org)
* *
* Licensed under the MIT license, see license.txt or: * Licensed under the MIT license, see license.txt or:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
*/ */
@@ -96,7 +96,7 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Disposes the object /// Disposes the object
/// </summary> /// </summary>
/// <param name="disposing">Indicates wether Dispose was called manually (true) or by /// <param name="disposing">Indicates whether Dispose was called manually (true) or by
/// the garbage collector (false) via the destructor.</param> /// the garbage collector (false) via the destructor.</param>
protected virtual void Dispose(bool disposing) protected virtual void Dispose(bool disposing)
{ {
@@ -166,7 +166,7 @@ namespace MadWizard.WinUSBNet
API.WINUSB_PIPE_INFORMATION[] pipesInfo; API.WINUSB_PIPE_INFORMATION[] pipesInfo;
_wuDevice.GetInterfaceInfo(i, out descriptor, out pipesInfo); _wuDevice.GetInterfaceInfo(i, out descriptor, out pipesInfo);
USBPipe[] interfacePipes = new USBPipe[pipesInfo.Length]; USBPipe[] interfacePipes = new USBPipe[pipesInfo.Length];
for (int k = 0; k < pipesInfo.Length; k++) for(int k=0;k<pipesInfo.Length;k++)
{ {
USBPipe pipe = new USBPipe(this, pipesInfo[k]); USBPipe pipe = new USBPipe(this, pipesInfo[k]);
interfacePipes[k] = pipe; interfacePipes[k] = pipe;
@@ -187,13 +187,13 @@ namespace MadWizard.WinUSBNet
private void CheckControlParams(int value, int index, byte[] buffer, int length) private void CheckControlParams(int value, int index, byte[] buffer, int length)
{ {
if (value < ushort.MinValue || value > ushort.MaxValue) if (value < ushort.MinValue || value > ushort.MaxValue)
throw new ArgumentOutOfRangeException("Value parameter out of range."); throw new ArgumentOutOfRangeException(nameof(value), "Value parameter out of range.");
if (index < ushort.MinValue || index > ushort.MaxValue) if (index < ushort.MinValue || index > ushort.MaxValue)
throw new ArgumentOutOfRangeException("Index parameter out of range."); throw new ArgumentOutOfRangeException(nameof(index), "Index parameter out of range.");
if (length > buffer.Length) if (length > buffer.Length)
throw new ArgumentOutOfRangeException("Length parameter is larger than the size of the buffer."); throw new ArgumentOutOfRangeException(nameof(length), "Length parameter is larger than the size of the buffer.");
if (length > ushort.MaxValue) if (length > ushort.MaxValue)
throw new ArgumentOutOfRangeException("Length too large"); throw new ArgumentOutOfRangeException(nameof(length), "Length too large");
} }
/// <summary> /// <summary>
@@ -213,7 +213,7 @@ namespace MadWizard.WinUSBNet
set set
{ {
if (value < 0) if (value < 0)
throw new ArgumentOutOfRangeException("Control pipe timeout cannot be negative."); throw new ArgumentOutOfRangeException(nameof(value), "Control pipe timeout cannot be negative.");
//_wuDevice.SetPipePolicy(0, 0x00, API.POLICY_TYPE.PIPE_TRANSFER_TIMEOUT, (uint)value); //_wuDevice.SetPipePolicy(0, 0x00, API.POLICY_TYPE.PIPE_TRANSFER_TIMEOUT, (uint)value);
if (InputPipe != null) if (InputPipe != null)
_wuDevice.SetPipePolicy(0, InputPipe.Address, API.POLICY_TYPE.PIPE_TRANSFER_TIMEOUT, (uint)value); _wuDevice.SetPipePolicy(0, InputPipe.Address, API.POLICY_TYPE.PIPE_TRANSFER_TIMEOUT, (uint)value);
@@ -233,11 +233,12 @@ namespace MadWizard.WinUSBNet
/// <param name="request">The setup packet device request.</param> /// <param name="request">The setup packet device request.</param>
/// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param> /// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param>
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="buffer">The data to transfer in the data stage of the control. When the transfer is in the IN direction the data received will be /// <param name="buffer">The data to transfer in the data stage of the control. When the transfer is in the IN direction the data received will be
/// written to this buffer. For an OUT direction transfer the contents of the buffer are written sent through the pipe.</param> /// written to this buffer. For an OUT direction transfer the contents of the buffer are written sent through the pipe.</param>
/// <param name="length">Length of the data to transfer. Must be equal to or less than the length of <paramref name="buffer"/>. /// <param name="length">Length of the data to transfer. Must be equal to or less than the length of <paramref name="buffer"/>.
/// The setup packet's length member will be set to this length.</param> /// The setup packet's length member will be set to this length.</param>
public void ControlTransfer(byte requestType, byte request, int value, int index, byte[] buffer, int length) /// <returns>The number of bytes received from the device.</returns>
public int ControlTransfer(byte requestType, byte request, int value, int index, byte[] buffer, int length)
{ {
// Parameters are int and not ushort because ushort is not CLS compliant. // Parameters are int and not ushort because ushort is not CLS compliant.
CheckNotDisposed(); CheckNotDisposed();
@@ -245,7 +246,7 @@ namespace MadWizard.WinUSBNet
try try
{ {
_wuDevice.ControlTransfer(requestType, request, (ushort)value, (ushort)index, (ushort)length, buffer); return _wuDevice.ControlTransfer(requestType, request, (ushort)value, (ushort)index, (ushort)length, buffer);
} }
catch (API.APIException e) catch (API.APIException e)
{ {
@@ -256,24 +257,24 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Initiates an asynchronous control transfer over the default control endpoint. This method allows both IN and OUT direction transfers, depending /// Initiates an asynchronous control transfer over the default control endpoint. This method allows both IN and OUT direction transfers, depending
/// on the highest bit of the <paramref name="requestType"/> parameter. Alternatively, <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> and /// on the highest bit of the <paramref name="requestType"/> parameter. Alternatively, <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> and
/// <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> can be used for asynchronous control transfers in a specific direction, which is /// <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> can be used for asynchronous control transfers in a specific direction, which is
/// the recommended way because it prevents using the wrong direction accidentally. Use the BeginControlTransfer method when the direction is not /// the recommended way because it prevents using the wrong direction accidentally. Use the BeginControlTransfer method when the direction is not
/// known at compile time. </summary> /// known at compile time. </summary>
/// <param name="requestType">The setup packet request type.</param> /// <param name="requestType">The setup packet request type.</param>
/// <param name="request">The setup packet device request.</param> /// <param name="request">The setup packet device request.</param>
/// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param> /// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param>
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="buffer">The data to transfer in the data stage of the control. When the transfer is in the IN direction the data received will be /// <param name="buffer">The data to transfer in the data stage of the control. When the transfer is in the IN direction the data received will be
/// written to this buffer. For an OUT direction transfer the contents of the buffer are written sent through the pipe. Note: This buffer is not allowed /// written to this buffer. For an OUT direction transfer the contents of the buffer are written sent through the pipe. Note: This buffer is not allowed
/// to change for the duration of the asynchronous operation.</param> /// to change for the duration of the asynchronous operation.</param>
/// <param name="length">Length of the data to transfer. Must be equal to or less than the length of <paramref name="buffer"/>. The setup packet's length member will be set to this length.</param> /// <param name="length">Length of the data to transfer. Must be equal to or less than the length of <paramref name="buffer"/>. The setup packet's length member will be set to this length.</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlTransfer(byte requestType, byte request, int value, int index, byte[] buffer, int length, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlTransfer(byte requestType, byte request, int value, int index, byte[] buffer, int length, AsyncCallback userCallback, object stateObject)
@@ -306,23 +307,23 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Initiates an asynchronous control transfer over the default control endpoint. This method allows both IN and OUT direction transfers, depending /// Initiates an asynchronous control transfer over the default control endpoint. This method allows both IN and OUT direction transfers, depending
/// on the highest bit of the <paramref name="requestType"/> parameter. Alternatively, <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> and /// on the highest bit of the <paramref name="requestType"/> parameter. Alternatively, <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> and
/// <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> can be used for asynchronous control transfers in a specific direction, which is /// <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> can be used for asynchronous control transfers in a specific direction, which is
/// the recommended way because it prevents using the wrong direction accidentally. Use the BeginControlTransfer method when the direction is not /// the recommended way because it prevents using the wrong direction accidentally. Use the BeginControlTransfer method when the direction is not
/// known at compile time. </summary> /// known at compile time. </summary>
/// <param name="requestType">The setup packet request type.</param> /// <param name="requestType">The setup packet request type.</param>
/// <param name="request">The setup packet device request.</param> /// <param name="request">The setup packet device request.</param>
/// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param> /// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param>
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="buffer">The data to transfer in the data stage of the control. When the transfer is in the IN direction the data received will be /// <param name="buffer">The data to transfer in the data stage of the control. When the transfer is in the IN direction the data received will be
/// written to this buffer. For an OUT direction transfer the contents of the buffer are written sent through the pipe. The setup packet's length member will /// written to this buffer. For an OUT direction transfer the contents of the buffer are written sent through the pipe. The setup packet's length member will
/// be set to the length of this buffer. Note: This buffer is not allowed to change for the duration of the asynchronous operation. </param> /// be set to the length of this buffer. Note: This buffer is not allowed to change for the duration of the asynchronous operation. </param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlTransfer(byte requestType, byte request, int value, int index, byte[] buffer, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlTransfer(byte requestType, byte request, int value, int index, byte[] buffer, AsyncCallback userCallback, object stateObject)
@@ -334,13 +335,13 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Waits for a pending asynchronous control transfer to complete. /// Waits for a pending asynchronous control transfer to complete.
/// </summary> /// </summary>
/// <param name="asyncResult">The <see cref="IAsyncResult"/> object representing the asynchonous operation, /// <param name="asyncResult">The <see cref="IAsyncResult"/> object representing the asynchronous operation,
/// as returned by one of the ControlIn, ControlOut or ControlTransfer methods.</param> /// as returned by one of the ControlIn, ControlOut or ControlTransfer methods.</param>
/// <returns>The number of bytes transfered during the operation.</returns> /// <returns>The number of bytes transfered during the operation.</returns>
/// <remarks>Every asynchronous control transfer must have a matching call to <see cref="EndControlTransfer"/> to dispose /// <remarks>Every asynchronous control transfer must have a matching call to <see cref="EndControlTransfer"/> to dispose
/// of any resources used and to retrieve the result of the operation. When the operation was successful the method returns the number /// of any resources used and to retrieve the result of the operation. When the operation was successful the method returns the number
/// of bytes that were transfered. If an error occurred during the operation this method will throw the exceptions that would /// of bytes that were transfered. If an error occurred during the operation this method will throw the exceptions that would
/// otherwise have ocurred during the operation. If the operation is not yet finished EndControlTransfer will wait for the /// otherwise have occurred during the operation. If the operation is not yet finished EndControlTransfer will wait for the
/// operation to finish before returning.</remarks> /// operation to finish before returning.</remarks>
public int EndControlTransfer(IAsyncResult asyncResult) public int EndControlTransfer(IAsyncResult asyncResult)
{ {
@@ -379,12 +380,13 @@ namespace MadWizard.WinUSBNet
/// <param name="request">The setup packet device request.</param> /// <param name="request">The setup packet device request.</param>
/// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param> /// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param>
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="buffer">The data to transfer in the data stage of the control. When the transfer is in the IN direction the data received will be /// <param name="buffer">The data to transfer in the data stage of the control. When the transfer is in the IN direction the data received will be
/// written to this buffer. For an OUT direction transfer the contents of the buffer are written sent through the pipe. The length of this /// written to this buffer. For an OUT direction transfer the contents of the buffer are written sent through the pipe. The length of this
/// buffer is used as the number of bytes in the control transfer. The setup packet's length member will be set to this length as well.</param> /// buffer is used as the number of bytes in the control transfer. The setup packet's length member will be set to this length as well.</param>
public void ControlTransfer(byte requestType, byte request, int value, int index, byte[] buffer) /// <returns>The number of bytes received from the device.</returns>
public int ControlTransfer(byte requestType, byte request, int value, int index, byte[] buffer)
{ {
ControlTransfer(requestType, request, value, index, buffer, buffer.Length); return ControlTransfer(requestType, request, value, index, buffer, buffer.Length);
} }
/// <summary> /// <summary>
@@ -423,14 +425,23 @@ namespace MadWizard.WinUSBNet
/// <param name="request">The setup packet device request.</param> /// <param name="request">The setup packet device request.</param>
/// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param> /// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param>
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="length">Length of the data to transfer. A buffer will be created with this length and the length member of the setup packet /// <param name="length">Length of the data to transfer. A buffer will be created with this length and the length member of the setup packet
/// will be set to this length.</param> /// will be set to this length.</param>
/// <returns>A buffer containing the data transfered.</returns> /// <returns>A buffer containing the data transfered.</returns>
/// <remarks>This routine initially allocates a buffer to hold the <paramref name="length"/> bytes of data expected from the device.
/// If the device responds with less data than expected, this routine will allocate a smaller buffer to copy and return only the bytes actually received.
/// </remarks>
public byte[] ControlIn(byte requestType, byte request, int value, int index, int length) public byte[] ControlIn(byte requestType, byte request, int value, int index, int length)
{ {
CheckIn(requestType); CheckIn(requestType);
byte[] buffer = new byte[length]; byte[] buffer = new byte[length];
ControlTransfer(requestType, request, value, index, buffer, buffer.Length); int actuallyReceived = ControlTransfer(requestType, request, value, index, buffer, buffer.Length);
if (actuallyReceived < length)
{
byte[] outBuffer = new byte[actuallyReceived];
Array.Copy(buffer, 0, outBuffer, 0, actuallyReceived);
return outBuffer;
}
return buffer; return buffer;
} }
@@ -444,12 +455,13 @@ namespace MadWizard.WinUSBNet
/// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param> /// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param>
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="buffer">The buffer that will receive the data transfered.</param> /// <param name="buffer">The buffer that will receive the data transfered.</param>
/// <param name="length">Length of the data to transfer. The length member of the setup packet will be set to this length. The buffer specified /// <param name="length">Length of the data to transfer. The length member of the setup packet will be set to this length. The buffer specified
/// by the <paramref name="buffer"/> parameter should have at least this length.</param> /// by the <paramref name="buffer"/> parameter should have at least this length.</param>
public void ControlIn(byte requestType, byte request, int value, int index, byte[] buffer, int length) /// <returns>The number of bytes received from the device.</returns>
public int ControlIn(byte requestType, byte request, int value, int index, byte[] buffer, int length)
{ {
CheckIn(requestType); CheckIn(requestType);
ControlTransfer(requestType, request, value, index, buffer, length); return ControlTransfer(requestType, request, value, index, buffer, length);
} }
/// <summary> /// <summary>
@@ -462,10 +474,11 @@ namespace MadWizard.WinUSBNet
/// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param> /// <param name="value">The value member in the setup packet. Its meaning depends on the request. Value should be between zero and 65535 (0xFFFF).</param>
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="buffer">The buffer that will receive the data transfered. The length of this buffer will be the number of bytes transfered.</param> /// <param name="buffer">The buffer that will receive the data transfered. The length of this buffer will be the number of bytes transfered.</param>
public void ControlIn(byte requestType, byte request, int value, int index, byte[] buffer) /// <returns>The number of bytes received from the device.</returns>
public int ControlIn(byte requestType, byte request, int value, int index, byte[] buffer)
{ {
CheckIn(requestType); CheckIn(requestType);
ControlTransfer(requestType, request, value, index, buffer); return ControlTransfer(requestType, request, value, index, buffer);
} }
/// <summary> /// <summary>
@@ -536,8 +549,8 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Initiates an asynchronous control transfer without a data stage over the default control endpoint. This method allows both IN and OUT direction transfers, depending /// Initiates an asynchronous control transfer without a data stage over the default control endpoint. This method allows both IN and OUT direction transfers, depending
/// on the highest bit of the <paramref name="requestType"/> parameter. Alternatively, <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> and /// on the highest bit of the <paramref name="requestType"/> parameter. Alternatively, <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> and
/// <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> can be used for asynchronous control transfers in a specific direction, which is /// <see cref="BeginControlIn(byte,byte,int,int,byte[],int,AsyncCallback,object)"/> can be used for asynchronous control transfers in a specific direction, which is
/// the recommended way because it prevents using the wrong direction accidentally. Use the BeginControlTransfer method when the direction is not /// the recommended way because it prevents using the wrong direction accidentally. Use the BeginControlTransfer method when the direction is not
/// known at compile time. </summary> /// known at compile time. </summary>
/// <param name="requestType">The setup packet request type.</param> /// <param name="requestType">The setup packet request type.</param>
/// <param name="request">The setup packet device request.</param> /// <param name="request">The setup packet device request.</param>
@@ -545,11 +558,11 @@ namespace MadWizard.WinUSBNet
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlTransfer(byte requestType, byte request, int value, int index, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlTransfer(byte requestType, byte request, int value, int index, AsyncCallback userCallback, object stateObject)
@@ -571,11 +584,11 @@ namespace MadWizard.WinUSBNet
/// <param name="length">Length of the data to transfer. Must be equal to or less than the length of <paramref name="buffer"/>. The setup packet's length member will be set to this length.</param> /// <param name="length">Length of the data to transfer. Must be equal to or less than the length of <paramref name="buffer"/>. The setup packet's length member will be set to this length.</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlIn(byte requestType, byte request, int value, int index, byte[] buffer, int length, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlIn(byte requestType, byte request, int value, int index, byte[] buffer, int length, AsyncCallback userCallback, object stateObject)
@@ -594,11 +607,11 @@ namespace MadWizard.WinUSBNet
/// <param name="buffer">The buffer that will receive the data transfered. The setup packet's length member will be set to the length of this buffer.</param> /// <param name="buffer">The buffer that will receive the data transfered. The setup packet's length member will be set to the length of this buffer.</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlIn(byte requestType, byte request, int value, int index, byte[] buffer, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlIn(byte requestType, byte request, int value, int index, byte[] buffer, AsyncCallback userCallback, object stateObject)
@@ -608,7 +621,7 @@ namespace MadWizard.WinUSBNet
} }
/// <summary> /// <summary>
/// Initiates an asynchronous control transfer without a data stage over the default control endpoint. /// Initiates an asynchronous control transfer without a data stage over the default control endpoint.
/// The request should have an IN direction (specified by the highest bit of the <paramref name="requestType"/> parameter). /// The request should have an IN direction (specified by the highest bit of the <paramref name="requestType"/> parameter).
/// The setup packets' length member will be set to zero.</summary> /// The setup packets' length member will be set to zero.</summary>
/// <param name="requestType">The setup packet request type. The request type must specify the IN direction (highest bit set).</param> /// <param name="requestType">The setup packet request type. The request type must specify the IN direction (highest bit set).</param>
@@ -617,11 +630,11 @@ namespace MadWizard.WinUSBNet
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlIn(byte requestType, byte request, int value, int index, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlIn(byte requestType, byte request, int value, int index, AsyncCallback userCallback, object stateObject)
@@ -641,11 +654,11 @@ namespace MadWizard.WinUSBNet
/// <param name="length">Length of the data to transfer. Must be equal to or less than the length of <paramref name="buffer"/>. The setup packet's length member will be set to this length.</param> /// <param name="length">Length of the data to transfer. Must be equal to or less than the length of <paramref name="buffer"/>. The setup packet's length member will be set to this length.</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlOut(byte requestType, byte request, int value, int index, byte[] buffer, int length, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlOut(byte requestType, byte request, int value, int index, byte[] buffer, int length, AsyncCallback userCallback, object stateObject)
@@ -664,11 +677,11 @@ namespace MadWizard.WinUSBNet
/// <param name="buffer">The buffer that contains the data to be transfered. The setup packet's length member will be set to the length of this buffer.</param> /// <param name="buffer">The buffer that contains the data to be transfered. The setup packet's length member will be set to the length of this buffer.</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlOut(byte requestType, byte request, int value, int index, byte[] buffer, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlOut(byte requestType, byte request, int value, int index, byte[] buffer, AsyncCallback userCallback, object stateObject)
@@ -678,7 +691,7 @@ namespace MadWizard.WinUSBNet
} }
/// <summary> /// <summary>
/// Initiates an asynchronous control transfer without a data stage over the default control endpoint. /// Initiates an asynchronous control transfer without a data stage over the default control endpoint.
/// The request should have an OUT direction (specified by the highest bit of the <paramref name="requestType"/> parameter). /// The request should have an OUT direction (specified by the highest bit of the <paramref name="requestType"/> parameter).
/// The setup packets' length member will be set to zero.</summary> /// The setup packets' length member will be set to zero.</summary>
/// <param name="requestType">The setup packet request type. The request type must specify the OUT direction (highest bit cleared).</param> /// <param name="requestType">The setup packet request type. The request type must specify the OUT direction (highest bit cleared).</param>
@@ -687,11 +700,11 @@ namespace MadWizard.WinUSBNet
/// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param> /// <param name="index">The index member in the setup packet. Its meaning depends on the request. Index should be between zero and 65535 (0xFFFF).</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the control transfer is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous control transfer, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous control transfer, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndControlTransfer"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndControlTransfer"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginControlOut(byte requestType, byte request, int value, int index, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginControlOut(byte requestType, byte request, int value, int index, AsyncCallback userCallback, object stateObject)
@@ -712,10 +725,10 @@ namespace MadWizard.WinUSBNet
/// Finds WinUSB devices with a GUID matching the parameter guidString /// Finds WinUSB devices with a GUID matching the parameter guidString
/// </summary> /// </summary>
/// <param name="guidString">The GUID string that the device should match. /// <param name="guidString">The GUID string that the device should match.
/// The format of this string may be any format accepted by the constructor /// The format of this string may be any format accepted by the constructor
/// of the System.Guid class</param> /// of the System.Guid class</param>
/// <returns>An array of USBDeviceInfo objects representing the /// <returns>An array of USBDeviceInfo objects representing the
/// devices found. When no devices are found an empty array is /// devices found. When no devices are found an empty array is
/// returned.</returns> /// returned.</returns>
public static USBDeviceInfo[] GetDevices(string guidString) public static USBDeviceInfo[] GetDevices(string guidString)
{ {
@@ -726,8 +739,8 @@ namespace MadWizard.WinUSBNet
/// Finds WinUSB devices with a GUID matching the parameter guid /// Finds WinUSB devices with a GUID matching the parameter guid
/// </summary> /// </summary>
/// <param name="guid">The GUID that the device should match.</param> /// <param name="guid">The GUID that the device should match.</param>
/// <returns>An array of USBDeviceInfo objects representing the /// <returns>An array of USBDeviceInfo objects representing the
/// devices found. When no devices are found an empty array is /// devices found. When no devices are found an empty array is
/// returned.</returns> /// returned.</returns>
public static USBDeviceInfo[] GetDevices(Guid guid) public static USBDeviceInfo[] GetDevices(Guid guid)
{ {
@@ -781,8 +794,13 @@ namespace MadWizard.WinUSBNet
{ {
wuDevice.OpenDevice(devicePath); wuDevice.OpenDevice(devicePath);
API.USB_DEVICE_DESCRIPTOR deviceDesc = wuDevice.GetDeviceDescriptor(); API.USB_DEVICE_DESCRIPTOR deviceDesc = wuDevice.GetDeviceDescriptor();
// string q = wuDevice.GetStringDescriptor(0);
// TODO: use language id properly // Get first supported language ID
ushort[] langIDs = wuDevice.GetSupportedLanguageIDs();
ushort langID = 0;
if (langIDs.Length > 0)
langID = langIDs[0];
string manufacturer = null, product = null, serialNumber = null; string manufacturer = null, product = null, serialNumber = null;
byte idx = 0; byte idx = 0;
@@ -790,7 +808,7 @@ namespace MadWizard.WinUSBNet
{ {
idx = deviceDesc.iManufacturer; idx = deviceDesc.iManufacturer;
if (idx > 0) if (idx > 0)
manufacturer = wuDevice.GetStringDescriptor(idx); manufacturer = wuDevice.GetStringDescriptor(idx, langID);
} }
catch { } catch { }
@@ -798,7 +816,7 @@ namespace MadWizard.WinUSBNet
{ {
idx = deviceDesc.iProduct; idx = deviceDesc.iProduct;
if (idx > 0) if (idx > 0)
product = wuDevice.GetStringDescriptor(idx); product = wuDevice.GetStringDescriptor(idx, langID);
} }
catch { } catch { }
@@ -806,7 +824,7 @@ namespace MadWizard.WinUSBNet
{ {
idx = deviceDesc.iSerialNumber; idx = deviceDesc.iSerialNumber;
if (idx > 0) if (idx > 0)
serialNumber = wuDevice.GetStringDescriptor(idx); serialNumber = wuDevice.GetStringDescriptor(idx, langID);
} }
catch { } catch { }
+4 -4
View File
@@ -1,6 +1,6 @@
/* WinUSBNet library /* WinUSBNet library
* (C) 2010 Thomas Bleeker (www.madwizard.org) * (C) 2010 Thomas Bleeker (www.madwizard.org)
* *
* Licensed under the MIT license, see license.txt or: * Licensed under the MIT license, see license.txt or:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
*/ */
@@ -46,7 +46,7 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Friendly device name, or path name when no /// Friendly device name, or path name when no
/// further device information is available /// further device information is available
/// </summary> /// </summary>
public string FullName public string FullName
@@ -67,7 +67,7 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Device class code as defined in the interface descriptor /// Device class code as defined in the interface descriptor
/// This property can be used if the class type is not defined /// This property can be used if the class type is not defined
/// int the USBBaseClass enumeraiton /// int the USBBaseClass enumeration
/// </summary> /// </summary>
public byte ClassValue public byte ClassValue
{ {
+3 -3
View File
@@ -1,6 +1,6 @@
/* WinUSBNet library /* WinUSBNet library
* (C) 2010 Thomas Bleeker (www.madwizard.org) * (C) 2010 Thomas Bleeker (www.madwizard.org)
* *
* Licensed under the MIT license, see license.txt or: * Licensed under the MIT license, see license.txt or:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
*/ */
@@ -73,7 +73,7 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Interface class code as defined in the interface descriptor /// Interface class code as defined in the interface descriptor
/// This property can be used if the class type is not defined /// This property can be used if the class type is not defined
/// int the USBBaseClass enumeraiton /// int the USBBaseClass enumeration
/// </summary> /// </summary>
public byte ClassValue public byte ClassValue
{ {
+11 -11
View File
@@ -1,6 +1,6 @@
/* WinUSBNet library /* WinUSBNet library
* (C) 2010 Thomas Bleeker (www.madwizard.org) * (C) 2010 Thomas Bleeker (www.madwizard.org)
* *
* Licensed under the MIT license, see license.txt or: * Licensed under the MIT license, see license.txt or:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
*/ */
@@ -61,7 +61,7 @@ namespace MadWizard.WinUSBNet
} }
/// <summary> /// <summary>
/// Helper class to receive notifications on USB device changes such as /// Helper class to receive notifications on USB device changes such as
/// connecting or removing a device. /// connecting or removing a device.
/// </summary> /// </summary>
public class USBNotifier : IDisposable public class USBNotifier : IDisposable
@@ -108,11 +108,11 @@ namespace MadWizard.WinUSBNet
} }
/// <summary> /// <summary>
/// Constructs a new USBNotifier that will watch for events on /// Constructs a new USBNotifier that will watch for events on
/// devices matching the given interface GUID. A Windows Forms control /// devices matching the given interface GUID. A Windows Forms control
/// is needed since the notifier relies on window messages. /// is needed since the notifier relies on window messages.
/// </summary> /// </summary>
/// <param name="control">A control that will be used internally for device notification messages. /// <param name="control">A control that will be used internally for device notification messages.
/// You can use a Form object for example.</param> /// You can use a Form object for example.</param>
/// <param name="guidString">The interface GUID string of the devices to watch.</param> /// <param name="guidString">The interface GUID string of the devices to watch.</param>
public USBNotifier(string guidString) : public USBNotifier(string guidString) :
@@ -123,11 +123,11 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Constructs a new USBNotifier that will watch for events on /// Constructs a new USBNotifier that will watch for events on
/// devices matching the given interface GUID. A Windows Forms control /// devices matching the given interface GUID. A Windows Forms control
/// is needed since the notifier relies on window messages. /// is needed since the notifier relies on window messages.
/// </summary> /// </summary>
/// <param name="control">A control that will be used internally for device notification messages. /// <param name="control">A control that will be used internally for device notification messages.
/// You can use a Form object for example.</param> /// You can use a Form object for example.</param>
/// <param name="guid">The interface GUID of the devices to watch.</param> /// <param name="guid">The interface GUID of the devices to watch.</param>
public USBNotifier(Guid guid) public USBNotifier(Guid guid)
@@ -146,7 +146,7 @@ namespace MadWizard.WinUSBNet
_Arrival(this, new USBEvent(USBEventType.DeviceArrival, _guid, devicePath)); _Arrival(this, new USBEvent(USBEventType.DeviceArrival, _guid, devicePath));
} }
/// <summary> /// <summary>
/// Trigggers the removal event /// Triggers the removal event
/// </summary> /// </summary>
/// <param name="devicePath">Device pathname of the device that has been connected</param> /// <param name="devicePath">Device pathname of the device that has been connected</param>
protected void OnRemoval(string devicePath) protected void OnRemoval(string devicePath)
@@ -212,7 +212,7 @@ namespace MadWizard.WinUSBNet
} }
/// <summary> /// <summary>
/// Disposes the USBNotifier object and frees all resources. /// Disposes the USBNotifier object and frees all resources.
/// Call this method when the object is no longer needed. /// Call this method when the object is no longer needed.
/// </summary> /// </summary>
public void Dispose() public void Dispose()
+23 -24
View File
@@ -1,6 +1,6 @@
/* WinUSBNet library /* WinUSBNet library
* (C) 2010 Thomas Bleeker (www.madwizard.org) * (C) 2010 Thomas Bleeker (www.madwizard.org)
* *
* Licensed under the MIT license, see license.txt or: * Licensed under the MIT license, see license.txt or:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
*/ */
@@ -139,29 +139,29 @@ namespace MadWizard.WinUSBNet
private void CheckReadParams(byte[] buffer, int offset, int length) private void CheckReadParams(byte[] buffer, int offset, int length)
{ {
if (!IsIn) if (!IsIn)
// throw new NotSupportedException("Cannot read from a pipe with OUT direction."); // throw new ArgumentOutOfRangeException("Offset of data to read is outside the buffer boundaries.");
LogAndThrowException(new NotSupportedException("Cannot read from a pipe with OUT direction.")); LogAndThrowException(new ArgumentOutOfRangeException("Offset of data to read is outside the buffer boundaries."));
int bufferLength = buffer.Length; int bufferLength = buffer.Length;
if (offset < 0 || offset >= bufferLength) if (offset < 0 || offset >= bufferLength)
// throw new ArgumentOutOfRangeException("Offset of data to read is outside the buffer boundaries."); // throw new ArgumentOutOfRangeException(nameof(offset), "Offset of data to read is outside the buffer boundaries.");
LogAndThrowException(new ArgumentOutOfRangeException("Offset of data to read is outside the buffer boundaries.")); LogAndThrowException(new ArgumentOutOfRangeException("Offset of data to read is outside the buffer boundaries."));
if (length < 0 || (offset + length) > bufferLength) if (length < 0 || (offset + length) > bufferLength)
// throw new ArgumentOutOfRangeException("Length of data to read is outside the buffer boundaries."); // throw new ArgumentOutOfRangeException(nameof(length), "Length of data to read is outside the buffer boundaries.");
LogAndThrowException(new ArgumentOutOfRangeException("Length of data to read is outside the buffer boundaries.")); LogAndThrowException(new ArgumentOutOfRangeException("Length of data to read is outside the buffer boundaries."));
} }
private void CheckWriteParams(byte[] buffer, int offset, int length) private void CheckWriteParams(byte[] buffer, int offset, int length)
{ {
if (!IsOut) if (!IsOut)
// throw new NotSupportedException("Cannot write to a pipe with IN direction."); //throw new NotSupportedException("Cannot write to a pipe with IN direction.");
LogAndThrowException(new NotSupportedException("Cannot write to a pipe with IN direction.")); LogAndThrowException(new NotSupportedException("Cannot write to a pipe with IN direction."));
int bufferLength = buffer.Length; int bufferLength = buffer.Length;
if (offset < 0 || offset >= bufferLength) if (offset < 0 || offset >= bufferLength)
// throw new ArgumentOutOfRangeException("Offset of data to write is outside the buffer boundaries."); // throw new ArgumentOutOfRangeException(nameof(offset), "Offset of data to write is outside the buffer boundaries.");
LogAndThrowException(new ArgumentOutOfRangeException("Offset of data to write is outside the buffer boundaries.")); LogAndThrowException(new ArgumentOutOfRangeException("Offset of data to write is outside the buffer boundaries."));
if (length < 0 || (offset + length) > bufferLength) if (length < 0 || (offset + length) > bufferLength)
// throw new ArgumentOutOfRangeException("Length of data to write is outside the buffer boundaries."); // throw new ArgumentOutOfRangeException(nameof(length), "Length of data to write is outside the buffer boundaries.");
LogAndThrowException(new ArgumentOutOfRangeException("Length of data to write is outside the buffer boundaries.")); LogAndThrowException(new ArgumentOutOfRangeException("Length of data to write is outside the buffer boundaries."));
} }
@@ -171,11 +171,11 @@ namespace MadWizard.WinUSBNet
/// <param name="length">Length of the data to transfer.</param> /// <param name="length">Length of the data to transfer.</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the operation is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the operation is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous operation, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous operation, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndRead"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndRead"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndRead"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndRead"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginRead(byte[] buffer, int offset, int length, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginRead(byte[] buffer, int offset, int length, AsyncCallback userCallback, object stateObject)
@@ -189,9 +189,8 @@ namespace MadWizard.WinUSBNet
} }
catch (API.APIException e) catch (API.APIException e)
{ {
if (result != null) result.Dispose();
result.Dispose(); //throw new USBException("Failed to read from pipe.", e);
// throw new USBException("Failed to read from pipe.", e);
LogAndThrowException(new USBException("Failed to read from pipe.", e)); LogAndThrowException(new USBException("Failed to read from pipe.", e));
} }
catch (Exception e) catch (Exception e)
@@ -208,13 +207,13 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Waits for a pending asynchronous read operation to complete. /// Waits for a pending asynchronous read operation to complete.
/// </summary> /// </summary>
/// <param name="asyncResult">The <see cref="IAsyncResult"/> object representing the asynchonous operation, /// <param name="asyncResult">The <see cref="IAsyncResult"/> object representing the asynchronous operation,
/// as returned by <see cref="BeginRead"/>.</param> /// as returned by <see cref="BeginRead"/>.</param>
/// <returns>The number of bytes transfered during the operation.</returns> /// <returns>The number of bytes transfered during the operation.</returns>
/// <remarks>Every call to <see cref="BeginRead"/> must have a matching call to <see cref="EndRead"/> to dispose /// <remarks>Every call to <see cref="BeginRead"/> must have a matching call to <see cref="EndRead"/> to dispose
/// of any resources used and to retrieve the result of the operation. When the operation was successful the method returns the number /// of any resources used and to retrieve the result of the operation. When the operation was successful the method returns the number
/// of bytes that were transfered. If an error occurred during the operation this method will throw the exceptions that would /// of bytes that were transfered. If an error occurred during the operation this method will throw the exceptions that would
/// otherwise have ocurred during the operation. If the operation is not yet finished EndWrite will wait for the /// otherwise have occurred during the operation. If the operation is not yet finished EndWrite will wait for the
/// operation to finish before returning.</remarks> /// operation to finish before returning.</remarks>
public int EndRead(IAsyncResult asyncResult) public int EndRead(IAsyncResult asyncResult)
{ {
@@ -285,11 +284,11 @@ namespace MadWizard.WinUSBNet
/// <param name="length">Length of the data to transfer.</param> /// <param name="length">Length of the data to transfer.</param>
/// <param name="userCallback">An optional asynchronous callback, to be called when the operation is complete. Can be null if no callback is required.</param> /// <param name="userCallback">An optional asynchronous callback, to be called when the operation is complete. Can be null if no callback is required.</param>
/// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param> /// <param name="stateObject">A user-provided object that distinguishes this particular asynchronous operation. Can be null if not required.</param>
/// <returns>An <see cref="IAsyncResult"/> object repesenting the asynchronous operation, which could still be pending.</returns> /// <returns>An <see cref="IAsyncResult"/> object representing the asynchronous operation, which could still be pending.</returns>
/// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation /// <remarks>This method always completes immediately even if the operation is still pending. The <see cref="IAsyncResult"/> object returned represents the operation
/// and must be passed to <see cref="EndWrite"/> to retrieve the result of the operation. For every call to this method a matching call to /// and must be passed to <see cref="EndWrite"/> to retrieve the result of the operation. For every call to this method a matching call to
/// <see cref="EndWrite"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional /// <see cref="EndWrite"/> must be made. When <paramref name="userCallback"/> specifies a callback function, this function will be called when the operation is completed. The optional
/// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/> /// <paramref name="stateObject"/> parameter can be used to pass user-defined information to this callback or the <see cref="IAsyncResult"/>. The <see cref="IAsyncResult"/>
/// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well. /// also provides an event handle (<see cref="IAsyncResult.AsyncWaitHandle" />) that will be triggered when the operation is complete as well.
/// </remarks> /// </remarks>
public IAsyncResult BeginWrite(byte[] buffer, int offset, int length, AsyncCallback userCallback, object stateObject) public IAsyncResult BeginWrite(byte[] buffer, int offset, int length, AsyncCallback userCallback, object stateObject)
@@ -327,13 +326,13 @@ namespace MadWizard.WinUSBNet
/// <summary> /// <summary>
/// Waits for a pending asynchronous write operation to complete. /// Waits for a pending asynchronous write operation to complete.
/// </summary> /// </summary>
/// <param name="asyncResult">The <see cref="IAsyncResult"/> object representing the asynchonous operation, /// <param name="asyncResult">The <see cref="IAsyncResult"/> object representing the asynchronous operation,
/// as returned by <see cref="BeginWrite"/>.</param> /// as returned by <see cref="BeginWrite"/>.</param>
/// <returns>The number of bytes transfered during the operation.</returns> /// <returns>The number of bytes transfered during the operation.</returns>
/// <remarks>Every call to <see cref="BeginWrite"/> must have a matching call to <see cref="EndWrite"/> to dispose /// <remarks>Every call to <see cref="BeginWrite"/> must have a matching call to <see cref="EndWrite"/> to dispose
/// of any resources used and to retrieve the result of the operation. When the operation was successful the method returns the number /// of any resources used and to retrieve the result of the operation. When the operation was successful the method returns the number
/// of bytes that were transfered. If an error occurred during the operation this method will throw the exceptions that would /// of bytes that were transfered. If an error occurred during the operation this method will throw the exceptions that would
/// otherwise have ocurred during the operation. If the operation is not yet finished EndWrite will wait for the /// otherwise have occurred during the operation. If the operation is not yet finished EndWrite will wait for the
/// operation to finish before returning.</remarks> /// operation to finish before returning.</remarks>
public void EndWrite(IAsyncResult asyncResult) public void EndWrite(IAsyncResult asyncResult)
{ {
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Workaround for intermittent issue
https://developercommunity.visualstudio.com/content/problem/983843/dotnet-build-task-does-not-use-nugetorg-for-one-pr.html
-->
<configuration>
<packageSources>
<clear />
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
</packageSources>
</configuration>