Fehler in NTDLL.dll

3Cyb3r

Erfahrenes Mitglied
Unbehandelte Ausnahme in send.exe (NTDLL.dll) 0xC0000005: Acces Violation

Code:
#include "../winudp_common.h"
#include "winudp_send.h"

#define WIN32_LEAN_AND_MEAN 

HWND hWindow;                       // Window Handle

// Netzwerk Ausgabe
struct sockaddr_in remote;                    // UDP Empfaenger IPv4 Adress und Port Struktur
volatile SOCKET remotefd = INVALID_SOCKET;    // UDP Empfaenger Filedeskriptor
CRITICAL_SECTION remotefd_sem;

// Audio Eingabe (Empfang vom Mikrofon)
HWAVEIN hWaveIn;
WAVEHDR WaveHdrIn[AUDIOBUFS];
BYTE BufferIn[AUDIOBUFS][BUFSIZE];

DWORD WINAPI WaveInThread (void *Arg)
{
  MSG Msg;
  int rv;

  rv = SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
  winexit_if(0 == rv, hWindow, "SetThreadPriority failed");

  while (GetMessage (&Msg, NULL, 0, 0) == TRUE) {
    if (MM_WIM_DATA == Msg.message) {
      int rv = 0;
      WAVEHDR *Hdr = (WAVEHDR *) Msg.lParam;

      EnterCriticalSection(&remotefd_sem);
      if (remotefd != INVALID_SOCKET) {
        rv = sendto(remotefd, Hdr->lpData, sizeof(BufferIn[0]), 0, 
                             (struct sockaddr *) &remote, sizeof(remote));
        if (rv < 0) {
          closesocket(remotefd);
          remotefd = INVALID_SOCKET;
        }
      }
      LeaveCriticalSection(&remotefd_sem);
      waveInAddBuffer(hWaveIn, Hdr, sizeof(*Hdr));
      if (rv < 0) MessageBox(hWindow, "sendto failed", "WARNING", MB_OK);
    }
  }
  return 0; 
}

BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{
  switch (msg) {
    case WM_INITDIALOG: {      
      WSADATA wsaData;
      int rv;
      int i;
      WAVEFORMATEX waveform;
      HANDLE WaveInThreadHandle;
      DWORD WaveInThreadId;
      
      hWindow = hWnd;

      // Init Netzwerk
      rv = WSAStartup(MAKEWORD(2, 2), &wsaData);
      winexit_if(rv != 0, hWnd, "WSAStartup failed");

      // Init Audio
      waveform.nChannels = AUDIOCHANNELS;
      waveform.wBitsPerSample = 8;
      waveform.nAvgBytesPerSec = AUDIOSPEED * waveform.nChannels * waveform.wBitsPerSample / 8;
      waveform.wFormatTag = AUDIOFORMAT;
      waveform.nSamplesPerSec = AUDIOSPEED;
      waveform.nBlockAlign = 1;
      waveform.cbSize = 0;

      WaveInThreadHandle = CreateThread(NULL, 0, WaveInThread, NULL, 0, &WaveInThreadId);
      winexit_if(NULL == WaveInThreadHandle, hWnd, "CreateThread failed");

      rv = waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform, (DWORD)WaveInThreadId,0,CALLBACK_THREAD);
      winexit_if(rv != MMSYSERR_NOERROR, hWnd, "waveInOpen failed");

      for (i = 0; i < AUDIOBUFS; ++i) {
        WaveHdrIn[i].lpData = BufferIn[i];
        WaveHdrIn[i].dwBufferLength = sizeof(BufferIn[0]);
        WaveHdrIn[i].dwBytesRecorded = 0;
        WaveHdrIn[i].dwUser = 0;
        WaveHdrIn[i].dwFlags = 0;
        WaveHdrIn[i].dwLoops = 0;
        WaveHdrIn[i].lpNext = NULL;
        WaveHdrIn[i].reserved = 0;
        waveInPrepareHeader(hWaveIn, WaveHdrIn + i, sizeof(WaveHdrIn[0]));
        waveInAddBuffer(hWaveIn, WaveHdrIn + i, sizeof(WaveHdrIn[0]));
      }

      waveInStart(hWaveIn);   // starte Aufnahme
      break;
    }

    case WM_COMMAND: {
      if (ID_CONNECT == wParam) {
        struct hostent *he;
        int rv;
        char yes = '1';
        char nodename[128];
        SOCKET fd;

        EnterCriticalSection(&remotefd_sem);
        if (remotefd != INVALID_SOCKET) {
          closesocket(remotefd);
          remotefd = INVALID_SOCKET;  // remotefd auf nicht-initialisiert setzen
        }
        LeaveCriticalSection(&remotefd_sem);

        // Hole den Nodename aus dem Edit Dialog
        rv = GetDlgItemText(hWnd, ID_NODENAME, nodename, sizeof(nodename));

        he = gethostbyname(nodename);  // hole UDP Empfaenger IPv4 Adresse
        winreturn_if(NULL == he, hWnd, "gethostbyname failed");

        fd = socket(AF_INET, SOCK_DGRAM, 0); // Socket Filedeskriptor anlegen
        winreturn_if(fd < 0, hWnd, "socket failed");

        // UDP Broadcast erlauben
        rv = setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
        winreturn_if(rv < 0, hWnd, "setsockopt failed");

        memset(&remote, 0, sizeof(remote)); // remote mit 0 fuellen
        remote.sin_family = AF_INET;
        remote.sin_port = htons(BABYPHONE_PORT);
        remote.sin_addr = *((struct in_addr *) he->h_addr);

        remotefd = fd;  // Ohne EnterCritical.. - einfache Zuweisung ist atomar
      }

      if (IDCANCEL == wParam) {
        EndDialog(hWnd, 0);
      }
      break;
    }
  }
  return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ 
	return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
}



Code:
#include <winsock2.h>
#include <windows.h>
#include <commctrl.h>
#include <mmsystem.h>
#include <mmreg.h>
#include <stdio.h>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib, "comctl32.lib")

#define BABYPHONE_PORT 26002      // Der Babyphone well known Port

#define BUFSIZE       512        // Groesse Soundcard Buffer in Samples

#define AUDIOBUFS     3           // Anzahl Soundcard Buffer, Minimum ist 2
#define AUDIOFORMAT   WAVE_FORMAT_MULAW // Audio Codec G.711 u-Law
#define AUDIOSPEED    16000       // Abtastfrequenz
#define AUDIOCHANNELS 1           // 1 ist Mono, 2 ist Stereo

#define winreturn_if(expr, hWnd, str) \
if(expr) { \
  MessageBox(hWnd, str, "WARNING", MB_OK); \
  return 0; \
}

#define winexit_if(expr, hWnd, str) \
if(expr) { \
  MessageBox(hWnd, str, "FAILURE", MB_OK); \
  EndDialog(hWnd, 0); \
  return 0; \
}

und

Code:
// winudp_send.rc
//
#include "windows.h"
#include "winver.h"
#include "winudp_send.h"

IDD_DIALOG1 DIALOGEX DISCARDABLE  10, 150, 200, 100
STYLE WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | 
    WS_THICKFRAME
CAPTION "winudp_send"
FONT 8, "Lucida Console"
BEGIN
    LTEXT           "Nodename:", 1000,    10, 10, 100, 15
    EDITTEXT        ID_NODENAME,          10, 30, 100, 15
    DEFPUSHBUTTON   "Connect",ID_CONNECT, 10, 50, 35,  15, BS_CENTER | BS_VCENTER
END

kann das mal jemand bei sich compilieren? ob das bei ihm geht
Ich hab das gefüh ich brauch ein neuen Kompiler

Code:
7C928FEA   inc         dword ptr [eax+10h]
hier ist angeblich der fehler
 
Zuletzt bearbeitet:
Kann sich denn niemand mal die Mühe machen 3 Dateien erstellen reinhauen und Compilieren und mir dann sagen ob es bei ihm ging?
 
Hi.

Erstmal fehlt noch die winudp_common.h wo vermutlich ID_CONNECT etc. definiert sind...

Naja, hab's ausprobiert. Es geht nicht. (Visual Studio 2008)

Fehler den ich beim drüberkucken gefunden hab: GetMessage gibt einen BOOL mit 3 möglichen Werten zurück. Siehe MSDN.

Außerdem hast du anscheinend die CRITICAL_SECTION nicht initialisiert.

Gruß
 
das prob leigt hier irgendwo

Code:
      for (i = 0; i < AUDIOBUFS; ++i) {
        WaveHdrIn[i].lpData = BufferIn[i];
        WaveHdrIn[i].dwBufferLength = sizeof(BufferIn[0]);
        WaveHdrIn[i].dwBytesRecorded = 0;
        WaveHdrIn[i].dwUser = 0;
        WaveHdrIn[i].dwFlags = 0;
        WaveHdrIn[i].dwLoops = 0;
        WaveHdrIn[i].lpNext = NULL;
        WaveHdrIn[i].reserved = 0;

        waveInPrepareHeader(hWaveIn, WaveHdrIn + i, sizeof(WaveHdrIn[0]));
        waveInAddBuffer(hWaveIn, WaveHdrIn + i, sizeof(WaveHdrIn[0]));
      }

      waveInStart(hWaveIn);   // starte Aufnahme

denn bei waveInStart kackt das Prog ab mit dem Speicherfehler
 
Außerdem hast du anscheinend die CRITICAL_SECTION nicht initialisiert.
ich bekomme es nicht hin kannst du mir auf diese bitte hin vielleicht den Code schreiben währe sehr nett.
 
Du mußt eine CRITICAL_SECTION mit der InitializeCriticalSection Funktion initialisieren bevor du EnterCriticalSection aufrufen kannst.

Gruß
 
hab ich
Code:
CRITICAL_SECTION remotefd_sem;
das mit boll ist auch gefixt


Code:
#define IDD_DIALOG1                     101
#define ID_NODENAME                     1001
#define ID_CONNECT                      1002
hab ich slebst definiert hatte doch eine datei mehr als angegeben sry.
der Speicherfehler liegt in der for-schleife, aber ichshe meinen fehler nicht.

Code:
InitializeCriticalSection(&remotefd_sem);
DeleteCriticalSection(&remotefd_sem);
Du hattest wieder einmal recht Danke a lot.
Deepthroat du bist der beste

ok ich wollte das nun in einem anderen Projekt verwenden und es funktioniert nicht.
Code:
error C2440: '=' : 'unsigned char [512]' kann nicht in 'char *' konvertiert werden
        Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

Code:
			WaveHdrIn[i].lpData = BufferIn[i];

Code:
WAVEHDR WaveHdrIn[AUDIOBUFS];
BYTE BufferIn[AUDIOBUFS][BUFSIZE];
 
Ich bekomm es nicht hin.
Habe schon probiert

Code:
BYTE BufferIn[AUDIOBUFS][BUFSIZE];
WAVEHDR WaveHdrIn[AUDIOBUFS];
memcpy(WaveHdrIn[i].lpData,BufferIn[i],sizeof(BufferIn[i]));
etc. wie mach ich das mit der Länge?
 
Zuletzt bearbeitet:
Zurück