OK, I just now discovered something. When I run app as stand-alone it is from the IDE and it never crashes but if I run it from the EXE (I double click on the EXE file) it will crash. So, that now eliminates the Shelling since it crashes when run as an executable instead of from the IDE.

I changed Integer to Long for uMsg

I put error checking in loop, returns success on all counts.

I put blocker switch in waveInProc to disallow entry into proc like this:

Code:
Private Sub waveInProc(ByVal hwi As Long, _
                       ByVal uMsg As Integer, _
                       ByVal dwInstance As Long, _
                       ByVal dwParam1 As Long, _
                       ByVal dwParam2 As Long)

 Dim udtHdr As WAVEHDR
 
 If NoEntry = True Then Exit Sub

 Select Case uMsg
   Case MM_WIM_OPEN
    
   Case MM_WIM_DATA
     If IsBadReadPtr(ByVal dwParam1, Len(udtHdr)) = 0 Then
       CpyMem udtHdr, ByVal dwParam1, Len(udtHdr)
 
       GotData udtBuffers(udtHdr.dwUser).intBuffer, udtHdr.dwBytesRecorded
 
       ' place the buffer in the waveIn queue again
       waveInAddBuffer hWaveIn, udtBuffers(udtHdr.dwUser), Len(udtHdr)
     Else
   End If
   
   Case MM_WIM_CLOSE
 End Select
End Sub
Now it will pass through the entire StartRecord sub without crashing. Then from a button on the Form that triggers the blocker switch I click on the button which sets NoEntry = False thus allowing entry into waveInProc the app then crashes. However this just re-confirms a statement I made in my OP...
"I'd like to also point out that if I do not comment out the failing statement above but I disallow the callback proc from being entered the app will not crash."