| 1514 | |
| 1515 | |
| 1516 | NTSTATUS |
| 1517 | Ext2WriteSymlink ( |
| 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 | |
| 1565 | out: |
| 1566 | return Status; |
| 1567 | } |
| 1568 | |
| 1569 | NTSTATUS |
| 1570 | Ext2SetReparsePoint (IN PEXT2_IRP_CONTEXT IrpContext) |
no test coverage detected