2014-10-19 3 views
1

꽤 이상한 문제가 있습니다.파일에 파일 이름을 쓰는 WriteFile

Xbox 360의 Winsock 기능에 연결합니다. 보내십시오. 이 함수는 HTTP 요청 정보를 덤프하려고하는 응용 프로그램에서 a-lot이라고합니다.

는 우선 코드를 표시하고 내 문제를 설명합니다 :

WritetoFile 기능을.

BOOL WritetoFile(char* filename, char* buffer, DWORD len) 
{ 

// Setup expansion 
doMountPath("Hdd:", "\\Device\\Harddisk0\\Partition1");  

//print 
printf("Creating %s\n", filename); 

//create our file 
HANDLE fileHandle = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); 

//does file exist? 
if(fileHandle!=INVALID_HANDLE_VALUE) 
{ 
    //print 
    printf("Writing to file... \n"); 

    //bytes written parameter 
    DWORD wfbr; 

    //write to our file 
    if(WriteFile(fileHandle, (void*)&buffer, len, &wfbr, NULL)) 
    { 
     printf("File written! (Bytes Written:%u) \n", wfbr); 
    } else { 
     printf("Error writing to file: (Error:%u)\n", GetLastError()); 
    } 

    //close our file handle 
    CloseHandle(fileHandle); 
    } else { 
     printf("Error creating file: (Error:%u)\n", GetLastError()); 
} 

return true; 
} 

Winsock을 후크

INT WINSOCK_SEND_HOOK(SOCKET s,const char FAR *buf,int len,int flags) 
{ 
memcpy(SocketData.SendData, buf, len); 

if(len>40) 
{ 
    WINSOCK_SEND_COUNT +=1; 

    char Filename[40]; 
    sprintf(Filename, "Hdd:\\Dump\\Send\\Winsock_Send_%d.txt", WINSOCK_SEND_COUNT); 
    WritetoFile(Filename, SocketData.SendData, len); 


} else { printf("Winsock skipped\n"); } 
memset(SocketData.SendData, 0, 0x1388); 

return send(s, buf, len, flags); 
} 

문제는 설명하기가 매우 어렵다. 그래서 처음으로 .dll을이 함수에 연결하기 위해 'Winsock_Send_85.txt'를 만들 때까지 잘 작동했습니다. 다음을 인쇄합니다.

`Creating b0ZEK0EwSDBwSXR2RW5EdXd5ZXFnN1IrLzFQYno4RmN0ZnI2MnNnWWQwb2JXMGlYbEdQRkxGOXFkdHJabiszb1I2MG1vUFlkSjBJVW0xcFB4UzZxWEtqZEVYSjEvQmJtOHhmMUdVMDlZaHA2SUtWZTJjb0ZVU1RsUTlvYXJhc0NDOHJNUitlUDBaQmVSOTNUWVM1TU1hLzB0NlhGZmQ2dE1CVDRKVTRxdzliRUtlRmVvVGgvaVdoMUFBczBpNzhkcXNlVUYwaTlQT3B5ekdyeU9ZTzU0QWYyVXpUSXZiTDMzRWl4SXhzOUJOZDZxaWtDQUlNQmZkNHRYVTNaS2pKZngxRmd3dXE2QnRIYmkySlgxcE9vUjFyVlRpci9iZHdTZTZEOTJDSXFqNkNqM0lSaDY1N3VKUzhOQ3VxaFZpclhTUnZMZlJCN21mTS9aV2dCRUJNWHBVeUdZcGxqOVNGUÿÿexception code=0xc0000005 thread=0xf9000044 address=0x910d0a00 read=0x910d0a00 firstxbWatson: Xbox is restarting` 

그리고 충돌합니다. 콘솔을 다시 시작한 후 다시 실행하면 정상적으로 작동하고 크래시는 발생하지 않지만 버퍼가 다른 데이터를 가리키고 있어도 동일한 반복적 인 데이터 인 파일에 잘못된 데이터를 쓰고 있습니다. 이것은 파일에 기록 무엇인가 : 다음 모든 전원에서 완전히 콘솔을 분리하는 것이었다 그러나 다음 다시 첫 번째 문제에가는 일이 발생을 막을 수있는 방법을 발견

‘ÀÛ(  W    
ÿÿÿÿÿÿÿÿ  ÿÿÿÿ‘Á Hdd:\Dump\Send\Winsock_Send_87.txt  ‚i夀…Ü     H> 

.

memcpy를 불필요하게 사용한다고 생각하는 것을 무시하십시오.

답변

0

문제는 꽤 빨리 (당혹 스러울 정도로) 해결되었고 나는 1 시간 동안 바보 같은 실수를 저질렀다고 믿습니다.

버퍼의 크기를 확인하지 않아서 충분한 메모리를 할당하지 못했습니다.

관련 문제