| 1843 | |
| 1844 | |
| 1845 | NTSTATUS |
| 1846 | Ext2AddEntry ( |
| 1847 | IN PEXT2_IRP_CONTEXT IrpContext, |
| 1848 | IN PEXT2_VCB Vcb, |
| 1849 | IN PEXT2_FCB Dcb, |
| 1850 | IN struct inode *Inode, |
| 1851 | IN PUNICODE_STRING FileName, |
| 1852 | struct dentry **Dentry |
| 1853 | ) |
| 1854 | { |
| 1855 | struct dentry *de = NULL; |
| 1856 | |
| 1857 | NTSTATUS status = STATUS_UNSUCCESSFUL; |
| 1858 | OEM_STRING oem; |
| 1859 | int rc; |
| 1860 | |
| 1861 | BOOLEAN MainResourceAcquired = FALSE; |
| 1862 | |
| 1863 | if (!IsDirectory(Dcb)) { |
| 1864 | DbgBreak(); |
| 1865 | return STATUS_NOT_A_DIRECTORY; |
| 1866 | } |
| 1867 | |
| 1868 | ExAcquireResourceExclusiveLite(&Dcb->MainResource, TRUE); |
| 1869 | MainResourceAcquired = TRUE; |
| 1870 | |
| 1871 | __try { |
| 1872 | |
| 1873 | Ext2ReferXcb(&Dcb->ReferenceCount); |
| 1874 | de = Ext2BuildEntry(Vcb, Dcb->Mcb, FileName); |
| 1875 | if (!de) { |
| 1876 | status = STATUS_INSUFFICIENT_RESOURCES; |
| 1877 | __leave; |
| 1878 | } |
| 1879 | de->d_inode = Inode; |
| 1880 | |
| 1881 | rc = ext3_add_entry(IrpContext, de, Inode); |
| 1882 | status = Ext2WinntError(rc); |
| 1883 | if (NT_SUCCESS(status)) { |
| 1884 | |
| 1885 | /* increase dir inode's nlink for .. */ |
| 1886 | if (S_ISDIR(Inode->i_mode)) { |
| 1887 | ext3_inc_count(Dcb->Inode); |
| 1888 | ext3_mark_inode_dirty(IrpContext, Dcb->Inode); |
| 1889 | } |
| 1890 | |
| 1891 | /* increase inode nlink reference */ |
| 1892 | ext3_inc_count(Inode); |
| 1893 | ext3_mark_inode_dirty(IrpContext, Inode); |
| 1894 | |
| 1895 | if (Dentry) { |
| 1896 | *Dentry = de; |
| 1897 | de = NULL; |
| 1898 | } |
| 1899 | } |
| 1900 | |
| 1901 | } __finally { |
| 1902 |
no test coverage detected