438 |
// Return requested data |
// Return requested data |
439 |
switch (info_class) |
switch (info_class) |
440 |
{ |
{ |
441 |
case 4: /* FileBasicInformation */ |
case FileBasicInformation: |
442 |
seconds_since_1970_to_filetime(get_create_time(&filestat), &ft_high, |
seconds_since_1970_to_filetime(get_create_time(&filestat), &ft_high, |
443 |
&ft_low); |
&ft_low); |
444 |
out_uint32_le(out, ft_low); //create_access_time |
out_uint32_le(out, ft_low); //create_access_time |
459 |
out_uint32_le(out, file_attributes); |
out_uint32_le(out, file_attributes); |
460 |
break; |
break; |
461 |
|
|
462 |
case 5: /* FileStandardInformation */ |
case FileStandardInformation: |
463 |
|
|
464 |
out_uint32_le(out, filestat.st_size); //Allocation size |
out_uint32_le(out, filestat.st_size); //Allocation size |
465 |
out_uint32_le(out, 0); |
out_uint32_le(out, 0); |
470 |
out_uint8(out, S_ISDIR(filestat.st_mode) ? 1 : 0); //Directory |
out_uint8(out, S_ISDIR(filestat.st_mode) ? 1 : 0); //Directory |
471 |
break; |
break; |
472 |
|
|
473 |
case 35: /* FileObjectIdInformation */ |
case FileObjectIdInformation: |
474 |
|
|
475 |
out_uint32_le(out, file_attributes); /* File Attributes */ |
out_uint32_le(out, file_attributes); /* File Attributes */ |
476 |
out_uint32_le(out, 0); /* Reparse Tag */ |
out_uint32_le(out, 0); /* Reparse Tag */ |
501 |
|
|
502 |
switch (info_class) |
switch (info_class) |
503 |
{ |
{ |
504 |
case 4: /* FileBasicInformation */ |
case FileBasicInformation: |
505 |
write_time = change_time = access_time = 0; |
write_time = change_time = access_time = 0; |
506 |
|
|
507 |
in_uint8s(in, 4); /* Handle of root dir? */ |
in_uint8s(in, 4); /* Handle of root dir? */ |
581 |
|
|
582 |
break; |
break; |
583 |
|
|
584 |
case 10: /* FileRenameInformation */ |
case FileRenameInformation: |
585 |
|
|
586 |
in_uint8s(in, 4); /* Handle of root dir? */ |
in_uint8s(in, 4); /* Handle of root dir? */ |
587 |
in_uint8s(in, 0x1a); /* unknown */ |
in_uint8s(in, 0x1a); /* unknown */ |
607 |
} |
} |
608 |
break; |
break; |
609 |
|
|
610 |
case 13: /* FileDispositionInformation */ |
case FileDispositionInformation: |
611 |
|
/* As far as I understand it, the correct |
612 |
//unimpl("IRP Set File Information class: FileDispositionInformation\n"); |
thing to do here is to *schedule* a delete, |
613 |
|
so it will be deleted when the file is |
614 |
|
closed. Subsequent |
615 |
|
FileDispositionInformation requests with |
616 |
|
DeleteFile set to FALSE should unschedule |
617 |
|
the delete. See |
618 |
|
http://www.osronline.com/article.cfm?article=245. Currently, |
619 |
|
we are deleting the file immediately. I |
620 |
|
guess this is a FIXME. */ |
621 |
|
|
622 |
//in_uint32_le(in, delete_on_close); |
//in_uint32_le(in, delete_on_close); |
623 |
// disk_close(handle); |
|
624 |
|
/* Make sure we close the file before |
625 |
|
unlinking it. Not doing so would trigger |
626 |
|
silly-delete if using NFS, which might fail |
627 |
|
on FAT floppies, for example. */ |
628 |
|
disk_close(handle); |
629 |
|
|
630 |
if ((pfinfo->flags_and_attributes & FILE_DIRECTORY_FILE)) // remove a directory |
if ((pfinfo->flags_and_attributes & FILE_DIRECTORY_FILE)) // remove a directory |
631 |
{ |
{ |
632 |
if (rmdir(pfinfo->path) < 0) |
if (rmdir(pfinfo->path) < 0) |
637 |
|
|
638 |
break; |
break; |
639 |
|
|
640 |
case 19: /* FileAllocationInformation */ |
case FileAllocationInformation: |
641 |
|
|
642 |
unimpl("IRP Set File Information class: FileAllocationInformation\n"); |
unimpl("IRP Set File Information class: FileAllocationInformation\n"); |
643 |
break; |
break; |
644 |
|
|
645 |
case 20: /* FileEndOfFileInformation */ |
case FileEndOfFileInformation: |
646 |
in_uint8s(in, 28); /* unknown */ |
in_uint8s(in, 28); /* unknown */ |
647 |
in_uint32_le(in, length); /* file size */ |
in_uint32_le(in, length); /* file size */ |
648 |
|
|
750 |
|
|
751 |
switch (info_class) |
switch (info_class) |
752 |
{ |
{ |
753 |
case 1: /* FileFsVolumeInformation */ |
case FileFsVolumeInformation: |
754 |
|
|
755 |
out_uint32_le(out, 0); /* volume creation time low */ |
out_uint32_le(out, 0); /* volume creation time low */ |
756 |
out_uint32_le(out, 0); /* volume creation time high */ |
out_uint32_le(out, 0); /* volume creation time high */ |
762 |
rdp_out_unistr(out, fsinfo->label, 2 * strlen(fsinfo->label) - 2); |
rdp_out_unistr(out, fsinfo->label, 2 * strlen(fsinfo->label) - 2); |
763 |
break; |
break; |
764 |
|
|
765 |
case 3: /* FileFsSizeInformation */ |
case FileFsSizeInformation: |
766 |
|
|
767 |
out_uint32_le(out, stat_fs.f_blocks); /* Total allocation units low */ |
out_uint32_le(out, stat_fs.f_blocks); /* Total allocation units low */ |
768 |
out_uint32_le(out, 0); /* Total allocation high units */ |
out_uint32_le(out, 0); /* Total allocation high units */ |
772 |
out_uint32_le(out, 0x200); /* Bytes per sector */ |
out_uint32_le(out, 0x200); /* Bytes per sector */ |
773 |
break; |
break; |
774 |
|
|
775 |
case 5: /* FileFsAttributeInformation */ |
case FileFsAttributeInformation: |
776 |
|
|
777 |
out_uint32_le(out, FS_CASE_SENSITIVE | FS_CASE_IS_PRESERVED); /* fs attributes */ |
out_uint32_le(out, FS_CASE_SENSITIVE | FS_CASE_IS_PRESERVED); /* fs attributes */ |
778 |
out_uint32_le(out, F_NAMELEN(stat_fs)); /* max length of filename */ |
out_uint32_le(out, F_NAMELEN(stat_fs)); /* max length of filename */ |
781 |
rdp_out_unistr(out, fsinfo->type, 2 * strlen(fsinfo->type) - 2); |
rdp_out_unistr(out, fsinfo->type, 2 * strlen(fsinfo->type) - 2); |
782 |
break; |
break; |
783 |
|
|
784 |
case 2: /* FileFsLabelInformation */ |
case FileFsLabelInformation: |
785 |
case 4: /* FileFsDeviceInformation */ |
case FileFsDeviceInformation: |
786 |
case 6: /* FileFsControlInformation */ |
case FileFsControlInformation: |
787 |
case 7: /* FileFsFullSizeInformation */ |
case FileFsFullSizeInformation: |
788 |
case 8: /* FileFsObjectIdInformation */ |
case FileFsObjectIdInformation: |
789 |
case 9: /* FileFsMaximumInformation */ |
case FileFsMaximumInformation: |
790 |
|
|
791 |
default: |
default: |
792 |
|
|
793 |
unimpl("IRP Query Volume Information class: 0x%x\n", info_class); |
unimpl("IRP Query Volume Information class: 0x%x\n", info_class); |