Changeset 2851 for trunk/src/lib/nt/ntstat.c
- Timestamp:
- Aug 31, 2016, 7:30:52 PM (9 years ago)
- Location:
- trunk/src/lib
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib
- Property svn:externals set to
-
trunk/src/lib/nt/ntstat.c
r2850 r2851 190 190 * @param pBuf The MY_FILE_ID_FULL_DIR_INFORMATION entry. 191 191 * @param pszPath Optionally, the path for X bit checks. 192 * @remarks Caller sets st_dev. 192 193 */ 193 194 void birdStatFillFromFileIdFullDirInfo(BirdStat_T *pStat, MY_FILE_ID_FULL_DIR_INFORMATION const *pBuf, const char *pszPath) … … 216 217 217 218 219 /** 220 * Fills in a stat structure from an MY_FILE_ID_BOTH_DIR_INFORMATION entry. 221 * 222 * @param pStat The stat structure. 223 * @param pBuf The MY_FILE_ID_BOTH_DIR_INFORMATION entry. 224 * @param pszPath Optionally, the path for X bit checks. 225 * @remarks Caller sets st_dev. 226 */ 227 void birdStatFillFromFileIdBothDirInfo(BirdStat_T *pStat, MY_FILE_ID_BOTH_DIR_INFORMATION const *pBuf, const char *pszPath) 228 { 229 pStat->st_mode = birdFileInfoToMode(INVALID_HANDLE_VALUE, pBuf->FileAttributes, pszPath, 230 NULL, &pStat->st_dirsymlink); 231 pStat->st_padding0[0] = 0; 232 pStat->st_padding0[1] = 0; 233 pStat->st_size = pBuf->EndOfFile.QuadPart; 234 birdNtTimeToTimeSpec(pBuf->CreationTime.QuadPart, &pStat->st_birthtim); 235 birdNtTimeToTimeSpec(pBuf->ChangeTime.QuadPart, &pStat->st_ctim); 236 birdNtTimeToTimeSpec(pBuf->LastWriteTime.QuadPart, &pStat->st_mtim); 237 birdNtTimeToTimeSpec(pBuf->LastAccessTime.QuadPart, &pStat->st_atim); 238 pStat->st_ino = pBuf->FileId.QuadPart; 239 pStat->st_nlink = 1; 240 pStat->st_rdev = 0; 241 pStat->st_uid = 0; 242 pStat->st_gid = 0; 243 pStat->st_padding1[0] = 0; 244 pStat->st_padding1[1] = 0; 245 pStat->st_padding1[2] = 0; 246 pStat->st_blksize = 65536; 247 pStat->st_blocks = (pBuf->AllocationSize.QuadPart + BIRD_STAT_BLOCK_SIZE - 1) 248 / BIRD_STAT_BLOCK_SIZE; 249 } 250 251 252 /** 253 * Fills in a stat structure from an MY_FILE_BOTH_DIR_INFORMATION entry. 254 * 255 * @param pStat The stat structure. 256 * @param pBuf The MY_FILE_BOTH_DIR_INFORMATION entry. 257 * @param pszPath Optionally, the path for X bit checks. 258 * @remarks Caller sets st_dev. 259 */ 260 void birdStatFillFromFileBothDirInfo(BirdStat_T *pStat, MY_FILE_BOTH_DIR_INFORMATION const *pBuf, const char *pszPath) 261 { 262 pStat->st_mode = birdFileInfoToMode(INVALID_HANDLE_VALUE, pBuf->FileAttributes, pszPath, 263 NULL, &pStat->st_dirsymlink); 264 pStat->st_padding0[0] = 0; 265 pStat->st_padding0[1] = 0; 266 pStat->st_size = pBuf->EndOfFile.QuadPart; 267 birdNtTimeToTimeSpec(pBuf->CreationTime.QuadPart, &pStat->st_birthtim); 268 birdNtTimeToTimeSpec(pBuf->ChangeTime.QuadPart, &pStat->st_ctim); 269 birdNtTimeToTimeSpec(pBuf->LastWriteTime.QuadPart, &pStat->st_mtim); 270 birdNtTimeToTimeSpec(pBuf->LastAccessTime.QuadPart, &pStat->st_atim); 271 pStat->st_ino = 0; 272 pStat->st_nlink = 1; 273 pStat->st_rdev = 0; 274 pStat->st_uid = 0; 275 pStat->st_gid = 0; 276 pStat->st_padding1[0] = 0; 277 pStat->st_padding1[1] = 0; 278 pStat->st_padding1[2] = 0; 279 pStat->st_blksize = 65536; 280 pStat->st_blocks = (pBuf->AllocationSize.QuadPart + BIRD_STAT_BLOCK_SIZE - 1) 281 / BIRD_STAT_BLOCK_SIZE; 282 } 283 284 218 285 int birdStatHandle(HANDLE hFile, BirdStat_T *pStat, const char *pszPath) 219 286 { … … 359 426 360 427 428 /** 429 * Generates a device number from the volume information. 430 * 431 * @returns Device number. 432 * @param pVolInfo Volume information. 433 */ 434 unsigned __int64 birdVolumeInfoToDeviceNumber(const MY_FILE_FS_VOLUME_INFORMATION *pVolInfo) 435 { 436 return pVolInfo->VolumeSerialNumber 437 | (pVolInfo->VolumeCreationTime.QuadPart << 32); 438 } 439 440 441 /** 442 * Quries the volume information and generates a device number from it. 443 * 444 * @returns NT status code. 445 * @param hFile The file/dir/whatever to query the volume info 446 * and device number for. 447 * @param pVolInfo User provided buffer for volume information. 448 * @param cbVolInfo The size of the buffer. 449 * @param puDevNo Where to return the device number. This is set 450 * to zero on failure. 451 */ 452 MY_NTSTATUS birdQueryVolumeDeviceNumber(HANDLE hFile, MY_FILE_FS_VOLUME_INFORMATION *pVolInfo, size_t cbVolInfo, 453 unsigned __int64 *puDevNo) 454 { 455 MY_IO_STATUS_BLOCK Ios; 456 MY_NTSTATUS rcNt; 457 458 Ios.u.Status = -1; 459 Ios.Information = -1; 460 461 pVolInfo->VolumeSerialNumber = 0; 462 pVolInfo->VolumeCreationTime.QuadPart = 0; 463 464 rcNt = g_pfnNtQueryVolumeInformationFile(hFile, &Ios, pVolInfo, (LONG)cbVolInfo, MyFileFsVolumeInformation); 465 if (MY_NT_SUCCESS(rcNt)) 466 { 467 *puDevNo = birdVolumeInfoToDeviceNumber(pVolInfo); 468 return Ios.u.Status; 469 } 470 *puDevNo = 0; 471 return rcNt; 472 } 473 474 361 475 static int birdStatInternal(const char *pszPath, BirdStat_T *pStat, int fFollow) 362 476 { … … 429 543 430 544 /* Get the serial number, reusing the buffer from above. */ 431 rcNt = g_pfnNtQueryVolumeInformationFile(hFile, &Ios, pBuf, cbBuf, MyFileFsVolumeInformation);545 rcNt = birdQueryVolumeDeviceNumber(hFile, (MY_FILE_FS_VOLUME_INFORMATION *)pBuf, cbBuf, &pStat->st_dev); 432 546 if (MY_NT_SUCCESS(rcNt)) 433 rcNt = Ios.u.Status;434 if (MY_NT_SUCCESS(rcNt))435 {436 MY_FILE_FS_VOLUME_INFORMATION const *pVolInfo = (MY_FILE_FS_VOLUME_INFORMATION const *)pBuf;437 pStat->st_dev = pVolInfo->VolumeSerialNumber438 | (pVolInfo->VolumeCreationTime.QuadPart << 32);439 547 rc = 0; 440 }441 548 else 442 {443 pStat->st_dev = 0;444 549 rc = birdSetErrnoFromNt(rcNt); 445 }446 550 } 447 551
Note:
See TracChangeset
for help on using the changeset viewer.