MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2WriteSymlink

Function Ext2WriteSymlink

Ext4Fsd/fsctl.c:1516–1567  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1514
1515
1516NTSTATUS
1517Ext2WriteSymlink (
1518 IN PEXT2_IRP_CONTEXT IrpContext,
1519 IN PEXT2_VCB Vcb,
1520 IN PEXT2_MCB Mcb,
1521 IN PVOID Buffer,
1522 IN ULONG Size,
1523 OUT PULONG BytesWritten
1524)
1525{
1526 NTSTATUS Status = STATUS_SUCCESS;
1527 PUCHAR Data = (PUCHAR)(&Mcb->Inode.i_block[0]);
1528
1529 if (Size >= EXT2_LINKLEN_IN_INODE) {
1530
1531 /* initialize inode i_block[] */
1532 if (0 == Mcb->Inode.i_blocks) {
1533 memset(Data, 0, EXT2_LINKLEN_IN_INODE);
1534 ClearFlag(Mcb->Inode.i_flags, EXT4_EXTENTS_FL);
1535 Ext2SaveInode(IrpContext, Vcb, &Mcb->Inode);
1536 }
1537
1538 Status = Ext2WriteInode(IrpContext, Vcb, Mcb,
1539 0, Buffer, Size,
1540 FALSE, BytesWritten);
1541 if (!NT_SUCCESS(Status)) {
1542 goto out;
1543 }
1544
1545 } else {
1546
1547 /* free inode blocks before writing in line */
1548 if (Mcb->Inode.i_blocks) {
1549 LARGE_INTEGER Zero = {0, 0};
1550 Ext2TruncateFile(IrpContext, Vcb, Mcb, &Zero);
1551 }
1552
1553 ClearFlag(Mcb->Inode.i_flags, EXT4_EXTENTS_FL);
1554 memset(Data, 0, EXT2_LINKLEN_IN_INODE);
1555 RtlCopyMemory(Data, Buffer, Size);
1556 }
1557
1558 Mcb->Inode.i_size = Size;
1559 Ext2SaveInode(IrpContext, Vcb, &Mcb->Inode);
1560
1561 if (BytesWritten) {
1562 *BytesWritten = Size;
1563 }
1564
1565out:
1566 return Status;
1567}
1568
1569NTSTATUS
1570Ext2SetReparsePoint (IN PEXT2_IRP_CONTEXT IrpContext)

Callers 1

Ext2SetReparsePointFunction · 0.85

Calls 3

Ext2SaveInodeFunction · 0.85
Ext2WriteInodeFunction · 0.85
Ext2TruncateFileFunction · 0.85

Tested by

no test coverage detected