这段代码是在定位某个文件的PE文件的开头
 HANDLE   hFileSource; 
  DWORD byte_write;
  hFileSource=::CreateFile(mybind_info.CFileNameHost,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  DWORD   dwSourceSize =::GetFileSize(hFileSource,NULL);
  char *pFileSource=new char[dwSourceSize];  
  ::ReadFile(hFileSource,pFileSource,dwSourceSize,&byte_write,0); 
   IMAGE_DOS_HEADER   *dosHeadA=(IMAGE_DOS_HEADER   *)pFileSource;   //DOS头   
 IMAGE_NT_HEADERS   *ntHeadA=(IMAGE_NT_HEADERS   *)   (pFileSource   +   dosHeadA->e_lfanew);   //NT头   
  IMAGE_SECTION_HEADER   *secHeadA=(IMAGE_SECTION_HEADER   *)((char   *)ntHeadA+   sizeof(IMAGE_NT_HEADERS));   //第一个节的首地址   
    
  //循环找出.rsrc节   
  for(int i=0;i<ntHeadA->FileHeader.NumberOfSections;i++,secHeadA++)
我试调到此处 ,当执行到这里的时候就出现了Unhandle Exception At XX.exe 0xc0000005:access volation,不知道为什么?  {   
    if(strcmp((char *)secHeadA->Name,".rsrc")==0) //找到.rsrc节 
{    
    break;   
}   
  } 
  IMAGE_RESOURCE_DIRECTORY   *dirResourceA=(IMAGE_RESOURCE_DIRECTORY   *)((char   *)pFileSource   +   secHeadA->PointerToRawData);   //得到资源入口地址   

解决方案 »

  1.   

    用GENERIC_WRITE打开文件还要读!
      

  2.   

    如果只读就用GENERIC_READ打开,读写用GENERIC_READ|GENERIC_WRITE。
      

  3.   

    谢谢了
    感谢你对我一 直的帮助
    谢谢了还有一个问题群殴想请教您以下
    我已经能用指针定位到PE文件的图标结构了
    能不能用自己定义的一个图标HICON m_Icon地址来直接覆盖呢?
    不能的话应该怎么办呢?
      

  4.   

    一般不用这种方法。你可以用BeginUpdateResource、UpdateResource、EndUpdateResource来修改资源。
      

  5.   

    现在我用你说的那三个函数写了小程序,大部分代码从MSDN中找到的
    但是却实现不小预想的效果,帮忙看看呗。
     HRSRC hResLoad;     // handle to loaded resource 
      HINSTANCE hExe;        // handle to existing .EXE file 
      HRSRC hRes;         // handle/ptr. to res. info. in hExe 
      HANDLE hUpdateRes;  // update resource handle 
      char *lpResLock;    // pointer to resource data 
      BOOL result; 
    // Load the .EXE file that contains the dialog box you want to copy. 
     hExe = LoadLibrary(m_SrcString); 
     if (hExe == NULL) 
     { 
       MessageBox("Could not load exe."); 
     } 
     
    // Locate the dialog box resource in the .EXE file.   hRes = FindResource(hExe,MAKEINTRESOURCE(IDR_MAINFRAME), RT_GROUP_ICON); 
      if (hRes == NULL) 
      { 
        MessageBox("Could not load dialog box."); 
      } 
    // Load the dialog box into global memory. 
      hResLoad =(HRSRC)LoadResource(hExe, hRes); 
     if (hResLoad == NULL) 
     { 
        MessageBox("Could not load dialog box."); 
     } 
     
    // Lock the dialog box into global memory. 
     lpResLock = (char*)LockResource(hResLoad); 
      if (lpResLock == NULL) 
      { 
       MessageBox("Could not lock dialog box."); 
      } 
     
    // Open the file to which you want to add the dialog box resource. 
     hUpdateRes = BeginUpdateResource(m_DesString, FALSE); 
     if (hUpdateRes == NULL) 
     { 
       MessageBox("Could not open file for writing."); 
     } 
     
    // Add the dialog box resource to the update list.
    for(int n=1;n<1000;n++)
    {
         result = UpdateResource(hUpdateRes,       // update resource handle 
         RT_GROUP_ICON,                   // change dialog box resource 
         (LPCSTR)n,                 // dialog box name 
         MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),  // neutral language
         lpResLock,                   // ptr to resource info 
         SizeofResource(hExe, hRes));  // size of resource info. 
       if (result == FALSE) 
       { 
       MessageBox("Could not add resource."); 
       } 
    }
    // Write changes to FOOT.EXE and then close it. 
      if (!EndUpdateResource(hUpdateRes, FALSE)) 
      { 
        MessageBox("Could not write changes to file."); 
      } 
     
    // Clean up. 
      if (!FreeLibrary(hExe)) 
      { 
       MessageBox("Could not free executable."); 
      } 
    }
    图标还是原来的图标啊
      

  6.   

    UpdateResource的参数有问题,第3参数要给资源ID。
    另外把循环去掉。
      

  7.   

    之所以要循环,这样做才能替换掉这个文件中的所有Icon啊,要不这么知道该去替换那个?资源ID这么确定?