Your code is essentially correct but what you haven't done is to read the type of data stored in each name-value pair so that the correct cast can be applied.
The raw data obtained from GetValue(valueName) is typed as Object and the ToString() conversion gives a correct representation in most cases, the exceptions being when the actual type is an array (REG_BINARY, REG_MULTI_SZ)
The technique is read the type via GetValueKind(valueName) and then apply a cast to the Object returned from GetValue(valueName). The incomplete method below shows the basics and in your case formatting the values ready for display should be done in the gaps left as "do something appropriate".
PrivateSub InterpretValue(rawValue asObject, interpretAsType as RegistryValueKind)
' REG_BINARYDim byteArray AsByte() = DirectCast(rawValue, Byte())
' Do something appropriateExitSelectCase RegistryValueKind.DWord
' REG_DWORDDim signedValue32 AsInteger = DirectCast(rawValue, Integer)
' Do something appropriateExitSelectCase RegistryValueKind.QWord
' REG_QWORDDim signedValue64 AsLong = DirectCast(rawValue, Long)
' Do something appropriateExitSelectCase RegistryValueKind.Unknown, RegistryValueKind.String, RegistryValueKind.ExpandString
Dim stringValue asString = rawValue.ToString()
' Do something appropriateExitSelectCase RegistryValueKind.MultiString
' REG_MULTI_SZDim stringArray AsString() = TryCast(rawValue, String())
' Do something appropriateExitSelectEndSelectEndSub
Thanks for the explanations. I understand that I should be considering the data type. I can change my code accordingly. But what about the "Last Write Time" information that is displayed in the exported text data for these keys? How can I access that? My goal is to capture the History of each USB device that was used in the system, with dates and times. I'm assuming that the Last Write Time on the exported text will give me this information, but I don't see how my code, even with the data type considerations, will access that.
The .NET RegistryKey exposes a small subset of the full Windows Registry API and to get the LastWriteTime requires the Windows RegQueryInfoKey function. Microsoft made this really difficult prior to .NET 4, as the RegistryKey class did not expose the operating system registry key handle.
With the restriction of .NET 4 it should be a simple matter of using P/Invoke to call RegQueryInfoKey with the twelve parameters set correctly! I haven't done this but most of them are optional, so can probably be set to null or IntPtr.Zero.
If you have to work on a lower (lesser?) version of .NET then I don't think this will be an easy task as there is no facility to exchange handles between the .NET RegistryKey class and the native Windows functions. I think the only option would be using RegOpenKeyEx to get the handle and then call RegQueryInfoKey.