HANDLE _CreateDirectoryAndFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpsa, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { HANDLE hFile = ::CreateFile( lpFileName, dwDesiredAccess, dwShareMode, lpsa, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); if( hFile == INVALID_HANDLE_VALUE ){ const TCHAR* p = _tcsrchr(lpFileName, _T('\\')); if( p != NULL ){ vector<TCHAR> dirPath(lpFileName, p + 1); dirPath.back() = _T('\0'); _CreateDirectory(&dirPath.front()); hFile = ::CreateFile( lpFileName, dwDesiredAccess, dwShareMode, lpsa, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); } } return hFile; }
HANDLE _CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { SECURITY_DESCRIPTOR sd; SECURITY_ATTRIBUTES sa; memset(&sd,0,sizeof(sd)); InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); memset(&sa,0,sizeof(sa)); sa.nLength=sizeof(sa); sa.lpSecurityDescriptor=&sd; /* PACL pDacl; EXPLICIT_ACCESS explicitAccess[3]; SECURITY_ATTRIBUTES sa; SECURITY_DESCRIPTOR sd; InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); BuildExplicitAccessWithName(&explicitAccess[0], TEXT("SYSTEM"), FILE_ALL_ACCESS, GRANT_ACCESS, 0); BuildExplicitAccessWithName(&explicitAccess[1], TEXT("Administrators"), FILE_ALL_ACCESS, GRANT_ACCESS, 0); BuildExplicitAccessWithName(&explicitAccess[2], TEXT("Everyone"), FILE_ALL_ACCESS, GRANT_ACCESS, 0); SetEntriesInAcl(3, explicitAccess, NULL, &pDacl); SetSecurityDescriptorDacl(&sd, TRUE, pDacl, FALSE); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = &sd; sa.bInheritHandle = FALSE; */ HANDLE hFile = ::CreateFile( lpFileName, dwDesiredAccess, dwShareMode, &sa, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); if( hFile == INVALID_HANDLE_VALUE ){ TCHAR* p = (TCHAR*)_tcsrchr(lpFileName, '\\'); TCHAR* szDirPath = NULL; if( p != NULL ){ int iSize = (int)(p - lpFileName); szDirPath = new TCHAR[iSize+1]; _tcsncpy_s(szDirPath, iSize+1, lpFileName, iSize); } if( szDirPath != NULL ){ _CreateDirectory(szDirPath); delete[] szDirPath; hFile = ::CreateFile( lpFileName, dwDesiredAccess, dwShareMode, &sa, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); } } return hFile; }
HANDLE _CreateFile2( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { HANDLE hFile = ::CreateFile( lpFileName, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); if( hFile == INVALID_HANDLE_VALUE ){ TCHAR* p = (TCHAR*)_tcsrchr(lpFileName, '\\'); TCHAR* szDirPath = NULL; if( p != NULL ){ int iSize = (int)(p - lpFileName); szDirPath = new TCHAR[iSize+1]; _tcsncpy_s(szDirPath, iSize+1, lpFileName, iSize); } if( szDirPath != NULL ){ _CreateDirectory(szDirPath); delete[] szDirPath; hFile = ::CreateFile( lpFileName, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); } } return hFile; }
void CSetDlgBasic::SaveIni() { UpdateData(TRUE); WritePrivateProfileString(L"SET", L"DataSavePath", settingFolderPath.GetBuffer(0), commonIniPath); _CreateDirectory(settingFolderPath); int iNum = recFolderList.GetCount(); CString strVal; strVal.Format( L"%d", iNum ); WritePrivateProfileString(L"SET", L"RecFolderNum", strVal.GetBuffer(0), commonIniPath); for( int i = 0; i < iNum; i++ ){ CString strKey = L""; strKey.Format(L"RecFolderPath%d", i ); CString strFolder = L""; recFolderList.GetText( i, strFolder ); WritePrivateProfileString(L"SET", strKey, strFolder, commonIniPath); } UpdateData(FALSE); }
//Implementation of DeviceCtrl routine. static DWORD FatDeviceCtrl(__COMMON_OBJECT* lpDrv,__COMMON_OBJECT* lpDev, __DRCB* lpDrcb) { __COMMON_OBJECT* pFindHandle = NULL; if((NULL == lpDev) || (NULL == lpDrcb)) //Invalid parameters. { goto __TERMINAL; } //Dispatch the request to appropriate routines according to control command. switch(lpDrcb->dwCtrlCommand) { case IOCONTROL_FS_CHECKPARTITION: return CheckPartition(lpDev,(__COMMON_OBJECT*)lpDrcb->lpInputBuffer) ? 1 : 0; case IOCONTROL_FS_FINDFIRSTFILE: pFindHandle = _fat32FindFirstFile((__COMMON_OBJECT*)lpDev, (CHAR*)lpDrcb->dwExtraParam1, (FS_FIND_DATA*)lpDrcb->dwExtraParam2); if(NULL == pFindHandle) //Can not start the iterate. { return 0; } lpDrcb->lpOutputBuffer = (LPVOID)pFindHandle; return 1; case IOCONTROL_FS_FINDNEXTFILE: return _FindNextFile((__COMMON_OBJECT*)lpDev, (__COMMON_OBJECT*)lpDrcb->lpInputBuffer, (FS_FIND_DATA*)lpDrcb->dwExtraParam2) ? 1 : 0; case IOCONTROL_FS_FINDCLOSE: _fat32FindClose((__COMMON_OBJECT*)lpDev, (__COMMON_OBJECT*)lpDrcb->lpInputBuffer); break; case IOCONTROL_FS_CREATEDIR: if(_CreateDirectory(lpDev, (LPSTR)lpDrcb->lpInputBuffer, 0)) { lpDrcb->dwStatus = DRCB_STATUS_SUCCESS; return 1; } else { lpDrcb->dwStatus = DRCB_STATUS_FAIL; return 0; } break; case IOCONTROL_FS_GETFILEATTR: lpDrcb->dwExtraParam2 = _fat32GetFileAttributes( lpDev, (LPCTSTR)lpDrcb->dwExtraParam1); lpDrcb->dwStatus = DRCB_STATUS_SUCCESS; return 1; break; case IOCONTROL_FS_DELETEFILE: if(_fat32DeleteFile(lpDev, (LPSTR)lpDrcb->lpInputBuffer)) { lpDrcb->dwStatus = DRCB_STATUS_SUCCESS; return 1; } else { lpDrcb->dwStatus = DRCB_STATUS_FAIL; return 0; } break; case IOCONTROL_FS_REMOVEDIR: if(_RemoveDirectory(lpDev, (LPSTR)lpDrcb->lpInputBuffer)) { lpDrcb->dwStatus = DRCB_STATUS_SUCCESS; return 1; } else { lpDrcb->dwStatus = DRCB_STATUS_FAIL; return 0; } break; case IOCONTROL_FS_SETENDFILE: { if(_SetEndOfFile(lpDev)) { lpDrcb->dwStatus = DRCB_STATUS_SUCCESS; return 1; } else { lpDrcb->dwStatus = DRCB_STATUS_FAIL; return 0; } } break; default: break; } __TERMINAL: return 0; }