using System;
using System.Text .RegularExpressions ;
public class Test {
public static void Main( ) {
var text = @"
178 // Got a device. Get the details.
179 SP_DEVINFO_DATA devdata = {sizeof(SP_DEVINFO_DATA)};
180 bOk = SetupDiGetDeviceInterfaceDetail(hDevInfo,
181 &ifcData, pDetData, dwDetDataSize, NULL, &devdata);
182 if (bOk) {
183 CString strDevPath(pDetData->DevicePath);
184 // Got a path to the device. Try to get some more info.
185 TCHAR fname[256];
186 TCHAR desc[256];
187 BOOL bSuccess = SetupDiGetDeviceRegistryProperty(
188 hDevInfo, &devdata, SPDRP_FRIENDLYNAME, NULL,
189 (PBYTE)fname, sizeof(fname), NULL);
190 bSuccess = bSuccess && SetupDiGetDeviceRegistryProperty(
191 hDevInfo, &devdata, SPDRP_DEVICEDESC, NULL,
192 (PBYTE)desc, sizeof(desc), NULL);
193 BOOL bUsbDevice = FALSE;
194 TCHAR locinfo[256];
195 if (SetupDiGetDeviceRegistryProperty(
196 hDevInfo, &devdata, SPDRP_LOCATION_INFORMATION, NULL,
197 (PBYTE)locinfo, sizeof(locinfo), NULL))
198 {
199 // Just check the first three characters to determine
200 // if the port is connected to the USB bus. This isn't
201 // an infallible method; it would be better to use the
202 // BUS GUID. Currently, Windows doesn't let you query
203 // that though (SPDRP_BUSTYPEGUID seems to exist in
204 // documentation only).
205 bUsbDevice = (strncmp(locinfo, " + @"USB" + @", 3)==0);
206 }
207 if (bSuccess) {
208 // Add an entry to the array
209 SSerInfo si;
210 si.strDevPath = strDevPath;
211 si.strFriendlyName = fname;
212 si.strPortDesc = desc;
213 si.bUsbDevice = bUsbDevice;
214 asi.Add(si);
215 }
216
217 }
218 else {
219 strErr.Format(" + @"SetupDiGetDeviceInterfaceDetail failed. (err=%lx)" + @",
220 GetLastError());
221 throw strErr;
222 }
223 }
224 else {
225 DWORD err = GetLastError();
226 if (err != ERROR_NO_MORE_ITEMS) {
227 strErr.Format(" + @"SetupDiEnumDeviceInterfaces failed. (err=%lx)" + @", err);
228 throw strErr;
229 }
230 }
" ;
Console.WriteLine (
Regex.Replace (
text,
@"^[\d-]*\s*" ,
"" ,
RegexOptions.Multiline
)
) ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CgpwdWJsaWMgY2xhc3MgVGVzdCB7CnB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkgewoKdmFyIHRleHQgPSBAIgoxNzggICAgICAgICAgICAgICAgICAvLyBHb3QgYSBkZXZpY2UuIEdldCB0aGUgZGV0YWlscy4KMTc5ICAgICAgICAgICAgICAgICAgU1BfREVWSU5GT19EQVRBIGRldmRhdGEgPSB7c2l6ZW9mKFNQX0RFVklORk9fREFUQSl9OwoxODAgICAgICAgICAgICAgICAgICBiT2sgPSBTZXR1cERpR2V0RGV2aWNlSW50ZXJmYWNlRGV0YWlsKGhEZXZJbmZvLAoxODEgICAgICAgICAgICAgICAgICAgICAgJmlmY0RhdGEsIHBEZXREYXRhLCBkd0RldERhdGFTaXplLCBOVUxMLCAmZGV2ZGF0YSk7CjE4MiAgICAgICAgICAgICAgICAgIGlmIChiT2spIHsKMTgzICAgICAgICAgICAgICAgICAgICAgIENTdHJpbmcgc3RyRGV2UGF0aChwRGV0RGF0YS0+RGV2aWNlUGF0aCk7CjE4NCAgICAgICAgICAgICAgICAgICAgICAvLyBHb3QgYSBwYXRoIHRvIHRoZSBkZXZpY2UuIFRyeSB0byBnZXQgc29tZSBtb3JlIGluZm8uCjE4NSAgICAgICAgICAgICAgICAgICAgICBUQ0hBUiBmbmFtZVsyNTZdOwoxODYgICAgICAgICAgICAgICAgICAgICAgVENIQVIgZGVzY1syNTZdOwoxODcgICAgICAgICAgICAgICAgICAgICAgQk9PTCBiU3VjY2VzcyA9IFNldHVwRGlHZXREZXZpY2VSZWdpc3RyeVByb3BlcnR5KAoxODggICAgICAgICAgICAgICAgICAgICAgICAgIGhEZXZJbmZvLCAmZGV2ZGF0YSwgU1BEUlBfRlJJRU5ETFlOQU1FLCBOVUxMLAoxODkgICAgICAgICAgICAgICAgICAgICAgICAgIChQQllURSlmbmFtZSwgc2l6ZW9mKGZuYW1lKSwgTlVMTCk7CjE5MCAgICAgICAgICAgICAgICAgICAgICBiU3VjY2VzcyA9IGJTdWNjZXNzICYmIFNldHVwRGlHZXREZXZpY2VSZWdpc3RyeVByb3BlcnR5KAoxOTEgICAgICAgICAgICAgICAgICAgICAgICAgIGhEZXZJbmZvLCAmZGV2ZGF0YSwgU1BEUlBfREVWSUNFREVTQywgTlVMTCwKMTkyICAgICAgICAgICAgICAgICAgICAgICAgICAoUEJZVEUpZGVzYywgc2l6ZW9mKGRlc2MpLCBOVUxMKTsKMTkzICAgICAgICAgICAgICAgICAgICAgIEJPT0wgYlVzYkRldmljZSA9IEZBTFNFOwoxOTQgICAgICAgICAgICAgICAgICAgICAgVENIQVIgbG9jaW5mb1syNTZdOwoxOTUgICAgICAgICAgICAgICAgICAgICAgaWYgKFNldHVwRGlHZXREZXZpY2VSZWdpc3RyeVByb3BlcnR5KAoxOTYgICAgICAgICAgICAgICAgICAgICAgICAgIGhEZXZJbmZvLCAmZGV2ZGF0YSwgU1BEUlBfTE9DQVRJT05fSU5GT1JNQVRJT04sIE5VTEwsCjE5NyAgICAgICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKWxvY2luZm8sIHNpemVvZihsb2NpbmZvKSwgTlVMTCkpCjE5OCAgICAgICAgICAgICAgICAgICAgICB7CjE5OSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBjaGVjayB0aGUgZmlyc3QgdGhyZWUgY2hhcmFjdGVycyB0byBkZXRlcm1pbmUKMjAwICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcG9ydCBpcyBjb25uZWN0ZWQgdG8gdGhlIFVTQiBidXMuIFRoaXMgaXNuJ3QKMjAxICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBpbmZhbGxpYmxlIG1ldGhvZDsgaXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSB0aGUKMjAyICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCVVMgR1VJRC4gQ3VycmVudGx5LCBXaW5kb3dzIGRvZXNuJ3QgbGV0IHlvdSBxdWVyeQoyMDMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhvdWdoIChTUERSUF9CVVNUWVBFR1VJRCBzZWVtcyB0byBleGlzdCBpbgoyMDQgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50YXRpb24gb25seSkuCjIwNSAgICAgICAgICAgICAgICAgICAgICAgICAgYlVzYkRldmljZSA9IChzdHJuY21wKGxvY2luZm8sICIgKyBAIlVTQiIgKyBAIiwgMyk9PTApOwoyMDYgICAgICAgICAgICAgICAgICAgICAgfQoyMDcgICAgICAgICAgICAgICAgICAgICAgaWYgKGJTdWNjZXNzKSB7CjIwOCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGFuIGVudHJ5IHRvIHRoZSBhcnJheQoyMDkgICAgICAgICAgICAgICAgICAgICAgICAgIFNTZXJJbmZvIHNpOwoyMTAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpLnN0ckRldlBhdGggPSBzdHJEZXZQYXRoOwoyMTEgICAgICAgICAgICAgICAgICAgICAgICAgIHNpLnN0ckZyaWVuZGx5TmFtZSA9IGZuYW1lOwoyMTIgICAgICAgICAgICAgICAgICAgICAgICAgIHNpLnN0clBvcnREZXNjID0gZGVzYzsKMjEzICAgICAgICAgICAgICAgICAgICAgICAgICBzaS5iVXNiRGV2aWNlID0gYlVzYkRldmljZTsKMjE0ICAgICAgICAgICAgICAgICAgICAgICAgICBhc2kuQWRkKHNpKTsKMjE1ICAgICAgICAgICAgICAgICAgICAgIH0KMjE2ICAKMjE3ICAgICAgICAgICAgICAgICAgfQoyMTggICAgICAgICAgICAgICAgICBlbHNlIHsKMjE5ICAgICAgICAgICAgICAgICAgICAgIHN0ckVyci5Gb3JtYXQoIisgQCJTZXR1cERpR2V0RGV2aWNlSW50ZXJmYWNlRGV0YWlsIGZhaWxlZC4gKGVycj0lbHgpIisgQCIsCjIyMCAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOwoyMjEgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RyRXJyOwoyMjIgICAgICAgICAgICAgICAgICB9CjIyMyAgICAgICAgICAgICAgfQoyMjQgICAgICAgICAgICAgIGVsc2UgewoyMjUgICAgICAgICAgICAgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKMjI2ICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFUlJPUl9OT19NT1JFX0lURU1TKSB7CjIyNyAgICAgICAgICAgICAgICAgICAgICBzdHJFcnIuRm9ybWF0KCIgKyBAIlNldHVwRGlFbnVtRGV2aWNlSW50ZXJmYWNlcyBmYWlsZWQuIChlcnI9JWx4KSIgKyBAIiwgZXJyKTsKMjI4ICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ckVycjsKMjI5ICAgICAgICAgICAgICAgICAgfQoyMzAgICAgICAgICAgICAgIH0KIjsKCkNvbnNvbGUuV3JpdGVMaW5lKAogIFJlZ2V4LlJlcGxhY2UoCiAgICAgdGV4dCwKICAgICBAIl5bXGQtXSpccyoiLAogICAgICIiLAogICAgIFJlZ2V4T3B0aW9ucy5NdWx0aWxpbmUKICApCik7Cgp9Cn0=
stdout
// Got a device. Get the details.
SP_DEVINFO_DATA devdata = {sizeof(SP_DEVINFO_DATA)};
bOk = SetupDiGetDeviceInterfaceDetail(hDevInfo,
&ifcData, pDetData, dwDetDataSize, NULL, &devdata);
if (bOk) {
CString strDevPath(pDetData->DevicePath);
// Got a path to the device. Try to get some more info.
TCHAR fname[256];
TCHAR desc[256];
BOOL bSuccess = SetupDiGetDeviceRegistryProperty(
hDevInfo, &devdata, SPDRP_FRIENDLYNAME, NULL,
(PBYTE)fname, sizeof(fname), NULL);
bSuccess = bSuccess && SetupDiGetDeviceRegistryProperty(
hDevInfo, &devdata, SPDRP_DEVICEDESC, NULL,
(PBYTE)desc, sizeof(desc), NULL);
BOOL bUsbDevice = FALSE;
TCHAR locinfo[256];
if (SetupDiGetDeviceRegistryProperty(
hDevInfo, &devdata, SPDRP_LOCATION_INFORMATION, NULL,
(PBYTE)locinfo, sizeof(locinfo), NULL))
{
// Just check the first three characters to determine
// if the port is connected to the USB bus. This isn't
// an infallible method; it would be better to use the
// BUS GUID. Currently, Windows doesn't let you query
// that though (SPDRP_BUSTYPEGUID seems to exist in
// documentation only).
bUsbDevice = (strncmp(locinfo, USB, 3)==0);
}
if (bSuccess) {
// Add an entry to the array
SSerInfo si;
si.strDevPath = strDevPath;
si.strFriendlyName = fname;
si.strPortDesc = desc;
si.bUsbDevice = bUsbDevice;
asi.Add(si);
}
}
else {
strErr.Format(SetupDiGetDeviceInterfaceDetail failed. (err=%lx),
GetLastError());
throw strErr;
}
}
else {
DWORD err = GetLastError();
if (err != ERROR_NO_MORE_ITEMS) {
strErr.Format(SetupDiEnumDeviceInterfaces failed. (err=%lx), err);
throw strErr;
}
}