| 442 | |
| 443 | |
| 444 | struct dentry *Ext2BuildEntry(PEXT2_VCB Vcb, PEXT2_MCB Dcb, PUNICODE_STRING FileName) |
| 445 | { |
| 446 | OEM_STRING Oem = { 0 }; |
| 447 | struct dentry *de = NULL; |
| 448 | NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES; |
| 449 | |
| 450 | __try { |
| 451 | |
| 452 | de = Ext2AllocateEntry(); |
| 453 | if (!de) { |
| 454 | DEBUG(DL_ERR, ("Ext2BuildEntry: failed to allocate dentry.\n")); |
| 455 | __leave; |
| 456 | } |
| 457 | de->d_sb = &Vcb->sb; |
| 458 | if (Dcb) |
| 459 | de->d_parent = Dcb->de; |
| 460 | |
| 461 | Oem.MaximumLength = (USHORT)Ext2UnicodeToOEMSize(Vcb, FileName) + 1; |
| 462 | Oem.Buffer = Ext2AllocatePool(PagedPool, Oem.MaximumLength, 'EB2E'); |
| 463 | if (!Oem.Buffer) { |
| 464 | DEBUG(DL_ERR, ( "Ex2BuildEntry: failed to allocate OEM name.\n")); |
| 465 | __leave; |
| 466 | } |
| 467 | de->d_name.name = Oem.Buffer; |
| 468 | RtlZeroMemory(Oem.Buffer, Oem.MaximumLength); |
| 469 | Status = Ext2UnicodeToOEM(Vcb, &Oem, FileName); |
| 470 | if (!NT_SUCCESS(Status)) { |
| 471 | DEBUG(DL_CP, ("Ext2BuildEntry: failed to convert %S to OEM.\n", FileName->Buffer)); |
| 472 | __leave; |
| 473 | } |
| 474 | de->d_name.len = Oem.Length; |
| 475 | |
| 476 | } __finally { |
| 477 | |
| 478 | if (!NT_SUCCESS(Status)) { |
| 479 | if (de) |
| 480 | Ext2FreeEntry(de); |
| 481 | } |
| 482 | } |
| 483 | |
| 484 | return de; |
| 485 | } |
| 486 | |
| 487 | PEXT2_EXTENT |
| 488 | Ext2AllocateExtent () |
no test coverage detected