Upgraded my motherboard recently. With Windows, it's always a gamble. In recent versions, it often just works - Windows boots, some hardware doesn't work but once you install all the OEM drivers, it does.
In my case, not so much. After the hardware swap, Windows booted straight into the blue screen of death. Here's what helped: I booted into recovery mode, downloaded all OEM drivers on a different machine, copied them to a thumb drive, and ran the following command on the recovery console's command line:
dism /image:c:\ /add-driver /Driver:X:\ /recurse
Where C: is the Windows drive, and X: was the thumb drive. And voilĂ , Windows booted up on the next attempt.
Helpful idea found here. Spreading the knowledge because it deserves to be spread.
Saturday, September 27, 2014
Thursday, June 19, 2014
Base64 encoding in VBA
UPDATE: it's now a Gist.
Today's useful snippet: Base64 encoding in VBA (not VB.NET; the latter has a builtin API for that).
Encodes an array of bytes into a string. Doesn't make any assumptions about the bounds of the source array. Processes the entire array; can be trivially modified to deal with a array slice.
Public Function ToBase64(Src() As Byte) As String
Const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim SrcLen As Long, i As Long, Remainder As Long
Dim RLen As Long, Triad As Long, LastSrcIndex As Long
SrcLen = UBound(Src) - LBound(Src) + 1
Remainder = SrcLen Mod 3
'Index of the first byte of the leftover 1- or 2-byte chunk
RLen = LBound(Src) + SrcLen - Remainder
LastSrcIndex = RLen - 3
ToBase64 = ""
'The 3 byte chunks of the block
For i = LBound(Src) To LastSrcIndex Step 3
Triad = (CLng(Src(i)) * &H10000) Or _
(CLng(Src(i + 1)) * &H100) Or Src(i + 2)
ToBase64 = ToBase64 & _
Mid(ALPHABET, ((Triad \ &H40000) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Triad \ &H1000) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Triad \ &H40) And &H3F) + 1, 1) & _
Mid(ALPHABET, (Triad And &H3F) + 1, 1)
Next
'The remainder, if any
If Remainder = 1 Then
ToBase64 = ToBase64 & _
Mid(ALPHABET, ((Src(RLen) \ 4) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Src(RLen) * &H10) And &H3F) + 1, 1) & "=="
ElseIf Remainder = 2 Then
Triad = (CLng(Src(RLen)) * &H100) Or Src(RLen + 1)
ToBase64 = ToBase64 & _
Mid(ALPHABET, ((Triad \ &H400) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Triad \ &H10) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Triad * 4) And &H3F) + 1, 1) & "="
End If
End Function
A useful variation would use a preallocated buffer for the encoded chunk, with assignment to Mid() instead of concatenation. When encoding large pieces (>100KB), it makes sense to save on string allocation and copying.
The formula for the length of a Base64-encoded string is: ((SourceLength + 2) \ 3) * 4.
Today's useful snippet: Base64 encoding in VBA (not VB.NET; the latter has a builtin API for that).
Encodes an array of bytes into a string. Doesn't make any assumptions about the bounds of the source array. Processes the entire array; can be trivially modified to deal with a array slice.
Public Function ToBase64(Src() As Byte) As String
Const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim SrcLen As Long, i As Long, Remainder As Long
Dim RLen As Long, Triad As Long, LastSrcIndex As Long
SrcLen = UBound(Src) - LBound(Src) + 1
Remainder = SrcLen Mod 3
'Index of the first byte of the leftover 1- or 2-byte chunk
RLen = LBound(Src) + SrcLen - Remainder
LastSrcIndex = RLen - 3
ToBase64 = ""
'The 3 byte chunks of the block
For i = LBound(Src) To LastSrcIndex Step 3
Triad = (CLng(Src(i)) * &H10000) Or _
(CLng(Src(i + 1)) * &H100) Or Src(i + 2)
ToBase64 = ToBase64 & _
Mid(ALPHABET, ((Triad \ &H40000) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Triad \ &H1000) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Triad \ &H40) And &H3F) + 1, 1) & _
Mid(ALPHABET, (Triad And &H3F) + 1, 1)
Next
'The remainder, if any
If Remainder = 1 Then
ToBase64 = ToBase64 & _
Mid(ALPHABET, ((Src(RLen) \ 4) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Src(RLen) * &H10) And &H3F) + 1, 1) & "=="
ElseIf Remainder = 2 Then
Triad = (CLng(Src(RLen)) * &H100) Or Src(RLen + 1)
ToBase64 = ToBase64 & _
Mid(ALPHABET, ((Triad \ &H400) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Triad \ &H10) And &H3F) + 1, 1) & _
Mid(ALPHABET, ((Triad * 4) And &H3F) + 1, 1) & "="
End If
End Function
A useful variation would use a preallocated buffer for the encoded chunk, with assignment to Mid() instead of concatenation. When encoding large pieces (>100KB), it makes sense to save on string allocation and copying.
The formula for the length of a Base64-encoded string is: ((SourceLength + 2) \ 3) * 4.
Friday, June 6, 2014
CryptoAPI issue I've found
Continuing with the crypto theme, this is a story about an issue in Microsoft CryptoAPI that I've discovered a few years ago. It was originally posted at an MSDN forum, but I thought I'd rather republish it here. I've used some pretty deep magic to get to this result.
Thursday, June 5, 2014
OpenSSL vs. the Microsoft crypto stack
UPDATE: the same with PowerShell.
I'd like to publish a Microsoft Word VBA macro for my co-workers. I would also like to have it digitally signed, so that Word doesn't complain about scary insecure macros.
I'd like to publish a Microsoft Word VBA macro for my co-workers. I would also like to have it digitally signed, so that Word doesn't complain about scary insecure macros.
Thursday, May 1, 2014
Yet another reverse proxy
The general idea of reverse proxy is quite simple. Sometimes, one wants to designate a portion of a website to return a copy of another website.
Monday, April 28, 2014
Hash of a hash of a hash
Problem: there are two MySQL databases on two different websites that should be mostly identical, except for maybe a few tables. I would like to figure out quickly which tables don't match so that I can run a manual sync.
Monday, April 14, 2014
Reverse proxy needed
HTTP reverse proxies are a Useful Thing. Sometimes it's for exposing an endpoint from behind a firewall that you don't control, sometimes it's for moving a service from one public URL to another while not leaving legacy consumers in the dark.
Tuesday, April 1, 2014
Splitting GIF into frames on Android via giflib
PREAMBLE: the app where this technique originated is no longer using it. I've integrated GifFileDecoder by Google and never looked back. Had to patch it somewhat, though - my GIFs are small, makes more sense to read them into memory rather than display progressively.
UPDATE: it's now a Gist.
This is a followup to my answer at StackOverflow regarding animated GIFs on Android. Folks want code - I've got some. The general idea is - use giflib to get RGB(A) pixel data for each frame in a format that's compatible with Android's, feed the pixels to bitmaps, display the bitmaps.
UPDATE: it's now a Gist.
This is a followup to my answer at StackOverflow regarding animated GIFs on Android. Folks want code - I've got some. The general idea is - use giflib to get RGB(A) pixel data for each frame in a format that's compatible with Android's, feed the pixels to bitmaps, display the bitmaps.
Thursday, March 27, 2014
Inflating a bicycle tire with a potato
The inimitable Raymond Chen of Old New Thing fame once wrote a blog post about using inappropriate tools for the job. It came to my mind the other day when I needed to do a timestamp-based conditional in a batch file. The underlying cause was rather vanilla - file H is generated from file X, so if file X was modified later than H was, the batch needs to rebuild H.
Wednesday, March 26, 2014
SEH for fun and profit
PREAMBLE: this technique is no longer necessary. As of Visual Studio 2015 Update 2, one can mix C++ exceptions with SEH.
The built-in crash reporting of Windows Phone 8 sucks. It doesn't report registers, stack, what modules were loaded at crash time... Definitely not something you can debug from.
The built-in crash reporting of Windows Phone 8 sucks. It doesn't report registers, stack, what modules were loaded at crash time... Definitely not something you can debug from.
Subscribe to:
Posts (Atom)