2012-04-15 11 views
1
unsigned char* Data::getAddress(unsigned char* address) 
{ 
    strcpy((char*)address, (char*)this->_address); 
    return (unsigned char*)address; 
} 

int main() 
{ 
    Data d; 
    d.makealinkedlisthere(); 
    while (d) 
    { 
     unsigned char address[256]; 
     printf("0x%08x \r\n",d.getAddress(address)); 
     d = d.getNext(); 
    } 
    return 0; 
} 

これは最初の2つを返します(これは同じで、デバッガとは異なるはずです...)その後クラッシュします。C/C++ strcpy未処理の読み取り違反

リンクされたリストを作成するだけです。保護されたメンバーData* _next ...それらの連鎖。

unsigned char *はMEMORY_BASIC_INFORMATIONデータ構造の一部であるWindows関数VirtualQueryExの部分です。

this->_address = (unsigned char*)meminfo->BaseAddress; // casted from void* 

void *ですが、他のコードではunsigned char *に変換されています。デバッガでは、16進数で表されていることがわかります。

D1: + _address 0x7ffd5000 <Bad Ptr> unsigned char * 
D1->_next:+ _address 0x7f6f0000 "áå•ú`©" unsigned char * 
D1->_next->_next+ _address 0x7ffb0000 " " unsigned char * 
+1

makealinkedlisthere()関数のソースコードを表示してください。 – Flot2011

+0

十分な情報を提供していません。 'Data :: makealinkedlistthere'とは何ですか? –

+0

ここで何が起こっているのか把握するために、データに関する詳細情報を提供する必要があります。特に 'makealinkedlisthere'と' getNext'です。ループは非常に疑わしいと思われる。 – quamrana

答えて

2

MEMORY_BASIC_INFORMATION.Baseアドレスは、ページの領域の位置ではなく、文字列であり、それがnullで終了されるだろう何の島嶼地区などではありません。 は、MSDNのサイトから、あなたのサイズとmemcpy = 255`使用する必要があり、MEMORY_BASIC_INFORMATION structure

typedef struct _MEMORY_BASIC_INFORMATION { 
    PVOID BaseAddress; 
    PVOID AllocationBase; 
    DWORD AllocationProtect; 
    SIZE_T RegionSize; 
    DWORD State; 
    DWORD Protect; 
    DWORD Type; 
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 

は、データをコピーするには見ることができます。あなたのコードに戻ってみると

は、RegionSizeを保存するのが安全だろうとの境界チェックを行うために

も注意してください動作するはず

PVOID Data::getAddress(PVOID address,size) {  
    memcpy((address, (void *)this->_address, size); 
    address[size]=NULL; 
    return address; 
} 
int main() { 
    Data d; 
    d.makealinkedlisthere(); 
    while (d) { 
     unsigned char address[256]; 
     printf("Address: 0x%08x \n",d.getAddress((PVOID)address),sizeof(address)); 
     printf("Data: %s\n",(LPSTR)d.getAddress((PVOID)address),sizeof(address)); 
     d = d.getNext(); 
    } 
    return 0; 
} 

にそれを変える、他の問題はありません提供しましたmemcpyの前。

+0

OPは、MEMORY_BASIC_INFORMATION構造体全体ではなく、実際にはBaseAddressのみを使用します。したがって、 '_address'はPVOIDでなければならず、簡単な割り当てでコピーすることができます。 –

+0

@MrLister:私はそれを見落とした。私は私の答えを更新しました – Abhijit

関連する問題