| 1425 | } |
| 1426 | |
| 1427 | PEXT2_MCB |
| 1428 | Ext2AllocateMcb ( |
| 1429 | IN PEXT2_VCB Vcb, |
| 1430 | IN PUNICODE_STRING FileName, |
| 1431 | IN PUNICODE_STRING Parent, |
| 1432 | IN ULONG FileAttr |
| 1433 | ) |
| 1434 | { |
| 1435 | PEXT2_MCB Mcb = NULL; |
| 1436 | NTSTATUS Status = STATUS_SUCCESS; |
| 1437 | |
| 1438 | /* need wake the reaper thread if there are many Mcb allocated */ |
| 1439 | if (Ext2Global->PerfStat.Current.Mcb > (((ULONG)Ext2Global->MaxDepth) * 4)) { |
| 1440 | KeSetEvent(&Ext2Global->McbReaper.Wait, 0, FALSE); |
| 1441 | } |
| 1442 | |
| 1443 | /* allocate Mcb from LookasideList */ |
| 1444 | Mcb = (PEXT2_MCB) (ExAllocateFromNPagedLookasideList( |
| 1445 | &(Ext2Global->Ext2McbLookasideList))); |
| 1446 | |
| 1447 | if (Mcb == NULL) { |
| 1448 | return NULL; |
| 1449 | } |
| 1450 | |
| 1451 | /* initialize Mcb header */ |
| 1452 | RtlZeroMemory(Mcb, sizeof(EXT2_MCB)); |
| 1453 | Mcb->Identifier.Type = EXT2MCB; |
| 1454 | Mcb->Identifier.Size = sizeof(EXT2_MCB); |
| 1455 | Mcb->FileAttr = FileAttr; |
| 1456 | |
| 1457 | Mcb->Inode.i_priv = (PVOID)Mcb; |
| 1458 | Mcb->Inode.i_sb = &Vcb->sb; |
| 1459 | |
| 1460 | /* initialize Mcb names */ |
| 1461 | if (FileName) { |
| 1462 | |
| 1463 | #if EXT2_DEBUG |
| 1464 | if ( FileName->Length == 2 && |
| 1465 | FileName->Buffer[0] == L'\\') { |
| 1466 | DEBUG(DL_RES, ( "Ext2AllocateMcb: Root Mcb is to be created !\n")); |
| 1467 | } |
| 1468 | |
| 1469 | if ( FileName->Length == 2 && |
| 1470 | FileName->Buffer[0] == L'.') { |
| 1471 | DbgBreak(); |
| 1472 | } |
| 1473 | |
| 1474 | if ( FileName->Length == 4 && |
| 1475 | FileName->Buffer[0] == L'.' && |
| 1476 | FileName->Buffer[1] == L'.' ) { |
| 1477 | DbgBreak(); |
| 1478 | } |
| 1479 | #endif |
| 1480 | |
| 1481 | if (( FileName->Length >= 4 && FileName->Buffer[0] == L'.') && |
| 1482 | ((FileName->Length == 4 && FileName->Buffer[1] != L'.') || |
| 1483 | FileName->Length >= 6 )) { |
| 1484 | SetFlag(Mcb->FileAttr, FILE_ATTRIBUTE_HIDDEN); |
no test coverage detected